249 lines
6.9 KiB
Python
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
|
|
}
|