Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions run_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -4446,6 +4446,18 @@ def _build_api_kwargs(self, api_messages: list) -> dict:
if _is_nous:
extra_body["tags"] = ["product=hermes-agent"]

# Ollama / custom provider: pass think=false when reasoning is disabled.
# Ollama does not recognise the OpenRouter-style `reasoning` extra_body
# field, so we use its native `think` parameter instead.
# This prevents thinking-capable models (Qwen3, etc.) from generating
# <think> blocks and producing empty-response errors when the user has
# set reasoning_effort: none.
if self.provider == "custom" and self.reasoning_config and isinstance(self.reasoning_config, dict):
_effort = (self.reasoning_config.get("effort") or "").strip().lower()
_enabled = self.reasoning_config.get("enabled", True)
if _effort == "none" or _enabled is False:
extra_body["think"] = False

if extra_body:
api_kwargs["extra_body"] = extra_body

Expand Down
39 changes: 39 additions & 0 deletions tests/test_run_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -674,6 +674,45 @@ def test_max_tokens_injected(self, agent):
kwargs = agent._build_api_kwargs(messages)
assert kwargs["max_tokens"] == 4096

def test_ollama_think_false_on_effort_none(self, agent):
"""Custom (Ollama) provider with effort=none should inject think=false."""
agent.provider = "custom"
agent.base_url = "http://localhost:11434/v1"
agent._base_url_lower = agent.base_url.lower()
agent.reasoning_config = {"effort": "none"}
messages = [{"role": "user", "content": "hi"}]
kwargs = agent._build_api_kwargs(messages)
assert kwargs.get("extra_body", {}).get("think") is False

def test_ollama_think_false_on_enabled_false(self, agent):
"""Custom (Ollama) provider with enabled=false should inject think=false."""
agent.provider = "custom"
agent.base_url = "http://localhost:11434/v1"
agent._base_url_lower = agent.base_url.lower()
agent.reasoning_config = {"enabled": False}
messages = [{"role": "user", "content": "hi"}]
kwargs = agent._build_api_kwargs(messages)
assert kwargs.get("extra_body", {}).get("think") is False

def test_ollama_no_think_param_when_reasoning_enabled(self, agent):
"""Custom provider with reasoning enabled should NOT inject think=false."""
agent.provider = "custom"
agent.base_url = "http://localhost:11434/v1"
agent._base_url_lower = agent.base_url.lower()
agent.reasoning_config = {"enabled": True, "effort": "medium"}
messages = [{"role": "user", "content": "hi"}]
kwargs = agent._build_api_kwargs(messages)
assert kwargs.get("extra_body", {}).get("think") is None

def test_non_custom_provider_unaffected(self, agent):
"""OpenRouter provider with effort=none should NOT inject think=false."""
agent.provider = "openrouter"
agent.model = "qwen/qwen3.5-plus-02-15"
agent.reasoning_config = {"effort": "none"}
messages = [{"role": "user", "content": "hi"}]
kwargs = agent._build_api_kwargs(messages)
assert kwargs.get("extra_body", {}).get("think") is None


class TestBuildAssistantMessage:
def test_basic_message(self, agent):
Expand Down
Loading