- 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.
66 lines
2.3 KiB
Python
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,
|
|
}
|