构建 Agent
要自己构建 agent——而不只是接入 IDE?Drawbridge 在每个密钥上都返回原生工具调用,所以「调用模型 → 工具调用 → 执行 → 回灌结果 → 循环」这套流程,用你已有的任意 SDK 都能跑通。本页讲清:该选哪种 API 模式、循环本身怎么写,以及如何迁移已有的 OpenAI 或 Anthropic agent。
我该用哪种 API 模式?
三种格式都会自动返回原生工具调用——Drawbridge 会把任何带工具定义的请求路由到能返回原生工具调用的通道。所以按你已有的 SDK 来选,而不是按能力来选:三者能力完全一致。
| 你在用…… | 端点 | Base URL |
|---|---|---|
| OpenAI SDK / OpenAI 生态的 agent 框架 | /v1/chat/completions | .../v1 |
| Codex / OpenAI Responses 风格的 agent | /v1/responses | .../v1 |
| Anthropic SDK / Claude 生态的 agent | /v1/messages | ...(无 /v1) |
一个密钥,一个价格。 你不需要选择工具模式,也不需要切换密钥。发送工具定义就会拿到原生工具调用;发送纯对话就拿到文本。两种情况用的是同一个密钥、同一个模型 id、同一个按 token 计价。
构建 agent 循环
agent 本质上就是一个循环:带着工具定义调用模型,执行它请求的任何工具,把结果回灌,然后重复,直到它不再请求工具。两种 SDK 的形态一致——只是消息历史的格式不同。
from openai import OpenAI
import json
client = OpenAI(base_url="https://api.drawbridge-tech.com/v1", api_key="sk-...")
tools = [{
"type": "function",
"function": {
"name": "write_file",
"description": "Write text content to a file.",
"parameters": {
"type": "object",
"properties": {"path": {"type": "string"}, "content": {"type": "string"}},
"required": ["path", "content"],
},
},
}]
messages = [{"role": "user", "content": "Create proof.txt containing OK."}]
while True:
resp = client.chat.completions.create(model="smart", messages=messages, tools=tools)
msg = resp.choices[0].message
if not msg.tool_calls:
break # model is done
messages.append(msg) # echo the assistant turn (with its tool_calls)
for call in msg.tool_calls:
args = json.loads(call.function.arguments)
result = run_tool(call.function.name, args) # you execute it
# feed the result back as a "tool" message keyed by tool_call_id
messages.append({"role": "tool", "tool_call_id": call.id, "content": result})最容易踩的坑: 把每个工具结果回灌时,必须和它所回应的那次调用对应起来——用带匹配 tool_call_id 的 role:"tool" 消息(OpenAI),或带匹配 tool_use_id 的 tool_result 块(Anthropic)。再次调用前,先回显 assistant 那一轮,再附上结果。
从 OpenAI 或 Anthropic 迁移
已经在官方 OpenAI 或 Anthropic API 上有 agent 了?这几乎是无缝替换:改一下 base URL 和密钥,换一下模型 id,其余代码保持不变——工具、流式、消息处理都照旧。
from openai import OpenAI
client = OpenAI(
- base_url="https://api.openai.com/v1",
- api_key="sk-openai-...",
+ base_url="https://api.drawbridge-tech.com/v1",
+ api_key="sk-drawbridge-...",
)
# model -> "smart" or a Claude id like "claude-opus-4-8"
# everything else (tools, streaming, messages) stays the same无法沿用的部分:厂商专属的模型 id——请用 smart 或像 claude-opus-4-8 这样的 Claude id,而不是 gpt-4o。另外,推理/思考内容不会返回,所以不要在循环里依赖推理轨迹。
构建 agent 时要注意的事项
- 没有推理轨迹。 思考/推理内容不会返回。工具循环完全可用——只是别写依赖某个思维链字段的逻辑。
- 用量 token 由 credit 推导。 用量块里的 token 数是与计费自洽的数值,而非真实 token 计数。把它用于成本核算,而不是精确的上下文窗口计算。
- 工具请求会干净地失败,绝不静默降级。 如果带工具的请求无法以原生方式服务,你会拿到一个干净的错误——而不是一段伪装成工具结果的纯文本。把 5xx 当作重试信号,而不是 agent 的输出。