diff --git a/docs/custom-providers.md b/docs/custom-providers.md index 90c4dc07c3..1f872b9d1b 100644 --- a/docs/custom-providers.md +++ b/docs/custom-providers.md @@ -714,7 +714,7 @@ Each entry in the `models` array: ### Claude settings.json model discovery -The built-in `claude` provider appends concrete model IDs from `~/.claude/settings.json` to its first-party Claude model list. Paseo reads the top-level `model` field and these `env` keys: `ANTHROPIC_MODEL`, `ANTHROPIC_SMALL_FAST_MODEL`, `ANTHROPIC_DEFAULT_OPUS_MODEL`, `ANTHROPIC_DEFAULT_SONNET_MODEL`, and `ANTHROPIC_DEFAULT_HAIKU_MODEL`. +The built-in `claude` provider appends concrete model IDs from `~/.claude/settings.json` to its first-party Claude model list. Paseo reads the top-level `model` field and these `env` keys: `ANTHROPIC_MODEL`, `ANTHROPIC_SMALL_FAST_MODEL`, `ANTHROPIC_DEFAULT_FABLE_MODEL`, `ANTHROPIC_DEFAULT_OPUS_MODEL`, `ANTHROPIC_DEFAULT_SONNET_MODEL`, and `ANTHROPIC_DEFAULT_HAIKU_MODEL`. This lets users who already configured Claude Code for Bedrock, OpenRouter, ollama, Z.AI, or another Anthropic-compatible gateway select the exact model ID in Paseo. Explicit model IDs are passed unchanged to Claude Code, even when the same string is a compatibility alias for a built-in model. When `agents.providers.claude.models` is set it **replaces** both the hardcoded first-party Claude list and any settings.json-discovered entries; use `agents.providers.claude.additionalModels` to keep the first-party list and append curated entries on top. diff --git a/packages/server/src/server/agent/providers/claude/models.test.ts b/packages/server/src/server/agent/providers/claude/models.test.ts index a497826f73..5a10980fbf 100644 --- a/packages/server/src/server/agent/providers/claude/models.test.ts +++ b/packages/server/src/server/agent/providers/claude/models.test.ts @@ -210,6 +210,7 @@ describe("ClaudeAgentClient.fetchCatalog", () => { env: { ANTHROPIC_MODEL: "openrouter/anthropic/claude-sonnet-4.5", ANTHROPIC_SMALL_FAST_MODEL: "ollama/qwen3-coder", + ANTHROPIC_DEFAULT_FABLE_MODEL: "claude-fable-5-1[1M]", ANTHROPIC_DEFAULT_OPUS_MODEL: "bedrock-opus-from-env", ANTHROPIC_DEFAULT_SONNET_MODEL: "glm-5.1", ANTHROPIC_DEFAULT_HAIKU_MODEL: "glm-5", @@ -244,6 +245,12 @@ describe("ClaudeAgentClient.fetchCatalog", () => { label: "ollama/qwen3-coder", description: "From Claude settings.json env.ANTHROPIC_SMALL_FAST_MODEL", }, + { + provider: "claude", + id: "claude-fable-5-1[1M]", + label: "claude-fable-5-1[1M]", + description: "From Claude settings.json env.ANTHROPIC_DEFAULT_FABLE_MODEL", + }, { provider: "claude", id: "bedrock-opus-from-env", @@ -263,6 +270,8 @@ describe("ClaudeAgentClient.fetchCatalog", () => { description: "From Claude settings.json env.ANTHROPIC_DEFAULT_HAIKU_MODEL", }, ]); + expect(models.filter((model) => model.id === "claude-fable-5-1[1M]")).toHaveLength(1); + expect(models.some((model) => model.id === "claude-fable-5-1")).toBe(true); }); it("falls back to hardcoded models when settings.json is missing", async () => { diff --git a/packages/server/src/server/agent/providers/claude/models.ts b/packages/server/src/server/agent/providers/claude/models.ts index c24e5ad36c..603f21c92c 100644 --- a/packages/server/src/server/agent/providers/claude/models.ts +++ b/packages/server/src/server/agent/providers/claude/models.ts @@ -14,6 +14,7 @@ import { const CLAUDE_SETTINGS_MODEL_ENV_KEYS = [ "ANTHROPIC_MODEL", "ANTHROPIC_SMALL_FAST_MODEL", + "ANTHROPIC_DEFAULT_FABLE_MODEL", "ANTHROPIC_DEFAULT_OPUS_MODEL", "ANTHROPIC_DEFAULT_SONNET_MODEL", "ANTHROPIC_DEFAULT_HAIKU_MODEL",