Files
life-echo/api/app/features/evaluation/phase1_job_timing.py

57 lines
1.6 KiB
Python
Raw Normal View History

"""Playground Phase1 提交时间:供 memoir-phase1-ready 轮询展示服务端等待耗时。"""
from __future__ import annotations
import json
from datetime import datetime, timezone
from typing import Any
from app.core.logging import get_logger
from app.core.redis import redis_service
logger = get_logger(__name__)
TTL_SECONDS = 172800 # 48h覆盖长队列与多次评测下次 submit 会覆盖
_EVAL_PREFIX = "internal_eval:playground_phase1_job:"
def _redis_key(conversation_id: str) -> str:
return f"{_EVAL_PREFIX}{conversation_id}"
async def record_phase1_job_submitted(
conversation_id: str,
*,
celery_task_id: str | None,
segment_count: int,
) -> datetime:
now = datetime.now(timezone.utc)
payload: dict[str, Any] = {
"submitted_at_utc": now.isoformat().replace("+00:00", "Z"),
"celery_task_id": celery_task_id,
"segment_count": segment_count,
}
try:
client = await redis_service.get_client()
await client.setex(
_redis_key(conversation_id),
TTL_SECONDS,
json.dumps(payload, ensure_ascii=False),
)
except Exception as e:
logger.warning("eval phase1 job timing redis write failed: {}", e)
return now
async def load_phase1_job_meta(conversation_id: str) -> dict[str, Any] | None:
try:
client = await redis_service.get_client()
raw = await client.get(_redis_key(conversation_id))
if not raw:
return None
return json.loads(raw)
except Exception as e:
logger.warning("eval phase1 job timing redis read failed: {}", e)
return None