lex-llm-ledger 0.1.11 → 0.1.12

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: 95df124106575b40d9e7bd4534782f90433c3f8bb12cd3473ca61b359f9f22ad
4
- data.tar.gz: f8ac1dbc0227c6c1b231406db8e11270ea846bb8a25c1f9a2c70c05dc51631ce
3
+ metadata.gz: c2578f6543e89f6517dd169b738f11ef3c0a8e3793ff53db790e57856be4c3be
4
+ data.tar.gz: 066ad9113ab48db944c88cc9d6eb9bf182ed54e236e2d4da6f3a0c67bd0cb6af
5
5
  SHA512:
6
- metadata.gz: e6af8de42045313fee0582ee1ee58dbdcdc0d9e9cfa85d5af94c9ca87ae6358a2a5e019aa035e588cf9d8ea1c883b9635ffb09c55bb9bcf90414eda7a7d60de2
7
- data.tar.gz: 13bcf5ba5f6e0d64254e04e523758fd85f5f050a316b497013769eefde91877d995b8361f18bde8270f8f4b04b037cc6f988455bbcc33148f89c564a7bded585
6
+ metadata.gz: 66a82c200a5065aa1940f46a88d1ec362d6e33b2d0ad0de03f24e8676deaa50bd05feef840cd56ca3b111c5ddec4a8008cf728ac137471e946bdbbea046cc27e
7
+ data.tar.gz: a11134e1bd78a4bcca41494e1fc1b119c56be21525ab180c92332cce0ea4f457f51b5c4ac092b40f6f88a63f058dd3857b72598daa51c9cc14abb31daf3c2f32
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.1.12] - 2026-04-28
4
+
5
+ ### Added
6
+ - Persist provider-neutral `llm.registry` availability event envelopes for offering, worker, lane, model, runtime, capacity, and health diagnostics
7
+ - Add ledger-owned passive `llm.registry` transport exchange, durable registry availability queue, and subscription actor
8
+
3
9
  ## [0.1.11] - 2026-04-28
4
10
 
5
11
  ### Fixed
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/actors/subscription'
4
+ require_relative '../helpers/subscription_message'
5
+
6
+ module Legion
7
+ module Extensions
8
+ module Llm
9
+ module Ledger
10
+ module Actor
11
+ class RegistryAvailabilityWriter < Legion::Extensions::Actors::Subscription
12
+ def runner_class = Legion::Extensions::Llm::Ledger::Runners::RegistryAvailability
13
+
14
+ def runner_function
15
+ 'write_registry_availability_record'
16
+ end
17
+
18
+ def use_runner?
19
+ false
20
+ end
21
+
22
+ def process_message(message, metadata, delivery_info)
23
+ Helpers::SubscriptionMessage.decode_payload(message, metadata, delivery_info)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ Sequel.migration do # rubocop:disable Metrics/BlockLength
4
+ change do
5
+ create_table(:registry_availability_records) do
6
+ primary_key :id
7
+
8
+ String :event_id, null: false, unique: true
9
+ String :message_id
10
+ String :correlation_id
11
+ String :routing_key
12
+ String :event_type, null: false
13
+ String :occurred_at, null: false
14
+ String :offering_id
15
+ String :provider_family
16
+ String :provider_instance
17
+ String :instance_id
18
+ String :model_family
19
+ String :model_id
20
+ String :canonical_model
21
+ String :provider_model
22
+ String :usage_type
23
+ String :transport
24
+ String :lane_key
25
+ String :worker_id
26
+ String :node_id
27
+ String :offering_json, null: false, text: true
28
+ String :runtime_json, null: false, text: true
29
+ String :capacity_json, null: false, text: true
30
+ String :health_json, null: false, text: true
31
+ String :lane_json, null: false, text: true
32
+ String :metadata_json, null: false, text: true
33
+ DateTime :inserted_at, null: false, default: Sequel::CURRENT_TIMESTAMP
34
+
35
+ index [:event_type]
36
+ index [:occurred_at]
37
+ index [:offering_id]
38
+ index [:provider_family]
39
+ index [:provider_instance]
40
+ index %i[provider_family model_id]
41
+ index [:lane_key]
42
+ index [:worker_id]
43
+ index [:node_id]
44
+ index [:inserted_at]
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Llm
6
+ module Ledger
7
+ module Runners
8
+ module RegistryAvailability
9
+ extend self
10
+
11
+ def write_registry_availability_record(payload = nil, metadata = {}, **message)
12
+ payload, metadata = normalize_runner_args(payload, metadata, message)
13
+ props = metadata[:properties] || {}
14
+
15
+ body = symbolize(payload)
16
+ record = build_registry_availability_record(body, props)
17
+ ::Legion::Data::DB[:registry_availability_records].insert(record)
18
+ { result: :ok }
19
+ rescue Sequel::UniqueConstraintViolation => _e
20
+ { result: :duplicate }
21
+ rescue StandardError => e
22
+ Legion::Logging.error("[lex-llm-ledger] write_registry_availability_record failed: #{e.message}") # rubocop:disable Legion/HelperMigration/DirectLogging
23
+ { result: :error, error: e.message }
24
+ end
25
+
26
+ private
27
+
28
+ def normalize_runner_args(payload, metadata, message)
29
+ Helpers::SubscriptionMessage.runner_args(payload, metadata, message)
30
+ end
31
+
32
+ def build_registry_availability_record(body, props)
33
+ offering = body[:offering] || {}
34
+ runtime = body[:runtime] || {}
35
+ lane = body[:lane]
36
+
37
+ {
38
+ event_id: body[:event_id],
39
+ message_id: props[:message_id],
40
+ correlation_id: props[:correlation_id],
41
+ routing_key: props[:routing_key],
42
+ event_type: body[:event_type].to_s,
43
+ occurred_at: body[:occurred_at],
44
+ offering_id: offering[:offering_id],
45
+ provider_family: offering[:provider_family]&.to_s,
46
+ provider_instance: offering[:provider_instance]&.to_s,
47
+ instance_id: offering[:instance_id]&.to_s,
48
+ model_family: offering[:model_family]&.to_s,
49
+ model_id: offering[:model],
50
+ canonical_model: offering[:canonical_model_alias],
51
+ provider_model: offering[:provider_model],
52
+ usage_type: offering[:usage_type]&.to_s,
53
+ transport: offering[:transport]&.to_s,
54
+ lane_key: lane_key(lane),
55
+ worker_id: runtime[:worker_id] || runtime[:worker],
56
+ node_id: runtime[:node_id] || runtime[:host_id],
57
+ offering_json: json_dump(offering),
58
+ runtime_json: json_dump(runtime),
59
+ capacity_json: json_dump(body[:capacity] || {}),
60
+ health_json: json_dump(body[:health] || {}),
61
+ lane_json: json_dump(lane || {}),
62
+ metadata_json: json_dump(body[:metadata] || {}),
63
+ inserted_at: Time.now.utc
64
+ }
65
+ end
66
+
67
+ def lane_key(lane)
68
+ if lane.is_a?(String)
69
+ lane
70
+ elsif lane.is_a?(Hash)
71
+ lane[:key] || lane[:lane_key]
72
+ end
73
+ end
74
+
75
+ def json_dump(value)
76
+ Legion::JSON.dump(json_safe(value)) # rubocop:disable Legion/HelperMigration/DirectJson
77
+ end
78
+
79
+ def json_safe(value)
80
+ case value
81
+ when Hash
82
+ value.to_h { |key, nested| [key.to_s, json_safe(nested)] }
83
+ when Array
84
+ value.map { |nested| json_safe(nested) }
85
+ when Symbol
86
+ value.to_s
87
+ else
88
+ value
89
+ end
90
+ end
91
+
92
+ def symbolize(value)
93
+ case value
94
+ when Hash
95
+ value.to_h { |key, nested| [key.to_sym, symbolize(nested)] }
96
+ when Array
97
+ value.map { |nested| symbolize(nested) }
98
+ else
99
+ value
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Llm
6
+ module Ledger
7
+ module Transport
8
+ module Exchanges
9
+ class Registry < ::Legion::Transport::Exchange
10
+ def exchange_name
11
+ 'llm.registry'
12
+ end
13
+
14
+ def default_type
15
+ 'topic'
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Llm
6
+ module Ledger
7
+ module Transport
8
+ module Queues
9
+ class RegistryAvailability < Legion::Transport::Queue
10
+ def queue_name
11
+ 'llm.registry.availability'
12
+ end
13
+
14
+ def queue_options
15
+ { durable: true }
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -3,6 +3,7 @@
3
3
  require 'legion/extensions/transport'
4
4
  require_relative 'exchanges/metering'
5
5
  require_relative 'exchanges/audit'
6
+ require_relative 'exchanges/registry'
6
7
 
7
8
  module Legion
8
9
  module Extensions
@@ -27,6 +28,11 @@ module Legion
27
28
  from: Legion::Extensions::Llm::Ledger::Transport::Exchanges::Audit,
28
29
  to: Legion::Extensions::Llm::Ledger::Transport::Queues::AuditTools,
29
30
  routing_key: 'audit.tool.#'
31
+ },
32
+ {
33
+ from: Legion::Extensions::Llm::Ledger::Transport::Exchanges::Registry,
34
+ to: Legion::Extensions::Llm::Ledger::Transport::Queues::RegistryAvailability,
35
+ routing_key: '#'
30
36
  }
31
37
  ]
32
38
  end
@@ -4,7 +4,7 @@ module Legion
4
4
  module Extensions
5
5
  module Llm
6
6
  module Ledger
7
- VERSION = '0.1.11'
7
+ VERSION = '0.1.12'
8
8
  end
9
9
  end
10
10
  end
@@ -10,17 +10,21 @@ require_relative 'ledger/runners/prompts'
10
10
  require_relative 'ledger/runners/tools'
11
11
  require_relative 'ledger/runners/usage_reporter'
12
12
  require_relative 'ledger/runners/provider_stats'
13
+ require_relative 'ledger/runners/registry_availability'
13
14
 
14
15
  if Legion::Extensions.const_defined?(:Core, false)
15
16
  require_relative 'ledger/transport/exchanges/metering'
16
17
  require_relative 'ledger/transport/exchanges/audit'
18
+ require_relative 'ledger/transport/exchanges/registry'
17
19
  require_relative 'ledger/transport/queues/metering_write'
18
20
  require_relative 'ledger/transport/queues/audit_prompts'
19
21
  require_relative 'ledger/transport/queues/audit_tools'
22
+ require_relative 'ledger/transport/queues/registry_availability'
20
23
  require_relative 'ledger/transport/transport'
21
24
  require_relative 'ledger/actors/metering_writer'
22
25
  require_relative 'ledger/actors/prompt_writer'
23
26
  require_relative 'ledger/actors/tool_writer'
27
+ require_relative 'ledger/actors/registry_availability_writer'
24
28
  require_relative 'ledger/actors/spool_flush'
25
29
  end
26
30
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-llm-ledger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
@@ -193,6 +193,7 @@ files:
193
193
  - lib/legion/extensions/llm/ledger.rb
194
194
  - lib/legion/extensions/llm/ledger/actors/metering_writer.rb
195
195
  - lib/legion/extensions/llm/ledger/actors/prompt_writer.rb
196
+ - lib/legion/extensions/llm/ledger/actors/registry_availability_writer.rb
196
197
  - lib/legion/extensions/llm/ledger/actors/spool_flush.rb
197
198
  - lib/legion/extensions/llm/ledger/actors/tool_writer.rb
198
199
  - lib/legion/extensions/llm/ledger/helpers/decryption.rb
@@ -202,16 +203,20 @@ files:
202
203
  - lib/legion/extensions/llm/ledger/migrations/001_create_metering_records.rb
203
204
  - lib/legion/extensions/llm/ledger/migrations/002_create_prompt_records.rb
204
205
  - lib/legion/extensions/llm/ledger/migrations/003_create_tool_records.rb
206
+ - lib/legion/extensions/llm/ledger/migrations/004_create_registry_availability_records.rb
205
207
  - lib/legion/extensions/llm/ledger/runners/metering.rb
206
208
  - lib/legion/extensions/llm/ledger/runners/prompts.rb
207
209
  - lib/legion/extensions/llm/ledger/runners/provider_stats.rb
210
+ - lib/legion/extensions/llm/ledger/runners/registry_availability.rb
208
211
  - lib/legion/extensions/llm/ledger/runners/tools.rb
209
212
  - lib/legion/extensions/llm/ledger/runners/usage_reporter.rb
210
213
  - lib/legion/extensions/llm/ledger/transport/exchanges/audit.rb
211
214
  - lib/legion/extensions/llm/ledger/transport/exchanges/metering.rb
215
+ - lib/legion/extensions/llm/ledger/transport/exchanges/registry.rb
212
216
  - lib/legion/extensions/llm/ledger/transport/queues/audit_prompts.rb
213
217
  - lib/legion/extensions/llm/ledger/transport/queues/audit_tools.rb
214
218
  - lib/legion/extensions/llm/ledger/transport/queues/metering_write.rb
219
+ - lib/legion/extensions/llm/ledger/transport/queues/registry_availability.rb
215
220
  - lib/legion/extensions/llm/ledger/transport/transport.rb
216
221
  - lib/legion/extensions/llm/ledger/version.rb
217
222
  - lib/lex-llm-ledger.rb