Skip to content

Commit f14a0bd

Browse files
committed
Add function to identify official OpenAI API and update reasoning handling in LLM kwargs
Introduce a new helper function to check if the LLM base URI targets the official OpenAI API. Modify the reasoning handling in the build_llm_kwargs function to differentiate between official OpenAI and other OpenAI-compatible providers, ensuring correct structuring of reasoning data in the kwargs. Enhance tests to validate these changes.
1 parent 1cde31e commit f14a0bd

2 files changed

Lines changed: 35 additions & 6 deletions

File tree

src/sub_agent_mcp/agent/builder.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
DEFAULT_RECURSION_LIMIT = int(os.getenv("AGENT_RECURSION_LIMIT", "25"))
1818

1919

20+
def _is_official_openai_api(base_uri: str) -> bool:
21+
"""Return True when the LLM base URL targets the official OpenAI API."""
22+
return "api.openai.com" in base_uri.lower()
23+
24+
2025
def build_llm_kwargs(agent: AgentConfig) -> dict[str, Any]:
2126
"""Map agent LLM config to ChatOpenAI constructor kwargs."""
2227
llm = agent.llm
@@ -34,14 +39,17 @@ def build_llm_kwargs(agent: AgentConfig) -> dict[str, Any]:
3439
reasoning: dict[str, str] = {}
3540
if llm.reasoning_effort is not None:
3641
reasoning["effort"] = llm.reasoning_effort
37-
kwargs["reasoning_effort"] = llm.reasoning_effort
3842
if llm.reasoning_summary is not None:
3943
reasoning["summary"] = llm.reasoning_summary
4044

4145
if reasoning:
42-
kwargs["reasoning"] = reasoning
43-
# OpenRouter and other OpenAI-compatible providers expect reasoning here.
44-
kwargs["extra_body"] = {"reasoning": reasoning}
46+
if _is_official_openai_api(str(llm.base_uri)):
47+
# Official OpenAI uses the Responses API reasoning object.
48+
kwargs["reasoning"] = reasoning
49+
else:
50+
# OpenRouter and other OpenAI-compatible providers use Chat Completions
51+
# with provider-specific fields nested under extra_body.
52+
kwargs["extra_body"] = {"reasoning": reasoning}
4553

4654
return kwargs
4755

tests/test_builder.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,32 @@ def test_build_llm_kwargs_minimal() -> None:
3737
def test_build_llm_kwargs_includes_reasoning_effort() -> None:
3838
kwargs = build_llm_kwargs(_agent(reasoning_effort="high"))
3939

40-
assert kwargs["reasoning_effort"] == "high"
41-
assert kwargs["reasoning"] == {"effort": "high"}
40+
assert "reasoning_effort" not in kwargs
41+
assert "reasoning" not in kwargs
4242
assert kwargs["extra_body"] == {"reasoning": {"effort": "high"}}
4343

4444

45+
def test_build_llm_kwargs_openai_uses_reasoning_object() -> None:
46+
agent = AgentConfig(
47+
id="researcher",
48+
title="Research Agent",
49+
description="Test agent",
50+
llm=LLMConfig(
51+
base_uri="https://api.openai.com/v1",
52+
api_key=SecretStr("test-key"),
53+
model_id="gpt-5-nano",
54+
reasoning_effort="medium",
55+
),
56+
system_prompt="You are helpful.",
57+
)
58+
59+
kwargs = build_llm_kwargs(agent)
60+
61+
assert kwargs["reasoning"] == {"effort": "medium"}
62+
assert "extra_body" not in kwargs
63+
assert "reasoning_effort" not in kwargs
64+
65+
4566
def test_build_llm_kwargs_includes_reasoning_summary() -> None:
4667
kwargs = build_llm_kwargs(
4768
_agent(

0 commit comments

Comments
 (0)