mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-04-25 00:51:20 +00:00
fix(aux): normalize GitHub Copilot provider slugs
Keep auxiliary provider resolution aligned with the switch and persisted main-provider paths when models.dev returns github-copilot slugs. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
df55660e3c
commit
2e2de124af
3 changed files with 42 additions and 3 deletions
|
|
@ -74,6 +74,12 @@ _PROVIDER_ALIASES = {
|
||||||
"minimax_cn": "minimax-cn",
|
"minimax_cn": "minimax-cn",
|
||||||
"claude": "anthropic",
|
"claude": "anthropic",
|
||||||
"claude-code": "anthropic",
|
"claude-code": "anthropic",
|
||||||
|
"github": "copilot",
|
||||||
|
"github-copilot": "copilot",
|
||||||
|
"github-model": "copilot",
|
||||||
|
"github-models": "copilot",
|
||||||
|
"github-copilot-acp": "copilot-acp",
|
||||||
|
"copilot-acp-agent": "copilot-acp",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -89,10 +95,11 @@ def _normalize_aux_provider(provider: Optional[str]) -> str:
|
||||||
if normalized == "main":
|
if normalized == "main":
|
||||||
# Resolve to the user's actual main provider so named custom providers
|
# Resolve to the user's actual main provider so named custom providers
|
||||||
# and non-aggregator providers (DeepSeek, Alibaba, etc.) work correctly.
|
# and non-aggregator providers (DeepSeek, Alibaba, etc.) work correctly.
|
||||||
main_prov = _read_main_provider()
|
main_prov = (_read_main_provider() or "").strip().lower()
|
||||||
if main_prov and main_prov not in ("auto", "main", ""):
|
if main_prov and main_prov not in ("auto", "main", ""):
|
||||||
return main_prov
|
normalized = main_prov
|
||||||
return "custom"
|
else:
|
||||||
|
return "custom"
|
||||||
return _PROVIDER_ALIASES.get(normalized, normalized)
|
return _PROVIDER_ALIASES.get(normalized, normalized)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ from agent.auxiliary_client import (
|
||||||
_read_codex_access_token,
|
_read_codex_access_token,
|
||||||
_get_provider_chain,
|
_get_provider_chain,
|
||||||
_is_payment_error,
|
_is_payment_error,
|
||||||
|
_normalize_aux_provider,
|
||||||
_try_payment_fallback,
|
_try_payment_fallback,
|
||||||
_resolve_auto,
|
_resolve_auto,
|
||||||
)
|
)
|
||||||
|
|
@ -54,6 +55,17 @@ def codex_auth_dir(tmp_path, monkeypatch):
|
||||||
return codex_dir
|
return codex_dir
|
||||||
|
|
||||||
|
|
||||||
|
class TestNormalizeAuxProvider:
|
||||||
|
def test_maps_github_copilot_aliases(self):
|
||||||
|
assert _normalize_aux_provider("github") == "copilot"
|
||||||
|
assert _normalize_aux_provider("github-copilot") == "copilot"
|
||||||
|
assert _normalize_aux_provider("github-models") == "copilot"
|
||||||
|
|
||||||
|
def test_maps_github_copilot_acp_aliases(self):
|
||||||
|
assert _normalize_aux_provider("github-copilot-acp") == "copilot-acp"
|
||||||
|
assert _normalize_aux_provider("copilot-acp-agent") == "copilot-acp"
|
||||||
|
|
||||||
|
|
||||||
class TestReadCodexAccessToken:
|
class TestReadCodexAccessToken:
|
||||||
def test_valid_auth_store(self, tmp_path, monkeypatch):
|
def test_valid_auth_store(self, tmp_path, monkeypatch):
|
||||||
hermes_home = tmp_path / "hermes"
|
hermes_home = tmp_path / "hermes"
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,26 @@ class TestResolveProviderClientMainAlias:
|
||||||
assert client is not None
|
assert client is not None
|
||||||
assert "beans.local" in str(client.base_url)
|
assert "beans.local" in str(client.base_url)
|
||||||
|
|
||||||
|
def test_main_resolves_github_copilot_alias(self, tmp_path):
|
||||||
|
_write_config(tmp_path, {
|
||||||
|
"model": {"default": "gpt-5.4", "provider": "github-copilot"},
|
||||||
|
})
|
||||||
|
with (
|
||||||
|
patch("hermes_cli.auth.resolve_api_key_provider_credentials", return_value={
|
||||||
|
"api_key": "ghu_test_token",
|
||||||
|
"base_url": "https://api.githubcopilot.com",
|
||||||
|
}),
|
||||||
|
patch("agent.auxiliary_client.OpenAI") as mock_openai,
|
||||||
|
):
|
||||||
|
mock_openai.return_value = MagicMock()
|
||||||
|
from agent.auxiliary_client import resolve_provider_client
|
||||||
|
|
||||||
|
client, model = resolve_provider_client("main", "gpt-5.4")
|
||||||
|
|
||||||
|
assert client is not None
|
||||||
|
assert model == "gpt-5.4"
|
||||||
|
assert mock_openai.called
|
||||||
|
|
||||||
|
|
||||||
class TestResolveProviderClientNamedCustom:
|
class TestResolveProviderClientNamedCustom:
|
||||||
"""resolve_provider_client should resolve named custom providers directly."""
|
"""resolve_provider_client should resolve named custom providers directly."""
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue