I saw that #760 was closed.
The root problem here is in setSessionConfigOption() in the ACP bridge: it validates the model value against initializationResult.models and throws for any ID not in that list. For users of ACP-based editors like Zed, this means the model (claude-fable-5) is completely inaccessible — there's no way to specify a model that isn't in the initialization response.
The issue is that initializationResult.models and what Claude Code actually accepts are two different views, and they're not always in sync. We verified this: claude-fable-5 is already accepted by Claude Code today — when the model ID is passed through to query.setModel(), it works correctly.
We also verified that invalid model IDs are handled properly end-to-end. When we specified claude-fable-6 (a nonexistent model), Claude Code returned a clean model_not_found error that the bridge correctly surfaced to Zed:
message: "Internal error: There's an issue with the selected model (claude-fable-6). It may not exist or you may not have access to it.",
data: { errorKind: 'model_not_found' }
This demonstrates that Claude Code is already the authoritative validator for model IDs. The bridge's own validation against initializationResult.models is redundant — and in the case of claude-fable-5, it blocks a model that already works while providing no useful error signal that Claude Code wouldn't provide itself.
One possibility for a fix is straightforward: when a model ID isn't present in initializationResult.models, pass it through to query.setModel() rather than throwing at the bridge layer.
if (!validValue) {
if (params.configId === "model") {
validValue = { value: params.value, name: params.value, description: "" };
} else {
throw new Error(`Invalid value for config option ${params.configId}: ${params.value}`);
}
}
This could potentially be opt-in. I would like to make a patch to Zed so that users can provide their own user-specified model names, but allowing this requires that the Claude Agent ACP allow models that Claude Code supports but which are not yet in the model list.
I saw that #760 was closed.
The root problem here is in
setSessionConfigOption()in the ACP bridge: it validates the model value againstinitializationResult.modelsand throws for any ID not in that list. For users of ACP-based editors like Zed, this means the model (claude-fable-5) is completely inaccessible — there's no way to specify a model that isn't in the initialization response.The issue is that
initializationResult.modelsand what Claude Code actually accepts are two different views, and they're not always in sync. We verified this:claude-fable-5is already accepted by Claude Code today — when the model ID is passed through toquery.setModel(), it works correctly.We also verified that invalid model IDs are handled properly end-to-end. When we specified
claude-fable-6(a nonexistent model), Claude Code returned a cleanmodel_not_founderror that the bridge correctly surfaced to Zed:This demonstrates that Claude Code is already the authoritative validator for model IDs. The bridge's own validation against
initializationResult.modelsis redundant — and in the case ofclaude-fable-5, it blocks a model that already works while providing no useful error signal that Claude Code wouldn't provide itself.One possibility for a fix is straightforward: when a model ID isn't present in
initializationResult.models, pass it through toquery.setModel()rather than throwing at the bridge layer.This could potentially be opt-in. I would like to make a patch to Zed so that users can provide their own user-specified model names, but allowing this requires that the Claude Agent ACP allow models that Claude Code supports but which are not yet in the model list.