Spaces:
Sleeping
Sleeping
| 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"]) | |
| 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协议所需的端点 | |
| 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"] | |
| } | |
| } | |
| ] | |
| } | |