新增获取全部知识库的接口,api版本号重归到v1
This commit is contained in:
@@ -1,30 +1,67 @@
|
||||
from fastapi import APIRouter
|
||||
# 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
|
||||
from backend.schemas.schemas import RegisterRequest, AddUrlsRequest, PendingRequest, SearchRequest
|
||||
|
||||
router = APIRouter(prefix="/api/v1", tags=["V1 Manual"])
|
||||
# 【改动】前缀变更为 v1
|
||||
router = APIRouter(prefix="/api/v1", tags=["Knowledge Base API"])
|
||||
|
||||
@router.post("/register")
|
||||
async def register(req: RegisterRequest):
|
||||
# =======================================================
|
||||
# 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 = data_service.register_task(req.url)
|
||||
return make_response(1, res.pop("msg", "Success"), res)
|
||||
res = crawler_service.map_site(req.url)
|
||||
return ResponseBase(code=1, msg="Task Created", data=res)
|
||||
except Exception as e:
|
||||
return make_response(0, str(e))
|
||||
return ResponseBase(code=0, msg=str(e))
|
||||
|
||||
@router.post("/add_urls")
|
||||
async def add_urls(req: AddUrlsRequest):
|
||||
try:
|
||||
res = data_service.add_urls(req.task_id, req.urls_obj["urls"])
|
||||
return make_response(1, res.pop("msg", "Success"), res)
|
||||
except Exception as e:
|
||||
return make_response(0, 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("/search")
|
||||
async def search_manual(req: SearchRequest):
|
||||
@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:
|
||||
res = data_service.search(req.query_embedding['vector'], req.task_id, req.limit)
|
||||
return make_response(1, res.pop("msg", "Success"), res)
|
||||
# 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 make_response(0, str(e))
|
||||
return ResponseBase(code=0, msg=str(e))
|
||||
@@ -1,30 +0,0 @@
|
||||
from fastapi import APIRouter, BackgroundTasks
|
||||
from backend.services.crawler_service import crawler_service
|
||||
from backend.utils.common import make_response
|
||||
from backend.schemas.schemas import AutoMapRequest, AutoProcessRequest, TextSearchRequest
|
||||
|
||||
router = APIRouter(prefix="/api/v2", tags=["V2 Automated"])
|
||||
|
||||
@router.post("/crawler/map")
|
||||
async def auto_map(req: AutoMapRequest):
|
||||
try:
|
||||
res = crawler_service.map_site(req.url)
|
||||
return make_response(1, res.pop("msg", "Started"), res)
|
||||
except Exception as e:
|
||||
return make_response(0, str(e))
|
||||
|
||||
@router.post("/crawler/process")
|
||||
async def auto_process(req: AutoProcessRequest, bg_tasks: BackgroundTasks):
|
||||
try:
|
||||
bg_tasks.add_task(crawler_service.process_queue, req.task_id, req.batch_size)
|
||||
return make_response(1, "Background processing started", {"task_id": req.task_id})
|
||||
except Exception as e:
|
||||
return make_response(0, str(e))
|
||||
|
||||
@router.post("/search")
|
||||
async def search_smart(req: TextSearchRequest):
|
||||
try:
|
||||
res = crawler_service.search(req.query, req.task_id, req.return_num)
|
||||
return make_response(1, res.pop("msg", "Success"), res)
|
||||
except Exception as e:
|
||||
return make_response(0, str(e))
|
||||
@@ -1,57 +0,0 @@
|
||||
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.v3 import (
|
||||
TaskCreateRequest, TaskExecuteRequest, SearchRequest,
|
||||
ResponseBase, TaskStatusData
|
||||
)
|
||||
|
||||
router = APIRouter(prefix="/api/v3", tags=["V3 Knowledge Base"])
|
||||
|
||||
@router.post("/tasks", status_code=status.HTTP_201_CREATED, response_model=ResponseBase)
|
||||
async def create_task(req: TaskCreateRequest):
|
||||
"""创建新任务 (Map)"""
|
||||
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=f"Map Failed: {str(e)}")
|
||||
|
||||
@router.get("/tasks/{task_id}", response_model=ResponseBase)
|
||||
async def get_task_status(task_id: int):
|
||||
"""
|
||||
实时监控:
|
||||
返回数据库持久化状态 + 内存中正在运行的线程
|
||||
"""
|
||||
# 调用 crawler_service 的聚合方法
|
||||
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="Background Execution Started",
|
||||
data={"task_id": task_id, "mode": "concurrent_thread_pool"}
|
||||
)
|
||||
|
||||
@router.post("/search", response_model=ResponseBase)
|
||||
async def search_knowledge(req: SearchRequest):
|
||||
"""混合检索 + Rerank"""
|
||||
try:
|
||||
res = crawler_service.search(req.query, req.task_id, req.return_num)
|
||||
return ResponseBase(code=1, msg="Search Completed", data=res)
|
||||
except Exception as e:
|
||||
return ResponseBase(code=0, msg=f"Search Failed: {str(e)}")
|
||||
Reference in New Issue
Block a user