From 6f78aa8a38ba1373797f5f995c2aca40307e78f4 Mon Sep 17 00:00:00 2001 From: zhanggangyong Date: Sat, 17 Jan 2026 07:43:12 +0000 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0mcp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- search_agent/search_agent_MCP/USER_GUIDE.md | 55 +++++++++++++++------ search_agent/search_agent_MCP/mcp_server.py | 54 +++++++++++++++++--- 2 files changed, 87 insertions(+), 22 deletions(-) diff --git a/search_agent/search_agent_MCP/USER_GUIDE.md b/search_agent/search_agent_MCP/USER_GUIDE.md index b368766..2c1b700 100644 --- a/search_agent/search_agent_MCP/USER_GUIDE.md +++ b/search_agent/search_agent_MCP/USER_GUIDE.md @@ -34,7 +34,21 @@ MCP Search Agent 是基于 Model Context Protocol (MCP) 协议的智能搜索服 "id": "request-001", "method": "search", "params": { - "query": "什么是人工智能?" + "query": "什么是人工智能?", + "api_key": "your-llm-api-key" + } +} +``` + +**或者使用 `llm_api_key`(与API格式保持一致)**: +```json +{ + "jsonrpc": "2.0", + "id": "request-001", + "method": "search", + "params": { + "query": "什么是人工智能?", + "llm_api_key": "your-llm-api-key" } } ``` @@ -48,8 +62,8 @@ MCP Search Agent 是基于 Model Context Protocol (MCP) 协议的智能搜索服 | method | string | 是 | 方法名,固定为 "search" | | params | object | 是 | 请求参数对象 | | params.query | string | 是 | 搜索查询内容 | -| params.api_key | string | 否 | LLM API密钥(可选,如果环境变量已配置则不需要) | -| params.model | string | 否 | 模型名称(可选,如果环境变量已配置则不需要) | +| params.api_key | string | 是 | LLM API密钥(**必填**,等同于API格式版本的`llm_api_key`) | +| params.llm_api_key | string | 是 | LLM API密钥(**必填**,`api_key`的别名,与API格式保持一致) | **响应示例**: ```json @@ -117,7 +131,8 @@ MCP Search Agent 是基于 Model Context Protocol (MCP) 协议的智能搜索服 "id": "request-002", "method": "search/stream", "params": { - "query": "Python编程语言的特点" + "query": "Python编程语言的特点", + "api_key": "your-llm-api-key" } } ``` @@ -146,7 +161,8 @@ data: {"jsonrpc":"2.0","id":"request-002","method":"task/complete","params":{"ta "id": "request-003", "method": "search", "params": { - "query": "搜索查询" + "query": "搜索查询", + "api_key": "your-llm-api-key" } } ``` @@ -250,7 +266,8 @@ curl -X POST https://your-service-url/mcp/v1/search \ "id": "test-1", "method": "search", "params": { - "query": "什么是人工智能?" + "query": "什么是人工智能?", + "api_key": "your-llm-api-key" } }' @@ -262,7 +279,8 @@ curl -X POST https://your-service-url/mcp/v1/search/stream \ "id": "test-2", "method": "search/stream", "params": { - "query": "Python编程语言的特点" + "query": "Python编程语言的特点", + "api_key": "your-llm-api-key" } }' ``` @@ -280,7 +298,8 @@ payload = { "id": "python-request-1", "method": "search", "params": { - "query": "什么是人工智能?" + "query": "什么是人工智能?", + "api_key": "your-llm-api-key" } } @@ -305,7 +324,8 @@ const payload = { id: 'js-request-1', method: 'search', params: { - query: '什么是人工智能?' + query: '什么是人工智能?', + api_key: 'your-llm-api-key' } }; @@ -337,18 +357,21 @@ fetch(url, { 以下环境变量在 AKS 部署时已配置,用户**不需要**在请求中传递: - `LLM_BASE_URL` - LLM服务基础URL -- `MODEL_NAME` - 模型名称 -- `LITELLM_API_KEY` - LLM API密钥(如果已配置,则用户请求中不需要传递) +- `MODEL_NAME` 或 `LLM_MODEL` - 模型名称 - `SERPER_API_KEY` - Serper搜索API密钥 - `JINA_API_KEY` - Jina Reader API密钥 ### 2. 用户请求参数 -用户调用时**只需要**传递: +用户调用时**必须**传递: - `query` - 搜索查询内容(**必填**) -- `api_key` - LLM API密钥(**可选**,如果部署时未配置则需要传递) -- `model` - 模型名称(**可选**,如果部署时未配置则需要传递) +- `api_key` 或 `llm_api_key` - LLM API密钥(**必填**,等同于API格式版本的`llm_api_key`,用于计费和身份验证) + +**注意**: +- **`api_key`/`llm_api_key`是必需的**,必须在每次请求中传递(这是用户的LLM API密钥,用于计费和身份验证) +- **`model`不需要传递**,模型名称已在AKS部署时通过环境变量(`MODEL_NAME`或`LLM_MODEL`)配置 +- 与API格式版本保持一致:用户的API密钥必须传递,其他配置由部署时通过环境变量配置 ### 3. 请求格式 @@ -375,11 +398,11 @@ fetch(url, { ### Q1: 请求中是否需要传递 api_key? -**A**: 如果服务在 AKS 部署时已配置 `LITELLM_API_KEY` 环境变量,则用户请求中不需要传递 `api_key`。如果没有配置,则需要在请求的 `params` 中传递 `api_key`。 +**A**: **必须传递**。`api_key`(或`llm_api_key`)是用户的LLM API密钥,必须在每次请求中传递(等同于API格式版本的`llm_api_key`)。这是用于计费和身份验证的,不能从环境变量获取。 ### Q2: 请求中是否需要传递 model? -**A**: 如果服务在 AKS 部署时已配置 `MODEL_NAME` 环境变量,则用户请求中不需要传递 `model`。如果没有配置,则需要在请求的 `params` 中传递 `model`。 +**A**: **不需要传递**。模型名称已在AKS部署时通过环境变量(`MODEL_NAME`或`LLM_MODEL`)配置,用户请求中不需要传递。 ### Q3: 如何处理超时? diff --git a/search_agent/search_agent_MCP/mcp_server.py b/search_agent/search_agent_MCP/mcp_server.py index 0748385..d8c28e9 100644 --- a/search_agent/search_agent_MCP/mcp_server.py +++ b/search_agent/search_agent_MCP/mcp_server.py @@ -281,9 +281,30 @@ class MCPSearchAgentServer: } }) - # 提取API key和model(如果提供) - api_key = params.get("api_key") or os.getenv("LITELLM_API_KEY") - model = params.get("model") or os.getenv("MODEL_NAME") or os.getenv("LITELLM_MODEL") + # 提取API key(必须从请求参数中获取,等同于API格式版本的llm_api_key) + api_key = params.get("api_key") or params.get("llm_api_key") + if not api_key: + return JSONResponse({ + "jsonrpc": "2.0", + "id": request.id, + "error": { + "code": -32602, + "message": "Invalid params: 'api_key' or 'llm_api_key' is required" + } + }) + + # 提取model(从环境变量获取,不支持在请求中传递,与API格式版本保持一致) + # 支持多种环境变量名称:MODEL_NAME(优先)、LLM_MODEL(AKS部署)、LITELLM_MODEL + model = os.getenv("MODEL_NAME") or os.getenv("LLM_MODEL") or os.getenv("LITELLM_MODEL") + if not model: + return JSONResponse({ + "jsonrpc": "2.0", + "id": request.id, + "error": { + "code": -32000, + "message": "Model not configured: MODEL_NAME or LLM_MODEL environment variable is required" + } + }) # 创建任务ID task_id = params.get("task_id", uuid.uuid4().hex) @@ -355,9 +376,30 @@ class MCPSearchAgentServer: } }) - # 提取API key和model(如果提供) - api_key = params.get("api_key") or os.getenv("LITELLM_API_KEY") - model = params.get("model") or os.getenv("MODEL_NAME") or os.getenv("LITELLM_MODEL") + # 提取API key(必须从请求参数中获取,等同于API格式版本的llm_api_key) + api_key = params.get("api_key") or params.get("llm_api_key") + if not api_key: + return JSONResponse({ + "jsonrpc": "2.0", + "id": request.id, + "error": { + "code": -32602, + "message": "Invalid params: 'api_key' or 'llm_api_key' is required" + } + }) + + # 提取model(从环境变量获取,不支持在请求中传递,与API格式版本保持一致) + # 支持多种环境变量名称:MODEL_NAME(优先)、LLM_MODEL(AKS部署)、LITELLM_MODEL + model = os.getenv("MODEL_NAME") or os.getenv("LLM_MODEL") or os.getenv("LITELLM_MODEL") + if not model: + return JSONResponse({ + "jsonrpc": "2.0", + "id": request.id, + "error": { + "code": -32000, + "message": "Model not configured: MODEL_NAME or LLM_MODEL environment variable is required" + } + }) task_id = params.get("task_id", uuid.uuid4().hex)