- scheduler.py: AsyncIOScheduler with three cron jobs
short daily 03:00 (no LLM, always fast)
mid weekly Sun 03:30 (LLM)
long monthly 1st 04:00 (LLM — off by default)
- config.py: AUTO_DISTILL, AUTO_DISTILL_SHORT/MID/LONG .env flags
- main.py: start/stop scheduler in FastAPI lifespan
- routers/distill.py: GET /distill/status — next run times + config
- requirements.txt: apscheduler>=3.10
- HELP.md: updated planned items, added /distill/status to API table
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
61 lines
1.7 KiB
Python
61 lines
1.7 KiB
Python
"""
|
|
Manual memory distillation endpoints.
|
|
|
|
POST /distill/short — roll session logs → MEMORY_SHORT.md (no LLM)
|
|
POST /distill/mid — summarize short → MEMORY_MID.md (LLM)
|
|
POST /distill/long — integrate mid → MEMORY_LONG.md (LLM)
|
|
POST /distill/all — run all three in sequence
|
|
"""
|
|
from fastapi import APIRouter
|
|
from memory_distiller import distill_short, distill_mid, distill_long
|
|
import scheduler
|
|
|
|
router = APIRouter(prefix="/distill")
|
|
|
|
|
|
@router.get("/status")
|
|
async def distill_status() -> dict:
|
|
"""Show auto-distillation schedule and next run times."""
|
|
from config import settings
|
|
return {
|
|
"enabled": settings.auto_distill,
|
|
"jobs": scheduler.status(),
|
|
"config": {
|
|
"short": settings.auto_distill_short,
|
|
"mid": settings.auto_distill_mid,
|
|
"long": settings.auto_distill_long,
|
|
},
|
|
}
|
|
|
|
|
|
@router.post("/short")
|
|
async def do_distill_short() -> dict:
|
|
return {"ok": True, **distill_short()}
|
|
|
|
|
|
@router.post("/mid")
|
|
async def do_distill_mid() -> dict:
|
|
result = await distill_mid()
|
|
return {"ok": "error" not in result, **result}
|
|
|
|
|
|
@router.post("/long")
|
|
async def do_distill_long() -> dict:
|
|
result = await distill_long()
|
|
return {"ok": "error" not in result, **result}
|
|
|
|
|
|
@router.post("/all")
|
|
async def do_distill_all() -> dict:
|
|
short_result = distill_short()
|
|
mid_result = await distill_mid()
|
|
if "error" in mid_result:
|
|
return {"ok": False, "short": short_result, "mid": mid_result}
|
|
long_result = await distill_long()
|
|
return {
|
|
"ok": "error" not in long_result,
|
|
"short": short_result,
|
|
"mid": mid_result,
|
|
"long": long_result,
|
|
}
|