ZyphrZero commited on
Commit
ed96778
·
unverified ·
2 Parent(s): f253e58 6447f80

Merge pull request #12 from ZyphrZero/pre

Browse files
Files changed (2) hide show
  1. README.md +1 -2
  2. app/core/zai_transformer.py +9 -42
README.md CHANGED
@@ -16,8 +16,7 @@
16
  - 🚀 **高性能流式响应** - Server-Sent Events (SSE) 支持
17
  - 🛠️ **增强工具调用** - 改进的 Function Call 实现,支持复杂工具链
18
  - 🧠 **思考模式支持** - 智能处理模型推理过程
19
- - 🔍 **搜索模型集成** - GLM-4.5-Search 网络搜索能力
20
- - 🐳 **Docker 部署** - 一键容器化部署
21
  - 🛡️ **会话隔离** - 匿名模式保护隐私
22
  - 🔧 **灵活配置** - 环境变量灵活配置
23
  - 📊 **多模型映射** - 智能上游模型路由
 
16
  - 🚀 **高性能流式响应** - Server-Sent Events (SSE) 支持
17
  - 🛠️ **增强工具调用** - 改进的 Function Call 实现,支持复杂工具链
18
  - 🧠 **思考模式支持** - 智能处理模型推理过程
19
+ - 🐳 **Docker 部署** - 一键容器化部署(环境变量请参考`.env.example`)
 
20
  - 🛡️ **会话隔离** - 匿名模式保护隐私
21
  - 🔧 **灵活配置** - 环境变量灵活配置
22
  - 📊 **多模型映射** - 智能上游模型路由
app/core/zai_transformer.py CHANGED
@@ -209,19 +209,10 @@ class ZAITransformer:
209
  is_search = requested_model == settings.SEARCH_MODEL
210
  is_air = requested_model == settings.AIR_MODEL
211
 
212
- # 检查是否需要搜索功能(更灵活的检测)
213
- needs_search = (
214
- is_search or # 明确的搜索模型
215
- "search" in requested_model.lower() or # 模型名包含search
216
- request.get("enable_search", False) or # 显式启用搜索
217
- (request.get("tools") and any("search" in str(tool).lower() for tool in request.get("tools", []))) # 工具中包含搜索
218
- )
219
-
220
  # 获取上游模型ID(使用模型映射)
221
  upstream_model_id = self.model_mapping.get(requested_model, "0727-360B-API")
222
  logger.debug(f" 模型映射: {requested_model} -> {upstream_model_id}")
223
  logger.debug(f" 模型特性检测: is_search={is_search}, is_thinking={is_thinking}, is_air={is_air}")
224
- logger.debug(f" 需要搜索功能: {needs_search}")
225
  logger.debug(f" SEARCH_MODEL配置: {settings.SEARCH_MODEL}")
226
 
227
  # 处理消息列表
@@ -272,28 +263,17 @@ class ZAITransformer:
272
 
273
  # 构建MCP服务器列表
274
  mcp_servers = []
275
- if needs_search:
276
  mcp_servers.append("deep-web-search")
277
- logger.info(f"🔍 检测到需要搜索功能,添加 deep-web-search MCP 服务器")
278
- logger.debug(f" 搜索检测原因: is_search={is_search}, model_name_contains_search={'search' in requested_model.lower()}")
279
  else:
280
- logger.debug(f" 不需要搜索功能,不添加 MCP 服务器")
281
 
282
  logger.debug(f" MCP服务器列表: {mcp_servers}")
283
 
284
  # 构建上游请求体
285
  chat_id = generate_uuid()
286
 
287
- # 根据参考文档构建更完整的features配置
288
- features_list = []
289
- if needs_search:
290
- features_list.extend([
291
- {"type": "mcp", "server": "deep-web-search", "status": "selected"},
292
- {"type": "mcp", "server": "vibe-coding", "status": "hidden"},
293
- {"type": "mcp", "server": "ppt-maker", "status": "hidden"},
294
- {"type": "mcp", "server": "image-search", "status": "hidden"}
295
- ])
296
-
297
  body = {
298
  "stream": True, # 总是使用流式
299
  "model": upstream_model_id, # 使用映射后的模型ID
@@ -301,11 +281,11 @@ class ZAITransformer:
301
  "params": {},
302
  "features": {
303
  "image_generation": False,
304
- "web_search": needs_search,
305
- "auto_web_search": needs_search,
306
- "preview_mode": True if needs_search else False, # 搜索时启用预览模式
307
  "flags": [],
308
- "features": features_list,
309
  "enable_thinking": is_thinking,
310
  },
311
  "background_tasks": {
@@ -360,7 +340,6 @@ class ZAITransformer:
360
 
361
  # 记录关键的请求信息用于调试
362
  logger.debug(f" 📋 发送到Z.AI的关键信息:")
363
- logger.debug(f" - 原始模型: {requested_model}")
364
  logger.debug(f" - 上游模型: {body['model']}")
365
  logger.debug(f" - MCP服务器: {body['mcp_servers']}")
366
  logger.debug(f" - web_search: {body['features']['web_search']}")
@@ -368,22 +347,10 @@ class ZAITransformer:
368
  logger.debug(f" - 消息数量: {len(body['messages'])}")
369
  tools_count = len(body.get('tools') or [])
370
  logger.debug(f" - 工具数量: {tools_count}")
371
-
372
- # 特别记录MCP相关信息
373
- if body['mcp_servers']:
374
- logger.info(f"🎯 MCP服务器配置成功: {body['mcp_servers']}")
375
- logger.debug(f" 📋 完整的features配置: {json.dumps(body['features'], ensure_ascii=False, indent=2)}")
376
- else:
377
- logger.warning(f"⚠️ 未配置MCP服务器 - 检查模型: {requested_model}, 搜索需求: {needs_search}")
378
-
379
- # 记录完整的请求体(用于调试)
380
- logger.debug(f" 📋 完整请求体: {json.dumps(body, ensure_ascii=False, indent=2)}")
381
-
382
- return {"body": body, "config": config, "token": token}
383
-
384
  async def transform_response_out(
385
  self, response_stream: Generator, context: Dict[str, Any]
386
- ) -> Generator[str, None, None]:
387
  """
388
  转换z.ai响应为OpenAI格式
389
  支持流式和非流式输出
 
209
  is_search = requested_model == settings.SEARCH_MODEL
210
  is_air = requested_model == settings.AIR_MODEL
211
 
 
 
 
 
 
 
 
 
212
  # 获取上游模型ID(使用模型映射)
213
  upstream_model_id = self.model_mapping.get(requested_model, "0727-360B-API")
214
  logger.debug(f" 模型映射: {requested_model} -> {upstream_model_id}")
215
  logger.debug(f" 模型特性检测: is_search={is_search}, is_thinking={is_thinking}, is_air={is_air}")
 
216
  logger.debug(f" SEARCH_MODEL配置: {settings.SEARCH_MODEL}")
217
 
218
  # 处理消息列表
 
263
 
264
  # 构建MCP服务器列表
265
  mcp_servers = []
266
+ if is_search:
267
  mcp_servers.append("deep-web-search")
268
+ logger.info(f"🔍 检测到搜索模型,添加 deep-web-search MCP 服务器")
 
269
  else:
270
+ logger.debug(f" 非搜索模型,不添加 MCP 服务器")
271
 
272
  logger.debug(f" MCP服务器列表: {mcp_servers}")
273
 
274
  # 构建上游请求体
275
  chat_id = generate_uuid()
276
 
 
 
 
 
 
 
 
 
 
 
277
  body = {
278
  "stream": True, # 总是使用流式
279
  "model": upstream_model_id, # 使用映射后的模型ID
 
281
  "params": {},
282
  "features": {
283
  "image_generation": False,
284
+ "web_search": is_search,
285
+ "auto_web_search": is_search,
286
+ "preview_mode": False,
287
  "flags": [],
288
+ "features": [],
289
  "enable_thinking": is_thinking,
290
  },
291
  "background_tasks": {
 
340
 
341
  # 记录关键的请求信息用于调试
342
  logger.debug(f" 📋 发送到Z.AI的关键信息:")
 
343
  logger.debug(f" - 上游模型: {body['model']}")
344
  logger.debug(f" - MCP服务器: {body['mcp_servers']}")
345
  logger.debug(f" - web_search: {body['features']['web_search']}")
 
347
  logger.debug(f" - 消息数量: {len(body['messages'])}")
348
  tools_count = len(body.get('tools') or [])
349
  logger.debug(f" - 工具数量: {tools_count}")
350
+
 
 
 
 
 
 
 
 
 
 
 
 
351
  async def transform_response_out(
352
  self, response_stream: Generator, context: Dict[str, Any]
353
+ ) -> AsyncGenerator[str, None]:
354
  """
355
  转换z.ai响应为OpenAI格式
356
  支持流式和非流式输出