ask-core 0.2.3 → 0.2.5

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: e87a2c3690127974ace8b8143002728a1eb6bebbaae9d54b321c5f4342c20485
4
- data.tar.gz: 605fb219de7a80fcf33a97b21a9a2149f688e7bdd25a066484f235e41e127420
3
+ metadata.gz: 27b1acea84966d56137426aa88ddc1cda8f61dd277a37c9c9961f79540c156f2
4
+ data.tar.gz: 5096b62044dd0110ba21e59642a2af4d2ce149cf7a3e24bf6235cbe025f9412d
5
5
  SHA512:
6
- metadata.gz: 1b8852000559343d48f693bb80cda7b7bc4ed9ecf935fc3e2336c80798277a35e31e4dd37a8453ae9d69adbc88a3e80650f26b6eaf64fa7d757f0711301106c1
7
- data.tar.gz: 8713f24a5530fbc86f347016e3eb811e4e2ddb14cf5d08368bf6f8d28ffa3aa5c32127a91c75923146ffc3e940295a6edff2bab4c2df7838f50bd207e7dc3232
6
+ metadata.gz: 5d92e48754c546c5904f3fec07d398569dadf4c8d70ba8068a098e3e9d2ee363133f5466c08e50402325054241df2b815cf4d53435bca121f6941a92eb20a6d7
7
+ data.tar.gz: 00752dace3a9a4d017e0af32c8caaf0cbbd2e57af89b9cd797e54a275458ef6e30be7c255c5bc3d39eef7bb0089b67243e40ae0327cce1cfa981034827e3470d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## [0.2.4] — 2026-07-17
2
+
3
+ ### Added
4
+
5
+ - **Rich error categories** — `RateLimitError` now carries `category` (`RateLimitCategory::VENDOR` or `::LOCAL`), `rate_limit_type` (`RateLimitType::REQUESTS`, `::TOKENS`, `::CONCURRENT`, `::BUDGET`), and `retry_after` (seconds) for intelligent error handling. Inspired by LiteLLM's error hierarchy.
6
+
1
7
  ## [0.2.3] — 2026-07-14
2
8
 
3
9
  ### Changed
data/lib/ask/errors.rb CHANGED
@@ -28,9 +28,6 @@ module Ask
28
28
  # Raised when the context window is exceeded.
29
29
  class ContextLengthExceeded < Error; end
30
30
 
31
- # Raised when the API rate limit is hit.
32
- class RateLimitError < Error; end
33
-
34
31
  # Raised when authentication fails.
35
32
  class Unauthorized < Error; end
36
33
 
@@ -40,11 +37,41 @@ module Ask
40
37
  # Raised when the service is unavailable.
41
38
  class ServiceUnavailable < Error; end
42
39
 
40
+ # Categories for {RateLimitError} — tells you who rate-limited the request.
41
+ module RateLimitCategory
42
+ VENDOR = :vendor # upstream LLM provider (OpenAI, Anthropic, etc.)
43
+ LOCAL = :local # ask-rb's own limiter (ask-auth thresholds)
44
+ end
45
+
46
+ # Rate limit dimension that was exceeded — orthogonal to {RateLimitCategory}.
47
+ module RateLimitType
48
+ REQUESTS = :requests # requests-per-minute ceiling
49
+ TOKENS = :tokens # tokens-per-minute ceiling
50
+ CONCURRENT = :concurrent # max parallel requests
51
+ BUDGET = :budget # spend budget cap
52
+ end
53
+
54
+ # Raised when the API rate limit is hit.
55
+ # Carries optional category, type, and retry_after for intelligent handling.
56
+ class RateLimitError < Error
57
+ # @return [Symbol, nil] who rate-limited (:vendor, :local)
58
+ attr_reader :category
59
+
60
+ # @return [Symbol, nil] which limit was hit (:requests, :tokens, :concurrent, :budget)
61
+ attr_reader :rate_limit_type
62
+
63
+ # @return [Integer, Float, nil] suggested seconds to wait before retrying
64
+ attr_reader :retry_after
65
+
66
+ def initialize(message, category: nil, rate_limit_type: nil, retry_after: nil)
67
+ @category = category
68
+ @rate_limit_type = rate_limit_type
69
+ @retry_after = retry_after
70
+ super(message)
71
+ end
72
+ end
73
+
43
74
  # Raised when a provider's API returns an unexpected response.
44
- # @!attribute [r] status_code
45
- # @return [Integer, nil] the HTTP status code
46
- # @!attribute [r] response_body
47
- # @return [String, nil] the raw response body
48
75
  class ProviderError < Error
49
76
  attr_reader :status_code, :response_body
50
77
 
data/lib/ask/provider.rb CHANGED
@@ -93,9 +93,6 @@ module Ask
93
93
  # @return [Boolean] true if the provider requires a remote API
94
94
  def remote? = !local?
95
95
 
96
- # @return [Boolean] true if all models can be assumed to exist
97
- def assume_models_exist? = self.class.assume_models_exist?
98
-
99
96
  # --- Slug / name / capabilities ---
100
97
 
101
98
  # @return [String] lowercased provider slug
@@ -199,10 +196,7 @@ module Ask
199
196
  !local?
200
197
  end
201
198
 
202
- # @return [Boolean] whether all models can be assumed to exist
203
- def assume_models_exist?
204
- false
205
- end
199
+
206
200
 
207
201
  private
208
202
 
data/lib/ask/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ask
4
- VERSION = "0.2.3"
4
+ VERSION = "0.2.5"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ask-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kaka Ruto