From 19b6f81ee78bfea2e6d59ac352916300163390d3 Mon Sep 17 00:00:00 2001 From: teknium1 Date: Sat, 7 Mar 2026 23:36:35 -0800 Subject: [PATCH] fix: allow Anthropic API URLs as custom OpenAI-compatible endpoints Removed the hard block on base_url containing 'api.anthropic.com'. Anthropic now offers an OpenAI-compatible /chat/completions endpoint, so blocking their URL prevents legitimate use. If the endpoint isn't compatible, the API call will fail with a proper error anyway. Removed from: run_agent.py, mini_swe_runner.py Updated test to verify Anthropic URLs are accepted. --- mini_swe_runner.py | 8 +------- run_agent.py | 8 +------- tests/test_run_agent.py | 21 ++++++++++----------- 3 files changed, 12 insertions(+), 25 deletions(-) diff --git a/mini_swe_runner.py b/mini_swe_runner.py index 2f98249f2..9be7b7348 100644 --- a/mini_swe_runner.py +++ b/mini_swe_runner.py @@ -200,13 +200,7 @@ class MiniSWERunner: else: client_kwargs["base_url"] = "https://openrouter.ai/api/v1" - if base_url and "api.anthropic.com" in base_url.strip().lower(): - raise ValueError( - "Anthropic's native /v1/messages API is not supported yet (planned for a future release). " - "Hermes currently requires OpenAI-compatible /chat/completions endpoints. " - "To use Claude models now, route through OpenRouter (OPENROUTER_API_KEY) " - "or any OpenAI-compatible proxy that wraps the Anthropic API." - ) + # Handle API key - OpenRouter is the primary provider if api_key: diff --git a/run_agent.py b/run_agent.py index 89e1ad00e..75e3dfc95 100644 --- a/run_agent.py +++ b/run_agent.py @@ -253,13 +253,7 @@ class AIAgent: self.provider = "openai-codex" else: self.api_mode = "chat_completions" - if base_url and "api.anthropic.com" in base_url.strip().lower(): - raise ValueError( - "Anthropic's native /v1/messages API is not supported yet (planned for a future release). " - "Hermes currently requires OpenAI-compatible /chat/completions endpoints. " - "To use Claude models now, route through OpenRouter (OPENROUTER_API_KEY) " - "or any OpenAI-compatible proxy that wraps the Anthropic API." - ) + self.tool_progress_callback = tool_progress_callback self.clarify_callback = clarify_callback self.step_callback = step_callback diff --git a/tests/test_run_agent.py b/tests/test_run_agent.py index 226b29a6d..55f96f942 100644 --- a/tests/test_run_agent.py +++ b/tests/test_run_agent.py @@ -280,22 +280,21 @@ class TestMaskApiKey: class TestInit: - def test_anthropic_base_url_fails_fast(self): - """Anthropic native endpoints should error before building an OpenAI client.""" + def test_anthropic_base_url_accepted(self): + """Anthropic base URLs should be accepted (OpenAI-compatible endpoint).""" with ( patch("run_agent.get_tool_definitions", return_value=[]), patch("run_agent.check_toolset_requirements", return_value={}), patch("run_agent.OpenAI") as mock_openai, ): - with pytest.raises(ValueError, match="not supported yet"): - AIAgent( - api_key="test-key-1234567890", - base_url="https://api.anthropic.com/v1/messages", - quiet_mode=True, - skip_context_files=True, - skip_memory=True, - ) - mock_openai.assert_not_called() + AIAgent( + api_key="test-key-1234567890", + base_url="https://api.anthropic.com/v1/", + quiet_mode=True, + skip_context_files=True, + skip_memory=True, + ) + mock_openai.assert_called_once() def test_prompt_caching_claude_openrouter(self): """Claude model via OpenRouter should enable prompt caching."""