工具调用(也叫函数调用)是把对话模型变成 agent 的关键。你描述模型可调用的函数,它决定何时调用、传什么参数,你的代码执行,结果再回给模型。DeepSeek V4 和 GLM-5.1 都支持标准 OpenAI tools 接口,所以你已经会的套路原样能用。
定义一个工具
import json, os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["TURILOOP_API_KEY"],
base_url="https://api.turiloop.com/v1",
)
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询某城市当前天气",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
},
}]工具调用循环
def run(user_msg: str) -> str:
messages = [{"role": "user", "content": user_msg}]
r = client.chat.completions.create(
model="deepseek-v4-pro",
messages=messages,
tools=tools,
)
msg = r.choices[0].message
if msg.tool_calls:
messages.append(msg)
for call in msg.tool_calls:
args = json.loads(call.function.arguments)
result = get_weather(args["city"]) # 你的真实函数
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": json.dumps(result),
})
r = client.chat.completions.create(
model="deepseek-v4-pro", messages=messages, tools=tools,
)
return r.choices[0].message.content
return msg.content这就是完整 agent 循环:你提问,模型请求工具,你执行,把结果喂回,模型作答。
选模型
- GLM-5.1 是工具密集型 agent 循环里又强又便宜的默认。把
model改成"glm-5.1"即可。 - DeepSeek V4-Pro:当 agent 在工具调用之间需要更难的推理时。
- Kimi K2.6:当 agent 带一大段稳定上下文时(它的缓存定价让重复的 system prompt 很便宜)。
实用建议
- 工具描述要精确无歧义。模型就靠它来判断何时调用。
- 执行前校验参数;模型偶尔会产出畸形 JSON。
- 给循环设上限,防止一个糊涂的 agent 无限打转。
三款模型都在 Turiloop 一个 OpenAI 兼容的 Key 背后,你可以改一个字符串就在 DeepSeek、GLM、Kimi 上 A/B 同一个 agent。按量付费、国际卡。