lex-bedrock 0.1.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2143094bd8222adb62e51ac6548e82771a77186e59496993a1960e51c433de8b
4
+ data.tar.gz: 830eb21aac385a64755e418773263966c05d464229715057ddafe77b8ba5f8af
5
+ SHA512:
6
+ metadata.gz: 63048c5e14420b13e1fcf5c7def1d23fe4f247e09ea9f7dfe3d333b8ca269950398ad1b7cadc3e96b547f857b604df5e92fd854a211f6b445973309fec613c79
7
+ data.tar.gz: 035fff2df7b594bd0c65c42bda4fed599632428890023968967f630eab3103b5f7b4ff96897b2ef0c38cc3a546463ba48e6b60c425a82d6897ffd9adde2308fd
@@ -0,0 +1,16 @@
1
+ name: CI
2
+ on:
3
+ push:
4
+ branches: [origin]
5
+ pull_request:
6
+
7
+ jobs:
8
+ ci:
9
+ uses: LegionIO/.github/.github/workflows/ci.yml@main
10
+
11
+ release:
12
+ needs: ci
13
+ if: github.event_name == 'push' && github.ref == 'refs/heads/origin'
14
+ uses: LegionIO/.github/.github/workflows/release.yml@main
15
+ secrets:
16
+ rubygems-api-key: ${{ secrets.RUBYGEMS_API_KEY }}
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+ Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,51 @@
1
+ AllCops:
2
+ TargetRubyVersion: 3.4
3
+ NewCops: enable
4
+ SuggestExtensions: false
5
+
6
+ Layout/LineLength:
7
+ Max: 160
8
+
9
+ Layout/SpaceAroundEqualsInParameterDefault:
10
+ EnforcedStyle: space
11
+
12
+ Layout/HashAlignment:
13
+ EnforcedHashRocketStyle: table
14
+ EnforcedColonStyle: table
15
+
16
+ Metrics/MethodLength:
17
+ Max: 50
18
+
19
+ Metrics/ClassLength:
20
+ Max: 1500
21
+
22
+ Metrics/ModuleLength:
23
+ Max: 1500
24
+
25
+ Metrics/BlockLength:
26
+ Max: 40
27
+ Exclude:
28
+ - 'spec/**/*'
29
+ - '*.gemspec'
30
+
31
+ Metrics/AbcSize:
32
+ Max: 60
33
+
34
+ Metrics/CyclomaticComplexity:
35
+ Max: 15
36
+
37
+ Metrics/PerceivedComplexity:
38
+ Max: 17
39
+
40
+ Style/Documentation:
41
+ Enabled: false
42
+
43
+ Style/SymbolArray:
44
+ Enabled: true
45
+
46
+ Style/FrozenStringLiteralComment:
47
+ Enabled: true
48
+ EnforcedStyle: always
49
+
50
+ Naming/FileName:
51
+ Enabled: false
data/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
1
+ # Changelog
2
+
3
+ ## [0.1.0] - 2026-03-21
4
+
5
+ ### Added
6
+ - Initial release of lex-bedrock
7
+ - `Helpers::Client` module with `bedrock_client` and `bedrock_runtime_client` factory methods
8
+ - `Runners::Models` with `list` (ListFoundationModels) and `get` (GetFoundationModel)
9
+ - `Runners::Converse` with `create` using the Converse API (messages-style interface)
10
+ - `Runners::Invoke` with `invoke_model` using the raw InvokeModel API
11
+ - Standalone `Client` class including all runner modules with persistent config
12
+ - Support for optional `session_token` for assumed-role credentials
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+ gemspec
5
+
6
+ gem 'rspec'
7
+ gem 'rubocop'
data/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # lex-bedrock
2
+
3
+ Legion Extension (LEX) that connects LegionIO to AWS Bedrock for foundation model inference.
4
+
5
+ ## Installation
6
+
7
+ Add to your Gemfile:
8
+
9
+ ```ruby
10
+ gem 'lex-bedrock'
11
+ ```
12
+
13
+ ## Configuration
14
+
15
+ AWS credentials are required:
16
+
17
+ - `access_key_id` — AWS access key ID
18
+ - `secret_access_key` — AWS secret access key
19
+ - `region` — AWS region (default: `us-east-2`)
20
+ - `session_token` — optional, for assumed roles
21
+
22
+ ## Usage
23
+
24
+ ### Standalone Client
25
+
26
+ ```ruby
27
+ client = Legion::Extensions::Bedrock::Client.new(
28
+ access_key_id: 'AKIA...',
29
+ secret_access_key: 'secret',
30
+ region: 'us-east-2'
31
+ )
32
+
33
+ # List foundation models
34
+ result = client.list
35
+ # => { models: [...] }
36
+
37
+ # Converse API
38
+ result = client.create(
39
+ model_id: 'anthropic.claude-3-5-sonnet-20241022-v2:0',
40
+ messages: [{ role: 'user', content: [{ text: 'Hello' }] }]
41
+ )
42
+ # => { result: ..., usage: ..., stop_reason: 'end_turn' }
43
+
44
+ # Raw InvokeModel
45
+ result = client.invoke_model(
46
+ model_id: 'anthropic.claude-3-5-sonnet-20241022-v2:0',
47
+ body: { prompt: 'Hello', max_tokens: 256 }
48
+ )
49
+ # => { result: { ... }, content_type: 'application/json' }
50
+ ```
51
+
52
+ ### Runner Modules
53
+
54
+ ```ruby
55
+ include Legion::Extensions::Bedrock::Runners::Models
56
+ include Legion::Extensions::Bedrock::Runners::Converse
57
+ include Legion::Extensions::Bedrock::Runners::Invoke
58
+ ```
59
+
60
+ ## License
61
+
62
+ MIT
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/legion/extensions/bedrock/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'lex-bedrock'
7
+ spec.version = Legion::Extensions::Bedrock::VERSION
8
+ spec.authors = ['Esity']
9
+ spec.email = ['matthewdiverson@gmail.com']
10
+
11
+ spec.summary = 'LEX Bedrock'
12
+ spec.description = 'Connects LegionIO to AWS Bedrock for foundation model inference'
13
+ spec.homepage = 'https://github.com/LegionIO/lex-bedrock'
14
+ spec.license = 'MIT'
15
+ spec.required_ruby_version = '>= 3.4'
16
+
17
+ spec.metadata['homepage_uri'] = spec.homepage
18
+ spec.metadata['source_code_uri'] = 'https://github.com/LegionIO/lex-bedrock'
19
+ spec.metadata['documentation_uri'] = 'https://github.com/LegionIO/lex-bedrock'
20
+ spec.metadata['changelog_uri'] = 'https://github.com/LegionIO/lex-bedrock'
21
+ spec.metadata['bug_tracker_uri'] = 'https://github.com/LegionIO/lex-bedrock/issues'
22
+ spec.metadata['rubygems_mfa_required'] = 'true'
23
+
24
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
25
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
+ end
27
+ spec.require_paths = ['lib']
28
+
29
+ spec.add_dependency 'aws-sdk-bedrock'
30
+ spec.add_dependency 'aws-sdk-bedrockruntime'
31
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/bedrock/helpers/client'
4
+ require 'legion/extensions/bedrock/runners/models'
5
+ require 'legion/extensions/bedrock/runners/converse'
6
+ require 'legion/extensions/bedrock/runners/invoke'
7
+
8
+ module Legion
9
+ module Extensions
10
+ module Bedrock
11
+ class Client
12
+ include Legion::Extensions::Bedrock::Runners::Models
13
+ include Legion::Extensions::Bedrock::Runners::Converse
14
+ include Legion::Extensions::Bedrock::Runners::Invoke
15
+
16
+ attr_reader :config
17
+
18
+ def initialize(access_key_id:, secret_access_key:, region: Helpers::Client::DEFAULT_REGION, **opts)
19
+ @config = { access_key_id: access_key_id, secret_access_key: secret_access_key,
20
+ region: region, **opts }
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aws-sdk-bedrock'
4
+ require 'aws-sdk-bedrockruntime'
5
+
6
+ module Legion
7
+ module Extensions
8
+ module Bedrock
9
+ module Helpers
10
+ module Client
11
+ DEFAULT_REGION = 'us-east-2'
12
+
13
+ module_function
14
+
15
+ def bedrock_runtime_client(access_key_id:, secret_access_key:, region: DEFAULT_REGION,
16
+ session_token: nil, **)
17
+ opts = {
18
+ access_key_id: access_key_id,
19
+ secret_access_key: secret_access_key,
20
+ region: region
21
+ }
22
+ opts[:session_token] = session_token if session_token
23
+
24
+ Aws::BedrockRuntime::Client.new(**opts)
25
+ end
26
+
27
+ def bedrock_client(access_key_id:, secret_access_key:, region: DEFAULT_REGION,
28
+ session_token: nil, **)
29
+ opts = {
30
+ access_key_id: access_key_id,
31
+ secret_access_key: secret_access_key,
32
+ region: region
33
+ }
34
+ opts[:session_token] = session_token if session_token
35
+
36
+ Aws::Bedrock::Client.new(**opts)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/bedrock/helpers/client'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Bedrock
8
+ module Runners
9
+ module Converse
10
+ def create(model_id:, messages:, access_key_id:, secret_access_key:, # rubocop:disable Metrics/ParameterLists
11
+ system: nil, max_tokens: 1024, temperature: nil,
12
+ region: Helpers::Client::DEFAULT_REGION, **)
13
+ client = Helpers::Client.bedrock_runtime_client(
14
+ access_key_id: access_key_id,
15
+ secret_access_key: secret_access_key,
16
+ region: region
17
+ )
18
+
19
+ inference_config = { max_tokens: max_tokens }
20
+ inference_config[:temperature] = temperature if temperature
21
+
22
+ request = {
23
+ model_id: model_id,
24
+ messages: messages,
25
+ inference_config: inference_config
26
+ }
27
+ request[:system] = [{ text: system }] if system
28
+
29
+ response = client.converse(**request)
30
+ {
31
+ result: response.output,
32
+ usage: response.usage,
33
+ stop_reason: response.stop_reason
34
+ }
35
+ end
36
+
37
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
38
+ Legion::Extensions::Helpers.const_defined?(:Lex)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'legion/extensions/bedrock/helpers/client'
5
+
6
+ module Legion
7
+ module Extensions
8
+ module Bedrock
9
+ module Runners
10
+ module Invoke
11
+ def invoke_model(model_id:, body:, access_key_id:, secret_access_key:, # rubocop:disable Metrics/ParameterLists
12
+ content_type: 'application/json', accept: 'application/json',
13
+ region: Helpers::Client::DEFAULT_REGION, **)
14
+ client = Helpers::Client.bedrock_runtime_client(
15
+ access_key_id: access_key_id,
16
+ secret_access_key: secret_access_key,
17
+ region: region
18
+ )
19
+
20
+ response = client.invoke_model(
21
+ model_id: model_id,
22
+ body: ::JSON.dump(body),
23
+ content_type: content_type,
24
+ accept: accept
25
+ )
26
+
27
+ {
28
+ result: ::JSON.parse(response.body.read),
29
+ content_type: response.content_type
30
+ }
31
+ end
32
+
33
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
34
+ Legion::Extensions::Helpers.const_defined?(:Lex)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/bedrock/helpers/client'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Bedrock
8
+ module Runners
9
+ module Models
10
+ def list(access_key_id:, secret_access_key:, region: Helpers::Client::DEFAULT_REGION, **)
11
+ client = Helpers::Client.bedrock_client(
12
+ access_key_id: access_key_id,
13
+ secret_access_key: secret_access_key,
14
+ region: region
15
+ )
16
+ response = client.list_foundation_models
17
+ { models: response.model_summaries }
18
+ end
19
+
20
+ def get(model_id:, access_key_id:, secret_access_key:, region: Helpers::Client::DEFAULT_REGION, **)
21
+ client = Helpers::Client.bedrock_client(
22
+ access_key_id: access_key_id,
23
+ secret_access_key: secret_access_key,
24
+ region: region
25
+ )
26
+ response = client.get_foundation_model(model_identifier: model_id)
27
+ { model: response.model_details }
28
+ end
29
+
30
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
31
+ Legion::Extensions::Helpers.const_defined?(:Lex)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Bedrock
6
+ VERSION = '0.1.1'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/bedrock/version'
4
+ require 'legion/extensions/bedrock/helpers/client'
5
+ require 'legion/extensions/bedrock/runners/models'
6
+ require 'legion/extensions/bedrock/runners/converse'
7
+ require 'legion/extensions/bedrock/runners/invoke'
8
+
9
+ module Legion
10
+ module Extensions
11
+ module Bedrock
12
+ extend Legion::Extensions::Core if Legion::Extensions.const_defined? :Core
13
+ end
14
+ end
15
+ end
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lex-bedrock
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Esity
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: aws-sdk-bedrock
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: aws-sdk-bedrockruntime
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ description: Connects LegionIO to AWS Bedrock for foundation model inference
41
+ email:
42
+ - matthewdiverson@gmail.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - ".github/workflows/ci.yml"
48
+ - ".gitignore"
49
+ - ".rspec"
50
+ - ".rubocop.yml"
51
+ - CHANGELOG.md
52
+ - Gemfile
53
+ - README.md
54
+ - lex-bedrock.gemspec
55
+ - lib/legion/extensions/bedrock.rb
56
+ - lib/legion/extensions/bedrock/client.rb
57
+ - lib/legion/extensions/bedrock/helpers/client.rb
58
+ - lib/legion/extensions/bedrock/runners/converse.rb
59
+ - lib/legion/extensions/bedrock/runners/invoke.rb
60
+ - lib/legion/extensions/bedrock/runners/models.rb
61
+ - lib/legion/extensions/bedrock/version.rb
62
+ homepage: https://github.com/LegionIO/lex-bedrock
63
+ licenses:
64
+ - MIT
65
+ metadata:
66
+ homepage_uri: https://github.com/LegionIO/lex-bedrock
67
+ source_code_uri: https://github.com/LegionIO/lex-bedrock
68
+ documentation_uri: https://github.com/LegionIO/lex-bedrock
69
+ changelog_uri: https://github.com/LegionIO/lex-bedrock
70
+ bug_tracker_uri: https://github.com/LegionIO/lex-bedrock/issues
71
+ rubygems_mfa_required: 'true'
72
+ rdoc_options: []
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '3.4'
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ requirements: []
86
+ rubygems_version: 3.6.9
87
+ specification_version: 4
88
+ summary: LEX Bedrock
89
+ test_files: []