@@ -50,6 +50,7 @@ interface ModelEntry {
5050 base_url ?: string // Provider endpoint URL
5151 auth_token_env ?: string // API key / auth token
5252 proxy ?: string // HTTP/HTTPS proxy URL for this provider (e.g. "http://127.0.0.1:7890")
53+ max_tokens ?: number // Maximum output tokens for this model (default: 32768)
5354 provider ?: string // e.g. "anthropic", "deepseek", "openai"
5455 price ?: {
5556 input : number
@@ -80,6 +81,7 @@ interface ClaudeSettings {
8081 theme ?: string
8182 model_list ?: ModelEntry [ ]
8283 default_model ?: string
84+ max_tokens ?: number // Global max output tokens for all providers (default: 32768)
8385 display ?: {
8486 tui_auto_resume_recent ?: boolean
8587 }
@@ -99,6 +101,7 @@ function resolveModelConfig(settings: ClaudeSettings, fallbackModel: string): {
99101 baseUrl ?: string
100102 apiKey ?: string
101103 proxy ?: string
104+ maxTokens ?: number
102105 name : string
103106 provider : string
104107} {
@@ -121,6 +124,7 @@ function resolveModelConfig(settings: ClaudeSettings, fallbackModel: string): {
121124 baseUrl : entry . base_url ,
122125 apiKey : entry . auth_token_env ,
123126 proxy : entry . proxy ,
127+ maxTokens : entry . max_tokens ,
124128 name : selectedModel ,
125129 provider : entry . provider ?? inferProvider ( selectedModel ) ,
126130 }
@@ -227,7 +231,7 @@ export class CoderGatewayClient extends EventEmitter implements IGatewayClient {
227231 private thinkingBudget : number
228232
229233 // ── Model config ────────────────────────────────────────────────────
230- private modelConfig : { model : string ; baseUrl ?: string ; apiKey ?: string ; proxy ?: string ; name : string ; provider : string } | null = null
234+ private modelConfig : { model : string ; baseUrl ?: string ; apiKey ?: string ; proxy ?: string ; maxTokens ?: number ; name : string ; provider : string } | null = null
231235
232236 // ── Session fork config ─────────────────────────────────────────────
233237 private forkSessionId ?: string
@@ -249,7 +253,7 @@ export class CoderGatewayClient extends EventEmitter implements IGatewayClient {
249253 // CODER_MODEL env var — highest-priority model override.
250254 // Check before resolveModelConfig so the env var wins over settings.json.
251255 const coderModel = process . env . CODER_MODEL
252- let resolved : { model : string ; baseUrl ?: string ; apiKey ?: string ; proxy ?: string ; name : string ; provider : string }
256+ let resolved : { model : string ; baseUrl ?: string ; apiKey ?: string ; proxy ?: string ; maxTokens ?: number ; name : string ; provider : string }
253257 if ( coderModel ) {
254258 // Helper: resolve from a model_list entry
255259 const resolveEntry = ( entry : ModelEntry , preferredModel ?: string ) => {
@@ -261,6 +265,7 @@ export class CoderGatewayClient extends EventEmitter implements IGatewayClient {
261265 baseUrl : entry . base_url ,
262266 apiKey : entry . auth_token_env ,
263267 proxy : entry . proxy ,
268+ maxTokens : entry . max_tokens ,
264269 name : selectedModel ,
265270 provider : entry . provider ?? inferProvider ( selectedModel ) ,
266271 }
@@ -838,6 +843,12 @@ export class CoderGatewayClient extends EventEmitter implements IGatewayClient {
838843 env . CODER_PROXY ??
839844 process . env . CODER_PROXY
840845
846+ // Resolve maxTokens: env var > per-model entry > global settings > undefined (uses provider default)
847+ const maxTokens =
848+ process . env . CODER_MAX_TOKENS
849+ ? parseInt ( process . env . CODER_MAX_TOKENS , 10 )
850+ : ( modelCfg ?. maxTokens ?? settings . max_tokens )
851+
841852 // Check CODER_COORDINATOR_MODE env var (set by entry.tsx or manually)
842853 const coordinatorMode =
843854 this . coordinatorMode ||
@@ -858,6 +869,7 @@ export class CoderGatewayClient extends EventEmitter implements IGatewayClient {
858869 model : this . model ,
859870 providerName : modelCfg ?. provider ,
860871 maxTurns : 100 ,
872+ maxTokens,
861873 sessionId : this . gatewaySessionId ?? undefined ,
862874 sessionManager,
863875 coordinatorMode,
0 commit comments