mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-18 04:41:56 +00:00
feat(nvidia): add NIM billing origin header
This commit is contained in:
parent
4e89c53082
commit
13c3d4b4ef
5 changed files with 162 additions and 6 deletions
|
|
@ -2415,10 +2415,51 @@ def _clean_env(monkeypatch):
|
|||
"""Strip provider env vars so each test starts clean."""
|
||||
for key in (
|
||||
"OPENROUTER_API_KEY", "OPENAI_BASE_URL", "OPENAI_API_KEY",
|
||||
"NVIDIA_API_KEY", "NVIDIA_BASE_URL",
|
||||
):
|
||||
monkeypatch.delenv(key, raising=False)
|
||||
|
||||
|
||||
class TestNvidiaBillingHeaders:
|
||||
"""NVIDIA NIM billing-origin headers are scoped to NVIDIA cloud."""
|
||||
|
||||
def test_resolve_provider_client_cloud_adds_billing_origin_header(self, monkeypatch):
|
||||
monkeypatch.setenv("NVIDIA_API_KEY", "nvidia-key")
|
||||
monkeypatch.delenv("NVIDIA_BASE_URL", raising=False)
|
||||
mock_openai = MagicMock()
|
||||
mock_openai.return_value = MagicMock(name="nvidia-client")
|
||||
|
||||
with patch("agent.auxiliary_client.OpenAI", mock_openai):
|
||||
client, model = resolve_provider_client(
|
||||
provider="nvidia",
|
||||
model="nvidia/test-model",
|
||||
)
|
||||
|
||||
assert client is not None
|
||||
assert model == "nvidia/test-model"
|
||||
call_kwargs = mock_openai.call_args[1]
|
||||
headers = call_kwargs["default_headers"]
|
||||
assert headers["X-BILLING-INVOKE-ORIGIN"] == "HermesAgent"
|
||||
|
||||
def test_resolve_provider_client_local_nim_skips_billing_origin_header(self, monkeypatch):
|
||||
monkeypatch.setenv("NVIDIA_API_KEY", "nvidia-key")
|
||||
monkeypatch.setenv("NVIDIA_BASE_URL", "http://localhost:8000/v1")
|
||||
mock_openai = MagicMock()
|
||||
mock_openai.return_value = MagicMock(name="nvidia-local-client")
|
||||
|
||||
with patch("agent.auxiliary_client.OpenAI", mock_openai):
|
||||
client, model = resolve_provider_client(
|
||||
provider="nvidia",
|
||||
model="nvidia/test-model",
|
||||
)
|
||||
|
||||
assert client is not None
|
||||
assert model == "nvidia/test-model"
|
||||
call_kwargs = mock_openai.call_args[1]
|
||||
headers = call_kwargs.get("default_headers", {})
|
||||
assert "X-BILLING-INVOKE-ORIGIN" not in headers
|
||||
|
||||
|
||||
class TestOpenRouterExplicitApiKey:
|
||||
"""Test that explicit_api_key is correctly propagated to _try_openrouter()."""
|
||||
|
||||
|
|
|
|||
|
|
@ -42,6 +42,10 @@ class TestNvidiaProfile:
|
|||
p = get_provider_profile("nvidia")
|
||||
assert "nvidia.com" in p.base_url
|
||||
|
||||
def test_billing_header_not_profile_wide(self):
|
||||
p = get_provider_profile("nvidia")
|
||||
assert p.default_headers == {}
|
||||
|
||||
|
||||
class TestKimiProfile:
|
||||
def test_temperature_omit(self):
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
Mirrors the OpenRouter pattern for the Vercel AI Gateway so that
|
||||
referrerUrl / appName / User-Agent flow into gateway analytics.
|
||||
"""
|
||||
from types import SimpleNamespace
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
from run_agent import AIAgent
|
||||
|
|
@ -65,6 +66,73 @@ def test_routermint_base_url_applies_user_agent_header(mock_openai):
|
|||
assert headers["User-Agent"].startswith("HermesAgent/")
|
||||
|
||||
|
||||
@patch("run_agent.OpenAI")
|
||||
def test_nvidia_cloud_base_url_applies_billing_origin_header(mock_openai):
|
||||
mock_openai.return_value = MagicMock()
|
||||
agent = AIAgent(
|
||||
api_key="test-key",
|
||||
base_url="https://integrate.api.nvidia.com/v1",
|
||||
model="nvidia/test-model",
|
||||
provider="nvidia",
|
||||
quiet_mode=True,
|
||||
skip_context_files=True,
|
||||
skip_memory=True,
|
||||
)
|
||||
|
||||
assert agent._client_kwargs["default_headers"]["X-BILLING-INVOKE-ORIGIN"] == "HermesAgent"
|
||||
|
||||
agent._apply_client_headers_for_base_url("https://integrate.api.nvidia.com/v1")
|
||||
|
||||
headers = agent._client_kwargs["default_headers"]
|
||||
assert headers["X-BILLING-INVOKE-ORIGIN"] == "HermesAgent"
|
||||
|
||||
|
||||
@patch("run_agent.OpenAI")
|
||||
def test_nvidia_local_base_url_does_not_apply_billing_origin_header(mock_openai):
|
||||
mock_openai.return_value = MagicMock()
|
||||
agent = AIAgent(
|
||||
api_key="test-key",
|
||||
base_url="https://integrate.api.nvidia.com/v1",
|
||||
model="nvidia/test-model",
|
||||
provider="nvidia",
|
||||
quiet_mode=True,
|
||||
skip_context_files=True,
|
||||
skip_memory=True,
|
||||
)
|
||||
agent._client_kwargs["default_headers"] = {
|
||||
"X-BILLING-INVOKE-ORIGIN": "HermesAgent",
|
||||
}
|
||||
|
||||
agent._apply_client_headers_for_base_url("http://localhost:8000/v1")
|
||||
|
||||
assert "default_headers" not in agent._client_kwargs
|
||||
|
||||
|
||||
@patch("run_agent.OpenAI")
|
||||
def test_routed_client_preserves_openai_sdk_custom_headers(mock_openai):
|
||||
mock_openai.return_value = MagicMock()
|
||||
routed_client = SimpleNamespace(
|
||||
api_key="test-key",
|
||||
base_url="https://integrate.api.nvidia.com/v1",
|
||||
_custom_headers={"X-BILLING-INVOKE-ORIGIN": "HermesAgent"},
|
||||
)
|
||||
|
||||
with patch("agent.auxiliary_client.resolve_provider_client", return_value=(
|
||||
routed_client,
|
||||
"nvidia/test-model",
|
||||
)):
|
||||
agent = AIAgent(
|
||||
provider="nvidia",
|
||||
model="nvidia/test-model",
|
||||
quiet_mode=True,
|
||||
skip_context_files=True,
|
||||
skip_memory=True,
|
||||
)
|
||||
|
||||
headers = agent._client_kwargs["default_headers"]
|
||||
assert headers["X-BILLING-INVOKE-ORIGIN"] == "HermesAgent"
|
||||
|
||||
|
||||
@patch("run_agent.OpenAI")
|
||||
def test_gmi_base_url_picks_up_profile_user_agent(mock_openai):
|
||||
"""GMI declares User-Agent on its ProviderProfile.default_headers.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue