跳到主要内容

构建 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 的输出。

相关

  • 快速开始 — 用任意 SDK 发出第一个请求
  • API 参考 — 所有格式的端点、鉴权与流式传输
  • IDE 集成 — 把密钥接入 Cursor、Codex、Claude Code 等
  • 模型 — 模型 id、上下文窗口与价格
  • 客户控制台 — 创建 API 密钥,开始构建