From 9076a2e74ef0a3d862312e205e03a693ba6dbad6 Mon Sep 17 00:00:00 2001 From: Blake Johnson Date: Mon, 4 May 2026 11:19:56 -0700 Subject: [PATCH] fix(agent): keep Nous GPT-5 fallback on chat completions --- run_agent.py | 4 ++++ tests/run_agent/test_run_agent.py | 23 +++++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/run_agent.py b/run_agent.py index bdfc17efa0..d5f1dbef8d 100644 --- a/run_agent.py +++ b/run_agent.py @@ -3065,6 +3065,10 @@ class AIAgent: ) -> bool: """Return True when this provider/model pair should use Responses API.""" normalized_provider = (provider or "").strip().lower() + # Nous serves GPT-5.x models via its OpenAI-compatible chat + # completions endpoint; its /v1/responses endpoint returns 404. + if normalized_provider == "nous": + return False if normalized_provider == "copilot": try: from hermes_cli.models import _should_use_copilot_responses_api diff --git a/tests/run_agent/test_run_agent.py b/tests/run_agent/test_run_agent.py index 7c5973617b..6df71b51f9 100644 --- a/tests/run_agent/test_run_agent.py +++ b/tests/run_agent/test_run_agent.py @@ -3729,8 +3729,8 @@ class TestMaxTokensParam: assert result == {"max_completion_tokens": 4096} -class TestAzureOpenAIRouting: - """Verify Azure OpenAI endpoints stay on chat_completions for gpt-5.x.""" +class TestGpt5ApiModeRouting: + """Verify provider-specific GPT-5 API-mode routing.""" def test_azure_gpt5_stays_on_chat_completions(self, agent): """Azure serves gpt-5.x on /chat/completions — must not upgrade to codex_responses.""" @@ -3769,6 +3769,25 @@ class TestAzureOpenAIRouting: agent.api_mode = "codex_responses" assert agent.api_mode == "codex_responses" + def test_nous_gpt5_stays_on_chat_completions(self, agent): + """Nous serves gpt-5.x on /chat/completions — must not upgrade to codex_responses.""" + agent.provider = "nous" + agent.base_url = "https://inference-api.nousresearch.com/v1" + agent.api_mode = "chat_completions" + agent.model = "openai/gpt-5.5" + if ( + agent.api_mode == "chat_completions" + and not agent._is_azure_openai_url() + and ( + agent._is_direct_openai_url() + or agent._provider_model_requires_responses_api( + agent.model, provider=agent.provider, + ) + ) + ): + agent.api_mode = "codex_responses" + assert agent.api_mode == "chat_completions" + def test_is_azure_openai_url_detection(self, agent): assert agent._is_azure_openai_url("https://foo.openai.azure.com/openai/v1") is True assert agent._is_azure_openai_url("https://api.openai.com/v1") is False