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"] } } ] }