feat: 多平台 Coding Plan 统一管理系统初始实现
- 支持 MiniMax/OpenAI/Google Gemini/智谱/Kimi 五个平台 - 插件化 Provider 架构,自动发现注册 - 多维度 QuotaRule 额度追踪(固定间隔/自然周期/API同步/手动) - OpenAI + Anthropic 兼容 API 代理,SSE 流式转发 - Model 路由表 + 额度耗尽自动 fallback - 多媒体任务队列(图片/语音/视频) - Vue3 + Tailwind 单文件 Web 仪表盘 - Docker 一键部署 Made-with: Cursor
This commit is contained in:
46
app/routers/queue.py
Normal file
46
app/routers/queue.py
Normal file
@@ -0,0 +1,46 @@
|
||||
"""任务队列 API"""
|
||||
|
||||
from fastapi import APIRouter, HTTPException
|
||||
|
||||
from app import database as db
|
||||
from app.models import TaskCreate, TaskOut
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("", response_model=list[TaskOut])
|
||||
async def list_tasks(status: str | None = None, limit: int = 50):
|
||||
return await db.list_tasks(status=status, limit=limit)
|
||||
|
||||
|
||||
@router.post("", response_model=dict)
|
||||
async def create_task(body: TaskCreate):
|
||||
return await db.create_task(
|
||||
task_type=body.task_type,
|
||||
request_payload=body.request_payload,
|
||||
plan_id=body.plan_id,
|
||||
priority=body.priority,
|
||||
max_retries=body.max_retries,
|
||||
callback_url=body.callback_url,
|
||||
)
|
||||
|
||||
|
||||
@router.get("/{task_id}", response_model=TaskOut)
|
||||
async def get_task(task_id: str):
|
||||
d = await db.get_db()
|
||||
cur = await d.execute("SELECT * FROM tasks WHERE id=?", (task_id,))
|
||||
row = await cur.fetchone()
|
||||
if not row:
|
||||
raise HTTPException(404, "Task not found")
|
||||
t = db.row_to_dict(row)
|
||||
t["request_payload"] = db._parse_json(t["request_payload"], {})
|
||||
t["response_payload"] = db._parse_json(t.get("response_payload"))
|
||||
return t
|
||||
|
||||
|
||||
@router.post("/{task_id}/cancel")
|
||||
async def cancel_task(task_id: str):
|
||||
ok = await db.update_task(task_id, status="cancelled")
|
||||
if not ok:
|
||||
raise HTTPException(404, "Task not found")
|
||||
return {"ok": True}
|
||||
Reference in New Issue
Block a user