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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dfe3fa2fee00d45f7908b00a559606ad3d64b7b7de557da8dec385e7e0e07ada
4
- data.tar.gz: d03f2f8fde3f41aa6273743b738122ee1ea22c03e4a165308526ddd00919ce3d
3
+ metadata.gz: 3b4d2bbf521fe7cd5757553aff5a6d61c1a9e9ffbe18c683058710ab19a8a6ff
4
+ data.tar.gz: 98d0db7b428b68d0543682c43a27d77fde00aee8bb02377195c37224e9429fef
5
5
  SHA512:
6
- metadata.gz: 9d25e055451f57d145b12389d89bc92d4010236151aae33450396d738d959dfcb6950e5f80f39388a02870a71fb16e881164654b8c204be7165da8b22bb58816
7
- data.tar.gz: 35144cf3d1e3ccab244650ce8e7b0d4f929eb94c663db4be9fe5930520f31e789084f8962331653c70c0c2fff6f159bdc1293ebf13519cb8a3c7cbed73325444
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
- - 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
- - shared fleet/default settings via `Legion::Extensions::Llm.provider_settings`
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
- log_publish_failure(e, level: :debug)
35
+ handle_exception(e, level: :debug, handled: true, operation: 'gemini.registry.schedule_thread')
33
36
  end
34
37
  rescue StandardError => e
35
- log_publish_failure(e, level: :debug)
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
- log_publish_failure(e)
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
@@ -4,7 +4,7 @@ module Legion
4
4
  module Extensions
5
5
  module Llm
6
6
  module Gemini
7
- VERSION = '0.1.6'
7
+ VERSION = '0.1.7'
8
8
  end
9
9
  end
10
10
  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
 
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.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - LegionIO