#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 参考文献库管理 API 提供参考文献的增删改查接口 """ from fastapi import APIRouter, HTTPException, Query from pydantic import BaseModel from typing import List, Optional from domain.prompt.reference_manager import get_reference_manager router = APIRouter() # ==================== 请求模型 ==================== class AddReferenceRequest(BaseModel): """添加参考文献""" content: str type: str = "title" # title / content class UpdateReferenceRequest(BaseModel): """更新参考文献""" index: int content: str type: str = "title" # title / content class BatchAddRequest(BaseModel): """批量添加""" contents: List[str] type: str = "title" # ==================== 统计接口 ==================== @router.get("/reference/list") async def list_references(): """获取参考文献库统计""" manager = get_reference_manager() stats = manager.list_all() return {"success": True, "data": stats} # ==================== 标题管理 ==================== @router.get("/reference/titles") async def get_titles( count: int = Query(default=None, description="随机抽取数量,不传则返回全部"), random: bool = Query(default=True, description="是否随机抽取") ): """获取标题参考列表""" manager = get_reference_manager() if random and count: titles = manager.get_titles(count=count) else: # 返回全部 titles = manager.get_all_titles() return { "success": True, "data": { "titles": titles, "count": len(titles) } } @router.get("/reference/titles/{index}") async def get_title_by_index(index: int): """获取指定索引的标题""" manager = get_reference_manager() titles = manager.get_all_titles() if index < 0 or index >= len(titles): raise HTTPException(status_code=404, detail=f"索引 {index} 超出范围 (0-{len(titles)-1})") return { "success": True, "data": { "index": index, "content": titles[index] } } @router.post("/reference/titles") async def add_title(request: AddReferenceRequest): """添加新标题""" manager = get_reference_manager() success = manager.add_title(request.content) if success: return {"success": True, "message": "标题添加成功"} else: return {"success": False, "message": "添加失败,可能已存在相同内容"} @router.put("/reference/titles/{index}") async def update_title(index: int, request: AddReferenceRequest): """更新指定索引的标题""" manager = get_reference_manager() success = manager.update_title(index, request.content) if success: return {"success": True, "message": "标题更新成功"} else: raise HTTPException(status_code=400, detail="更新失败,索引可能超出范围") @router.delete("/reference/titles/{index}") async def delete_title(index: int): """删除指定索引的标题""" manager = get_reference_manager() success = manager.remove_title(index) if success: return {"success": True, "message": "标题删除成功"} else: raise HTTPException(status_code=400, detail="删除失败,索引可能超出范围") # ==================== 正文范文管理 ==================== @router.get("/reference/contents") async def get_contents( count: int = Query(default=None, description="随机抽取数量,不传则返回全部"), random: bool = Query(default=True, description="是否随机抽取") ): """获取正文范文列表""" manager = get_reference_manager() if random and count: contents = manager.get_contents(count=count) else: contents = manager.get_all_contents() return { "success": True, "data": { "contents": contents, "count": len(contents) } } @router.get("/reference/contents/{index}") async def get_content_by_index(index: int): """获取指定索引的正文范文""" manager = get_reference_manager() contents = manager.get_all_contents() if index < 0 or index >= len(contents): raise HTTPException(status_code=404, detail=f"索引 {index} 超出范围 (0-{len(contents)-1})") return { "success": True, "data": { "index": index, "content": contents[index] } } @router.post("/reference/contents") async def add_content(request: AddReferenceRequest): """添加新正文范文""" manager = get_reference_manager() success = manager.add_content(request.content) if success: return {"success": True, "message": "正文范文添加成功"} else: return {"success": False, "message": "添加失败,可能已存在相同内容"} @router.put("/reference/contents/{index}") async def update_content(index: int, request: AddReferenceRequest): """更新指定索引的正文范文""" manager = get_reference_manager() success = manager.update_content(index, request.content) if success: return {"success": True, "message": "正文范文更新成功"} else: raise HTTPException(status_code=400, detail="更新失败,索引可能超出范围") @router.delete("/reference/contents/{index}") async def delete_content(index: int): """删除指定索引的正文范文""" manager = get_reference_manager() success = manager.remove_content(index) if success: return {"success": True, "message": "正文范文删除成功"} else: raise HTTPException(status_code=400, detail="删除失败,索引可能超出范围") # ==================== 批量操作 ==================== @router.post("/reference/batch/add") async def batch_add(request: BatchAddRequest): """批量添加参考文献""" manager = get_reference_manager() success_count = 0 for content in request.contents: if request.type == "title": if manager.add_title(content): success_count += 1 elif request.type == "content": if manager.add_content(content): success_count += 1 return { "success": True, "message": f"成功添加 {success_count}/{len(request.contents)} 条", "data": { "total": len(request.contents), "success": success_count, "failed": len(request.contents) - success_count } } # ==================== 缓存管理 ==================== @router.post("/reference/reload") async def reload_references(): """重新加载参考文献库 (清除缓存)""" manager = get_reference_manager() manager.clear_cache() stats = manager.list_all() return { "success": True, "message": "参考文献库已重新加载", "data": stats }