{"repo":"NousResearch/hermes-agent","public_id":"2613","display_label":"Honcho local/self-hosted baseUrl and API key config fixes","summary":"These issues and fixes all concern Honcho failing to correctly read, honor, or route through a configured baseUrl for local or self-hosted instances, often falling back to the production cloud or requiring an API key unnecessarily. The work spans configuration resolution, setup wizards, CLI display, and per-profile client isolation.","subsystem":"agent","counts":{"members":15,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":4,"merged_prs":2,"attempt_prs":9},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":3644},"resolution":{"state":"partially_resolved","by":"pr-85452"},"freshness":{"state":"verified","last_verified_at":"2026-08-13T18:13:16+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_PARTIAL","link_density":0.11504761904761904},"fix_edges":[{"issue_number":3555,"pr_number":3644,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":35209,"pr_number":85452,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":37436,"pr_number":85452,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":43800,"pr_number":85452,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":69123,"pr_number":85452,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":74065,"pr_number":85452,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false}],"members":[{"kind":"issue","number":2613,"title":"[Bug]: Local Honcho \"base_url\" instead of api key does not work","url":null,"state":"closed"},{"kind":"issue","number":3555,"title":"[Bug]: Invalid Honcho API key from  local host???","url":null,"state":"closed"},{"kind":"issue","number":4269,"title":"[Bug]: Honcho session link for locally hosted honcho incorrectly links to public honcho server","url":null,"state":"closed"},{"kind":"issue","number":43800,"title":"[Bug]: Honcho plugin ignores endpoint.baseUrl in ~/.honcho/config.json, silently routes to production cloud","url":null,"state":"closed"},{"kind":"pr","number":2619,"title":"fix(honcho): support base_url for local instances in setup and identity commands","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#13439","number":13439}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":2645,"title":"fix(honcho): support local baseUrl-only configuration","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#9884","number":9884}],"category":"superseded_by_pr","implication":"superseded"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":3560,"title":"fix(honcho): bypass API key validation for local servers","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#3644","number":3644},{"kind":"pr","value":"#3482","number":3482},{"kind":"pr","value":"#3570","number":3570}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":3570,"title":"fix(honcho): use placeholder API key for local instances that don't require auth","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#3644","number":3644},{"kind":"pr","value":"#3482","number":3482},{"kind":"pr","value":"#3560","number":3560}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":3644,"title":"fix(honcho): allow self-hosted local instances without API key","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["cli.py","gateway/run.py","hermes_cli/doctor.py","honcho_integration/cli.py","honcho_integration/client.py","run_agent.py"],"fix_hunks":[{"file":"cli.py","hunks":["@@ -6089,7 +6089,7 @@ def run(self):\n             from honcho_integration.client import HonchoClientConfig\n             from agent.display import honcho_session_line, write_tty\n             hcfg = HonchoClientConfig.from_global_config()\n-            if hcfg.enabled and hcfg.api_key and hcfg.explicitly_configured:\n+            if hcfg.enabled and (hcfg.api_key or hcfg.base_url) and hcfg.explicitly_configured:\n                 sname = hcfg.resolve_session_name(session_id=self.session_id)\n                 if sname:\n                     write_tty(honcho_session_line(hcfg.workspace_id, sname) + \"\\n\")"]},{"file":"gateway/run.py","hunks":["@@ -432,7 +432,7 @@ def _get_or_create_gateway_honcho(self, session_key: str):\n             from honcho_integration.session import HonchoSessionManager\n \n             hcfg = HonchoClientConfig.from_global_config()\n-            if not hcfg.enabled or not hcfg.api_key:\n+            if not hcfg.enabled or not (hcfg.api_key or hcfg.base_url):\n                 return None, hcfg\n \n             client = get_honcho_client(hcfg)"]},{"file":"hermes_cli/doctor.py","hunks":["@@ -56,7 +56,7 @@ def _honcho_is_configured_for_doctor() -> bool:\n         from honcho_integration.client import HonchoClientConfig\n \n         cfg = HonchoClientConfig.from_global_config()\n-        return bool(cfg.enabled and cfg.api_key)\n+        return bool(cfg.enabled and (cfg.api_key or cfg.base_url))\n     except Exception:\n         return False\n ","@@ -708,8 +708,8 @@ def run_doctor(args):\n             check_warn(\"Honcho config not found\", \"run: hermes honcho setup\")\n         elif not hcfg.enabled:\n             check_info(f\"Honcho disabled (set enabled: true in {_honcho_cfg_path} to activate)\")\n-        elif not hcfg.api_key:\n-            check_fail(\"Honcho API key not set\", \"run: hermes honcho setup\")\n+        elif not (hcfg.api_key or hcfg.base_url):\n+            check_fail(\"Honcho API key or base URL not set\", \"run: hermes honcho setup\")\n             issues.append(\"No Honcho API key — run 'hermes honcho setup'\")\n         else:\n             from honcho_integration.client import get_honcho_client, reset_honcho_client"]},{"file":"honcho_integration/cli.py","hunks":["@@ -270,7 +270,7 @@ def cmd_status(args) -> None:\n             print(f\"    {peer}: {mode}\")\n     print(f\"  Write freq:     {hcfg.write_frequency}\")\n \n-    if hcfg.enabled and hcfg.api_key:\n+    if hcfg.enabled and (hcfg.api_key or hcfg.base_url):\n         print(\"\\n  Connection... \", end=\"\", flush=True)\n         try:\n             get_honcho_client(hcfg)","@@ -278,7 +278,7 @@ def cmd_status(args) -> None:\n         except Exception as e:\n             print(f\"FAILED ({e})\\n\")\n     else:\n-        reason = \"disabled\" if not hcfg.enabled else \"no API key\"\n+        reason = \"disabled\" if not hcfg.enabled else \"no API key or base URL\"\n         print(f\"\\n  Not connected ({reason})\\n\")\n \n "]},{"file":"honcho_integration/client.py","hunks":["@@ -417,9 +417,18 @@ def get_honcho_client(config: HonchoClientConfig | None = None) -> Honcho:\n     else:\n         logger.info(\"Initializing Honcho client (host: %s, workspace: %s)\", config.host, config.workspace_id)\n \n+    # Local Honcho instances don't require an API key, but the SDK\n+    # expects a non-empty string.  Use a placeholder for local URLs.\n+    _is_local = resolved_base_url and (\n+        \"localhost\" in resolved_base_url\n+        or \"127.0.0.1\" in resolved_base_url\n+        or \"::1\" in resolved_base_url\n+    )\n+    effective_api_key = [redacted:secret-assignment] or (\"local\" if _is_local else None)\n+\n     kwargs: dict = {\n         \"workspace_id\": config.workspace_id,\n-        \"api_key\": config.api_key,\n+        \"api_key\": effective_api_key,\n         \"environment\": config.environment,\n     }\n     if resolved_base_url:"]},{"file":"run_agent.py","hunks":["@@ -1084,8 +1084,8 @@ def __init__(\n                     else:\n                         if not hcfg.enabled:\n                             logger.debug(\"Honcho disabled in global config\")\n-                        elif not hcfg.api_key:\n-                            logger.debug(\"Honcho enabled but no API key configured\")\n+                        elif not (hcfg.api_key or hcfg.base_url):\n+                            logger.debug(\"Honcho enabled but no API key or base URL configured\")\n                         else:\n                             logger.debug(\"Honcho enabled but missing API key or disabled in config\")\n             except Exception as e:","@@ -2292,8 +2292,14 @@ def is_interrupted(self) -> bool:\n     # ── Honcho integration helpers ──\n \n     def _honcho_should_activate(self, hcfg) -> bool:\n-        \"\"\"Return True when remote Honcho should be active.\"\"\"\n-        if not hcfg or not hcfg.enabled or not hcfg.api_key:\n+        \"\"\"Return True when Honcho should be active.\n+\n+        Self-hosted Honcho may be configured with a base_url and no API key,\n+        so activation should accept either credential style.\n+        \"\"\"\n+        if not hcfg or not hcfg.enabled:\n+            return False\n+        if not (hcfg.api_key or hcfg.base_url):\n             return False\n         return True\n \n"]}]},{"kind":"pr","number":5002,"title":"fix: Honcho base_url host-block resolution + OpenViking is_available + doctor check","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#5078","number":5078}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":13439,"title":"fix(honcho): support base_url-only config in cmd_identity for local instances","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"36d6b643f6dd6ece5b6a1eada243ae4cb7d26551","number":0}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":14489,"title":"fix(honcho): honor host-specific baseUrl","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"2f80ae0a6a","number":0},{"kind":"pr","value":"#131301","number":131301}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":43803,"title":"fix(memory): read endpoint.baseUrl from Honcho config; accept HONCHO_URL","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"ad588542e","number":0}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":83508,"title":"fix(honcho): resolve baseUrl/apiKey correctly for self-hosted and multi-profile setups","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#85452","number":85452}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":85452,"title":"fix(honcho): isolate clients per profile, resolve baseUrl/apiKey, enforce saveMessages containment","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["agent/memory_manager.py","contributors/emails/[redacted:email]","contributors/emails/[redacted:email]","contributors/emails/[redacted:email]","contributors/emails/[redacted:email]","contributors/emails/[redacted:email]","contributors/emails/[redacted:email]","contributors/emails/[redacted:email]","plugins/memory/honcho/README.md","plugins/memory/honcho/__init__.py","plugins/memory/honcho/cli.py","plugins/memory/honcho/client.py","plugins/memory/honcho/session.py","tests/honcho_plugin/test_async_memory.py","tests/honcho_plugin/test_client.py","tests/honcho_plugin/test_client_identity_isolation.py","tests/honcho_plugin/test_save_messages.py","tests/plugins/memory/test_honcho_cli_peers.py","tests/run_agent/test_primary_runtime_restore.py","tests/test_honcho_client_config.py","tests/test_honcho_startup_fail_open.py","tui_gateway/methods_profiles.py"]}],"trust":{"default_tier":"verified","includes_suggested":false}}