mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-02 02:01:47 +00:00
fix: extend hostname-match provider detection across remaining call sites
Aslaaen's fix in the original PR covered _detect_api_mode_for_url and the two openai/xai sites in run_agent.py. This finishes the sweep: the same substring-match false-positive class (e.g. https://api.openai.com.evil/v1, https://proxy/api.openai.com/v1, https://api.anthropic.com.example/v1) existed in eight more call sites, and the hostname helper was duplicated in two modules. - utils: add shared base_url_hostname() (single source of truth). - hermes_cli/runtime_provider, run_agent: drop local duplicates, import from utils. Reuse the cached AIAgent._base_url_hostname attribute everywhere it's already populated. - agent/auxiliary_client: switch codex-wrap auto-detect, max_completion_tokens gate (auxiliary_max_tokens_param), and custom-endpoint max_tokens kwarg selection to hostname equality. - run_agent: native-anthropic check in the Claude-style model branch and in the AIAgent init provider-auto-detect branch. - agent/model_metadata: Anthropic /v1/models context-length lookup. - hermes_cli/providers.determine_api_mode: anthropic / openai URL heuristics for custom/unknown providers (the /anthropic path-suffix convention for third-party gateways is preserved). - tools/delegate_tool: anthropic detection for delegated subagent runtimes. - hermes_cli/setup, hermes_cli/tools_config: setup-wizard vision-endpoint native-OpenAI detection (paired with deduping the repeated check into a single is_native_openai boolean per branch). Tests: - tests/test_base_url_hostname.py covers the helper directly (path-containing-host, host-suffix, trailing dot, port, case). - tests/hermes_cli/test_determine_api_mode_hostname.py adds the same regression class for determine_api_mode, plus a test that the /anthropic third-party gateway convention still wins. Also: add asslaenn5@gmail.com → Aslaaen to scripts/release.py AUTHOR_MAP.
This commit is contained in:
parent
5356797f1b
commit
cecf84daf7
12 changed files with 151 additions and 37 deletions
22
utils.py
22
utils.py
|
|
@ -7,6 +7,7 @@ import stat
|
|||
import tempfile
|
||||
from pathlib import Path
|
||||
from typing import Any, Union
|
||||
from urllib.parse import urlparse
|
||||
|
||||
import yaml
|
||||
|
||||
|
|
@ -194,3 +195,24 @@ def env_int(key: str, default: int = 0) -> int:
|
|||
def env_bool(key: str, default: bool = False) -> bool:
|
||||
"""Read an environment variable as a boolean."""
|
||||
return is_truthy_value(os.getenv(key, ""), default=default)
|
||||
|
||||
|
||||
# ─── URL Parsing Helpers ──────────────────────────────────────────────────────
|
||||
|
||||
|
||||
def base_url_hostname(base_url: str) -> str:
|
||||
"""Return the lowercased hostname for a base URL, or ``""`` if absent.
|
||||
|
||||
Use exact-hostname comparisons against known provider hosts
|
||||
(``api.openai.com``, ``api.x.ai``, ``api.anthropic.com``) instead of
|
||||
substring matches on the raw URL. Substring checks treat attacker- or
|
||||
proxy-controlled paths/hosts like ``https://api.openai.com.example/v1``
|
||||
or ``https://proxy.test/api.openai.com/v1`` as native endpoints, which
|
||||
leads to wrong api_mode / auth routing.
|
||||
"""
|
||||
raw = (base_url or "").strip()
|
||||
if not raw:
|
||||
return ""
|
||||
parsed = urlparse(raw if "://" in raw else f"//{raw}")
|
||||
return (parsed.hostname or "").lower().rstrip(".")
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue