agl 40.4.0 → 40.5.0
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/changelog.md +27 -0
- package/dist_serve/bundle.js +2228 -2177
- package/dist_serve/bundle.js.map +2 -2
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/aglapi/aglapisurface.document.js +2 -2
- package/dist_ts/classes.accountsactions.d.ts +11 -1
- package/dist_ts/classes.accountsactions.js +59 -2
- package/dist_ts/classes.controller.js +5 -5
- package/dist_ts/classes.flexaccountaccess.js +3 -2
- package/dist_ts/classes.harnessreleases.d.ts +14 -4
- package/dist_ts/classes.harnessreleases.js +28 -4
- package/dist_ts/classes.inferencegateway.d.ts +28 -3
- package/dist_ts/classes.inferencegateway.js +177 -61
- package/dist_ts/classes.inferenceplacement.d.ts +5 -3
- package/dist_ts/classes.inferenceplacement.js +2 -2
- package/dist_ts/classes.inferencerouter.d.ts +349 -91
- package/dist_ts/classes.inferencerouter.js +804 -297
- package/dist_ts/classes.inferenceservice.d.ts +14 -2
- package/dist_ts/classes.inferenceservice.js +53 -14
- package/dist_ts/classes.inferencespend.d.ts +339 -0
- package/dist_ts/classes.inferencespend.js +815 -0
- package/dist_ts/classes.inferenceusagecache.d.ts +8 -0
- package/dist_ts/classes.inferenceusagecache.js +9 -5
- package/dist_ts/classes.inferenceusagetap.d.ts +50 -9
- package/dist_ts/classes.inferenceusagetap.js +185 -31
- package/dist_ts/classes.proxycontrol.d.ts +3 -2
- package/dist_ts/classes.proxycontrol.js +1 -2
- package/dist_ts/classes.proxydaemon.js +3 -2
- package/dist_ts/classes.proxystore.d.ts +6 -0
- package/dist_ts/classes.proxystore.js +11 -2
- package/dist_ts/fleet/classes.claudeworkers.d.ts +5 -4
- package/dist_ts/fleet/classes.claudeworkers.js +10 -9
- package/dist_ts/functions.claudecoderelease.d.ts +12 -6
- package/dist_ts/functions.claudecoderelease.js +13 -7
- package/dist_ts/functions.inferencecli.js +12 -8
- package/dist_ts/interfaces.auth.d.ts +1 -1
- package/dist_ts/interfaces.auth.js +3 -1
- package/dist_ts/plugins.d.ts +3 -1
- package/dist_ts/plugins.js +7 -2
- package/dist_ts_authswitch/authority-apikeys.d.ts +32 -0
- package/dist_ts_authswitch/authority-apikeys.js +65 -0
- package/dist_ts_authswitch/authority-contract.d.ts +142 -28
- package/dist_ts_authswitch/authority-contract.js +48 -1
- package/dist_ts_authswitch/authority-overview.js +8 -1
- package/dist_ts_authswitch/authority-placement.d.ts +7 -2
- package/dist_ts_authswitch/authority-placement.js +10 -3
- package/dist_ts_authswitch/authority-runtime-contract.d.ts +2 -2
- package/dist_ts_authswitch/authority-spend.d.ts +103 -0
- package/dist_ts_authswitch/authority-spend.js +110 -0
- package/dist_ts_authswitch/authority-subscription.d.ts +12 -1
- package/dist_ts_authswitch/authority-subscription.js +24 -1
- package/dist_ts_authswitch/authority-usagelimit.d.ts +7 -4
- package/dist_ts_authswitch/authority-usagelimit.js +89 -39
- package/dist_ts_authswitch/authority-usagewindows.d.ts +4 -1
- package/dist_ts_authswitch/authority-usagewindows.js +41 -16
- package/dist_ts_authswitch/classes.authoritybroker.d.ts +30 -19
- package/dist_ts_authswitch/classes.authoritybroker.js +152 -61
- package/dist_ts_authswitch/classes.authoritycli.d.ts +9 -4
- package/dist_ts_authswitch/classes.authoritycli.js +94 -29
- package/dist_ts_authswitch/classes.authorityclient.d.ts +24 -7
- package/dist_ts_authswitch/classes.authorityclient.js +31 -11
- package/dist_ts_authswitch/classes.authoritydaemon.js +39 -12
- package/dist_ts_authswitch/classes.authoritydatabase.d.ts +28 -5
- package/dist_ts_authswitch/classes.authoritydatabase.js +171 -9
- package/dist_ts_authswitch/classes.authorityimport.js +2 -2
- package/dist_ts_authswitch/classes.authoritymodels.d.ts +71 -3
- package/dist_ts_authswitch/classes.authoritymodels.js +249 -20
- package/dist_ts_authswitch/classes.authorityregistry.js +4 -2
- package/dist_ts_authswitch/classes.authorityusage.d.ts +69 -7
- package/dist_ts_authswitch/classes.authorityusage.js +118 -4
- package/dist_ts_authswitch/classes.claudenative.d.ts +16 -7
- package/dist_ts_authswitch/classes.claudenative.js +29 -16
- package/dist_ts_authswitch/classes.claudesignin.js +5 -2
- package/dist_ts_authswitch/testsupport.d.ts +24 -5
- package/dist_ts_authswitch/testsupport.js +56 -12
- package/dist_ts_authswitch/ts_migration/0011_account_api_key_fields.d.ts +12 -0
- package/dist_ts_authswitch/ts_migration/0011_account_api_key_fields.js +21 -0
- package/dist_ts_authswitch/ts_migration/index.js +3 -1
- package/dist_ts_interfaces/functions.authorityscope.d.ts +18 -7
- package/dist_ts_interfaces/functions.authorityscope.js +35 -8
- package/dist_ts_interfaces/interfaces.d.ts +1 -1
- package/dist_ts_interfaces/interfaces.js +1 -1
- package/dist_ts_interfaces/plugins.d.ts +2 -1
- package/dist_ts_interfaces/plugins.js +7 -4
- package/dist_ts_interfaces/requests.accounts.d.ts +56 -0
- package/dist_ts_interfaces/requests.accounts.js +11 -1
- package/dist_ts_interfaces/requests.d.ts +2 -2
- package/dist_ts_interfaces/requests.js +1 -1
- package/docs/authswitch.md +75 -12
- package/package.json +5 -5
- package/readme.md +198 -21
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/aglapi/aglapisurface.document.ts +2 -2
- package/ts/classes.accountsactions.ts +75 -1
- package/ts/classes.controller.ts +4 -4
- package/ts/classes.flexaccountaccess.ts +2 -1
- package/ts/classes.harnessreleases.ts +25 -4
- package/ts/classes.inferencegateway.ts +184 -64
- package/ts/classes.inferenceplacement.ts +6 -4
- package/ts/classes.inferencerouter.ts +1026 -314
- package/ts/classes.inferenceservice.ts +56 -13
- package/ts/classes.inferencespend.ts +870 -0
- package/ts/classes.inferenceusagecache.ts +16 -4
- package/ts/classes.inferenceusagetap.ts +159 -34
- package/ts/classes.proxycontrol.ts +3 -3
- package/ts/classes.proxydaemon.ts +2 -1
- package/ts/classes.proxystore.ts +11 -1
- package/ts/fleet/classes.claudeworkers.ts +9 -8
- package/ts/functions.claudecoderelease.ts +13 -6
- package/ts/functions.inferencecli.ts +11 -7
- package/ts/interfaces.auth.ts +2 -0
- package/ts/plugins.ts +7 -0
- package/ts_authswitch/authority-apikeys.ts +85 -0
- package/ts_authswitch/authority-contract.ts +167 -29
- package/ts_authswitch/authority-overview.ts +7 -0
- package/ts_authswitch/authority-placement.ts +12 -4
- package/ts_authswitch/authority-runtime-contract.ts +2 -2
- package/ts_authswitch/authority-spend.ts +168 -0
- package/ts_authswitch/authority-subscription.ts +28 -1
- package/ts_authswitch/authority-usagelimit.ts +95 -40
- package/ts_authswitch/authority-usagewindows.ts +42 -17
- package/ts_authswitch/classes.authoritybroker.ts +161 -68
- package/ts_authswitch/classes.authoritycli.ts +108 -32
- package/ts_authswitch/classes.authorityclient.ts +41 -10
- package/ts_authswitch/classes.authoritydaemon.ts +43 -13
- package/ts_authswitch/classes.authoritydatabase.ts +178 -8
- package/ts_authswitch/classes.authorityimport.ts +1 -1
- package/ts_authswitch/classes.authoritymodels.ts +165 -19
- package/ts_authswitch/classes.authorityregistry.ts +3 -0
- package/ts_authswitch/classes.authorityusage.ts +171 -10
- package/ts_authswitch/classes.claudenative.ts +28 -15
- package/ts_authswitch/classes.claudesignin.ts +4 -1
- package/ts_authswitch/native-contracts.md +81 -20
- package/ts_authswitch/readme.md +1 -1
- package/ts_authswitch/testsupport.ts +58 -11
- package/ts_authswitch/ts_migration/0011_account_api_key_fields.ts +20 -0
- package/ts_authswitch/ts_migration/index.ts +2 -0
- package/ts_interfaces/functions.authorityscope.ts +43 -8
- package/ts_interfaces/interfaces.ts +1 -1
- package/ts_interfaces/plugins.ts +6 -3
- package/ts_interfaces/requests.accounts.ts +48 -0
- package/ts_interfaces/requests.ts +4 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/accounts.plugins.ts +3 -1
- package/ts_web/accounts.templates.ts +20 -11
- package/ts_web/classes.accountsreadmodel.ts +322 -70
- package/ts_web/elements.accounts.ts +219 -20
- package/ts_web/elements.codexconnections.ts +3 -1
- package/ts_web/plugins.ts +4 -2
|
@@ -3,6 +3,13 @@ type TUsageSnapshot = plugins.authswitchAuthority.IAuthSwitchUsageSnapshot;
|
|
|
3
3
|
export interface IInferenceUsageCacheOptions {
|
|
4
4
|
/** Reads one account's usage from the account service. */
|
|
5
5
|
read: (accountIdArg: string, signalArg: AbortSignal) => Promise<TUsageSnapshot>;
|
|
6
|
+
/**
|
|
7
|
+
* What a held reading reads as when it is handed out (`get`, `current`, `peek`), worked out in the same synchronous
|
|
8
|
+
* step that reads it: an API key's spend with the answers its accounts service has not acknowledged yet
|
|
9
|
+
* (`InferenceSpendOutbox.judged`). Their acknowledgement replaces the held reading and drops them in one step
|
|
10
|
+
* (`accept`), so a reading handed out never misses an answer. The held reading as it is when unset.
|
|
11
|
+
*/
|
|
12
|
+
view?: (accountIdArg: string, snapshotArg: TUsageSnapshot) => TUsageSnapshot;
|
|
6
13
|
/** How old a held reading may grow before a request reads it again (0: every request starts one shared read). */
|
|
7
14
|
refreshAfterMs?: number;
|
|
8
15
|
/** How long a request waits for that read before it routes on the held reading. */
|
|
@@ -44,6 +51,7 @@ export declare class InferenceUsageCache {
|
|
|
44
51
|
* one than held is ignored.
|
|
45
52
|
*/
|
|
46
53
|
accept(accountIdArg: string, snapshotArg: TUsageSnapshot): void;
|
|
54
|
+
private viewed;
|
|
47
55
|
/** Waits for a read, at most `msArg`; the read itself goes on and lands in the cache. */
|
|
48
56
|
private wait;
|
|
49
57
|
/** Forgets every reading and stops background reads. */
|
|
@@ -42,18 +42,19 @@ export class InferenceUsageCache {
|
|
|
42
42
|
this.refresh(accountIdArg, entry);
|
|
43
43
|
if (entry.inflight && this.freshWaitMs > 0)
|
|
44
44
|
await this.wait(entry.inflight, this.freshWaitMs, signalArg);
|
|
45
|
-
return entry.snapshot;
|
|
45
|
+
return this.viewed(accountIdArg, entry.snapshot);
|
|
46
46
|
}
|
|
47
47
|
this.refresh(accountIdArg, entry);
|
|
48
48
|
if (entry.inflight)
|
|
49
49
|
await this.wait(entry.inflight, this.firstReadTimeoutMs, signalArg);
|
|
50
50
|
if (entry.snapshot)
|
|
51
|
-
return entry.snapshot;
|
|
51
|
+
return this.viewed(accountIdArg, entry.snapshot);
|
|
52
52
|
throw entry.error instanceof Error ? entry.error : new Error('The account usage could not be read.');
|
|
53
53
|
}
|
|
54
54
|
/** The reading held for an account, without reading it again; `undefined` while none is held. */
|
|
55
55
|
peek(accountIdArg) {
|
|
56
|
-
|
|
56
|
+
const snapshot = this.entries.get(accountIdArg)?.snapshot;
|
|
57
|
+
return snapshot && this.viewed(accountIdArg, snapshot);
|
|
57
58
|
}
|
|
58
59
|
/**
|
|
59
60
|
* The reading a request would route on now, for the status: it starts the account's read as a request does (shared,
|
|
@@ -71,7 +72,7 @@ export class InferenceUsageCache {
|
|
|
71
72
|
this.refresh(accountIdArg, entry);
|
|
72
73
|
if (entry.inflight && this.freshWaitMs > 0)
|
|
73
74
|
await this.wait(entry.inflight, this.freshWaitMs, signalArg);
|
|
74
|
-
return entry.snapshot;
|
|
75
|
+
return entry.snapshot && this.viewed(accountIdArg, entry.snapshot);
|
|
75
76
|
}
|
|
76
77
|
/**
|
|
77
78
|
* Holds a reading the account service answered outside a read, as it answers an observation handed to it; an older
|
|
@@ -90,6 +91,9 @@ export class InferenceUsageCache {
|
|
|
90
91
|
entry.snapshot = snapshotArg;
|
|
91
92
|
entry.readAt = this.now();
|
|
92
93
|
}
|
|
94
|
+
viewed(accountIdArg, snapshotArg) {
|
|
95
|
+
return this.options.view ? this.options.view(accountIdArg, snapshotArg) : snapshotArg;
|
|
96
|
+
}
|
|
93
97
|
/** Waits for a read, at most `msArg`; the read itself goes on and lands in the cache. */
|
|
94
98
|
async wait(inflightArg, msArg, signalArg) {
|
|
95
99
|
await new Promise((resolve) => {
|
|
@@ -129,4 +133,4 @@ export class InferenceUsageCache {
|
|
|
129
133
|
})();
|
|
130
134
|
}
|
|
131
135
|
}
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pbmZlcmVuY2V1c2FnZWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY2xhc3Nlcy5pbmZlcmVuY2V1c2FnZWNhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBSXhDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxHQUFHLENBQUMsT0FBdUIsRUFBRSxPQUFtQyxFQUFXLEVBQUUsQ0FDM0YsQ0FBQyxPQUFPLEVBQUUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBVSxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsVUFBVSxLQUFLLElBQUk7T0FDaEcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFnQ3RFOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFTRCxPQUFPO0lBUm5CLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUNwQyxLQUFLLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUM5QixjQUFjLENBQVM7SUFDdkIsV0FBVyxDQUFTO0lBQ3BCLGtCQUFrQixDQUFTO0lBQzNCLFlBQVksQ0FBUztJQUNyQixHQUFHLENBQWU7SUFFbkMsWUFBNkIsT0FBb0M7dUJBQXBDLE9BQU87UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDO1FBQ2hELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLElBQUksTUFBTSxDQUFDO1FBQy9ELElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVks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
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import type { IInferenceTokenCounts } from './classes.inferenceusage.js';
|
|
3
|
+
import type { IInferenceAnsweredUsage, IInferenceResponsesAnswered } from './classes.inferencespend.js';
|
|
3
4
|
type TTokenUsage = plugins.authswitchUsageTokens.IAuthSwitchTokenUsage;
|
|
4
5
|
/** What the relay hands each chunk of an answer it passed on, and the end of the answer. */
|
|
5
6
|
export interface IInferenceUsageTap {
|
|
6
7
|
chunk(bytesArg: Uint8Array): void;
|
|
7
|
-
end
|
|
8
|
+
/** The answer ended; `wholeArg`: the provider's body was read to its end, not cut or cancelled. */
|
|
9
|
+
end(wholeArg: boolean): void;
|
|
8
10
|
}
|
|
9
11
|
/**
|
|
10
12
|
* Reads the tokens one Anthropic Messages answer used as its bytes pass to the client, without holding, changing,
|
|
@@ -14,20 +16,31 @@ export interface IInferenceUsageTap {
|
|
|
14
16
|
* cumulative), so only those events' data lines are parsed and every other line is skipped unread; a cut stream reports
|
|
15
17
|
* what arrived. A JSON answer states `usage` and `model` at its top level and is read at its end. Anything unreadable
|
|
16
18
|
* reports nothing: the estimate is the authority's, and the answer is never at stake.
|
|
19
|
+
*
|
|
20
|
+
* `answered`, given for an answer an API key served, takes at the end what the answer stated for its price: the model
|
|
21
|
+
* that answered and its usage object as sent, a stream's merged field by field from `message_start` and the
|
|
22
|
+
* `message_delta`s after it (one that omits `service_tier` keeps the one `message_start` stated), and whether the answer
|
|
23
|
+
* arrived whole (`message_stop`, or a JSON body read to its end). It is called also when the answer could not be read.
|
|
17
24
|
*/
|
|
18
25
|
export declare class InferenceClaudeUsageTap implements IInferenceUsageTap {
|
|
19
26
|
private readonly format;
|
|
20
27
|
private readonly report;
|
|
28
|
+
private readonly answered?;
|
|
21
29
|
private readonly decoder;
|
|
22
30
|
private line;
|
|
23
31
|
private skipping;
|
|
24
32
|
private event;
|
|
25
33
|
private model?;
|
|
26
34
|
private readonly stated;
|
|
35
|
+
/** The usage objects the answer stated, merged as sent, for its price. */
|
|
36
|
+
private raw?;
|
|
37
|
+
/** The stream reached `message_stop`, or the JSON body was read to its end. */
|
|
38
|
+
private complete;
|
|
27
39
|
private readonly json;
|
|
28
40
|
private jsonBytes;
|
|
29
41
|
private stopped;
|
|
30
|
-
|
|
42
|
+
private ended;
|
|
43
|
+
constructor(format: 'sse' | 'json', report: (usageArg: TTokenUsage) => void, answered?: ((answeredArg: IInferenceAnsweredUsage) => void) | undefined);
|
|
31
44
|
/** Reads a chunk the relay passed on; never throws. */
|
|
32
45
|
chunk(bytesArg: Uint8Array): void;
|
|
33
46
|
/** Reports the usage that arrived, once: at the end of the answer, also when it was cut or cancelled. */
|
|
@@ -42,29 +55,57 @@ export declare class InferenceClaudeUsageTap implements IInferenceUsageTap {
|
|
|
42
55
|
* Messages: never holding, changing or delaying the answer, and reporting once at its end.
|
|
43
56
|
*
|
|
44
57
|
* A stream (`sse`) states usage only in its terminal event (`response.completed`, `response.incomplete`,
|
|
45
|
-
* `response.failed`) as `response.usage`. A frame named by an `event:` line is read only when that name is terminal
|
|
46
|
-
* a data-only frame is kept up to the frame limit and parsed only when it names a terminal
|
|
47
|
-
*
|
|
48
|
-
*
|
|
58
|
+
* `response.failed`) as `response.usage`. A frame named by an `event:` line is read only when that name is terminal or
|
|
59
|
+
* `response.output_item.done`; a data-only frame is kept up to the frame limit and parsed only when it names a terminal
|
|
60
|
+
* type, or a finished output item that is a search call. A JSON answer states `usage` at its top level. `input_tokens`
|
|
61
|
+
* counts every input token, so the cached reads (`cached_tokens`) and cache writes (`cache_write_tokens`) of
|
|
62
|
+
* `input_tokens_details` are taken out of it.
|
|
63
|
+
*
|
|
64
|
+
* `answered`, given for an answer an OpenAI API key served, takes at the end what the answer stated for its price
|
|
65
|
+
* (`IInferenceResponsesAnswered`): whether its terminal event or its JSON body was read, arrived too large to read, or
|
|
66
|
+
* never arrived (`end`'s `wholeArg` says whether a JSON body was read to its end); the model, service tier, status and
|
|
67
|
+
* usage the response stated; and the ids of its web and file search calls, from the finished output items and the
|
|
68
|
+
* terminal response's `output`, each once.
|
|
49
69
|
*/
|
|
50
70
|
export declare class InferenceResponsesUsageTap implements IInferenceUsageTap {
|
|
51
71
|
private readonly format;
|
|
52
72
|
private readonly report;
|
|
73
|
+
private readonly answered?;
|
|
53
74
|
private readonly decoder;
|
|
54
75
|
private line;
|
|
55
76
|
private skipping;
|
|
56
77
|
private event;
|
|
57
78
|
private usage?;
|
|
79
|
+
/** The response a terminal event or the JSON body stated, for the answer's price. */
|
|
80
|
+
private response?;
|
|
81
|
+
/** A terminal event was read (`read`), or one arrived too large or malformed to read (`unreadable`). */
|
|
82
|
+
private terminal;
|
|
83
|
+
private readonly webSearchCalls;
|
|
84
|
+
private readonly fileSearchCalls;
|
|
85
|
+
private unidentifiedCalls;
|
|
58
86
|
private readonly json;
|
|
59
87
|
private jsonBytes;
|
|
88
|
+
private jsonOverflow;
|
|
60
89
|
private stopped;
|
|
61
|
-
|
|
90
|
+
/** Reading failed on something that passed: what the answer stated is not known whole. */
|
|
91
|
+
private failed;
|
|
92
|
+
private ended;
|
|
93
|
+
constructor(format: 'sse' | 'json', report: (countsArg: IInferenceTokenCounts) => void, answered?: ((answeredArg: IInferenceResponsesAnswered) => void) | undefined);
|
|
62
94
|
/** Reads a chunk the relay passed on; never throws. */
|
|
63
95
|
chunk(bytesArg: Uint8Array): void;
|
|
64
|
-
/**
|
|
65
|
-
|
|
96
|
+
/**
|
|
97
|
+
* Reports the usage the answer stated, once; a stream cut before its terminal event reports nothing. `wholeArg`: the
|
|
98
|
+
* provider's body was read to its end, which only a JSON answer needs to be told.
|
|
99
|
+
*/
|
|
100
|
+
end(wholeArg?: boolean): void;
|
|
66
101
|
private text;
|
|
102
|
+
/** A line longer than any frame read is not read; a terminal event that long arrived and could not be read. */
|
|
103
|
+
private overflow;
|
|
67
104
|
private handle;
|
|
105
|
+
/** Takes what a terminal response (or a JSON answer) states: its usage, model, tier and status, and its search calls. */
|
|
106
|
+
private state;
|
|
107
|
+
/** Counts a finished output item that is a web or file search call, once per id. */
|
|
108
|
+
private item;
|
|
68
109
|
private counts;
|
|
69
110
|
}
|
|
70
111
|
export {};
|
|
@@ -16,22 +16,34 @@ const count = (valueArg) => Number.isSafeInteger(valueArg) && valueArg >= 0 ? va
|
|
|
16
16
|
* cumulative), so only those events' data lines are parsed and every other line is skipped unread; a cut stream reports
|
|
17
17
|
* what arrived. A JSON answer states `usage` and `model` at its top level and is read at its end. Anything unreadable
|
|
18
18
|
* reports nothing: the estimate is the authority's, and the answer is never at stake.
|
|
19
|
+
*
|
|
20
|
+
* `answered`, given for an answer an API key served, takes at the end what the answer stated for its price: the model
|
|
21
|
+
* that answered and its usage object as sent, a stream's merged field by field from `message_start` and the
|
|
22
|
+
* `message_delta`s after it (one that omits `service_tier` keeps the one `message_start` stated), and whether the answer
|
|
23
|
+
* arrived whole (`message_stop`, or a JSON body read to its end). It is called also when the answer could not be read.
|
|
19
24
|
*/
|
|
20
25
|
export class InferenceClaudeUsageTap {
|
|
21
26
|
format;
|
|
22
27
|
report;
|
|
28
|
+
answered;
|
|
23
29
|
decoder = new TextDecoder();
|
|
24
30
|
line = '';
|
|
25
31
|
skipping = false;
|
|
26
32
|
event = '';
|
|
27
33
|
model;
|
|
28
34
|
stated = {};
|
|
35
|
+
/** The usage objects the answer stated, merged as sent, for its price. */
|
|
36
|
+
raw;
|
|
37
|
+
/** The stream reached `message_stop`, or the JSON body was read to its end. */
|
|
38
|
+
complete = false;
|
|
29
39
|
json = [];
|
|
30
40
|
jsonBytes = 0;
|
|
31
41
|
stopped = false;
|
|
32
|
-
|
|
42
|
+
ended = false;
|
|
43
|
+
constructor(format, report, answered) {
|
|
33
44
|
this.format = format;
|
|
34
45
|
this.report = report;
|
|
46
|
+
this.answered = answered;
|
|
35
47
|
}
|
|
36
48
|
/** Reads a chunk the relay passed on; never throws. */
|
|
37
49
|
chunk(bytesArg) {
|
|
@@ -40,8 +52,10 @@ export class InferenceClaudeUsageTap {
|
|
|
40
52
|
try {
|
|
41
53
|
if (this.format === 'json') {
|
|
42
54
|
this.jsonBytes += bytesArg.byteLength;
|
|
55
|
+
// A body too large to read is an answer that arrived all the same, whose usage could not be read.
|
|
43
56
|
if (this.jsonBytes > maximumJsonBytes) {
|
|
44
57
|
this.stopped = true;
|
|
58
|
+
this.complete = true;
|
|
45
59
|
this.json.length = 0;
|
|
46
60
|
return;
|
|
47
61
|
}
|
|
@@ -56,10 +70,14 @@ export class InferenceClaudeUsageTap {
|
|
|
56
70
|
}
|
|
57
71
|
/** Reports the usage that arrived, once: at the end of the answer, also when it was cut or cancelled. */
|
|
58
72
|
end() {
|
|
59
|
-
if (this.
|
|
73
|
+
if (this.ended)
|
|
60
74
|
return;
|
|
75
|
+
this.ended = true;
|
|
61
76
|
try {
|
|
77
|
+
if (this.stopped)
|
|
78
|
+
return;
|
|
62
79
|
if (this.format === 'json') {
|
|
80
|
+
this.complete = true;
|
|
63
81
|
const body = record(JSON.parse(new TextDecoder().decode(Buffer.concat(this.json))));
|
|
64
82
|
this.json.length = 0;
|
|
65
83
|
if (typeof body?.model === 'string')
|
|
@@ -79,6 +97,13 @@ export class InferenceClaudeUsageTap {
|
|
|
79
97
|
catch {
|
|
80
98
|
this.stopped = true;
|
|
81
99
|
}
|
|
100
|
+
finally {
|
|
101
|
+
try {
|
|
102
|
+
this.answered?.({ ...(this.model === undefined ? {} : { model: this.model }), ...(this.raw ? { usage: this.raw } : {}),
|
|
103
|
+
complete: this.complete });
|
|
104
|
+
}
|
|
105
|
+
catch { /* the answer is never at stake */ }
|
|
106
|
+
}
|
|
82
107
|
}
|
|
83
108
|
text(textArg) {
|
|
84
109
|
let start = 0;
|
|
@@ -114,6 +139,8 @@ export class InferenceClaudeUsageTap {
|
|
|
114
139
|
}
|
|
115
140
|
if (lineArg.startsWith('event:')) {
|
|
116
141
|
this.event = lineArg.slice(6).trim();
|
|
142
|
+
if (this.event === 'message_stop')
|
|
143
|
+
this.complete = true;
|
|
117
144
|
return;
|
|
118
145
|
}
|
|
119
146
|
if (!lineArg.startsWith('data:') || !usageEvents.has(this.event))
|
|
@@ -132,6 +159,14 @@ export class InferenceClaudeUsageTap {
|
|
|
132
159
|
state(usageArg) {
|
|
133
160
|
if (!usageArg)
|
|
134
161
|
return;
|
|
162
|
+
// As sent, later fields over earlier ones; an object field (`cache_creation`, `server_tool_use`) merges its own fields.
|
|
163
|
+
const raw = this.raw ?? {};
|
|
164
|
+
for (const [name, value] of Object.entries(usageArg)) {
|
|
165
|
+
const held = record(raw[name]);
|
|
166
|
+
const next = record(value);
|
|
167
|
+
raw[name] = held && next ? { ...held, ...next } : value;
|
|
168
|
+
}
|
|
169
|
+
this.raw = raw;
|
|
135
170
|
for (const name of ['input_tokens', 'output_tokens', 'cache_read_input_tokens', 'cache_creation_input_tokens']) {
|
|
136
171
|
const value = count(usageArg[name]);
|
|
137
172
|
if (value !== undefined)
|
|
@@ -160,30 +195,54 @@ export class InferenceClaudeUsageTap {
|
|
|
160
195
|
}
|
|
161
196
|
/** The Responses stream events that end an answer and carry the whole response with its `usage`. */
|
|
162
197
|
const responsesTerminalEvents = new Set(['response.completed', 'response.incomplete', 'response.failed']);
|
|
198
|
+
/** The Responses stream event that carries each finished output item, a web or file search call among them. */
|
|
199
|
+
const responsesItemDoneEvent = 'response.output_item.done';
|
|
200
|
+
/** The output item types of a search OpenAI runs and bills per call, and the call fee each counts under. */
|
|
201
|
+
const searchCallTypes = new Map([['web_search_call', 'web'], ['file_search_call', 'file']]);
|
|
163
202
|
/**
|
|
164
203
|
* Reads the tokens one OpenAI Responses answer used as its bytes pass to the client, as `InferenceClaudeUsageTap` does for
|
|
165
204
|
* Messages: never holding, changing or delaying the answer, and reporting once at its end.
|
|
166
205
|
*
|
|
167
206
|
* A stream (`sse`) states usage only in its terminal event (`response.completed`, `response.incomplete`,
|
|
168
|
-
* `response.failed`) as `response.usage`. A frame named by an `event:` line is read only when that name is terminal
|
|
169
|
-
* a data-only frame is kept up to the frame limit and parsed only when it names a terminal
|
|
170
|
-
*
|
|
171
|
-
*
|
|
207
|
+
* `response.failed`) as `response.usage`. A frame named by an `event:` line is read only when that name is terminal or
|
|
208
|
+
* `response.output_item.done`; a data-only frame is kept up to the frame limit and parsed only when it names a terminal
|
|
209
|
+
* type, or a finished output item that is a search call. A JSON answer states `usage` at its top level. `input_tokens`
|
|
210
|
+
* counts every input token, so the cached reads (`cached_tokens`) and cache writes (`cache_write_tokens`) of
|
|
211
|
+
* `input_tokens_details` are taken out of it.
|
|
212
|
+
*
|
|
213
|
+
* `answered`, given for an answer an OpenAI API key served, takes at the end what the answer stated for its price
|
|
214
|
+
* (`IInferenceResponsesAnswered`): whether its terminal event or its JSON body was read, arrived too large to read, or
|
|
215
|
+
* never arrived (`end`'s `wholeArg` says whether a JSON body was read to its end); the model, service tier, status and
|
|
216
|
+
* usage the response stated; and the ids of its web and file search calls, from the finished output items and the
|
|
217
|
+
* terminal response's `output`, each once.
|
|
172
218
|
*/
|
|
173
219
|
export class InferenceResponsesUsageTap {
|
|
174
220
|
format;
|
|
175
221
|
report;
|
|
222
|
+
answered;
|
|
176
223
|
decoder = new TextDecoder();
|
|
177
224
|
line = '';
|
|
178
225
|
skipping = false;
|
|
179
226
|
event = '';
|
|
180
227
|
usage;
|
|
228
|
+
/** The response a terminal event or the JSON body stated, for the answer's price. */
|
|
229
|
+
response;
|
|
230
|
+
/** A terminal event was read (`read`), or one arrived too large or malformed to read (`unreadable`). */
|
|
231
|
+
terminal = 'none';
|
|
232
|
+
webSearchCalls = new Set();
|
|
233
|
+
fileSearchCalls = new Set();
|
|
234
|
+
unidentifiedCalls = false;
|
|
181
235
|
json = [];
|
|
182
236
|
jsonBytes = 0;
|
|
237
|
+
jsonOverflow = false;
|
|
183
238
|
stopped = false;
|
|
184
|
-
|
|
239
|
+
/** Reading failed on something that passed: what the answer stated is not known whole. */
|
|
240
|
+
failed = false;
|
|
241
|
+
ended = false;
|
|
242
|
+
constructor(format, report, answered) {
|
|
185
243
|
this.format = format;
|
|
186
244
|
this.report = report;
|
|
245
|
+
this.answered = answered;
|
|
187
246
|
}
|
|
188
247
|
/** Reads a chunk the relay passed on; never throws. */
|
|
189
248
|
chunk(bytesArg) {
|
|
@@ -194,6 +253,7 @@ export class InferenceResponsesUsageTap {
|
|
|
194
253
|
this.jsonBytes += bytesArg.byteLength;
|
|
195
254
|
if (this.jsonBytes > maximumJsonBytes) {
|
|
196
255
|
this.stopped = true;
|
|
256
|
+
this.jsonOverflow = true;
|
|
197
257
|
this.json.length = 0;
|
|
198
258
|
return;
|
|
199
259
|
}
|
|
@@ -204,30 +264,63 @@ export class InferenceResponsesUsageTap {
|
|
|
204
264
|
}
|
|
205
265
|
catch {
|
|
206
266
|
this.stopped = true;
|
|
267
|
+
this.failed = true;
|
|
207
268
|
}
|
|
208
269
|
}
|
|
209
|
-
/**
|
|
210
|
-
|
|
211
|
-
|
|
270
|
+
/**
|
|
271
|
+
* Reports the usage the answer stated, once; a stream cut before its terminal event reports nothing. `wholeArg`: the
|
|
272
|
+
* provider's body was read to its end, which only a JSON answer needs to be told.
|
|
273
|
+
*/
|
|
274
|
+
end(wholeArg = true) {
|
|
275
|
+
if (this.ended)
|
|
212
276
|
return;
|
|
277
|
+
this.ended = true;
|
|
213
278
|
try {
|
|
214
|
-
if (this.
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
279
|
+
if (!this.stopped) {
|
|
280
|
+
if (this.format === 'json') {
|
|
281
|
+
if (wholeArg) {
|
|
282
|
+
try {
|
|
283
|
+
const body = record(JSON.parse(new TextDecoder().decode(Buffer.concat(this.json))));
|
|
284
|
+
if (body)
|
|
285
|
+
this.state(body);
|
|
286
|
+
else
|
|
287
|
+
this.terminal = 'unreadable';
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
this.terminal = 'unreadable';
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
this.json.length = 0;
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
this.text(this.decoder.decode());
|
|
297
|
+
if (this.line && !this.skipping)
|
|
298
|
+
this.handle(this.line);
|
|
299
|
+
}
|
|
300
|
+
this.stopped = true;
|
|
301
|
+
const counts = this.counts();
|
|
302
|
+
if (counts)
|
|
303
|
+
this.report(counts);
|
|
223
304
|
}
|
|
224
|
-
this.stopped = true;
|
|
225
|
-
const counts = this.counts();
|
|
226
|
-
if (counts)
|
|
227
|
-
this.report(counts);
|
|
228
305
|
}
|
|
229
306
|
catch {
|
|
230
307
|
this.stopped = true;
|
|
308
|
+
this.failed = true;
|
|
309
|
+
}
|
|
310
|
+
finally {
|
|
311
|
+
try {
|
|
312
|
+
const outcome = this.format === 'json' && this.jsonOverflow ? (wholeArg ? 'unreadable' : 'cut')
|
|
313
|
+
: this.terminal === 'read' && !this.failed ? 'answered'
|
|
314
|
+
: this.terminal === 'unreadable' || this.failed ? 'unreadable' : 'cut';
|
|
315
|
+
const response = this.response;
|
|
316
|
+
this.answered?.({ outcome,
|
|
317
|
+
...(typeof response?.status === 'string' ? { status: response.status } : {}),
|
|
318
|
+
...(typeof response?.model === 'string' ? { model: response.model } : {}),
|
|
319
|
+
...(response && 'service_tier' in response ? { serviceTier: response.service_tier } : {}),
|
|
320
|
+
...(this.usage ? { usage: this.usage } : {}),
|
|
321
|
+
webSearchCalls: this.webSearchCalls, fileSearchCalls: this.fileSearchCalls, unidentifiedCalls: this.unidentifiedCalls });
|
|
322
|
+
}
|
|
323
|
+
catch { /* the answer is never at stake */ }
|
|
231
324
|
}
|
|
232
325
|
}
|
|
233
326
|
text(textArg) {
|
|
@@ -237,9 +330,15 @@ export class InferenceResponsesUsageTap {
|
|
|
237
330
|
if (newline === -1) {
|
|
238
331
|
if (!this.skipping) {
|
|
239
332
|
this.line += textArg.slice(start);
|
|
240
|
-
// A data line of a named event without usage, or one longer than any frame read, is not
|
|
241
|
-
|
|
242
|
-
|
|
333
|
+
// A data line of a named event without usage or a finished item, or one longer than any frame read, is not
|
|
334
|
+
// kept; a terminal one that long arrived and could not be read.
|
|
335
|
+
if (this.line.startsWith('data:') && this.event !== '' && !responsesTerminalEvents.has(this.event)
|
|
336
|
+
&& this.event !== responsesItemDoneEvent) {
|
|
337
|
+
this.skipping = true;
|
|
338
|
+
this.line = '';
|
|
339
|
+
}
|
|
340
|
+
else if (this.line.length > maximumResponsesFrameLength) {
|
|
341
|
+
this.overflow(this.line);
|
|
243
342
|
this.skipping = true;
|
|
244
343
|
this.line = '';
|
|
245
344
|
}
|
|
@@ -255,9 +354,19 @@ export class InferenceResponsesUsageTap {
|
|
|
255
354
|
}
|
|
256
355
|
const line = this.line + piece;
|
|
257
356
|
this.line = '';
|
|
357
|
+
if (line.length > maximumResponsesFrameLength) {
|
|
358
|
+
this.overflow(line);
|
|
359
|
+
continue;
|
|
360
|
+
}
|
|
258
361
|
this.handle(line.endsWith('\r') ? line.slice(0, -1) : line);
|
|
259
362
|
}
|
|
260
363
|
}
|
|
364
|
+
/** A line longer than any frame read is not read; a terminal event that long arrived and could not be read. */
|
|
365
|
+
overflow(lineArg) {
|
|
366
|
+
if (lineArg.startsWith('data:') && this.terminal === 'none' && (this.event !== '' ? responsesTerminalEvents.has(this.event)
|
|
367
|
+
: [...responsesTerminalEvents].some((typeArg) => lineArg.includes(`"${typeArg}"`))))
|
|
368
|
+
this.terminal = 'unreadable';
|
|
369
|
+
}
|
|
261
370
|
handle(lineArg) {
|
|
262
371
|
if (lineArg === '') {
|
|
263
372
|
this.event = '';
|
|
@@ -269,15 +378,60 @@ export class InferenceResponsesUsageTap {
|
|
|
269
378
|
}
|
|
270
379
|
if (!lineArg.startsWith('data:'))
|
|
271
380
|
return;
|
|
272
|
-
|
|
273
|
-
:
|
|
381
|
+
const terminal = this.event !== '' ? responsesTerminalEvents.has(this.event)
|
|
382
|
+
: [...responsesTerminalEvents].some((typeArg) => lineArg.includes(typeArg));
|
|
383
|
+
const searchCall = (this.event === '' || this.event === responsesItemDoneEvent) && lineArg.includes(responsesItemDoneEvent)
|
|
384
|
+
&& [...searchCallTypes.keys()].some((typeArg) => lineArg.includes(typeArg));
|
|
385
|
+
if (!terminal && !searchCall)
|
|
274
386
|
return;
|
|
275
|
-
|
|
387
|
+
let data;
|
|
388
|
+
try {
|
|
389
|
+
data = record(JSON.parse(lineArg.slice(5)));
|
|
390
|
+
}
|
|
391
|
+
catch {
|
|
392
|
+
// A terminal event or a search call that cannot be read: what the answer cost is not known.
|
|
393
|
+
if (this.event !== '' ? terminal : true)
|
|
394
|
+
this.terminal = this.terminal === 'read' ? 'read' : 'unreadable';
|
|
395
|
+
if (searchCall)
|
|
396
|
+
this.unidentifiedCalls = true;
|
|
397
|
+
return;
|
|
398
|
+
}
|
|
399
|
+
if (data?.type === responsesItemDoneEvent) {
|
|
400
|
+
this.item(data.item);
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
276
403
|
if (typeof data?.type !== 'string' || !responsesTerminalEvents.has(data.type))
|
|
277
404
|
return;
|
|
278
|
-
const
|
|
405
|
+
const response = record(data.response);
|
|
406
|
+
if (!response) {
|
|
407
|
+
if (this.terminal === 'none')
|
|
408
|
+
this.terminal = 'unreadable';
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
this.state(response);
|
|
412
|
+
}
|
|
413
|
+
/** Takes what a terminal response (or a JSON answer) states: its usage, model, tier and status, and its search calls. */
|
|
414
|
+
state(responseArg) {
|
|
415
|
+
this.terminal = 'read';
|
|
416
|
+
this.response = responseArg;
|
|
417
|
+
const usage = record(responseArg.usage);
|
|
279
418
|
if (usage)
|
|
280
419
|
this.usage = usage;
|
|
420
|
+
if (Array.isArray(responseArg.output))
|
|
421
|
+
for (const item of responseArg.output)
|
|
422
|
+
this.item(item);
|
|
423
|
+
}
|
|
424
|
+
/** Counts a finished output item that is a web or file search call, once per id. */
|
|
425
|
+
item(itemArg) {
|
|
426
|
+
const item = record(itemArg);
|
|
427
|
+
const kind = typeof item?.type === 'string' ? searchCallTypes.get(item.type) : undefined;
|
|
428
|
+
if (!kind)
|
|
429
|
+
return;
|
|
430
|
+
if (typeof item.id !== 'string' || !item.id) {
|
|
431
|
+
this.unidentifiedCalls = true;
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
(kind === 'web' ? this.webSearchCalls : this.fileSearchCalls).add(item.id);
|
|
281
435
|
}
|
|
282
436
|
counts() {
|
|
283
437
|
const usage = this.usage;
|
|
@@ -293,4 +447,4 @@ export class InferenceResponsesUsageTap {
|
|
|
293
447
|
return counts.inputTokens + counts.outputTokens + counts.cacheReadTokens + counts.cacheWriteTokens > 0 ? counts : undefined;
|
|
294
448
|
}
|
|
295
449
|
}
|
|
296
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pbmZlcmVuY2V1c2FnZXRhcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NsYXNzZXMuaW5mZXJlbmNldXNhZ2V0YXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFLeEMsdUhBQXVIO0FBQ3ZILE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDekMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRXRDLCtIQUErSDtBQUMvSCxNQUFNLDJCQUEyQixHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRXBELHVFQUF1RTtBQUN2RSxNQUFNLFdBQVcsR0FBd0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQztBQUVyRixNQUFNLE1BQU0sR0FBRyxDQUFDLFFBQWlCLEVBQXVDLEVBQUUsQ0FDeEUsT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFtQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDbEksTUFBTSxLQUFLLEdBQUcsQ0FBQyxRQUFpQixFQUFzQixFQUFFLENBQ3RELE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUssUUFBbUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQWtCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQWtCL0Y7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sdUJBQXVCO0lBV0wsTUFBTTtJQUFtQyxNQUFNO0lBVjNELE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ3JDLElBQUksR0FBRyxFQUFFLENBQUM7SUFDVixRQUFRLEdBQUcsS0FB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
|
|
450
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5pbmZlcmVuY2V1c2FnZXRhcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NsYXNzZXMuaW5mZXJlbmNldXNhZ2V0YXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFNeEMsdUhBQXVIO0FBQ3ZILE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDekMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRXRDLCtIQUErSDtBQUMvSCxNQUFNLDJCQUEyQixHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRXBELHVFQUF1RTtBQUN2RSxNQUFNLFdBQVcsR0FBd0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQztBQUVyRixNQUFNLE1BQU0sR0FBRyxDQUFDLFFBQWlCLEVBQXVDLEVBQUUsQ0FDeEUsT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFtQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDbEksTUFBTSxLQUFLLEdBQUcsQ0FBQyxRQUFpQixFQUFzQixFQUFFLENBQ3RELE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUssUUFBbUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQWtCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQW1CL0Y7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sT0FBTyx1QkFBdUI7SUFnQkwsTUFBTTtJQUFtQyxNQUFNO0lBQ3pELFFBQVE7SUFoQlYsT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDckMsSUFBSSxHQUFHLEVBQUUsQ0FBQztJ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
|