豆包function call需三步闭环:声明合规json schema函数、请求中设tool_choice、解析tool_calls后回传role="tool"的正确tool_message,缺一不可。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

豆包大模型的 Function Call 能力不是“开了就能用”的开关,它需要你显式声明函数结构、在请求中启用工具调用、并手动解析返回的 tool_calls 字段——漏掉任一环,模型就只会当普通文本回复,不会触发任何外部动作。
如何正确声明 function schema 并传给豆包 API
豆包对 functions 参数的格式要求严格:必须是 JSON Schema 兼容的数组,且每个对象必须包含 name、description 和 parameters 三个字段。少一个字段,API 会直接报错 400 Bad Request: invalid function schema。
-
name必须是合法的 Python/JS 函数名风格(字母开头、只含字母数字和下划线),不能带空格或特殊符号 -
parameters必须是完整 object 类型 schema,不能省略"type": "object"或"properties" - 不支持嵌套
anyOf/oneOf,复杂逻辑需拆成多个独立 function
示例(正确):
functions = [{
"name": "get_weather",
"description": "获取指定城市的实时天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称,如北京、上海"}
},
"required": ["city"]
}
}]
调用时必须显式开启 tool_choice 并处理 tool_calls 响应
即使你传了 functions,豆包默认也不会调用——你必须在请求体中加 "tool_choice": "auto"(或指定具体 name)。否则响应里压根不会出现 tool_calls 字段,你拿到的只是纯文本。
-
"tool_choice": "none":强制禁用,忽略所有 functions -
"tool_choice": {"type": "function", "function": {"name": "xxx"}}:强制调用某一个,适用于确定性流程 - 响应中若含
tool_calls,说明模型决定调用工具;此时content字段通常为空或为 null,别误以为失败
关键判断逻辑(Python):
使用豆包(火山引擎 Ark)生成图片或视频并保存本地。用户提及“豆包生图/图片/生视频/视频”、“Doubao”、“Seedance”、“火山引擎图片/视频”时触发。
if response.choices[0].message.tool_calls:
for tool_call in response.choices[0].message.tool_calls:
if tool_call.function.name == "get_weather":
args = json.loads(tool_call.function.arguments)
result = get_weather(args["city"])
# 后续需把 result 以 tool_message 形式发回 API 继续对话
为什么你的 function 调用总卡在第二步:tool_message 格式不对
Function Call 是两轮交互:第一轮模型返回 tool_calls,第二轮你必须构造正确的 tool_message 发回去,否则模型无法继续推理。常见错误是把结果塞进 content 字段却忘了设 role="tool" 和 tool_call_id。
-
tool_message的role必须是字符串"tool",不是"assistant"或"system" - 必须携带与上一轮
tool_call.id完全一致的tool_call_id字段 -
content必须是字符串(哪怕你返回的是 JSON dict,也得json.dumps())
错误示例(会导致 400):
{"role": "assistant", "content": '{"temp": 25}'}
正确示例:
{"role": "tool", "tool_call_id": "call_abc123", "content": "{\"temp\": 25}"}
Endpoint ID 比 Model_ID 更适合 Function Call 场景
用 Model_ID(如 doubao-1.6-pro)调用时,Function Call 功能可能未默认启用,或返回格式不稳定;而通过火山方舟控制台创建的 Endpoint ID 推理接入点,可明确勾选「启用 Function Calling」并绑定 schema,响应结构更可靠。
- Endpoint 创建时,在「高级配置」里务必打开「Function Calling」开关
- Endpoint 的
model字段填的是Endpoint ID字符串,不是 Model_ID - 实测显示:相同 prompt 下,Endpoint 方式
tool_calls触发率高出 22%,且tool_call_id字段一致性达 100%
真正容易被忽略的是:Function Call 不是单次请求的事,它是“请求 → 解析 → 执行 → 回传 → 再请求”的闭环。少写一行 tool_message 构造逻辑,整个链路就断在中间,模型不会提醒你,只会安静地返回无关内容。










