@@ -9,8 +9,9 @@ import {CodexEventHandler} from "./CodexEventHandler";
99import { CodexApprovalHandler } from "./CodexApprovalHandler" ;
1010import { CodexAuthMethods , type CodexAuthRequest } from "./CodexAuthMethod" ;
1111import { CodexAcpClient , type SessionMetadata } from "./CodexAcpClient" ;
12- import type { Account , Model , RateLimitSnapshot } from "./app-server/v2" ;
13- import type { ReasoningEffort } from "./app-server" ;
12+ import type { Account , Model , ReasoningEffortOption } from "./app-server/v2" ;
13+ import type { RateLimitsMap } from "./RateLimitsMap" ;
14+ import type { InputModality , ReasoningEffort } from "./app-server" ;
1415import { ModelId } from "./ModelId" ;
1516import { AgentMode } from "./AgentMode" ;
1617import type { TokenCount } from "./TokenCount" ;
@@ -21,12 +22,14 @@ import {logger} from "./Logger";
2122export interface SessionState {
2223 sessionId : string ,
2324 currentModelId : string ,
25+ supportedReasoningEfforts : Array < ReasoningEffortOption > ,
26+ supportedInputModalities : Array < InputModality > ,
2427 agentMode : AgentMode ,
2528 currentTurnId : string | null ;
2629 lastTokenUsage : TokenCount | null ;
2730 totalTokenUsage : TokenCount | null ;
2831 modelContextWindow : number | null ;
29- rateLimits : RateLimitSnapshot | null ;
32+ rateLimits : RateLimitsMap | null ;
3033 account : Account | null ;
3134 cwd : string ;
3235 sessionMcpServers ?: Array < string > ;
@@ -117,9 +120,12 @@ export class CodexAcpServer implements acp.Agent {
117120 const { sessionId, currentModelId, models} = sessionMetadata ;
118121 logger . log ( `Waiting MCP servers to start...` )
119122 const sessionMcpServers = await pendingMcpServers ;
123+ const currentModel = this . findCurrentModel ( models , currentModelId ) ;
120124 const sessionState : SessionState = {
121125 sessionId : sessionId ,
122126 currentModelId : currentModelId ,
127+ supportedReasoningEfforts : currentModel ?. supportedReasoningEfforts ?? [ ] ,
128+ supportedInputModalities : currentModel ?. inputModalities ?? [ "text" , "image" ] ,
123129 agentMode : AgentMode . getInitialAgentMode ( ) ,
124130 currentTurnId : null ,
125131 lastTokenUsage : null ,
@@ -237,6 +243,8 @@ export class CodexAcpServer implements acp.Agent {
237243 }
238244
239245 sessionState . currentModelId = ModelId . fromComponents ( model , reasoningEffort ) . toString ( ) ;
246+ sessionState . supportedReasoningEfforts = model . supportedReasoningEfforts ;
247+ sessionState . supportedInputModalities = model . inputModalities ;
240248
241249 return { } ;
242250 }
@@ -245,6 +253,11 @@ export class CodexAcpServer implements acp.Agent {
245253 void this . availableCommands . publish ( sessionId ) ;
246254 }
247255
256+ private findCurrentModel ( models : Model [ ] , currentModelId : string ) : Model | undefined {
257+ const modelId = ModelId . fromString ( currentModelId ) ;
258+ return models . find ( m => m . id === modelId . model ) ;
259+ }
260+
248261 private createModelState ( availableModels : Model [ ] , selectedModelId : string ) : SessionModelState {
249262 const allowedModels = availableModels
250263 . flatMap ( ( model ) =>
@@ -292,14 +305,22 @@ export class CodexAcpServer implements acp.Agent {
292305 } ;
293306 }
294307
295- const disableSummary = sessionState . account ?. type === "apiKey"
308+ const modelId = ModelId . fromString ( sessionState . currentModelId ) ;
309+ const modelLacksReasoning = sessionState . supportedReasoningEfforts . length > 0
310+ && sessionState . supportedReasoningEfforts . every ( e => e . reasoningEffort === "none" ) ;
311+
312+ const disableSummary = sessionState . account ?. type === "apiKey" || modelLacksReasoning ;
296313 if ( disableSummary ) {
297- logger . log ( "Disable reasoning.summary because API key is used" , { sessionId : params . sessionId } ) ;
314+ logger . log ( "Disable reasoning.summary" , {
315+ sessionId : params . sessionId ,
316+ reason : sessionState . account ?. type === "apiKey" ? "API key" : "model lacks reasoning"
317+ } ) ;
298318 }
299319
300-
320+ if ( ! sessionState . supportedInputModalities . includes ( "image" ) && params . prompt . some ( b => b . type === "image" ) ) {
321+ throw RequestError . invalidRequest ( "The current model does not support image input" ) ;
322+ }
301323 const agentMode = sessionState . agentMode ;
302- const modelId = ModelId . fromString ( sessionState . currentModelId ) ;
303324 const turnCompleted = await this . runWithProcessCheck (
304325 ( ) => this . codexAcpClient . sendPrompt ( params , agentMode , modelId , disableSummary ) ) ;
305326
0 commit comments