@@ -13,6 +13,20 @@ import { getProviderSettingsPath, getClaudeEnvVars } from './config-generator';
1313import { CLIProxyProvider } from './types' ;
1414import { initUI , color , bold , dim , ok , info , header } from '../utils/ui' ;
1515
16+ /**
17+ * Check if model is a Claude model routed via Antigravity
18+ * Claude models require MAX_THINKING_TOKENS < 8192 for thinking to work
19+ */
20+ function isClaudeModel ( modelId : string ) : boolean {
21+ return modelId . includes ( 'claude' ) ;
22+ }
23+
24+ /**
25+ * Max thinking tokens for Claude models via Antigravity
26+ * Must be < 8192 due to Google protocol conversion limitations
27+ */
28+ const CLAUDE_MAX_THINKING_TOKENS = '8191' ;
29+
1630/** CCS directory */
1731const CCS_DIR = path . join ( process . env . HOME || process . env . USERPROFILE || '' , '.ccs' ) ;
1832
@@ -117,18 +131,56 @@ export async function configureProviderModel(
117131 defaultIndex : safeDefaultIdx ,
118132 } ) ;
119133
120- // Get base env vars to preserve haiku model and base URL
134+ // Get base env vars for defaults
121135 const baseEnv = getClaudeEnvVars ( provider ) ;
122136
123- // Build settings with selected model
124- const settings = {
125- env : {
126- ...baseEnv ,
127- ANTHROPIC_MODEL : selectedModel ,
128- ANTHROPIC_DEFAULT_OPUS_MODEL : selectedModel ,
129- ANTHROPIC_DEFAULT_SONNET_MODEL : selectedModel ,
130- // Keep haiku as-is from base config (usually flash model)
131- } ,
137+ // Read existing settings to preserve user customizations
138+ let existingSettings : Record < string , unknown > = { } ;
139+ let existingEnv : Record < string , string > = { } ;
140+ if ( fs . existsSync ( settingsPath ) ) {
141+ try {
142+ existingSettings = JSON . parse ( fs . readFileSync ( settingsPath , 'utf8' ) ) ;
143+ existingEnv = ( existingSettings . env as Record < string , string > ) || { } ;
144+ } catch {
145+ // Invalid JSON - start fresh
146+ }
147+ }
148+
149+ // Build settings with selective merge:
150+ // - Preserve ALL user settings (top-level and env vars)
151+ // - Only update CCS-controlled fields (model selection + thinking toggle for Claude)
152+ const isClaude = isClaudeModel ( selectedModel ) ;
153+
154+ // CCS-controlled env vars (always override with our values)
155+ const ccsControlledEnv : Record < string , string > = {
156+ ANTHROPIC_BASE_URL : baseEnv . ANTHROPIC_BASE_URL || '' ,
157+ ANTHROPIC_AUTH_TOKEN : baseEnv . ANTHROPIC_AUTH_TOKEN || '' ,
158+ ANTHROPIC_MODEL : selectedModel ,
159+ ANTHROPIC_DEFAULT_OPUS_MODEL : selectedModel ,
160+ ANTHROPIC_DEFAULT_SONNET_MODEL : selectedModel ,
161+ ANTHROPIC_DEFAULT_HAIKU_MODEL : baseEnv . ANTHROPIC_DEFAULT_HAIKU_MODEL || '' ,
162+ } ;
163+
164+ // Claude models require MAX_THINKING_TOKENS < 8192 for thinking to work
165+ if ( isClaude ) {
166+ ccsControlledEnv . MAX_THINKING_TOKENS = CLAUDE_MAX_THINKING_TOKENS ;
167+ }
168+
169+ // Merge: user env vars (preserved) + CCS controlled (override)
170+ const mergedEnv = {
171+ ...existingEnv ,
172+ ...ccsControlledEnv ,
173+ } ;
174+
175+ // Remove MAX_THINKING_TOKENS when switching away from Claude model
176+ if ( ! isClaude && mergedEnv . MAX_THINKING_TOKENS ) {
177+ delete mergedEnv . MAX_THINKING_TOKENS ;
178+ }
179+
180+ // Build final settings: preserve user top-level settings + update env
181+ const settings : Record < string , unknown > = {
182+ ...existingSettings ,
183+ env : mergedEnv ,
132184 } ;
133185
134186 // Ensure CCS directory exists
@@ -146,6 +198,15 @@ export async function configureProviderModel(
146198 console . error ( '' ) ;
147199 console . error ( ok ( `Model set to: ${ bold ( displayName ) } ` ) ) ;
148200 console . error ( dim ( ` Config saved: ${ settingsPath } ` ) ) ;
201+
202+ // Show info for Claude models about thinking token limit
203+ if ( isClaude ) {
204+ console . error ( '' ) ;
205+ console . error (
206+ info ( `MAX_THINKING_TOKENS set to ${ CLAUDE_MAX_THINKING_TOKENS } (required < 8192)` )
207+ ) ;
208+ console . error ( dim ( ' Google protocol conversion requires this limit for thinking to work.' ) ) ;
209+ }
149210 console . error ( '' ) ;
150211
151212 return true ;
0 commit comments