@llm4ts/core 2.31.0 → 2.31.1
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.
- package/dist/UsageLimits.d.ts.map +1 -1
- package/dist/UsageLimits.js +19 -9
- package/dist/UsageLimits.js.map +1 -1
- package/package.json +1 -1
- package/src/UsageLimits.ts +22 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UsageLimits.d.ts","sourceRoot":"","sources":["../src/UsageLimits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAmC,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"UsageLimits.d.ts","sourceRoot":"","sources":["../src/UsageLimits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAmC,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA;AAoD5E,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,OAAmD,CAAA;AA4JhG,eAAO,MAAM,kBAAkB,GAC7B,UAAU,MAAM,EAChB,MAAM,MAAM,EACZ,KAAK,QAAQ,CAAC,GAAG,EACjB,UAAU,MAAM,KACf,QAAQ,GAAG,SA+Db,CAAA"}
|
package/dist/UsageLimits.js
CHANGED
|
@@ -2,7 +2,16 @@ import * as DateTime from "effect/DateTime";
|
|
|
2
2
|
import * as Duration from "effect/Duration";
|
|
3
3
|
import { RateLimitError, UsageLimitError } from "./Errors.js";
|
|
4
4
|
const codexAt = /try again at\s+(\d{1,2}:\d{2}\s*[AP]M)/i;
|
|
5
|
-
|
|
5
|
+
// claude: "You have reached your usage limit; resets at 3 PM", and since
|
|
6
|
+
// 2.1 "You've hit your session limit · resets 8:20am (Europe/Rome)" — the
|
|
7
|
+
// zone in parentheses is the one the time is in, when given.
|
|
8
|
+
const claudeAt = /\blimit\b.*?(?:resets?|try again)(?:\s+at)?\s+(\d{1,2}(?::\d{2})?\s*[ap]m)(?:\s*\(([A-Za-z_]+(?:\/[A-Za-z_+-]+)+)\))?/i;
|
|
9
|
+
const claudeLimitSignals = [
|
|
10
|
+
"usage limit",
|
|
11
|
+
"session limit",
|
|
12
|
+
"weekly limit",
|
|
13
|
+
"hit your"
|
|
14
|
+
];
|
|
6
15
|
const geminiReset = /reset after\s+((?:\d+(?:ms|[dhms]))+)/i;
|
|
7
16
|
const resetComponent = /(\d+)(ms|[dhms])/gi;
|
|
8
17
|
const shortResetLimit = Duration.seconds(120);
|
|
@@ -39,6 +48,7 @@ const includesSignal = (text, signals) => {
|
|
|
39
48
|
export const isGeminiQuota = (text) => includesSignal(text, geminiQuotaSignals);
|
|
40
49
|
const isGenericQuota = (text) => includesSignal(text, genericQuotaSignals);
|
|
41
50
|
const isRelayedQuota = (text) => includesSignal(text, relayedQuotaSignals);
|
|
51
|
+
const isClaudeLimit = (text) => includesSignal(text, claudeLimitSignals) && /\blimit\b/i.test(text);
|
|
42
52
|
const resetDuration = (specification) => {
|
|
43
53
|
let milliseconds = 0;
|
|
44
54
|
for (const match of specification.matchAll(resetComponent)) {
|
|
@@ -156,14 +166,14 @@ export const classifyUsageLimit = (provider, text, now, timeZone) => {
|
|
|
156
166
|
});
|
|
157
167
|
}
|
|
158
168
|
case "claude": {
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
169
|
+
const statedZone = text.match(claudeAt)?.[2];
|
|
170
|
+
const resetAt = wallClockReset(text, claudeAt, now, statedZone ?? timeZone);
|
|
171
|
+
if (resetAt !== undefined) {
|
|
172
|
+
return UsageLimitError.make({ resetAt, provider, message: text });
|
|
173
|
+
}
|
|
174
|
+
// A limit without a readable reset time still takes claude out of the
|
|
175
|
+
// round, for the roster's default cooldown.
|
|
176
|
+
return isClaudeLimit(text) ? UsageLimitError.make({ provider, message: text }) : undefined;
|
|
167
177
|
}
|
|
168
178
|
case "gemini": {
|
|
169
179
|
const resetSpecification = text.match(geminiReset)?.[1];
|
package/dist/UsageLimits.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UsageLimits.js","sourceRoot":"","sources":["../src/UsageLimits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,eAAe,EAAiB,MAAM,aAAa,CAAA;AAE5E,MAAM,OAAO,GAAG,yCAAyC,CAAA;AACzD,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"UsageLimits.js","sourceRoot":"","sources":["../src/UsageLimits.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/UsageLimits.ts
CHANGED
|
@@ -3,7 +3,17 @@ import * as Duration from "effect/Duration"
|
|
|
3
3
|
import { RateLimitError, UsageLimitError, type LlmError } from "./Errors.ts"
|
|
4
4
|
|
|
5
5
|
const codexAt = /try again at\s+(\d{1,2}:\d{2}\s*[AP]M)/i
|
|
6
|
-
|
|
6
|
+
// claude: "You have reached your usage limit; resets at 3 PM", and since
|
|
7
|
+
// 2.1 "You've hit your session limit · resets 8:20am (Europe/Rome)" — the
|
|
8
|
+
// zone in parentheses is the one the time is in, when given.
|
|
9
|
+
const claudeAt =
|
|
10
|
+
/\blimit\b.*?(?:resets?|try again)(?:\s+at)?\s+(\d{1,2}(?::\d{2})?\s*[ap]m)(?:\s*\(([A-Za-z_]+(?:\/[A-Za-z_+-]+)+)\))?/i
|
|
11
|
+
const claudeLimitSignals: ReadonlyArray<string> = [
|
|
12
|
+
"usage limit",
|
|
13
|
+
"session limit",
|
|
14
|
+
"weekly limit",
|
|
15
|
+
"hit your"
|
|
16
|
+
]
|
|
7
17
|
const geminiReset = /reset after\s+((?:\d+(?:ms|[dhms]))+)/i
|
|
8
18
|
const resetComponent = /(\d+)(ms|[dhms])/gi
|
|
9
19
|
const shortResetLimit = Duration.seconds(120)
|
|
@@ -48,6 +58,9 @@ const isGenericQuota = (text: string): boolean => includesSignal(text, genericQu
|
|
|
48
58
|
|
|
49
59
|
const isRelayedQuota = (text: string): boolean => includesSignal(text, relayedQuotaSignals)
|
|
50
60
|
|
|
61
|
+
const isClaudeLimit = (text: string): boolean =>
|
|
62
|
+
includesSignal(text, claudeLimitSignals) && /\blimit\b/i.test(text)
|
|
63
|
+
|
|
51
64
|
const resetDuration = (specification: string): Duration.Duration => {
|
|
52
65
|
let milliseconds = 0
|
|
53
66
|
|
|
@@ -213,14 +226,14 @@ export const classifyUsageLimit = (
|
|
|
213
226
|
})
|
|
214
227
|
}
|
|
215
228
|
case "claude": {
|
|
216
|
-
const
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
229
|
+
const statedZone = text.match(claudeAt)?.[2]
|
|
230
|
+
const resetAt = wallClockReset(text, claudeAt, now, statedZone ?? timeZone)
|
|
231
|
+
if (resetAt !== undefined) {
|
|
232
|
+
return UsageLimitError.make({ resetAt, provider, message: text })
|
|
233
|
+
}
|
|
234
|
+
// A limit without a readable reset time still takes claude out of the
|
|
235
|
+
// round, for the roster's default cooldown.
|
|
236
|
+
return isClaudeLimit(text) ? UsageLimitError.make({ provider, message: text }) : undefined
|
|
224
237
|
}
|
|
225
238
|
case "gemini": {
|
|
226
239
|
const resetSpecification = text.match(geminiReset)?.[1]
|