diff --git a/agent/auxiliary_client.py b/agent/auxiliary_client.py index 3546e6bdb8..b8229bb5e2 100644 --- a/agent/auxiliary_client.py +++ b/agent/auxiliary_client.py @@ -28,6 +28,13 @@ from hermes_constants import OPENROUTER_BASE_URL logger = logging.getLogger(__name__) +# OpenRouter app attribution headers +_OR_HEADERS = { + "HTTP-Referer": "https://github.com/NousResearch/hermes-agent", + "X-OpenRouter-Title": "Hermes Agent", + "X-OpenRouter-Categories": "cli-agent", +} + # Default auxiliary models per provider _OPENROUTER_MODEL = "google/gemini-3-flash-preview" _NOUS_MODEL = "gemini-3-flash" @@ -78,7 +85,8 @@ def get_text_auxiliary_client() -> Tuple[Optional[OpenAI], Optional[str]]: or_key = os.getenv("OPENROUTER_API_KEY") if or_key: logger.debug("Auxiliary text client: OpenRouter") - return OpenAI(api_key=or_key, base_url=OPENROUTER_BASE_URL), _OPENROUTER_MODEL + return OpenAI(api_key=or_key, base_url=OPENROUTER_BASE_URL, + default_headers=_OR_HEADERS), _OPENROUTER_MODEL # 2. Nous Portal nous = _read_nous_auth() @@ -112,7 +120,8 @@ def get_vision_auxiliary_client() -> Tuple[Optional[OpenAI], Optional[str]]: or_key = os.getenv("OPENROUTER_API_KEY") if or_key: logger.debug("Auxiliary vision client: OpenRouter") - return OpenAI(api_key=or_key, base_url=OPENROUTER_BASE_URL), _OPENROUTER_MODEL + return OpenAI(api_key=or_key, base_url=OPENROUTER_BASE_URL, + default_headers=_OR_HEADERS), _OPENROUTER_MODEL # 2. Nous Portal nous = _read_nous_auth() diff --git a/run_agent.py b/run_agent.py index 0c73e44d56..b96879c8b1 100644 --- a/run_agent.py +++ b/run_agent.py @@ -270,6 +270,15 @@ class AIAgent: # Primary: OPENROUTER_API_KEY, fallback to direct provider keys client_kwargs["api_key"] = os.getenv("OPENROUTER_API_KEY", "") + # OpenRouter app attribution — shows hermes-agent in rankings/analytics + effective_base = client_kwargs.get("base_url", "") + if "openrouter" in effective_base.lower(): + client_kwargs["default_headers"] = { + "HTTP-Referer": "https://github.com/NousResearch/hermes-agent", + "X-OpenRouter-Title": "Hermes Agent", + "X-OpenRouter-Categories": "cli-agent", + } + self._client_kwargs = client_kwargs # stored for rebuilding after interrupt try: self.client = OpenAI(**client_kwargs) diff --git a/tools/session_search_tool.py b/tools/session_search_tool.py index 369a5901b7..179d485c09 100644 --- a/tools/session_search_tool.py +++ b/tools/session_search_tool.py @@ -31,10 +31,17 @@ from agent.auxiliary_client import get_text_auxiliary_client _aux_client, _SUMMARIZER_MODEL = get_text_auxiliary_client() _async_aux_client: AsyncOpenAI | None = None if _aux_client is not None: - _async_aux_client = AsyncOpenAI( - api_key=_aux_client.api_key, - base_url=str(_aux_client.base_url), - ) + _async_kwargs = { + "api_key": _aux_client.api_key, + "base_url": str(_aux_client.base_url), + } + if "openrouter" in str(_aux_client.base_url).lower(): + _async_kwargs["default_headers"] = { + "HTTP-Referer": "https://github.com/NousResearch/hermes-agent", + "X-OpenRouter-Title": "Hermes Agent", + "X-OpenRouter-Categories": "cli-agent", + } + _async_aux_client = AsyncOpenAI(**_async_kwargs) MAX_SESSION_CHARS = 100_000 MAX_SUMMARY_TOKENS = 2000 diff --git a/tools/vision_tools.py b/tools/vision_tools.py index 38d168f08d..4b88724ab3 100644 --- a/tools/vision_tools.py +++ b/tools/vision_tools.py @@ -46,10 +46,17 @@ logger = logging.getLogger(__name__) _aux_sync_client, DEFAULT_VISION_MODEL = get_vision_auxiliary_client() _aux_async_client: AsyncOpenAI | None = None if _aux_sync_client is not None: - _aux_async_client = AsyncOpenAI( - api_key=_aux_sync_client.api_key, - base_url=str(_aux_sync_client.base_url), - ) + _async_kwargs = { + "api_key": _aux_sync_client.api_key, + "base_url": str(_aux_sync_client.base_url), + } + if "openrouter" in str(_aux_sync_client.base_url).lower(): + _async_kwargs["default_headers"] = { + "HTTP-Referer": "https://github.com/NousResearch/hermes-agent", + "X-OpenRouter-Title": "Hermes Agent", + "X-OpenRouter-Categories": "cli-agent", + } + _aux_async_client = AsyncOpenAI(**_async_kwargs) _debug = DebugSession("vision_tools", env_var="VISION_TOOLS_DEBUG") diff --git a/tools/web_tools.py b/tools/web_tools.py index 43a7da55a0..8610e38c6f 100644 --- a/tools/web_tools.py +++ b/tools/web_tools.py @@ -71,10 +71,17 @@ DEFAULT_MIN_LENGTH_FOR_SUMMARIZATION = 5000 _aux_sync_client, DEFAULT_SUMMARIZER_MODEL = get_text_auxiliary_client() _aux_async_client: AsyncOpenAI | None = None if _aux_sync_client is not None: - _aux_async_client = AsyncOpenAI( - api_key=_aux_sync_client.api_key, - base_url=str(_aux_sync_client.base_url), - ) + _async_kwargs = { + "api_key": _aux_sync_client.api_key, + "base_url": str(_aux_sync_client.base_url), + } + if "openrouter" in str(_aux_sync_client.base_url).lower(): + _async_kwargs["default_headers"] = { + "HTTP-Referer": "https://github.com/NousResearch/hermes-agent", + "X-OpenRouter-Title": "Hermes Agent", + "X-OpenRouter-Categories": "cli-agent", + } + _aux_async_client = AsyncOpenAI(**_async_kwargs) _debug = DebugSession("web_tools", env_var="WEB_TOOLS_DEBUG")