lex-llm-vllm 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 +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +8 -1
- data/Gemfile +7 -5
- data/README.md +43 -1
- data/lex-llm-vllm.gemspec +6 -3
- data/lib/legion/extensions/llm/vllm/provider.rb +88 -0
- data/lib/legion/extensions/llm/vllm/version.rb +1 -1
- data/lib/legion/extensions/llm/vllm.rb +10 -3
- metadata +48 -7
- data/Gemfile.lock +0 -161
- data/lib/legion/extensions/llm/vllm/provider_settings.rb +0 -55
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 60324888ab790fc113a94d83915113c69dae7a985206410dbc5e8df7e9aa369d
|
|
4
|
+
data.tar.gz: d4eed4b5b5709e2f571855cab8ceb998cd27291cfc8f9cc2a67dfede2e72949d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 22d27deedab2c5bae70e9a307450f2bd93381e400bbefbcc9649d2eb622b8b38ca734cf876da8ed86f0adbe678aa166b074848a3d39d901c6d2f50d2d1d80d55
|
|
7
|
+
data.tar.gz: ef7bfbced82a1e61cb5bcc3d55c7b06838cd6247ad05d8b5bcd50456f7c206bd609683adf20e20bd52d2538ecb325727f66a92c1a32c871026a316c0e37cebd5
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.1 - 2026-04-27
|
|
4
|
+
|
|
5
|
+
- Added the vLLM `LexLLM::Provider` implementation using the shared OpenAI-compatible adapter.
|
|
6
|
+
- Moved provider defaults to shared `Legion::Extensions::Llm.provider_settings`.
|
|
7
|
+
- Added vLLM OpenAI-compatible endpoint and management helper coverage.
|
|
8
|
+
- Removed tracked `Gemfile.lock` and ignored future lockfiles for gem development.
|
|
9
|
+
|
|
3
10
|
## 0.1.0 - 2026-04-26
|
|
4
11
|
|
|
5
|
-
- Initial Legion LLM
|
|
12
|
+
- Initial Legion LLM vLLM provider extension scaffold.
|
data/Gemfile
CHANGED
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
source 'https://rubygems.org'
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
@@ -1,5 +1,47 @@
|
|
|
1
1
|
# lex-llm-vllm
|
|
2
2
|
|
|
3
|
-
LegionIO LLM provider extension for
|
|
3
|
+
LegionIO LLM provider extension for vLLM.
|
|
4
4
|
|
|
5
5
|
This gem lives under `Legion::Extensions::Llm::Vllm` 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 `:vllm`
|
|
10
|
+
- shared `LexLLM::Provider::OpenAICompatible` request and response handling
|
|
11
|
+
- chat requests through `POST /v1/chat/completions`
|
|
12
|
+
- streaming chat support
|
|
13
|
+
- model discovery through `GET /v1/models`
|
|
14
|
+
- embeddings through `POST /v1/embeddings`
|
|
15
|
+
- vLLM management helpers for `/health`, `/version`, `/reset_prefix_cache`, `/reset_mm_cache`, `/sleep`, and `/wake_up`
|
|
16
|
+
- shared fleet/default settings via `Legion::Extensions::Llm.provider_settings`
|
|
17
|
+
|
|
18
|
+
## Defaults
|
|
19
|
+
|
|
20
|
+
```ruby
|
|
21
|
+
Legion::Extensions::Llm::Vllm.default_settings
|
|
22
|
+
# {
|
|
23
|
+
# provider_family: :vllm,
|
|
24
|
+
# instances: {
|
|
25
|
+
# default: {
|
|
26
|
+
# endpoint: "http://localhost:8000",
|
|
27
|
+
# tier: :private,
|
|
28
|
+
# transport: :http,
|
|
29
|
+
# usage: { inference: true, embedding: true },
|
|
30
|
+
# limits: { concurrency: 8 }
|
|
31
|
+
# }
|
|
32
|
+
# }
|
|
33
|
+
# }
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Configuration
|
|
37
|
+
|
|
38
|
+
```ruby
|
|
39
|
+
LexLLM.configure do |config|
|
|
40
|
+
config.vllm_api_base = "http://localhost:8000"
|
|
41
|
+
config.vllm_api_key = ENV["VLLM_API_KEY"]
|
|
42
|
+
config.default_model = "meta-llama/Llama-3.1-8B-Instruct"
|
|
43
|
+
config.default_embedding_model = "BAAI/bge-base-en-v1.5"
|
|
44
|
+
end
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
vLLM's OpenAI-compatible server supports the chat completions, models, and embeddings APIs when the served model and task support them. Chat requests require a model with a chat template; embedding requests require an embedding-capable served model.
|
data/lex-llm-vllm.gemspec
CHANGED
|
@@ -7,8 +7,8 @@ Gem::Specification.new do |spec|
|
|
|
7
7
|
spec.version = Legion::Extensions::Llm::Vllm::VERSION
|
|
8
8
|
spec.authors = ['LegionIO']
|
|
9
9
|
spec.email = ['matthewdiverson@gmail.com']
|
|
10
|
-
spec.summary = 'LegionIO LLM
|
|
11
|
-
spec.description = '
|
|
10
|
+
spec.summary = 'LegionIO LLM vLLM provider extension'
|
|
11
|
+
spec.description = 'vLLM provider integration for the LegionIO LLM routing framework.'
|
|
12
12
|
spec.homepage = 'https://github.com/LegionIO/lex-llm-vllm'
|
|
13
13
|
spec.license = 'MIT'
|
|
14
14
|
spec.required_ruby_version = '>= 3.4'
|
|
@@ -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 '
|
|
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,88 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'lex_llm'
|
|
4
|
+
require 'uri'
|
|
5
|
+
|
|
6
|
+
module Legion
|
|
7
|
+
module Extensions
|
|
8
|
+
module Llm
|
|
9
|
+
module Vllm
|
|
10
|
+
# vLLM 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 = 'vllm'
|
|
16
|
+
def local? = true
|
|
17
|
+
def configuration_options = %i[vllm_api_base vllm_api_key]
|
|
18
|
+
def configuration_requirements = []
|
|
19
|
+
def capabilities = Capabilities
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Capability predicates for vLLM OpenAI-compatible model offerings.
|
|
23
|
+
module Capabilities
|
|
24
|
+
module_function
|
|
25
|
+
|
|
26
|
+
def chat?(_model) = true
|
|
27
|
+
def streaming?(_model) = true
|
|
28
|
+
def vision?(_model) = true
|
|
29
|
+
def functions?(_model) = true
|
|
30
|
+
def embeddings?(_model) = true
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def api_base
|
|
34
|
+
config.vllm_api_base || 'http://localhost:8000'
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def headers
|
|
38
|
+
token = config.vllm_api_key
|
|
39
|
+
return {} if token.nil? || token.to_s.empty?
|
|
40
|
+
|
|
41
|
+
{ 'Authorization' => "Bearer #{token}" }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def health_url = '/health'
|
|
45
|
+
def version_url = '/version'
|
|
46
|
+
def reset_prefix_cache_url = '/reset_prefix_cache'
|
|
47
|
+
def reset_mm_cache_url = '/reset_mm_cache'
|
|
48
|
+
def sleep_url = '/sleep'
|
|
49
|
+
def wake_up_url = '/wake_up'
|
|
50
|
+
|
|
51
|
+
def health
|
|
52
|
+
connection.get(health_url).body
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def version
|
|
56
|
+
connection.get(version_url).body
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def reset_prefix_cache(reset_running_requests: nil, reset_external: nil)
|
|
60
|
+
connection.post(with_query(reset_prefix_cache_url, reset_running_requests:, reset_external:), {}).body
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def reset_mm_cache
|
|
64
|
+
connection.post(reset_mm_cache_url, {}).body
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def sleep(level: 1)
|
|
68
|
+
connection.post(with_query(sleep_url, level:), {}).body
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def wake_up(tags: nil)
|
|
72
|
+
query = Array(tags).map { |tag| ['tags', tag] }
|
|
73
|
+
connection.post(with_query(wake_up_url, query), {}).body
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
private
|
|
77
|
+
|
|
78
|
+
def with_query(path, positional = [], **params)
|
|
79
|
+
pairs = positional + params.compact.map { |key, value| [key.to_s, value] }
|
|
80
|
+
return path if pairs.empty?
|
|
81
|
+
|
|
82
|
+
"#{path}?#{URI.encode_www_form(pairs)}"
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'legion/extensions/llm'
|
|
4
|
-
require 'legion/extensions/llm/vllm/
|
|
4
|
+
require 'legion/extensions/llm/vllm/provider'
|
|
5
5
|
require 'legion/extensions/llm/vllm/version'
|
|
6
6
|
|
|
7
7
|
module Legion
|
|
@@ -14,18 +14,25 @@ module Legion
|
|
|
14
14
|
PROVIDER_FAMILY = :vllm
|
|
15
15
|
|
|
16
16
|
def self.default_settings
|
|
17
|
-
|
|
17
|
+
::Legion::Extensions::Llm.provider_settings(
|
|
18
18
|
family: PROVIDER_FAMILY,
|
|
19
19
|
instance: {
|
|
20
20
|
endpoint: 'http://localhost:8000',
|
|
21
21
|
tier: :private,
|
|
22
22
|
transport: :http,
|
|
23
|
-
usage: { inference: true, embedding:
|
|
23
|
+
usage: { inference: true, embedding: true },
|
|
24
24
|
limits: { concurrency: 8 }
|
|
25
25
|
}
|
|
26
26
|
)
|
|
27
27
|
end
|
|
28
|
+
|
|
29
|
+
def self.provider_class
|
|
30
|
+
Provider
|
|
31
|
+
end
|
|
28
32
|
end
|
|
29
33
|
end
|
|
30
34
|
end
|
|
31
35
|
end
|
|
36
|
+
|
|
37
|
+
LexLLM::Provider.register(Legion::Extensions::Llm::Vllm::PROVIDER_FAMILY,
|
|
38
|
+
Legion::Extensions::Llm::Vllm::Provider)
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lex-llm-vllm
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- LegionIO
|
|
@@ -23,21 +23,63 @@ 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.
|
|
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.
|
|
40
|
-
description:
|
|
81
|
+
version: 0.1.2
|
|
82
|
+
description: vLLM provider integration for the LegionIO LLM routing framework.
|
|
41
83
|
email:
|
|
42
84
|
- matthewdiverson@gmail.com
|
|
43
85
|
executables: []
|
|
@@ -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-vllm.gemspec
|
|
58
99
|
- lib/legion/extensions/llm/vllm.rb
|
|
59
|
-
- lib/legion/extensions/llm/vllm/
|
|
100
|
+
- lib/legion/extensions/llm/vllm/provider.rb
|
|
60
101
|
- lib/legion/extensions/llm/vllm/version.rb
|
|
61
102
|
- lib/lex_llm_vllm.rb
|
|
62
103
|
homepage: https://github.com/LegionIO/lex-llm-vllm
|
|
@@ -85,5 +126,5 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
85
126
|
requirements: []
|
|
86
127
|
rubygems_version: 3.6.9
|
|
87
128
|
specification_version: 4
|
|
88
|
-
summary: LegionIO LLM
|
|
129
|
+
summary: LegionIO LLM vLLM provider extension
|
|
89
130
|
test_files: []
|
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-vllm (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-vllm!
|
|
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-vllm (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 Vllm
|
|
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
|