fix: default reasoning context for codex proxy Responses API (#380)

* fix: set langgraph and codex proxy runtime defaults

* fix: address runtime default review feedback

* fix: drop langgraph dev env defaults per maintainer review

langgraph dev patches DATABASE_URI/REDIS_URI itself via patch_environment,
so the reported KeyError cannot come from this flow; the env defaults added
here were unnecessary. Scope the PR back to the codex proxy reasoning
context fix only.

---------

Co-authored-by: Xi Zhang <106144707+X-iZhang@users.noreply.github.com>
This commit is contained in:
houren Antony
2026-07-24 23:29:34 +08:00
committed by GitHub
parent 1863f0730c
commit fe70599d3d
2 changed files with 73 additions and 1 deletions
+7
View File
@@ -728,6 +728,13 @@ def get_chat_model(
elif _responses_api_setting == "true":
kwargs["use_responses_api"] = True
if _is_openai_proxy and kwargs.get("use_responses_api") is True:
reasoning = kwargs.setdefault("reasoning", {})
if isinstance(reasoning, dict):
reasoning = dict(reasoning)
reasoning.setdefault("context", "all_turns")
kwargs["reasoning"] = reasoning
if _uses_native_deepseek:
chat_model = EvoChatDeepSeek(model=model_id, **kwargs)
else:
+66 -1
View File
@@ -2672,7 +2672,11 @@ class TestAutoConfig:
assert call_kwargs["base_url"] == "http://127.0.0.1:8000/codex/v1"
assert call_kwargs["api_key"] == "ccproxy-oauth"
# ccproxy uses the Responses API, so reasoning configuration is valid.
assert call_kwargs["reasoning"] == {"effort": "high", "summary": "auto"}
assert call_kwargs["reasoning"] == {
"effort": "high",
"summary": "auto",
"context": "all_turns",
}
# Proxy mode: Responses API (bypasses format chain), streaming ON
assert call_kwargs["use_responses_api"] is True
assert "streaming" not in call_kwargs
@@ -2729,6 +2733,7 @@ class TestAutoConfig:
assert headers["User-Agent"].startswith("codex_cli_rs/0.144.1")
mock_installed_version.assert_called_once_with()
assert mock_init.call_args[1]["reasoning"]["effort"] == "xhigh"
assert mock_init.call_args[1]["reasoning"]["context"] == "all_turns"
@patch("EvoScientist.llm.models.init_chat_model")
def test_openai_ccproxy_codex_client_version_env(self, mock_init, monkeypatch):
@@ -2802,6 +2807,66 @@ class TestAutoConfig:
assert headers["version"] == "9.9.9"
assert headers["User-Agent"].startswith("codex_cli_rs/9.9.9")
@patch("EvoScientist.llm.models.init_chat_model")
def test_openai_ccproxy_codex_reasoning_context_respects_caller(
self, mock_init, monkeypatch
):
"""Caller-supplied reasoning.context is not overridden."""
mock_init.return_value = "mock_model"
monkeypatch.setenv("OPENAI_BASE_URL", "http://127.0.0.1:8000/codex/v1")
monkeypatch.setenv("OPENAI_API_KEY", "ccproxy-oauth")
reasoning = {"effort": "low", "context": "previous_response_id"}
get_chat_model(
"gpt-5.5",
provider="openai",
reasoning=reasoning,
)
assert mock_init.call_args[1]["reasoning"] == {
"effort": "low",
"context": "previous_response_id",
}
assert mock_init.call_args[1]["reasoning"] is not reasoning
assert reasoning == {"effort": "low", "context": "previous_response_id"}
@patch("EvoScientist.llm.models.init_chat_model")
def test_openai_ccproxy_codex_reasoning_context_requires_responses_api(
self, mock_init, monkeypatch
):
"""Responses-only reasoning.context is not sent when Chat Completions is forced."""
mock_init.return_value = "mock_model"
monkeypatch.setenv("OPENAI_BASE_URL", "http://127.0.0.1:8000/codex/v1")
monkeypatch.setenv("OPENAI_API_KEY", "ccproxy-oauth")
monkeypatch.delenv("EVOSCIENTIST_USE_RESPONSES_API", raising=False)
get_chat_model(
"gpt-5.5",
provider="openai",
use_responses_api=False,
reasoning={"effort": "low"},
)
call_kwargs = mock_init.call_args[1]
assert call_kwargs["use_responses_api"] is False
assert call_kwargs["reasoning"] == {"effort": "low"}
@patch("EvoScientist.llm.models.init_chat_model")
def test_openai_ccproxy_codex_env_false_drops_reasoning(
self, mock_init, monkeypatch
):
"""The global Chat Completions override still removes reasoning entirely."""
mock_init.return_value = "mock_model"
monkeypatch.setenv("OPENAI_BASE_URL", "http://127.0.0.1:8000/codex/v1")
monkeypatch.setenv("OPENAI_API_KEY", "ccproxy-oauth")
monkeypatch.setenv("EVOSCIENTIST_USE_RESPONSES_API", "false")
get_chat_model("gpt-5.5", provider="openai")
call_kwargs = mock_init.call_args[1]
assert call_kwargs["use_responses_api"] is False
assert "reasoning" not in call_kwargs
@patch("EvoScientist.llm.models.init_chat_model")
def test_openai_ccproxy_codex_none_headers(self, mock_init, monkeypatch):
"""An explicit default_headers=None is normalized before gap-filling."""