OhMyGPT

工具调用

在 Chat Completions、Responses 或 Anthropic Messages 上让模型调用你的函数。

你在请求里描述自己的函数。模型需要用某个函数时,不会直接给出最终回答,而是返回函数名和 JSON 参数。你的代码执行函数、把结果发回去,模型再接着回答。模型自己从不执行任何东西。

工具只需按你正在用的端点格式写一次:Chat Completions、Responses 或 Anthropic Messages。同一套定义适用于该端点上的所有模型,所以把一段工具调用循环从 GPT 换到 Claude 或 GLM,只需改一行模型名。整个循环都可以用 ohmygpt/mock 免费测试。

Chat Completions

1. 发送工具定义

curl https://api.ohmygpt.com/v1/chat/completions \
  -H "Authorization: Bearer $OHMYGPT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-5.4-nano",
    "messages": [{"role": "user", "content": "What is the weather in Paris?"}],
    "tools": [{
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "Get the current weather for a city.",
        "parameters": {
          "type": "object",
          "properties": {"city": {"type": "string"}},
          "required": ["city"]
        }
      }
    }]
  }'

模型返回 finish_reason: "tool_calls",以及它要发起的调用(节选):

{
  "choices": [
    {
      "index": 0,
      "finish_reason": "tool_calls",
      "message": {
        "role": "assistant",
        "content": null,
        "tool_calls": [
          {
            "id": "call_wwN71lk5akb6aFGYQv9f234b",
            "type": "function",
            "function": { "name": "get_weather", "arguments": "{\"city\":\"Paris\"}" }
          }
        ]
      }
    }
  ]
}

arguments 是 JSON 字符串,使用前先解析。

2. 回传结果

先把 assistant 消息原样追加到对话里,再为每个调用追加一条 tool 消息,带上对应的 tool_call_id,然后带着同样的 tools 重新发送整段对话。Python 完整示例:

import json
import os

from openai import OpenAI

client = OpenAI(api_key=os.environ["OHMYGPT_API_KEY"], base_url="https://api.ohmygpt.com/v1")

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Get the current weather for a city.",
            "parameters": {
                "type": "object",
                "properties": {"city": {"type": "string", "description": "City name, e.g. Paris"}},
                "required": ["city"],
            },
        },
    }
]


def get_weather(city: str) -> dict:
    return {"city": city, "temperature_c": 18, "condition": "cloudy"}


messages = [{"role": "user", "content": "What's the weather in Paris?"}]

response = client.chat.completions.create(model="openai/gpt-5.4-nano", messages=messages, tools=tools)
message = response.choices[0].message
messages.append(message)

for call in message.tool_calls or []:
    args = json.loads(call.function.arguments)
    messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(get_weather(**args))})

final = client.chat.completions.create(model="openai/gpt-5.4-nano", messages=messages, tools=tools)
print(final.choices[0].message.content)
In **Paris**, it’s currently **cloudy** with a temperature of **18°C**.

同一段程序把模型换成 model="anthropic/claude-haiku-4-5",输出为 The weather in Paris is currently **cloudy** with a temperature of **18°C** (about 64°F).

控制工具调用

tool_choice效果
"auto"(默认)由模型决定是否调用工具
"none"模型直接用文本回答
"required"模型必须至少调用一个工具
{"type": "function", "function": {"name": "get_time"}}模型必须调用 get_time

免费测试整个循环

ohmygpt/mock 的回答是确定的。请求里带有工具时,它会调用第一个工具(或 tool_choice 指定的那个),所有必填参数都填对应类型的零值;收到工具结果后,再回复一段文本。把上面第一个请求的模型换成 "model": "ohmygpt/mock",返回:

{
  "id": "chatcmpl-ohmygpt-mock",
  "object": "chat.completion",
  "model": "mock",
  "choices": [
    {
      "index": 0,
      "finish_reason": "tool_calls",
      "message": {
        "role": "assistant",
        "content": null,
        "tool_calls": [
          {
            "id": "call_mock_1",
            "type": "function",
            "function": { "name": "get_weather", "arguments": "{\"city\":\"\"}" }
          }
        ]
      }
    }
  ],
  "usage": { "prompt_tokens": 73, "completion_tokens": 8, "total_tokens": 81 }
}

账户完成充值后即可使用 mock 模型。

Responses

工具定义是扁平的(name 和 parameters 与 type 并列)。模型的调用以 function_call 条目出现在 output 里;把结果作为 function_call_output 条目发回,并带上相同的 call_id:

curl https://api.ohmygpt.com/v1/responses \
  -H "Authorization: Bearer $OHMYGPT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "ohmygpt/mock",
    "input": [
      {"role": "user", "content": "What is the weather in Paris?"},
      {"type": "function_call", "call_id": "call_mock_1", "name": "get_weather", "arguments": "{\"city\":\"Paris\"}"},
      {"type": "function_call_output", "call_id": "call_mock_1", "output": "{\"temperature_c\":18,\"condition\":\"cloudy\"}"}
    ],
    "tools": [{
      "type": "function",
      "name": "get_weather",
      "description": "Get the current weather for a city.",
      "parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]}
    }]
  }'

第一轮返回的 output 条目如下:

{ "type": "function_call", "id": "fc_0", "call_id": "call_mock_1", "name": "get_weather", "arguments": "{\"city\":\"\"}", "status": "completed" }

Anthropic Messages

工具定义使用 input_schema。模型的调用是一个 tool_use 内容块,同时返回 stop_reason: "tool_use";在下一条 user 消息里用 tool_result 块发回结果,并带上相同的 ID:

curl https://api.ohmygpt.com/v1/messages \
  -H "x-api-key: $OHMYGPT_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "ohmygpt/mock",
    "max_tokens": 1024,
    "messages": [
      {"role": "user", "content": "What is the weather in Paris?"},
      {"role": "assistant", "content": [{"type": "tool_use", "id": "call_mock_1", "name": "get_weather", "input": {"city": "Paris"}}]},
      {"role": "user", "content": [{"type": "tool_result", "tool_use_id": "call_mock_1", "content": "{\"temperature_c\":18,\"condition\":\"cloudy\"}"}]}
    ],
    "tools": [{
      "name": "get_weather",
      "description": "Get the current weather for a city.",
      "input_schema": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]}
    }]
  }'

第一轮返回的内容块如下:

{ "type": "tool_use", "id": "call_mock_1", "name": "get_weather", "input": { "city": "" } }

流式输出

设置 "stream": true 后,调用会分段到达:先是函数名,然后是一段段字符串形式的参数片段(Chat Completions 上是 tool_calls[].function.arguments 增量,Responses 上是 response.function_call_arguments.delta 事件,Messages 上是 input_json_delta 事件)。把片段拼接起来,等流结束后再解析 JSON。

本页目录