Module: TokenHawk

Defined in:
lib/token_hawk.rb,
lib/token_hawk/cli.rb,
lib/token_hawk/call.rb,
lib/token_hawk/cost.rb,
lib/token_hawk/engine.rb,
lib/token_hawk/pricing.rb,
lib/token_hawk/version.rb,
lib/token_hawk/call_record.rb,
lib/token_hawk/domain_query.rb,
lib/token_hawk/recent_query.rb,
lib/token_hawk/adapters/base.rb,
lib/token_hawk/cli/formatter.rb,
lib/token_hawk/configuration.rb,
lib/token_hawk/storage/memory.rb,
lib/token_hawk/dashboard_query.rb,
lib/token_hawk/response_adapter.rb,
lib/token_hawk/cli/commands/costs.rb,
lib/token_hawk/cli/commands/recent.rb,
lib/token_hawk/storage/active_record.rb,
lib/token_hawk/cli/commands/efficiency.rb,
app/controllers/token_hawk/recent_controller.rb,
app/controllers/token_hawk/domains_controller.rb,
app/controllers/token_hawk/pricing_controller.rb,
app/controllers/token_hawk/dashboard_controller.rb,
app/controllers/token_hawk/application_controller.rb,
lib/generators/token_hawk/install/install_generator.rb,
sig/token_hawk.rbs

Defined Under Namespace

Modules: Adapters, Cost, Generators, Pricing, Storage Classes: ApplicationController, CLI, Call, CallRecord, Configuration, DashboardController, DashboardQuery, DomainQuery, DomainsController, Engine, Error, PricingController, RecentController, RecentQuery, ResponseAdapter

Constant Summary collapse

VERSION =

Returns:

  • (String)
"0.1.1"

Class Method Summary collapse

Class Method Details

.clear_subscribers ⇒ Object



40
41
42
# File 'lib/token_hawk.rb', line 40

def self.clear_subscribers
  @subscribers.clear
end

.configuration ⇒ Object



24
25
26
# File 'lib/token_hawk.rb', line 24

def self.configuration
  @configuration
end

.configure {|@configuration| ... } ⇒ Object

Yields:



28
29
30
# File 'lib/token_hawk.rb', line 28

def self.configure
  yield @configuration
end

.record(domain:, model:, input_tokens:, output_tokens:, latency_ms:, tags: {}) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/token_hawk.rb', line 58

def self.record(domain:, model:, input_tokens:, output_tokens:, latency_ms:, tags: {})
  call = Call.new(
    domain: domain.to_sym,
    tags: tags,
    vendor: Pricing.vendor_for_model(model.to_s),
    model: model.to_s,
    input_tokens: input_tokens.to_i,
    output_tokens: output_tokens.to_i,
    total_cost_cents: Cost.calculate(model: model.to_s, input_tokens: input_tokens.to_i, output_tokens: output_tokens.to_i),
    latency_ms: latency_ms.to_i,
    created_at: Time.now
  )

  storage_backend.record(call)

  @subscribers[:call_recorded].each do |subscriber|
    subscriber.call(call)
  rescue => e
    configuration.failure_logger.call("[TokenHawk] Subscriber error: #{e.message}") if configuration.log_failures
  end
rescue => e
  configuration.failure_logger.call("[TokenHawk] Failed to record telemetry: #{e.message}") if configuration.log_failures
end

.reset_configuration! ⇒ Object



32
33
34
# File 'lib/token_hawk.rb', line 32

def self.reset_configuration!
  @configuration = Configuration.new
end

.subscribe(event, &block) ⇒ Object



36
37
38
# File 'lib/token_hawk.rb', line 36

def self.subscribe(event, &block)
  @subscribers[event] << block
end

.track(domain:, tags: {}) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/token_hawk.rb', line 44

def self.track(domain:, tags: {})
  start_time = Time.now
  response = yield
  elapsed_ms = ((Time.now - start_time) * 1000).round

  begin
    record_call(domain: domain, tags: tags, response: response, elapsed_ms: elapsed_ms)
  rescue => e
    configuration.failure_logger.call("[TokenHawk] Failed to record telemetry: #{e.message}") if configuration.log_failures
  end

  response
end