{"repo":"NousResearch/hermes-agent","public_id":"17171","display_label":"Dot-to-hyphen normalization scoped to Claude models only","summary":"A fix to restrict dot-to-hyphen character normalization in the Anthropic adapter to Claude-shaped model IDs, preventing incorrect mangling of non-Claude model names like OpenAI Codex identifiers.","subsystem":null,"counts":{"members":4,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":1,"attempt_prs":2},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":17454,"merged_at":"2026-04-29T13:34:58+00:00"},"resolution":{"state":"resolved","by":"pr-17454"},"freshness":{"state":"verified","last_verified_at":"2026-04-29T13:34:58+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.5},"fix_edges":[{"issue_number":13061,"pr_number":17454,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-04-29T13:34:58+00:00"},{"issue_number":15619,"pr_number":17454,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-04-29T13:34:58+00:00"},{"issue_number":17171,"pr_number":17454,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-04-29T13:34:58+00:00"}],"members":[{"kind":"issue","number":17171,"title":"openai-codex fallback sends 'gpt-5-4' instead of 'gpt-5.4' to Codex backend, returning HTTP 404","url":null,"state":"closed"},{"kind":"pr","number":17282,"title":"fix(anthropic_adapter): only mangle dots in Claude-shaped model IDs (#17171)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"7141cda967c489d1fec0e17740222db0e6ac6331","number":0},{"kind":"pr","value":"#17282","number":17282},{"kind":"pr","value":"#17171","number":17171},{"kind":"pr","value":"#16417","number":16417},{"kind":"pr","value":"#13061","number":13061},{"kind":"pr","value":"#7421","number":7421}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":17290,"title":"fix: narrow Anthropic adapter dot-mangling to Claude models only (#17171)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#17454","number":17454}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":17454,"title":"fix(anthropic): narrow dot→hyphen normalization to Claude models only (#17171)","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["agent/anthropic_adapter.py"],"fix_hunks":[{"file":"agent/anthropic_adapter.py","hunks":["@@ -1076,9 +1076,12 @@ def normalize_model_name(model: str, preserve_dots: bool = False) -> str:\n         # These must not be converted to hyphens.  See issue #12295.\n         if _is_bedrock_model_id(model):\n             return model\n-        # OpenRouter uses dots for version separators (claude-opus-4.6),\n-        # Anthropic uses hyphens (claude-opus-4-6). Convert dots to hyphens.\n-        model = model.replace(\".\", \"-\")\n+        # Only convert dots to hyphens for Anthropic/Claude models.\n+        # Non-Anthropic models (gpt-5.4, gemini-2.5, etc.) use dots\n+        # as part of their canonical names.  See issue #17171.\n+        _lower = model.lower()\n+        if _lower.startswith(\"claude-\") or _lower.startswith(\"anthropic/\"):\n+            model = model.replace(\".\", \"-\")\n     return model\n \n \n"]}]}],"trust":{"default_tier":"verified","includes_suggested":false}}