lex-llm-gemini 0.1.1 → 0.1.2
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 +7 -1
- data/Gemfile +2 -6
- data/README.md +2 -2
- data/lex-llm-gemini.gemspec +1 -1
- data/lib/legion/extensions/llm/gemini/provider.rb +10 -10
- data/lib/legion/extensions/llm/gemini/version.rb +1 -1
- data/lib/legion/extensions/llm/gemini.rb +2 -2
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1134a4cb3dc92ae34c6a8dfe5c307c2c16c8ead8ad4795eacb070b44561ada54
|
|
4
|
+
data.tar.gz: a83a9fab31f175beed47cd196da8930f3f8f20bd4ff38205996997c1ca774b05
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6b682d787c4b406727f3f8758a5e81d5df9298435fd0047f62e0914c1367a2be8f9769b42e134ec3589a4eba46729d549a699442fb6fb2f02387069da63457d2
|
|
7
|
+
data.tar.gz: f41e2b8dcf0a0d45a6ac4c0eeda4c743034669190d346e3d31211ed6308ee173590b590b7adeaa2eae8767d8b104fecfbc5931b128cf979edd9f6add1e7a05b9
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.2 - 2026-04-28
|
|
4
|
+
|
|
5
|
+
- Replace fork-era namespace references with the standard Legion::Extensions::Llm provider contract.
|
|
6
|
+
- Remove GitHub-based lex-llm Gemfile fallback so test installs use only a guarded local path or released gem dependency.
|
|
7
|
+
- Require lex-llm >= 0.1.3 for the cleaned Legion-native base extension.
|
|
8
|
+
|
|
3
9
|
## 0.1.1 - 2026-04-27
|
|
4
10
|
|
|
5
|
-
- Add the Gemini
|
|
11
|
+
- Add the Gemini Legion::Extensions::Llm provider class with generateContent, streaming, model listing, and embedContent helpers.
|
|
6
12
|
- Use shared `Legion::Extensions::Llm.provider_settings` defaults from `lex-llm`.
|
|
7
13
|
- Remove the committed `Gemfile.lock`.
|
|
8
14
|
|
data/Gemfile
CHANGED
|
@@ -3,12 +3,8 @@
|
|
|
3
3
|
source 'https://rubygems.org'
|
|
4
4
|
|
|
5
5
|
group :test do
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
else
|
|
9
|
-
gem 'lex-llm', git: 'https://github.com/LegionIO/lex-llm',
|
|
10
|
-
branch: ENV.fetch('LEX_LLM_BRANCH', 'main')
|
|
11
|
-
end
|
|
6
|
+
lex_llm_path = ENV.fetch('LEX_LLM_PATH', File.expand_path('../lex-llm', __dir__))
|
|
7
|
+
gem 'lex-llm', path: lex_llm_path if File.directory?(lex_llm_path)
|
|
12
8
|
end
|
|
13
9
|
|
|
14
10
|
gemspec
|
data/README.md
CHANGED
|
@@ -6,7 +6,7 @@ This gem lives under `Legion::Extensions::Llm::Gemini` and depends on `lex-llm`
|
|
|
6
6
|
|
|
7
7
|
## What It Provides
|
|
8
8
|
|
|
9
|
-
- `
|
|
9
|
+
- `Legion::Extensions::Llm::Provider` registration as `:gemini`
|
|
10
10
|
- Gemini-native chat requests through `POST /v1beta/{model=models/*}:generateContent`
|
|
11
11
|
- streaming chat support through `POST /v1beta/{model=models/*}:streamGenerateContent?alt=sse`
|
|
12
12
|
- model discovery through `GET /v1beta/models`
|
|
@@ -35,7 +35,7 @@ Legion::Extensions::Llm::Gemini.default_settings
|
|
|
35
35
|
## Configuration
|
|
36
36
|
|
|
37
37
|
```ruby
|
|
38
|
-
|
|
38
|
+
Legion::Extensions::Llm.configure do |config|
|
|
39
39
|
config.gemini_api_key = ENV.fetch("GEMINI_API_KEY")
|
|
40
40
|
config.gemini_api_base = "https://generativelanguage.googleapis.com/v1beta"
|
|
41
41
|
config.default_model = "gemini-2.0-flash"
|
data/lex-llm-gemini.gemspec
CHANGED
|
@@ -27,5 +27,5 @@ Gem::Specification.new do |spec|
|
|
|
27
27
|
spec.add_dependency 'legion-json', '>= 1.0'
|
|
28
28
|
spec.add_dependency 'legion-logging', '>= 1.0'
|
|
29
29
|
spec.add_dependency 'legion-settings', '>= 1.3.14'
|
|
30
|
-
spec.add_dependency 'lex-llm', '>= 0.1.
|
|
30
|
+
spec.add_dependency 'lex-llm', '>= 0.1.3'
|
|
31
31
|
end
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require '
|
|
3
|
+
require 'legion/extensions/llm'
|
|
4
4
|
require 'legion/json'
|
|
5
5
|
|
|
6
6
|
module Legion
|
|
7
7
|
module Extensions
|
|
8
8
|
module Llm
|
|
9
9
|
module Gemini
|
|
10
|
-
# Gemini provider implementation for the
|
|
11
|
-
class Provider <
|
|
10
|
+
# Gemini provider implementation for the Legion::Extensions::Llm base provider contract.
|
|
11
|
+
class Provider < Legion::Extensions::Llm::Provider # rubocop:disable Metrics/ClassLength
|
|
12
12
|
class << self
|
|
13
13
|
def slug = 'gemini'
|
|
14
14
|
def configuration_options = %i[gemini_api_key gemini_api_base]
|
|
@@ -148,9 +148,9 @@ module Legion
|
|
|
148
148
|
end
|
|
149
149
|
|
|
150
150
|
def content_parts(content)
|
|
151
|
-
return Array(content.value) if content.is_a?(
|
|
151
|
+
return Array(content.value) if content.is_a?(Legion::Extensions::Llm::Content::Raw)
|
|
152
152
|
return [{ text: Legion::JSON.generate(content) }] if content.is_a?(Hash) || content.is_a?(Array)
|
|
153
|
-
return [{ text: content.to_s }] unless content.is_a?(
|
|
153
|
+
return [{ text: content.to_s }] unless content.is_a?(Legion::Extensions::Llm::Content)
|
|
154
154
|
|
|
155
155
|
parts = []
|
|
156
156
|
parts << { text: content.text } if content.text
|
|
@@ -202,7 +202,7 @@ module Legion
|
|
|
202
202
|
body = response.body
|
|
203
203
|
parts = response_parts(body)
|
|
204
204
|
|
|
205
|
-
|
|
205
|
+
Legion::Extensions::Llm::Message.new(
|
|
206
206
|
role: :assistant,
|
|
207
207
|
content: text_content(parts),
|
|
208
208
|
tool_calls: parse_tool_calls(parts),
|
|
@@ -218,7 +218,7 @@ module Legion
|
|
|
218
218
|
def build_chunk(data)
|
|
219
219
|
parts = response_parts(data)
|
|
220
220
|
|
|
221
|
-
|
|
221
|
+
Legion::Extensions::Llm::Chunk.new(
|
|
222
222
|
role: :assistant,
|
|
223
223
|
content: text_content(parts),
|
|
224
224
|
tool_calls: parse_tool_calls(parts),
|
|
@@ -253,7 +253,7 @@ module Legion
|
|
|
253
253
|
next unless function_call
|
|
254
254
|
|
|
255
255
|
id = SecureRandom.uuid
|
|
256
|
-
result[id] =
|
|
256
|
+
result[id] = Legion::Extensions::Llm::ToolCall.new(
|
|
257
257
|
id: id,
|
|
258
258
|
name: function_call['name'],
|
|
259
259
|
arguments: function_call['args'] || {}
|
|
@@ -268,7 +268,7 @@ module Legion
|
|
|
268
268
|
model_id = model_data.fetch('name').delete_prefix('models/')
|
|
269
269
|
methods = Array(model_data['supportedGenerationMethods'])
|
|
270
270
|
|
|
271
|
-
|
|
271
|
+
Legion::Extensions::Llm::Model::Info.new(
|
|
272
272
|
id: model_id,
|
|
273
273
|
name: model_data['displayName'] || model_id,
|
|
274
274
|
provider: provider,
|
|
@@ -300,7 +300,7 @@ module Legion
|
|
|
300
300
|
end
|
|
301
301
|
|
|
302
302
|
def parse_embedding_response(response, model:, **)
|
|
303
|
-
|
|
303
|
+
Legion::Extensions::Llm::Embedding.new(
|
|
304
304
|
vectors: response.body.dig('embedding', 'values'),
|
|
305
305
|
model: model,
|
|
306
306
|
input_tokens: response.body.dig('usageMetadata', 'promptTokenCount').to_i
|
|
@@ -35,5 +35,5 @@ module Legion
|
|
|
35
35
|
end
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
Legion::Extensions::Llm::Provider.register(Legion::Extensions::Llm::Gemini::PROVIDER_FAMILY,
|
|
39
|
+
Legion::Extensions::Llm::Gemini::Provider)
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lex-llm-gemini
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- LegionIO
|
|
@@ -71,14 +71,14 @@ dependencies:
|
|
|
71
71
|
requirements:
|
|
72
72
|
- - ">="
|
|
73
73
|
- !ruby/object:Gem::Version
|
|
74
|
-
version: 0.1.
|
|
74
|
+
version: 0.1.3
|
|
75
75
|
type: :runtime
|
|
76
76
|
prerelease: false
|
|
77
77
|
version_requirements: !ruby/object:Gem::Requirement
|
|
78
78
|
requirements:
|
|
79
79
|
- - ">="
|
|
80
80
|
- !ruby/object:Gem::Version
|
|
81
|
-
version: 0.1.
|
|
81
|
+
version: 0.1.3
|
|
82
82
|
description: Gemini provider integration for the LegionIO LLM routing framework.
|
|
83
83
|
email:
|
|
84
84
|
- matthewdiverson@gmail.com
|