tokenr-ruby 0.1.0 → 0.1.3

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: ce5be4fe9dded47d914a3e7e348b86b807d90a53b75d2e875c7a63e24d52344b
4
- data.tar.gz: 8b36455f2b65965afd9b304e88c467117b0e3d14abbdf3e3e05449ec34092a69
3
+ metadata.gz: 15ea6965561601d93515ffdf3448f286976ad610bcb2374f225d30404fa6d008
4
+ data.tar.gz: d4e501b932db24625348ed27c82003e702dcf4e05ec32664e7bd1255eb13ac43
5
5
  SHA512:
6
- metadata.gz: aeec3f6ee5c391a14f503c666989cd14bb62e1693dcd320a2b695a9f0fbed01c73107909f60a88b4191ce6421308cc375b1ed295e7095e4a8f3f8b3829bcf158
7
- data.tar.gz: bc7c5d3133f07e146020eb3946a96956563003a068746296537259ba2361e769aab4bb8b39efeb92f601c6c0278c43155a86599846119770c09feba88e1bcf60
6
+ metadata.gz: 255f3b2269c15a41ad3e29c3f302dd79a2498e4098351afa8827db98cc8dde58d75b0acc625e899af24d68ce2bd892a2128e8471f8ac599b6a8aad2fe5555e2f
7
+ data.tar.gz: 9f46b51a1e802659dd855474f4fa1c67cbfc8a320560d16130c6ba6e87bb8c8ae84f62f635b8035c5454fbbcbaa2e0d83e8e44d9c4fa8393f9956a0e13588349
data/lib/tokenr/client.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "net/http"
4
4
  require "json"
5
+ require "openssl"
5
6
  require "uri"
6
7
 
7
8
  module Tokenr
@@ -66,9 +67,17 @@ module Tokenr
66
67
  def request(method, path, body = nil, params = {})
67
68
  uri = build_uri(path, params)
68
69
  http = Net::HTTP.new(uri.host, uri.port)
69
- http.use_ssl = uri.scheme == "https"
70
- http.open_timeout = 5
71
- http.read_timeout = 30
70
+ http.use_ssl = uri.scheme == "https"
71
+ http.open_timeout = 5
72
+ http.read_timeout = 30
73
+ if http.use_ssl?
74
+ # Use VERIFY_PEER with an explicit cert store that has no CRL check flags.
75
+ # This keeps certificate chain validation while avoiding CRL fetch failures
76
+ # on servers whose CA certificates have CRL distribution points that are
77
+ # unreachable or return errors.
78
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
79
+ http.cert_store = OpenSSL::X509::Store.new.tap(&:set_default_paths)
80
+ end
72
81
 
73
82
  req = build_request(method, uri, body)
74
83
  handle_response(http.request(req))
@@ -39,7 +39,7 @@ module Tokenr
39
39
 
40
40
  def messages(model:, messages:, **params)
41
41
  start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
42
- response = client.messages(model: model, messages: messages, **params)
42
+ response = client.messages.create(model: model, messages: messages, **params)
43
43
  latency = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - start) * 1000).round
44
44
 
45
45
  track_response(model, response, latency)
@@ -34,33 +34,39 @@ module Tokenr
34
34
  end
35
35
 
36
36
  def chat(parameters:)
37
- timed { client.chat(parameters: parameters) } do |response, latency_ms|
38
- track_chat_response(parameters[:model], response, latency_ms)
39
- end
37
+ start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
38
+ response = client.chat(parameters: parameters)
39
+ latency = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - start) * 1000).round
40
+ track_chat_response(parameters[:model], response, latency)
41
+ response
40
42
  end
41
43
 
42
44
  def completions(parameters:)
43
- timed { client.completions(parameters: parameters) } do |response, latency_ms|
44
- track_chat_response(parameters[:model], response, latency_ms)
45
- end
45
+ start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
46
+ response = client.completions(parameters: parameters)
47
+ latency = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - start) * 1000).round
48
+ track_chat_response(parameters[:model], response, latency)
49
+ response
46
50
  end
47
51
 
48
52
  def embeddings(parameters:)
49
- timed { client.embeddings(parameters: parameters) } do |response, latency_ms|
50
- usage = response.dig("usage")
51
- next unless usage
52
-
53
+ start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
54
+ response = client.embeddings(parameters: parameters)
55
+ latency = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - start) * 1000).round
56
+ usage = response.dig("usage")
57
+ if usage
53
58
  Tokenr.track(
54
- model: parameters[:model],
55
- provider: "openai",
56
- input_tokens: usage["prompt_tokens"] || 0,
59
+ model: parameters[:model],
60
+ provider: "openai",
61
+ input_tokens: usage["prompt_tokens"] || 0,
57
62
  output_tokens: 0,
58
- latency_ms: latency_ms,
59
- agent_id: agent_id,
60
- feature_name: feature_name,
61
- tags: tags
63
+ latency_ms: latency,
64
+ agent_id: agent_id,
65
+ feature_name: feature_name,
66
+ tags: tags
62
67
  )
63
68
  end
69
+ response
64
70
  end
65
71
 
66
72
  # Pass any other methods straight through to the underlying client.
@@ -74,14 +80,6 @@ module Tokenr
74
80
 
75
81
  private
76
82
 
77
- def timed
78
- start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
79
- response = yield
80
- latency = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - start) * 1000).round
81
- yield response, latency if block_given?
82
- response
83
- end
84
-
85
83
  def track_chat_response(model, response, latency_ms)
86
84
  usage = response.dig("usage")
87
85
  return unless usage
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tokenr
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.3"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tokenr-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tokenr
@@ -50,7 +50,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
50
50
  - !ruby/object:Gem::Version
51
51
  version: '0'
52
52
  requirements: []
53
- rubygems_version: 3.6.9
53
+ rubygems_version: 4.0.6
54
54
  specification_version: 4
55
55
  summary: Automatic LLM cost tracking for OpenAI, Anthropic, and more
56
56
  test_files: []