foobara-anthropic-api 0.0.4 → 0.0.5
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/src/foobara/ai/anthropic_api/base_command.rb +34 -0
- data/src/foobara/ai/anthropic_api/create_message.rb +8 -50
- data/src/foobara/ai/anthropic_api/get_page_of_models.rb +33 -0
- data/src/foobara/ai/anthropic_api/list_models.rb +68 -0
- data/src/foobara/ai/anthropic_api/types/message_result.rb +1 -1
- data/src/foobara/ai/anthropic_api/types/model.rb +7 -7
- data/src/foobara/ai/anthropic_api/types/model_enum.rb +16 -0
- data/src/foobara/ai/anthropic_api/types/page_of_models.rb +18 -0
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 397ca8262c02350325ef056b1515b62690470a725cd991221b7bab6cc85ee6df
|
4
|
+
data.tar.gz: 5b077cc5e81663bb5c414fd121a87104527ae5918ffbbb1a8c7ca8495103c545
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 22f52f6c00e4f81c0c709a39128189c98210f4f92745d430a1cf0057cfa34cdce6f9421e7e2580fb453323b03bf576a7cdc7b92092dc2f05ab037467bc71cc3b
|
7
|
+
data.tar.gz: ece188c59cd4d84974ed4ce43e1f31098f6a1406f34de934cd6d3ddcdbfdac5e4b2b7425466e113c367617f78b46df63a3e30c1d1ba6298c8c8c7c95d6d33bae
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "foobara/http_api_command"
|
2
|
+
|
3
|
+
module Foobara
|
4
|
+
module Ai
|
5
|
+
module AnthropicApi
|
6
|
+
class BaseCommand < Foobara::Command
|
7
|
+
include HttpApiCommand
|
8
|
+
|
9
|
+
base_url "https://api.anthropic.com/v1"
|
10
|
+
|
11
|
+
inputs do
|
12
|
+
api_token :string
|
13
|
+
anthropic_version :string
|
14
|
+
end
|
15
|
+
|
16
|
+
def build_request_headers
|
17
|
+
self.request_headers = {
|
18
|
+
"Content-Type" => "application/json",
|
19
|
+
"X-Api-Key" => api_token,
|
20
|
+
"Anthropic-Version" => anthropic_version
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
def api_token
|
25
|
+
inputs[:api_token] || ENV.fetch("ANTHROPIC_API_KEY", nil)
|
26
|
+
end
|
27
|
+
|
28
|
+
def anthropic_version
|
29
|
+
inputs[:anthropic_version] || ENV.fetch("ANTHROPIC_VERSION", "2023-06-01")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,13 +1,13 @@
|
|
1
|
+
require_relative "base_command"
|
2
|
+
|
1
3
|
module Foobara
|
2
4
|
module Ai
|
3
5
|
module AnthropicApi
|
4
|
-
class CreateMessage <
|
5
|
-
|
6
|
+
class CreateMessage < BaseCommand
|
7
|
+
path "/messages"
|
8
|
+
http_method :post
|
6
9
|
|
7
|
-
|
8
|
-
# TODO: come up with some kind of execution context object to wrap all of these calls upon which
|
9
|
-
# data wrapping a "request" can live instead of being passed around?
|
10
|
-
api_token :string
|
10
|
+
add_inputs do
|
11
11
|
system :string
|
12
12
|
max_tokens :integer, default: 1024
|
13
13
|
model :model, default: Types::ModelEnum::CLAUDE_3_5_SONNET
|
@@ -16,54 +16,12 @@ module Foobara
|
|
16
16
|
|
17
17
|
result Types::MessageResult
|
18
18
|
|
19
|
-
def execute
|
20
|
-
build_request_body
|
21
|
-
build_request_headers
|
22
|
-
issue_http_request
|
23
|
-
parse_response
|
24
|
-
build_message_result
|
25
|
-
|
26
|
-
message_result
|
27
|
-
end
|
28
|
-
|
29
|
-
attr_accessor :request_body, :request_headers, :response, :response_body, :message_result
|
30
|
-
|
31
19
|
def build_request_body
|
32
20
|
self.request_body = { model:, max_tokens:, messages: }
|
33
21
|
end
|
34
22
|
|
35
|
-
def
|
36
|
-
|
37
|
-
"Content-Type" => "application/json",
|
38
|
-
"X-Api-Key" => api_token,
|
39
|
-
"Anthropic-Version" => "2023-06-01"
|
40
|
-
}
|
41
|
-
end
|
42
|
-
|
43
|
-
def api_token
|
44
|
-
inputs[:api_token] || ENV.fetch("ANTHROPIC_API_KEY", nil)
|
45
|
-
end
|
46
|
-
|
47
|
-
def issue_http_request
|
48
|
-
url = URI.parse(URL)
|
49
|
-
self.response = Net::HTTP.post(url, JSON.generate(request_body), request_headers)
|
50
|
-
end
|
51
|
-
|
52
|
-
def parse_response
|
53
|
-
json = if response.is_a?(Net::HTTPSuccess)
|
54
|
-
response.body
|
55
|
-
else
|
56
|
-
# :nocov:
|
57
|
-
raise "Could not get message result from #{URL}: " \
|
58
|
-
"#{response.code} #{response.message}"
|
59
|
-
# :nocov:
|
60
|
-
end
|
61
|
-
|
62
|
-
self.response_body = JSON.parse(json)
|
63
|
-
end
|
64
|
-
|
65
|
-
def build_message_result
|
66
|
-
self.message_result = Types::MessageResult.new(response_body, ignore_unexpected_attributes: true)
|
23
|
+
def build_result
|
24
|
+
Types::MessageResult.new(response_body, ignore_unexpected_attributes: true)
|
67
25
|
end
|
68
26
|
end
|
69
27
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative "base_command"
|
2
|
+
|
3
|
+
module Foobara
|
4
|
+
module Ai
|
5
|
+
module AnthropicApi
|
6
|
+
class GetPageOfModels < BaseCommand
|
7
|
+
path "/models"
|
8
|
+
|
9
|
+
add_inputs do
|
10
|
+
before_id :string
|
11
|
+
after_id :string
|
12
|
+
limit :integer, max: 2000, min: 1
|
13
|
+
end
|
14
|
+
|
15
|
+
result Types::PageOfModels
|
16
|
+
|
17
|
+
def build_request_body
|
18
|
+
body = {}
|
19
|
+
|
20
|
+
body[:before_id] = before_id if before_id
|
21
|
+
body[:after_id] = after_id if after_id
|
22
|
+
body[:limit] = limit if limit
|
23
|
+
|
24
|
+
self.request_body = body
|
25
|
+
end
|
26
|
+
|
27
|
+
def build_result
|
28
|
+
Types::PageOfModels.new(response_body, ignore_unexpected_attributes: true)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require_relative "base_command"
|
2
|
+
|
3
|
+
module Foobara
|
4
|
+
module Ai
|
5
|
+
module AnthropicApi
|
6
|
+
class ListModels < Foobara::Command
|
7
|
+
description "A convenience command that will repeatedly fetch pages of models until all are fetched"
|
8
|
+
|
9
|
+
inputs do
|
10
|
+
page_size :integer, max: 2000, min: 1, default: 20
|
11
|
+
api_token :string, :allow_nil
|
12
|
+
end
|
13
|
+
|
14
|
+
result [Types::Model]
|
15
|
+
|
16
|
+
depends_on GetPageOfModels
|
17
|
+
|
18
|
+
def execute
|
19
|
+
get_page_of_models
|
20
|
+
|
21
|
+
extract_models
|
22
|
+
|
23
|
+
while has_more?
|
24
|
+
get_next_page_of_models
|
25
|
+
extract_models
|
26
|
+
end
|
27
|
+
|
28
|
+
models
|
29
|
+
end
|
30
|
+
|
31
|
+
attr_accessor :page_of_models
|
32
|
+
|
33
|
+
def get_page_of_models
|
34
|
+
self.page_of_models = run_subcommand!(GetPageOfModels, get_page_of_models_inputs)
|
35
|
+
end
|
36
|
+
|
37
|
+
def extract_models
|
38
|
+
models.concat(page_of_models.data)
|
39
|
+
end
|
40
|
+
|
41
|
+
def has_more?
|
42
|
+
page_of_models.has_more
|
43
|
+
end
|
44
|
+
|
45
|
+
def get_next_page_of_models
|
46
|
+
inputs = get_page_of_models_inputs.merge(after_id: page_of_models.last_id)
|
47
|
+
self.page_of_models = run_subcommand!(GetPageOfModels, inputs)
|
48
|
+
end
|
49
|
+
|
50
|
+
def models
|
51
|
+
@models ||= []
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_page_of_models_inputs
|
55
|
+
return @get_page_of_models_inputs if @get_page_of_models_inputs
|
56
|
+
|
57
|
+
@get_page_of_models_inputs = {}
|
58
|
+
|
59
|
+
if page_size
|
60
|
+
@get_page_of_models_inputs[:limit] = page_size
|
61
|
+
end
|
62
|
+
|
63
|
+
@get_page_of_models_inputs
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -2,14 +2,14 @@ module Foobara
|
|
2
2
|
module Ai
|
3
3
|
module AnthropicApi
|
4
4
|
module Types
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
class Model < Foobara::Model
|
6
|
+
attributes do
|
7
|
+
id :string, :required
|
8
|
+
display_name :string, :required
|
9
|
+
type :string, :required
|
10
|
+
created_at :datetime, :required
|
11
|
+
end
|
10
12
|
end
|
11
|
-
|
12
|
-
Model = AnthropicApi.foobara_register_type(:model, :string, one_of: ModelEnum)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Foobara
|
2
|
+
module Ai
|
3
|
+
module AnthropicApi
|
4
|
+
module Types
|
5
|
+
module ModelEnum
|
6
|
+
CLAUDE_3_5_SONNET = "claude-3-5-sonnet-20240620".freeze
|
7
|
+
CLAUDE_3_OPUS = "claude-3-opus-20240229".freeze
|
8
|
+
CLAUDE_3_SONNET = "claude-3-sonnet-20240229".freeze
|
9
|
+
CLAUDE_3_HAIKU = "claude-3-haiku-20240307".freeze
|
10
|
+
end
|
11
|
+
|
12
|
+
AnthropicApi.foobara_register_type(:model, :string, one_of: ModelEnum)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative "model"
|
2
|
+
|
3
|
+
module Foobara
|
4
|
+
module Ai
|
5
|
+
module AnthropicApi
|
6
|
+
module Types
|
7
|
+
class PageOfModels < Foobara::Model
|
8
|
+
attributes do
|
9
|
+
data [Types::Model], :required
|
10
|
+
first_id :string, :allow_nil, :required
|
11
|
+
last_id :string, :allow_nil, :required
|
12
|
+
has_more :boolean, :required
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foobara-anthropic-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miles Georgi
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-02-
|
10
|
+
date: 2025-02-18 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
|
-
name: foobara
|
13
|
+
name: foobara-http-api-command
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
15
15
|
requirements:
|
16
16
|
- - ">="
|
@@ -32,12 +32,17 @@ files:
|
|
32
32
|
- LICENSE.txt
|
33
33
|
- lib/foobara/anthropic_api.rb
|
34
34
|
- src/foobara/ai/anthropic_api.rb
|
35
|
+
- src/foobara/ai/anthropic_api/base_command.rb
|
35
36
|
- src/foobara/ai/anthropic_api/create_message.rb
|
37
|
+
- src/foobara/ai/anthropic_api/get_page_of_models.rb
|
38
|
+
- src/foobara/ai/anthropic_api/list_models.rb
|
36
39
|
- src/foobara/ai/anthropic_api/types/message.rb
|
37
40
|
- src/foobara/ai/anthropic_api/types/message_result.rb
|
38
41
|
- src/foobara/ai/anthropic_api/types/message_result/content.rb
|
39
42
|
- src/foobara/ai/anthropic_api/types/message_result/usage.rb
|
40
43
|
- src/foobara/ai/anthropic_api/types/model.rb
|
44
|
+
- src/foobara/ai/anthropic_api/types/model_enum.rb
|
45
|
+
- src/foobara/ai/anthropic_api/types/page_of_models.rb
|
41
46
|
- src/foobara/ai/anthropic_api/types/role.rb
|
42
47
|
homepage: https://github.com/foobara/anthropic-api
|
43
48
|
licenses:
|