lex-llm-gemini 0.1.6 → 0.1.7
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/CHANGELOG.md +8 -0
- data/README.md +40 -6
- data/lib/legion/extensions/llm/gemini/provider.rb +4 -0
- data/lib/legion/extensions/llm/gemini/registry_event_builder.rb +4 -1
- data/lib/legion/extensions/llm/gemini/registry_publisher.rb +10 -17
- data/lib/legion/extensions/llm/gemini/version.rb +1 -1
- data/lib/legion/extensions/llm/gemini.rb +1 -0
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3b4d2bbf521fe7cd5757553aff5a6d61c1a9e9ffbe18c683058710ab19a8a6ff
|
|
4
|
+
data.tar.gz: 98d0db7b428b68d0543682c43a27d77fde00aee8bb02377195c37224e9429fef
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c40e3408f31507e4de8622e65676a2eb67849a05964dee02585545647563a4655fe808a3673782b1819bc7828a1f9fd3af900aa57ce09f6119ba28caefe01813
|
|
7
|
+
data.tar.gz: bacceead0f9edceed7da8efb605fe516f0ea7110c57f47cf8b16bad77805e74d8a1a99d37ffec056fa4affdd2c4e6a30f45c7a5812c03221182038373a45c784
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.7 - 2026-04-30
|
|
4
|
+
|
|
5
|
+
- Audit logging, rescue blocks, and README for full observability.
|
|
6
|
+
- Add `Legion::Logging::Helper` to every module and class in lib/.
|
|
7
|
+
- Replace all bare rescue blocks and custom `log_publish_failure` with `handle_exception(e, level:, handled:, operation:)`.
|
|
8
|
+
- Add info-level action logging for model listing and registry publishing.
|
|
9
|
+
- Update README to reflect registry event publishing and observability patterns.
|
|
10
|
+
|
|
3
11
|
## 0.1.6 - 2026-04-28
|
|
4
12
|
|
|
5
13
|
- Publish best-effort `llm.registry` discovered-model availability events when transport is already loaded.
|
data/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# lex-llm-gemini
|
|
2
2
|
|
|
3
|
-
LegionIO LLM provider extension for Gemini.
|
|
3
|
+
LegionIO LLM provider extension for Google Gemini.
|
|
4
4
|
|
|
5
5
|
This gem lives under `Legion::Extensions::Llm::Gemini` and depends on `lex-llm` for shared provider-neutral routing, fleet, and schema primitives.
|
|
6
6
|
|
|
@@ -10,11 +10,24 @@ Load it with `require 'legion/extensions/llm/gemini'`.
|
|
|
10
10
|
|
|
11
11
|
- `Legion::Extensions::Llm::Provider` registration as `:gemini`
|
|
12
12
|
- Gemini-native chat requests through `POST /v1beta/{model=models/*}:generateContent`
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
13
|
+
- Streaming chat support through `POST /v1beta/{model=models/*}:streamGenerateContent?alt=sse`
|
|
14
|
+
- Model discovery through `GET /v1beta/models`
|
|
15
|
+
- Embeddings through `POST /v1beta/{model=models/*}:embedContent`
|
|
16
|
+
- Normalized chat, streaming, vision, function calling, and embedding capability mapping from `supportedGenerationMethods`
|
|
17
|
+
- Best-effort `llm.registry` availability events published to AMQP when transport is loaded
|
|
18
|
+
- Shared fleet/default settings via `Legion::Extensions::Llm.provider_settings`
|
|
19
|
+
|
|
20
|
+
## File Map
|
|
21
|
+
|
|
22
|
+
| Path | Purpose |
|
|
23
|
+
|------|---------|
|
|
24
|
+
| `lib/legion/extensions/llm/gemini.rb` | Entry point; provider registration |
|
|
25
|
+
| `lib/legion/extensions/llm/gemini/provider.rb` | Gemini provider (chat, streaming, models, embeddings) |
|
|
26
|
+
| `lib/legion/extensions/llm/gemini/registry_event_builder.rb` | Builds sanitized lex-llm registry event envelopes |
|
|
27
|
+
| `lib/legion/extensions/llm/gemini/registry_publisher.rb` | Best-effort async publisher for model availability events |
|
|
28
|
+
| `lib/legion/extensions/llm/gemini/transport/exchanges/llm_registry.rb` | `llm.registry` AMQP topic exchange |
|
|
29
|
+
| `lib/legion/extensions/llm/gemini/transport/messages/registry_event.rb` | AMQP message wrapper for registry events |
|
|
30
|
+
| `lib/legion/extensions/llm/gemini/version.rb` | `VERSION` constant |
|
|
18
31
|
|
|
19
32
|
## Defaults
|
|
20
33
|
|
|
@@ -45,3 +58,24 @@ Legion::Extensions::Llm.configure do |config|
|
|
|
45
58
|
config.default_embedding_model = "gemini-embedding-001"
|
|
46
59
|
end
|
|
47
60
|
```
|
|
61
|
+
|
|
62
|
+
## Observability
|
|
63
|
+
|
|
64
|
+
Every module and class includes or extends `Legion::Logging::Helper`:
|
|
65
|
+
|
|
66
|
+
- **Info-level logging** on `list_models` and registry event publishing.
|
|
67
|
+
- **All rescue blocks** call `handle_exception(e, level:, handled:, operation:)` for structured exception telemetry.
|
|
68
|
+
- Registry publishing is best-effort; failures are handled at `:debug` or `:warn` level and never block the caller.
|
|
69
|
+
|
|
70
|
+
## Development
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
bundle install
|
|
74
|
+
bundle exec rspec # 0 failures
|
|
75
|
+
bundle exec rubocop -A # auto-fix
|
|
76
|
+
bundle exec rubocop # lint check
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## License
|
|
80
|
+
|
|
81
|
+
Apache-2.0
|
|
@@ -8,6 +8,8 @@ module Legion
|
|
|
8
8
|
module Gemini
|
|
9
9
|
# Gemini provider implementation for the Legion::Extensions::Llm base provider contract.
|
|
10
10
|
class Provider < Legion::Extensions::Llm::Provider # rubocop:disable Metrics/ClassLength
|
|
11
|
+
include Legion::Logging::Helper if defined?(Legion::Logging::Helper)
|
|
12
|
+
|
|
11
13
|
class << self
|
|
12
14
|
attr_writer :registry_publisher
|
|
13
15
|
|
|
@@ -94,7 +96,9 @@ module Legion
|
|
|
94
96
|
end
|
|
95
97
|
|
|
96
98
|
def list_models
|
|
99
|
+
log.info { 'listing available Gemini models' }
|
|
97
100
|
super.tap do |models|
|
|
101
|
+
log.info { "discovered #{models.size} Gemini model(s); publishing to registry" }
|
|
98
102
|
self.class.registry_publisher.publish_models_async(models, readiness: readiness(live: false))
|
|
99
103
|
end
|
|
100
104
|
end
|
|
@@ -6,6 +6,8 @@ module Legion
|
|
|
6
6
|
module Gemini
|
|
7
7
|
# Builds sanitized lex-llm registry envelopes for Gemini provider state.
|
|
8
8
|
class RegistryEventBuilder
|
|
9
|
+
include Legion::Logging::Helper if defined?(Legion::Logging::Helper)
|
|
10
|
+
|
|
9
11
|
def model_available(model, readiness:)
|
|
10
12
|
registry_event_class.available(
|
|
11
13
|
model_offering(model),
|
|
@@ -58,7 +60,8 @@ module Legion
|
|
|
58
60
|
configured_node = (::Legion::Settings.dig(:node, :canonical_name) if defined?(::Legion::Settings))
|
|
59
61
|
value = configured_node.to_s.strip
|
|
60
62
|
value.empty? ? :gemini : value.to_sym
|
|
61
|
-
rescue StandardError
|
|
63
|
+
rescue StandardError => e
|
|
64
|
+
handle_exception(e, level: :debug, handled: true, operation: 'gemini.registry.provider_instance')
|
|
62
65
|
:gemini
|
|
63
66
|
end
|
|
64
67
|
|
|
@@ -6,6 +6,8 @@ module Legion
|
|
|
6
6
|
module Gemini
|
|
7
7
|
# Best-effort publisher for Gemini provider availability events.
|
|
8
8
|
class RegistryPublisher
|
|
9
|
+
include Legion::Logging::Helper if defined?(Legion::Logging::Helper)
|
|
10
|
+
|
|
9
11
|
APP_ID = 'lex-llm-gemini'
|
|
10
12
|
|
|
11
13
|
def initialize(builder: RegistryEventBuilder.new)
|
|
@@ -13,6 +15,7 @@ module Legion
|
|
|
13
15
|
end
|
|
14
16
|
|
|
15
17
|
def publish_models_async(models, readiness:)
|
|
18
|
+
log.info { "publishing #{Array(models).size} model event(s) to llm.registry" }
|
|
16
19
|
schedule do
|
|
17
20
|
Array(models).each do |model|
|
|
18
21
|
publish_event(@builder.model_available(model, readiness:))
|
|
@@ -29,10 +32,10 @@ module Legion
|
|
|
29
32
|
Thread.current.abort_on_exception = false
|
|
30
33
|
yield
|
|
31
34
|
rescue StandardError => e
|
|
32
|
-
|
|
35
|
+
handle_exception(e, level: :debug, handled: true, operation: 'gemini.registry.schedule_thread')
|
|
33
36
|
end
|
|
34
37
|
rescue StandardError => e
|
|
35
|
-
|
|
38
|
+
handle_exception(e, level: :debug, handled: true, operation: 'gemini.registry.schedule')
|
|
36
39
|
false
|
|
37
40
|
end
|
|
38
41
|
|
|
@@ -41,7 +44,7 @@ module Legion
|
|
|
41
44
|
|
|
42
45
|
message_class.new(event:, app_id: APP_ID).publish(spool: false)
|
|
43
46
|
rescue StandardError => e
|
|
44
|
-
|
|
47
|
+
handle_exception(e, level: :warn, handled: true, operation: 'gemini.registry.publish_event')
|
|
45
48
|
false
|
|
46
49
|
end
|
|
47
50
|
|
|
@@ -52,7 +55,8 @@ module Legion
|
|
|
52
55
|
return true unless ::Legion::Transport::Connection.respond_to?(:session_open?)
|
|
53
56
|
|
|
54
57
|
::Legion::Transport::Connection.session_open?
|
|
55
|
-
rescue StandardError
|
|
58
|
+
rescue StandardError => e
|
|
59
|
+
handle_exception(e, level: :debug, handled: true, operation: 'gemini.registry.publishing_available?')
|
|
56
60
|
false
|
|
57
61
|
end
|
|
58
62
|
|
|
@@ -66,7 +70,8 @@ module Legion
|
|
|
66
70
|
|
|
67
71
|
require 'legion/extensions/llm/gemini/transport/messages/registry_event'
|
|
68
72
|
message_class_defined?
|
|
69
|
-
rescue LoadError
|
|
73
|
+
rescue LoadError => e
|
|
74
|
+
handle_exception(e, level: :debug, handled: true, operation: 'gemini.registry.transport_load')
|
|
70
75
|
false
|
|
71
76
|
end
|
|
72
77
|
|
|
@@ -77,18 +82,6 @@ module Legion
|
|
|
77
82
|
def message_class
|
|
78
83
|
::Legion::Extensions::Llm::Gemini::Transport::Messages::RegistryEvent
|
|
79
84
|
end
|
|
80
|
-
|
|
81
|
-
def log_publish_failure(error, level: :warn)
|
|
82
|
-
message = "[lex-llm-gemini] llm.registry publish failed: #{error.class}: #{error.message}"
|
|
83
|
-
logger = ::Legion::Extensions::Llm.logger if defined?(::Legion::Extensions::Llm)
|
|
84
|
-
if logger.respond_to?(level)
|
|
85
|
-
logger.public_send(level, message)
|
|
86
|
-
elsif logger.respond_to?(:debug)
|
|
87
|
-
logger.debug(message)
|
|
88
|
-
end
|
|
89
|
-
rescue StandardError
|
|
90
|
-
nil
|
|
91
|
-
end
|
|
92
85
|
end
|
|
93
86
|
end
|
|
94
87
|
end
|
|
@@ -12,6 +12,7 @@ module Legion
|
|
|
12
12
|
# Gemini provider extension namespace.
|
|
13
13
|
module Gemini
|
|
14
14
|
extend ::Legion::Extensions::Core if ::Legion::Extensions.const_defined?(:Core, false)
|
|
15
|
+
extend Legion::Logging::Helper if defined?(Legion::Logging::Helper)
|
|
15
16
|
|
|
16
17
|
PROVIDER_FAMILY = :gemini
|
|
17
18
|
|