Skip to content

Commit 7d958a8

Browse files
committed
feat: better model config definitions
1 parent e066628 commit 7d958a8

File tree

15 files changed

+210
-256
lines changed

15 files changed

+210
-256
lines changed

src/components/config-modal.tsx

Lines changed: 13 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -68,18 +68,18 @@ const getModelDisplayName = (model: AIModels | string): string => {
6868
// Model recommendations by agent
6969
const getModelRecommendation = (agentAction: string) => {
7070
const recommendations: Record<string, string> = {
71-
templateSelection: '💡 Recommended: Fast models for quick template selection',
72-
blueprint: '🏗️ Recommended: Creative models for architecture design',
73-
projectSetup: '⚙️ Recommended: Reliable models for precise setup',
74-
phaseGeneration: '📋 Recommended: Large context models for comprehensive planning',
75-
firstPhaseImplementation: '🏁 Recommended: High-capability models for foundation development',
76-
phaseImplementation: 'Recommended: Strong coding models for implementation',
77-
realtimeCodeFixer: '🚀 Recommended: Fast debugging models',
78-
fastCodeFixer: 'Recommended: Ultra-fast models for quick fixes',
79-
conversationalResponse: '💬 Recommended: Balanced models for natural conversation',
80-
codeReview: '🔍 Recommended: Analytical models with large context',
81-
fileRegeneration: '📝 Recommended: Pure coding models',
82-
screenshotAnalysis: '👁️ Recommended: Vision-capable models for image analysis'
71+
templateSelection: 'Recommended: Fast models for quick template selection',
72+
blueprint: 'Recommended: Creative models for architecture design',
73+
projectSetup: 'Recommended: Reliable models for precise setup',
74+
phaseGeneration: 'Recommended: Large context models for comprehensive planning',
75+
firstPhaseImplementation: 'Recommended: High-capability models for foundation development',
76+
phaseImplementation: 'Recommended: Strong coding models for implementation',
77+
realtimeCodeFixer: 'Recommended: Fast debugging models',
78+
fastCodeFixer: 'Recommended: Ultra-fast models for quick fixes',
79+
conversationalResponse: 'Recommended: Balanced models for natural conversation',
80+
codeReview: 'Recommended: Analytical models with large context',
81+
fileRegeneration: 'Recommended: Pure coding models',
82+
screenshotAnalysis: 'Recommended: Vision-capable models for image analysis'
8383
};
8484
return recommendations[agentAction] || '';
8585
};
@@ -98,7 +98,6 @@ export function ConfigModal({
9898
// Form state
9999
const [formData, setFormData] = useState({
100100
modelName: userConfig?.name || 'default',
101-
maxTokens: userConfig?.max_tokens?.toString() || '',
102101
temperature: userConfig?.temperature?.toString() || '',
103102
reasoningEffort: userConfig?.reasoning_effort || 'default',
104103
fallbackModel: userConfig?.fallbackModel || 'default'
@@ -137,7 +136,6 @@ export function ConfigModal({
137136
// First time opening - reset everything and load data
138137
setFormData({
139138
modelName: userConfig?.name || 'default',
140-
maxTokens: userConfig?.max_tokens?.toString() || '',
141139
temperature: userConfig?.temperature?.toString() || '',
142140
reasoningEffort: userConfig?.reasoning_effort || 'default',
143141
fallbackModel: userConfig?.fallbackModel || 'default'
@@ -163,7 +161,6 @@ export function ConfigModal({
163161
useEffect(() => {
164162
const originalFormData = {
165163
modelName: userConfig?.name || 'default',
166-
maxTokens: userConfig?.max_tokens?.toString() || '',
167164
temperature: userConfig?.temperature?.toString() || '',
168165
reasoningEffort: userConfig?.reasoning_effort || 'default',
169166
fallbackModel: userConfig?.fallbackModel || 'default'
@@ -247,7 +244,6 @@ export function ConfigModal({
247244
const buildCurrentConfig = (): ModelConfigUpdate => {
248245
return {
249246
...(formData.modelName !== 'default' && { modelName: formData.modelName }),
250-
...(formData.maxTokens && { maxTokens: parseInt(formData.maxTokens) }),
251247
...(formData.temperature && { temperature: parseFloat(formData.temperature) }),
252248
...(formData.reasoningEffort !== 'default' && { reasoningEffort: formData.reasoningEffort }),
253249
...(formData.fallbackModel !== 'default' && { fallbackModel: formData.fallbackModel }),
@@ -441,7 +437,7 @@ export function ConfigModal({
441437
<div className="space-y-4">
442438
<h4 className="font-medium text-sm">Parameters</h4>
443439

444-
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
440+
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
445441
{/* Temperature */}
446442
<div className="space-y-2">
447443
<Label className="text-sm font-medium">Temperature</Label>
@@ -462,25 +458,6 @@ export function ConfigModal({
462458
)}
463459
</div>
464460

465-
{/* Max Tokens */}
466-
<div className="space-y-2">
467-
<Label className="text-sm font-medium">Max Tokens</Label>
468-
<Input
469-
type="number"
470-
min="1"
471-
max="200000"
472-
value={formData.maxTokens}
473-
placeholder={defaultConfig?.max_tokens ? `${defaultConfig.max_tokens}` : '4000'}
474-
onChange={(e) => setFormData({...formData, maxTokens: e.target.value})}
475-
className="h-10"
476-
/>
477-
{defaultConfig?.max_tokens && (
478-
<p className="text-xs text-text-tertiary">
479-
🔧 Default: {defaultConfig.max_tokens?.toLocaleString()}
480-
</p>
481-
)}
482-
</div>
483-
484461
{/* Reasoning Effort */}
485462
<div className="space-y-2">
486463
<Label className="text-sm font-medium">Reasoning Effort</Label>

src/components/ui/model-selector.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ export function ModelSelector({
111111
className="w-full justify-between"
112112
disabled={disabled}
113113
>
114-
{getSelectedDisplay() || placeholder}
114+
<span className="truncate">{getSelectedDisplay() || placeholder}</span>
115115
<ChevronDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
116116
</Button>
117117
</PopoverTrigger>
@@ -203,7 +203,7 @@ export function ModelSelector({
203203

204204
{/* System default display */}
205205
{systemDefault && (
206-
<p className="text-xs text-text-tertiary">
206+
<p className="text-xs text-text-tertiary truncate">
207207
🔧 System default: {getModelDisplayName(systemDefault)}
208208
</p>
209209
)}

src/routes/chat/components/preview-iframe.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@ export const PreviewIframe = forwardRef<HTMLIFrameElement, PreviewIframeProps>(
336336
if (loadState.status === 'loaded' && loadState.loadedSrc) {
337337
return (
338338
<iframe
339+
sandbox="allow-scripts allow-same-origin allow-pointer-lock"
339340
ref={ref}
340341
src={loadState.loadedSrc}
341342
className={className}
@@ -361,6 +362,7 @@ export const PreviewIframe = forwardRef<HTMLIFrameElement, PreviewIframeProps>(
361362
<div className={`${className} relative flex flex-col items-center justify-center bg-bg-3 border border-text/10 rounded-lg`}>
362363
{loadState.status === 'postload' && loadState.loadedSrc && (
363364
<iframe
365+
sandbox="allow-scripts allow-same-origin allow-pointer-lock"
364366
ref={ref}
365367
src={loadState.loadedSrc}
366368
className="absolute inset-0 opacity-0 pointer-events-none"

worker/agents/assistants/projectsetup.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ Output:
5858
- Skip dependencies already in starting template
5959
- Include common companion packages when needed
6060
- Focus on blueprint requirements only
61+
- cloudflare:workers is not needed, it's already installed
6162
6263
${PROMPT_UTILS.COMMANDS}
6364

worker/agents/core/simpleGeneratorAgent.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import { ScreenshotAnalysisOperation } from '../operations/ScreenshotAnalysis';
3030
// Database schema imports removed - using zero-storage OAuth flow
3131
import { BaseSandboxService } from '../../services/sandbox/BaseSandboxService';
3232
import { WebSocketMessageData, WebSocketMessageType } from '../../api/websocketTypes';
33-
import { InferenceContext, AgentActionKey } from '../inferutils/config.types';
33+
import { InferenceContext, AgentActionKey, ModelConfig } from '../inferutils/config.types';
3434
import { AGENT_CONFIG, AGENT_CONSTRAINTS } from '../inferutils/config';
3535
import { ModelConfigService } from '../../database/services/ModelConfigService';
3636
import { fixProjectIssues } from '../../services/code-fixer';
@@ -349,6 +349,26 @@ export class SimpleCodeGeneratorAgent extends Agent<Env, CodeGenState> {
349349
// Fill the template cache
350350
await this.ensureTemplateDetails();
351351
this.logger().info(`Agent ${this.getAgentId()} session: ${this.state.sessionId} onStart processed successfully`);
352+
353+
// Load the latest user configs
354+
const modelConfigService = new ModelConfigService(this.env);
355+
const userConfigsRecord = await modelConfigService.getUserModelConfigs(this.state.inferenceContext.userId);
356+
357+
const userModelConfigs: Record<string, ModelConfig> = {};
358+
for (const [actionKey, mergedConfig] of Object.entries(userConfigsRecord)) {
359+
if (mergedConfig.isUserOverride) {
360+
const { isUserOverride, userConfigId, ...modelConfig } = mergedConfig;
361+
userModelConfigs[actionKey] = modelConfig;
362+
}
363+
}
364+
this.setState({
365+
...this.state,
366+
inferenceContext: {
367+
...this.state.inferenceContext,
368+
userModelConfigs,
369+
},
370+
});
371+
this.logger().info(`Agent ${this.getAgentId()} session: ${this.state.sessionId} onStart: User configs loaded successfully`, {userModelConfigs});
352372
}
353373

354374
private async gitInit() {

worker/agents/inferutils/config.ts

Lines changed: 35 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -8,72 +8,6 @@ import {
88
RegularModels,
99
} from "./config.types";
1010

11-
/*
12-
Use these configs instead for better performance, less bugs and costs:
13-
14-
blueprint: {
15-
name: AIModels.OPENAI_5_MINI,
16-
reasoning_effort: 'medium',
17-
max_tokens: 16000,
18-
fallbackModel: AIModels.OPENAI_O3,
19-
temperature: 1,
20-
},
21-
projectSetup: {
22-
name: AIModels.OPENAI_5_MINI,
23-
reasoning_effort: 'medium',
24-
max_tokens: 10000,
25-
temperature: 1,
26-
fallbackModel: AIModels.GEMINI_2_5_FLASH,
27-
},
28-
phaseGeneration: {
29-
name: AIModels.OPENAI_5_MINI,
30-
reasoning_effort: 'medium',
31-
max_tokens: 32000,
32-
temperature: 1,
33-
fallbackModel: AIModels.GEMINI_2_5_FLASH,
34-
},
35-
codeReview: {
36-
name: AIModels.OPENAI_5,
37-
reasoning_effort: 'medium',
38-
max_tokens: 32000,
39-
temperature: 1,
40-
fallbackModel: AIModels.GEMINI_2_5_PRO,
41-
},
42-
fileRegeneration: {
43-
name: AIModels.OPENAI_5_MINI,
44-
reasoning_effort: 'low',
45-
max_tokens: 32000,
46-
temperature: 1,
47-
fallbackModel: AIModels.CLAUDE_4_SONNET,
48-
},
49-
realtimeCodeFixer: {
50-
name: AIModels.OPENAI_5_MINI,
51-
reasoning_effort: 'low',
52-
max_tokens: 32000,
53-
temperature: 1,
54-
fallbackModel: AIModels.CLAUDE_4_SONNET,
55-
},
56-
57-
For real time code fixer, here are some alternatives:
58-
realtimeCodeFixer: {
59-
name: AIModels.CEREBRAS_QWEN_3_CODER,
60-
reasoning_effort: undefined,
61-
max_tokens: 10000,
62-
temperature: 0.0,
63-
fallbackModel: AIModels.GEMINI_2_5_PRO,
64-
},
65-
66-
OR
67-
realtimeCodeFixer: {
68-
name: AIModels.KIMI_2_5,
69-
providerOverride: 'direct',
70-
reasoning_effort: 'medium',
71-
max_tokens: 32000,
72-
temperature: 0.7,
73-
fallbackModel: AIModels.OPENAI_OSS,
74-
},
75-
*/
76-
7711
export const AGENT_CONFIG: AgentConfig = {
7812
templateSelection: {
7913
name: AIModels.GEMINI_2_5_FLASH_LITE,
@@ -86,57 +20,42 @@ export const AGENT_CONFIG: AgentConfig = {
8620
reasoning_effort: 'medium',
8721
max_tokens: 64000,
8822
fallbackModel: AIModels.GEMINI_2_5_FLASH,
89-
temperature: 0.7,
23+
temperature: 1.0,
9024
},
9125
projectSetup: {
92-
name: AIModels.GEMINI_2_5_PRO,
93-
reasoning_effort: 'low',
94-
max_tokens: 10000,
95-
temperature: 0.2,
26+
name: AIModels.GROK_4_FAST,
27+
reasoning_effort: 'medium',
28+
max_tokens: 8000,
29+
temperature: 1,
9630
fallbackModel: AIModels.GEMINI_2_5_PRO,
9731
},
9832
phaseGeneration: {
99-
name: AIModels.GEMINI_2_5_PRO,
100-
reasoning_effort: 'low',
101-
max_tokens: 32000,
102-
temperature: 0.2,
33+
name: AIModels.GROK_4_FAST,
34+
reasoning_effort: 'medium',
35+
max_tokens: 8000,
36+
temperature: 1,
10337
fallbackModel: AIModels.GEMINI_2_5_FLASH,
10438
},
10539
firstPhaseImplementation: {
10640
name: AIModels.GEMINI_3_PRO_PREVIEW,
10741
reasoning_effort: 'low',
108-
max_tokens: 64000,
42+
max_tokens: 48000,
10943
temperature: 0.2,
11044
fallbackModel: AIModels.GEMINI_2_5_PRO,
11145
},
11246
phaseImplementation: {
113-
name: AIModels.GEMINI_3_PRO_PREVIEW,
47+
name: AIModels.GEMINI_2_5_PRO,
11448
reasoning_effort: 'low',
115-
max_tokens: 64000,
49+
max_tokens: 48000,
11650
temperature: 0.2,
11751
fallbackModel: AIModels.GEMINI_2_5_PRO,
11852
},
119-
realtimeCodeFixer: {
120-
name: AIModels.DISABLED,
121-
reasoning_effort: 'low',
122-
max_tokens: 32000,
123-
temperature: 1,
124-
fallbackModel: AIModels.GEMINI_2_5_FLASH,
125-
},
126-
// Not used right now
127-
fastCodeFixer: {
128-
name: AIModels.DISABLED,
129-
reasoning_effort: undefined,
130-
max_tokens: 64000,
131-
temperature: 0.0,
132-
fallbackModel: AIModels.GEMINI_2_5_PRO,
133-
},
13453
conversationalResponse: {
135-
name: AIModels.GEMINI_2_5_FLASH,
54+
name: AIModels.GROK_4_FAST,
13655
reasoning_effort: 'low',
13756
max_tokens: 4000,
138-
temperature: 0,
139-
fallbackModel: AIModels.GEMINI_2_5_PRO,
57+
temperature: 1,
58+
fallbackModel: AIModels.GEMINI_2_5_FLASH,
14059
},
14160
deepDebugger: {
14261
name: AIModels.GEMINI_2_5_PRO,
@@ -146,11 +65,11 @@ export const AGENT_CONFIG: AgentConfig = {
14665
fallbackModel: AIModels.GEMINI_2_5_FLASH,
14766
},
14867
fileRegeneration: {
149-
name: AIModels.GEMINI_2_5_PRO,
150-
reasoning_effort: 'low',
151-
max_tokens: 32000,
68+
name: AIModels.GROK_CODE_FAST_1,
69+
reasoning_effort: 'high',
70+
max_tokens: 16000,
15271
temperature: 0,
153-
fallbackModel: AIModels.GEMINI_2_5_FLASH,
72+
fallbackModel: AIModels.CLAUDE_4_5_HAIKU,
15473
},
15574
// Not used right now
15675
screenshotAnalysis: {
@@ -160,6 +79,21 @@ export const AGENT_CONFIG: AgentConfig = {
16079
temperature: 0.1,
16180
fallbackModel: AIModels.GEMINI_2_5_FLASH,
16281
},
82+
realtimeCodeFixer: {
83+
name: AIModels.DISABLED,
84+
reasoning_effort: 'low',
85+
max_tokens: 32000,
86+
temperature: 1,
87+
fallbackModel: AIModels.GEMINI_2_5_FLASH,
88+
},
89+
// Not used right now
90+
fastCodeFixer: {
91+
name: AIModels.DISABLED,
92+
reasoning_effort: undefined,
93+
max_tokens: 64000,
94+
temperature: 0.0,
95+
fallbackModel: AIModels.GEMINI_2_5_PRO,
96+
},
16397
};
16498

16599
export const AGENT_CONSTRAINTS: Map<AgentActionKey, AgentConstraintConfig> = new Map([
@@ -176,7 +110,7 @@ export const AGENT_CONSTRAINTS: Map<AgentActionKey, AgentConstraintConfig> = new
176110
enabled: true,
177111
}],
178112
['phaseGeneration', {
179-
allowedModels: new Set([...RegularModels, AIModels.GEMINI_2_5_PRO]),
113+
allowedModels: new Set(AllModels),
180114
enabled: true,
181115
}],
182116
['projectSetup', {

0 commit comments

Comments
 (0)