mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-15 04:12:25 +00:00
fix: use max_completion_tokens for GitHub Copilot
This commit is contained in:
parent
d12be46df8
commit
f648c2e3aa
4 changed files with 38 additions and 3 deletions
|
|
@ -2862,10 +2862,11 @@ def auxiliary_max_tokens_param(value: int) -> dict:
|
||||||
"""
|
"""
|
||||||
custom_base = _current_custom_base_url()
|
custom_base = _current_custom_base_url()
|
||||||
or_key = os.getenv("OPENROUTER_API_KEY")
|
or_key = os.getenv("OPENROUTER_API_KEY")
|
||||||
# Only use max_completion_tokens for direct OpenAI custom endpoints
|
# Use max_completion_tokens for direct OpenAI-compatible providers that reject
|
||||||
|
# max_tokens on newer GPT-4o/o-series/GPT-5-style models.
|
||||||
if (not or_key
|
if (not or_key
|
||||||
and _read_nous_auth() is None
|
and _read_nous_auth() is None
|
||||||
and base_url_hostname(custom_base) == "api.openai.com"):
|
and base_url_hostname(custom_base) in {"api.openai.com", "api.githubcopilot.com"}):
|
||||||
return {"max_completion_tokens": value}
|
return {"max_completion_tokens": value}
|
||||||
return {"max_tokens": value}
|
return {"max_tokens": value}
|
||||||
|
|
||||||
|
|
|
||||||
12
run_agent.py
12
run_agent.py
|
|
@ -2852,6 +2852,16 @@ class AIAgent:
|
||||||
url = getattr(self, "_base_url_lower", "") or ""
|
url = getattr(self, "_base_url_lower", "") or ""
|
||||||
return "openai.azure.com" in url
|
return "openai.azure.com" in url
|
||||||
|
|
||||||
|
def _is_github_copilot_url(self, base_url: str = None) -> bool:
|
||||||
|
"""Return True when a base URL targets GitHub Copilot's OpenAI-compatible API."""
|
||||||
|
if base_url is not None:
|
||||||
|
hostname = base_url_hostname(base_url)
|
||||||
|
else:
|
||||||
|
hostname = getattr(self, "_base_url_hostname", "") or base_url_hostname(
|
||||||
|
getattr(self, "_base_url_lower", "")
|
||||||
|
)
|
||||||
|
return hostname == "api.githubcopilot.com"
|
||||||
|
|
||||||
def _resolved_api_call_timeout(self) -> float:
|
def _resolved_api_call_timeout(self) -> float:
|
||||||
"""Resolve the effective per-call request timeout in seconds.
|
"""Resolve the effective per-call request timeout in seconds.
|
||||||
|
|
||||||
|
|
@ -3047,7 +3057,7 @@ class AIAgent:
|
||||||
OpenAI-compatible endpoint. OpenRouter, local models, and older
|
OpenAI-compatible endpoint. OpenRouter, local models, and older
|
||||||
OpenAI models use 'max_tokens'.
|
OpenAI models use 'max_tokens'.
|
||||||
"""
|
"""
|
||||||
if self._is_direct_openai_url() or self._is_azure_openai_url():
|
if self._is_direct_openai_url() or self._is_azure_openai_url() or self._is_github_copilot_url():
|
||||||
return {"max_completion_tokens": value}
|
return {"max_completion_tokens": value}
|
||||||
return {"max_tokens": value}
|
return {"max_tokens": value}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,18 @@ def codex_auth_dir(tmp_path, monkeypatch):
|
||||||
return codex_dir
|
return codex_dir
|
||||||
|
|
||||||
|
|
||||||
|
class TestAuxiliaryMaxTokensParam:
|
||||||
|
def test_uses_max_completion_tokens_for_github_copilot_custom_base(self):
|
||||||
|
with patch("agent.auxiliary_client._resolve_custom_runtime", return_value=("https://api.githubcopilot.com", "key", None)), \
|
||||||
|
patch("agent.auxiliary_client._read_nous_auth", return_value=None):
|
||||||
|
assert auxiliary_max_tokens_param(2048) == {"max_completion_tokens": 2048}
|
||||||
|
|
||||||
|
def test_uses_max_completion_tokens_for_github_copilot_custom_base_path(self):
|
||||||
|
with patch("agent.auxiliary_client._resolve_custom_runtime", return_value=("https://api.githubcopilot.com/chat/completions", "key", None)), \
|
||||||
|
patch("agent.auxiliary_client._read_nous_auth", return_value=None):
|
||||||
|
assert auxiliary_max_tokens_param(2048) == {"max_completion_tokens": 2048}
|
||||||
|
|
||||||
|
|
||||||
class TestNormalizeAuxProvider:
|
class TestNormalizeAuxProvider:
|
||||||
def test_maps_github_copilot_aliases(self):
|
def test_maps_github_copilot_aliases(self):
|
||||||
assert _normalize_aux_provider("github") == "copilot"
|
assert _normalize_aux_provider("github") == "copilot"
|
||||||
|
|
|
||||||
|
|
@ -3666,6 +3666,18 @@ class TestMaxTokensParam:
|
||||||
result = agent._max_tokens_param(4096)
|
result = agent._max_tokens_param(4096)
|
||||||
assert result == {"max_completion_tokens": 4096}
|
assert result == {"max_completion_tokens": 4096}
|
||||||
|
|
||||||
|
def test_returns_max_completion_tokens_for_github_copilot(self, agent):
|
||||||
|
"""GitHub Copilot's OpenAI-compatible API rejects max_tokens for newer models."""
|
||||||
|
agent.base_url = "https://api.githubcopilot.com"
|
||||||
|
result = agent._max_tokens_param(4096)
|
||||||
|
assert result == {"max_completion_tokens": 4096}
|
||||||
|
|
||||||
|
def test_returns_max_completion_tokens_for_github_copilot_path(self, agent):
|
||||||
|
"""Detect Copilot by hostname even when the configured URL includes a path."""
|
||||||
|
agent.base_url = "https://api.githubcopilot.com/chat/completions"
|
||||||
|
result = agent._max_tokens_param(4096)
|
||||||
|
assert result == {"max_completion_tokens": 4096}
|
||||||
|
|
||||||
|
|
||||||
class TestAzureOpenAIRouting:
|
class TestAzureOpenAIRouting:
|
||||||
"""Verify Azure OpenAI endpoints stay on chat_completions for gpt-5.x."""
|
"""Verify Azure OpenAI endpoints stay on chat_completions for gpt-5.x."""
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue