@@ -12,6 +12,8 @@ import type {
1212 NewSessionResponse ,
1313 PromptRequest ,
1414 PromptResponse ,
15+ SetSessionModelRequest ,
16+ SetSessionModelResponse ,
1517} from "@agentclientprotocol/sdk"
1618import { Log } from "../util/log"
1719import { ACPSessionManager } from "./session"
@@ -55,24 +57,81 @@ export class OpenCodeAgent implements Agent {
5557 async newSession ( params : NewSessionRequest ) : Promise < NewSessionResponse > {
5658 this . log . info ( "newSession" , { cwd : params . cwd , mcpServers : params . mcpServers . length } )
5759
58- const session = await this . sessionManager . create ( params . cwd , params . mcpServers )
60+ const model = await this . defaultModel ( )
61+ const session = await this . sessionManager . create ( params . cwd , params . mcpServers , model )
62+ const availableModels = await this . availableModels ( )
5963
6064 return {
6165 sessionId : session . id ,
66+ models : {
67+ currentModelId : `${ model . providerID } /${ model . modelID } ` ,
68+ availableModels,
69+ } ,
6270 _meta : { } ,
6371 }
6472 }
6573
6674 async loadSession ( params : LoadSessionRequest ) : Promise < LoadSessionResponse > {
6775 this . log . info ( "loadSession" , { sessionId : params . sessionId , cwd : params . cwd } )
6876
69- await this . sessionManager . load ( params . sessionId , params . cwd , params . mcpServers )
77+ const defaultModel = await this . defaultModel ( )
78+ const session = await this . sessionManager . load ( params . sessionId , params . cwd , params . mcpServers , defaultModel )
79+ const availableModels = await this . availableModels ( )
7080
7181 return {
82+ models : {
83+ currentModelId : `${ session . model . providerID } /${ session . model . modelID } ` ,
84+ availableModels,
85+ } ,
7286 _meta : { } ,
7387 }
7488 }
7589
90+ async setSessionModel ( params : SetSessionModelRequest ) : Promise < SetSessionModelResponse > {
91+ this . log . info ( "setSessionModel" , { sessionId : params . sessionId , modelId : params . modelId } )
92+
93+ const session = this . sessionManager . get ( params . sessionId )
94+ if ( ! session ) {
95+ throw new Error ( `Session not found: ${ params . sessionId } ` )
96+ }
97+
98+ const parsed = Provider . parseModel ( params . modelId )
99+ const model = await Provider . getModel ( parsed . providerID , parsed . modelID )
100+
101+ this . sessionManager . setModel ( session . id , {
102+ providerID : model . providerID ,
103+ modelID : model . modelID ,
104+ } )
105+
106+ return {
107+ _meta : { } ,
108+ }
109+ }
110+
111+ private async defaultModel ( ) {
112+ const configured = this . config . defaultModel
113+ if ( configured ) return configured
114+ return Provider . defaultModel ( )
115+ }
116+
117+ private async availableModels ( ) {
118+ const providers = await Provider . list ( )
119+ const entries = Object . entries ( providers ) . sort ( ( a , b ) => {
120+ const nameA = a [ 1 ] . info . name . toLowerCase ( )
121+ const nameB = b [ 1 ] . info . name . toLowerCase ( )
122+ if ( nameA < nameB ) return - 1
123+ if ( nameA > nameB ) return 1
124+ return 0
125+ } )
126+ return entries . flatMap ( ( [ providerID , provider ] ) => {
127+ const models = Provider . sort ( Object . values ( provider . info . models ) )
128+ return models . map ( ( model ) => ( {
129+ modelId : `${ providerID } /${ model . id } ` ,
130+ name : `${ provider . info . name } /${ model . name } ` ,
131+ } ) )
132+ } )
133+ }
134+
76135 async prompt ( params : PromptRequest ) : Promise < PromptResponse > {
77136 this . log . info ( "prompt" , {
78137 sessionId : params . sessionId ,
@@ -84,7 +143,11 @@ export class OpenCodeAgent implements Agent {
84143 throw new Error ( `Session not found: ${ params . sessionId } ` )
85144 }
86145
87- const model = this . config . defaultModel || ( await Provider . defaultModel ( ) )
146+ const current = acpSession . model
147+ const model = current ?? ( await this . defaultModel ( ) )
148+ if ( ! current ) {
149+ this . sessionManager . setModel ( acpSession . id , model )
150+ }
88151
89152 const parts = params . prompt . map ( ( content ) => {
90153 if ( content . type === "text" ) {
0 commit comments