lex-gemini 0.1.3 → 0.1.4

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: f14c38ec6ddccebe1155a80eeb18a6c94425ceff69892f030fc5decb58f2a0dd
4
- data.tar.gz: 036d065ce267fa459982774f41ca10c62b7a4f9878c03882c5059c65a47db55b
3
+ metadata.gz: d421ebaa8ddf2e878fadb96843748b4a24b010198c6d65a182159ae156f60789
4
+ data.tar.gz: 573516ccc11f3ef6daeebee65cbc1c910f58e1f879c26474500a185bad190bb5
5
5
  SHA512:
6
- metadata.gz: 8c6350fd770335e2dc4bacd86bb554bbf52bf881525653a06d6261709d8c54fdc28e4a9f6cab5177843ec7c0dd9a88cb8a39bd13274266c9814cb5c4035359fd
7
- data.tar.gz: 0fbfb97ccd6fb92824bf1e278b7e34f1946a0603ba4e3f838d8b47e06d5d80531b3b5fda16d074332ef0434d07f7432eff06355a79694d9b25cd6713bebbf78a
6
+ metadata.gz: be475106b4bce2d0f7b49b5d4518cf1cc37d5b0cdf7f320b9ce789e5a2805f75a4dc30dd02aa21e0383d1a55958c20881956a34a4fe91b080b6e251153a41c49
7
+ data.tar.gz: a612c3b7451965e3b85a5216068740ee7fcf781ec91b51e73e62fdfa1cb7e74d9e79cf0211abb88b94f78d500eb1a14e056040dbeb6930687f274d7bea53a062
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.1.4] - 2026-03-31
4
+
5
+ ### Added
6
+ - `Helpers::Usage` module with `extract_usage` helper that parses `usageMetadata` from Gemini API responses
7
+ - All runner methods now return a `usage:` key with `input_tokens`, `output_tokens`, `cache_read_tokens`, and `cache_write_tokens`
8
+ - Usage specs for all runners and the new `Helpers::Usage` module (80 examples total, up from 36)
9
+
3
10
  ## [0.1.3] - 2026-03-30
4
11
 
5
12
  ### Changed
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Legion
4
+ module Extensions
5
+ module Gemini
6
+ module Helpers
7
+ module Usage
8
+ def extract_usage(body)
9
+ return zero_usage unless body.is_a?(Hash)
10
+
11
+ {
12
+ input_tokens: body.dig('usageMetadata', 'promptTokenCount') || 0,
13
+ output_tokens: body.dig('usageMetadata', 'candidatesTokenCount') || 0,
14
+ cache_read_tokens: body.dig('usageMetadata', 'cachedContentTokenCount') || 0,
15
+ cache_write_tokens: 0
16
+ }
17
+ end
18
+
19
+ private
20
+
21
+ def zero_usage
22
+ { input_tokens: 0, output_tokens: 0, cache_read_tokens: 0, cache_write_tokens: 0 }
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -6,31 +6,37 @@ module Legion
6
6
  module Runners
7
7
  module CachedContents
8
8
  include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
9
+ include Helpers::Usage
9
10
 
10
11
  def create(api_key:, model:, contents:, ttl: nil, expire_time: nil, display_name: nil, system_instruction: nil, **)
11
12
  client = Helpers::Client.new(api_key: api_key)
12
- { result: client.create_cached_content(model: model, contents: contents, ttl: ttl, expire_time: expire_time,
13
- display_name: display_name, system_instruction: system_instruction) }
13
+ body = client.create_cached_content(model: model, contents: contents, ttl: ttl, expire_time: expire_time,
14
+ display_name: display_name, system_instruction: system_instruction)
15
+ { result: body, usage: extract_usage(body) }
14
16
  end
15
17
 
16
18
  def list(api_key:, page_size: nil, page_token: nil, **)
17
19
  client = Helpers::Client.new(api_key: api_key)
18
- { result: client.list_cached_contents(page_size: page_size, page_token: page_token) }
20
+ body = client.list_cached_contents(page_size: page_size, page_token: page_token)
21
+ { result: body, usage: extract_usage(body) }
19
22
  end
20
23
 
21
24
  def get(api_key:, name:, **)
22
25
  client = Helpers::Client.new(api_key: api_key)
23
- { result: client.get_cached_content(name: name) }
26
+ body = client.get_cached_content(name: name)
27
+ { result: body, usage: extract_usage(body) }
24
28
  end
25
29
 
26
30
  def update(api_key:, name:, ttl: nil, expire_time: nil, **)
27
31
  client = Helpers::Client.new(api_key: api_key)
28
- { result: client.update_cached_content(name: name, ttl: ttl, expire_time: expire_time) }
32
+ body = client.update_cached_content(name: name, ttl: ttl, expire_time: expire_time)
33
+ { result: body, usage: extract_usage(body) }
29
34
  end
30
35
 
31
36
  def delete(api_key:, name:, **)
32
37
  client = Helpers::Client.new(api_key: api_key)
33
- { result: client.delete_cached_content(name: name) }
38
+ body = client.delete_cached_content(name: name)
39
+ { result: body, usage: extract_usage(body) }
34
40
  end
35
41
  end
36
42
  end
@@ -6,20 +6,23 @@ module Legion
6
6
  module Runners
7
7
  module Content
8
8
  include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
9
+ include Helpers::Usage
9
10
 
10
11
  def generate(api_key:, contents:, model: 'gemini-2.0-flash', generation_config: nil, safety_settings: nil,
11
12
  system_instruction: nil, **)
12
13
  client = Helpers::Client.new(api_key: api_key, model: model)
13
- { result: client.generate_content(contents: contents, generation_config: generation_config,
14
- safety_settings: safety_settings, system_instruction: system_instruction) }
14
+ body = client.generate_content(contents: contents, generation_config: generation_config,
15
+ safety_settings: safety_settings, system_instruction: system_instruction)
16
+ { result: body, usage: extract_usage(body) }
15
17
  end
16
18
 
17
19
  def stream_generate(api_key:, contents:, model: 'gemini-2.0-flash', generation_config: nil, safety_settings: nil,
18
20
  system_instruction: nil, **)
19
21
  client = Helpers::Client.new(api_key: api_key, model: model)
20
- { result: client.stream_generate_content(contents: contents, generation_config: generation_config,
21
- safety_settings: safety_settings,
22
- system_instruction: system_instruction) }
22
+ body = client.stream_generate_content(contents: contents, generation_config: generation_config,
23
+ safety_settings: safety_settings,
24
+ system_instruction: system_instruction)
25
+ { result: body, usage: extract_usage(body) }
23
26
  end
24
27
  end
25
28
  end
@@ -6,15 +6,18 @@ module Legion
6
6
  module Runners
7
7
  module Embeddings
8
8
  include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
9
+ include Helpers::Usage
9
10
 
10
11
  def embed(api_key:, content:, model: 'gemini-embedding-exp', task_type: nil, title: nil, **)
11
12
  client = Helpers::Client.new(api_key: api_key, model: model)
12
- { result: client.embed_content(content: content, task_type: task_type, title: title) }
13
+ body = client.embed_content(content: content, task_type: task_type, title: title)
14
+ { result: body, usage: extract_usage(body) }
13
15
  end
14
16
 
15
17
  def batch_embed(api_key:, requests:, model: 'gemini-embedding-exp', **)
16
18
  client = Helpers::Client.new(api_key: api_key, model: model)
17
- { result: client.batch_embed_contents(requests: requests) }
19
+ body = client.batch_embed_contents(requests: requests)
20
+ { result: body, usage: extract_usage(body) }
18
21
  end
19
22
  end
20
23
  end
@@ -6,25 +6,30 @@ module Legion
6
6
  module Runners
7
7
  module Files
8
8
  include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
9
+ include Helpers::Usage
9
10
 
10
11
  def upload(api_key:, file_path:, mime_type:, display_name: nil, **)
11
12
  client = Helpers::Client.new(api_key: api_key)
12
- { result: client.upload_file(file_path: file_path, mime_type: mime_type, display_name: display_name) }
13
+ body = client.upload_file(file_path: file_path, mime_type: mime_type, display_name: display_name)
14
+ { result: body, usage: extract_usage(body) }
13
15
  end
14
16
 
15
17
  def list(api_key:, page_size: nil, page_token: nil, **)
16
18
  client = Helpers::Client.new(api_key: api_key)
17
- { result: client.list_files(page_size: page_size, page_token: page_token) }
19
+ body = client.list_files(page_size: page_size, page_token: page_token)
20
+ { result: body, usage: extract_usage(body) }
18
21
  end
19
22
 
20
23
  def get(api_key:, name:, **)
21
24
  client = Helpers::Client.new(api_key: api_key)
22
- { result: client.get_file(name: name) }
25
+ body = client.get_file(name: name)
26
+ { result: body, usage: extract_usage(body) }
23
27
  end
24
28
 
25
29
  def delete(api_key:, name:, **)
26
30
  client = Helpers::Client.new(api_key: api_key)
27
- { result: client.delete_file(name: name) }
31
+ body = client.delete_file(name: name)
32
+ { result: body, usage: extract_usage(body) }
28
33
  end
29
34
  end
30
35
  end
@@ -6,15 +6,18 @@ module Legion
6
6
  module Runners
7
7
  module Models
8
8
  include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
9
+ include Helpers::Usage
9
10
 
10
11
  def list(api_key:, **)
11
12
  client = Helpers::Client.new(api_key: api_key)
12
- { result: client.list_models }
13
+ body = client.list_models
14
+ { result: body, usage: extract_usage(body) }
13
15
  end
14
16
 
15
17
  def get(api_key:, name:, **)
16
18
  client = Helpers::Client.new(api_key: api_key)
17
- { result: client.get_model(name: name) }
19
+ body = client.get_model(name: name)
20
+ { result: body, usage: extract_usage(body) }
18
21
  end
19
22
  end
20
23
  end
@@ -6,10 +6,12 @@ module Legion
6
6
  module Runners
7
7
  module Tokens
8
8
  include Legion::Extensions::Helpers::Lex if defined?(Legion::Extensions::Helpers::Lex)
9
+ include Helpers::Usage
9
10
 
10
11
  def count(api_key:, contents:, model: 'gemini-2.0-flash', **)
11
12
  client = Helpers::Client.new(api_key: api_key, model: model)
12
- { result: client.count_tokens(contents: contents) }
13
+ body = client.count_tokens(contents: contents)
14
+ { result: body, usage: extract_usage(body) }
13
15
  end
14
16
  end
15
17
  end
@@ -3,7 +3,7 @@
3
3
  module Legion
4
4
  module Extensions
5
5
  module Gemini
6
- VERSION = '0.1.3'
6
+ VERSION = '0.1.4'
7
7
  end
8
8
  end
9
9
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'legion/extensions/gemini/version'
4
4
  require 'legion/extensions/gemini/helpers/client'
5
+ require 'legion/extensions/gemini/helpers/usage'
5
6
  require 'legion/extensions/gemini/runners/content'
6
7
  require 'legion/extensions/gemini/runners/embeddings'
7
8
  require 'legion/extensions/gemini/runners/models'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lex-gemini
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity
@@ -143,6 +143,7 @@ files:
143
143
  - lex-gemini.gemspec
144
144
  - lib/legion/extensions/gemini.rb
145
145
  - lib/legion/extensions/gemini/helpers/client.rb
146
+ - lib/legion/extensions/gemini/helpers/usage.rb
146
147
  - lib/legion/extensions/gemini/runners/cached_contents.rb
147
148
  - lib/legion/extensions/gemini/runners/content.rb
148
149
  - lib/legion/extensions/gemini/runners/embeddings.rb