From 226b095a59df0be88e195a90fbd209f236665b7b Mon Sep 17 00:00:00 2001 From: rob-maron <132852777+rob-maron@users.noreply.github.com> Date: Thu, 6 Aug 2026 19:49:57 -0600 Subject: [PATCH] Fireworks user agent (#80422) --- plugins/model-providers/fireworks/__init__.py | 4 ++++ tests/hermes_cli/test_fireworks_provider.py | 8 ++++++++ tests/plugins/model_providers/test_fireworks_profile.py | 4 ++++ 3 files changed, 16 insertions(+) diff --git a/plugins/model-providers/fireworks/__init__.py b/plugins/model-providers/fireworks/__init__.py index 54f9758df9b2f..7245a9c34527d 100644 --- a/plugins/model-providers/fireworks/__init__.py +++ b/plugins/model-providers/fireworks/__init__.py @@ -9,6 +9,7 @@ Model IDs here track the canonical Fireworks catalog (fw-ai/fireconnect ``setup-cli``). """ +from hermes_cli import __version__ as _HERMES_VERSION from providers import register_provider from providers.base import ProviderProfile @@ -22,6 +23,9 @@ fireworks = ProviderProfile( env_vars=("FIREWORKS_API_KEY",), base_url="https://api.fireworks.ai/inference/v1", auth_type="api_key", + # Identifies the client, replacing the OpenAI SDK's own User-Agent. This is + # not partner attribution — HTTP-Referer/X-Title stay off (#61182). + default_headers={"User-Agent": f"HermesAgent/{_HERMES_VERSION}"}, # Auxiliary model for cheap tasks (compaction, title generation, vision). # A standard pay-as-you-go catalog ``/models/`` ID. default_aux_model="accounts/fireworks/models/glm-5p2", diff --git a/tests/hermes_cli/test_fireworks_provider.py b/tests/hermes_cli/test_fireworks_provider.py index f4f56d4a30b6f..12bca5d2b5b71 100644 --- a/tests/hermes_cli/test_fireworks_provider.py +++ b/tests/hermes_cli/test_fireworks_provider.py @@ -164,6 +164,14 @@ class TestFireworksAuxiliary: assert "X-Title" not in headers assert kwargs["base_url"] == "https://api.fireworks.ai/inference/v1" + def test_client_sends_hermes_user_agent(self, monkeypatch): + """The profile's User-Agent survives the generic default_headers + fallback and reaches OpenAI client construction.""" + monkeypatch.setenv("FIREWORKS_API_KEY", "fw_test_key") + _client, _model, kwargs = self._resolve("fireworks") + headers = kwargs.get("default_headers", {}) + assert headers["User-Agent"].startswith("HermesAgent/") + class TestFireworksModelMetadata: def test_url_infers_fireworks(self): diff --git a/tests/plugins/model_providers/test_fireworks_profile.py b/tests/plugins/model_providers/test_fireworks_profile.py index 0a04c7d97f9fa..aa0f9af1b4824 100644 --- a/tests/plugins/model_providers/test_fireworks_profile.py +++ b/tests/plugins/model_providers/test_fireworks_profile.py @@ -44,6 +44,10 @@ class TestFireworksHeaders: assert "HTTP-Referer" not in fireworks_profile.default_headers assert "X-Title" not in fireworks_profile.default_headers + def test_user_agent_identifies_hermes(self, fireworks_profile): + # Prefix, not the full string — the version moves every release. + assert fireworks_profile.default_headers["User-Agent"].startswith("HermesAgent/") + class TestFireworksAliases: @pytest.mark.parametrize("alias", ["fireworks-ai", "fw"])