{"repo":"NousResearch/hermes-agent","public_id":"12309","display_label":"User-defined providers Phase 4 implementation and docs cleanup","summary":"The three members all refer to 'Phase 4' of user-defined providers: two titles concern implementing it (one mentioning resolution, one mentioning cleanup), and one is a docs change removing a stale 'TODO: Phase 4' note from a get_provider docstring. Titles alone do not show the scope or status of any of these changes.","subsystem":null,"counts":{"members":3,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":1,"attempt_prs":1},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":12902,"merged_at":"2026-04-20T08:41:27+00:00"},"resolution":{"state":"resolved","by":"pr-12902"},"freshness":{"state":"stale","last_verified_at":"2026-04-20T08:41:27+00:00","is_stale":true},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.6666666666666666},"fix_edges":[{"issue_number":12309,"pr_number":12902,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-04-20T08:41:27+00:00"}],"members":[{"kind":"issue","number":12309,"title":"Implement Phase 4 resolution for User-Defined Providers","url":null,"state":"closed"},{"kind":"pr","number":12292,"title":"implement user-defined providers (Phase 4) and cleanup","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#12309","number":12309},{"kind":"pr","value":"#12902","number":12902}],"category":"uncategorized","implication":"needs_llm"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":12902,"title":"docs(providers): drop stale 'TODO: Phase 4' from get_provider docstring","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["hermes_cli/providers.py"],"fix_hunks":[{"file":"hermes_cli/providers.py","hunks":["@@ -322,12 +322,16 @@ def normalize_provider(name: str) -> str:\n \n \n def get_provider(name: str) -> Optional[ProviderDef]:\n-    \"\"\"Look up a provider by id or alias, merging all data sources.\n+    \"\"\"Look up a built-in provider by id or alias.\n \n     Resolution order:\n       1. Hermes overlays (for providers not in models.dev: nous, openai-codex, etc.)\n       2. models.dev catalog + Hermes overlay\n-      3. User-defined providers from config (TODO: Phase 4)\n+\n+    User-defined providers from config.yaml (``providers:`` / ``custom_providers:``)\n+    are resolved by :func:`resolve_provider_full`, which layers ``resolve_user_provider``\n+    and ``resolve_custom_provider`` on top of this function. Callers that need\n+    user-config support should use ``resolve_provider_full`` instead.\n \n     Returns a fully-resolved ProviderDef or None.\n     \"\"\"\n"]}]}],"trust":{"default_tier":"verified","includes_suggested":false}}