All guides
Claude

严格工具使用

Checked 09/15/2026View original

AI translation, not an official translation. Refer to the original for technical details.

On this page

在工具定义上设置 strict: true 可通过将模型的令牌采样约束为符合 Schema 的输出(一种称为语法约束采样的技术),保证 Claude 的工具输入与您的 JSON Schema 匹配。本页介绍严格模式对 Agent 的重要性、如何启用它以及常见用例。有关支持的 JSON Schema 子集,请参阅 JSON Schema 限制。有关非严格 Schema 的指导,请参阅定义工具

严格工具使用可验证工具参数,确保 Claude 使用正确类型的参数调用您的函数。当您需要以下操作时,请使用严格工具使用:

  • 验证工具参数
  • 构建 Agentic 工作流
  • 确保类型安全的函数调用
  • 处理具有嵌套属性的复杂工具

严格工具使用对 Agent 的重要性

构建可靠的 Agentic 系统需要有保障的 Schema 一致性。如果没有严格模式,Claude 可能返回不兼容的类型("2" 而非 2)或省略必填字段,从而破坏您的函数并导致运行时错误。

严格工具使用保证类型安全的参数:

  • 函数每次都能接收到正确类型的参数
  • 无需验证并重试工具调用
  • 可在规模化场景中稳定运行的生产就绪 Agent

例如,假设预订系统需要 passengers: int。在没有严格模式的情况下,Claude 可能提供 passengers: "two"passengers: "2"。使用 strict: true 后,响应中始终包含 passengers: 2

快速入门

ant messages create --transform content <<'YAML'
model: claude-opus-5
max_tokens: 1024
messages:
  - role: user
    content: What is the weather in San Francisco?
tools:
  - name: get_weather
    description: Get the current weather in a given location
    strict: true
    input_schema:
      type: object
      properties:
        location:
          type: string
          description: The city and state, e.g. San Francisco, CA
        unit:
          type: string
          enum: [celsius, fahrenheit]
      required: [location]
      additionalProperties: false
YAML
client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-opus-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "What's the weather like in San Francisco?"}],
    tools=[
        {
            "name": "get_weather",
            "description": "Get the current weather in a given location",
            "strict": True,  # Enable strict mode
            "input_schema": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city and state, e.g. San Francisco, CA",
                    },
                    "unit": {
                        "type": "string",
                        "enum": ["celsius", "fahrenheit"],
                        "description": "The unit of temperature, either 'celsius' or 'fahrenheit'",
                    },
                },
                "required": ["location"],
                "additionalProperties": False,
            },
        }
    ],
)
print(response.content)
const client = new Anthropic({
  apiKey: process.env.ANTHROPIC_API_KEY
});

const response = await client.messages.create({
  model: "claude-opus-5",
  max_tokens: 1024,
  messages: [
    {
      role: "user",
      content: "What's the weather like in San Francisco?"
    }
  ],
  tools: [
    {
      name: "get_weather",
      description: "Get the current weather in a given location",
      strict: true, // Enable strict mode
      input_schema: {
        type: "object",
        properties: {
          location: {
            type: "string",
            description: "The city and state, e.g. San Francisco, CA"
          },
          unit: {
            type: "string",
            enum: ["celsius", "fahrenheit"]
          }
        },
        required: ["location"],
        additionalProperties: false
      }
    }
  ]
});
console.log(response.content);
using System.Text.Json;
using Anthropic;
using Anthropic.Models.Messages;

AnthropicClient client = new();

var parameters = new MessageCreateParams
{
    Model = Model.ClaudeOpus5,
    MaxTokens = 1024,
    Messages = [new() { Role = Role.User, Content = "What's the weather like in San Francisco?" }],
    Tools = [
        new ToolUnion(new Tool()
        {
            Name = "get_weather",
            Description = "Get the current weather in a given location",
            Strict = true,
            InputSchema = new InputSchema(new Dictionary<string, JsonElement>
            {
                ["properties"] = JsonSerializer.SerializeToElement(new Dictionary<string, object>
                {
                    ["location"] = new { type = "string", description = "The city and state, e.g. San Francisco, CA" },
                    ["unit"] = new { type = "string", @enum = new[] { "celsius", "fahrenheit" } },
                }),
                ["required"] = JsonSerializer.SerializeToElement(new[] { "location" }),
                ["additionalProperties"] = JsonSerializer.SerializeToElement(false),
            }),
        }),
    ]
};

var message = await client.Messages.Create(parameters);
Console.WriteLine(message);
client := anthropic.NewClient()

response, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
	Model:     anthropic.ModelClaudeOpus5,
	MaxTokens: 1024,
	Messages: []anthropic.MessageParam{
		anthropic.NewUserMessage(anthropic.NewTextBlock("What's the weather like in San Francisco?")),
	},
	Tools: []anthropic.ToolUnionParam{
		{OfTool: &anthropic.ToolParam{
			Name:        "get_weather",
			Description: anthropic.String("Get the current weather in a given location"),
			Strict:      anthropic.Bool(true),
			InputSchema: anthropic.ToolInputSchemaParam{
				Properties: map[string]any{
					"location": map[string]any{
						"type":        "string",
						"description": "The city and state, e.g. San Francisco, CA",
					},
					"unit": map[string]any{
						"type": "string",
						"enum": []string{"celsius", "fahrenheit"},
					},
				},
				Required: []string{"location"},
				ExtraFields: map[string]any{
					"additionalProperties": false,
				},
			}}},
	},
})
if err != nil {
	log.Fatal(err)
}
fmt.Println(response.Content)
AnthropicClient client = AnthropicOkHttpClient.fromEnv();

InputSchema schema = InputSchema.builder()
    .properties(
        JsonValue.from(
            Map.of(
                "location", Map.of(
                    "type", "string",
                    "description", "The city and state, e.g. San Francisco, CA"
                ),
                "unit", Map.of(
                    "type", "string",
                    "enum", List.of("celsius", "fahrenheit")
                )
            )
        )
    )
    .putAdditionalProperty("required", JsonValue.from(List.of("location")))
    .putAdditionalProperty("additionalProperties", JsonValue.from(false))
    .build();

MessageCreateParams params = MessageCreateParams.builder()
    .model(Model.CLAUDE_OPUS_5)
    .maxTokens(1024L)
    .addUserMessage("What's the weather like in San Francisco?")
    .addTool(
        Tool.builder()
            .name("get_weather")
            .description("Get the current weather in a given location")
            .strict(true)
            .inputSchema(schema)
            .build()
    )
    .build();

Message response = client.messages().create(params);
IO.println(response.content());
$client = new Client();

$message = $client->messages->create(
    maxTokens: 1024,
    messages: [
        ['role' => 'user', 'content' => "What's the weather like in San Francisco?"]
    ],
    model: 'claude-opus-5',
    tools: [
        [
            'name' => 'get_weather',
            'description' => 'Get the current weather in a given location',
            'strict' => true,
            'input_schema' => [
                'type' => 'object',
                'properties' => [
                    'location' => [
                        'type' => 'string',
                        'description' => 'The city and state, e.g. San Francisco, CA'
                    ],
                    'unit' => [
                        'type' => 'string',
                        'enum' => ['celsius', 'fahrenheit']
                    ]
                ],
                'required' => ['location'],
                'additionalProperties' => false
            ]
        ]
    ],
);

echo $message;
client = Anthropic::Client.new

message = client.messages.create(
  model: "claude-opus-5",
  max_tokens: 1024,
  messages: [
    { role: "user", content: "What's the weather like in San Francisco?" }
  ],
  tools: [
    {
      name: "get_weather",
      description: "Get the current weather in a given location",
      strict: true,
      input_schema: {
        type: "object",
        properties: {
          location: {
            type: "string",
            description: "The city and state, e.g. San Francisco, CA"
          },
          unit: {
            type: "string",
            enum: ["celsius", "fahrenheit"]
          }
        },
        required: ["location"],
        additionalProperties: false
      }
    }
  ]
)
puts message.content

响应格式: 包含已验证输入的工具使用块,位于 response.content[x].input

{
  "type": "tool_use",
  "name": "get_weather",
  "input": {
    "location": "San Francisco, CA"
  }
}

保证:

  • 工具 input 严格遵循 input_schema
  • 工具 name 始终有效(来自提供的工具或服务器工具)

工作原理

计算机使用浏览器使用工具集条目(computer_toolset_20260801browser_toolset_20260801)不接受 strict: true;在任一条目上设置该属性的请求将被拒绝。

常见用例

<CodeGroup>
  ```bash cURL
  curl https://api.anthropic.com/v1/messages \
    -H "content-type: application/json" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -d '{
      "model": "claude-opus-5",
      "max_tokens": 1024,
      "messages": [
        {"role": "user", "content": "Search for flights to Tokyo departing June 1, 2026"}
      ],
      "tools": [{
        "name": "search_flights",
        "strict": true,
        "input_schema": {
          "type": "object",
          "properties": {
            "destination": {"type": "string"},
            "departure_date": {"type": "string", "format": "date"},
            "passengers": {"type": "integer", "enum": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}
          },
          "required": ["destination", "departure_date"],
          "additionalProperties": false
        }
      }]
    }'
  ```

  ```bash CLI
  ant messages create <<'YAML'
  model: claude-opus-5
  max_tokens: 1024
  messages:
    - role: user
      content: Search for flights to Tokyo departing June 1, 2026
  tools:
    - name: search_flights
      strict: true
      input_schema:
        type: object
        properties:
          destination:
            type: string
          departure_date:
            type: string
            format: date
          passengers:
            type: integer
            enum: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        required: [destination, departure_date]
        additionalProperties: false
  YAML
  ```

  ```python Python
  client = Anthropic()
  response = client.messages.create(
      model="claude-opus-5",
      max_tokens=1024,
      messages=[
          {
              "role": "user",
              "content": "Search for flights to Tokyo departing June 1, 2026",
          }
      ],
      tools=[
          {
              "name": "search_flights",
              "strict": True,
              "input_schema": {
                  "type": "object",
                  "properties": {
                      "destination": {"type": "string"},
                      "departure_date": {"type": "string", "format": "date"},
                      "passengers": {
                          "type": "integer",
                          "enum": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
                      },
                  },
                  "required": ["destination", "departure_date"],
                  "additionalProperties": False,
              },
          }
      ],
  )

  print(response)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const searchFlightsTool: Anthropic.Tool = {
    name: "search_flights",
    strict: true,
    input_schema: {
      type: "object",
      properties: {
        destination: { type: "string" },
        departure_date: { type: "string", format: "date" },
        passengers: { type: "integer", enum: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] }
      },
      required: ["destination", "departure_date"],
      additionalProperties: false
    }
  };

  const response = await client.messages.create({
    model: "claude-opus-5",
    max_tokens: 1024,
    messages: [{ role: "user", content: "Search for flights to Tokyo departing June 1, 2026" }],
    tools: [searchFlightsTool]
  });

  console.log(response);
  ```

  ```csharp C#
  using System.Text.Json;
  using Anthropic;
  using Anthropic.Models.Messages;

  AnthropicClient client = new();

  var parameters = new MessageCreateParams
  {
      Model = Model.ClaudeOpus5,
      MaxTokens = 1024,
      Messages = [new() { Role = Role.User, Content = "Search for flights to Tokyo departing June 1, 2026" }],
      Tools = [
          new ToolUnion(new Tool()
          {
              Name = "search_flights",
              Strict = true,
              InputSchema = new InputSchema(new Dictionary<string, JsonElement>
              {
                  ["properties"] = JsonSerializer.SerializeToElement(new Dictionary<string, object>
                  {
                      ["destination"] = new { type = "string" },
                      ["departure_date"] = new { type = "string", format = "date" },
                      ["passengers"] = new { type = "integer", @enum = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } },
                  }),
                  ["required"] = JsonSerializer.SerializeToElement(new[] { "destination", "departure_date" }),
                  ["additionalProperties"] = JsonSerializer.SerializeToElement(false),
              }),
          }),
      ]
  };

  var message = await client.Messages.Create(parameters);
  Console.WriteLine(message);
  ```

  ```go Go
  client := anthropic.NewClient()

  response, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
  	Model:     anthropic.ModelClaudeOpus5,
  	MaxTokens: 1024,
  	Messages: []anthropic.MessageParam{
  		anthropic.NewUserMessage(anthropic.NewTextBlock("Search for flights to Tokyo departing June 1, 2026")),
  	},
  	Tools: []anthropic.ToolUnionParam{
  		{OfTool: &anthropic.ToolParam{
  			Name:   "search_flights",
  			Strict: anthropic.Bool(true),
  			InputSchema: anthropic.ToolInputSchemaParam{
  				Properties: map[string]any{
  					"destination": map[string]any{
  						"type": "string",
  					},
  					"departure_date": map[string]any{
  						"type":   "string",
  						"format": "date",
  					},
  					"passengers": map[string]any{
  						"type": "integer",
  						"enum": []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
  					},
  				},
  				Required: []string{"destination", "departure_date"},
  				ExtraFields: map[string]any{
  					"additionalProperties": false,
  				},
  			}}},
  	},
  })
  if err != nil {
  	log.Fatal(err)
  }
  fmt.Println(response.RawJSON())
  ```

  ```java Java
  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

  InputSchema schema = InputSchema.builder()
      .properties(
          JsonValue.from(
              Map.of(
                  "destination", Map.of("type", "string"),
                  "departure_date", Map.of("type", "string", "format", "date"),
                  "passengers", Map.of(
                      "type", "integer",
                      "enum", List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
                  )
              )
          )
      )
      .putAdditionalProperty("required", JsonValue.from(List.of("destination", "departure_date")))
      .putAdditionalProperty("additionalProperties", JsonValue.from(false))
      .build();

  MessageCreateParams params = MessageCreateParams.builder()
      .model(Model.CLAUDE_OPUS_5)
      .maxTokens(1024L)
      .addUserMessage("Search for flights to Tokyo departing June 1, 2026")
      .addTool(
          Tool.builder()
              .name("search_flights")
              .strict(true)
              .inputSchema(schema)
              .build()
      )
      .build();

  Message response = client.messages().create(params);
  IO.println(response);
  ```

  ```php PHP
  $client = new Client();

  $message = $client->messages->create(
      maxTokens: 1024,
      messages: [
          ['role' => 'user', 'content' => 'Search for flights to Tokyo departing June 1, 2026']
      ],
      model: 'claude-opus-5',
      tools: [
          [
              'name' => 'search_flights',
              'strict' => true,
              'input_schema' => [
                  'type' => 'object',
                  'properties' => [
                      'destination' => ['type' => 'string'],
                      'departure_date' => ['type' => 'string', 'format' => 'date'],
                      'passengers' => [
                          'type' => 'integer',
                          'enum' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
                      ]
                  ],
                  'required' => ['destination', 'departure_date'],
                  'additionalProperties' => false
              ]
          ]
      ],
  );

  echo $message;
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  message = client.messages.create(
    model: "claude-opus-5",
    max_tokens: 1024,
    messages: [
      { role: "user", content: "Search for flights to Tokyo departing June 1, 2026" }
    ],
    tools: [
      {
        name: "search_flights",
        strict: true,
        input_schema: {
          type: "object",
          properties: {
            destination: { type: "string" },
            departure_date: { type: "string", format: "date" },
            passengers: {
              type: "integer",
              enum: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
            }
          },
          required: ["destination", "departure_date"],
          additionalProperties: false
        }
      }
    ]
  )
  puts message
  ```
</CodeGroup>
<CodeGroup>
  ```bash cURL
  curl https://api.anthropic.com/v1/messages \
    -H "content-type: application/json" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -d '{
      "model": "claude-opus-5",
      "max_tokens": 1024,
      "messages": [
        {"role": "user", "content": "Help me plan a trip from New York to Paris for 2 people, departing June 1, 2026"}
      ],
      "tools": [
        {
          "name": "search_flights",
          "strict": true,
          "input_schema": {
            "type": "object",
            "properties": {
              "origin": {"type": "string"},
              "destination": {"type": "string"},
              "departure_date": {"type": "string", "format": "date"},
              "travelers": {"type": "integer", "enum": [1, 2, 3, 4, 5, 6]}
            },
            "required": ["origin", "destination", "departure_date"],
            "additionalProperties": false
          }
        },
        {
          "name": "search_hotels",
          "strict": true,
          "input_schema": {
            "type": "object",
            "properties": {
              "city": {"type": "string"},
              "check_in": {"type": "string", "format": "date"},
              "guests": {"type": "integer", "enum": [1, 2, 3, 4]}
            },
            "required": ["city", "check_in"],
            "additionalProperties": false
          }
        }
      ]
    }'
  ```

  ```bash CLI
  ant messages create <<'YAML'
  model: claude-opus-5
  max_tokens: 1024
  messages:
    - role: user
      content: >-
        Help me plan a trip from New York to Paris for 2 people,
        departing June 1, 2026
  tools:
    - name: search_flights
      strict: true
      input_schema:
        type: object
        properties:
          origin: {type: string}
          destination: {type: string}
          departure_date: {type: string, format: date}
          travelers: {type: integer, enum: [1, 2, 3, 4, 5, 6]}
        required: [origin, destination, departure_date]
        additionalProperties: false
    - name: search_hotels
      strict: true
      input_schema:
        type: object
        properties:
          city: {type: string}
          check_in: {type: string, format: date}
          guests: {type: integer, enum: [1, 2, 3, 4]}
        required: [city, check_in]
        additionalProperties: false
  YAML
  ```

  ```python Python
  client = Anthropic()
  response = client.messages.create(
      model="claude-opus-5",
      max_tokens=1024,
      messages=[
          {
              "role": "user",
              "content": "Help me plan a trip from New York to Paris for 2 people, departing June 1, 2026",
          }
      ],
      tools=[
          {
              "name": "search_flights",
              "strict": True,
              "input_schema": {
                  "type": "object",
                  "properties": {
                      "origin": {"type": "string"},
                      "destination": {"type": "string"},
                      "departure_date": {"type": "string", "format": "date"},
                      "travelers": {"type": "integer", "enum": [1, 2, 3, 4, 5, 6]},
                  },
                  "required": ["origin", "destination", "departure_date"],
                  "additionalProperties": False,
              },
          },
          {
              "name": "search_hotels",
              "strict": True,
              "input_schema": {
                  "type": "object",
                  "properties": {
                      "city": {"type": "string"},
                      "check_in": {"type": "string", "format": "date"},
                      "guests": {"type": "integer", "enum": [1, 2, 3, 4]},
                  },
                  "required": ["city", "check_in"],
                  "additionalProperties": False,
              },
          },
      ],
  )

  print(response)
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const tools: Anthropic.Tool[] = [
    {
      name: "search_flights",
      strict: true,
      input_schema: {
        type: "object",
        properties: {
          origin: { type: "string" },
          destination: { type: "string" },
          departure_date: { type: "string", format: "date" },
          travelers: { type: "integer", enum: [1, 2, 3, 4, 5, 6] }
        },
        required: ["origin", "destination", "departure_date"],
        additionalProperties: false
      }
    },
    {
      name: "search_hotels",
      strict: true,
      input_schema: {
        type: "object",
        properties: {
          city: { type: "string" },
          check_in: { type: "string", format: "date" },
          guests: { type: "integer", enum: [1, 2, 3, 4] }
        },
        required: ["city", "check_in"],
        additionalProperties: false
      }
    }
  ];

  const response = await client.messages.create({
    model: "claude-opus-5",
    max_tokens: 1024,
    messages: [
      {
        role: "user",
        content:
          "Help me plan a trip from New York to Paris for 2 people, departing June 1, 2026"
      }
    ],
    tools: tools
  });

  console.log(response);
  ```

  ```csharp C#
  using System.Text.Json;
  using Anthropic;
  using Anthropic.Models.Messages;

  AnthropicClient client = new();

  var parameters = new MessageCreateParams
  {
      Model = Model.ClaudeOpus5,
      MaxTokens = 1024,
      Messages = [new() { Role = Role.User, Content = "Help me plan a trip from New York to Paris for 2 people, departing June 1, 2026" }],
      Tools = [
          new ToolUnion(new Tool()
          {
              Name = "search_flights",
              Strict = true,
              InputSchema = new InputSchema(new Dictionary<string, JsonElement>
              {
                  ["properties"] = JsonSerializer.SerializeToElement(new Dictionary<string, object>
                  {
                      ["origin"] = new { type = "string" },
                      ["destination"] = new { type = "string" },
                      ["departure_date"] = new { type = "string", format = "date" },
                      ["travelers"] = new { type = "integer", @enum = new[] { 1, 2, 3, 4, 5, 6 } },
                  }),
                  ["required"] = JsonSerializer.SerializeToElement(new[] { "origin", "destination", "departure_date" }),
                  ["additionalProperties"] = JsonSerializer.SerializeToElement(false),
              }),
          }),
          new ToolUnion(new Tool()
          {
              Name = "search_hotels",
              Strict = true,
              InputSchema = new InputSchema(new Dictionary<string, JsonElement>
              {
                  ["properties"] = JsonSerializer.SerializeToElement(new Dictionary<string, object>
                  {
                      ["city"] = new { type = "string" },
                      ["check_in"] = new { type = "string", format = "date" },
                      ["guests"] = new { type = "integer", @enum = new[] { 1, 2, 3, 4 } },
                  }),
                  ["required"] = JsonSerializer.SerializeToElement(new[] { "city", "check_in" }),
                  ["additionalProperties"] = JsonSerializer.SerializeToElement(false),
              }),
          }),
      ]
  };

  var message = await client.Messages.Create(parameters);
  Console.WriteLine(message);
  ```

  ```go Go
  client := anthropic.NewClient()

  response, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
  	Model:     anthropic.ModelClaudeOpus5,
  	MaxTokens: 1024,
  	Messages: []anthropic.MessageParam{
  		anthropic.NewUserMessage(anthropic.NewTextBlock("Help me plan a trip from New York to Paris for 2 people, departing June 1, 2026")),
  	},
  	Tools: []anthropic.ToolUnionParam{
  		{OfTool: &anthropic.ToolParam{
  			Name:   "search_flights",
  			Strict: anthropic.Bool(true),
  			InputSchema: anthropic.ToolInputSchemaParam{
  				Properties: map[string]any{
  					"origin":         map[string]any{"type": "string"},
  					"destination":    map[string]any{"type": "string"},
  					"departure_date": map[string]any{"type": "string", "format": "date"},
  					"travelers":      map[string]any{"type": "integer", "enum": []int{1, 2, 3, 4, 5, 6}},
  				},
  				Required: []string{"origin", "destination", "departure_date"},
  				ExtraFields: map[string]any{
  					"additionalProperties": false,
  				},
  			}}},
  		{OfTool: &anthropic.ToolParam{
  			Name:   "search_hotels",
  			Strict: anthropic.Bool(true),
  			InputSchema: anthropic.ToolInputSchemaParam{
  				Properties: map[string]any{
  					"city":     map[string]any{"type": "string"},
  					"check_in": map[string]any{"type": "string", "format": "date"},
  					"guests":   map[string]any{"type": "integer", "enum": []int{1, 2, 3, 4}},
  				},
  				Required: []string{"city", "check_in"},
  				ExtraFields: map[string]any{
  					"additionalProperties": false,
  				},
  			}}},
  	},
  })
  if err != nil {
  	log.Fatal(err)
  }
  fmt.Println(response.RawJSON())
  ```

  ```java Java
  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

  InputSchema flightsSchema = InputSchema.builder()
      .properties(
          JsonValue.from(
              Map.of(
                  "origin", Map.of("type", "string"),
                  "destination", Map.of("type", "string"),
                  "departure_date", Map.of("type", "string", "format", "date"),
                  "travelers", Map.of("type", "integer", "enum", List.of(1, 2, 3, 4, 5, 6))
              )
          )
      )
      .putAdditionalProperty("required", JsonValue.from(List.of("origin", "destination", "departure_date")))
      .putAdditionalProperty("additionalProperties", JsonValue.from(false))
      .build();

  InputSchema hotelsSchema = InputSchema.builder()
      .properties(
          JsonValue.from(
              Map.of(
                  "city", Map.of("type", "string"),
                  "check_in", Map.of("type", "string", "format", "date"),
                  "guests", Map.of("type", "integer", "enum", List.of(1, 2, 3, 4))
              )
          )
      )
      .putAdditionalProperty("required", JsonValue.from(List.of("city", "check_in")))
      .putAdditionalProperty("additionalProperties", JsonValue.from(false))
      .build();

  MessageCreateParams params = MessageCreateParams.builder()
      .model(Model.CLAUDE_OPUS_5)
      .maxTokens(1024L)
      .addUserMessage("Help me plan a trip from New York to Paris for 2 people, departing June 1, 2026")
      .addTool(
          Tool.builder()
              .name("search_flights")
              .strict(true)
              .inputSchema(flightsSchema)
              .build()
      )
      .addTool(
          Tool.builder()
              .name("search_hotels")
              .strict(true)
              .inputSchema(hotelsSchema)
              .build()
      )
      .build();

  Message response = client.messages().create(params);
  IO.println(response);
  ```

  ```php PHP
  $client = new Client();

  $message = $client->messages->create(
      maxTokens: 1024,
      messages: [
          ['role' => 'user', 'content' => 'Help me plan a trip from New York to Paris for 2 people, departing June 1, 2026']
      ],
      model: 'claude-opus-5',
      tools: [
          [
              'name' => 'search_flights',
              'strict' => true,
              'input_schema' => [
                  'type' => 'object',
                  'properties' => [
                      'origin' => ['type' => 'string'],
                      'destination' => ['type' => 'string'],
                      'departure_date' => ['type' => 'string', 'format' => 'date'],
                      'travelers' => ['type' => 'integer', 'enum' => [1, 2, 3, 4, 5, 6]]
                  ],
                  'required' => ['origin', 'destination', 'departure_date'],
                  'additionalProperties' => false
              ]
          ],
          [
              'name' => 'search_hotels',
              'strict' => true,
              'input_schema' => [
                  'type' => 'object',
                  'properties' => [
                      'city' => ['type' => 'string'],
                      'check_in' => ['type' => 'string', 'format' => 'date'],
                      'guests' => ['type' => 'integer', 'enum' => [1, 2, 3, 4]]
                  ],
                  'required' => ['city', 'check_in'],
                  'additionalProperties' => false
              ]
          ]
      ],
  );

  echo $message;
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  message = client.messages.create(
    model: "claude-opus-5",
    max_tokens: 1024,
    messages: [
      { role: "user", content: "Help me plan a trip from New York to Paris for 2 people, departing June 1, 2026" }
    ],
    tools: [
      {
        name: "search_flights",
        strict: true,
        input_schema: {
          type: "object",
          properties: {
            origin: { type: "string" },
            destination: { type: "string" },
            departure_date: { type: "string", format: "date" },
            travelers: { type: "integer", enum: [1, 2, 3, 4, 5, 6] }
          },
          required: ["origin", "destination", "departure_date"],
          additionalProperties: false
        }
      },
      {
        name: "search_hotels",
        strict: true,
        input_schema: {
          type: "object",
          properties: {
            city: { type: "string" },
            check_in: { type: "string", format: "date" },
            guests: { type: "integer", enum: [1, 2, 3, 4] }
          },
          required: ["city", "check_in"],
          additionalProperties: false
        }
      }
    ]
  )
  puts message
  ```
</CodeGroup>

数据保留

严格工具使用使用与结构化输出相同的流水线,将工具 input_schema 定义编译为语法。工具 Schema 自上次使用起最多临时缓存 24 小时。提示和响应在 API 响应结束后不会被保留。

严格工具使用符合 HIPAA 资格,但受保护健康信息(PHI)不得包含在工具 Schema 定义中。API 将编译后的 Schema 与消息内容分开缓存,这些缓存的 Schema 不会获得与提示和响应相同的 PHI 保护。请勿在 input_schema 属性名称、enum 值、const 值或 pattern 正则表达式中包含 PHI。PHI 应仅出现在消息内容(提示和响应)中,在那里它受 HIPAA 保障措施的保护。

有关所有功能的 ZDR 和 HIPAA 资格,请参阅 API 和数据保留

后续步骤