From 3ecc3b50e0d4f064c0f1fd9606918871408c0114 Mon Sep 17 00:00:00 2001 From: Abir Abbas Date: Fri, 13 Mar 2026 18:52:41 -0400 Subject: [PATCH] fix: resolve .ai() fields with OpenRouter tier map regardless of provider intake_gate and coverage_gate use .ai() (OpenRouter), not .harness(), so they need OpenRouter model IDs even when provider is claude-code. Split tier resolution so .ai() fields always use OpenRouter defaults while .harness() fields use the provider-aware map. Co-Authored-By: Claude Opus 4.6 --- src/pr_af/config.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/pr_af/config.py b/src/pr_af/config.py index f46e018..5eaaac8 100644 --- a/src/pr_af/config.py +++ b/src/pr_af/config.py @@ -9,7 +9,7 @@ from __future__ import annotations import os -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, ClassVar from pydantic import BaseModel, Field @@ -122,12 +122,18 @@ class ModelConfig(BaseModel): coverage_gate: str = "budget" # Simple completeness check dedup_gate: str = "budget" # Near-duplicate detection + # Fields that use .ai() (OpenRouter) instead of .harness() (provider). + # These always resolve with the OpenRouter tier map regardless of provider. + _AI_FIELDS: ClassVar[set[str]] = {"intake_gate", "coverage_gate"} + def resolve(self, provider: str = "opencode") -> ModelConfig: """Return a copy with all tier names resolved to actual model IDs.""" - tier_map = _default_tier_map(provider) + harness_map = _default_tier_map(provider) + ai_map = _default_tier_map("opencode") # .ai() always uses OpenRouter data = {} for field_name in self.model_fields: val = getattr(self, field_name) + tier_map = ai_map if field_name in self._AI_FIELDS else harness_map data[field_name] = resolve_model_tier(val, tier_map) return ModelConfig(**data)