NousResearch/hermes-agent

Honcho API key requirement for local self-hosted instances

Cluster 3555 · agent. Data as of

Nothing open on GitHub. Fix merged in #3644 on 29 Mar 2026. Check it covers your case.

The short answer

0open issues
0open PRs
4items grouped
Known?
Yes. 4 related items grouped here, 1 issue already closed.
Fix event
A fix was merged to main in PR #3644. Check it covers your case. No release data is tracked.
Tracker
The maintainers' tracker marks this unresolved. That is separate from the fix event.
Still open
Nothing open on GitHub.

Members concern Honcho API key handling when connecting to local or self-hosted instances. Three titles propose changes (placeholder key, allowing no key, bypassing validation), and one bug report describes an invalid API key message from a local host.

Open issues0

No open issues.

Open PRs0

No open pull requests.

Fixes on record

Merged to main. A stamp counts the issues a fix is linked to.

  • #3644 fix(honcho): allow self-hosted local instances without API key

    merged to main

    files: cli.py, gateway/run.py, hermes_cli/doctor.py, honcho_integration/cli.py, honcho_integration/client.py, run_agent.py

    Show the diff
    • cli.py
      @@ -6089,7 +6089,7 @@ def run(self):
                   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")
    • gateway/run.py
      @@ -432,7 +432,7 @@ def _get_or_create_gateway_honcho(self, session_key: str):
                   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)
    • 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
    • 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")
       
       
    • 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 = [redacted:secret-assignment] or ("local" if _is_local else None)
      +
           kwargs: dict = {
               "workspace_id": config.workspace_id,
      -        "api_key": [redacted:secret-assignment]
      +        "api_key": [redacted:secret-assignment]
               "environment": config.environment,
           }
           if resolved_base_url:
    • run_agent.py
      @@ -1084,8 +1084,8 @@ def __init__(
                           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 @@ def is_interrupted(self) -> bool:
           # ── 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
       

2 PRs closed without merging

From the close comments: merged via another change 2

  • #3560 fix(honcho): bypass API key validation for local servers · merged via another change → #3644, #3482, #3570
  • #3570 fix(honcho): use placeholder API key for local instances that don't require auth · merged via another change → #3644, #3482, #3560
Closed issues · 1
  • Closed#3555[Bug]: Invalid Honcho API key from local host???
How this cluster was grouped
  • Link evidence (structural links throughout): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
  • Pairwise link density 0.50: the share of item pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. 1.00 means every pair is linked.

Pick up a Lab task

Check whether a fix covers the open issues here, with your own agent. Bring back evidence for maintainers.

Open the Lab

At a glance

Subsystem
agent
Merged PRs
#3644
Closed issues
1
Attempts
2 PRs closed without merging
Fix link checked
29 Mar 2026. This confirmation is old and may be out of date (a revert or reopen would not have invalidated it here); re-verify.

For your agent

The same facts, typed.