Die Anthropic Ruby-Bibliothek bietet bequemen Zugriff auf die Anthropic REST API aus jeder Ruby 3.2.0+-Anwendung. Sie wird mit umfassenden Typen und Docstrings in Yard, RBS und RBI ausgeliefert. Als HTTP-Transport wird net/http aus der Standardbibliothek verwendet, mit „connection pooling" (Verbindungs-Pooling) über das connection_pool-Gem.
Für die API-Funktionsdokumentation mit Codebeispielen siehe die API-Referenz. Diese Seite behandelt Ruby-spezifische SDK-Funktionen und -Konfiguration.
Füge das Gem mit Bundler zur Gemfile deiner Anwendung hinzu:
bundle add anthropicRuby 3.2.0 oder höher.
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
endFür Authentifizierungsoptionen einschließlich Workload Identity Federation siehe Authentifizierung.
Das SDK bietet Unterstützung für Streaming-Antworten mittels Server-Sent Events (SSE).
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)
endDiese Bibliothek bietet mehrere Annehmlichkeiten für das Streaming von Nachrichten, zum Beispiel:
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)
endStreaming mit anthropic.messages.stream(...) stellt verschiedene Helfer bereit, einschließlich Akkumulation und SDK-spezifischer Events.
Das SDK bietet Hilfsmechanismen, um strukturierte Datenklassen für Tools zu definieren und Claude diese automatisch ausführen zu lassen. Eine detaillierte Dokumentation zu Mustern der Tool-Nutzung einschließlich des Tool Runners findest du unter Tool Runner (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
# Behandelt die Tool-Ausführungsschleife automatisch
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 }Die vollständige Dokumentation zu strukturierten Ausgaben einschließlich Ruby-Beispielen findest du unter Strukturierte Ausgaben.
Wenn die Bibliothek keine Verbindung zur API herstellen kann oder wenn die API einen nicht erfolgreichen Statuscode zurückgibt (d. h. eine 4xx- oder 5xx-Antwort), wird eine Unterklasse von Anthropic::Errors::APIError ausgelöst:
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)
endDie Fehlercodes sind wie folgt:
| Ursache | Fehlertyp |
|---|---|
| HTTP 400 | BadRequestError |
| HTTP 401 | AuthenticationError |
| HTTP 403 | PermissionDeniedError |
| HTTP 404 | NotFoundError |
| HTTP 409 | ConflictError |
| HTTP 422 | UnprocessableEntityError |
| HTTP 429 | RateLimitError |
| HTTP >= 500 | InternalServerError |
| Anderer HTTP-Fehler | APIStatusError |
| Timeout | APITimeoutError |
| Netzwerkfehler | APIConnectionError |
Bestimmte Fehler werden standardmäßig 2-mal automatisch wiederholt, mit einem kurzen exponentiellen Backoff.
Verbindungsfehler (zum Beispiel aufgrund eines Netzwerkverbindungsproblems), 408 Request Timeout, 409 Conflict, 429 Rate Limit, >=500 interne Fehler und Timeouts werden standardmäßig alle wiederholt.
Du kannst die Option max_retries verwenden, um dies zu konfigurieren oder zu deaktivieren:
# Konfiguriere den Standard für alle Anfragen:
anthropic = Anthropic::Client.new(
max_retries: 0 # default is 2
)
# Oder konfiguriere es pro Anfrage:
anthropic.messages.create(
max_tokens: 1024,
messages: [{role: "user", content: "Hello, Claude"}],
model: :"claude-opus-5",
request_options: {max_retries: 5}
)Standardmäßig laufen Anfragen nach 10 Minuten ab. Du kannst die Option timeout verwenden, um dies zu konfigurieren:
# Konfiguriere den Standard für alle Anfragen:
anthropic = Anthropic::Client.new(
timeout: 20 # 20 seconds (default is 10 minutes)
)
# Oder konfiguriere es pro Anfrage:
anthropic.messages.create(
max_tokens: 1024,
messages: [{role: "user", content: "Hello, Claude"}],
model: :"claude-opus-5",
request_options: {timeout: 5}
)Bei einem Timeout wird Anthropic::Errors::APITimeoutError ausgelöst.
Beachte, dass Anfragen, die in ein Timeout laufen, standardmäßig wiederholt werden.
Listen-Methoden in der Claude API sind paginiert.
Diese Bibliothek stellt mit jeder Listen-Antwort automatisch paginierende Iteratoren bereit, sodass du aufeinanderfolgende Seiten nicht manuell anfordern musst:
anthropic = Anthropic::Client.new
page = anthropic.messages.batches.list(limit: 20)
# Einzelnes Element von der Seite abrufen.
batch = page.data[0]
puts(batch.id)
# Ruft bei Bedarf automatisch weitere Seiten ab.
page.auto_paging_each do |batch|
puts(batch.id)
endAlternativ kannst du die Methoden #next_page? und #next_page für eine feinere Kontrolle bei der Arbeit mit Seiten verwenden.
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
endAnfrageparameter, die Datei-Uploads entsprechen, können als Rohinhalte, als Pathname-Instanz, als StringIO und mehr übergeben werden.
anthropic = Anthropic::Client.new
require "pathname"
# Verwende `Pathname`, um den Dateinamen zu übergeben und/oder zu vermeiden, dass eine große Datei in den Speicher geladen wird:
file_metadata = anthropic.beta.files.upload(file: Pathname("/path/to/file"))
# Alternativ kannst du den Dateiinhalt oder ein `StringIO` direkt übergeben:
file_metadata = anthropic.beta.files.upload(file: File.read("/path/to/file"))
# Oder, um den Dateinamen und/oder Content-Type zu steuern:
file = Anthropic::FilePart.new(File.read("/path/to/file"), filename: "/path/to/file", content_type: "...")
file_metadata = anthropic.beta.files.upload(file: file)
puts(file_metadata.id)Beachte, dass du auch einen rohen IO-Deskriptor übergeben kannst, dies deaktiviert jedoch Wiederholungsversuche, da die Bibliothek nicht sicher sein kann, ob der Deskriptor eine Datei oder eine Pipe ist (die nicht zurückgespult werden kann).
Diese Bibliothek stellt umfassende RBI-Definitionen bereit und hat keine Abhängigkeit von sorbet-runtime.
Du kannst typsichere Anfrageparameter wie folgt angeben:
anthropic = Anthropic::Client.new
anthropic.messages.create(
max_tokens: 1024,
messages: [Anthropic::MessageParam.new(role: "user", content: "Hello, Claude")],
model: :"claude-opus-5"
)Oder gleichwertig:
anthropic = Anthropic::Client.new
# Hashes funktionieren, sind aber nicht typsicher:
anthropic.messages.create(
max_tokens: 1024,
messages: [{role: "user", content: "Hello, Claude"}],
model: :"claude-opus-5"
)
# Du kannst auch eine vollständige Params-Klasse splatten:
params = Anthropic::MessageCreateParams.new(
max_tokens: 1024,
messages: [Anthropic::MessageParam.new(role: "user", content: "Hello, Claude")],
model: :"claude-opus-5"
)
anthropic.messages.create(**params)Da diese Bibliothek nicht von sorbet-runtime abhängt, kann sie keine T::Enum-Instanzen bereitstellen. Stattdessen stellt das SDK „tagged symbols" bereit, die zur Laufzeit immer ein Primitiv sind:
# :auto
puts(Anthropic::MessageCreateParams::ServiceTier::AUTO)
# Ermittelter Typ: `T.all(Anthropic::MessageCreateParams::ServiceTier, Symbol)`
T.reveal_type(Anthropic::MessageCreateParams::ServiceTier::AUTO)Enum-Parameter haben einen „entspannten" Typ, sodass du entweder Enum-Konstanten oder deren Literalwert übergeben kannst:
# Die Verwendung der Enum-Konstanten bewahrt die Typinformationen des Tags:
anthropic.messages.create(
service_tier: Anthropic::MessageCreateParams::ServiceTier::AUTO,
# ...
)
# Literale Werte sind ebenfalls zulässig:
anthropic.messages.create(
service_tier: :auto,
# ...
)Alle Parameter- und Antwortobjekte erben von Anthropic::Internal::Type::BaseModel, das mehrere Annehmlichkeiten bietet, darunter:
Alle Felder, einschließlich unbekannter, sind mit der obj[:prop]-Syntax zugänglich und können mit obj => {prop: prop} oder Pattern-Matching-Syntax destrukturiert werden.
Strukturelle Äquivalenz für Gleichheit; wenn zwei API-Aufrufe dieselben Werte zurückgeben, ergibt der Vergleich der Antworten mit == true.
Sowohl Instanzen als auch die Klassen selbst können „pretty-printed" werden.
Helfer wie #to_h, #deep_to_h, #to_json und #to_yaml.
Die Anthropic::Client-Instanzen sind threadsicher, aber nur fork-sicher, wenn keine HTTP-Anfragen in Bearbeitung sind.
Jede Instanz von Anthropic::Client hat ihren eigenen HTTP-Verbindungspool mit einer Standardgröße von 99. Daher wird in den meisten Umgebungen empfohlen, den Client einmal pro Anwendung zu erstellen.
Wenn alle verfügbaren Verbindungen aus dem Pool ausgecheckt sind, warten Anfragen darauf, dass eine neue Verbindung verfügbar wird, wobei die Wartezeit in der Warteschlange auf das Anfrage-Timeout angerechnet wird.
Sofern nicht anders angegeben, haben andere Klassen im SDK keine Locks, die ihre zugrunde liegende Datenstruktur schützen.
Du kannst undokumentierte Parameter an jeden Endpunkt senden und undokumentierte Antworteigenschaften lesen, wie folgt:
Die gleichnamigen extra_-Parameter überschreiben die dokumentierten Parameter. Stelle aus Sicherheitsgründen sicher, dass diese Methoden nur mit vertrauenswürdigen Eingabedaten verwendet werden.
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])Wenn du explizit einen zusätzlichen Parameter senden möchtest, kannst du dies mit extra_query, extra_body und extra_headers unter dem Parameter request_options: beim Stellen einer Anfrage tun, wie in den obigen Beispielen zu sehen.
Um Anfragen an undokumentierte Endpunkte zu stellen und dabei die Vorteile von Authentifizierung, Wiederholungsversuchen usw. zu behalten, kannst du Anfragen mit anthropic.request stellen, wie folgt:
response = anthropic.request(
method: :post,
path: '/undocumented/endpoint',
query: {"dog": "woof"},
headers: {"useful-header": "interesting-value"},
body: {"hello": "world"}
)Detaillierte Anleitungen zur Plattform-Einrichtung mit Codebeispielen findest du unter:
Das Ruby SDK unterstützt die folgenden Plattformen:
Anthropic::VertexClient. Erfordert das googleauth-Gem.Anthropic::BedrockMantleClient oder Anthropic::BedrockClient für den bedrock-runtime-Pfad. Anthropic::BedrockMantleClient erfordert das aws-sdk-core-Gem; Anthropic::BedrockClient erfordert das aws-sdk-bedrockruntime-Gem.anthropic (erfordert das aws-sdk-core-Gem). Stellt Anthropic::AWSClient bereit. Übergib workspace_id: an den Konstruktor oder setze die Umgebungsvariable ANTHROPIC_AWS_WORKSPACE_ID (siehe Workspaces). Als Beta verfügbar.Verwende Anthropic::BedrockMantleClient für neue Projekte; Anthropic::BedrockClient bleibt für bestehende Anwendungen erhalten, die die Bedrock InvokeModel API verwenden.
Dieses Paket folgt den SemVer-Konventionen. Da sich die Bibliothek in der anfänglichen Entwicklung befindet und eine Hauptversion von 0 hat, können sich APIs jederzeit ändern.
Dieses Paket betrachtet Verbesserungen an den (nicht zur Laufzeit verwendeten) *.rbi- und *.rbs-Typdefinitionen als nicht-brechende Änderungen.
Was this page helpful?