lex-llm-openai 0.1.0 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 16ed6620801f752c4020ffec05a5d37c43fc92fd3cdbeb31ccfb8014dbfb1c0f
4
- data.tar.gz: ebbacf48c3414c220c3c097e30d6421af1660259712f07e0e186967d06b7b1f7
3
+ metadata.gz: 219040f76900aecf620f996af83a531cb5468ec8a16abb16ae5994b3c05135b6
4
+ data.tar.gz: c4ea893b3923d815186bdf54faf71123889cde18bcf9b060a9c1dad81343af9c
5
5
  SHA512:
6
- metadata.gz: aa9b6c65e7a236ab8e4efc5dddffef8a83b952edea64856043887d9310aa1dc32bf388f6928b4755c950605092489be610a518a8bf674d988fa970fa2833f999
7
- data.tar.gz: 98bfcdac52d7b6cb1655bb1cfae23b7d3ad6726c2f2be55a447fb9a63869fa28a0afb51d48d81ec1b1e0498270063ad31f98cee3ff4c4e864bcecf18b011bad2
6
+ metadata.gz: 995cc72ac2fc9983969f0be0436988fe979dc2175ecfe4875383ea6b08e9778a9e7d800e516c8243c1abc4340935b55268dc58d4c6495eeb7e645c1c06275e88
7
+ data.tar.gz: 7557da2bee59173e652fc737220b2d179d4a27232940faf83e9c2e462332c368b7475afdfa35a5b12c5c7dc177f08110813d597ba9ff8985281c4bb5e516ae98
data/.gitignore CHANGED
@@ -2,6 +2,7 @@
2
2
  /coverage/
3
3
  /pkg/
4
4
  /tmp/
5
+ Gemfile.lock
5
6
 
6
7
  .rspec_status*
7
8
  .env
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.1 - 2026-04-27
4
+
5
+ - Add the OpenAI LexLLM provider class with chat, streaming, model listing, model retrieval, embeddings, moderation, image, and audio transcription helpers.
6
+ - Use `LexLLM::Provider::OpenAICompatible` for OpenAI-compatible request payload and response parsing.
7
+ - Use shared `Legion::Extensions::Llm.provider_settings` defaults from `lex-llm`.
8
+ - Update dependencies for shared Legion JSON, settings, logging, and `lex-llm >= 0.1.2`.
9
+ - Remove the committed `Gemfile.lock`.
10
+
3
11
  ## 0.1.0 - 2026-04-26
4
12
 
5
13
  - Initial Legion LLM Openai provider extension scaffold.
data/Gemfile CHANGED
@@ -2,11 +2,13 @@
2
2
 
3
3
  source 'https://rubygems.org'
4
4
 
5
- if ENV['LEX_LLM_PATH'] && File.directory?(ENV.fetch('LEX_LLM_PATH'))
6
- gem 'lex-llm', path: ENV.fetch('LEX_LLM_PATH')
7
- else
8
- gem 'lex-llm', git: 'https://github.com/LegionIO/lex-llm',
9
- branch: ENV.fetch('LEX_LLM_BRANCH', 'lex-llm-routing-base-20260425')
5
+ group :test do
6
+ if ENV['LEX_LLM_PATH'] && File.directory?(ENV.fetch('LEX_LLM_PATH'))
7
+ gem 'lex-llm', path: ENV.fetch('LEX_LLM_PATH')
8
+ else
9
+ gem 'lex-llm', git: 'https://github.com/LegionIO/lex-llm',
10
+ branch: ENV.fetch('LEX_LLM_BRANCH', 'main')
11
+ end
10
12
  end
11
13
 
12
14
  gemspec
data/README.md CHANGED
@@ -3,3 +3,51 @@
3
3
  LegionIO LLM provider extension for Openai.
4
4
 
5
5
  This gem lives under `Legion::Extensions::Llm::Openai` and depends on `lex-llm` for shared provider-neutral routing, fleet, and schema primitives.
6
+
7
+ ## What It Provides
8
+
9
+ - `LexLLM::Provider` registration as `:openai`
10
+ - chat completions through `POST /v1/chat/completions`
11
+ - streaming chat completions through the same chat completions endpoint
12
+ - model discovery through `GET /v1/models`
13
+ - model retrieval through `GET /v1/models/{model}`
14
+ - embeddings through `POST /v1/embeddings`
15
+ - moderation through `POST /v1/moderations`
16
+ - image generation through `POST /v1/images/generations`
17
+ - image editing through `POST /v1/images/edits`
18
+ - image variation endpoint helper for `POST /v1/images/variations`
19
+ - audio transcription through `POST /v1/audio/transcriptions`
20
+ - shared OpenAI-compatible request/response mapping via `LexLLM::Provider::OpenAICompatible`
21
+ - shared fleet/default settings via `Legion::Extensions::Llm.provider_settings`
22
+
23
+ ## Defaults
24
+
25
+ ```ruby
26
+ Legion::Extensions::Llm::Openai.default_settings
27
+ # {
28
+ # provider_family: :openai,
29
+ # instances: {
30
+ # default: {
31
+ # endpoint: "https://api.openai.com",
32
+ # tier: :frontier,
33
+ # transport: :http,
34
+ # credentials: { api_key: "env://OPENAI_API_KEY" },
35
+ # usage: { inference: true, embedding: true, moderation: true, image: true, audio: true },
36
+ # limits: { concurrency: 4 }
37
+ # }
38
+ # }
39
+ # }
40
+ ```
41
+
42
+ ## Configuration
43
+
44
+ ```ruby
45
+ LexLLM.configure do |config|
46
+ config.openai_api_key = ENV.fetch("OPENAI_API_KEY")
47
+ config.default_model = "gpt-5.2"
48
+ config.default_embedding_model = "text-embedding-3-small"
49
+ config.default_moderation_model = "omni-moderation-latest"
50
+ config.default_image_model = "gpt-image-1"
51
+ config.default_transcription_model = "gpt-4o-transcribe"
52
+ end
53
+ ```
@@ -24,5 +24,8 @@ Gem::Specification.new do |spec|
24
24
  spec.require_paths = ['lib']
25
25
 
26
26
  spec.add_dependency 'faraday', '>= 2.0'
27
- spec.add_dependency 'lex-llm', '>= 0.1.0'
27
+ spec.add_dependency 'legion-json', '>= 1.0'
28
+ spec.add_dependency 'legion-logging', '>= 1.0'
29
+ spec.add_dependency 'legion-settings', '>= 1.3.14'
30
+ spec.add_dependency 'lex-llm', '>= 0.1.2'
28
31
  end
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'lex_llm'
4
+ require 'legion/json'
5
+
6
+ module Legion
7
+ module Extensions
8
+ module Llm
9
+ module Openai
10
+ # OpenAI provider implementation for the LexLLM base provider contract.
11
+ class Provider < LexLLM::Provider
12
+ include LexLLM::Provider::OpenAICompatible
13
+
14
+ class << self
15
+ def slug = 'openai'
16
+ def configuration_requirements = %i[openai_api_key]
17
+
18
+ def configuration_options
19
+ %i[
20
+ openai_api_key
21
+ openai_api_base
22
+ openai_organization_id
23
+ openai_project_id
24
+ openai_use_system_role
25
+ ]
26
+ end
27
+
28
+ def capabilities = Capabilities
29
+ end
30
+
31
+ # Provider-level capability checks based on current OpenAI model families.
32
+ module Capabilities
33
+ module_function
34
+
35
+ CAPABILITY_CHECKS = {
36
+ 'streaming' => :streaming?,
37
+ 'function_calling' => :functions?,
38
+ 'vision' => :vision?,
39
+ 'embeddings' => :embeddings?,
40
+ 'moderation' => :moderation?,
41
+ 'image' => :images?,
42
+ 'audio_transcription' => :audio_transcription?
43
+ }.freeze
44
+
45
+ def chat?(model) = !non_chat_model?(model_id(model))
46
+ def streaming?(model) = chat?(model)
47
+ def functions?(model) = model_id(model).match?(/^(gpt|o\d)/)
48
+ def vision?(model) = model_id(model).match?(/^(gpt|o\d|omni-moderation)/)
49
+ def embeddings?(model) = model_id(model).start_with?('text-embedding-')
50
+ def moderation?(model) = model_id(model).include?('moderation')
51
+ def images?(model) = model_id(model).match?(/^(gpt-image|dall-e)/)
52
+ def audio_transcription?(model) = model_id(model).match?(/^(gpt-4o.*transcribe|whisper)/)
53
+
54
+ def critical_capabilities_for(model)
55
+ id = model_id(model)
56
+ CAPABILITY_CHECKS.filter_map { |capability, predicate| capability if public_send(predicate, id) }
57
+ end
58
+
59
+ def model_id(model)
60
+ model.respond_to?(:id) ? model.id.to_s : model.to_s
61
+ end
62
+
63
+ def non_chat_model?(id)
64
+ embeddings?(id) || moderation?(id) || images?(id) || audio_transcription?(id) ||
65
+ id.match?(/^(tts|gpt-realtime|sora)/)
66
+ end
67
+ end
68
+
69
+ def api_base
70
+ config.openai_api_base || 'https://api.openai.com'
71
+ end
72
+
73
+ def headers
74
+ {
75
+ 'Authorization' => "Bearer #{config.openai_api_key}",
76
+ 'OpenAI-Organization' => config.openai_organization_id,
77
+ 'OpenAI-Project' => config.openai_project_id
78
+ }.compact
79
+ end
80
+
81
+ def chat_url = completion_url
82
+ def image_generation_url = '/v1/images/generations'
83
+ def image_edit_url = '/v1/images/edits'
84
+ def image_variation_url = '/v1/images/variations'
85
+ def images_url(with: nil, mask: nil) = super
86
+
87
+ def retrieve_model(model)
88
+ connection.get("#{models_url}/#{model}").body
89
+ end
90
+
91
+ private
92
+
93
+ def maybe_normalize_temperature(temperature, model)
94
+ model_id = model.id.to_s
95
+ return nil if model_id.include?('-search')
96
+ return 1.0 if model_id.match?(/^(o\d|gpt-5)/) && !temperature.nil? && (temperature.to_f - 1.0).abs.positive?
97
+
98
+ temperature
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -4,7 +4,7 @@ module Legion
4
4
  module Extensions
5
5
  module Llm
6
6
  module Openai
7
- VERSION = '0.1.0'
7
+ VERSION = '0.1.1'
8
8
  end
9
9
  end
10
10
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'legion/extensions/llm'
4
- require 'legion/extensions/llm/openai/provider_settings'
4
+ require 'legion/extensions/llm/openai/provider'
5
5
  require 'legion/extensions/llm/openai/version'
6
6
 
7
7
  module Legion
@@ -14,19 +14,26 @@ module Legion
14
14
  PROVIDER_FAMILY = :openai
15
15
 
16
16
  def self.default_settings
17
- ProviderSettings.build(
17
+ ::Legion::Extensions::Llm.provider_settings(
18
18
  family: PROVIDER_FAMILY,
19
19
  instance: {
20
20
  endpoint: 'https://api.openai.com',
21
21
  tier: :frontier,
22
22
  transport: :http,
23
23
  credentials: { api_key: 'env://OPENAI_API_KEY' },
24
- usage: { inference: true, embedding: true },
24
+ usage: { inference: true, embedding: true, moderation: true, image: true, audio: true },
25
25
  limits: { concurrency: 4 }
26
26
  }
27
27
  )
28
28
  end
29
+
30
+ def self.provider_class
31
+ Provider
32
+ end
29
33
  end
30
34
  end
31
35
  end
32
36
  end
37
+
38
+ LexLLM::Provider.register(Legion::Extensions::Llm::Openai::PROVIDER_FAMILY,
39
+ Legion::Extensions::Llm::Openai::Provider)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-llm-openai
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - LegionIO
@@ -23,20 +23,62 @@ dependencies:
23
23
  - - ">="
24
24
  - !ruby/object:Gem::Version
25
25
  version: '2.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: legion-json
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '1.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '1.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: legion-logging
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '1.0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '1.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: legion-settings
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 1.3.14
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 1.3.14
26
68
  - !ruby/object:Gem::Dependency
27
69
  name: lex-llm
28
70
  requirement: !ruby/object:Gem::Requirement
29
71
  requirements:
30
72
  - - ">="
31
73
  - !ruby/object:Gem::Version
32
- version: 0.1.0
74
+ version: 0.1.2
33
75
  type: :runtime
34
76
  prerelease: false
35
77
  version_requirements: !ruby/object:Gem::Requirement
36
78
  requirements:
37
79
  - - ">="
38
80
  - !ruby/object:Gem::Version
39
- version: 0.1.0
81
+ version: 0.1.2
40
82
  description: Openai provider integration for the LegionIO LLM routing framework.
41
83
  email:
42
84
  - matthewdiverson@gmail.com
@@ -51,12 +93,11 @@ files:
51
93
  - ".rubocop.yml"
52
94
  - CHANGELOG.md
53
95
  - Gemfile
54
- - Gemfile.lock
55
96
  - LICENSE
56
97
  - README.md
57
98
  - lex-llm-openai.gemspec
58
99
  - lib/legion/extensions/llm/openai.rb
59
- - lib/legion/extensions/llm/openai/provider_settings.rb
100
+ - lib/legion/extensions/llm/openai/provider.rb
60
101
  - lib/legion/extensions/llm/openai/version.rb
61
102
  - lib/lex_llm_openai.rb
62
103
  homepage: https://github.com/LegionIO/lex-llm-openai
data/Gemfile.lock DELETED
@@ -1,161 +0,0 @@
1
- GIT
2
- remote: https://github.com/LegionIO/lex-llm
3
- revision: 6b2901bf332806ca369399ad08f09da82825b121
4
- branch: lex-llm-routing-base-20260425
5
- specs:
6
- lex-llm (0.1.0)
7
- base64
8
- event_stream_parser (~> 1)
9
- faraday (>= 1.10.0)
10
- faraday-multipart (>= 1)
11
- faraday-net_http (>= 1)
12
- faraday-retry (>= 1)
13
- marcel (~> 1)
14
- ruby_llm-schema (~> 0)
15
- zeitwerk (~> 2)
16
-
17
- PATH
18
- remote: .
19
- specs:
20
- lex-llm-openai (0.1.0)
21
- faraday (>= 2.0)
22
- lex-llm (>= 0.1.0)
23
-
24
- GEM
25
- remote: https://rubygems.org/
26
- specs:
27
- ast (2.4.3)
28
- base64 (0.3.0)
29
- diff-lcs (1.6.2)
30
- event_stream_parser (1.0.0)
31
- faraday (2.14.1)
32
- faraday-net_http (>= 2.0, < 3.5)
33
- json
34
- logger
35
- faraday-multipart (1.2.0)
36
- multipart-post (~> 2.0)
37
- faraday-net_http (3.4.2)
38
- net-http (~> 0.5)
39
- faraday-retry (2.4.0)
40
- faraday (~> 2.0)
41
- json (2.19.4)
42
- language_server-protocol (3.17.0.5)
43
- lint_roller (1.1.0)
44
- logger (1.7.0)
45
- marcel (1.1.0)
46
- multipart-post (2.4.1)
47
- net-http (0.9.1)
48
- uri (>= 0.11.1)
49
- parallel (2.1.0)
50
- parser (3.3.11.1)
51
- ast (~> 2.4.1)
52
- racc
53
- prism (1.9.0)
54
- racc (1.8.1)
55
- rainbow (3.1.1)
56
- rake (13.4.2)
57
- regexp_parser (2.12.0)
58
- rspec (3.13.2)
59
- rspec-core (~> 3.13.0)
60
- rspec-expectations (~> 3.13.0)
61
- rspec-mocks (~> 3.13.0)
62
- rspec-core (3.13.6)
63
- rspec-support (~> 3.13.0)
64
- rspec-expectations (3.13.5)
65
- diff-lcs (>= 1.2.0, < 2.0)
66
- rspec-support (~> 3.13.0)
67
- rspec-mocks (3.13.8)
68
- diff-lcs (>= 1.2.0, < 2.0)
69
- rspec-support (~> 3.13.0)
70
- rspec-support (3.13.7)
71
- rubocop (1.86.1)
72
- json (~> 2.3)
73
- language_server-protocol (~> 3.17.0.2)
74
- lint_roller (~> 1.1.0)
75
- parallel (>= 1.10)
76
- parser (>= 3.3.0.2)
77
- rainbow (>= 2.2.2, < 4.0)
78
- regexp_parser (>= 2.9.3, < 3.0)
79
- rubocop-ast (>= 1.49.0, < 2.0)
80
- ruby-progressbar (~> 1.7)
81
- unicode-display_width (>= 2.4.0, < 4.0)
82
- rubocop-ast (1.49.1)
83
- parser (>= 3.3.7.2)
84
- prism (~> 1.7)
85
- rubocop-performance (1.26.1)
86
- lint_roller (~> 1.1)
87
- rubocop (>= 1.75.0, < 2.0)
88
- rubocop-ast (>= 1.47.1, < 2.0)
89
- rubocop-rake (0.7.1)
90
- lint_roller (~> 1.1)
91
- rubocop (>= 1.72.1)
92
- rubocop-rspec (3.9.0)
93
- lint_roller (~> 1.1)
94
- rubocop (~> 1.81)
95
- ruby-progressbar (1.13.0)
96
- ruby_llm-schema (0.3.0)
97
- unicode-display_width (3.2.0)
98
- unicode-emoji (~> 4.1)
99
- unicode-emoji (4.2.0)
100
- uri (1.1.1)
101
- zeitwerk (2.7.5)
102
-
103
- PLATFORMS
104
- arm64-darwin-25
105
- ruby
106
-
107
- DEPENDENCIES
108
- bundler (>= 2.0)
109
- lex-llm!
110
- lex-llm-openai!
111
- rake (>= 13.0)
112
- rspec (~> 3.12)
113
- rubocop (>= 1.0)
114
- rubocop-performance
115
- rubocop-rake (>= 0.6)
116
- rubocop-rspec
117
-
118
- CHECKSUMS
119
- ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
120
- base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
121
- diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
122
- event_stream_parser (1.0.0) sha256=a2683bab70126286f8184dc88f7968ffc4028f813161fb073ec90d171f7de3c8
123
- faraday (2.14.1) sha256=a43cceedc1e39d188f4d2cdd360a8aaa6a11da0c407052e426ba8d3fb42ef61c
124
- faraday-multipart (1.2.0) sha256=7d89a949693714176f612323ca13746a2ded204031a6ba528adee788694ef757
125
- faraday-net_http (3.4.2) sha256=f147758260d3526939bf57ecf911682f94926a3666502e24c69992765875906c
126
- faraday-retry (2.4.0) sha256=7b79c48fb7e56526faf247b12d94a680071ff40c9fda7cf1ec1549439ad11ebe
127
- json (2.19.4) sha256=670a7d333fb3b18ca5b29cb255eb7bef099e40d88c02c80bd42a3f30fe5239ac
128
- language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc
129
- lex-llm (0.1.0)
130
- lex-llm-openai (0.1.0)
131
- lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
132
- logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
133
- marcel (1.1.0) sha256=fdcfcfa33cc52e93c4308d40e4090a5d4ea279e160a7f6af988260fa970e0bee
134
- multipart-post (2.4.1) sha256=9872d03a8e552020ca096adadbf5e3cb1cd1cdd6acd3c161136b8a5737cdb4a8
135
- net-http (0.9.1) sha256=25ba0b67c63e89df626ed8fac771d0ad24ad151a858af2cc8e6a716ca4336996
136
- parallel (2.1.0) sha256=b35258865c2e31134c5ecb708beaaf6772adf9d5efae28e93e99260877b09356
137
- parser (3.3.11.1) sha256=d17ace7aabe3e72c3cc94043714be27cc6f852f104d81aa284c2281aecc65d54
138
- prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
139
- racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
140
- rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
141
- rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701
142
- regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb
143
- rspec (3.13.2) sha256=206284a08ad798e61f86d7ca3e376718d52c0bc944626b2349266f239f820587
144
- rspec-core (3.13.6) sha256=a8823c6411667b60a8bca135364351dda34cd55e44ff94c4be4633b37d828b2d
145
- rspec-expectations (3.13.5) sha256=33a4d3a1d95060aea4c94e9f237030a8f9eae5615e9bd85718fe3a09e4b58836
146
- rspec-mocks (3.13.8) sha256=086ad3d3d17533f4237643de0b5c42f04b66348c28bf6b9c2d3f4a3b01af1d47
147
- rspec-support (3.13.7) sha256=0640e5570872aafefd79867901deeeeb40b0c9875a36b983d85f54fb7381c47c
148
- rubocop (1.86.1) sha256=44415f3f01d01a21e01132248d2fd0867572475b566ca188a0a42133a08d4531
149
- rubocop-ast (1.49.1) sha256=4412f3ee70f6fe4546cc489548e0f6fcf76cafcfa80fa03af67098ffed755035
150
- rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834
151
- rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d
152
- rubocop-rspec (3.9.0) sha256=8fa70a3619408237d789aeecfb9beef40576acc855173e60939d63332fdb55e2
153
- ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
154
- ruby_llm-schema (0.3.0) sha256=a591edc5ca1b7f0304f0e2261de61ba4b3bea17be09f5cf7558153adfda3dec6
155
- unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
156
- unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
157
- uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6
158
- zeitwerk (2.7.5) sha256=d8da92128c09ea6ec62c949011b00ed4a20242b255293dd66bf41545398f73dd
159
-
160
- BUNDLED WITH
161
- 4.0.6
@@ -1,55 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Legion
4
- module Extensions
5
- module Llm
6
- module Openai
7
- # Builds provider defaults while inheriting shared lex-llm defaults.
8
- module ProviderSettings
9
- module_function
10
-
11
- def build(family:, instance:)
12
- deep_merge(
13
- base_settings,
14
- {
15
- enabled: true,
16
- provider_family: family,
17
- discovery: { enabled: true, interval_seconds: 300 },
18
- instances: {
19
- default: {
20
- enabled: true,
21
- credentials: nil,
22
- fleet: { enabled: false, consumer_priority: 0, prefetch: 1 }
23
- }.merge(instance)
24
- }
25
- }
26
- )
27
- end
28
-
29
- def base_settings
30
- return {} unless ::Legion::Extensions::Llm.respond_to?(:default_settings)
31
-
32
- deep_dup(::Legion::Extensions::Llm.default_settings)
33
- end
34
-
35
- def deep_dup(value)
36
- case value
37
- when Hash
38
- value.to_h { |key, inner_value| [key, deep_dup(inner_value)] }
39
- when Array
40
- value.map { |inner_value| deep_dup(inner_value) }
41
- else
42
- value
43
- end
44
- end
45
-
46
- def deep_merge(left, right)
47
- left.merge(right) do |_key, left_value, right_value|
48
- left_value.is_a?(Hash) && right_value.is_a?(Hash) ? deep_merge(left_value, right_value) : right_value
49
- end
50
- end
51
- end
52
- end
53
- end
54
- end
55
- end