jackkuo's picture
add QA
79899c0
from asgi_correlation_id import correlation_id
from fastapi import APIRouter
from fastapi.responses import StreamingResponse, JSONResponse
from utils.bio_logger import bio_logger as logger
from utils.i18n_util import (
get_language,
create_error_response,
)
from utils.i18n_context import with_language
from bio_requests.chat_request import ChatRequest
from service.chat import ChatService
router = APIRouter(prefix="/mcp", tags=["MCP"])
@router.post("/bio_qa", response_model=None, operation_id="bio_qa_stream_chat")
async def bio_qa(query: str, lang: str = "en"):
"""
生物医学问答接口,提供RAG问答服务。
query: 问答内容
lang: 语言设置,zh代表中文,en代表英文
"""
logger.info(f"{correlation_id.get()} Bio QA for {query}")
chat_request = ChatRequest(query=query, language=lang)
# 解析语言设置
language = get_language(chat_request.language)
# 使用上下文管理器设置语言
with with_language(language):
try:
chat_service = ChatService()
return StreamingResponse(
chat_service.generate_stream(chat_request),
media_type="text/event-stream",
headers={
"Connection": "keep-alive",
"Cache-Control": "no-cache",
},
)
except Exception as e:
logger.error(f"{correlation_id.get()} Stream chat error: {e}")
error_response = create_error_response(
error_key="service_unavailable",
details=str(e),
error_code=500,
)
return JSONResponse(content=error_response, status_code=500)
# 添加MCP协议所需的端点
@router.get("/tools")
async def list_tools():
"""列出可用的MCP工具"""
return {
"tools": [
{
"name": "bio_qa_stream_chat",
"description": "生物医学问答服务,提供RAG问答功能",
"inputSchema": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "问题内容"
},
"lang": {
"type": "string",
"description": "语言设置,zh代表中文,en代表英文",
"enum": ["zh", "en"],
"default": "en"
}
},
"required": ["query"]
}
}
]
}