Ruby SDK
Sorbet型、ストリーミングヘルパー、コネクションプーリングを備えたAnthropic Ruby SDKのインストールと設定
Anthropic Rubyライブラリは、Ruby 3.2.0以降のあらゆるアプリケーションからClaude APIへの便利なアクセスを提供します。Yard、RBS、RBIによる包括的な型とdocstringが同梱されています。HTTPトランスポートには標準ライブラリのnet/httpが使用され、connection_pool gemによる「connection pooling」(コネクションプーリング)が行われます。
インストール
Bundlerを使用して、アプリケーションのGemfileにgemを追加します。
bundle add anthropic要件
Ruby 3.2.0以上。
使用方法
anthropic = Anthropic::Client.new(
api_key: ENV["ANTHROPIC_API_KEY"] # This is the default and can be omitted
)
message = anthropic.messages.create(
max_tokens: 1024,
messages: [{role: "user", content: "Hello, Claude"}],
model: :"claude-opus-5"
)
message.content.each do |block|
puts block.text if block.type == :text
endWorkload Identity Federationを含む認証オプションについては、認証を参照してください。お使いのAPIキーが複数のワークスペースにアクセスできる個人キーまたはサービスアカウントキーである場合は、anthropic-workspace-idリクエストヘッダーにワークスペースIDを設定してください。ワークスペースを選択するでは、このSDKにおけるリクエストごとのオプションを示しています。
ストリーミング
SDKは、Server-Sent Events(SSE)を使用した「streaming」(ストリーミング)レスポンスをサポートしています。
anthropic = Anthropic::Client.new
stream = anthropic.messages.stream(
max_tokens: 1024,
messages: [{role: "user", content: "Hello, Claude"}],
model: :"claude-opus-5"
)
stream.each do |message|
puts(message.type)
endストリーミングヘルパー
このライブラリは、メッセージのストリーミングのためにいくつかの便利な機能を提供します。例えば次のとおりです。
anthropic = Anthropic::Client.new
stream = anthropic.messages.stream(
max_tokens: 1024,
messages: [{role: :user, content: "Say hello there!"}],
model: :"claude-opus-5"
)
stream.text.each do |text|
print(text)
endanthropic.messages.stream(...)によるストリーミングでは、蓄積やSDK固有のイベントを含むさまざまなヘルパーが利用できます。
入力スキーマとツール呼び出し
SDKは、ツール用の構造化データクラスを定義し、Claudeにそれらを自動的に実行させるためのヘルパーメカニズムを提供します。ツールランナーを含むツール使用パターンの詳細なドキュメントについては、ツールランナー(SDK)を参照してください。
anthropic = Anthropic::Client.new
class CalculatorInput < Anthropic::BaseModel
required :lhs, Float
required :rhs, Float
required :operator, Anthropic::InputSchema::EnumOf[:+, :-, :*, :/]
end
class Calculator < Anthropic::BaseTool
input_schema CalculatorInput
def call(expr)
expr.lhs.public_send(expr.operator, expr.rhs)
end
end
# ツール実行ループを自動的に処理します
anthropic.beta.messages.tool_runner(
model: "claude-opus-5",
max_tokens: 1024,
messages: [{role: "user", content: "What's 15 * 7?"}],
tools: [Calculator.new]
).each_message { |message| puts message.content }構造化出力
Rubyの例を含む構造化出力の完全なドキュメントについては、構造化出力を参照してください。
エラー処理
ライブラリがAPIに接続できない場合、またはAPIが成功以外のステータスコード(つまり4xxまたは5xxレスポンス)を返した場合、Anthropic::Errors::APIErrorのサブクラスが発生します。
anthropic = Anthropic::Client.new
begin
message = anthropic.messages.create(
max_tokens: 1024,
messages: [{role: "user", content: "Hello, Claude"}],
model: :"claude-opus-5"
)
rescue Anthropic::Errors::APIConnectionError => e
puts("The server could not be reached")
puts(e.cause) # an underlying Exception, likely raised within `net/http`
rescue Anthropic::Errors::RateLimitError => e
puts("A 429 status code was received; we should back off a bit.")
rescue Anthropic::Errors::APIStatusError => e
puts("Another non-200-range status code was received")
puts(e.status)
endエラーコードは次のとおりです。
| 原因 | エラータイプ |
|---|---|
| HTTP 400 | BadRequestError |
| HTTP 401 | AuthenticationError |
| HTTP 403 | PermissionDeniedError |
| HTTP 404 | NotFoundError |
| HTTP 409 | ConflictError |
| HTTP 422 | UnprocessableEntityError |
| HTTP 429 | RateLimitError |
| HTTP >= 500 | InternalServerError |
| その他のHTTPエラー | APIStatusError |
| タイムアウト | APITimeoutError |
| ネットワークエラー | APIConnectionError |
リトライ
特定のエラーは、デフォルトで短い指数バックオフを伴って2回自動的にリトライされます。
接続エラー(例えばネットワーク接続の問題によるもの)、408 Request Timeout、409 Conflict、429 Rate Limit、>=500 Internalエラー、およびタイムアウトは、すべてデフォルトでリトライされます。
max_retriesオプションを使用して、これを設定または無効化できます。
# すべてのリクエストのデフォルトを設定します:
anthropic = Anthropic::Client.new(
max_retries: 0 # default is 2
)
# または、リクエストごとに設定します:
anthropic.messages.create(
max_tokens: 1024,
messages: [{role: "user", content: "Hello, Claude"}],
model: :"claude-opus-5",
request_options: {max_retries: 5}
)タイムアウト
デフォルトでは、リクエストは10分後にタイムアウトします。timeoutオプションを使用してこれを設定できます。
# すべてのリクエストのデフォルトを設定します:
anthropic = Anthropic::Client.new(
timeout: 20 # 20 seconds (default is 10 minutes)
)
# または、リクエストごとに設定します:
anthropic.messages.create(
max_tokens: 1024,
messages: [{role: "user", content: "Hello, Claude"}],
model: :"claude-opus-5",
request_options: {timeout: 5}
)タイムアウト時には、Anthropic::Errors::APITimeoutErrorが発生します。
タイムアウトしたリクエストはデフォルトでリトライされることに注意してください。
ページネーション
Claude APIのリストメソッドはページネーションされています。
このライブラリは各リストレスポンスに自動ページネーションイテレータを提供するため、後続のページを手動でリクエストする必要はありません。
anthropic = Anthropic::Client.new
page = anthropic.messages.batches.list(limit: 20)
# ページから単一のアイテムを取得します。
batch = page.data[0]
puts(batch.id)
# 必要に応じて追加のページを自動的に取得します。
page.auto_paging_each do |batch|
puts(batch.id)
endあるいは、#next_page?および#next_pageメソッドを使用して、ページをより細かく制御することもできます。
anthropic = Anthropic::Client.new
page = anthropic.messages.batches.list(limit: 20)
loop do
page.data&.each { |batch| puts(batch.id) }
break unless page.next_page?
page = page.next_page
endファイルアップロード
ファイルアップロードに対応するリクエストパラメータは、生のコンテンツ、Pathnameインスタンス、StringIOなどとして渡すことができます。
anthropic = Anthropic::Client.new
require "pathname"
# `Pathname`を使用してファイル名を送信し、大きなファイルをメモリに読み込むのを避けます:
file_metadata = anthropic.files.upload(file: Pathname("/path/to/file"))
# または、ファイルの内容や`StringIO`を直接渡します:
file_metadata = anthropic.files.upload(file: File.read("/path/to/file"))
# あるいは、ファイル名やコンテンツタイプを制御する場合:
file = Anthropic::FilePart.new(File.read("/path/to/file"), filename: "/path/to/file", content_type: "...")
file_metadata = anthropic.files.upload(file: file)
puts(file_metadata.id)生のIOディスクリプタを渡すこともできますが、ライブラリはディスクリプタがファイルなのかパイプ(巻き戻しできない)なのかを判断できないため、リトライが無効になることに注意してください。
Sorbet
このライブラリは包括的なRBI定義を提供しており、sorbet-runtimeへの依存はありません。
次のように型安全なリクエストパラメータを指定できます。
anthropic = Anthropic::Client.new
anthropic.messages.create(
max_tokens: 1024,
messages: [Anthropic::MessageParam.new(role: "user", content: "Hello, Claude")],
model: :"claude-opus-5"
)または、同等の方法として次のようにもできます。
anthropic = Anthropic::Client.new
# ハッシュも使えますが、型安全ではありません:
anthropic.messages.create(
max_tokens: 1024,
messages: [{role: "user", content: "Hello, Claude"}],
model: :"claude-opus-5"
)
# 完全なParamsクラスをスプラット展開することもできます:
params = Anthropic::MessageCreateParams.new(
max_tokens: 1024,
messages: [Anthropic::MessageParam.new(role: "user", content: "Hello, Claude")],
model: :"claude-opus-5"
)
anthropic.messages.create(**params)Enum
このライブラリはsorbet-runtimeに依存していないため、T::Enumインスタンスを提供できません。代わりに、SDKは「タグ付きシンボル」を提供します。これは実行時には常にプリミティブです。
# :auto
puts(Anthropic::MessageCreateParams::ServiceTier::AUTO)
# 判明した型: `T.all(Anthropic::MessageCreateParams::ServiceTier, Symbol)`
T.reveal_type(Anthropic::MessageCreateParams::ServiceTier::AUTO)Enumパラメータは「緩和された」型を持つため、enum定数またはそのリテラル値のどちらでも渡すことができます。
# enum定数を使用すると、タグ付き型情報が保持されます:
anthropic.messages.create(
service_tier: Anthropic::MessageCreateParams::ServiceTier::AUTO,
# ...
)
# リテラル値も使用できます:
anthropic.messages.create(
service_tier: :auto,
# ...
)BaseModel
すべてのパラメータオブジェクトとレスポンスオブジェクトはAnthropic::Internal::Type::BaseModelを継承しており、次のようないくつかの便利な機能を提供します。
-
未知のフィールドを含むすべてのフィールドは
obj[:prop]構文でアクセスでき、obj => {prop: prop}またはパターンマッチング構文で分割代入できます。 -
等価性における構造的同値性。2つのAPI呼び出しが同じ値を返した場合、レスポンスを==で比較するとtrueが返されます。
-
インスタンスとクラス自体の両方をpretty-printできます。
-
#to_h、#deep_to_h、#to_json、#to_yamlなどのヘルパー。
並行性とコネクションプーリング
Anthropic::Clientインスタンスはスレッドセーフですが、処理中のHTTPリクエストがない場合にのみフォークセーフです。
Anthropic::Clientの各インスタンスは、デフォルトサイズ99の独自のHTTPコネクションプールを持ちます。そのため、ほとんどの環境ではアプリケーションごとにクライアントを1回だけ作成することを推奨します。
プールから利用可能なすべての接続がチェックアウトされている場合、リクエストは新しい接続が利用可能になるまで待機し、キュー待ち時間はリクエストタイムアウトに含まれます。
特に明記されていない限り、SDK内の他のクラスには、基盤となるデータ構造を保護するロックはありません。
カスタムリクエストまたはドキュメント化されていないリクエストの実行
ドキュメント化されていないプロパティ
次のように、任意のエンドポイントにドキュメント化されていないパラメータを送信したり、ドキュメント化されていないレスポンスプロパティを読み取ったりできます。
anthropic = Anthropic::Client.new
value = "example"
message =
anthropic.messages.create(
max_tokens: 1024,
messages: [{role: "user", content: "Hello, Claude"}],
model: :"claude-opus-5",
request_options: {
extra_query: {my_query_parameter: value},
extra_body: {my_body_parameter: value},
extra_headers: {"my-header": value}
}
)
puts(message[:my_undocumented_property])ドキュメント化されていないリクエストパラメータ
追加のパラメータを明示的に送信したい場合は、上記の例のように、リクエスト時にrequest_options:パラメータ配下のextra_query、extra_body、extra_headersを使用して送信できます。
ドキュメント化されていないエンドポイント
認証やリトライなどの利点を維持しながらドキュメント化されていないエンドポイントにリクエストを行うには、次のようにanthropic.requestを使用してリクエストを行うことができます。
response = anthropic.request(
method: :post,
path: '/undocumented/endpoint',
query: {"dog": "woof"},
headers: {"useful-header": "interesting-value"},
body: {"hello": "world"}
)プラットフォーム統合
Ruby SDKは次のプラットフォームをサポートしています。
- Agent Platform:
Anthropic::VertexClient。googleauthgemが必要です。 - Bedrock:
Anthropic::BedrockMantleClient、またはbedrock-runtimeパス用のAnthropic::BedrockClient。Anthropic::BedrockMantleClientにはaws-sdk-coregemが必要です。Anthropic::BedrockClientにはaws-sdk-bedrockruntimegemが必要です。 - Claude Platform on AWS: メインの
anthropicgemの一部です(aws-sdk-coregemが必要です)。Anthropic::AWSClientを提供します。コンストラクタにworkspace_id:を渡すか、ANTHROPIC_AWS_WORKSPACE_ID環境変数を設定してください(ワークスペースを参照)。ベータ版で利用可能です。 - Foundry: 現在Ruby SDKではサポートされていません。サポートされているSDKについては、Claude in Microsoft Foundryを参照してください。
新規プロジェクトにはAnthropic::BedrockMantleClientを使用してください。Anthropic::BedrockClientは、BedrockのInvokeModel APIを使用する既存のアプリケーション向けに引き続き提供されます。
セマンティックバージョニング
このパッケージはSemVerの規約に従っています。
このパッケージでは、(非ランタイムの)*.rbiおよび*.rbs型定義の改善は破壊的変更ではないとみなします。
追加リソース
Was this page helpful?