anthropic-rb 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.reek.yml +6 -9
- data/.rubocop.yml +1 -1
- data/.tool-versions +1 -1
- data/CHANGELOG.md +23 -1
- data/README.md +75 -44
- data/lib/anthropic/api/base.rb +72 -0
- data/lib/anthropic/api/completions.rb +1 -1
- data/lib/anthropic/api/concerns/requestable.rb +3 -3
- data/lib/anthropic/api/concerns/validatable.rb +3 -3
- data/lib/anthropic/api/messages.rb +2 -7
- data/lib/anthropic/bootstrapper.rb +2 -6
- data/lib/anthropic/{errors/requests.rb → client/base.rb} +42 -11
- data/lib/anthropic/client/standard.rb +46 -0
- data/lib/anthropic/client/streaming.rb +50 -0
- data/lib/anthropic/version.rb +1 -1
- data/sanity_check.rb +1 -1
- data/{lib/anthropic → schemas}/betas/tools-2024-04-04.json +2 -2
- data/{lib/anthropic → schemas}/versions/messages/2023-06-01.json +17 -0
- metadata +11 -13
- data/anthropic-rb.gemspec +0 -42
- data/lib/anthropic/api/base_api.rb +0 -55
- data/lib/anthropic/client.rb +0 -83
- data/lib/anthropic/errors/betas.rb +0 -14
- data/lib/anthropic/errors/versions.rb +0 -14
- /data/{lib/anthropic → schemas}/versions/completions/2023-06-01.json +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e743c686b28964af68a40c2e322caf6986284e2922d93d5acc0e2783128a5e5
|
4
|
+
data.tar.gz: 6ae03121d9cae81f15abdacb69a119428a9780f629fde7985a1a22be60192ea4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 352230790e752e44670cb9328b6f93139c1b5c6be9717b65996f1571a34acc9fd7fb28047bddcb32e5ce0c1826faeecb8364d9fd52ace649df868aad86428f9d
|
7
|
+
data.tar.gz: 2d94f8ac749b7d87d2081d2733a5fa52a0771a3dac3a7347af36ae3c40451b9c76362e8dc45540fb060b8c66d79c3fb3c7b351e08fedb489378758c84f9fc81e
|
data/.reek.yml
CHANGED
@@ -5,21 +5,18 @@ detectors:
|
|
5
5
|
TooManyStatements:
|
6
6
|
exclude:
|
7
7
|
- 'Anthropic::Api::Concerns::Validatable#schema'
|
8
|
-
- 'Anthropic::
|
9
|
-
- 'Anthropic::
|
8
|
+
- 'Anthropic::Api::Base#beta_config'
|
9
|
+
- 'Anthropic::Api::Base#version_config'
|
10
10
|
- 'Anthropic::Bootstrapper#self.load_betas'
|
11
11
|
- 'Anthropic::Bootstrapper#self.load_versions'
|
12
|
-
- 'Anthropic::Client#self.post'
|
13
|
-
|
14
|
-
exclude:
|
15
|
-
- 'Anthropic::Messages#initialize'
|
12
|
+
- 'Anthropic::Client::Standard#self.post'
|
13
|
+
- 'Anthropic::Client::Streaming#self.post'
|
16
14
|
DuplicateMethodCall:
|
17
15
|
exclude:
|
18
|
-
- 'Anthropic::
|
19
|
-
- 'Anthropic::Messages#create'
|
16
|
+
- 'Anthropic::Api::Base#version_config'
|
20
17
|
InstanceVariableAssumption:
|
21
18
|
exclude:
|
22
|
-
- 'Anthropic::
|
19
|
+
- 'Anthropic::Api::Base'
|
23
20
|
NestedIterators:
|
24
21
|
exclude:
|
25
22
|
- 'Anthropic::Bootstrapper#self.load_versions'
|
data/.rubocop.yml
CHANGED
data/.tool-versions
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby 3.
|
1
|
+
ruby 3.2.4
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,26 @@
|
|
2
2
|
|
3
3
|
## [Unreleased]
|
4
4
|
|
5
|
+
## [0.6.0] - 2024-06-25
|
6
|
+
|
7
|
+
### Breaking Changes
|
8
|
+
|
9
|
+
- Responses from the Anthropic API are now encapsulated as data objects.
|
10
|
+
- Dropped support for Ruby versions prior to 3.2.4.
|
11
|
+
|
12
|
+
### Added
|
13
|
+
|
14
|
+
- Added link to `anthropic-rb-cookbook`.
|
15
|
+
|
16
|
+
### Removed
|
17
|
+
|
18
|
+
- Removed streaming contraint for tools use.
|
19
|
+
|
20
|
+
### Updated
|
21
|
+
|
22
|
+
- Refactored project for maintainability.
|
23
|
+
- Updated project funding.
|
24
|
+
|
5
25
|
## [0.5.0] - 2024-04-22
|
6
26
|
|
7
27
|
### Updated
|
@@ -9,6 +29,7 @@
|
|
9
29
|
- Refactored project for maintainability.
|
10
30
|
|
11
31
|
### Breaking Changes
|
32
|
+
|
12
33
|
- You must now pass the beta ID when enabling a beta feature. The only current beta is for Tools (id: tools-2024-04-04). Previously, you would pass `true` to enable the beta.
|
13
34
|
|
14
35
|
## [0.4.0] - 2024-04-20
|
@@ -66,7 +87,8 @@
|
|
66
87
|
|
67
88
|
- Initial release
|
68
89
|
|
69
|
-
[Unreleased]: https://github.com/dickdavis/anthropic-rb/compare/v0.
|
90
|
+
[Unreleased]: https://github.com/dickdavis/anthropic-rb/compare/v0.6.0...HEAD
|
91
|
+
[0.6.0]: https://github.com/dickdavis/anthropic-rb/compare/v0.5.0...v0.6.0
|
70
92
|
[0.5.0]: https://github.com/dickdavis/anthropic-rb/compare/v0.4.0...v0.5.0
|
71
93
|
[0.4.0]: https://github.com/dickdavis/anthropic-rb/compare/v0.3.0...v0.4.0
|
72
94
|
[0.3.0]: https://github.com/dickdavis/anthropic-rb/compare/v0.2.5...v0.3.0
|
data/README.md
CHANGED
@@ -4,6 +4,8 @@ Ruby bindings for the Anthropic API. This library is unofficial and is not affil
|
|
4
4
|
|
5
5
|
The goal of this project is feature parity with Anthropic's Python SDK until an official Ruby SDK is available.
|
6
6
|
|
7
|
+
You can find examples of usage in the [anthropic-rb-cookbook](https://github.com/dickdavis/anthropic-rb-cookbook/).
|
8
|
+
|
7
9
|
## Usage
|
8
10
|
|
9
11
|
anthropic-rb will default to the value of the `ANTHROPIC_API_KEY` environment variable. However, you may initialize the library with your API key. You must set your API key before using the library.
|
@@ -34,35 +36,61 @@ You can send a request to the Messages API.
|
|
34
36
|
Anthropic.messages.create(model: 'claude-2.1', max_tokens: 200, messages: [{role: 'user', content: 'Yo what up?'}])
|
35
37
|
|
36
38
|
# Output =>
|
37
|
-
|
38
|
-
# id: "msg_013ePdwEkb4RMC1hCE61Hbm8",
|
39
|
-
# type: "message",
|
40
|
-
# role: "assistant",
|
41
|
-
# content: [{type: "text", text: "Hello! Not much up with me, just chatting. How about you?"}],
|
42
|
-
# model: "claude-2.1",
|
43
|
-
# stop_reason: "end_turn",
|
44
|
-
# stop_sequence: nil
|
45
|
-
# }
|
39
|
+
#<data Anthropic::Client::Response status="success", body={:id=>"msg_01UqHiw6oFLjMYiLV8hkXsrR", :type=>"message", :role=>"assistant", :model=>"claude-2.1", :content=>[{:type=>"text", :text=>"Hello! Not much up with me, just chatting with you. How's it going?"}], :stop_reason=>"end_turn", :stop_sequence=>nil, :usage=>{:input_tokens=>13, :output_tokens=>22}}>
|
46
40
|
```
|
47
41
|
|
48
42
|
Alternatively, you can stream the response:
|
49
43
|
|
50
44
|
```ruby
|
51
|
-
|
45
|
+
options = {
|
46
|
+
model: 'claude-2.1',
|
47
|
+
max_tokens: 200,
|
48
|
+
messages: [{role: 'user', content: 'Yo what up?'}],
|
49
|
+
stream: true
|
50
|
+
}
|
51
|
+
|
52
|
+
Anthropic.messages.create(**options) do |event|
|
52
53
|
puts event
|
53
54
|
end
|
54
55
|
|
55
56
|
# Output =>
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
57
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"message_start", :message=>{:id=>"msg_01EsYcQkBJrHrtgpY5ZcLzvf", :type=>"message", :role=>"assistant", :model=>"claude-2.1", :content=>[], :stop_reason=>nil, :stop_sequence=>nil, :usage=>{:input_tokens=>13, :output_tokens=>1}}}>
|
58
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_start", :index=>0, :content_block=>{:type=>"text", :text=>""}}>
|
59
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>"Hello"}}>
|
60
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>"!"}}>
|
61
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>" Not"}}>
|
62
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>" much"}}>
|
63
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>" up"}}>
|
64
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>" with"}}>
|
65
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>" me"}}>
|
66
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>","}}>
|
67
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>" I"}}>
|
68
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>"'m"}}>
|
69
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>" an"}}>
|
70
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>" AI"}}>
|
71
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>" assistant"}}>
|
72
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>" create"}}>
|
73
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>"d by"}}>
|
74
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>" An"}}>
|
75
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>"throp"}}>
|
76
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>"ic"}}>
|
77
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_delta", :index=>0, :delta=>{:type=>"text_delta", :text=>"."}}>
|
78
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"content_block_stop", :index=>0}>
|
79
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"message_delta", :delta=>{:stop_reason=>"end_turn", :stop_sequence=>nil}, :usage=>{:output_tokens=>23}}>
|
80
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"message_stop"}>
|
81
|
+
|
82
|
+
# Or, if you just want to print the text content:
|
83
|
+
Anthropic.messages.create(**options) do |event|
|
84
|
+
next unless event.body[:type] == 'content_block_delta'
|
85
|
+
|
86
|
+
print event.body[:delta][:text]
|
87
|
+
end
|
88
|
+
|
89
|
+
# Output =>
|
90
|
+
# Hello! Not much up with me, I'm an AI assistant created by Anthropic.
|
63
91
|
```
|
64
92
|
|
65
|
-
You can also
|
93
|
+
You can also pass in a list of tools the assistant can use. You can find out more information about tools in the [documentation](https://docs.anthropic.com/claude/docs/tool-use).
|
66
94
|
|
67
95
|
```ruby
|
68
96
|
tools = [
|
@@ -79,7 +107,7 @@ tools = [
|
|
79
107
|
}
|
80
108
|
]
|
81
109
|
|
82
|
-
Anthropic.messages
|
110
|
+
Anthropic.messages.create(
|
83
111
|
model: 'claude-3-opus-20240229',
|
84
112
|
max_tokens: 200,
|
85
113
|
tools:,
|
@@ -87,8 +115,6 @@ Anthropic.messages(beta: 'tools-2024-04-04').create(
|
|
87
115
|
)
|
88
116
|
```
|
89
117
|
|
90
|
-
Streaming is currently not supported by the tools beta. You can find out more information about tools in the [documentation](https://docs.anthropic.com/claude/docs/tool-use).
|
91
|
-
|
92
118
|
### Completions API
|
93
119
|
|
94
120
|
To make a request to the Completions API:
|
@@ -101,38 +127,41 @@ Anthropic.completions.create(
|
|
101
127
|
)
|
102
128
|
|
103
129
|
# Output =>
|
104
|
-
|
105
|
-
# completion: "Hello! Not much going on with me, just chatting. How about you?",
|
106
|
-
# stop_reason: "stop_sequence",
|
107
|
-
# model: "claude-2.1",
|
108
|
-
# stop: "\n\nHuman:",
|
109
|
-
# log_id: "2496914137c520ec2b4ae8315864bcf3a4c6ce9f2e3c96e13be4c004587313ca"
|
110
|
-
# }
|
130
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"completion", :id=>"compl_01Y9ptPR7xGHaH9rC3ffJExU", :completion=>" Hello! Not much going on here. How about you?", :stop_reason=>"stop_sequence", :model=>"claude-2.1", :stop=>"\n\nHuman:", :log_id=>"compl_01Y9ptPR7xGHaH9rC3ffJExU"}>
|
111
131
|
```
|
112
132
|
|
113
133
|
Alternatively, you can stream the response:
|
114
134
|
|
115
135
|
```ruby
|
116
|
-
|
136
|
+
options = {
|
137
|
+
model: 'claude-2',
|
138
|
+
max_tokens_to_sample: 200,
|
139
|
+
prompt: 'Human: Yo what up?\n\nAssistant:',
|
140
|
+
stream: true
|
141
|
+
}
|
142
|
+
|
143
|
+
Anthropic.completions.create(**options) do |event|
|
117
144
|
puts event
|
118
145
|
end
|
119
146
|
|
120
147
|
# Output =>
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
#
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
148
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"completion", :id=>"compl_015AktggW7tcM4w11YpkuMbP", :completion=>" Hello", :stop_reason=>nil, :model=>"claude-2.1", :stop=>nil, :log_id=>"compl_015AktggW7tcM4w11YpkuMbP"}>
|
149
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"completion", :id=>"compl_015AktggW7tcM4w11YpkuMbP", :completion=>"!", :stop_reason=>nil, :model=>"claude-2.1", :stop=>nil, :log_id=>"compl_015AktggW7tcM4w11YpkuMbP"}>
|
150
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"completion", :id=>"compl_015AktggW7tcM4w11YpkuMbP", :completion=>" Not", :stop_reason=>nil, :model=>"claude-2.1", :stop=>nil, :log_id=>"compl_015AktggW7tcM4w11YpkuMbP"}>
|
151
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"completion", :id=>"compl_015AktggW7tcM4w11YpkuMbP", :completion=>" much", :stop_reason=>nil, :model=>"claude-2.1", :stop=>nil, :log_id=>"compl_015AktggW7tcM4w11YpkuMbP"}>
|
152
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"completion", :id=>"compl_015AktggW7tcM4w11YpkuMbP", :completion=>" going", :stop_reason=>nil, :model=>"claude-2.1", :stop=>nil, :log_id=>"compl_015AktggW7tcM4w11YpkuMbP"}>
|
153
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"completion", :id=>"compl_015AktggW7tcM4w11YpkuMbP", :completion=>" on", :stop_reason=>nil, :model=>"claude-2.1", :stop=>nil, :log_id=>"compl_015AktggW7tcM4w11YpkuMbP"}>
|
154
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"completion", :id=>"compl_015AktggW7tcM4w11YpkuMbP", :completion=>" here", :stop_reason=>nil, :model=>"claude-2.1", :stop=>nil, :log_id=>"compl_015AktggW7tcM4w11YpkuMbP"}>
|
155
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"completion", :id=>"compl_015AktggW7tcM4w11YpkuMbP", :completion=>".", :stop_reason=>nil, :model=>"claude-2.1", :stop=>nil, :log_id=>"compl_015AktggW7tcM4w11YpkuMbP"}>
|
156
|
+
#<data Anthropic::Client::Response status="success", body={:type=>"completion", :id=>"compl_015AktggW7tcM4w11YpkuMbP", :completion=>"", :stop_reason=>"stop_sequence", :model=>"claude-2.1", :stop=>"\n\nHuman:", :log_id=>"compl_015AktggW7tcM4w11YpkuMbP"}>
|
157
|
+
|
158
|
+
# Or, if you just want to print the text content:
|
159
|
+
Anthropic.completions.create(**options) do |event|
|
160
|
+
print event.body[:completion]
|
161
|
+
end
|
162
|
+
|
163
|
+
# Output =>
|
164
|
+
# Hello! Not much, just chatting with you. How's it going?
|
136
165
|
```
|
137
166
|
|
138
167
|
## Installation
|
@@ -161,6 +190,8 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
|
161
190
|
|
162
191
|
To install this gem onto your local machine, run `bundle exec rake install`.
|
163
192
|
|
193
|
+
To run a sanity check, run `ruby sanity_check.rb`.
|
194
|
+
|
164
195
|
To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
165
196
|
|
166
197
|
## Contributing
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'concerns/requestable'
|
4
|
+
require_relative 'concerns/validatable'
|
5
|
+
|
6
|
+
module Anthropic
|
7
|
+
module Api
|
8
|
+
# Error for when a beta feature is configured incorrectly.
|
9
|
+
class InvalidBetaConfigurationError < StandardError; end
|
10
|
+
|
11
|
+
# Error for when API version is missing a schema.
|
12
|
+
class MissingSchemaError < StandardError; end
|
13
|
+
|
14
|
+
# Error for when the provided params do not match the API schema
|
15
|
+
class SchemaValidationError < StandardError; end
|
16
|
+
|
17
|
+
# Error for when the API version is not supported.
|
18
|
+
class UnsupportedApiVersionError < StandardError; end
|
19
|
+
|
20
|
+
# Error for when the provided beta is not supported.
|
21
|
+
class UnsupportedBetaError < StandardError; end
|
22
|
+
|
23
|
+
##
|
24
|
+
# Provides a base class for APIs
|
25
|
+
class Base
|
26
|
+
include Anthropic::Api::Concerns::Requestable
|
27
|
+
include Anthropic::Api::Concerns::Validatable
|
28
|
+
|
29
|
+
def initialize(beta: nil)
|
30
|
+
@beta = beta
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
attr_reader :beta
|
36
|
+
|
37
|
+
def api
|
38
|
+
self.class.name.split('::').last.downcase
|
39
|
+
end
|
40
|
+
|
41
|
+
def version_config
|
42
|
+
return @version_config if defined?(@version_config)
|
43
|
+
|
44
|
+
@version_config ||= catch(:version_found) do
|
45
|
+
found_config = Anthropic.versions[api.to_sym].find { |config| config['version'] == Anthropic.api_version }
|
46
|
+
unless found_config
|
47
|
+
raise Anthropic::Api::UnsupportedApiVersionError, "Unsupported API version: #{Anthropic.api_version}"
|
48
|
+
end
|
49
|
+
|
50
|
+
throw :version_found, found_config
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def beta_config
|
55
|
+
return @beta_config if defined?(@beta_config)
|
56
|
+
|
57
|
+
@beta_config = catch(:beta_found) do
|
58
|
+
found_config = Anthropic.betas.find { |config| config['id'] == beta }
|
59
|
+
raise Anthropic::Api::UnsupportedBetaError, "#{beta} not supported" unless found_config
|
60
|
+
|
61
|
+
throw :beta_found, found_config
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def beta_loaded?(name)
|
66
|
+
return false unless beta
|
67
|
+
|
68
|
+
beta_config['id'] == name
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -7,11 +7,11 @@ module Anthropic
|
|
7
7
|
# Provides helpers for sending API requests
|
8
8
|
module Requestable
|
9
9
|
def post(params)
|
10
|
-
Anthropic::Client.post(uri, params, additional_headers)
|
10
|
+
Anthropic::Client::Standard.post(uri, params, additional_headers)
|
11
11
|
end
|
12
12
|
|
13
13
|
def post_as_stream(params, &)
|
14
|
-
Anthropic::Client.
|
14
|
+
Anthropic::Client::Streaming.post(uri, params, additional_headers, &)
|
15
15
|
end
|
16
16
|
|
17
17
|
def uri
|
@@ -26,7 +26,7 @@ module Anthropic
|
|
26
26
|
return {} unless beta
|
27
27
|
|
28
28
|
header = beta_config['header']
|
29
|
-
raise Anthropic::
|
29
|
+
raise Anthropic::Api::InvalidBetaConfigurationError, "Missing header: #{beta}" unless header
|
30
30
|
|
31
31
|
header
|
32
32
|
end
|
@@ -9,19 +9,19 @@ module Anthropic
|
|
9
9
|
def validate!(params)
|
10
10
|
JSON::Validator.validate!(schema, params)
|
11
11
|
rescue JSON::Schema::ValidationError => error
|
12
|
-
raise Anthropic::
|
12
|
+
raise Anthropic::Api::SchemaValidationError, error.message
|
13
13
|
end
|
14
14
|
|
15
15
|
def schema
|
16
16
|
api_schema = version_config['schema']
|
17
17
|
|
18
18
|
unless api_schema
|
19
|
-
raise Anthropic::
|
19
|
+
raise Anthropic::Api::MissingSchemaError, "Missing schema for API version: #{Anthropic.api_version}"
|
20
20
|
end
|
21
21
|
|
22
22
|
if beta
|
23
23
|
beta_schema = beta_config['schema']
|
24
|
-
raise Anthropic::
|
24
|
+
raise Anthropic::Api::InvalidBetaConfigurationError, "Missing beta schema: #{beta}" unless beta_schema
|
25
25
|
|
26
26
|
api_schema['properties'].merge!(beta_schema)
|
27
27
|
end
|
@@ -4,15 +4,10 @@ module Anthropic
|
|
4
4
|
module Api
|
5
5
|
##
|
6
6
|
# Provides bindings for the Anthropic messages API
|
7
|
-
class Messages <
|
7
|
+
class Messages < Base
|
8
8
|
def create(**params, &)
|
9
|
-
streaming = params[:stream]
|
10
|
-
if streaming && beta_loaded?('tools-2024-04-04')
|
11
|
-
raise Anthropic::Errors::UnsupportedBetaUseError, 'Tool use is not yet supported in streaming mode'
|
12
|
-
end
|
13
|
-
|
14
9
|
validate!(params)
|
15
|
-
return post(params) unless
|
10
|
+
return post(params) unless params[:stream]
|
16
11
|
|
17
12
|
post_as_stream(params, &)
|
18
13
|
end
|
@@ -7,9 +7,7 @@ module Anthropic
|
|
7
7
|
# Provides methods for bootstrapping the Anthropic gem
|
8
8
|
module Bootstrapper
|
9
9
|
def self.load_betas
|
10
|
-
|
11
|
-
directory_path = File.join(current_dir, 'betas')
|
12
|
-
|
10
|
+
directory_path = File.expand_path('../../schemas/betas', __dir__)
|
13
11
|
raise "Directory not found: #{directory_path}" unless Dir.exist?(directory_path)
|
14
12
|
|
15
13
|
file_paths = Dir.glob(File.join(directory_path, '*.json'))
|
@@ -21,9 +19,7 @@ module Anthropic
|
|
21
19
|
|
22
20
|
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
23
21
|
def self.load_versions
|
24
|
-
|
25
|
-
directory_path = File.join(current_dir, 'versions')
|
26
|
-
|
22
|
+
directory_path = File.expand_path('../../schemas/versions', __dir__)
|
27
23
|
raise "Directory not found: #{directory_path}" unless Dir.exist?(directory_path)
|
28
24
|
|
29
25
|
versions = {}
|
@@ -1,30 +1,61 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'httpx'
|
4
|
+
|
3
5
|
module Anthropic
|
4
|
-
module
|
6
|
+
module Client
|
5
7
|
##
|
6
|
-
# Error when the
|
7
|
-
class
|
8
|
+
# Error when the server experienced an internal error.
|
9
|
+
class ApiError < StandardError; end
|
10
|
+
|
8
11
|
##
|
9
12
|
# Error when the API key is invalid.
|
10
13
|
class AuthenticationError < StandardError; end
|
14
|
+
|
11
15
|
##
|
12
|
-
# Error when the
|
13
|
-
class
|
16
|
+
# Error when the resource already exists.
|
17
|
+
class ConflictError < StandardError; end
|
18
|
+
|
19
|
+
##
|
20
|
+
# Error when the request is malformed.
|
21
|
+
class InvalidRequestError < StandardError; end
|
22
|
+
|
14
23
|
##
|
15
24
|
# Error when the resource is not found.
|
16
25
|
class NotFoundError < StandardError; end
|
26
|
+
|
17
27
|
##
|
18
|
-
# Error when the
|
19
|
-
class
|
28
|
+
# Error when the API servers are overloaded.
|
29
|
+
class OverloadedError < StandardError; end
|
30
|
+
|
20
31
|
##
|
21
|
-
# Error when the
|
22
|
-
class
|
32
|
+
# Error when the account does not have permission for the operation.
|
33
|
+
class PermissionError < StandardError; end
|
34
|
+
|
23
35
|
##
|
24
36
|
# Error when the request exceeds the rate limit.
|
25
37
|
class RateLimitError < StandardError; end
|
38
|
+
|
26
39
|
##
|
27
|
-
# Error when the
|
28
|
-
class
|
40
|
+
# Error when the resource cannot be processed.
|
41
|
+
class UnprocessableEntityError < StandardError; end
|
42
|
+
|
43
|
+
##
|
44
|
+
# Defines a data object for responses
|
45
|
+
Response = Data.define(:status, :body)
|
46
|
+
|
47
|
+
##
|
48
|
+
# Provides a base class for clients
|
49
|
+
class Base
|
50
|
+
class << self
|
51
|
+
private
|
52
|
+
|
53
|
+
def build_response(response)
|
54
|
+
response_hash = JSON.parse(response, symbolize_names: true)
|
55
|
+
status = response_hash[:type] == 'error' ? 'failure' : 'success'
|
56
|
+
Anthropic::Client::Response.new(status:, body: response_hash)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
29
60
|
end
|
30
61
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Anthropic
|
4
|
+
module Client
|
5
|
+
##
|
6
|
+
# Provides a client for sending standard HTTP requests.
|
7
|
+
class Standard < Base
|
8
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
9
|
+
def self.post(url, data, headers = {})
|
10
|
+
response = HTTPX.with(
|
11
|
+
headers: {
|
12
|
+
'Content-Type' => 'application/json',
|
13
|
+
'x-api-key' => Anthropic.api_key,
|
14
|
+
'anthropic-version' => Anthropic.api_version
|
15
|
+
}.merge(headers)
|
16
|
+
).post(url, json: data)
|
17
|
+
|
18
|
+
response_data = build_response(response.body)
|
19
|
+
|
20
|
+
case response.status
|
21
|
+
when 200
|
22
|
+
response_data
|
23
|
+
when 400
|
24
|
+
raise Anthropic::Client::InvalidRequestError, response_data
|
25
|
+
when 401
|
26
|
+
raise Anthropic::Client::AuthenticationError, response_data
|
27
|
+
when 403
|
28
|
+
raise Anthropic::Client::PermissionError, response_data
|
29
|
+
when 404
|
30
|
+
raise Anthropic::Client::NotFoundError, response_data
|
31
|
+
when 409
|
32
|
+
raise Anthropic::Client::ConflictError, response_data
|
33
|
+
when 422
|
34
|
+
raise Anthropic::Client::UnprocessableEntityError, response_data
|
35
|
+
when 429
|
36
|
+
raise Anthropic::Client::RateLimitError, response_data
|
37
|
+
when 500
|
38
|
+
raise Anthropic::Client::ApiError, response_data
|
39
|
+
when 529
|
40
|
+
raise Anthropic::Client::OverloadedError, response_data
|
41
|
+
end
|
42
|
+
end
|
43
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Anthropic
|
4
|
+
module Client
|
5
|
+
##
|
6
|
+
# Provides a client for sending streaming HTTP requests.
|
7
|
+
class Streaming < Base
|
8
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
9
|
+
def self.post(url, data, headers = {})
|
10
|
+
response = HTTPX.plugin(:stream).with(
|
11
|
+
headers: {
|
12
|
+
'Content-Type' => 'application/json',
|
13
|
+
'x-api-key' => Anthropic.api_key,
|
14
|
+
'anthropic-version' => Anthropic.api_version
|
15
|
+
}.merge(headers)
|
16
|
+
).post(url, json: data, stream: true)
|
17
|
+
|
18
|
+
response.each_line do |line|
|
19
|
+
type, event = line.split(/(\w+\b:\s)/)[1..2]
|
20
|
+
next unless type&.start_with?('data') && event
|
21
|
+
|
22
|
+
response_data = build_response(event)
|
23
|
+
yield response_data unless %w[ping error].include?(response_data.body[:type])
|
24
|
+
end
|
25
|
+
rescue HTTPX::HTTPError => error
|
26
|
+
case error.response.status
|
27
|
+
when 400
|
28
|
+
raise Anthropic::Client::InvalidRequestError
|
29
|
+
when 401
|
30
|
+
raise Anthropic::Client::AuthenticationError
|
31
|
+
when 403
|
32
|
+
raise Anthropic::Client::PermissionError
|
33
|
+
when 404
|
34
|
+
raise Anthropic::Client::NotFoundError
|
35
|
+
when 409
|
36
|
+
raise Anthropic::Client::ConflictError
|
37
|
+
when 422
|
38
|
+
raise Anthropic::Client::UnprocessableEntityError
|
39
|
+
when 429
|
40
|
+
raise Anthropic::Client::RateLimitError
|
41
|
+
when 500
|
42
|
+
raise Anthropic::Client::ApiError
|
43
|
+
when 529
|
44
|
+
raise Anthropic::Client::OverloadedError
|
45
|
+
end
|
46
|
+
end
|
47
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/anthropic/version.rb
CHANGED
data/sanity_check.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"id": "tools-2024-04-04",
|
3
|
-
"name": "Tools",
|
4
|
-
"description": "Equips Claude with custom tools for interacting with clients for a wide variety of tasks.",
|
3
|
+
"name": "[Deprecated] Tools",
|
4
|
+
"description": "[Deprecated] Equips Claude with custom tools for interacting with clients for a wide variety of tasks.",
|
5
5
|
"documentation": "https://docs.anthropic.com/claude/docs/tool-use",
|
6
6
|
"header" : { "anthropic-beta": "tools-2024-04-04" },
|
7
7
|
"schema": {
|
@@ -30,6 +30,23 @@
|
|
30
30
|
"temperature": {
|
31
31
|
"type": "number"
|
32
32
|
},
|
33
|
+
"tools": {
|
34
|
+
"type": "array",
|
35
|
+
"items": {
|
36
|
+
"type": "object",
|
37
|
+
"properties": {
|
38
|
+
"name": {
|
39
|
+
"type": "string"
|
40
|
+
},
|
41
|
+
"description": {
|
42
|
+
"type": "string"
|
43
|
+
},
|
44
|
+
"input_schema": {
|
45
|
+
"type": "object"
|
46
|
+
}
|
47
|
+
}
|
48
|
+
}
|
49
|
+
},
|
33
50
|
"top_k": {
|
34
51
|
"type": "integer"
|
35
52
|
},
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: anthropic-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dick Davis
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httpx
|
@@ -54,23 +54,21 @@ files:
|
|
54
54
|
- LICENSE.txt
|
55
55
|
- README.md
|
56
56
|
- Rakefile
|
57
|
-
- anthropic-rb.gemspec
|
58
57
|
- lib/anthropic.rb
|
59
|
-
- lib/anthropic/api/
|
58
|
+
- lib/anthropic/api/base.rb
|
60
59
|
- lib/anthropic/api/completions.rb
|
61
60
|
- lib/anthropic/api/concerns/requestable.rb
|
62
61
|
- lib/anthropic/api/concerns/validatable.rb
|
63
62
|
- lib/anthropic/api/messages.rb
|
64
|
-
- lib/anthropic/betas/tools-2024-04-04.json
|
65
63
|
- lib/anthropic/bootstrapper.rb
|
66
|
-
- lib/anthropic/client.rb
|
67
|
-
- lib/anthropic/
|
68
|
-
- lib/anthropic/
|
69
|
-
- lib/anthropic/errors/versions.rb
|
64
|
+
- lib/anthropic/client/base.rb
|
65
|
+
- lib/anthropic/client/standard.rb
|
66
|
+
- lib/anthropic/client/streaming.rb
|
70
67
|
- lib/anthropic/version.rb
|
71
|
-
- lib/anthropic/versions/completions/2023-06-01.json
|
72
|
-
- lib/anthropic/versions/messages/2023-06-01.json
|
73
68
|
- sanity_check.rb
|
69
|
+
- schemas/betas/tools-2024-04-04.json
|
70
|
+
- schemas/versions/completions/2023-06-01.json
|
71
|
+
- schemas/versions/messages/2023-06-01.json
|
74
72
|
- sig/anthropic/rb.rbs
|
75
73
|
homepage: https://github.com/dickdavis/anthropic-rb
|
76
74
|
licenses:
|
@@ -89,14 +87,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
89
87
|
requirements:
|
90
88
|
- - ">="
|
91
89
|
- !ruby/object:Gem::Version
|
92
|
-
version:
|
90
|
+
version: 3.2.4
|
93
91
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
92
|
requirements:
|
95
93
|
- - ">="
|
96
94
|
- !ruby/object:Gem::Version
|
97
95
|
version: '0'
|
98
96
|
requirements: []
|
99
|
-
rubygems_version: 3.
|
97
|
+
rubygems_version: 3.4.19
|
100
98
|
signing_key:
|
101
99
|
specification_version: 4
|
102
100
|
summary: Ruby bindings for the Anthropic API
|
data/anthropic-rb.gemspec
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'lib/anthropic/version'
|
4
|
-
|
5
|
-
Gem::Specification.new do |spec|
|
6
|
-
spec.name = 'anthropic-rb'
|
7
|
-
spec.version = Anthropic::VERSION
|
8
|
-
spec.authors = ['Dick Davis']
|
9
|
-
spec.email = ['dick@hey.com']
|
10
|
-
|
11
|
-
spec.summary = 'Ruby bindings for the Anthropic API'
|
12
|
-
spec.homepage = 'https://github.com/dickdavis/anthropic-rb'
|
13
|
-
spec.license = 'MIT'
|
14
|
-
|
15
|
-
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
16
|
-
spec.metadata['homepage_uri'] = spec.homepage
|
17
|
-
spec.metadata['source_code_uri'] = 'https://github.com/dickdavis/anthropic-rb'
|
18
|
-
spec.metadata['changelog_uri'] = 'https://github.com/dickdavis/anthropic-rb/blob/main/CHANGELOG.md'
|
19
|
-
|
20
|
-
# Specify which files should be added to the gem when it is released.
|
21
|
-
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
22
|
-
spec.files = Dir.chdir(__dir__) do
|
23
|
-
`git ls-files -z`.split("\x0").reject do |f|
|
24
|
-
(File.expand_path(f) == __FILE__) ||
|
25
|
-
f.start_with?(*%w[bin/ spec/ .git .github/ Gemfile])
|
26
|
-
end
|
27
|
-
end + Dir.glob('lib/**/*.json')
|
28
|
-
spec.bindir = 'exe'
|
29
|
-
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
30
|
-
spec.require_paths = ['lib']
|
31
|
-
|
32
|
-
# Uncomment to register a new dependency of your gem
|
33
|
-
# spec.add_dependency "example-gem", "~> 1.0"
|
34
|
-
|
35
|
-
# For more information and examples about making a new gem, check out our
|
36
|
-
# guide at: https://bundler.io/guides/creating_gem.html
|
37
|
-
spec.metadata['rubygems_mfa_required'] = 'true'
|
38
|
-
|
39
|
-
spec.required_ruby_version = '>= 3.1'
|
40
|
-
spec.add_dependency 'httpx', '>= 1.1.5'
|
41
|
-
spec.add_dependency 'json-schema', '>= 4.1.1'
|
42
|
-
end
|
@@ -1,55 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'concerns/requestable'
|
4
|
-
require_relative 'concerns/validatable'
|
5
|
-
|
6
|
-
module Anthropic
|
7
|
-
##
|
8
|
-
# Provides a base class for APIs
|
9
|
-
class BaseApi
|
10
|
-
include Anthropic::Api::Concerns::Requestable
|
11
|
-
include Anthropic::Api::Concerns::Validatable
|
12
|
-
|
13
|
-
def initialize(beta: nil)
|
14
|
-
@beta = beta
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
attr_reader :beta
|
20
|
-
|
21
|
-
def api
|
22
|
-
self.class.name.split('::').last.downcase
|
23
|
-
end
|
24
|
-
|
25
|
-
def version_config
|
26
|
-
return @version_config if defined?(@version_config)
|
27
|
-
|
28
|
-
@version_config ||= catch(:version_found) do
|
29
|
-
found_config = Anthropic.versions[api.to_sym].find { |config| config['version'] == Anthropic.api_version }
|
30
|
-
unless found_config
|
31
|
-
raise Anthropic::Errors::UnsupportedApiVersionError, "Unsupported API version: #{Anthropic.api_version}"
|
32
|
-
end
|
33
|
-
|
34
|
-
throw :version_found, found_config
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def beta_config
|
39
|
-
return @beta_config if defined?(@beta_config)
|
40
|
-
|
41
|
-
@beta_config = catch(:beta_found) do
|
42
|
-
found_config = Anthropic.betas.find { |config| config['id'] == beta }
|
43
|
-
raise Anthropic::Errors::UnsupportedBetaError, "#{beta} not supported" unless found_config
|
44
|
-
|
45
|
-
throw :beta_found, found_config
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def beta_loaded?(name)
|
50
|
-
return false unless beta
|
51
|
-
|
52
|
-
beta_config['id'] == name
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
data/lib/anthropic/client.rb
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'httpx'
|
4
|
-
|
5
|
-
module Anthropic
|
6
|
-
##
|
7
|
-
# Provides a client for sending HTTP requests.
|
8
|
-
class Client
|
9
|
-
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
10
|
-
def self.post(url, data, headers = {})
|
11
|
-
response = HTTPX.with(
|
12
|
-
headers: {
|
13
|
-
'Content-Type' => 'application/json',
|
14
|
-
'x-api-key' => Anthropic.api_key,
|
15
|
-
'anthropic-version' => Anthropic.api_version
|
16
|
-
}.merge(headers)
|
17
|
-
).post(url, json: data)
|
18
|
-
|
19
|
-
response_body = JSON.parse(response.body, symbolize_names: true)
|
20
|
-
|
21
|
-
case response.status
|
22
|
-
when 200
|
23
|
-
response_body
|
24
|
-
when 400
|
25
|
-
raise Anthropic::Errors::BadRequestError, response_body
|
26
|
-
when 401
|
27
|
-
raise Anthropic::Errors::AuthenticationError, response_body
|
28
|
-
when 403
|
29
|
-
raise Anthropic::Errors::PermissionDeniedError, response_body
|
30
|
-
when 404
|
31
|
-
raise Anthropic::Errors::NotFoundError, response_body
|
32
|
-
when 409
|
33
|
-
raise Anthropic::Errors::ConflictError, response_body
|
34
|
-
when 422
|
35
|
-
raise Anthropic::Errors::UnprocessableEntityError, response_body
|
36
|
-
when 429
|
37
|
-
raise Anthropic::Errors::RateLimitError, response_body
|
38
|
-
when 500
|
39
|
-
raise Anthropic::Errors::InternalServerError, response_body
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.post_as_stream(url, data, headers = {})
|
44
|
-
response = HTTPX.plugin(:stream).with(
|
45
|
-
headers: {
|
46
|
-
'Content-Type' => 'application/json',
|
47
|
-
'x-api-key' => Anthropic.api_key,
|
48
|
-
'anthropic-version' => Anthropic.api_version
|
49
|
-
}.merge(headers)
|
50
|
-
).post(url, json: data, stream: true)
|
51
|
-
|
52
|
-
response.each_line do |line|
|
53
|
-
event, data = line.split(/(\w+\b:\s)/)[1..2]
|
54
|
-
next unless event && data
|
55
|
-
|
56
|
-
if event.start_with?('data')
|
57
|
-
formatted_data = JSON.parse(data, symbolize_names: true)
|
58
|
-
yield formatted_data unless %w[ping error].include?(formatted_data[:type])
|
59
|
-
end
|
60
|
-
end
|
61
|
-
rescue HTTPX::HTTPError => error
|
62
|
-
case error.response.status
|
63
|
-
when 400
|
64
|
-
raise Anthropic::Errors::BadRequestError
|
65
|
-
when 401
|
66
|
-
raise Anthropic::Errors::AuthenticationError
|
67
|
-
when 403
|
68
|
-
raise Anthropic::Errors::PermissionDeniedError
|
69
|
-
when 404
|
70
|
-
raise Anthropic::Errors::NotFoundError
|
71
|
-
when 409
|
72
|
-
raise Anthropic::Errors::ConflictError
|
73
|
-
when 422
|
74
|
-
raise Anthropic::Errors::UnprocessableEntityError
|
75
|
-
when 429
|
76
|
-
raise Anthropic::Errors::RateLimitError
|
77
|
-
when 500
|
78
|
-
raise Anthropic::Errors::InternalServerError
|
79
|
-
end
|
80
|
-
end
|
81
|
-
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
82
|
-
end
|
83
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Anthropic
|
4
|
-
module Errors
|
5
|
-
# Error for when the provided beta is not supported
|
6
|
-
class UnsupportedBetaError < StandardError; end
|
7
|
-
|
8
|
-
# Error for when a beta feature is configured incorrectly
|
9
|
-
class InvalidBetaConfigurationError < StandardError; end
|
10
|
-
|
11
|
-
# Error for when a beta feature is not used correctly
|
12
|
-
class UnsupportedBetaUseError < StandardError; end
|
13
|
-
end
|
14
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Anthropic
|
4
|
-
module Errors
|
5
|
-
# Error for when the API version is not supported.
|
6
|
-
class UnsupportedApiVersionError < StandardError; end
|
7
|
-
|
8
|
-
# Error for when API version is missing a schema.
|
9
|
-
class MissingSchemaError < StandardError; end
|
10
|
-
|
11
|
-
# Error for when the provided params do not match the API schema
|
12
|
-
class SchemaValidationError < StandardError; end
|
13
|
-
end
|
14
|
-
end
|
File without changes
|