标准工具调用

工具名称要求

有的LLM会严格校验工具名称,所以工具名称最好是函数命名风格的, 大小写+数字+下划线,63个字符以内。

工具调用应该是成对出现

tips:

  • 即一条rool=assistant消息,对应着一条role=tool消息
  • tool_call_id要对应
  • 有的模型会要求tool_calls消息后,应该紧跟着结果消息
  • 如果LLM返回的tool_calls解析报错,或者本地执行报错,都应该返回role=tool的结果消息,返回报错信息。有的LLM会严格要求
{
        "role": "assistant",
        "content": "老板~ 小米(01810.HK)的日线数据已经成功获取啦!(๑•̀ㅂ•́)و✧ 现在需要获取关键技术指标(如MACD、RSI、均线等)来进行趋势分析,我这就调用`mcp_tt.get_technical_indicators`工具获取最近60天的技术指标数据~",
        "tool_calls": [{
            "id": "call_2lzdhh4w8t7j783xoam5f27t",
            "function": {
                "arguments": " {\"market\": \"HK\", \"stock_code\": \"01810.HK\", \"period\": 60}",
                "name": "mcp_tt.get_technical_indicators"
            },
            "type": "function"
        }]
    }, {
        "role": "tool",
        "content": "{\"result\":{\"meta\":null,\"structuredContent\.....",
        "tool_call_id": "call_2lzdhh4w8t7j783xoam5f27t"
}

LLM可能会返回错误的工具调用

抓包分析,发现LLM返回了如下工具调用,其中有些奇怪的字符, 如]<|FunctionCallEnd|>. 下面是SSE合并后的结果,合并工具:OpenAI SSE Data Merger

{
  "id": "0217654415215304aa509763bcfc4a023d494b51b31f69b2adb1f",
  "object": "chat.completion",
  "created": 1765441522,
  "model": "doubao-seed-1-6-250615",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "",
        "tool_calls": [
          {
            "index": 0,
            "function": {
              "name": "",
              "arguments": "]<|FunctionCallEnd|>"
            }
          }
        ]
      },
      "finish_reason": null,
      "logprobs": null
    }
  ],
  "usage": null
}

gemini告诉我这是一种**特殊控制标记泄漏(Special Token Leakage)**现象。

客户端没办法避免,只能做好容错,提交报错信息给LLM。