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
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:
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user