---
title: Java SDK
url: https://platform.claude.com/docs/ja/cli-sdks-libraries/sdks/java
description: ビルダーパターンと非同期サポートを備えたAnthropic Java SDKのインストールと設定
---

Anthropic Java SDKは、Javaで記述されたアプリケーションからClaude APIへの便利なアクセスを提供します。リクエストの作成にはビルダーパターンを使用し、同期操作と非同期操作の両方をサポートしています。

<Info>
  コード例を含むAPI機能のドキュメントについては、[APIリファレンス](https://platform.claude.com/docs/ja/api/overview)を参照してください。このページでは、Java固有のSDK機能と設定について説明します。
</Info>

## インストール

<Tabs>
  <Tab title="Gradle">
    ```kotlin
    implementation("com.anthropic:anthropic-java:3.3.0")
    ```
  </Tab>

  <Tab title="Maven">
    ```xml
    <dependency>
        <groupId>com.anthropic</groupId>
        <artifactId>anthropic-java</artifactId>
        <version>3.3.0</version>
    </dependency>
    ```
  </Tab>
</Tabs>

## 要件

このライブラリにはJava 8以降が必要です。

<Note>
  SDKはJava 8以降をサポートしています。このドキュメントのコード例は、[JDK 25のコンパクトソースファイル](https://openjdk.org/jeps/512)として記述されており、エントリーポイントとして単独の`void main()`を、出力には`IO.println()`を使用しています。API呼び出し自体はサポートされているすべてのJDKで同一です。以前のバージョンで例をコンパイルするには、`IO.println(...)`を`System.out.println(...)`に置き換え、本体をクラス内の`public static void main(String[] args)`の中に配置してください。
</Note>

## クイックスタート

```java
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.messages.Message;
import com.anthropic.models.messages.MessageCreateParams;
import com.anthropic.models.messages.Model;

// `anthropic.apiKey`、`anthropic.authToken`、`anthropic.baseUrl` システムプロパティを使用して設定します
// または `ANTHROPIC_API_KEY`、`ANTHROPIC_AUTH_TOKEN`、`ANTHROPIC_BASE_URL` 環境変数を使用して設定します
AnthropicClient client = AnthropicOkHttpClient.fromEnv();

MessageCreateParams params = MessageCreateParams.builder()
  .maxTokens(1024L)
  .addUserMessage("Hello, Claude")
  .model(Model.CLAUDE_OPUS_5_5)
  .build();

Message message = client.messages().create(params);
```

## クライアントの設定

### APIキーの設定

システムプロパティまたは環境変数を使用してクライアントを設定します：

```java
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;

// `anthropic.apiKey`、`anthropic.authToken`、`anthropic.baseUrl` のシステムプロパティを使用して設定します
// または `ANTHROPIC_API_KEY`、`ANTHROPIC_AUTH_TOKEN`、`ANTHROPIC_BASE_URL` の環境変数を使用して設定します
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
```

または手動で設定します：

```java
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;

AnthropicClient client = AnthropicOkHttpClient.builder()
  .apiKey("my-anthropic-api-key")
  .build();
```

または両方のアプローチを組み合わせて使用します：

```java
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;

AnthropicClient client = AnthropicOkHttpClient.builder()
  // システムプロパティまたは環境変数を使用して設定します
  .fromEnv()
  .apiKey("my-anthropic-api-key")
  .build();
```

Workload Identity Federationを含む認証オプションについては、[認証](https://platform.claude.com/docs/ja/manage-claude/authentication)を参照してください。APIキーがワークスペースにスコープされていない[個人キーまたはサービスアカウントキー](https://platform.claude.com/docs/ja/manage-claude/authentication#key-types)である場合は、`anthropic-workspace-id`リクエストヘッダーにワークスペースIDを設定してください。このSDKでのリクエストごとのオプションについては、[ワークスペースを選択する](https://platform.claude.com/docs/ja/manage-claude/authentication#select-a-workspace)で説明しています。

### 設定オプション

| セッター        | システムプロパティ             | 環境変数                   | 必須    | デフォルト値                        |
| ----------- | --------------------- | ---------------------- | ----- | ----------------------------- |
| `apiKey`    | `anthropic.apiKey`    | `ANTHROPIC_API_KEY`    | false | -                             |
| `authToken` | `anthropic.authToken` | `ANTHROPIC_AUTH_TOKEN` | false | -                             |
| `baseUrl`   | `anthropic.baseUrl`   | `ANTHROPIC_BASE_URL`   | true  | `"https://api.anthropic.com"` |

システムプロパティは環境変数よりも優先されます。

<Tip>
  同じアプリケーション内で複数のクライアントを作成しないでください。各クライアントはコネクションプールとスレッドプールを持っており、これらはリクエスト間で共有する方が効率的です。
</Tip>

### 設定の変更

同じコネクションプールとスレッドプールを再利用しながら、変更したクライアント設定を一時的に使用するには、任意のクライアントまたはサービスで`withOptions()`を呼び出します：

```java
import com.anthropic.client.AnthropicClient;

AnthropicClient clientWithOptions = client.withOptions(optionsBuilder -> {
  optionsBuilder.baseUrl("https://example.com");
  optionsBuilder.maxRetries(42);
});
```

`withOptions()`メソッドは、元のクライアントやサービスには影響しません。

## 非同期での使用

デフォルトのクライアントは同期型です。非同期実行に切り替えるには、`async()`メソッドを呼び出します：

```java
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.messages.Message;
import com.anthropic.models.messages.MessageCreateParams;
import com.anthropic.models.messages.Model;

AnthropicClient client = AnthropicOkHttpClient.fromEnv();

MessageCreateParams params = MessageCreateParams.builder()
  .maxTokens(1024L)
  .addUserMessage("Hello, Claude")
  .model(Model.CLAUDE_OPUS_5_5)
  .build();

CompletableFuture<Message> message = client.async().messages().create(params);
```

または最初から非同期クライアントを作成します：

```java
import com.anthropic.client.AnthropicClientAsync;
import com.anthropic.client.okhttp.AnthropicOkHttpClientAsync;
import com.anthropic.models.messages.Message;
import com.anthropic.models.messages.MessageCreateParams;
import com.anthropic.models.messages.Model;

AnthropicClientAsync client = AnthropicOkHttpClientAsync.fromEnv();

MessageCreateParams params = MessageCreateParams.builder()
  .maxTokens(1024L)
  .addUserMessage("Hello, Claude")
  .model(Model.CLAUDE_OPUS_5_5)
  .build();

CompletableFuture<Message> message = client.messages().create(params);
```

非同期クライアントは同期クライアントと同じオプションをサポートしますが、ほとんどのメソッドは`CompletableFuture`を返します。

## ストリーミング

SDKは、レスポンスの「チャンク」ストリームを返すメソッドを定義しています。各チャンクは、完全なレスポンスを待つことなく、到着次第個別に処理できます。

### 同期ストリーミング

これらのストリーミングメソッドは、同期クライアントの場合`StreamResponse`を返します：

```java
import com.anthropic.core.http.StreamResponse;
import com.anthropic.models.messages.RawMessageStreamEvent;

try (StreamResponse<RawMessageStreamEvent> streamResponse = client.messages().createStreaming(params)) {
    streamResponse.stream().forEach(chunk -> {
        IO.println(chunk);
    });
    IO.println("No more chunks!");
}
```

### 非同期ストリーミング

非同期クライアントの場合、メソッドは`AsyncStreamResponse`を返します：

```java
import com.anthropic.core.http.AsyncStreamResponse;
import com.anthropic.models.messages.RawMessageStreamEvent;

client.async().messages().createStreaming(params).subscribe(chunk -> {
    IO.println(chunk);
});

// ストリームのエラーや完了を処理する必要がある場合
client.async().messages().createStreaming(params).subscribe(new AsyncStreamResponse.Handler<>() {
    @Override
    public void onNext(RawMessageStreamEvent chunk) {
        IO.println(chunk);
    }

    @Override
    public void onComplete(Optional<Throwable> error) {
        if (error.isPresent()) {
            IO.println("Something went wrong!");
            throw new RuntimeException(error.get());
        } else {
            IO.println("No more chunks!");
        }
    }
});

// または futures を使用します
client.async().messages().createStreaming(params)
    .subscribe(chunk -> {
        IO.println(chunk);
    })
    .onCompleteFuture()
    .whenComplete((unused, error) -> {
        if (error != null) {
            IO.println("Something went wrong!");
            throw new RuntimeException(error);
        } else {
            IO.println("No more chunks!");
        }
    });
```

非同期ストリーミングは、現在のスレッドをブロックせずにストリーミングするために、クライアントごとの専用のキャッシュ型スレッドプール`Executor`を使用します。別の`Executor`を使用するには：

```java
Executor executor = Executors.newFixedThreadPool(4);
client.async().messages().createStreaming(params).subscribe(
    chunk -> IO.println(chunk), executor
);
```

または`streamHandlerExecutor`メソッドを使用してクライアント全体で設定します：

```java
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;

AnthropicClient client = AnthropicOkHttpClient.builder()
  .fromEnv()
  .streamHandlerExecutor(Executors.newFixedThreadPool(4))
  .build();
```

### メッセージアキュムレーターを使用したストリーミング

`MessageAccumulator`は、レスポンス内のイベントストリームを処理されるたびに記録し、非ストリーミングAPIが返すものと同様の`Message`オブジェクトを蓄積できます。

同期レスポンスの場合は、ストリームパイプラインに`Stream.peek()`呼び出しを追加して各イベントを蓄積します：

```java
import com.anthropic.core.http.StreamResponse;
import com.anthropic.helpers.MessageAccumulator;
import com.anthropic.models.messages.Message;
import com.anthropic.models.messages.RawMessageStreamEvent;

MessageAccumulator messageAccumulator = MessageAccumulator.create();

try (StreamResponse<RawMessageStreamEvent> streamResponse =
         client.messages().createStreaming(createParams)) {
    streamResponse.stream()
            .peek(messageAccumulator::accumulate)
            .flatMap(event -> event.contentBlockDelta().stream())
            .flatMap(deltaEvent -> deltaEvent.delta().text().stream())
            .forEach(textDelta -> IO.print(textDelta.text()));
}

Message message = messageAccumulator.message();
```

非同期レスポンスの場合は、`MessageAccumulator`を`subscribe()`呼び出しに追加します：

```java
import com.anthropic.helpers.MessageAccumulator;
import com.anthropic.models.messages.Message;

MessageAccumulator messageAccumulator = MessageAccumulator.create();

client.async().messages()
        .createStreaming(createParams)
        .subscribe(event -> messageAccumulator.accumulate(event).contentBlockDelta().stream()
                .flatMap(deltaEvent -> deltaEvent.delta().text().stream())
                .forEach(textDelta -> IO.print(textDelta.text())))
        .onCompleteFuture()
        .join();

Message message = messageAccumulator.message();
```

`BetaMessage`オブジェクトを蓄積するための`BetaMessageAccumulator`も利用できます。使い方は`MessageAccumulator`と同じです。

## 構造化出力

Javaの例を含む構造化出力の完全なドキュメントについては、[構造化出力](https://platform.claude.com/docs/ja/build-with-claude/structured-outputs)を参照してください。

## ツール使用

[Claudeでのツール使用](https://platform.claude.com/docs/ja/agents-and-tools/tool-use/overview)により、外部のツールや関数をAIモデルのレスポンスに直接統合できます。モデルはプレーンテキストを生成する代わりに、適切な場合にツールや関数を呼び出すための指示（パラメータ付き）を出力できます。ツールのJSONスキーマを定義すると、モデルはそのスキーマを使用して、これらのツールをいつどのように使用するかを判断します。

ツール使用機能は、AIモデルからのJSON出力が入力パラメータで指定したJSONスキーマに準拠することを保証する「strict」モードをサポートしています。

SDKは、任意のJavaクラスの構造からツールとそのパラメータを自動的に導出できます。クラス名（スネークケースに変換されたもの）がツール名となり、クラスのフィールドがツールのパラメータを定義します。

<Note>
  ツールクラスは、トップレベルクラスまたは`static`ネストクラスとして宣言してください。この要件はJackson Databindライブラリ（`com.fasterxml.jackson.databind`）に由来します。SDKはこのライブラリを使用してツール入力をクラスのインスタンスにデシリアライズしますが、このライブラリは非staticの内部クラスをインスタンス化できません。
</Note>

### アノテーションによるツールの定義

```java
import com.fasterxml.jackson.annotation.JsonClassDescription;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;

enum Unit {
  CELSIUS,
  FAHRENHEIT;

  public String toString() {
    return switch (this) {
      case CELSIUS -> "C";
      case FAHRENHEIT -> "F";
    };
  }

  public double fromKelvin(double temperatureK) {
    return switch (this) {
      case CELSIUS -> temperatureK - 273.15;
      case FAHRENHEIT -> (temperatureK - 273.15) * 1.8 + 32.0;
    };
  }
}

@JsonClassDescription("Get the weather in a given location")
static class GetWeather {

  @JsonPropertyDescription("The city and state, e.g. San Francisco, CA")
  public String location;

  @JsonPropertyDescription("The unit of temperature")
  public Unit unit;

  public Weather execute() {
    double temperatureK = switch (location) {
      case "San Francisco, CA" -> 300.0;
      case "New York, NY" -> 310.0;
      case "Dallas, TX" -> 305.0;
      default -> 295;
    };
    return new Weather(String.format("%.0f%s", unit.fromKelvin(temperatureK), unit));
  }
}

static class Weather {

  public String temperature;

  public Weather(String temperature) {
    this.temperature = temperature;
  }
}
```

### ツールの呼び出し

ツールクラスを定義したら、`MessageCreateParams.Builder.addTool(Class<T>)`を使用してメッセージパラメータに追加し、AIモデルのレスポンスで要求された場合にそれらを呼び出します。`BetaToolUseBlock.input(Class<T>)`を使用すると、JSON形式のツールのパラメータを、ツールを定義するクラスのインスタンスにパースできます。

ツールを呼び出した後、`BetaToolResultBlockParam.Builder.contentAsJson(Object)`を使用してツールの結果をAIモデルに返します：

```java
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.beta.messages.*;
import com.anthropic.models.messages.Model;

AnthropicClient client = AnthropicOkHttpClient.fromEnv();

MessageCreateParams.Builder createParamsBuilder = MessageCreateParams.builder()
        .model(Model.CLAUDE_OPUS_5_5)
        .maxTokens(2048)
        .addTool(GetWeather.class)
        .addUserMessage("What's the temperature in New York?");

client.beta().messages().create(createParamsBuilder.build()).content().stream()
        .flatMap(contentBlock -> contentBlock.toolUse().stream())
        .forEach(toolUseBlock -> createParamsBuilder
              // ツール使用がリクエストされたことを示すメッセージを追加します。
              .addAssistantMessageOfContentBlockParams(
                      List.of(BetaContentBlockParam.ofToolUse(BetaToolUseBlockParam.builder()
                              .name(toolUseBlock.name())
                              .id(toolUseBlock.id())
                              .input(toolUseBlock._input())
                              .build())))
              // リクエストされたツール使用の結果を含むメッセージを追加します。
              .addUserMessageOfContentBlockParams(
                      List.of(BetaContentBlockParam.ofToolResult(BetaToolResultBlockParam.builder()
                              .toolUseId(toolUseBlock.id())
                              .contentAsJson(callTool(toolUseBlock))
                              .build()))));

client.beta().messages().create(createParamsBuilder.build()).content().stream()
        .flatMap(contentBlock -> contentBlock.text().stream())
        .forEach(textBlock -> IO.println(textBlock.text()));

private static Object callTool(BetaToolUseBlock toolUseBlock) {
  if (!"get_weather".equals(toolUseBlock.name())) {
    throw new IllegalArgumentException("Unknown tool: " + toolUseBlock.name());
  }

  GetWeather tool = toolUseBlock.input(GetWeather.class);
  return tool != null ? tool.execute() : new Weather("unknown");
}
```

### ツール名の変換

ツール名は、キャメルケースのツールクラス名（例：`GetWeather`）から導出され、スネークケース（例：`get_weather`）に変換されます。単語の境界は、現在の文字が最初の文字ではなく、大文字であり、かつ直前の文字が小文字であるか、直後の文字が小文字である位置から始まります。たとえば、`MyJSONParser`は`my_json_parser`に、`ParseJSON`は`parse_json`になります。この変換は`@JsonTypeName`アノテーションを使用して上書きできます。

### ローカルでのツールJSONスキーマ検証

ツールクラスから導出されたJSONスキーマがAnthropicの制約を満たしているかを確認するために、ローカル検証を実行できます。ローカル検証はデフォルトで有効になっていますが、無効にすることもできます：

```java
MessageCreateParams.Builder createParamsBuilder = MessageCreateParams.builder()
  .model(Model.CLAUDE_OPUS_5_5)
  .maxTokens(2048)
  .addTool(GetWeather.class, JsonSchemaLocalValidation.NO)
  .addUserMessage("What's the temperature in New York?");
```

### ツールクラスへのアノテーション付与

アノテーションを使用して、ツールに関する追加情報をJSONスキーマに追加できます：

* `@JsonClassDescription` - ツールクラスに、そのツールをいつどのように使用するかを詳述する説明を追加します。
* `@JsonTypeName` - ツール名を、スネークケースに変換されたクラスの単純名以外のものに設定します。
* `@JsonPropertyDescription` - ツールパラメータに詳細な説明を追加します。
* `@JsonIgnore` - `public`フィールドまたはゲッターメソッドを、ツールのパラメータ用に生成されるJSONスキーマから除外します。
* `@JsonProperty` - 非`public`のフィールドまたはゲッターメソッドを、ツールのパラメータ用に生成されるJSONスキーマに含めます。

## メッセージバッチ

SDKは、`client.messages().batches()`名前空間で[バッチ処理](https://platform.claude.com/docs/ja/build-with-claude/batch-processing)をサポートしています。バッチの一覧表示とページネーションの方法については、[ページネーション](https://platform.claude.com/docs/ja/cli-sdks-libraries/sdks/java#pagination)を参照してください。

## ファイルのアップロード

SDKは、`MultipartField`クラスを通じてファイルを受け付けるメソッドを定義しています：

```java
import com.anthropic.core.MultipartField;
import com.anthropic.models.files.FileMetadata;
import com.anthropic.models.files.FileUploadParams;

FileUploadParams params = FileUploadParams.builder()
  .file(
    MultipartField.<InputStream>builder()
      .value(Files.newInputStream(Paths.get("/path/to/file.pdf")))
      .contentType("application/pdf")
      .build()
  )
  .build();

FileMetadata fileMetadata = client.files().upload(params);
```

または`InputStream`から：

```java
import com.anthropic.core.MultipartField;
import com.anthropic.models.files.FileMetadata;
import com.anthropic.models.files.FileUploadParams;

FileUploadParams params = FileUploadParams.builder()
  .file(
    MultipartField.<InputStream>builder()
      .value(URI.create("https://example.com/path/to/file").toURL().openStream())
      .filename("document.pdf")
      .contentType("application/pdf")
      .build()
  )
  .build();

FileMetadata fileMetadata = client.files().upload(params);
```

またはメモリ上のバイト列から：

```java
import com.anthropic.core.MultipartField;
import com.anthropic.models.files.FileMetadata;
import com.anthropic.models.files.FileUploadParams;

FileUploadParams params = FileUploadParams.builder()
  .file(
    MultipartField.<InputStream>builder()
      .value(new ByteArrayInputStream("content".getBytes()))
      .filename("document.txt")
      .contentType("text/plain")
      .build()
  )
  .build();

FileMetadata fileMetadata = client.files().upload(params);
```

### バイナリレスポンス

SDKは、必ずしもJSONとしてパースされないAPIレスポンスに対して、バイナリレスポンスを返すメソッドを定義しています：

```java
import com.anthropic.core.http.HttpResponse;

HttpResponse response = client.files().download("file_abc123");
```

レスポンスの内容をファイルに保存するには：

```java
import com.anthropic.core.http.HttpResponse;

try (HttpResponse response = client.files().download(params)) {
    Files.copy(
        response.body(),
        Paths.get(path),
        StandardCopyOption.REPLACE_EXISTING
    );
} catch (Exception e) {
    IO.println("Something went wrong!");
    throw new RuntimeException(e);
}
```

またはレスポンスの内容を任意の`OutputStream`に転送します：

```java
import com.anthropic.core.http.HttpResponse;

try (HttpResponse response = client.files().download(params)) {
    response.body().transferTo(Files.newOutputStream(Paths.get(path)));
} catch (Exception e) {
    IO.println("Something went wrong!");
    throw new RuntimeException(e);
}
```

## エラー処理

SDKは独自の非チェック例外型をスローします：

* `AnthropicServiceException` - HTTPエラーの基底クラス。
* `AnthropicIoException` - I/Oネットワークエラー。
* `AnthropicRetryableException` - 再試行可能な失敗を示す汎用エラー。
* `AnthropicInvalidDataException` - 正常にパースされたデータの解釈の失敗（たとえば、必須であるはずのプロパティにアクセスしたが、APIが予期せずそれを省略していた場合）。
* `AnthropicException` - すべての例外の基底クラス。

### ステータスコードのマッピング

| ステータス | 例外                              |
| ----- | ------------------------------- |
| 400   | `BadRequestException`           |
| 401   | `UnauthorizedException`         |
| 403   | `PermissionDeniedException`     |
| 404   | `NotFoundException`             |
| 422   | `UnprocessableEntityException`  |
| 429   | `RateLimitException`            |
| 5xx   | `InternalServerException`       |
| その他   | `UnexpectedStatusCodeException` |

`SseException`は、最初のHTTPレスポンスが成功した後のSSEストリーミング中に発生したエラーに対してスローされます。

```java
import com.anthropic.errors.*;

try {
    Message message = client.messages().create(params);
} catch (RateLimitException e) {
    IO.println("Rate limited, retry after: " + e.headers());
} catch (UnauthorizedException e) {
    IO.println("Invalid API key");
} catch (AnthropicServiceException e) {
    IO.println("API error: " + e.statusCode());
} catch (AnthropicIoException e) {
    IO.println("Network error: " + e.getMessage());
}
```

## リクエストID

[生のレスポンス](https://platform.claude.com/docs/ja/cli-sdks-libraries/sdks/java#raw-response-access)を使用する場合、`requestId()`メソッドを使用して`request-id`レスポンスヘッダーにアクセスできます：

```java
import com.anthropic.core.http.HttpResponseFor;
import com.anthropic.models.messages.Message;

HttpResponseFor<Message> message = client.messages().withRawResponse().create(params);

Optional<String> requestId = message.requestId();
```

これを使用して、失敗したリクエストをすばやくログに記録し、Anthropicに報告できます。リクエストのデバッグの詳細については、[リクエストID](https://platform.claude.com/docs/ja/api/errors#request-id)を参照してください。

## 再試行

SDKはデフォルトで自動的に2回再試行し、リクエスト間には短い指数バックオフが入ります。

次のエラータイプのみが再試行されます：

* 接続エラー（たとえば、ネットワーク接続の問題によるもの）
* 408 Request Timeout
* 409 Conflict
* 429 Rate Limit
* 5xx Internal

APIは、リクエストを再試行するかどうかをSDKに明示的に指示することもあります。

再試行回数をカスタム設定するには、`maxRetries`メソッドを使用してクライアントを設定します：

```java
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;

AnthropicClient client = AnthropicOkHttpClient.builder().fromEnv().maxRetries(4).build();
```

## タイムアウト

リクエストはデフォルトで10分後にタイムアウトします。

ただし、`maxTokens`を受け付けるメソッドで、大きな`maxTokens`値を指定してストリーミングを行っている場合、デフォルトのタイムアウトは次の式を使用して動的に計算されます：

```java
Duration.ofSeconds(
    Math.min(
        60 * 60, // 1 hour max
        Math.max(
            10 * 60, // 10 minute minimum
            60 * 60 * maxTokens / 128_000
        )
    )
)
```

これにより、上書きされない限り、`maxTokens`パラメータに応じて最大60分のタイムアウトになります。

非ストリーミングリクエストの場合、動的タイムアウトは`maxTokens`に基づいて最小30秒から最大10分までの範囲で変化します。

リクエストごとにカスタムタイムアウトを設定するには：

```java
import com.anthropic.models.messages.Message;

Message message = client
  .messages()
  .create(params, RequestOptions.builder().timeout(Duration.ofSeconds(30)).build());
```

またはクライアントレベルですべてのメソッド呼び出しのデフォルトを設定します：

```java
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;

AnthropicClient client = AnthropicOkHttpClient.builder()
  .fromEnv()
  .timeout(Duration.ofSeconds(30))
  .build();
```

## 長時間のリクエスト

<Warning>
  長時間実行されるリクエストには[ストリーミング](https://platform.claude.com/docs/ja/cli-sdks-libraries/sdks/java#streaming)の使用を検討してください。
</Warning>

ストリーミングを使用せずに大きな`maxTokens`値を設定することは避けてください。一部のネットワークでは、一定時間が経過するとアイドル状態の接続が切断されることがあり、その結果、Anthropicからレスポンスを受け取ることなくリクエストが失敗したり[タイムアウト](https://platform.claude.com/docs/ja/cli-sdks-libraries/sdks/java#timeouts)したりする可能性があります。SDKは定期的にAPIにpingを送信して接続を維持し、こうしたネットワークの影響を軽減します。

非ストリーミングリクエストが10分以上かかると予想される場合、SDKはエラーをスローします。[ストリーミングメソッド](https://platform.claude.com/docs/ja/cli-sdks-libraries/sdks/java#streaming)を使用するか、クライアントまたはリクエストレベルで[タイムアウトを上書き](https://platform.claude.com/docs/ja/cli-sdks-libraries/sdks/java#timeouts)すると、このエラーは無効になります。

## ページネーション

SDKは、ページ分割された結果に、1ページずつ、またはすべてのページにわたって項目ごとにアクセスするための便利な方法を提供します。

### 自動ページネーション

すべてのページにわたってすべての結果を反復処理するには、必要に応じて自動的に追加のページを取得する`autoPager()`メソッドを使用します。

```java
import com.anthropic.models.messages.batches.BatchListPage;
import com.anthropic.models.messages.batches.MessageBatch;

BatchListPage page = client.messages().batches().list();

// Iterable として処理します
for (MessageBatch batch : page.autoPager()) {
    IO.println(batch);
}

// Stream として処理します
page.autoPager()
    .stream()
    .limit(50)
    .forEach(batch -> IO.println(batch));
```

非同期クライアントを使用する場合、メソッドは`AsyncStreamResponse`を返します：

```java
import com.anthropic.core.http.AsyncStreamResponse;
import com.anthropic.models.messages.batches.BatchListPageAsync;
import com.anthropic.models.messages.batches.MessageBatch;

CompletableFuture<BatchListPageAsync> pageFuture = client.async().messages().batches().list();

pageFuture.thenAccept(page -> page.autoPager().subscribe(batch -> {
    IO.println(batch);
}));

// ストリームのエラーや完了を処理する必要がある場合
pageFuture.thenAccept(page -> page.autoPager().subscribe(new AsyncStreamResponse.Handler<>() {
    @Override
    public void onNext(MessageBatch batch) {
        IO.println(batch);
    }

    @Override
    public void onComplete(Optional<Throwable> error) {
        if (error.isPresent()) {
            IO.println("Something went wrong!");
            throw new RuntimeException(error.get());
        } else {
            IO.println("No more!");
        }
    }
}));

// または futures を使用します
pageFuture.thenAccept(page -> page.autoPager()
    .subscribe(batch -> {
        IO.println(batch);
    })
    .onCompleteFuture()
    .whenComplete((unused, error) -> {
        if (error != null) {
            IO.println("Something went wrong!");
            throw new RuntimeException(error);
        } else {
            IO.println("No more!");
        }
    }));
```

### 手動ページネーション

個々のページの項目にアクセスし、次のページを手動でリクエストするには：

```java
import com.anthropic.models.messages.batches.BatchListPage;
import com.anthropic.models.messages.batches.MessageBatch;

BatchListPage page = client.messages().batches().list();
while (true) {
    for (MessageBatch batch : page.items()) {
        IO.println(batch);
    }

    if (!page.hasNextPage()) {
        break;
    }

    page = page.nextPage();
}
```

## 型システム

### イミュータビリティとビルダー

SDKの各クラスには、それを構築するための関連ビルダーがあります。各クラスは構築後はイミュータブルです。クラスに関連ビルダーがある場合、そのクラスには`toBuilder()`メソッドがあり、これを使用してビルダーに戻し、変更したコピーを作成できます。

```java
MessageCreateParams params = MessageCreateParams.builder()
  .maxTokens(1024L)
  .addUserMessage("Hello, Claude")
  .model(Model.CLAUDE_OPUS_5_5)
  .build();

// toBuilder() を使用して変更したコピーを作成します
MessageCreateParams modified = params.toBuilder().maxTokens(2048L).build();
```

各クラスはイミュータブルであるため、ビルダーを変更しても、すでに構築されたクラスインスタンスに影響することはありません。

### リクエストとレスポンス

Claude APIにリクエストを送信するには、何らかの`Params`クラスのインスタンスを構築し、対応するクライアントメソッドに渡します。レスポンスを受信すると、それはJavaクラスのインスタンスにデシリアライズされます。

たとえば、`client.messages().create(...)`は`MessageCreateParams`のインスタンスを指定して呼び出す必要があり、`Message`のインスタンスを返します。

### ドキュメント化されていないパラメータ

ドキュメント化されていないパラメータを設定するには、任意の`Params`クラスで`putAdditionalHeader`、`putAdditionalQueryParam`、または`putAdditionalBodyProperty`メソッドを呼び出します：

```java
import com.anthropic.core.JsonValue;
import com.anthropic.models.messages.MessageCreateParams;

MessageCreateParams params = MessageCreateParams.builder()
  .putAdditionalHeader("Secret-Header", "42")
  .putAdditionalQueryParam("secret_query_param", "42")
  .putAdditionalBodyProperty("secretProperty", JsonValue.from("42"))
  .build();
```

これらは後で、構築されたオブジェクト上で`_additionalHeaders()`、`_additionalQueryParams()`、`_additionalBodyProperties()`メソッドを使用してアクセスできます。

<Warning>
  これらのメソッドに渡された値は、それ以前のメソッドに渡された値を上書きします。セキュリティ上の理由から、これらのメソッドは信頼できる入力データでのみ使用するようにしてください。
</Warning>

ネストされたヘッダー、クエリパラメータ、またはボディクラスにドキュメント化されていないパラメータを設定するには：

```java
import com.anthropic.core.JsonValue;
import com.anthropic.models.messages.MessageCreateParams;
import com.anthropic.models.messages.Metadata;

MessageCreateParams params = MessageCreateParams.builder()
  .metadata(
    Metadata.builder().putAdditionalProperty("secretProperty", JsonValue.from("42")).build()
  )
  .build();
```

これらのプロパティは後で、ネストされた構築済みオブジェクト上で`_additionalProperties()`メソッドを使用してアクセスできます。

ドキュメント化されたパラメータまたはプロパティを、ドキュメント化されていない値やまだサポートされていない値に設定するには、そのセッターに`JsonValue`オブジェクトを渡します：

```java
import com.anthropic.core.JsonValue;
import com.anthropic.models.messages.MessageCreateParams;
import com.anthropic.models.messages.Model;

MessageCreateParams params = MessageCreateParams.builder()
  .maxTokens(JsonValue.from(3.14))
  .addUserMessage("Hello, Claude")
  .model(Model.CLAUDE_OPUS_5_5)
  .build();
```

### JsonValueの作成

`JsonValue`を作成する最も簡単な方法は、その`from(...)`メソッドを使用することです：

```java
import com.anthropic.core.JsonValue;

// プリミティブな JSON 値を作成します
JsonValue nullValue = JsonValue.from(null);

JsonValue booleanValue = JsonValue.from(true);

JsonValue numberValue = JsonValue.from(42);

JsonValue stringValue = JsonValue.from("Hello World!");

// `["Hello", "World"]` と同等の JSON 配列値を作成します
JsonValue arrayValue = JsonValue.from(List.of("Hello", "World"));

// `{ "a": 1, "b": 2 }` と同等の JSON オブジェクト値を作成します
JsonValue objectValue = JsonValue.from(Map.of("a", 1, "b", 2));

// 次と同等の任意にネストされた JSON を作成します:
// { "a": [1, 2], "b": [3, 4] }
JsonValue complexValue = JsonValue.from(Map.of("a", List.of(1, 2), "b", List.of(3, 4)));
```

### 必須パラメータの強制的な省略

通常、`Builder`クラスの`build`メソッドは、必須のパラメータまたはプロパティが設定されていない場合に`IllegalStateException`をスローします。必須のパラメータまたはプロパティを強制的に省略するには、`JsonMissing`を渡します：

```java
import com.anthropic.core.JsonMissing;
import com.anthropic.models.messages.MessageCreateParams;
import com.anthropic.models.messages.Model;

MessageCreateParams params = MessageCreateParams.builder()
  .addUserMessage("Hello, world")
  .model(Model.CLAUDE_OPUS_5_5)
  .maxTokens(JsonMissing.of())
  .build();
```

### レスポンスのプロパティ

ドキュメント化されていないレスポンスのプロパティにアクセスするには、`_additionalProperties()`メソッドを呼び出します：

```java
import com.anthropic.core.JsonValue;

Map<String, JsonValue> additionalProperties = client
  .messages()
  .create(params)
  ._additionalProperties();

JsonValue secretPropertyValue = additionalProperties.get("secretProperty");

String result = secretPropertyValue.accept(new JsonValue.Visitor<>() {
    @Override
    public String visitNull() {
        return "It's null!";
    }

    @Override
    public String visitBoolean(boolean value) {
        return "It's a boolean!";
    }

    @Override
    public String visitNumber(Number value) {
        return "It's a number!";
    }

    // その他のメソッドには `visitMissing`、`visitString`、`visitArray`、`visitObject` があります
    // 未実装の各メソッドのデフォルト実装は `visitDefault` に委譲します。
    // これはデフォルトでは例外をスローしますが、オーバーライドすることもできます
});
```

プロパティの生のJSON値にアクセスするには、`_`プレフィックス付きのメソッドを呼び出します：

```java
import com.anthropic.core.JsonField;
import com.anthropic.models.messages.StopReason;

JsonField<StopReason> stopReason = client.messages().create(params)._stopReason();

if (stopReason.isMissing()) {
  // このプロパティは JSON レスポンスに存在しません
} else if (stopReason.isNull()) {
  // このプロパティはリテラルの null に設定されています
} else {
  // 値が文字列として指定されたかどうかを確認します
  // 他のメソッドには `asNumber()`、`asBoolean()` などがあります
  Optional<String> jsonString = stopReason.asString();

  // カスタム型へのデシリアライズを試みます
  MyClass myObject = stopReason.asUnknown().orElseThrow().convert(MyClass.class);
}
```

### レスポンスの検証

デフォルトでは、APIが期待される型と一致しないレスポンスを返しても、SDKは例外をスローしません。そのプロパティに直接アクセスした場合にのみ`AnthropicInvalidDataException`をスローします。

レスポンスが完全に正しく型付けされていることを事前に確認するには、`validate()`を呼び出します：

```java
import com.anthropic.models.messages.Message;

Message message = client.messages().create(params).validate();
```

またはリクエストごとに設定します：

```java
import com.anthropic.models.messages.Message;

Message message = client
  .messages()
  .create(params, RequestOptions.builder().responseValidation(true).build());
```

またはクライアントレベルですべてのメソッド呼び出しのデフォルトを設定します：

```java
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;

AnthropicClient client = AnthropicOkHttpClient.builder()
  .fromEnv()
  .responseValidation(true)
  .build();
```

## HTTPクライアントのカスタマイズ

### プロキシの設定

```java
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import java.net.Proxy;

AnthropicClient client = AnthropicOkHttpClient.builder()
  .fromEnv()
  .proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("https://example.com", 8080)))
  .build();
```

### HTTPS / SSLの設定

<Note>
  ほとんどのアプリケーションはこれらのメソッドを呼び出すべきではなく、代わりにシステムのデフォルトを使用してください。デフォルトには特別な最適化が含まれており、実装を変更するとそれらが失われる可能性があります。
</Note>

```java
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;

AnthropicClient client = AnthropicOkHttpClient.builder()
  .fromEnv()
  .sslSocketFactory(yourSSLSocketFactory)
  .trustManager(yourTrustManager)
  .hostnameVerifier(yourHostnameVerifier)
  .build();
```

### カスタムHTTPクライアント

SDKは3つのアーティファクトで構成されています：

* `anthropic-java-core` - SDKのコアロジックを含み、OkHttpには依存しません。`AnthropicClient`、`AnthropicClientAsync`、およびそれらの実装クラスを公開しており、これらはすべて任意のHTTPクライアントで動作します。
* `anthropic-java-client-okhttp` - OkHttpに依存します。`AnthropicOkHttpClient`と`AnthropicOkHttpClientAsync`を公開します。
* `anthropic-java` - `anthropic-java-core`と`anthropic-java-client-okhttp`の両方に依存し、それらのAPIを公開します。独自のロジックは持ちません。

この構造により、不要な依存関係を取り込むことなく、SDKのデフォルトのHTTPクライアントを置き換えることができます。

#### カスタマイズしたOkHttpClient

<Tip>
  デフォルトのクライアントを置き換える前に、利用可能な[ネットワークオプション](https://platform.claude.com/docs/ja/cli-sdks-libraries/sdks/java#retries)を試してください。
</Tip>

カスタマイズした`OkHttpClient`を使用するには：

1. `anthropic-java`依存関係を`anthropic-java-core`に置き換えます。
2. `anthropic-java-client-okhttp`の`OkHttpClient`クラスをコードにコピーし、カスタマイズします。
3. カスタマイズしたクライアントを使用して`AnthropicClientImpl`または`AnthropicClientAsyncImpl`を構築します。

#### 完全にカスタムなHTTPクライアント

完全にカスタムなHTTPクライアントを使用するには：

1. `anthropic-java`依存関係を`anthropic-java-core`に置き換えます。
2. `HttpClient`インターフェースを実装するクラスを作成します。
3. 新しいクライアントクラスを使用して`AnthropicClientImpl`または`AnthropicClientAsyncImpl`を構築します。

## プラットフォーム統合

<Note>
  コード例を含む詳細なプラットフォームセットアップガイドについては、以下を参照してください：

  * [Amazon Bedrock](https://platform.claude.com/docs/ja/build-with-claude/claude-in-amazon-bedrock)
  * [Amazon Bedrock（Opus 4.6以前）](https://platform.claude.com/docs/ja/build-with-claude/claude-on-amazon-bedrock-legacy)
  * [Claude Platform on AWS](https://platform.claude.com/docs/ja/build-with-claude/claude-platform-on-aws)
  * [Claude Models on Google Cloud (Google managed)](https://platform.claude.com/docs/ja/build-with-claude/claude-models-on-google-cloud/google-managed)
  * [Microsoft Foundry](https://platform.claude.com/docs/ja/build-with-claude/claude-in-microsoft-foundry)

  [Claude Models on Google Cloud (Anthropic managed)](https://platform.claude.com/docs/ja/build-with-claude/claude-models-on-google-cloud/anthropic-managed)も参照してください。
</Note>

Java SDKは、プラットフォーム固有の`Backend`実装を提供する個別の依存関係を通じて、以下のプラットフォームをサポートしています：

* **Agent Platform：** `com.anthropic:anthropic-java-vertex`：`VertexBackend.builder()`または`VertexBackend.fromEnv()`を使用します。`fromEnv()`は`CLOUD_ML_REGION`と`ANTHROPIC_VERTEX_PROJECT_ID`を読み取り、Application Default Credentialsを使用します。
* **Bedrock：** `com.anthropic:anthropic-java-bedrock`：Messages-APIのBedrockエンドポイントには`BedrockMantleBackend.fromEnv()`または`BedrockMantleBackend.builder()`を、`bedrock-runtime`パスには`BedrockBackend.fromEnv()` / `BedrockBackend.builder()`を使用します。
* **Claude Platform on AWS：** `com.anthropic:anthropic-java-aws`：`AwsBackend.fromEnv()`（`ANTHROPIC_AWS_WORKSPACE_ID`とAWSのデフォルトのリージョン/認証情報チェーンを読み取ります）または`AwsBackend.builder()`を使用します。ベータ版で利用可能です。
* **Foundry：** `com.anthropic:anthropic-java-foundry`：`FoundryBackend.fromEnv()`または`FoundryBackend.builder()`を使用します。

新しいプロジェクトには`BedrockMantleBackend`を使用してください。`BedrockBackend`は、Bedrockの`InvokeModel` APIを使用する既存のアプリケーション向けに引き続き提供されています。

Java SDKは、`com.anthropic:anthropic-java-google-cloud`依存関係の`GoogleCloudBackend`を通じて、Claude Models on Google Cloud (Anthropic managed)もサポートしています。このバックエンドはベータ版です。`GoogleCloudBackend.builder()`または`GoogleCloudBackend.fromEnv()`で作成します。`fromEnv()`は`ANTHROPIC_GOOGLE_CLOUD_WORKSPACE_ID`、`ANTHROPIC_GOOGLE_CLOUD_PROJECT`、およびGoogle Application Default Credentialsを読み取ります。[プロジェクト、ロケーション、およびワークスペースの解決](https://platform.claude.com/docs/ja/build-with-claude/claude-models-on-google-cloud/anthropic-managed#project-location-and-workspace-resolution)を参照してください。

プラットフォームアーティファクトは、`AnthropicOkHttpClient`を提供するベースの`com.anthropic:anthropic-java`依存関係へのアドオンであるため、両方をインストールしてください。各`Backend`実装は、`AnthropicOkHttpClient.builder()`上の`.backend()`でクライアントに渡されます。各クラウドバックエンドは、それぞれのクラウドプラットフォームSDKのクラスを推移的依存関係として取り込みます。

## 高度な使用方法

### 生のレスポンスへのアクセス

HTTPヘッダー、ステータスコード、および生のレスポンスボディにアクセスするには、任意のHTTPメソッド呼び出しの前に`withRawResponse()`を付けます：

```java
import com.anthropic.core.http.Headers;
import com.anthropic.core.http.HttpResponseFor;
import com.anthropic.models.messages.Message;
import com.anthropic.models.messages.MessageCreateParams;
import com.anthropic.models.messages.Model;

MessageCreateParams params = MessageCreateParams.builder()
  .maxTokens(1024L)
  .addUserMessage("Hello, Claude")
  .model(Model.CLAUDE_OPUS_5_5)
  .build();

HttpResponseFor<Message> message = client.messages().withRawResponse().create(params);

int statusCode = message.statusCode();

Headers headers = message.headers();
```

必要に応じて、レスポンスをJavaクラスのインスタンスにデシリアライズすることもできます：

```java
import com.anthropic.models.messages.Message;

Message parsedMessage = message.parse();
```

### ロギング

SDKは標準のOkHttpロギングインターセプターを使用します。

`ANTHROPIC_LOG`環境変数を`info`に設定してロギングを有効にします：

```bash
export ANTHROPIC_LOG=info
```

より詳細なロギングには`debug`に設定します：

```bash
export ANTHROPIC_LOG=debug
```

<Accordion title="Jacksonの互換性">
  SDKはJSONのシリアライズ/デシリアライズにJacksonを使用しています。バージョン2.13.4以上と互換性がありますが、デフォルトではバージョン2.19.4に依存しています。

  SDKは、実行時に互換性のないJacksonバージョンを検出した場合（たとえば、MavenまたはGradleの設定でデフォルトのバージョンが上書きされた場合）、例外をスローします。

  SDKが例外をスローしたものの、バージョンに互換性があることが確実な場合は、`AnthropicOkHttpClient`または`AnthropicOkHttpClientAsync`で`checkJacksonVersionCompatibility`を使用してバージョンチェックを無効にしてください。

  <Warning>
    Jacksonのバージョンチェックを無効にした場合、SDKが正しく動作する保証はありません。
  </Warning>

  また、古いJacksonバージョンにはSDKに影響を与える可能性のあるバグも存在します。SDKはすべてのJacksonのバグを回避するわけではなく、それらについてはユーザーがJacksonをアップグレードすることを想定しています。
</Accordion>

<Accordion title="ProGuard/R8の設定">
  SDKはリフレクションを使用していますが、`anthropic-java-core`はkeepルールを含む設定ファイルとともに公開されているため、ProGuardおよびR8でも使用できます。

  ProGuardとR8は公開されたルールを自動的に検出して使用するはずですが、必要に応じてkeepルールを手動でコピーすることもできます。
</Accordion>

### OpenTelemetryトレーシング

アプリケーションがOpenTelemetryトレーサープロバイダーを登録すると、SDKは送信する各リクエストについてスパンを出力します。スパンをオブザーバビリティプラットフォームに送信するには、[Claude SDKでOpenTelemetryを設定する](https://platform.claude.com/docs/ja/manage-claude/opentelemetry/sdk)を参照してください。

### ドキュメント化されていないAPI機能

SDKは、ドキュメント化されたAPIを便利に使用できるように型付けされています。ただし、APIのドキュメント化されていない部分やまだサポートされていない部分を扱うこともサポートしています。

#### ドキュメント化されていないリクエストパラメータ

ドキュメント化されていないリクエストパラメータを設定するには、[ドキュメント化されていないパラメータ](https://platform.claude.com/docs/ja/cli-sdks-libraries/sdks/java#undocumented-parameters)で説明されているように、`putAdditionalHeader`、`putAdditionalQueryParam`、または`putAdditionalBodyProperty`メソッドを使用します。

#### ドキュメント化されていないレスポンスのプロパティ

ドキュメント化されていないレスポンスのプロパティにアクセスするには、[レスポンスのプロパティ](https://platform.claude.com/docs/ja/cli-sdks-libraries/sdks/java#response-properties)で説明されているように、`_additionalProperties()`メソッドを使用します。

#### 新しい、または未リリースのenum値

`Model`や`AnthropicBeta`など、SDK内のenumに似たクラスは、閉じたJavaの`enum`型ではありません。それぞれが任意の文字列を受け付ける`of(String)`ファクトリメソッドを提供しているため、SDKのバージョンより後にリリースされたモデルやベータヘッダーなど、まだSDKに追加されていない値を使用できます：

```java
import com.anthropic.models.beta.AnthropicBeta;
import com.anthropic.models.messages.Model;

Model model = Model.of("some-new-model");
AnthropicBeta beta = AnthropicBeta.of("some-new-beta-2026-01-01");
```

これらの型を受け取るビルダーメソッドは、多くの場合、`of(...)`を代わりに呼び出す`String`オーバーロードも提供しています：

```java
import com.anthropic.models.messages.MessageCreateParams;

MessageCreateParams params = MessageCreateParams.builder()
  .model("some-new-model") // same as .model(Model.of("some-new-model"))
  .maxTokens(1024L)
  .addUserMessage("Hello, Claude")
  .build();
```

オートコンプリートや非推奨の警告を得られるように、適切に型付けされた定数（たとえば`Model.CLAUDE_OPUS_5`）を優先して使用してください。`String`オーバーロードと`of(...)`は、主に、その値を含むSDKリリースを待つ間に、フィールドをドキュメント化されていない値やまだサポートされていない値に設定するためのものです。

## ベータ機能

ベータ機能は、早期のフィードバックを得て新機能をテストするために、正式リリース前に利用可能になります。Claudeのすべての機能とツールの利用可能状況は、[機能の概要](https://platform.claude.com/docs/ja/build-with-claude/overview)で確認できます。

ほとんどのベータAPI機能には、クライアントの`beta()`メソッドを通じてアクセスできます。特定のベータ機能を有効にするには、メッセージパラメータを構築する際に`.addBeta()`で適切な[ベータヘッダー](https://platform.claude.com/docs/ja/api/beta-headers)を追加します。

たとえば、[コンテキスト編集](https://platform.claude.com/docs/ja/build-with-claude/context-editing)を有効にするには：

```java
import com.anthropic.models.beta.AnthropicBeta;
import com.anthropic.models.beta.messages.BetaMessage;
import com.anthropic.models.beta.messages.MessageCreateParams;
// ...
void main() {
    AnthropicClient client = AnthropicOkHttpClient.fromEnv();

    BetaMessage message = client.beta().messages().create(
        MessageCreateParams.builder()
            .model(Model.CLAUDE_OPUS_5_5)
            .maxTokens(1024L)
            .addBeta(AnthropicBeta.CONTEXT_MANAGEMENT_2025_06_27)
            .addUserMessage("Hello, Claude")
            .build());
}
```

## よくある質問

<AccordionGroup>
  <Accordion title="SDKが通常のenumクラスを使用しないのはなぜですか？">
    Javaの`enum`クラスは、簡単には前方互換性を保てません。SDKでこれらを使用すると、APIが新しいenum値で応答するように更新された場合に、実行時例外が発生する可能性があります。

    これらのクラスはオープンであるため、`of(String)`ファクトリメソッドを通じて任意の文字列値で構築することもできます。SDKのバージョンにまだ含まれていない値を使用する必要がある場合は、[新しい、または未リリースのenum値](https://platform.claude.com/docs/ja/cli-sdks-libraries/sdks/java#new-or-unreleased-enum-values)を参照してください。
  </Accordion>

  <Accordion title="フィールドが単なるTではなくJsonField<T>で表現されているのはなぜですか？">
    `JsonField<T>`を使用すると、いくつかの機能が有効になります：

    * ドキュメント化されていないAPI機能の使用を可能にする
    * 期待される形状に対してAPIレスポンスを遅延検証する
    * 値が存在しない場合と明示的にnullである場合を区別して表現する
  </Accordion>

  <Accordion title="SDKがデータクラスを使用しないのはなぜですか？">
    データクラスに新しいフィールドを追加することは後方互換性がなく、SDKはクラスにフィールドが追加されるたびに破壊的変更を導入することを避けています。
  </Accordion>

  <Accordion title="SDKがチェック例外を使用しないのはなぜですか？">
    チェック例外は、Javaプログラミング言語における誤りであると広く考えられています。実際、この理由からKotlinではチェック例外が省かれました。

    チェック例外は：

    * 処理が冗長になる
    * エラーに対して何もできない、誤った抽象化レベルでのエラー処理を促す
    * 関数の色付け問題のため、伝播させるのが面倒である
    * ラムダとの相性が悪い（これも関数の色付け問題のため）
  </Accordion>
</AccordionGroup>

## セマンティックバージョニング

このSDKの各メジャーバージョンは、デフォルトで`anthropic-version`ヘッダーに1つのAPIバージョンを送信し、新しいAPIバージョンごとに新しいメジャーバージョンがリリースされます。`2026-10-21`を送信する最初のメジャーバージョンは3.0.0です。[APIバージョン2026-10-21への移行](https://platform.claude.com/docs/ja/api/migration-2026-10-21#upgrade)を参照してください。

このパッケージは一般的に[SemVer](https://semver.org/spec/v2.0.0.html)の規約に従っていますが、特定の後方互換性のない変更がマイナーバージョンとしてリリースされる場合があります：

1. 技術的には公開されているものの、外部での使用を意図していない、またはドキュメント化されていないライブラリ内部の変更。
2. 実際には大多数のユーザーに影響を与えないと予想される変更。

## その他のリソース

* [GitHubリポジトリ](https://github.com/anthropics/anthropic-sdk-java)
* [Javadocs](https://javadoc.io/doc/com.anthropic/anthropic-java)
* [APIリファレンス](https://platform.claude.com/docs/ja/api/overview)
* [メッセージのストリーミング](https://platform.claude.com/docs/ja/build-with-claude/streaming)
* [Claudeでのツール使用](https://platform.claude.com/docs/ja/agents-and-tools/tool-use/overview)
