feat(ai_router): feedback_from_aider_events read-only hook (Phase 24 A8)
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user