Skip to content

Commit 509bf66

Browse files
jonasnevesclaude
andcommitted
Add configurable system prompt with on/off toggle
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent d3dc3d7 commit 509bf66

4 files changed

Lines changed: 54 additions & 3 deletions

File tree

app/chat/frontend/src/Playground.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ function PlaygroundInner() {
9191
}, [setGithubAuth]);
9292

9393
const [uiBuilderEnabled, setUiBuilderEnabled] = useState(false);
94+
const [customSystemPrompt, setCustomSystemPrompt] = useState('');
95+
const [customSystemPromptEnabled, setCustomSystemPromptEnabled] = useState(false);
9496
const [executionTimes, setExecutionTimes] = useState<Record<string, ExecutionTimeData>>({});
9597
const dockRef = useRef<HTMLDivElement>(null);
9698

@@ -826,7 +828,7 @@ function PlaygroundInner() {
826828
selectedCardIds,
827829
githubToken: githubAuth?.token,
828830
isGenerating,
829-
systemPrompt: uiBuilderEnabled ? UI_BUILDER_PROMPT : undefined,
831+
systemPrompt: uiBuilderEnabled ? UI_BUILDER_PROMPT : (customSystemPromptEnabled && customSystemPrompt ? customSystemPrompt : undefined),
830832
summarizeSessionResponses,
831833
setLastQuery,
832834
setHoveredCard,
@@ -1228,6 +1230,7 @@ function PlaygroundInner() {
12281230
getModelEndpoints={getModelEndpoints}
12291231
modelKeyMap={modelKeyMap}
12301232
onlineModelIds={onlineModelIds}
1233+
systemPrompt={customSystemPromptEnabled && customSystemPrompt ? customSystemPrompt : undefined}
12311234
/>
12321235
</Suspense>
12331236
</ErrorBoundary>
@@ -1385,6 +1388,10 @@ function PlaygroundInner() {
13851388
setGithubAuth={setGithubAuth}
13861389
bgStyle={bgStyle}
13871390
setBgStyle={setBgStyle}
1391+
systemPrompt={customSystemPrompt}
1392+
setSystemPrompt={setCustomSystemPrompt}
1393+
systemPromptEnabled={customSystemPromptEnabled}
1394+
setSystemPromptEnabled={setCustomSystemPromptEnabled}
13881395
/>
13891396
</Suspense>
13901397

app/chat/frontend/src/components/ChatView.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ interface ChatViewProps {
5252
getModelEndpoints: (models: Model[]) => Record<string, string>;
5353
modelKeyMap: Record<string, string>;
5454
onlineModelIds?: Set<string>;
55+
systemPrompt?: string;
5556
}
5657

5758
const CATEGORY_STYLE: Record<string, { border: string; bg: string; text: string; label: string }> = {
@@ -177,6 +178,7 @@ const ChatView = forwardRef<ChatViewHandle, ChatViewProps>(({
177178
getModelEndpoints,
178179
modelKeyMap,
179180
onlineModelIds,
181+
systemPrompt,
180182
}, ref) => {
181183
const [inputFocused, setInputFocused] = useState(false);
182184
const [copiedMessageId, setCopiedMessageId] = useState<number | null>(null);
@@ -295,6 +297,10 @@ const ChatView = forwardRef<ChatViewHandle, ChatViewProps>(({
295297

296298
const systemPrompts: Array<{ role: 'system'; content: string }> = [];
297299

300+
if (systemPrompt) {
301+
systemPrompts.push({ role: 'system', content: systemPrompt });
302+
}
303+
298304
if (uiBuilderEnabled) {
299305
systemPrompts.push({ role: 'system', content: UI_BUILDER_PROMPT });
300306
}
@@ -404,7 +410,7 @@ const ChatView = forwardRef<ChatViewHandle, ChatViewProps>(({
404410
});
405411

406412
await Promise.allSettled(streamPromises);
407-
}, [isGenerating, selectedModels, modelMap, githubToken, uiBuilderEnabled, setMessages, setIsGenerating, syncStreamingState, getModelEndpoints, models, modelKeyMap]);
413+
}, [isGenerating, selectedModels, modelMap, githubToken, uiBuilderEnabled, systemPrompt, setMessages, setIsGenerating, syncStreamingState, getModelEndpoints, models, modelKeyMap]);
408414

409415
const stopGeneration = useCallback(() => {
410416
abortRefs.current.forEach(c => c.abort());

app/chat/frontend/src/components/SettingsModal.tsx

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ interface SettingsModalProps {
1212
setGithubAuth: (auth: GitHubAuth | null) => void;
1313
bgStyle: BackgroundStyle;
1414
setBgStyle: (style: BackgroundStyle) => void;
15+
systemPrompt: string;
16+
setSystemPrompt: (prompt: string) => void;
17+
systemPromptEnabled: boolean;
18+
setSystemPromptEnabled: (enabled: boolean) => void;
1519
}
1620

1721
// Display labels for background styles
@@ -54,6 +58,10 @@ export default function SettingsModal({
5458
setGithubAuth,
5559
bgStyle,
5660
setBgStyle,
61+
systemPrompt,
62+
setSystemPrompt,
63+
systemPromptEnabled,
64+
setSystemPromptEnabled,
5765
}: SettingsModalProps) {
5866
const [activeTab, setActiveTab] = useState<SettingsTab>('general');
5967
const [isConnecting, setIsConnecting] = useState(false);
@@ -174,6 +182,36 @@ export default function SettingsModal({
174182
{/* General Tab */}
175183
{activeTab === 'general' && (
176184
<>
185+
{/* System Prompt Section */}
186+
<div className="rounded-xl border border-slate-800/60 bg-slate-900/60 p-4">
187+
<div className="flex items-center justify-between mb-1">
188+
<h3 className="text-sm font-semibold text-slate-200">System Prompt</h3>
189+
<button
190+
onClick={() => setSystemPromptEnabled(!systemPromptEnabled)}
191+
className={`relative inline-flex h-5 w-9 items-center rounded-full transition-colors focus:outline-none ${systemPromptEnabled ? 'bg-blue-500' : 'bg-slate-700'}`}
192+
aria-checked={systemPromptEnabled}
193+
role="switch"
194+
aria-label="Enable system prompt"
195+
>
196+
<span className={`inline-block h-3.5 w-3.5 transform rounded-full bg-white shadow transition-transform ${systemPromptEnabled ? 'translate-x-4.5' : 'translate-x-0.5'}`} />
197+
</button>
198+
</div>
199+
<p className="text-xs text-slate-400 leading-relaxed mb-3">
200+
Injected as the first message in every request. Disable for unmodified model behavior.
201+
</p>
202+
<textarea
203+
value={systemPrompt}
204+
onChange={e => setSystemPrompt(e.target.value)}
205+
disabled={!systemPromptEnabled}
206+
placeholder="You are a helpful assistant..."
207+
rows={5}
208+
className={`w-full rounded-lg border px-3 py-2 text-sm font-mono resize-y transition-colors focus:outline-none focus:ring-1 focus:ring-blue-500/50 ${systemPromptEnabled
209+
? 'bg-slate-800/60 border-slate-700/60 text-slate-200 placeholder-slate-500'
210+
: 'bg-slate-800/30 border-slate-800/40 text-slate-500 placeholder-slate-600 cursor-not-allowed'
211+
}`}
212+
/>
213+
</div>
214+
177215
{/* GitHub Connection Section */}
178216
<div className="rounded-xl border border-slate-800/60 bg-slate-900/60 p-4">
179217
<h3 className="text-sm font-semibold text-slate-200 mb-1">GitHub Connection</h3>

app/chat/frontend/tsconfig.tsbuildinfo

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)