249 lines
6.9 KiB
Python

#!/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
}