# NousResearch/hermes-agent · TUI agent construction missing provider/credential resolution

## Open now

- Nothing open on GitHub.

A cluster of bug reports and fixes around the TUI's \`_make_agent\` function failing to resolve provider, api_mode, and credentials before constructing AIAgent, causing setup errors or wrong API calls.

## TL;DR

- 5 member(s): 0 open issue(s), 2 closed issue(s), 0 open PR(s), 1 merged PR(s), 2 PR(s) closed without merging.
- A fix was merged to main in PR #11887. Verify it addresses your case.
- **Recommended:** read PR #11887 (and any competing PRs below) before filing. Confirm the merged change covers your symptom.

## Maintainer resolution verdict

- Internal-tracker verdict over this cluster's issue members: `partially_resolved` · deciding PR(s): `pr-11887`. This is distinct from the fix status above. Weigh it yourself.

## How this cluster was grouped

- Link evidence (`STRUCTURAL_PARTIAL`): some members are connected by structural evidence (shared changed files, or a closing/superseded reference); the rest are joined by an automated relevance judgement over their text.
- Members outside that structural core may belong to a different underlying problem.
- Pairwise link density `0.34`: the share of member 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.

## Closed / duplicate issues

- #11884: \[Bug\]: Ink TUI: bare-slug model + provider in config yields HTTP 404 at api.anthropic.com
- #12381: TUI: \`hermes --tui\` shows "Setup Required" for bedrock/anthropic-native configs — \`_make_agent\` drops provider/api_mode

## Prior & competing PRs

- **#11887: fix(tui): resolve runtime provider in _make_agent**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`; implication `superseded`
  - files: `tests/tui_gateway/test_make_agent_provider.py`, `tui_gateway/server.py`
  - fix hunks:
  - `tests/tui_gateway/test_make_agent_provider.py`

    ```diff
    @@ -0,0 +1,48 @@
    +"""Regression test for #11884: _make_agent must resolve runtime provider.
    +
    +Without resolve_runtime_provider(), bare-slug models in config
    +(e.g. ``claude-opus-4-6`` with ``model.provider: anthropic``) leave
    +provider/base_url/api_key empty in AIAgent, causing HTTP 404.
    +"""
    +
    +from unittest.mock import MagicMock, patch
    +
    +
    +def test_make_agent_passes_resolved_provider():
    +    """_make_agent forwards provider/base_url/api_key/api_mode from
    +    resolve_runtime_provider to AIAgent."""
    +
    +    fake_runtime = {
    +        "provider": "anthropic",
    +        "base_url": "https://api.anthropic.com",
    +        "api_key": "sk-test-key",
    +        "api_mode": "anthropic_messages",
    +        "command": None,
    +        "args": None,
    +        "credential_pool": None,
    +    }
    +
    +    fake_cfg = {
    +        "model": {"default": "claude-opus-4-6", "provider": "anthropic"},
    +        "agent": {"system_prompt": "test"},
    +    }
    +
    +    with patch("tui_gateway.server._load_cfg", return_value=fake_cfg), \
    +         patch("tui_gateway.server._get_db", return_value=MagicMock()), \
    +         patch("tui_gateway.server._load_tool_progress_mode", return_value="compact"), \
    +         patch("tui_gateway.server._load_reasoning_config", return_value=None), \
    +         patch("tui_gateway.server._load_service_tier", return_value=None), \
    +         patch("tui_gateway.server._load_enabled_toolsets", return_value=None), \
    +         patch("hermes_cli.runtime_provider.resolve_runtime_provider", return_value=fake_runtime) as mock_resolve, \
    +         patch("run_agent.AIAgent") as mock_agent:
    +
    +        from tui_gateway.server import _make_agent
    +        _make_agent("sid-1", "key-1")
    +
    +        mock_resolve.assert_called_once_with(requested=None)
    +
    +        call_kwargs = mock_agent.call_args
    +        assert call_kwargs.kwargs["provider"] == "anthropic"
    +        assert call_kwargs.kwargs["base_url"] == "https://api.anthropic.com"
    +        assert call_kwargs.kwargs["api_key"] == "sk-test-key"
    +        assert call_kwargs.kwargs["api_mode"] == "anthropic_messages"
    ```
  - `tui_gateway/server.py`

    ```diff
    @@ -1113,13 +1113,22 @@ def _reset_session_agent(sid: str, session: dict) -> dict:
     
     def _make_agent(sid: str, key: str, session_id: str | None = None):
         from run_agent import AIAgent
    +    from hermes_cli.runtime_provider import resolve_runtime_provider
     
         cfg = _load_cfg()
         system_prompt = cfg.get("agent", {}).get("system_prompt", "") or ""
         if not system_prompt:
             system_prompt = _resolve_personality_prompt(cfg)
    +    runtime = resolve_runtime_provider(requested=None)
         return AIAgent(
             model=_resolve_model(),
    +        provider=runtime.get("provider"),
    +        base_url=runtime.get("base_url"),
    +        api_key=[redacted:secret-assignment]"api_key"),
    +        api_mode=runtime.get("api_mode"),
    +        acp_command=runtime.get("command"),
    +        acp_args=runtime.get("args"),
    +        credential_pool=[redacted:secret-assignment]"credential_pool"),
             quiet_mode=True,
             verbose_logging=_load_tool_progress_mode() == "verbose",
             reasoning_config=_load_reasoning_config(),
    ```
- **#11952: fix(tui): call resolve_runtime_provider() before constructing AIAgent**. closed without merge
  - maintainer direction: category `duplicate_of`; implication `duplicate`
- **#13163: fix(tui): pass provider credentials explicitly to AIAgent**. closed without merge
  - maintainer direction: category `superseded_by_pr`; implication `superseded`; refs `#11887`, `#11887`

## Fix status

- Merged to main in PR #11887 (cited above). No release data is tracked. Verify downstream.
- Fix last verified (merged) `2026-04-23`. This confirmation is old and may be out of date (a revert/reopen would not have invalidated it here); re-verify.
