先把当时的情况摆出来。groq 0.13 用 llama-3.3-70b-versatile 做工具调用,返回 400,原文 tool_use_failed: Failed to call a function,响应里 failed_generation 是一段带尖括号 function 标记的文本,同样的 tools 定义在 gpt-4o 上正常。

这类报错背后常见的原因有几处,逐个排除就行。Groq 用 XML 风格解析工具调用,模型输出了非法标签。少数情况下是工具名里带点号或斜杠,解析器无法匹配。

还有一种情况,参数里出现未转义的引号,JSON 被截断。另外,开启了并行工具调用,返回了多段不完整标签。

第一件事是把 failed_generation 原样打出来看结构

python -c "import json;print(json.load(open('err.json'))['error']['failed_generation'])"

然后用 curl 复现同一条请求,排除 SDK 改写

curl -s https://api.groq.com/openai/v1/chat/completions -H "Authorization: Bearer $GROQ_KEY" -H 'Content-Type: application/json' -d @req.json

接着把工具名改成纯下划线命名并关掉并行调用

python smoke.py --tool get_order_status --parallel false

末了在提示词里补一条只输出 JSON 参数的约束

python smoke.py --tool get_order_status --system-file tool_system.txt

别只看报错消失,验证要多做一步。同样的工具在 Groq 上返回合法的 tool_calls,arguments 能被 json.loads 解析,400 不再出现。

Groq 的工具调用对输出格式比 OpenAI 严格,工具名和参数里尽量别出现特殊字符,线上要保留 failed_generation 字段,否则只能看到一句笼统的失败。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189