diff --git a/cli.py b/cli.py index 750a7a14..a5ed551a 100644 --- a/cli.py +++ b/cli.py @@ -6103,7 +6103,7 @@ class HermesCLI: from honcho_integration.client import HonchoClientConfig from agent.display import honcho_session_line, write_tty hcfg = HonchoClientConfig.from_global_config() - if hcfg.enabled and hcfg.api_key and hcfg.explicitly_configured: + if hcfg.enabled and (hcfg.api_key or hcfg.base_url) and hcfg.explicitly_configured: sname = hcfg.resolve_session_name(session_id=self.session_id) if sname: write_tty(honcho_session_line(hcfg.workspace_id, sname) + "\n") diff --git a/gateway/run.py b/gateway/run.py index 1cebf976..1eda6e3c 100644 --- a/gateway/run.py +++ b/gateway/run.py @@ -432,7 +432,7 @@ class GatewayRunner: from honcho_integration.session import HonchoSessionManager hcfg = HonchoClientConfig.from_global_config() - if not hcfg.enabled or not hcfg.api_key: + if not hcfg.enabled or not (hcfg.api_key or hcfg.base_url): return None, hcfg client = get_honcho_client(hcfg) diff --git a/hermes_cli/doctor.py b/hermes_cli/doctor.py index 053f92a2..8facb1c7 100644 --- a/hermes_cli/doctor.py +++ b/hermes_cli/doctor.py @@ -56,7 +56,7 @@ def _honcho_is_configured_for_doctor() -> bool: from honcho_integration.client import HonchoClientConfig cfg = HonchoClientConfig.from_global_config() - return bool(cfg.enabled and cfg.api_key) + return bool(cfg.enabled and (cfg.api_key or cfg.base_url)) except Exception: return False @@ -708,8 +708,8 @@ def run_doctor(args): check_warn("Honcho config not found", "run: hermes honcho setup") elif not hcfg.enabled: check_info(f"Honcho disabled (set enabled: true in {_honcho_cfg_path} to activate)") - elif not hcfg.api_key: - check_fail("Honcho API key not set", "run: hermes honcho setup") + elif not (hcfg.api_key or hcfg.base_url): + check_fail("Honcho API key or base URL not set", "run: hermes honcho setup") issues.append("No Honcho API key — run 'hermes honcho setup'") else: from honcho_integration.client import get_honcho_client, reset_honcho_client diff --git a/honcho_integration/cli.py b/honcho_integration/cli.py index 78a0d4b7..ae09c371 100644 --- a/honcho_integration/cli.py +++ b/honcho_integration/cli.py @@ -270,7 +270,7 @@ def cmd_status(args) -> None: print(f" {peer}: {mode}") print(f" Write freq: {hcfg.write_frequency}") - if hcfg.enabled and hcfg.api_key: + if hcfg.enabled and (hcfg.api_key or hcfg.base_url): print("\n Connection... ", end="", flush=True) try: get_honcho_client(hcfg) @@ -278,7 +278,7 @@ def cmd_status(args) -> None: except Exception as e: print(f"FAILED ({e})\n") else: - reason = "disabled" if not hcfg.enabled else "no API key" + reason = "disabled" if not hcfg.enabled else "no API key or base URL" print(f"\n Not connected ({reason})\n") diff --git a/honcho_integration/client.py b/honcho_integration/client.py index 385974d1..50f7af30 100644 --- a/honcho_integration/client.py +++ b/honcho_integration/client.py @@ -417,9 +417,18 @@ def get_honcho_client(config: HonchoClientConfig | None = None) -> Honcho: else: logger.info("Initializing Honcho client (host: %s, workspace: %s)", config.host, config.workspace_id) + # Local Honcho instances don't require an API key, but the SDK + # expects a non-empty string. Use a placeholder for local URLs. + _is_local = resolved_base_url and ( + "localhost" in resolved_base_url + or "127.0.0.1" in resolved_base_url + or "::1" in resolved_base_url + ) + effective_api_key = config.api_key or ("local" if _is_local else None) + kwargs: dict = { "workspace_id": config.workspace_id, - "api_key": config.api_key, + "api_key": effective_api_key, "environment": config.environment, } if resolved_base_url: diff --git a/run_agent.py b/run_agent.py index 574cde7a..cac9f5ec 100644 --- a/run_agent.py +++ b/run_agent.py @@ -1084,8 +1084,8 @@ class AIAgent: else: if not hcfg.enabled: logger.debug("Honcho disabled in global config") - elif not hcfg.api_key: - logger.debug("Honcho enabled but no API key configured") + elif not (hcfg.api_key or hcfg.base_url): + logger.debug("Honcho enabled but no API key or base URL configured") else: logger.debug("Honcho enabled but missing API key or disabled in config") except Exception as e: @@ -2292,8 +2292,14 @@ class AIAgent: # ── Honcho integration helpers ── def _honcho_should_activate(self, hcfg) -> bool: - """Return True when remote Honcho should be active.""" - if not hcfg or not hcfg.enabled or not hcfg.api_key: + """Return True when Honcho should be active. + + Self-hosted Honcho may be configured with a base_url and no API key, + so activation should accept either credential style. + """ + if not hcfg or not hcfg.enabled: + return False + if not (hcfg.api_key or hcfg.base_url): return False return True