AgentEvalTool/backend/agenteval/web/routers/openclaw_cron_pool.py
sinohqb 2ff023a65b feat(intelligent-eval): implement cron pool management (ticket 02)
- Add OpenClawClient wrapping CLI commands (create/delete/list crons)
- Implement pool initialization, scale up/down, auto-scaling logic
- Implement cron state sync and stuck cron detection
- Add pool status and manual scaling APIs
- Add 13 unit tests and 5 integration tests

Pool automatically scales between 5-20 crons based on load.
All 778 tests passing.
2026-08-12 09:47:04 +08:00

66 lines
2.3 KiB
Python

"""API routes for OpenClaw cron pool management."""
from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel, Field
from sqlmodel import Session
from agenteval.intelligent_eval import cron_pool
from agenteval.intelligent_eval.openclaw_client import OpenClawClient
from agenteval.web.deps import get_db
router = APIRouter()
class ScaleRequest(BaseModel):
target_size: int = Field(ge=1, le=50)
@router.get("/cron-pool")
async def get_cron_pool_status(session: Session = Depends(get_db)) -> dict:
"""Get cron pool status."""
status = cron_pool.get_pool_status(session)
return {"pool": status}
@router.post("/cron-pool/scale")
async def scale_cron_pool(request: ScaleRequest, session: Session = Depends(get_db)) -> dict:
"""Manually scale cron pool to target size."""
current_status = cron_pool.get_pool_status(session)
current_size = current_status["total"]
target_size = request.target_size
client = OpenClawClient()
if target_size > current_size:
# Scale up
count = target_size - current_size
created = await cron_pool.scale_up(count, session, client)
return {"success": True, "scaled_up": created, "current_size": current_size + created}
elif target_size < current_size:
# Scale down
count = current_size - target_size
deleted = await cron_pool.scale_down(count, session, client)
return {"success": True, "scaled_down": deleted, "current_size": current_size - deleted}
else:
return {"success": True, "current_size": current_size, "message": "already at target size"}
@router.post("/cron-pool/sync")
async def sync_cron_states(session: Session = Depends(get_db)) -> dict:
"""Sync cron states from OpenClaw to platform DB."""
client = OpenClawClient()
synced = await cron_pool.sync_cron_states(session, client)
return {"success": True, "synced": synced}
@router.post("/cron-pool/auto-scale")
async def auto_scale_pool(session: Session = Depends(get_db)) -> dict:
"""Trigger auto-scaling based on current load."""
client = OpenClawClient()
scaled_up, scaled_down = await cron_pool.auto_scale(session, client)
return {
"success": True,
"scaled_up": scaled_up,
"scaled_down": scaled_down,
}