Describe the feature or problem you'd like to solve
Over copilot --acp, a client has no way to list the models available to the signed-in account or to pick one for a session.
Measured on GitHub Copilot CLI 1.0.85 (macOS arm64):
session/new returns sessionId, modes and configOptions only. configOptions holds exactly two select options, mode and allow_all. There is no option with category: "model".
session/load returns the same set.
- Sending
/model as a prompt answers: "The model-picker dialog is only available in the interactive CLI."
--model <id> accepts any string. copilot --acp --model=not_a_real_model_xyz starts, creates a session and completes a prompt with no error, no stderr, and nothing on the wire reports which model actually ran.
So an ACP client (an editor or a desktop app embedding Copilot) can only offer a single "Copilot default" row. It cannot show the models the user's plan allows, and if it hard-codes ids it cannot tell when one silently fell back.
Proposed solution
Advertise the model list the way the ACP spec already provides for it:
- Include a
SessionConfigOption with type: "select" and category: "model" in session/new and session/load responses, listing the ids the account can use and currentValue set to the active model. Grouping by vendor via SessionConfigSelectGroup is fine.
- Accept
session/set_config_option for that option and emit config_option_update on change, so a client can switch models mid-session without respawning.
- Ideally, reject an unknown
--model value (or at least log it to stderr) instead of silently running the default.
This is the same shape the interactive /model picker already has; it just needs to be exposed on the ACP surface.
Example prompts or workflows
An ACP client starts copilot --acp, calls session/new, reads the model config option, shows its values in a picker, and calls session/set_config_option with the user's choice. Today step 3 yields nothing to show.
Additional context
Minimal reproduction (Node 24):
import { spawn } from 'node:child_process'
const c = spawn('copilot', ['--acp', '--no-auto-update'], { stdio: ['pipe', 'pipe', 'inherit'] })
const send = (o) => c.stdin.write(JSON.stringify(o) + '\n')
let buf = ''
c.stdout.on('data', (d) => {
buf += d
for (const line of buf.split('\n').slice(0, -1)) {
const m = JSON.parse(line)
if (m.id === 1) send({ jsonrpc: '2.0', id: 2, method: 'session/new', params: { cwd: process.cwd(), mcpServers: [] } })
if (m.id === 2) { console.log(Object.keys(m.result), m.result.configOptions.map((o) => o.id)); c.kill() }
}
buf = buf.slice(buf.lastIndexOf('\n') + 1)
})
send({ jsonrpc: '2.0', id: 1, method: 'initialize', params: { protocolVersion: 1, clientCapabilities: { fs: { readTextFile: false, writeTextFile: false } }, clientInfo: { name: 'probe', version: '0' } } })
Prints [ 'sessionId', 'modes', 'configOptions' ] [ 'mode', 'allow_all' ].
Version: GitHub Copilot CLI 1.0.85. ACP SDK used by the client: @agentclientprotocol/sdk 1.4.0.
Describe the feature or problem you'd like to solve
Over
copilot --acp, a client has no way to list the models available to the signed-in account or to pick one for a session.Measured on GitHub Copilot CLI 1.0.85 (macOS arm64):
session/newreturnssessionId,modesandconfigOptionsonly.configOptionsholds exactly twoselectoptions,modeandallow_all. There is no option withcategory: "model".session/loadreturns the same set./modelas a prompt answers: "The model-picker dialog is only available in the interactive CLI."--model <id>accepts any string.copilot --acp --model=not_a_real_model_xyzstarts, creates a session and completes a prompt with no error, no stderr, and nothing on the wire reports which model actually ran.So an ACP client (an editor or a desktop app embedding Copilot) can only offer a single "Copilot default" row. It cannot show the models the user's plan allows, and if it hard-codes ids it cannot tell when one silently fell back.
Proposed solution
Advertise the model list the way the ACP spec already provides for it:
SessionConfigOptionwithtype: "select"andcategory: "model"insession/newandsession/loadresponses, listing the ids the account can use andcurrentValueset to the active model. Grouping by vendor viaSessionConfigSelectGroupis fine.session/set_config_optionfor that option and emitconfig_option_updateon change, so a client can switch models mid-session without respawning.--modelvalue (or at least log it to stderr) instead of silently running the default.This is the same shape the interactive
/modelpicker already has; it just needs to be exposed on the ACP surface.Example prompts or workflows
An ACP client starts
copilot --acp, callssession/new, reads themodelconfig option, shows its values in a picker, and callssession/set_config_optionwith the user's choice. Today step 3 yields nothing to show.Additional context
Minimal reproduction (Node 24):
Prints
[ 'sessionId', 'modes', 'configOptions' ] [ 'mode', 'allow_all' ].Version:
GitHub Copilot CLI 1.0.85. ACP SDK used by the client:@agentclientprotocol/sdk1.4.0.