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) ⇒ Object
- #parse_stream(request_url, _request_body, response_status, events) ⇒ Object
- #provider_names ⇒ Object
- #streaming_request?(request_url, request_body) ⇒ Boolean
Instance Method Details
#match?(url) ⇒ Boolean
14 15 16 17 18 19 |
# File 'lib/llm_cost_tracker/parsers/gemini.rb', line 14 def match?(url) uri = URI.parse(url.to_s) HOSTS.include?(uri.host.to_s.downcase) && uri.path.match?(TRACKED_PATH_PATTERN) rescue URI::InvalidURIError false end |
#parse(request_url, _request_body, response_status, response_body) ⇒ Object
31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/llm_cost_tracker/parsers/gemini.rb', line 31 def parse(request_url, _request_body, response_status, response_body) return nil unless response_status == 200 response = safe_json_parse(response_body) usage = response["usageMetadata"] return nil unless usage build_parsed_usage( request_url, usage, usage_source: :response, provider_response_id: response["responseId"] ) end |
#parse_stream(request_url, _request_body, response_status, events) ⇒ Object
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/llm_cost_tracker/parsers/gemini.rb', line 46 def parse_stream(request_url, _request_body, response_status, events) return nil unless response_status == 200 usage = merged_stream_usage(events) model = extract_model_from_url(request_url) if usage build_parsed_usage( request_url, usage, stream: true, usage_source: :stream_final, provider_response_id: stream_response_id(events) ) else ParsedUsage.build( provider: "gemini", provider_response_id: stream_response_id(events), model: model, input_tokens: 0, output_tokens: 0, total_tokens: 0, stream: true, usage_source: :unknown ) end end |
#provider_names ⇒ Object
21 22 23 |
# File 'lib/llm_cost_tracker/parsers/gemini.rb', line 21 def provider_names %w[gemini] end |
#streaming_request?(request_url, request_body) ⇒ Boolean
25 26 27 28 29 |
# File 'lib/llm_cost_tracker/parsers/gemini.rb', line 25 def streaming_request?(request_url, request_body) return true if streaming_url?(request_url) super end |