diff --git a/packages/agent/src/adapters/acp-connection.ts b/packages/agent/src/adapters/acp-connection.ts index 64c993267..9567b033f 100644 --- a/packages/agent/src/adapters/acp-connection.ts +++ b/packages/agent/src/adapters/acp-connection.ts @@ -1,5 +1,6 @@ import { AgentSideConnection, ndJsonStream } from "@agentclientprotocol/sdk"; import { POSTHOG_NOTIFICATIONS } from "../acp-extensions"; +import { formatModelId } from "../gateway-models"; import type { SessionLogWriter } from "../session-log-writer"; import type { ProcessSpawnedCallback } from "../types"; import { Logger } from "../utils/logger"; @@ -36,21 +37,27 @@ export type AcpConnection = { export type InProcessAcpConnection = AcpConnection; +type ModelOption = { value?: string; name?: string }; +type ModelGroup = { group?: string; name?: string; options?: ModelOption[] }; + type ConfigOption = { id?: string; category?: string | null; currentValue?: string; - options?: Array< - { value?: string } | { group?: string; options?: Array<{ value?: string }> } - >; + options?: Array; }; function isGroupedOptions( options: NonNullable, -): options is Array<{ group?: string; options?: Array<{ value?: string }> }> { +): options is ModelGroup[] { return options.length > 0 && "group" in options[0]; } +function formatOption(o: ModelOption): ModelOption { + if (!o.value) return o; + return { ...o, name: formatModelId(o.value) }; +} + function filterModelConfigOptions( msg: Record, allowedModelIds: Set, @@ -74,9 +81,9 @@ function filterModelConfigOptions( if (isGroupedOptions(options)) { const filteredOptions = options.map((group) => ({ ...group, - options: (group.options ?? []).filter( - (o) => o?.value && allowedModelIds.has(o.value), - ), + options: (group.options ?? []) + .filter((o) => o?.value && allowedModelIds.has(o.value)) + .map(formatOption), })); const flat = filteredOptions.flatMap((g) => g.options ?? []); const currentAllowed = @@ -91,10 +98,10 @@ function filterModelConfigOptions( }; } - const valueOptions = options as Array<{ value?: string }>; - const filteredOptions = valueOptions.filter( - (o) => o?.value && allowedModelIds.has(o.value), - ); + const valueOptions = options as ModelOption[]; + const filteredOptions = valueOptions + .filter((o) => o?.value && allowedModelIds.has(o.value)) + .map(formatOption); const currentAllowed = opt.currentValue && allowedModelIds.has(opt.currentValue); const nextCurrent = diff --git a/packages/agent/src/adapters/claude/claude-agent.ts b/packages/agent/src/adapters/claude/claude-agent.ts index 833cf9140..f4a036857 100644 --- a/packages/agent/src/adapters/claude/claude-agent.ts +++ b/packages/agent/src/adapters/claude/claude-agent.ts @@ -143,7 +143,6 @@ export class ClaudeAcpAgent extends BaseAcpAgent { list: {}, fork: {}, resume: {}, - close: {}, }, _meta: { posthog: { diff --git a/packages/agent/src/agent.ts b/packages/agent/src/agent.ts index 13e525ea2..d2adfd62c 100644 --- a/packages/agent/src/agent.ts +++ b/packages/agent/src/agent.ts @@ -107,7 +107,7 @@ export class Agent { sanitizedModel = codexModelIds[0]; } } - if (!sanitizedModel) { + if (!sanitizedModel && options.adapter !== "codex") { sanitizedModel = DEFAULT_GATEWAY_MODEL; } diff --git a/packages/agent/src/gateway-models.ts b/packages/agent/src/gateway-models.ts index fb28aacc1..a64b90d1a 100644 --- a/packages/agent/src/gateway-models.ts +++ b/packages/agent/src/gateway-models.ts @@ -146,7 +146,11 @@ export function getProviderName(ownedBy: string): string { const PROVIDER_PREFIXES = ["anthropic/", "openai/", "google-vertex/"]; export function formatGatewayModelName(model: GatewayModel): string { - let cleanId = model.id; + return formatModelId(model.id); +} + +export function formatModelId(modelId: string): string { + let cleanId = modelId; for (const prefix of PROVIDER_PREFIXES) { if (cleanId.startsWith(prefix)) { cleanId = cleanId.slice(prefix.length);