"""异步大模型任务执行器。""" 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(), )