# backend/routers/v1.py from fastapi import APIRouter, BackgroundTasks, status from backend.services.crawler_service import crawler_service from backend.services.data_service import data_service from backend.schemas.v1 import ( TaskCreateRequest, TaskExecuteRequest, SearchRequest, ResponseBase, KnowledgeBaseListResponse ) from backend.utils.common import make_response # 【改动】前缀变更为 v1 router = APIRouter(prefix="/api/v1", tags=["Knowledge Base API"]) # ======================================================= # 1. 获取知识库列表 (核心新功能) # ======================================================= @router.get("/knowledge-bases", response_model=ResponseBase) async def list_knowledge_bases(): """ 列出所有已存在的知识库(Task)。 工作流可以用这个接口获取 task_id 列表,让 LLM 选择查哪个库。 """ kb_list = crawler_service.get_knowledge_base_list() return ResponseBase( code=1, msg="Success", data={"total": len(kb_list), "list": kb_list} ) # ======================================================= # 2. 任务管理 # ======================================================= @router.post("/tasks", status_code=status.HTTP_201_CREATED, response_model=ResponseBase) async def create_task(req: TaskCreateRequest): try: res = crawler_service.map_site(req.url) return ResponseBase(code=1, msg="Task Created", data=res) except Exception as e: return ResponseBase(code=0, msg=str(e)) @router.get("/tasks/{task_id}", response_model=ResponseBase) async def get_task_status(task_id: int): data = crawler_service.get_task_status(task_id) if not data: return ResponseBase(code=0, msg="Task not found") return ResponseBase(code=1, msg="Success", data=data) @router.post("/tasks/{task_id}/run", status_code=status.HTTP_202_ACCEPTED, response_model=ResponseBase) async def run_task(task_id: int, req: TaskExecuteRequest, bg_tasks: BackgroundTasks): # 简单检查 if not data_service.get_task_monitor_data(task_id): return ResponseBase(code=0, msg="Task not found") bg_tasks.add_task(crawler_service.process_queue_concurrent, task_id, req.batch_size) return ResponseBase(code=1, msg="Execution Started", data={"task_id": task_id}) # ======================================================= # 3. 搜索 # ======================================================= @router.post("/search", response_model=ResponseBase) async def search_knowledge(req: SearchRequest): try: # req.limit 映射到 return_num res = crawler_service.search(req.query, req.task_id, req.limit) return ResponseBase(code=1, msg="Search Completed", data=res) except Exception as e: return ResponseBase(code=0, msg=str(e))