claude-code-infinite 1.0.19 → 1.0.21
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/README.md +95 -5
- package/dist/auto-update-runner.d.ts +52 -0
- package/dist/auto-update-runner.d.ts.map +1 -0
- package/dist/auto-update-runner.js +307 -0
- package/dist/auto-update-runner.js.map +1 -0
- package/dist/auto-update-setup.d.ts +38 -0
- package/dist/auto-update-setup.d.ts.map +1 -0
- package/dist/auto-update-setup.js +72 -0
- package/dist/auto-update-setup.js.map +1 -0
- package/dist/auto-update.d.ts +170 -0
- package/dist/auto-update.d.ts.map +1 -0
- package/dist/auto-update.js +401 -0
- package/dist/auto-update.js.map +1 -0
- package/dist/cc-request.d.ts +17 -0
- package/dist/cc-request.d.ts.map +1 -1
- package/dist/cc-request.js +22 -0
- package/dist/cc-request.js.map +1 -1
- package/dist/cli-main.js +35 -7
- package/dist/cli-main.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/count-tokens.d.ts +38 -3
- package/dist/count-tokens.d.ts.map +1 -1
- package/dist/count-tokens.js +88 -19
- package/dist/count-tokens.js.map +1 -1
- package/dist/memtree-finder.d.ts +11 -0
- package/dist/memtree-finder.d.ts.map +1 -1
- package/dist/memtree-finder.js +18 -0
- package/dist/memtree-finder.js.map +1 -1
- package/dist/memtree-mcp-config.d.ts.map +1 -1
- package/dist/memtree-mcp-config.js +4 -2
- package/dist/memtree-mcp-config.js.map +1 -1
- package/dist/memtree-mcp.d.ts +24 -4
- package/dist/memtree-mcp.d.ts.map +1 -1
- package/dist/memtree-mcp.js +47 -14
- package/dist/memtree-mcp.js.map +1 -1
- package/dist/memtree-tools.d.ts +17 -1
- package/dist/memtree-tools.d.ts.map +1 -1
- package/dist/memtree-tools.js +50 -2
- package/dist/memtree-tools.js.map +1 -1
- package/dist/memtree.d.ts +10 -1
- package/dist/memtree.d.ts.map +1 -1
- package/dist/memtree.js +54 -19
- package/dist/memtree.js.map +1 -1
- package/dist/notices.d.ts +6 -1
- package/dist/notices.d.ts.map +1 -1
- package/dist/notices.js +16 -4
- package/dist/notices.js.map +1 -1
- package/dist/proxy.d.ts +17 -1
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +137 -53
- package/dist/proxy.js.map +1 -1
- package/dist/reqlog.d.ts +10 -0
- package/dist/reqlog.d.ts.map +1 -1
- package/dist/reqlog.js.map +1 -1
- package/dist/request-sizing.d.ts +21 -2
- package/dist/request-sizing.d.ts.map +1 -1
- package/dist/request-sizing.js +60 -7
- package/dist/request-sizing.js.map +1 -1
- package/dist/token-estimate.d.ts +35 -0
- package/dist/token-estimate.d.ts.map +1 -0
- package/dist/token-estimate.js +97 -0
- package/dist/token-estimate.js.map +1 -0
- package/dist/update-check.d.ts +23 -4
- package/dist/update-check.d.ts.map +1 -1
- package/dist/update-check.js +79 -12
- package/dist/update-check.js.map +1 -1
- package/dist/update-lock.d.ts +68 -0
- package/dist/update-lock.d.ts.map +1 -0
- package/dist/update-lock.js +176 -0
- package/dist/update-lock.js.map +1 -0
- package/package.json +1 -1
package/dist/reqlog.d.ts
CHANGED
|
@@ -87,6 +87,9 @@ export interface UsageRecord {
|
|
|
87
87
|
export interface CountTokensRecord {
|
|
88
88
|
statusClass: string;
|
|
89
89
|
ms: number;
|
|
90
|
+
/** Count payload bytes, and the allowance the attempt had (count-tokens.ts). */
|
|
91
|
+
bytes: number;
|
|
92
|
+
timeoutMs: number;
|
|
90
93
|
}
|
|
91
94
|
export interface MessagesRecord {
|
|
92
95
|
kind: "messages";
|
|
@@ -362,6 +365,13 @@ export interface CompactionRecord {
|
|
|
362
365
|
* "bytes": bytes/4 of the whole body (no earlier usage to start from).
|
|
363
366
|
*/
|
|
364
367
|
sizeSource?: "reported" | "bytes";
|
|
368
|
+
/**
|
|
369
|
+
* Uncounted and uncalibrated ("bytes"), and over the window by its per-model
|
|
370
|
+
* conservative bound (token-estimate.ts) plus max_tokens: delivery could not
|
|
371
|
+
* send it without an exact count, so planning compresses it now, through
|
|
372
|
+
* the normal gated path.
|
|
373
|
+
*/
|
|
374
|
+
uncountedOverWindow?: true;
|
|
365
375
|
/** Set when the turn compressed (or tried to) for one of these reasons. */
|
|
366
376
|
reason?: RecompressReason;
|
|
367
377
|
/** For "prefix-mismatch": which check failed. */
|
package/dist/reqlog.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reqlog.d.ts","sourceRoot":"","sources":["../src/reqlog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAK9E,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,MAAM,MAAM,QAAQ,GAChB,YAAY,GACZ,MAAM;AACR,gFAAgF;GAC9E,aAAa;AACf;;;;GAIG;GACD,aAAa;AACf;;;;;GAKG;GACD,mBAAmB,GACnB,qBAAqB;AACvB;;;;;;GAMG;GACD,iBAAiB,GACjB,eAAe;AACjB,8EAA8E;GAC5E,uBAAuB;AACzB;;;GAGG;GACD,qBAAqB,GACrB,mBAAmB;AACrB;;;;GAIG;GACD,aAAa;AACf;;;GAGG;GACD,cAAc;AAChB;;;GAGG;GACD,SAAS,GACT,wBAAwB,GACxB,aAAa,CAAC;AAElB,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kFAAkF;IAClF,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED;;;;;GAKG;AACH,8FAA8F;AAC9F,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"reqlog.d.ts","sourceRoot":"","sources":["../src/reqlog.ts"],"names":[],"mappings":"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"}
|
package/dist/reqlog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reqlog.js","sourceRoot":"","sources":["../src/reqlog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,aAAa,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,gCAAgC;AACxE,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC,2EAA2E;AAC3E,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,sBAAsB,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;AACxD,CAAC;
|
|
1
|
+
{"version":3,"file":"reqlog.js","sourceRoot":"","sources":["../src/reqlog.ts"],"names":[],"mappings":"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"}
|
package/dist/request-sizing.d.ts
CHANGED
|
@@ -23,6 +23,8 @@ export interface CandidateMeasurement {
|
|
|
23
23
|
/** Advisory estimate retained for compression and stale-estimate diagnostics. */
|
|
24
24
|
estimatedTokens: number;
|
|
25
25
|
count?: CountTokensResult;
|
|
26
|
+
/** Over Anthropic's request size limit: it cannot be sent natively at any size. */
|
|
27
|
+
tooLarge?: true;
|
|
26
28
|
}
|
|
27
29
|
export interface RequestCandidate {
|
|
28
30
|
readonly key: string;
|
|
@@ -31,20 +33,37 @@ export interface RequestCandidate {
|
|
|
31
33
|
readonly kind: CandidateKind;
|
|
32
34
|
readonly sample?: Readonly<SizeSample>;
|
|
33
35
|
readonly estimate: Readonly<PlannedSize>;
|
|
36
|
+
/** Per-model conservative bound (token-estimate.ts): what delivery may rely
|
|
37
|
+
* on without an exact count. */
|
|
38
|
+
readonly conservativeTokens: number;
|
|
34
39
|
}
|
|
35
40
|
export declare class RequestSizing {
|
|
36
41
|
private readonly counts;
|
|
37
42
|
private readonly enabled;
|
|
43
|
+
private readonly model?;
|
|
38
44
|
private readonly candidates;
|
|
39
45
|
private readonly excludedFallbacks;
|
|
40
|
-
|
|
46
|
+
/** `model` is the request's model: it picks the tokenizer family's ratio. */
|
|
47
|
+
constructor(counts: CountTokensSession, enabled: boolean, model?: string | undefined);
|
|
41
48
|
/** The first registration fixes both bytes and learned sample for this request. */
|
|
42
49
|
register(body: Buffer, kind: CandidateKind, sample?: SizeSample): RequestCandidate;
|
|
43
50
|
/** Eligibility belongs to route planning, not to a later byte-size guess. */
|
|
44
51
|
excludeFallback(candidate: RequestCandidate): void;
|
|
45
52
|
/** Planning and metadata consult the same exact count, else the snapshotted estimate. */
|
|
46
53
|
plan(candidate: RequestCandidate): PlannedSize;
|
|
54
|
+
/** Whether this body could still get an exact count: counting is on and
|
|
55
|
+
* no attempt for these bytes has completed (a failed one is reused). */
|
|
56
|
+
canCount(candidate: RequestCandidate): boolean;
|
|
57
|
+
/** Whether Anthropic would refuse this body's size (413) before reading it. */
|
|
58
|
+
exceedsRequestLimit(candidate: RequestCandidate): boolean;
|
|
59
|
+
/** Whether the conservative bound alone admits this body under `limits`. */
|
|
60
|
+
boundFits(candidate: RequestCandidate, limits: SizingLimits): boolean;
|
|
61
|
+
/** Count a body at planning when only a count could admit it: no exact
|
|
62
|
+
* count and its conservative bound does not fit. Delivery reuses the result. */
|
|
63
|
+
countIfOverBound(candidate: RequestCandidate, limits: SizingLimits): Promise<void>;
|
|
47
64
|
/** Whether this body's size is an exact Count Tokens result. */
|
|
65
|
+
/** An exact count already made for these bytes, if any; never counts. */
|
|
66
|
+
exactTokensFor(body: Buffer): number | undefined;
|
|
48
67
|
isExact(candidate: RequestCandidate): boolean;
|
|
49
68
|
clientInputTokens(candidate: RequestCandidate): number | undefined;
|
|
50
69
|
/** Count only when a size decision needs it; all views reuse the same result. */
|
|
@@ -64,7 +83,7 @@ export declare class RequestSizing {
|
|
|
64
83
|
export declare function outputReservation(model: string | undefined, maxTokens: unknown): number;
|
|
65
84
|
/** Admission: the relaxed output floor applies only to an exact count of this
|
|
66
85
|
* body; estimates and fallbacks (failed or disabled counting) keep max_tokens. */
|
|
67
|
-
export declare function fitsMeasured(measurement: Pick<CandidateMeasurement, "tokens" | "source">, limits: SizingLimits): boolean;
|
|
86
|
+
export declare function fitsMeasured(measurement: Pick<CandidateMeasurement, "tokens" | "source" | "tooLarge">, limits: SizingLimits): boolean;
|
|
68
87
|
/** The limits an estimate is judged by: the full max_tokens reservation. */
|
|
69
88
|
export declare function estimateLimits(limits: SizingLimits): SizingLimits;
|
|
70
89
|
/** `limits.output` is the reservation from outputReservation, not raw max_tokens. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-sizing.d.ts","sourceRoot":"","sources":["../src/request-sizing.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"request-sizing.d.ts","sourceRoot":"","sources":["../src/request-sizing.ts"],"names":[],"mappings":"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"}
|
package/dist/request-sizing.js
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
* exact counts remain attached to immutable body bytes, and every candidate
|
|
3
3
|
* shares the request's Count Tokens deadline and account cooldown. */
|
|
4
4
|
import { createHash } from "node:crypto";
|
|
5
|
-
import { plausibleSample, shouldCountTokens } from "./count-tokens.js";
|
|
5
|
+
import { exceedsRequestLimit, plausibleSample, shouldCountTokens } from "./count-tokens.js";
|
|
6
6
|
import { approxTokensFromBytes } from "./reqlog.js";
|
|
7
|
+
import { conservativeBodyTokens } from "./token-estimate.js";
|
|
7
8
|
import { acceptsContextOverflow } from "./turns.js";
|
|
8
9
|
/** Output room kept free on models that accept input + max_tokens over the
|
|
9
10
|
* window, so the model can still answer a request that barely fits. */
|
|
@@ -11,11 +12,14 @@ export const OUTPUT_FLOOR_TOKENS = 16_000;
|
|
|
11
12
|
export class RequestSizing {
|
|
12
13
|
counts;
|
|
13
14
|
enabled;
|
|
15
|
+
model;
|
|
14
16
|
candidates = new Map();
|
|
15
17
|
excludedFallbacks = new Set();
|
|
16
|
-
|
|
18
|
+
/** `model` is the request's model: it picks the tokenizer family's ratio. */
|
|
19
|
+
constructor(counts, enabled, model) {
|
|
17
20
|
this.counts = counts;
|
|
18
21
|
this.enabled = enabled;
|
|
22
|
+
this.model = model;
|
|
19
23
|
}
|
|
20
24
|
/** The first registration fixes both bytes and learned sample for this request. */
|
|
21
25
|
register(body, kind, sample) {
|
|
@@ -24,8 +28,10 @@ export class RequestSizing {
|
|
|
24
28
|
if (existing)
|
|
25
29
|
return existing;
|
|
26
30
|
const snapshot = plausibleSample(sample) ? Object.freeze({ ...sample }) : undefined;
|
|
31
|
+
const conservativeTokens = conservativeBodyTokens(body, this.model);
|
|
27
32
|
const candidate = Object.freeze({ key, body: Buffer.from(body), kind, sample: snapshot,
|
|
28
|
-
estimate: Object.freeze(estimateRequestTokens(snapshot, body.length)
|
|
33
|
+
estimate: Object.freeze(capByteEstimate(estimateRequestTokens(snapshot, body.length), conservativeTokens)),
|
|
34
|
+
conservativeTokens });
|
|
29
35
|
this.candidates.set(key, candidate);
|
|
30
36
|
return candidate;
|
|
31
37
|
}
|
|
@@ -38,7 +44,33 @@ export class RequestSizing {
|
|
|
38
44
|
const exact = this.counts.peek(candidate.body)?.tokens;
|
|
39
45
|
return exact !== undefined ? { tokens: exact, source: "reported" } : candidate.estimate;
|
|
40
46
|
}
|
|
47
|
+
/** Whether this body could still get an exact count: counting is on and
|
|
48
|
+
* no attempt for these bytes has completed (a failed one is reused). */
|
|
49
|
+
canCount(candidate) {
|
|
50
|
+
return this.enabled && this.counts.peek(candidate.body) === undefined &&
|
|
51
|
+
!this.exceedsRequestLimit(candidate);
|
|
52
|
+
}
|
|
53
|
+
/** Whether Anthropic would refuse this body's size (413) before reading it. */
|
|
54
|
+
exceedsRequestLimit(candidate) {
|
|
55
|
+
return exceedsRequestLimit(candidate.body.length);
|
|
56
|
+
}
|
|
57
|
+
/** Whether the conservative bound alone admits this body under `limits`. */
|
|
58
|
+
boundFits(candidate, limits) {
|
|
59
|
+
return !this.exceedsRequestLimit(candidate) &&
|
|
60
|
+
fitsNative(candidate.conservativeTokens, estimateLimits(limits));
|
|
61
|
+
}
|
|
62
|
+
/** Count a body at planning when only a count could admit it: no exact
|
|
63
|
+
* count and its conservative bound does not fit. Delivery reuses the result. */
|
|
64
|
+
async countIfOverBound(candidate, limits) {
|
|
65
|
+
if (this.isExact(candidate) || !this.canCount(candidate) || this.boundFits(candidate, limits))
|
|
66
|
+
return;
|
|
67
|
+
await this.counts.count(candidate.body);
|
|
68
|
+
}
|
|
41
69
|
/** Whether this body's size is an exact Count Tokens result. */
|
|
70
|
+
/** An exact count already made for these bytes, if any; never counts. */
|
|
71
|
+
exactTokensFor(body) {
|
|
72
|
+
return this.counts.peek(body)?.tokens;
|
|
73
|
+
}
|
|
42
74
|
isExact(candidate) {
|
|
43
75
|
return this.counts.peek(candidate.body)?.tokens !== undefined;
|
|
44
76
|
}
|
|
@@ -50,8 +82,16 @@ export class RequestSizing {
|
|
|
50
82
|
async measure(candidate, limits, phase = "delivery") {
|
|
51
83
|
let count = this.counts.peek(candidate.body);
|
|
52
84
|
const estimate = candidate.estimate.tokens;
|
|
85
|
+
if (this.exceedsRequestLimit(candidate))
|
|
86
|
+
return {
|
|
87
|
+
tokens: Math.max(estimate, candidate.conservativeTokens), source: "bytes",
|
|
88
|
+
estimatedTokens: estimate, ...(count ? { count } : {}), tooLarge: true,
|
|
89
|
+
};
|
|
90
|
+
// Delivery counts whenever an estimate is all that says the body fits: the
|
|
91
|
+
// learned estimate, or the conservative bound, does not fit on its own.
|
|
53
92
|
const needed = shouldCountTokens(candidate.sample, candidate.body.length, estimate, limits.budget) ||
|
|
54
|
-
(phase === "delivery" && !fitsNative(estimate, estimateLimits(limits))
|
|
93
|
+
(phase === "delivery" && !(fitsNative(estimate, estimateLimits(limits)) &&
|
|
94
|
+
fitsNative(candidate.conservativeTokens, estimateLimits(limits))));
|
|
55
95
|
if (!count && this.enabled && needed)
|
|
56
96
|
count = await this.counts.count(candidate.body);
|
|
57
97
|
if (count?.tokens !== undefined)
|
|
@@ -59,10 +99,12 @@ export class RequestSizing {
|
|
|
59
99
|
tokens: count.tokens, source: "exact", estimatedTokens: estimate, count,
|
|
60
100
|
};
|
|
61
101
|
// A learned ratio can request compression, but cannot veto a body whose
|
|
62
|
-
//
|
|
102
|
+
// conservative per-model bound fits when counting is unavailable or
|
|
103
|
+
// disabled; nor can it admit one whose bound does not (2026-10-15: bytes/4
|
|
104
|
+
// admitted a body Anthropic counted at 1.34M tokens on a 1M window).
|
|
63
105
|
const bytes = phase === "delivery" &&
|
|
64
106
|
(!this.enabled || count !== undefined || candidate.estimate.source === "bytes");
|
|
65
|
-
return { tokens: bytes ?
|
|
107
|
+
return { tokens: bytes ? candidate.conservativeTokens : estimate,
|
|
66
108
|
source: bytes ? "bytes" : candidate.estimate.source,
|
|
67
109
|
estimatedTokens: estimate, count };
|
|
68
110
|
}
|
|
@@ -98,7 +140,7 @@ export function outputReservation(model, maxTokens) {
|
|
|
98
140
|
/** Admission: the relaxed output floor applies only to an exact count of this
|
|
99
141
|
* body; estimates and fallbacks (failed or disabled counting) keep max_tokens. */
|
|
100
142
|
export function fitsMeasured(measurement, limits) {
|
|
101
|
-
return fitsNative(measurement.tokens, measurement.source === "exact" ? limits : estimateLimits(limits));
|
|
143
|
+
return !measurement.tooLarge && fitsNative(measurement.tokens, measurement.source === "exact" ? limits : estimateLimits(limits));
|
|
102
144
|
}
|
|
103
145
|
/** The limits an estimate is judged by: the full max_tokens reservation. */
|
|
104
146
|
export function estimateLimits(limits) {
|
|
@@ -109,6 +151,17 @@ export function fitsNative(input, limits) {
|
|
|
109
151
|
return [input, limits.output, limits.context].every(value => Number.isFinite(value) && value >= 0) &&
|
|
110
152
|
input + limits.output <= limits.context;
|
|
111
153
|
}
|
|
154
|
+
/**
|
|
155
|
+
* An uncalibrated bytes/4 estimate reads base64 images as text (a 1 MB image
|
|
156
|
+
* is ~250k "tokens" but costs at most MAX_IMAGE_TOKENS), so it is capped at
|
|
157
|
+
* the conservative bound, which is an upper bound. Text-only bodies are
|
|
158
|
+
* unchanged: their bytes/4 is below the bound. A calibrated estimate is kept.
|
|
159
|
+
*/
|
|
160
|
+
function capByteEstimate(estimate, conservativeTokens) {
|
|
161
|
+
if (estimate.source !== "bytes" || estimate.tokens <= conservativeTokens)
|
|
162
|
+
return estimate;
|
|
163
|
+
return { tokens: conservativeTokens, source: "bytes" };
|
|
164
|
+
}
|
|
112
165
|
/** One shared estimator for planner telemetry and request-local snapshots. */
|
|
113
166
|
export function estimateRequestTokens(sample, bytes) {
|
|
114
167
|
if (!plausibleSample(sample))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-sizing.js","sourceRoot":"","sources":["../src/request-sizing.ts"],"names":[],"mappings":"AAAA;;sEAEsE;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"request-sizing.js","sourceRoot":"","sources":["../src/request-sizing.ts"],"names":[],"mappings":"AAAA;;sEAEsE;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,EACI,MAAM,mBAAmB,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD;uEACuE;AACvE,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAmC1C,MAAM,OAAO,aAAa;IAKK;IAA6C;IACvD;IALF,UAAU,GAAG,IAAI,GAAG,EAA4B,CAAC;IACjD,iBAAiB,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEjE,6EAA6E;IAC7E,YAA6B,MAA0B,EAAmB,OAAgB,EACvE,KAAc;QADJ,WAAM,GAAN,MAAM,CAAoB;QAAmB,YAAO,GAAP,OAAO,CAAS;QACvE,UAAK,GAAL,KAAK,CAAS;IAAG,CAAC;IAErC,mFAAmF;IACnF,QAAQ,CAAC,IAAY,EAAE,IAAmB,EAAE,MAAmB;QAC7D,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACpF,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ;YACpF,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAClF,kBAAkB,CAAC,CAAC;YACtB,kBAAkB,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,6EAA6E;IAC7E,eAAe,CAAC,SAA2B;QACzC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,yFAAyF;IACzF,IAAI,CAAC,SAA2B;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvD,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC;IAC1F,CAAC;IAED;4EACwE;IACxE,QAAQ,CAAC,SAA2B;QAClC,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,SAAS;YACnE,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,+EAA+E;IAC/E,mBAAmB,CAAC,SAA2B;QAC7C,OAAO,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IAED,4EAA4E;IAC5E,SAAS,CAAC,SAA2B,EAAE,MAAoB;QACzD,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;YACzC,UAAU,CAAC,SAAS,CAAC,kBAAkB,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,CAAC;IAED;oFACgF;IAChF,KAAK,CAAC,gBAAgB,CAAC,SAA2B,EAAE,MAAoB;QACtE,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;YAAE,OAAO;QACtG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,gEAAgE;IAChE,yEAAyE;IACzE,cAAc,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACxC,CAAC;IAED,OAAO,CAAC,SAA2B;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,SAAS,CAAC;IAChE,CAAC;IAED,iBAAiB,CAAC,SAA2B;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,OAAO,CAAC,SAA2B,EAAE,MAAoB,EAC7D,QAA6B,UAAU;QACvC,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC3C,IAAI,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;YAAE,OAAO;gBAC9C,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,OAAO;gBACzE,eAAe,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI;aACvE,CAAC;QACF,2EAA2E;QAC3E,wEAAwE;QACxE,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;YAChG,CAAC,KAAK,KAAK,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;gBACrE,UAAU,CAAC,SAAS,CAAC,kBAAkB,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,IAAI,MAAM;YAAE,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACtF,IAAI,KAAK,EAAE,MAAM,KAAK,SAAS;YAAE,OAAO;gBACtC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK;aACxE,CAAC;QACF,wEAAwE;QACxE,oEAAoE;QACpE,2EAA2E;QAC3E,qEAAqE;QACrE,MAAM,KAAK,GAAG,KAAK,KAAK,UAAU;YAChC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;QAClF,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ;YAC9D,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM;YACnD,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACvC,CAAC;IAED;kFAC8E;IAC9E,KAAK,CAAC,MAAM,CAAC,SAA2B,EAAE,MAAoB;QAG5D,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CACzD,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,KAAK,UAAU;YAC3C,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,SAAS;gBAC9D,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,CAAC;QAC3B,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC1D,IAAI,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC;gBAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;QAC3E,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAED;;;;2DAI2D;AAC3D,MAAM,UAAU,iBAAiB,CAAC,KAAyB,EAAE,SAAkB;IAC7E,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACtC,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACxF,CAAC;AAED;kFACkF;AAClF,MAAM,UAAU,YAAY,CAC1B,WAAyE,EAAE,MAAoB;IAE/F,OAAO,CAAC,WAAW,CAAC,QAAQ,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,EAC3D,WAAW,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC,EAAE,CAAC;AACnF,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,MAAoB;IAC5D,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAChG,KAAK,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC;AAC5C,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CAAC,QAAqB,EAAE,kBAA0B;IACxE,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,IAAI,QAAQ,CAAC,MAAM,IAAI,kBAAkB;QAAE,OAAO,QAAQ,CAAC;IAC1F,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACzD,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,qBAAqB,CAAC,MAA8B,EAAE,KAAa;IACjF,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC/F,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;IACpD,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM;QACvF,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,EAC3D,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IACzD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conservative token estimates from request bytes, per model tokenizer family,
|
|
3
|
+
* for when no exact Count Tokens result is available.
|
|
4
|
+
*
|
|
5
|
+
* bytes/4 under-counted Claude 4.7+ by ~1.8x: on 2026-10-15 (request 3bc78182)
|
|
6
|
+
* a 3,238,930-byte flattened body was sized at 809,733 tokens and forwarded to
|
|
7
|
+
* a 1M window; Anthropic counted 1,342,572 and refused it. These ratios are the
|
|
8
|
+
* MemTree server's (polychat/chars_per_token.py): low percentiles of real
|
|
9
|
+
* Claude Code and NanoGPT requests counted with Count Tokens, so an estimate
|
|
10
|
+
* rarely says a body fits when it does not. Bytes are at least the characters
|
|
11
|
+
* the server measures (JSON escapes and UTF-8 only add bytes), so dividing
|
|
12
|
+
* bytes by a chars-per-token ratio errs high, never low.
|
|
13
|
+
*
|
|
14
|
+
* Base64 image data is not text: Anthropic resizes every image to at most
|
|
15
|
+
* MAX_IMAGE_TOKENS however many bytes it takes (and a tiny, very compressible
|
|
16
|
+
* PNG can still cost the maximum), so each image payload counts as the maximum.
|
|
17
|
+
*/
|
|
18
|
+
/** Claude 4.7 and later (Opus 4.7+, Sonnet/Haiku 5+, Fable 5). */
|
|
19
|
+
export declare const CLAUDE_4_7_PLUS_BYTES_PER_TOKEN = 1.9;
|
|
20
|
+
/** Claude before 4.7 (4.5, 4.6 and older). */
|
|
21
|
+
export declare const CLAUDE_LEGACY_BYTES_PER_TOKEN = 2.4;
|
|
22
|
+
/** Models that are not Claude, or no model named. */
|
|
23
|
+
export declare const OTHER_BYTES_PER_TOKEN = 2.8;
|
|
24
|
+
/** Anthropic's largest per-image cost (Claude 4.7+: 2576 px, 4,784 tokens). */
|
|
25
|
+
export declare const MAX_IMAGE_TOKENS = 4784;
|
|
26
|
+
/** The conservative bytes per token of `model`'s tokenizer family. */
|
|
27
|
+
export declare function bytesPerTokenForModel(model: string | undefined): number;
|
|
28
|
+
/** Tokens `bytes` of text may cost on `model` (rounded up). */
|
|
29
|
+
export declare function conservativeTokensFromBytes(bytes: number, model: string | undefined): number;
|
|
30
|
+
/** Tokens a request body may cost on `model`: its text at the family ratio,
|
|
31
|
+
* each image content block (base64 or URL, in a message or a tool_result) at
|
|
32
|
+
* one image's maximum.
|
|
33
|
+
* A body that does not parse is all text, an over-estimate. */
|
|
34
|
+
export declare function conservativeBodyTokens(body: Buffer, model: string | undefined): number;
|
|
35
|
+
//# sourceMappingURL=token-estimate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-estimate.d.ts","sourceRoot":"","sources":["../src/token-estimate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,kEAAkE;AAClE,eAAO,MAAM,+BAA+B,MAAM,CAAC;AACnD,8CAA8C;AAC9C,eAAO,MAAM,6BAA6B,MAAM,CAAC;AACjD,qDAAqD;AACrD,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,OAAQ,CAAC;AAItC,sEAAsE;AACtE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CASvE;AAED,+DAA+D;AAC/D,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAG5F;AAED;;;+DAG+D;AAC/D,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGtF"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conservative token estimates from request bytes, per model tokenizer family,
|
|
3
|
+
* for when no exact Count Tokens result is available.
|
|
4
|
+
*
|
|
5
|
+
* bytes/4 under-counted Claude 4.7+ by ~1.8x: on 2026-10-15 (request 3bc78182)
|
|
6
|
+
* a 3,238,930-byte flattened body was sized at 809,733 tokens and forwarded to
|
|
7
|
+
* a 1M window; Anthropic counted 1,342,572 and refused it. These ratios are the
|
|
8
|
+
* MemTree server's (polychat/chars_per_token.py): low percentiles of real
|
|
9
|
+
* Claude Code and NanoGPT requests counted with Count Tokens, so an estimate
|
|
10
|
+
* rarely says a body fits when it does not. Bytes are at least the characters
|
|
11
|
+
* the server measures (JSON escapes and UTF-8 only add bytes), so dividing
|
|
12
|
+
* bytes by a chars-per-token ratio errs high, never low.
|
|
13
|
+
*
|
|
14
|
+
* Base64 image data is not text: Anthropic resizes every image to at most
|
|
15
|
+
* MAX_IMAGE_TOKENS however many bytes it takes (and a tiny, very compressible
|
|
16
|
+
* PNG can still cost the maximum), so each image payload counts as the maximum.
|
|
17
|
+
*/
|
|
18
|
+
/** Claude 4.7 and later (Opus 4.7+, Sonnet/Haiku 5+, Fable 5). */
|
|
19
|
+
export const CLAUDE_4_7_PLUS_BYTES_PER_TOKEN = 1.9;
|
|
20
|
+
/** Claude before 4.7 (4.5, 4.6 and older). */
|
|
21
|
+
export const CLAUDE_LEGACY_BYTES_PER_TOKEN = 2.4;
|
|
22
|
+
/** Models that are not Claude, or no model named. */
|
|
23
|
+
export const OTHER_BYTES_PER_TOKEN = 2.8;
|
|
24
|
+
/** Anthropic's largest per-image cost (Claude 4.7+: 2576 px, 4,784 tokens). */
|
|
25
|
+
export const MAX_IMAGE_TOKENS = 4_784;
|
|
26
|
+
const CLAUDE_VERSION_RE = /claude-(?:opus|sonnet|haiku|fable|instant)?-?(\d{1,2})(?:[-.](\d{1,2}))?(?![0-9])/;
|
|
27
|
+
/** The conservative bytes per token of `model`'s tokenizer family. */
|
|
28
|
+
export function bytesPerTokenForModel(model) {
|
|
29
|
+
const id = (model ?? "").toLowerCase();
|
|
30
|
+
if (!id)
|
|
31
|
+
return OTHER_BYTES_PER_TOKEN;
|
|
32
|
+
const match = CLAUDE_VERSION_RE.exec(id);
|
|
33
|
+
if (!match)
|
|
34
|
+
return id.includes("claude") ? CLAUDE_4_7_PLUS_BYTES_PER_TOKEN : OTHER_BYTES_PER_TOKEN;
|
|
35
|
+
const major = Number(match[1]);
|
|
36
|
+
const minor = match[2] === undefined ? 0 : Number(match[2]);
|
|
37
|
+
return major > 4 || (major === 4 && minor >= 7)
|
|
38
|
+
? CLAUDE_4_7_PLUS_BYTES_PER_TOKEN : CLAUDE_LEGACY_BYTES_PER_TOKEN;
|
|
39
|
+
}
|
|
40
|
+
/** Tokens `bytes` of text may cost on `model` (rounded up). */
|
|
41
|
+
export function conservativeTokensFromBytes(bytes, model) {
|
|
42
|
+
if (!(bytes > 0))
|
|
43
|
+
return 0;
|
|
44
|
+
return Math.ceil(bytes / bytesPerTokenForModel(model));
|
|
45
|
+
}
|
|
46
|
+
/** Tokens a request body may cost on `model`: its text at the family ratio,
|
|
47
|
+
* each image content block (base64 or URL, in a message or a tool_result) at
|
|
48
|
+
* one image's maximum.
|
|
49
|
+
* A body that does not parse is all text, an over-estimate. */
|
|
50
|
+
export function conservativeBodyTokens(body, model) {
|
|
51
|
+
const { imageBytes, imageTokens } = imagePayloads(body);
|
|
52
|
+
return conservativeTokensFromBytes(body.length - imageBytes, model) + imageTokens;
|
|
53
|
+
}
|
|
54
|
+
function imagePayloads(body) {
|
|
55
|
+
const totals = { imageBytes: 0, imageTokens: 0 };
|
|
56
|
+
// Most bodies carry no image: skip the parse.
|
|
57
|
+
if (!body.includes('"image"'))
|
|
58
|
+
return totals;
|
|
59
|
+
let parsed;
|
|
60
|
+
try {
|
|
61
|
+
parsed = JSON.parse(body.toString("utf-8"));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return totals;
|
|
65
|
+
}
|
|
66
|
+
const messages = parsed?.messages;
|
|
67
|
+
if (Array.isArray(messages)) {
|
|
68
|
+
for (const message of messages) {
|
|
69
|
+
const content = message?.content;
|
|
70
|
+
if (Array.isArray(content))
|
|
71
|
+
countImageBlocks(content, totals);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return totals;
|
|
75
|
+
}
|
|
76
|
+
/** Count image blocks among content blocks: a message's content, and
|
|
77
|
+
* recursively a tool_result's content. Image-shaped JSON anywhere else (tool
|
|
78
|
+
* inputs, schemas, system, metadata) is ordinary text and stays counted as such. */
|
|
79
|
+
function countImageBlocks(blocks, totals) {
|
|
80
|
+
for (const item of blocks) {
|
|
81
|
+
if (!item || typeof item !== "object")
|
|
82
|
+
continue;
|
|
83
|
+
const block = item;
|
|
84
|
+
const source = block.source;
|
|
85
|
+
if (block.type === "image" && source && typeof source === "object") {
|
|
86
|
+
totals.imageTokens += MAX_IMAGE_TOKENS;
|
|
87
|
+
// Base64 is ASCII and never escaped by JSON, so its length is its byte count.
|
|
88
|
+
if (source.type === "base64" && typeof source.data === "string") {
|
|
89
|
+
totals.imageBytes += source.data.length;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else if (block.type === "tool_result" && Array.isArray(block.content)) {
|
|
93
|
+
countImageBlocks(block.content, totals);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=token-estimate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-estimate.js","sourceRoot":"","sources":["../src/token-estimate.ts"],"names":[],"mappings":"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"}
|
package/dist/update-check.d.ts
CHANGED
|
@@ -1,27 +1,44 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Startup check for a newer claude-code-infinite release on npm.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* The check only detects; installing is auto-update.ts, which acts on this
|
|
5
|
+
* result in the background where that is safe. The result is surfaced
|
|
6
6
|
* inside Claude Code through the SessionStart banner (see notices.ts) — the
|
|
7
7
|
* pre-launch terminal is covered by the TUI within a second, so a line printed
|
|
8
8
|
* there is never read. Bounded by a short timeout and silent on every failure
|
|
9
9
|
* (registry down, offline, malformed JSON, timeout) so startup is never gated
|
|
10
|
-
* on the registry.
|
|
10
|
+
* on the registry. The registry's answer is cached for a day, so most starts
|
|
11
|
+
* make no request at all. `CCC_NO_UPDATE_CHECK=1` (or the older
|
|
12
|
+
* `CCC_SKIP_UPDATE_CHECK=1`), or `"updateCheck": false` in
|
|
13
|
+
* ~/.claude-code-infinite/config.json, disables the check entirely (and
|
|
14
|
+
* with it auto-update).
|
|
11
15
|
*/
|
|
12
16
|
export declare const PACKAGE_NAME = "claude-code-infinite";
|
|
13
17
|
export declare const NPM_LATEST_URL = "https://registry.npmjs.org/claude-code-infinite/latest";
|
|
18
|
+
export declare const NO_UPDATE_CHECK_ENV = "CCC_NO_UPDATE_CHECK";
|
|
19
|
+
/** The original opt-out name, still honored. */
|
|
14
20
|
export declare const SKIP_UPDATE_CHECK_ENV = "CCC_SKIP_UPDATE_CHECK";
|
|
15
|
-
export declare const UPGRADE_COMMAND = "npm
|
|
21
|
+
export declare const UPGRADE_COMMAND = "npm i -g claude-code-infinite@latest";
|
|
22
|
+
export declare const UPDATE_CHECK_TIMEOUT_MS = 1500;
|
|
23
|
+
export declare const UPDATE_CHECK_CACHE_TTL_MS: number;
|
|
24
|
+
export declare const UPDATE_CHECK_CACHE_FILE = "update-check.json";
|
|
16
25
|
export interface UpdateAvailable {
|
|
17
26
|
/** Newest version on the registry's `latest` tag. */
|
|
18
27
|
latest: string;
|
|
19
28
|
/** The running client's version. */
|
|
20
29
|
current: string;
|
|
21
30
|
}
|
|
31
|
+
/** The config.json fields this check reads. */
|
|
32
|
+
export interface UpdateCheckConfig {
|
|
33
|
+
updateCheck?: boolean;
|
|
34
|
+
}
|
|
22
35
|
export interface UpdateCheckOptions {
|
|
23
36
|
currentVersion: string;
|
|
24
37
|
env?: NodeJS.ProcessEnv;
|
|
38
|
+
config?: UpdateCheckConfig;
|
|
39
|
+
/** Where the registry's answer is cached; no caching when omitted. */
|
|
40
|
+
cacheFile?: string;
|
|
41
|
+
now?: () => number;
|
|
25
42
|
fetchImpl?: typeof fetch;
|
|
26
43
|
timeoutMs?: number;
|
|
27
44
|
url?: string;
|
|
@@ -31,6 +48,8 @@ export interface UpdateCheckOptions {
|
|
|
31
48
|
* of `currentVersion`, else null. Never rejects.
|
|
32
49
|
*/
|
|
33
50
|
export declare function checkForUpdate(opts: UpdateCheckOptions): Promise<UpdateAvailable | null>;
|
|
51
|
+
/** False when the user opted out by env (either name) or config. */
|
|
52
|
+
export declare function updateCheckEnabled(env: NodeJS.ProcessEnv, config: UpdateCheckConfig): boolean;
|
|
34
53
|
/** Parse `1.2.3` (optionally `v`-prefixed / suffixed) into numeric parts. */
|
|
35
54
|
export declare function parseVersion(version: string): [number, number, number] | null;
|
|
36
55
|
/** Numeric per-component compare: negative when a < b, positive when a > b. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../src/update-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,eAAO,MAAM,YAAY,yBAAyB,CAAC;AACnD,eAAO,MAAM,cAAc,2DAAsD,CAAC;AAClF,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AACzD,gDAAgD;AAChD,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAC7D,eAAO,MAAM,eAAe,yCAAoC,CAAC;AACjE,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAC5C,eAAO,MAAM,yBAAyB,QAAsB,CAAC;AAC7D,eAAO,MAAM,uBAAuB,sBAAsB,CAAC;AAM3D,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,+CAA+C;AAC/C,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAOD,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAQjC;AAED,oEAAoE;AACpE,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAGT;AAgED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAI7E;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAC7B,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAC3B,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAC1B,MAAM,CAKR"}
|