2026-05-18 16:32:42 +08:00
|
|
|
"""Define API routes for knowledge."""
|
|
|
|
|
|
|
|
|
|
from __future__ import annotations
|
2026-05-14 15:07:34 +08:00
|
|
|
|
|
|
|
|
from fastapi import APIRouter, HTTPException
|
|
|
|
|
|
2026-05-18 16:32:42 +08:00
|
|
|
from app.api.models import SearchResponse, SearchResultItem, SearchRequest
|
|
|
|
|
from app.shared.bootstrap import get_retrieval_service
|
|
|
|
|
# Keep route handlers close to their transport-layer wiring for easier auditing.
|
|
|
|
|
|
2026-05-14 15:07:34 +08:00
|
|
|
|
|
|
|
|
router = APIRouter(prefix="/knowledge", tags=["knowledge"])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/search", response_model=SearchResponse)
|
|
|
|
|
async def search_knowledge(request: SearchRequest):
|
2026-05-18 16:32:42 +08:00
|
|
|
"""Search knowledge."""
|
|
|
|
|
if not request.query or not request.query.strip():
|
|
|
|
|
raise HTTPException(status_code=400, detail="查询文本不能为空")
|
|
|
|
|
|
|
|
|
|
results = get_retrieval_service().retrieve(
|
|
|
|
|
query=request.query,
|
|
|
|
|
top_k=request.top_k,
|
|
|
|
|
filters=request.filters,
|
|
|
|
|
)
|
|
|
|
|
return SearchResponse(
|
|
|
|
|
query=request.query,
|
|
|
|
|
total=len(results),
|
|
|
|
|
results=[
|
|
|
|
|
SearchResultItem(
|
|
|
|
|
id=index + 1,
|
|
|
|
|
content=item.content,
|
|
|
|
|
score=item.score,
|
|
|
|
|
metadata={
|
|
|
|
|
"doc_id": item.doc_id,
|
|
|
|
|
"doc_name": item.doc_name,
|
|
|
|
|
"chunk_id": item.chunk_id,
|
|
|
|
|
"section_title": item.section_title,
|
|
|
|
|
"page_number": item.page_number,
|
|
|
|
|
**item.metadata,
|
|
|
|
|
},
|
2026-05-14 15:07:34 +08:00
|
|
|
)
|
2026-05-18 16:32:42 +08:00
|
|
|
for index, item in enumerate(results)
|
|
|
|
|
],
|
|
|
|
|
)
|
2026-05-14 15:07:34 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/retrieval", response_model=SearchResponse)
|
|
|
|
|
async def knowledge_retrieval(request: SearchRequest):
|
2026-05-18 16:32:42 +08:00
|
|
|
"""Handle knowledge retrieval."""
|
2026-05-14 15:07:34 +08:00
|
|
|
return await search_knowledge(request)
|