Class: LlmCostTracker::Parsers::Gemini
- Defined in:
- lib/llm_cost_tracker/parsers/gemini.rb
Constant Summary collapse
- HOSTS =
%w[generativelanguage.googleapis.com].freeze
- TRACKED_PATH_PATTERN =
%r{/models/[^/:]+:(?:generateContent|streamGenerateContent)\z}- STREAM_PATH_PATTERN =
/:streamGenerateContent\z/
Instance Method Summary collapse
- #match?(url) ⇒ Boolean
- #parse(request_url:, request_body:, response_status:, response_body:, response_headers: nil) ⇒ Object
- #parse_stream(response_status:, request_url: nil, request_body: nil, events: [], response_headers: nil) ⇒ Object
- #provider_names ⇒ Object
- #streaming_request?(request_url, request_body) ⇒ Boolean
Instance Method Details
#match?(url) ⇒ Boolean
12 13 14 |
# File 'lib/llm_cost_tracker/parsers/gemini.rb', line 12 def match?(url) match_uri?(url, hosts: HOSTS, path_pattern: TRACKED_PATH_PATTERN) end |
#parse(request_url:, request_body:, response_status:, response_body:, response_headers: nil) ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/llm_cost_tracker/parsers/gemini.rb', line 26 def parse(request_url:, request_body:, response_status:, response_body:, response_headers: nil) return nil unless response_status == 200 response = safe_json_parse(response_body) usage = response["usageMetadata"] return nil unless usage request = safe_json_parse(request_body) build_usage_capture( request_url: request_url, usage: usage, usage_source: :response, provider_response_id: response["responseId"], pricing_mode: pricing_mode(request: request, response_headers: response_headers) ) end |
#parse_stream(response_status:, request_url: nil, request_body: nil, events: [], response_headers: nil) ⇒ Object
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/llm_cost_tracker/parsers/gemini.rb', line 43 def parse_stream(response_status:, request_url: nil, request_body: nil, events: [], response_headers: nil) return nil unless response_status == 200 request = safe_json_parse(request_body) usage = merged_stream_usage(events) model = extract_model_from_url(request_url) response_id = stream_response_id(events) mode = pricing_mode(request: request, response_headers: response_headers) if usage build_usage_capture( request_url: request_url, usage: usage, stream: true, usage_source: :stream_final, provider_response_id: response_id, pricing_mode: mode ) else build_unknown_stream_usage( provider: "gemini", model: model, provider_response_id: response_id, pricing_mode: mode ) end end |
#provider_names ⇒ Object
16 17 18 |
# File 'lib/llm_cost_tracker/parsers/gemini.rb', line 16 def provider_names %w[gemini] end |
#streaming_request?(request_url, request_body) ⇒ Boolean
20 21 22 23 24 |
# File 'lib/llm_cost_tracker/parsers/gemini.rb', line 20 def streaming_request?(request_url, request_body) return true if match_uri?(request_url, path_pattern: STREAM_PATH_PATTERN) super end |