From baf5913bfb3feecda34b3cd50e32f8f9039d6677 Mon Sep 17 00:00:00 2001 From: hubian <908234780@qq.com> Date: Wed, 15 Apr 2026 09:52:19 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20SiliconFlow=E5=B9=B3=E5=8F=B0Function=20?= =?UTF-8?q?Calling=E7=AC=AC=E4=BA=8C=E8=BD=AE=E8=B0=83=E7=94=A8=E5=85=BC?= =?UTF-8?q?=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:SiliconFlow平台不支持标准tool消息类型,第二轮调用返回参数无效 修复:将tool消息转换为user消息格式 - 收集所有tool消息的内容 - 合并为一个用户消息发送给模型 - 添加明确的提示让模型直接根据结果回答 版本: v3.0.6 --- services/llm_service.py | 49 ++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/services/llm_service.py b/services/llm_service.py index 78d4c42..2c8286c 100644 --- a/services/llm_service.py +++ b/services/llm_service.py @@ -519,6 +519,9 @@ class LLMService: """ 第二阶段调用:使用包含工具调用和结果的完整消息历史 + 注意:SiliconFlow 等平台不支持标准 tool 消息类型, + 需要将工具结果转换为普通用户消息格式。 + Args: messages: 已包含assistant tool_calls和tool结果的完整消息历史 provider_config: LLM Provider配置 @@ -533,17 +536,43 @@ class LLMService: max_tokens = provider_config.get('max_tokens', 4096) temperature = agent_config.get('temperature_override') or provider_config.get('temperature', 0.7) - # 消息历史已经包含了assistant的tool_calls和tool结果,直接使用 - final_messages = messages.copy() + # 转换消息格式:将 tool 相关消息转为普通消息格式 + # 因为很多 API 平台(如 SiliconFlow)不支持 tool 消息类型 + converted_messages = [] + tool_results_content = [] - # 添加提示:告诉模型直接根据工具结果回答,不要再调用工具 - # 添加一个系统级别的提示 - tool_hint = { - "role": "system", - "content": "请根据工具返回的结果直接回答用户的问题,不要再调用任何工具或搜索。如果结果不足以回答问题,请根据现有信息给出最好的回答,并说明信息的局限性。" - } - # 在工具结果之后添加提示 - final_messages.append(tool_hint) + for msg in messages: + role = msg.get('role') + + if role == 'system': + converted_messages.append(msg) + elif role == 'user': + converted_messages.append(msg) + elif role == 'assistant': + # 如果有 tool_calls,跳过这个消息(不发送给不支持的平台) + if msg.get('tool_calls'): + # 记录工具调用信息(可选) + pass + else: + converted_messages.append(msg) + elif role == 'tool': + # 收集工具结果,后面合并成一个用户消息 + tool_results_content.append(msg.get('content', '')) + + # 如果有工具结果,添加为一个特殊的用户消息 + if tool_results_content: + combined_results = "\n\n".join([ + f"【搜索结果 {i+1}】\n{result}" + for i, result in enumerate(tool_results_content) + ]) + + # 添加工具结果作为用户消息 + converted_messages.append({ + "role": "user", + "content": f"以下是搜索工具返回的结果:\n\n{combined_results}\n\n请根据以上搜索结果回答我之前的问题,不要再说\"让我搜索一下\",直接给出回答。如果搜索结果不足以回答,请说明。" + }) + + final_messages = converted_messages # 调用LLM生成最终回复 url = f"{api_base.rstrip('/')}/chat/completions"