120 lines
3.8 KiB
Python
120 lines
3.8 KiB
Python
"""异步大模型任务执行器。"""
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import traceback
|
|
from datetime import datetime
|
|
from fastapi import HTTPException
|
|
|
|
from database import SessionLocal
|
|
from models import LlmTask
|
|
|
|
|
|
class _FakeUser:
|
|
id = 0
|
|
|
|
|
|
def run_llm_task(task_id: int, kind: str, params: dict) -> None:
|
|
db = SessionLocal()
|
|
task = db.get(LlmTask, task_id)
|
|
if task is None:
|
|
db.close()
|
|
return
|
|
task.status = "running"
|
|
task.progress = 10
|
|
task.message = "任务已开始,正在调用模型…"
|
|
db.commit()
|
|
try:
|
|
task.progress = 25
|
|
db.commit()
|
|
if kind == "generate_questions":
|
|
from routers.question_bank import generate as execute
|
|
from schemas import GenerateIn
|
|
|
|
payload = GenerateIn.model_validate(params)
|
|
task.progress = 40
|
|
task.message = "正在生成题目并解析结构…"
|
|
db.commit()
|
|
result = execute(payload=payload, db=db, _=_FakeUser())
|
|
count = len(result)
|
|
ids = [item.id for item in result]
|
|
task.progress = 100
|
|
task.status = "success"
|
|
task.message = f"成功生成 {count} 道题"
|
|
task.result = json.dumps({"count": count, "ids": ids}, ensure_ascii=False)
|
|
elif kind == "generate_chapters":
|
|
from routers.catalog import generate_catalog_chapters
|
|
from schemas import ChaptersGenerateIn
|
|
|
|
payload = ChaptersGenerateIn.model_validate(params)
|
|
task.progress = 40
|
|
task.message = "正在生成章节目录…"
|
|
db.commit()
|
|
result = execute_generate_chapters(
|
|
db, params["textbook_id"], payload
|
|
)
|
|
task.progress = 100
|
|
task.status = "success"
|
|
task.message = result.message
|
|
task.result = json.dumps(
|
|
{
|
|
"count": len(result.created),
|
|
"message": result.message,
|
|
},
|
|
ensure_ascii=False,
|
|
)
|
|
elif kind == "organize_chapters":
|
|
from routers.catalog import organize_textbook_chapters
|
|
from schemas import ChaptersOrganizeIn
|
|
|
|
payload = ChaptersOrganizeIn.model_validate(params)
|
|
task.progress = 40
|
|
task.message = "正在解析目录素材并关联知识图谱…"
|
|
db.commit()
|
|
result = organize_textbook_chapters(
|
|
textbook_id=params["textbook_id"],
|
|
payload=payload,
|
|
db=db,
|
|
_=_FakeUser(),
|
|
)
|
|
task.progress = 100
|
|
task.status = "success"
|
|
task.message = result.message
|
|
task.result = json.dumps(
|
|
{
|
|
"count": len(result.created),
|
|
"message": result.message,
|
|
},
|
|
ensure_ascii=False,
|
|
)
|
|
else:
|
|
raise ValueError(f"不支持的任务类型:{kind}")
|
|
except Exception as exc: # noqa: BLE001
|
|
db.rollback()
|
|
task = db.get(LlmTask, task_id)
|
|
task.status = "failed"
|
|
task.message = (
|
|
str(exc.detail)[:500]
|
|
if isinstance(exc, HTTPException)
|
|
else (str(exc)[:500] or exc.__class__.__name__)
|
|
)
|
|
task.progress = 100
|
|
task.result = json.dumps(
|
|
{"trace": traceback.format_exc()[-2000:]}, ensure_ascii=False
|
|
)
|
|
finally:
|
|
task.finished_at = datetime.utcnow()
|
|
db.commit()
|
|
db.close()
|
|
|
|
|
|
def execute_generate_chapters(db, textbook_id: int, payload):
|
|
from routers.catalog import generate_catalog_chapters
|
|
|
|
return generate_catalog_chapters(
|
|
textbook_id=textbook_id,
|
|
payload=payload,
|
|
db=db,
|
|
_=_FakeUser(),
|
|
)
|