feat(ai_router): feedback_from_aider_events read-only hook (Phase 24 A8)

This commit is contained in:
Your Name
2026-04-20 08:47:02 +08:00
parent df72da69e2
commit 40771cda6d
2 changed files with 137 additions and 0 deletions

View File

@@ -655,6 +655,50 @@ class AIRouter:
},
]
async def feedback_from_aider_events(
self,
repo: str | None = None,
days: int = 7,
) -> dict[str, float]:
"""從 aider_events 聚合近 N 日 success rate per model。
Phase 24 ADR-052 延伸AI 自主化 feedback loop。
目前為 read-only未接入 route() 決策),等 USE_AIDER_FEEDBACK flag
+ 7 天灰度驗證後才會調整 provider 權重。
Args:
repo: 若給定,只聚合該 repo 的 session否則所有 repo。
days: 時間窗口(預設 7 天)。
Returns:
{model_name: success_rate_float} e.g. {"elephant-alpha": 0.85, "gemini-pro": 0.92}
空 dict 代表無資料或查詢失敗caller 應降級為忽略)。
"""
try:
from src.db.base import get_session_factory
from src.repositories.aider_event_repository import AiderEventRepository
except ImportError:
return {}
try:
sf = get_session_factory()
async with sf() as sess:
repo_obj = AiderEventRepository(sess)
stats = await repo_obj.model_stats_since(days=days)
except Exception:
logger.debug("ai_router_feedback_aggregation_failed")
return {}
out: dict[str, float] = {}
for row in stats:
if repo and row.get("repo") != repo:
continue
model = row.get("model")
if not model:
continue
out[model] = float(row.get("success_rate") or 0)
return out
# =============================================================================
# Phase 24 ADR-052: AI Provider Registry + Execution Layer