fix(agents): reuse cached AI alert card readback
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Successful in 1m7s
CD Pipeline / post-deploy-checks (push) Has been cancelled
CD Pipeline / build-and-deploy (push) Has been cancelled

This commit is contained in:
ogt
2026-07-09 22:56:07 +08:00
parent d6f65e0935
commit c22530205e
3 changed files with 149 additions and 17 deletions

View File

@@ -160,6 +160,7 @@ class AiAlertCardDeliverySummary(BaseModel):
source_unavailable_reason: str | None = None
source_unavailable_next_action: str = "none"
controlled_repair_queue_present: bool = False
live_refresh_status: str = "ok"
total: int
sent_total: int
failed_total: int

View File

@@ -1362,23 +1362,14 @@ async def list_ai_alert_card_delivery_readback(
"per_page": normalized_per_page,
}
if not refresh:
try:
cached_response = await get_cached_operator_summary_async(
"ai_alert_card_delivery_readback",
cache_key,
ttl_seconds=_AI_ALERT_CARD_CACHE_TTL_SECONDS,
)
except Exception as exc: # pragma: no cover - cache pressure
logger.warning(
"operator_ai_alert_card_delivery_readback_cache_unavailable",
project_id=normalized_project_id,
event_type=normalized_event_type,
lane=normalized_lane,
page=normalized_page,
per_page=normalized_per_page,
error_type=type(exc).__name__,
)
cached_response = None
cached_response = await _get_cached_ai_alert_card_delivery_readback(
cache_key=cache_key,
project_id=normalized_project_id,
event_type=normalized_event_type,
lane=normalized_lane,
page=normalized_page,
per_page=normalized_per_page,
)
if cached_response is not None and "learning_registry" in cached_response:
logger.info(
"operator_ai_alert_card_delivery_readback_cache_hit",
@@ -1536,6 +1527,19 @@ async def list_ai_alert_card_delivery_readback(
per_page=normalized_per_page,
error_type=type(exc).__name__,
)
cached_fallback = await _get_cached_ai_alert_card_delivery_readback(
cache_key=cache_key,
project_id=normalized_project_id,
event_type=normalized_event_type,
lane=normalized_lane,
page=normalized_page,
per_page=normalized_per_page,
)
if cached_fallback is not None and "learning_registry" in cached_fallback:
return _ai_alert_card_delivery_cached_live_timeout_response(
cached_response=cached_fallback,
error_type=type(exc).__name__,
)
return _ai_alert_card_delivery_source_unavailable_response(
project_id=normalized_project_id,
event_type=normalized_event_type or None,
@@ -1604,6 +1608,54 @@ async def list_ai_alert_card_delivery_readback(
return response
async def _get_cached_ai_alert_card_delivery_readback(
*,
cache_key: Mapping[str, Any],
project_id: str,
event_type: str,
lane: str,
page: int,
per_page: int,
) -> dict[str, Any] | None:
try:
return await get_cached_operator_summary_async(
"ai_alert_card_delivery_readback",
cache_key,
ttl_seconds=_AI_ALERT_CARD_CACHE_TTL_SECONDS,
)
except Exception as exc: # pragma: no cover - cache pressure
logger.warning(
"operator_ai_alert_card_delivery_readback_cache_unavailable",
project_id=project_id,
event_type=event_type,
lane=lane,
page=page,
per_page=per_page,
error_type=type(exc).__name__,
)
return None
def _ai_alert_card_delivery_cached_live_timeout_response(
*,
cached_response: Mapping[str, Any],
error_type: str,
) -> dict[str, Any]:
response = dict(cached_response)
summary = dict(_as_dict(response.get("summary")))
summary.update({
"db_read_status": "cached_after_live_timeout",
"source_unavailable_reason": error_type,
"source_unavailable_next_action": (
"retry_live_refresh_keep_cached_learning_registry"
),
"live_refresh_status": "live_refresh_unavailable_serving_cached_readback",
"controlled_repair_queue_present": False,
})
response["summary"] = summary
return response
def _ai_alert_card_delivery_source_unavailable_response(
*,
project_id: str,
@@ -1635,6 +1687,7 @@ def _ai_alert_card_delivery_source_unavailable_response(
"repair_awooop_ai_alert_card_delivery_readback"
),
"controlled_repair_queue_present": True,
"live_refresh_status": "live_refresh_unavailable_no_cached_readback",
"runtime_write_allowed": False,
"learning_writeback_next_action": (
"repair_awooop_ai_alert_card_delivery_readback"