lex-foundry 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: 506d58ff4b2420a13bdf445d7384a61d6a30cf48700677461deee212256a5c68
4
+ data.tar.gz: dac86f46a4327d403774471ef9cbb97471a04cae30e1dd98fa8e2d4cfa71111f
5
+ SHA512:
6
+ metadata.gz: c1dfe72088b5d2c3b30cda62e692245258843bd64727e183af446034df7e186c9887d436fb37f955899b493929aa1be0391cc41a73da0b556cc597bf041f7e29
7
+ data.tar.gz: 3186679b7ff227ec51ee72c3a066dd503bd2fc96ca721aa01f15e5afbef24943755d718d9ed92bf11fa965cd107556f5a01b1fba363f70f6050f9858a962fcaf
@@ -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,11 @@
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
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,58 @@
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
+ Metrics/ParameterLists:
51
+ Max: 12
52
+
53
+ Naming/FileName:
54
+ Enabled: false
55
+
56
+ Naming/MethodParameterName:
57
+ AllowedNames:
58
+ - n
data/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
1
+ # Changelog
2
+
3
+ ## [0.1.0] - 2026-03-21
4
+
5
+ ### Added
6
+ - Initial release
7
+ - Deployments runner (list, get, create, delete) via Azure Management API
8
+ - Models runner (list, get) via Azure AI Foundry workspace endpoint
9
+ - Connections runner (list, get, create, delete) via Azure Management API
10
+ - Standalone Client class
11
+ - Faraday-based HTTP client with Bearer token authentication
12
+ - Two connection builders: management_client (management.azure.com) and workspace_client ({endpoint}.api.azureml.ms)
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
6
+
7
+ group :test do
8
+ gem 'rspec'
9
+ gem 'rubocop'
10
+ end
data/README.md ADDED
@@ -0,0 +1,47 @@
1
+ # lex-foundry
2
+
3
+ LegionIO extension for Azure AI Foundry (formerly Azure AI Studio). Provides runners for the Azure AI Foundry REST API — model catalog, deployments, and workspace connections.
4
+
5
+ ## Installation
6
+
7
+ Add to your Gemfile:
8
+
9
+ ```ruby
10
+ gem 'lex-foundry'
11
+ ```
12
+
13
+ ## Authentication
14
+
15
+ All methods require an Azure AD / Entra ID Bearer token passed as `token:`.
16
+
17
+ ## Usage
18
+
19
+ ### Standalone Client
20
+
21
+ ```ruby
22
+ client = Legion::Extensions::Foundry::Client.new(
23
+ token: 'your-bearer-token',
24
+ endpoint: 'my-workspace',
25
+ subscription_id: 'sub-id',
26
+ resource_group: 'rg-name',
27
+ workspace: 'ws-name'
28
+ )
29
+
30
+ client.list(subscription_id: 'sub-id', resource_group: 'rg', workspace: 'ws')
31
+ ```
32
+
33
+ ### Runners Directly
34
+
35
+ ```ruby
36
+ Legion::Extensions::Foundry::Runners::Models.list(token: 'tok', endpoint: 'my-workspace')
37
+ Legion::Extensions::Foundry::Runners::Deployments.list(token: 'tok', endpoint: 'ep', subscription_id: 'sid', resource_group: 'rg', workspace: 'ws')
38
+ Legion::Extensions::Foundry::Runners::Connections.list(token: 'tok', endpoint: 'ep', subscription_id: 'sid', resource_group: 'rg', workspace: 'ws')
39
+ ```
40
+
41
+ ## API Version
42
+
43
+ Default: `2024-10-01-preview`. Pass `api_version:` to override.
44
+
45
+ ## License
46
+
47
+ MIT
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/legion/extensions/foundry/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'lex-foundry'
7
+ spec.version = Legion::Extensions::Foundry::VERSION
8
+ spec.authors = ['Esity']
9
+ spec.email = ['matthewdiverson@gmail.com']
10
+
11
+ spec.summary = 'LEX Azure AI Foundry'
12
+ spec.description = 'Connects LegionIO to Azure AI Foundry (model catalog, deployments, connections)'
13
+ spec.homepage = 'https://github.com/LegionIO/lex-foundry'
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-foundry'
19
+ spec.metadata['documentation_uri'] = 'https://github.com/LegionIO/lex-foundry'
20
+ spec.metadata['changelog_uri'] = 'https://github.com/LegionIO/lex-foundry'
21
+ spec.metadata['bug_tracker_uri'] = 'https://github.com/LegionIO/lex-foundry/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 'faraday', '>= 2.0'
30
+ spec.add_dependency 'multi_json'
31
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/foundry/helpers/client'
4
+ require 'legion/extensions/foundry/runners/deployments'
5
+ require 'legion/extensions/foundry/runners/models'
6
+ require 'legion/extensions/foundry/runners/connections'
7
+
8
+ module Legion
9
+ module Extensions
10
+ module Foundry
11
+ class Client
12
+ include Legion::Extensions::Foundry::Runners::Deployments
13
+ include Legion::Extensions::Foundry::Runners::Models
14
+ include Legion::Extensions::Foundry::Runners::Connections
15
+
16
+ attr_reader :config
17
+
18
+ def initialize(token:, endpoint:, api_version: '2024-10-01-preview', **opts)
19
+ @config = { token: token, endpoint: endpoint, api_version: api_version, **opts }
20
+ end
21
+
22
+ private
23
+
24
+ def management_client(**override_opts)
25
+ merged = config.merge(override_opts)
26
+ Legion::Extensions::Foundry::Helpers::Client.management_client(**merged)
27
+ end
28
+
29
+ def workspace_client(**override_opts)
30
+ merged = config.merge(override_opts)
31
+ Legion::Extensions::Foundry::Helpers::Client.workspace_client(**merged)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'faraday'
4
+ require 'multi_json'
5
+
6
+ module Legion
7
+ module Extensions
8
+ module Foundry
9
+ module Helpers
10
+ module Client
11
+ module_function
12
+
13
+ def management_client(token:, **)
14
+ Faraday.new(url: 'https://management.azure.com') do |conn|
15
+ conn.request :json
16
+ conn.response :json, content_type: /\bjson$/
17
+ conn.headers['Authorization'] = "Bearer #{token}"
18
+ conn.headers['Content-Type'] = 'application/json'
19
+ end
20
+ end
21
+
22
+ def workspace_client(token:, endpoint:, **)
23
+ Faraday.new(url: "https://#{endpoint}.api.azureml.ms") do |conn|
24
+ conn.request :json
25
+ conn.response :json, content_type: /\bjson$/
26
+ conn.headers['Authorization'] = "Bearer #{token}"
27
+ conn.headers['Content-Type'] = 'application/json'
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/foundry/helpers/client'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Foundry
8
+ module Runners
9
+ module Connections
10
+ extend Legion::Extensions::Foundry::Helpers::Client
11
+
12
+ def list(token:, endpoint:, subscription_id:, resource_group:, workspace:,
13
+ api_version: '2024-10-01-preview', **)
14
+ path = arm_connections_path(subscription_id, resource_group, workspace)
15
+ response = management_client(token: token, endpoint: endpoint)
16
+ .get("#{path}?api-version=#{api_version}")
17
+ { connections: response.body }
18
+ end
19
+
20
+ def get(name:, token:, endpoint:, subscription_id:, resource_group:, workspace:,
21
+ api_version: '2024-10-01-preview', **)
22
+ path = arm_connections_path(subscription_id, resource_group, workspace)
23
+ response = management_client(token: token, endpoint: endpoint)
24
+ .get("#{path}/#{name}?api-version=#{api_version}")
25
+ { connection: response.body }
26
+ end
27
+
28
+ def create(name:, type:, target:, token:, endpoint:, subscription_id:, resource_group:, workspace:,
29
+ api_version: '2024-10-01-preview', **)
30
+ path = arm_connections_path(subscription_id, resource_group, workspace)
31
+ body = { properties: { category: type, target: target } }
32
+ response = management_client(token: token, endpoint: endpoint)
33
+ .put("#{path}/#{name}?api-version=#{api_version}", body)
34
+ { connection: response.body }
35
+ end
36
+
37
+ def delete(name:, token:, endpoint:, subscription_id:, resource_group:, workspace:,
38
+ api_version: '2024-10-01-preview', **)
39
+ path = arm_connections_path(subscription_id, resource_group, workspace)
40
+ management_client(token: token, endpoint: endpoint)
41
+ .delete("#{path}/#{name}?api-version=#{api_version}")
42
+ { deleted: true }
43
+ end
44
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
45
+ Legion::Extensions::Helpers.const_defined?(:Lex)
46
+
47
+ private
48
+
49
+ def arm_connections_path(subscription_id, resource_group, workspace)
50
+ "/subscriptions/#{subscription_id}/resourceGroups/#{resource_group}" \
51
+ "/providers/Microsoft.MachineLearningServices/workspaces/#{workspace}/connections"
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/foundry/helpers/client'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Foundry
8
+ module Runners
9
+ module Deployments
10
+ extend Legion::Extensions::Foundry::Helpers::Client
11
+
12
+ def list(token:, endpoint:, subscription_id:, resource_group:, workspace:,
13
+ api_version: '2024-10-01-preview', **)
14
+ path = arm_deployments_path(subscription_id, resource_group, workspace)
15
+ response = management_client(token: token, endpoint: endpoint)
16
+ .get("#{path}?api-version=#{api_version}")
17
+ { deployments: response.body }
18
+ end
19
+
20
+ def get(name:, token:, endpoint:, subscription_id:, resource_group:, workspace:,
21
+ api_version: '2024-10-01-preview', **)
22
+ path = arm_deployments_path(subscription_id, resource_group, workspace)
23
+ response = management_client(token: token, endpoint: endpoint)
24
+ .get("#{path}/#{name}?api-version=#{api_version}")
25
+ { deployment: response.body }
26
+ end
27
+
28
+ def create(name:, model:, token:, endpoint:, subscription_id:, resource_group:, workspace:,
29
+ sku: 'Standard', api_version: '2024-10-01-preview', **)
30
+ path = arm_deployments_path(subscription_id, resource_group, workspace)
31
+ body = { properties: { model: model }, sku: { name: sku } }
32
+ response = management_client(token: token, endpoint: endpoint)
33
+ .put("#{path}/#{name}?api-version=#{api_version}", body)
34
+ { deployment: response.body }
35
+ end
36
+
37
+ def delete(name:, token:, endpoint:, subscription_id:, resource_group:, workspace:,
38
+ api_version: '2024-10-01-preview', **)
39
+ path = arm_deployments_path(subscription_id, resource_group, workspace)
40
+ management_client(token: token, endpoint: endpoint)
41
+ .delete("#{path}/#{name}?api-version=#{api_version}")
42
+ { deleted: true }
43
+ end
44
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
45
+ Legion::Extensions::Helpers.const_defined?(:Lex)
46
+
47
+ private
48
+
49
+ def arm_deployments_path(subscription_id, resource_group, workspace)
50
+ "/subscriptions/#{subscription_id}/resourceGroups/#{resource_group}" \
51
+ "/providers/Microsoft.MachineLearningServices/workspaces/#{workspace}" \
52
+ '/onlineEndpoints/default/deployments'
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/foundry/helpers/client'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Foundry
8
+ module Runners
9
+ module Models
10
+ extend Legion::Extensions::Foundry::Helpers::Client
11
+
12
+ def list(token:, endpoint:, api_version: '2024-10-01-preview', **)
13
+ response = workspace_client(token: token, endpoint: endpoint)
14
+ .get("/models?api-version=#{api_version}")
15
+ { models: response.body }
16
+ end
17
+
18
+ def get(model_id:, token:, endpoint:, api_version: '2024-10-01-preview', **)
19
+ response = workspace_client(token: token, endpoint: endpoint)
20
+ .get("/models/#{model_id}?api-version=#{api_version}")
21
+ { model: response.body }
22
+ end
23
+
24
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
25
+ Legion::Extensions::Helpers.const_defined?(:Lex)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Foundry
6
+ VERSION = '0.1.1'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/foundry/version'
4
+ require 'legion/extensions/foundry/helpers/client'
5
+ require 'legion/extensions/foundry/runners/deployments'
6
+ require 'legion/extensions/foundry/runners/models'
7
+ require 'legion/extensions/foundry/runners/connections'
8
+ require 'legion/extensions/foundry/client'
9
+
10
+ module Legion
11
+ module Extensions
12
+ module Foundry
13
+ extend Legion::Extensions::Core if Legion::Extensions.const_defined? :Core
14
+ end
15
+ end
16
+ end
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lex-foundry
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: faraday
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '2.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '2.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: multi_json
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 Azure AI Foundry (model catalog, deployments, connections)
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-foundry.gemspec
55
+ - lib/legion/extensions/foundry.rb
56
+ - lib/legion/extensions/foundry/client.rb
57
+ - lib/legion/extensions/foundry/helpers/client.rb
58
+ - lib/legion/extensions/foundry/runners/connections.rb
59
+ - lib/legion/extensions/foundry/runners/deployments.rb
60
+ - lib/legion/extensions/foundry/runners/models.rb
61
+ - lib/legion/extensions/foundry/version.rb
62
+ homepage: https://github.com/LegionIO/lex-foundry
63
+ licenses:
64
+ - MIT
65
+ metadata:
66
+ homepage_uri: https://github.com/LegionIO/lex-foundry
67
+ source_code_uri: https://github.com/LegionIO/lex-foundry
68
+ documentation_uri: https://github.com/LegionIO/lex-foundry
69
+ changelog_uri: https://github.com/LegionIO/lex-foundry
70
+ bug_tracker_uri: https://github.com/LegionIO/lex-foundry/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 Azure AI Foundry
89
+ test_files: []