diff --git a/src/ucode/agents/claude.py b/src/ucode/agents/claude.py index e818cdf..3046d15 100644 --- a/src/ucode/agents/claude.py +++ b/src/ucode/agents/claude.py @@ -302,6 +302,11 @@ def render_overlay( "ENABLE_TOOL_SEARCH": "1", "CLAUDE_CODE_USE_GATEWAY": "1", } + # Native /model discovery: picker lists every gateway Messages-API endpoint, + # not just the family aliases. Skipped under a provider (its routing header + # would send a discovered gateway id to a provider that can't resolve it). + if not provider: + env["CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY"] = "1" # Intentionally NOT setting ANTHROPIC_MODEL by default. Setting it produces a # duplicate catalog row in Claude Code's /model picker (e.g. "Opus 4.8 (1M # context) ✓") on top of the family-alias row from ANTHROPIC_DEFAULT_OPUS_MODEL. diff --git a/tests/test_agent_claude.py b/tests/test_agent_claude.py index b45b630..68a12be 100644 --- a/tests/test_agent_claude.py +++ b/tests/test_agent_claude.py @@ -127,6 +127,17 @@ def test_enables_use_gateway(self): overlay, _ = claude.render_overlay(WS, "s4") assert overlay["env"]["CLAUDE_CODE_USE_GATEWAY"] == "1" + def test_enables_gateway_model_discovery(self): + overlay, _ = claude.render_overlay(WS, "s4") + assert overlay["env"]["CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY"] == "1" + + def test_gateway_model_discovery_skipped_under_provider(self): + # A Model Provider Service routes every request to the external provider, + # so a discovered gateway endpoint id would reach a provider that can't + # resolve it — discovery must be off in that mode. + overlay, _ = claude.render_overlay(WS, "s4", provider="main.x.claude-svc") + assert "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY" not in overlay["env"] + def test_sets_api_key_helper(self): overlay, _ = claude.render_overlay(WS, "s4") assert "apiKeyHelper" in overlay