Files
hermes-agent/acp_adapter/auth.py
T
Teknium b39948106a simplify(compat): acp_adapter — drop 1 re-export, re-remove 5 shim-only names, repoint 4 tests
server: drop ACP_MAX_MODELS_PER_PROVIDER re-export (test -> model_catalog).
Re-removed from 96c104c903: SessionManager.remove_session/cleanup (+ now-orphaned _clear_task_cwd/_delete_persisted)
and their 4 tests; auth.has_provider (tests assert detect_provider() directly);
edit_approval.clear_/get_edit_approval_requester (test teardown -> set_edit_approval_requester(None)).
2026-09-03 13:04:17 -07:00

52 lines
2.2 KiB
Python

"""ACP auth helpers — detect and advertise Hermes authentication methods."""
from __future__ import annotations
from typing import Any, Optional
TERMINAL_SETUP_AUTH_METHOD_ID = "hermes-setup"
def detect_provider() -> Optional[str]:
"""Resolve the active Hermes runtime provider, or None if unavailable.
A callable ``api_key`` (Azure Foundry Entra ID bearer-token provider, see
:mod:`agent.azure_identity_adapter`) counts as a valid credential; otherwise
Entra-configured Foundry deployments would default to ``"openrouter"`` and
the ACP auth handshake would reject the legitimate provider."""
try:
from hermes_cli.runtime_provider import resolve_runtime_provider
runtime = resolve_runtime_provider()
api_key, provider = runtime.get("api_key"), runtime.get("provider")
if isinstance(provider, str) and provider.strip() and (
(isinstance(api_key, str) and api_key.strip()) or callable(api_key)):
return provider.strip().lower()
except Exception:
pass
return None
def build_auth_methods() -> list[Any]:
"""Return registry-compatible ACP auth methods for Hermes.
The ACP registry requires at least one usable auth method in the initial
handshake. A fresh Zed install may have no Hermes credentials yet, so the
terminal setup method is always advertised; when credentials resolve, the
provider is also advertised as the default agent-managed runtime method."""
from acp.schema import AuthMethodAgent, TerminalAuthMethod
methods: list[Any] = []
provider = detect_provider()
if provider:
methods.append(AuthMethodAgent(
id=provider, name=f"{provider} runtime credentials",
description=f"Authenticate Hermes using the currently configured {provider} runtime credentials.",
))
methods.append(TerminalAuthMethod(
id=TERMINAL_SETUP_AUTH_METHOD_ID, name="Configure Hermes provider", type="terminal", args=["--setup"],
description=("Open Hermes' interactive model/provider setup in a terminal. "
"Use this when Hermes has not been configured on this machine yet."),
))
return methods