@providerkit/core 0.21.1 → 0.23.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/README.md +7 -7
- package/dist/attribution.d.ts +2 -2
- package/dist/auth/flows.d.ts.map +1 -1
- package/dist/auth/flows.js +5 -5
- package/dist/auth/flows.js.map +1 -1
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +1 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/oauth.d.ts +12 -0
- package/dist/auth/oauth.d.ts.map +1 -1
- package/dist/auth/oauth.js +19 -1
- package/dist/auth/oauth.js.map +1 -1
- package/dist/auth/token-source.d.ts +9 -3
- package/dist/auth/token-source.d.ts.map +1 -1
- package/dist/auth/token-source.js +24 -9
- package/dist/auth/token-source.js.map +1 -1
- package/dist/auth/with-token.d.ts +29 -0
- package/dist/auth/with-token.d.ts.map +1 -0
- package/dist/auth/with-token.js +85 -0
- package/dist/auth/with-token.js.map +1 -0
- package/dist/capability.d.ts +9 -9
- package/dist/capability.js +9 -9
- package/dist/capability.js.map +1 -1
- package/dist/context.d.ts +43 -5
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +123 -4
- package/dist/context.js.map +1 -1
- package/dist/errors.d.ts +26 -17
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +57 -18
- package/dist/errors.js.map +1 -1
- package/dist/fallback.d.ts +45 -1
- package/dist/fallback.d.ts.map +1 -1
- package/dist/fallback.js +138 -75
- package/dist/fallback.js.map +1 -1
- package/dist/image.d.ts +1 -1
- package/dist/image.d.ts.map +1 -1
- package/dist/jev.d.ts +9 -9
- package/dist/jev.d.ts.map +1 -1
- package/dist/jev.js +1 -1
- package/dist/key-pool.d.ts +14 -8
- package/dist/key-pool.d.ts.map +1 -1
- package/dist/key-pool.js +35 -18
- package/dist/key-pool.js.map +1 -1
- package/dist/presets.d.ts +33 -24
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +25 -14
- package/dist/presets.js.map +1 -1
- package/dist/providers/anthropic.d.ts +5 -5
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +89 -34
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/factory.d.ts +2 -2
- package/dist/providers/factory.d.ts.map +1 -1
- package/dist/providers/factory.js +2 -1
- package/dist/providers/factory.js.map +1 -1
- package/dist/providers/gemini.d.ts +8 -2
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +117 -41
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/openai.d.ts +12 -9
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +72 -21
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/responses.d.ts +3 -3
- package/dist/providers/responses.d.ts.map +1 -1
- package/dist/providers/responses.js +103 -57
- package/dist/providers/responses.js.map +1 -1
- package/dist/providers/zai.d.ts +2 -2
- package/dist/providers/zai.js +2 -2
- package/dist/rate-limit.d.ts +13 -3
- package/dist/rate-limit.d.ts.map +1 -1
- package/dist/rate-limit.js +10 -4
- package/dist/rate-limit.js.map +1 -1
- package/dist/retry.d.ts +16 -5
- package/dist/retry.d.ts.map +1 -1
- package/dist/retry.js +29 -16
- package/dist/retry.js.map +1 -1
- package/dist/schema.d.ts +6 -6
- package/dist/schema.js +8 -8
- package/dist/tool-args.d.ts +23 -1
- package/dist/tool-args.d.ts.map +1 -1
- package/dist/tool-args.js +30 -2
- package/dist/tool-args.js.map +1 -1
- package/dist/tools.d.ts +3 -3
- package/dist/tools.js +2 -2
- package/dist/tools.js.map +1 -1
- package/dist/transport.d.ts +40 -10
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +82 -21
- package/dist/transport.js.map +1 -1
- package/dist/types.d.ts +37 -23
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -11
- package/dist/types.js.map +1 -1
- package/dist/usage.d.ts +4 -4
- package/dist/usage.d.ts.map +1 -1
- package/dist/usage.js +3 -3
- package/dist/usage.js.map +1 -1
- package/dist/watchdog.d.ts +14 -12
- package/dist/watchdog.d.ts.map +1 -1
- package/dist/watchdog.js +35 -16
- package/dist/watchdog.js.map +1 -1
- package/dist/zod.d.ts +4 -4
- package/dist/zod.js +3 -3
- package/package.json +1 -1
- package/src/attribution.ts +2 -2
- package/src/auth/flows.ts +5 -4
- package/src/auth/index.ts +1 -0
- package/src/auth/oauth.ts +23 -1
- package/src/auth/token-source.ts +30 -11
- package/src/auth/with-token.ts +97 -0
- package/src/capability.ts +12 -12
- package/src/context.ts +141 -6
- package/src/errors.ts +63 -23
- package/src/fallback.ts +173 -75
- package/src/image.ts +1 -1
- package/src/jev.ts +11 -11
- package/src/key-pool.ts +37 -20
- package/src/presets.ts +38 -24
- package/src/providers/anthropic.ts +97 -38
- package/src/providers/factory.ts +4 -3
- package/src/providers/gemini.ts +121 -44
- package/src/providers/openai.ts +78 -25
- package/src/providers/responses.ts +113 -61
- package/src/providers/zai.ts +2 -2
- package/src/rate-limit.ts +35 -7
- package/src/retry.ts +46 -15
- package/src/schema.ts +8 -8
- package/src/tool-args.ts +46 -2
- package/src/tools.ts +4 -4
- package/src/transport.ts +103 -23
- package/src/types.ts +37 -23
- package/src/usage.ts +5 -5
- package/src/watchdog.ts +38 -19
- package/src/zod.ts +4 -4
package/dist/tool-args.js
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
// `\uXXXX`, which JSON.parse decodes correctly. Some escape it twice and
|
|
13
13
|
// emit `\\u00e7`, so even a clean parse leaves six literal characters
|
|
14
14
|
// standing and a Portuguese answer reaches the user as `atenção`.
|
|
15
|
+
import { ProviderError } from "./errors.js";
|
|
15
16
|
function isRecord(value) {
|
|
16
17
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
17
18
|
}
|
|
@@ -53,7 +54,7 @@ function unescapeJson(text) {
|
|
|
53
54
|
/**
|
|
54
55
|
* Best-effort recovery of `"key": "value"` string fields from truncated JSON.
|
|
55
56
|
*
|
|
56
|
-
* Only strings: they are what a summary field
|
|
57
|
+
* Only strings: they are what a summary field (the one worth rescuing) is
|
|
57
58
|
* made of, and a closing quote is the single reliable boundary in a partial
|
|
58
59
|
* stream. Numbers, booleans and objects are dropped, because a salvaged
|
|
59
60
|
* half-value is worse than none.
|
|
@@ -122,6 +123,33 @@ export function normalizeToolId(id, prefix = "call_pk_") {
|
|
|
122
123
|
}
|
|
123
124
|
return clean;
|
|
124
125
|
}
|
|
126
|
+
/**
|
|
127
|
+
* Make a turn's tool calls runnable before its finish goes out, or fail the turn.
|
|
128
|
+
*
|
|
129
|
+
* A call with no name can't run: nothing says which tool to dispatch. It used to
|
|
130
|
+
* pass through (the Messages reader wrote `""` for both fields), and the loop
|
|
131
|
+
* failed one step later with nothing to say why. It throws `overload` now, a
|
|
132
|
+
* broken turn the same request usually does not repeat; cc-proxy answers it
|
|
133
|
+
* with a 502.
|
|
134
|
+
*
|
|
135
|
+
* A call with no id still can run. It gets one from `normalizeToolId`, written
|
|
136
|
+
* back into `calls` and returned as the deltas to send, so the result has an id
|
|
137
|
+
* to quote. An id the vendor did send is never rewritten: the four wires must
|
|
138
|
+
* agree on it (invariant 10), and repeated ids are history repair's job.
|
|
139
|
+
*/
|
|
140
|
+
export function settleToolCalls(provider, calls) {
|
|
141
|
+
const minted = [];
|
|
142
|
+
for (const call of calls) {
|
|
143
|
+
if (!call.name.trim()) {
|
|
144
|
+
throw new ProviderError(provider, "overload", `${provider}: tool call ${call.index} came with no name, so no tool can run it`);
|
|
145
|
+
}
|
|
146
|
+
if (!call.id.trim()) {
|
|
147
|
+
call.id = normalizeToolId(call.id);
|
|
148
|
+
minted.push({ index: call.index, id: call.id });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return minted;
|
|
152
|
+
}
|
|
125
153
|
/**
|
|
126
154
|
* Parse a tool call's raw argument string into an object, salvaging what a
|
|
127
155
|
* truncated stream left behind, resolving concatenated JSON, and healing
|
|
@@ -146,7 +174,7 @@ export function parseToolArgs(raw) {
|
|
|
146
174
|
// A non-object payload is a protocol violation, not a value to pass on.
|
|
147
175
|
return healArgs(isRecord(parsed) ? parsed : {});
|
|
148
176
|
}
|
|
149
|
-
/** Whether `raw` parses at all
|
|
177
|
+
/** Whether `raw` parses at all. Lets a caller tell a truncated tool call from
|
|
150
178
|
* an intact one, since `parseToolArgs` deliberately never throws. */
|
|
151
179
|
export function isCompleteJson(raw) {
|
|
152
180
|
if (!raw.trim())
|
package/dist/tool-args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-args.js","sourceRoot":"","sources":["../src/tool-args.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,oBAAoB;AACpB,EAAE;AACF,+EAA+E;AAC/E,8EAA8E;AAC9E,kEAAkE;AAClE,EAAE;AACF,uEAAuE;AACvE,6EAA6E;AAC7E,0EAA0E;AAC1E,sEAAsE;
|
|
1
|
+
{"version":3,"file":"tool-args.js","sourceRoot":"","sources":["../src/tool-args.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { JsonObjectSchema, ToolDefinition } from "./types.ts";
|
|
2
2
|
export interface ToolContext {
|
|
3
|
-
/** The model's own call id when there is one
|
|
3
|
+
/** The model's own call id when there is one. The event, any approval row
|
|
4
4
|
* and the tool message must all key on what the provider expects back. */
|
|
5
5
|
callId?: string;
|
|
6
6
|
signal?: AbortSignal;
|
|
@@ -18,7 +18,7 @@ export type ToolOutcome<O> = {
|
|
|
18
18
|
ok: false;
|
|
19
19
|
callId: string;
|
|
20
20
|
kind: ToolFailure;
|
|
21
|
-
/** Fed back to the model verbatim
|
|
21
|
+
/** Fed back to the model verbatim, so it must read as an instruction to
|
|
22
22
|
* a reader who cannot see our stack trace. */
|
|
23
23
|
error: string;
|
|
24
24
|
durationMs: number;
|
|
@@ -72,7 +72,7 @@ export declare class ToolRegistry {
|
|
|
72
72
|
has(name: string): boolean;
|
|
73
73
|
get names(): string[];
|
|
74
74
|
/**
|
|
75
|
-
* Definitions for an allow-list, in the order given
|
|
75
|
+
* Definitions for an allow-list, in the order given. This is the order the
|
|
76
76
|
* model reads them in, and it is part of the cached prompt prefix. Reordering
|
|
77
77
|
* or appending mid-conversation invalidates that prefix, so a caller that
|
|
78
78
|
* cares should freeze the list when the session opens.
|
package/dist/tools.js
CHANGED
|
@@ -6,7 +6,7 @@ export class ToolTimeoutError extends Error {
|
|
|
6
6
|
this.name = "ToolTimeoutError";
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
|
-
/** Rejects when `signal` aborts
|
|
9
|
+
/** Rejects when `signal` aborts. Races a `run` that ignores its own signal. */
|
|
10
10
|
function abortion(signal) {
|
|
11
11
|
return new Promise((_resolve, reject) => {
|
|
12
12
|
if (signal.aborted)
|
|
@@ -136,7 +136,7 @@ export class ToolRegistry {
|
|
|
136
136
|
return [...this.tools.keys()];
|
|
137
137
|
}
|
|
138
138
|
/**
|
|
139
|
-
* Definitions for an allow-list, in the order given
|
|
139
|
+
* Definitions for an allow-list, in the order given. This is the order the
|
|
140
140
|
* model reads them in, and it is part of the cached prompt prefix. Reordering
|
|
141
141
|
* or appending mid-conversation invalidates that prefix, so a caller that
|
|
142
142
|
* cares should freeze the list when the session opens.
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAgExC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,IAAY,EAAE,EAAU;QAClC,KAAK,CAAC,SAAS,IAAI,qBAAqB,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/transport.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type RateLimitReading } from "./rate-limit.ts";
|
|
1
2
|
export interface RequestInit_ {
|
|
2
3
|
url: string;
|
|
3
4
|
headers?: Record<string, string>;
|
|
@@ -7,11 +8,16 @@ export interface RequestInit_ {
|
|
|
7
8
|
signal?: AbortSignal;
|
|
8
9
|
/** Swapped in tests, or to route through a proxy. Defaults to global fetch. */
|
|
9
10
|
fetchImpl?: typeof fetch;
|
|
10
|
-
/** Called when the response headers arrive and on every body read after
|
|
11
|
+
/** Called when the response headers arrive and on every body read after,
|
|
11
12
|
* keep-alives included. What the watchdog's idle clock runs on. */
|
|
12
13
|
onActivity?: () => void;
|
|
13
14
|
/** Called when the body states `[DONE]`. See `SseHooks.onDone`. */
|
|
14
15
|
onDone?: () => void;
|
|
16
|
+
/** Called when the response headers report how full a subscription window
|
|
17
|
+
* is. See `StreamOptions.onRateLimit`. */
|
|
18
|
+
onRateLimit?: (reading: RateLimitReading) => void;
|
|
19
|
+
/** Whether the turn already stated its finish. See `SseHooks.finished`. */
|
|
20
|
+
finished?: () => boolean;
|
|
15
21
|
}
|
|
16
22
|
export interface SseHooks {
|
|
17
23
|
/** Every read of the body, keep-alives and partial frames included: the
|
|
@@ -23,6 +29,18 @@ export interface SseHooks {
|
|
|
23
29
|
* was not simply cut off.
|
|
24
30
|
*/
|
|
25
31
|
onDone?: () => void;
|
|
32
|
+
/**
|
|
33
|
+
* Whether the turn already stated its finish, so only trailing frames (the
|
|
34
|
+
* usage record, `[DONE]`) are left. Once this says true, a read that fails
|
|
35
|
+
* ends the stream instead of throwing. Kimi, GLM and OpenCode Go drop the
|
|
36
|
+
* socket there, and the failure threw away an answer the reader had already
|
|
37
|
+
* been shown (cc-proxy, measured on live traffic). The usage may be lost;
|
|
38
|
+
* the answer is not.
|
|
39
|
+
*/
|
|
40
|
+
finished?: () => boolean;
|
|
41
|
+
/** The request's signal. A caller's Stop is never swallowed, finished or not:
|
|
42
|
+
* a loop that sees a clean end goes on to run the turn's tools. */
|
|
43
|
+
signal?: AbortSignal;
|
|
26
44
|
/** Largest partial frame held before giving up. Defaults to 8 MiB. */
|
|
27
45
|
maxFrameChars?: number;
|
|
28
46
|
/** Names the provider on the oversized-frame error. */
|
|
@@ -30,15 +48,15 @@ export interface SseHooks {
|
|
|
30
48
|
}
|
|
31
49
|
/**
|
|
32
50
|
* One frame larger than this is not a frame. Without a cap a malformed or
|
|
33
|
-
* runaway upstream grows the buffer until the runtime dies
|
|
34
|
-
*
|
|
51
|
+
* runaway upstream grows the buffer until the runtime dies, starting with an
|
|
52
|
+
* MV3 worker. cc-proxy caps the ChatGPT backend at the same 8 MiB.
|
|
35
53
|
*/
|
|
36
54
|
export declare const MAX_SSE_FRAME_CHARS: number;
|
|
37
55
|
/** Join a base URL and a path without doubling or dropping the slash. */
|
|
38
56
|
export declare function apiUrl(baseUrl: string, path: string): string;
|
|
39
57
|
/**
|
|
40
58
|
* How long the provider says to wait, read from the RESPONSE rather than from
|
|
41
|
-
* a thrown error. Headers are authoritative
|
|
59
|
+
* a thrown error. Headers are authoritative: `Retry-After` first, then the
|
|
42
60
|
* vendor reset headers that name a subscription window rather than a
|
|
43
61
|
* per-minute throttle, because "try again in a moment" is a lie for those.
|
|
44
62
|
*/
|
|
@@ -46,23 +64,35 @@ export declare function retryAfterFromHeaders(headers: Headers, now?: number): n
|
|
|
46
64
|
/** POST and parse one JSON response. For the endpoints that do not stream. */
|
|
47
65
|
export declare function postJson<T = unknown>(opts: RequestInit_): Promise<T>;
|
|
48
66
|
/**
|
|
49
|
-
* Yield each `data:` payload of an SSE body, trimmed
|
|
67
|
+
* Yield each `data:` payload of an SSE body, trimmed, plus the bare JSON
|
|
50
68
|
* object a vendor appends outside the framing, which is only ever an error
|
|
51
69
|
* (see `payloadOf`).
|
|
52
70
|
*
|
|
53
71
|
* Frames are split on the blank line the spec requires, so a payload containing
|
|
54
|
-
* a bare newline survives
|
|
55
|
-
* adapter,
|
|
56
|
-
*
|
|
57
|
-
*
|
|
72
|
+
* a bare newline survives. `[DONE]` is swallowed here rather than in every
|
|
73
|
+
* adapter, reported through `hooks.onDone`, and ends the stream: it is the
|
|
74
|
+
* body's last word, and a read after it can only fail a finished turn. CRLF and
|
|
75
|
+
* bare CR are normalized: some gateways send them, and a `\r` left on the end
|
|
76
|
+
* of a JSON payload is a parse error nobody enjoys debugging.
|
|
58
77
|
*
|
|
59
78
|
* Exported apart from `streamSse` because the envelope above it is the half an
|
|
60
79
|
* adopting app most often cannot take: an app with its own translated error
|
|
61
80
|
* copy, its own log levels, or its own auth refresh has to keep building the
|
|
62
81
|
* request and reading the failure itself. Framing is the half nobody should
|
|
63
|
-
* write twice
|
|
82
|
+
* write twice. Hand it a `res.body` and keep your own envelope.
|
|
64
83
|
*/
|
|
65
84
|
export declare function parseSseStream(body: ReadableStream<Uint8Array>, hooks?: SseHooks): AsyncGenerator<string>;
|
|
85
|
+
/**
|
|
86
|
+
* Parse one SSE payload as the JSON event it must be.
|
|
87
|
+
*
|
|
88
|
+
* A frame that is not JSON used to be skipped as "a keep-alive or a frame we do
|
|
89
|
+
* not model". But `parseSseStream` already drops comments and empty frames,
|
|
90
|
+
* which is every keep-alive the vendors send, so what reaches here unparsable
|
|
91
|
+
* is a broken stream: a delta, a tool call or the finish itself, gone, with the
|
|
92
|
+
* turn still reading as whole. It fails as `network`, the same as a socket that
|
|
93
|
+
* dies mid-read (cc-proxy fails these too).
|
|
94
|
+
*/
|
|
95
|
+
export declare function parseFrame<T>(data: string, provider: string): T;
|
|
66
96
|
/**
|
|
67
97
|
* POST an SSE request and stream its payloads: the envelope (auth, the
|
|
68
98
|
* classified error, the retry hints) plus `parseSseStream`.
|
package/dist/transport.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB;wEACoE;IACpE,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;+CAC2C;IAC3C,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ;IACvB;8DAC0D;IAC1D,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC;IACzB;wEACoE;IACpE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,QAAkB,CAAC;AAEnD,yEAAyE;AACzE,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,SAAa,GAAG,MAAM,GAAG,SAAS,CA6B5F;AA2DD,8EAA8E;AAC9E,wBAAsB,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAI1E;AAwBD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAuB,cAAc,CACnC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,EAChC,KAAK,GAAE,QAAa,GACnB,cAAc,CAAC,MAAM,CAAC,CA2ExB;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAS/D;AAED;;;GAGG;AACH,wBAAuB,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAyB3E"}
|
package/dist/transport.js
CHANGED
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
//
|
|
5
5
|
// Adapters keep only their per-event mapping; everything about being an HTTP
|
|
6
6
|
// client lives here once.
|
|
7
|
-
import { classifyHttp,
|
|
8
|
-
import { parseRateLimitReset, parseRateLimitResponse } from "./rate-limit.js";
|
|
7
|
+
import { classifyHttp, parseRetryAfterMs, ProviderError } from "./errors.js";
|
|
8
|
+
import { parseRateLimitReset, parseRateLimitResponse, } from "./rate-limit.js";
|
|
9
9
|
/**
|
|
10
10
|
* One frame larger than this is not a frame. Without a cap a malformed or
|
|
11
|
-
* runaway upstream grows the buffer until the runtime dies
|
|
12
|
-
*
|
|
11
|
+
* runaway upstream grows the buffer until the runtime dies, starting with an
|
|
12
|
+
* MV3 worker. cc-proxy caps the ChatGPT backend at the same 8 MiB.
|
|
13
13
|
*/
|
|
14
14
|
export const MAX_SSE_FRAME_CHARS = 8 * 1024 * 1024;
|
|
15
15
|
/** Join a base URL and a path without doubling or dropping the slash. */
|
|
@@ -18,7 +18,7 @@ export function apiUrl(baseUrl, path) {
|
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
20
|
* How long the provider says to wait, read from the RESPONSE rather than from
|
|
21
|
-
* a thrown error. Headers are authoritative
|
|
21
|
+
* a thrown error. Headers are authoritative: `Retry-After` first, then the
|
|
22
22
|
* vendor reset headers that name a subscription window rather than a
|
|
23
23
|
* per-minute throttle, because "try again in a moment" is a lie for those.
|
|
24
24
|
*/
|
|
@@ -86,19 +86,26 @@ async function errorFor(provider, res) {
|
|
|
86
86
|
}
|
|
87
87
|
async function send(opts) {
|
|
88
88
|
const doFetch = opts.fetchImpl ?? globalThis.fetch;
|
|
89
|
+
// Serialized outside the catch below: a body that cannot become JSON is a
|
|
90
|
+
// bug of ours, and must not be dressed as a network blip and retried.
|
|
91
|
+
const body = typeof opts.body === "string" ? opts.body : JSON.stringify(opts.body);
|
|
89
92
|
try {
|
|
90
93
|
return await doFetch(opts.url, {
|
|
91
94
|
method: "POST",
|
|
92
95
|
headers: { "content-type": "application/json", ...opts.headers },
|
|
93
|
-
body
|
|
96
|
+
body,
|
|
94
97
|
signal: opts.signal,
|
|
95
98
|
});
|
|
96
99
|
}
|
|
97
100
|
catch (err) {
|
|
98
|
-
//
|
|
99
|
-
//
|
|
100
|
-
//
|
|
101
|
-
|
|
101
|
+
// An aborted signal passes through untouched: the caller's Stop stays
|
|
102
|
+
// `aborted`, and the watchdog re-issues its own abort as `timeout`
|
|
103
|
+
// (invariant 2). Every other rejection means no response came back, so it
|
|
104
|
+
// is a transport failure whatever its wording. Matching known wordings
|
|
105
|
+
// missed each runtime's next one, and a missed one was never retried: a
|
|
106
|
+
// long run died on its first blip. cc-proxy reads every failed send the
|
|
107
|
+
// same way.
|
|
108
|
+
if (opts.signal?.aborted)
|
|
102
109
|
throw err;
|
|
103
110
|
throw new ProviderError(opts.provider, "network", `no response from ${opts.url}`, {
|
|
104
111
|
cause: err,
|
|
@@ -135,21 +142,22 @@ function payloadOf(frame) {
|
|
|
135
142
|
return payload.length > 0 ? payload : null;
|
|
136
143
|
}
|
|
137
144
|
/**
|
|
138
|
-
* Yield each `data:` payload of an SSE body, trimmed
|
|
145
|
+
* Yield each `data:` payload of an SSE body, trimmed, plus the bare JSON
|
|
139
146
|
* object a vendor appends outside the framing, which is only ever an error
|
|
140
147
|
* (see `payloadOf`).
|
|
141
148
|
*
|
|
142
149
|
* Frames are split on the blank line the spec requires, so a payload containing
|
|
143
|
-
* a bare newline survives
|
|
144
|
-
* adapter,
|
|
145
|
-
*
|
|
146
|
-
*
|
|
150
|
+
* a bare newline survives. `[DONE]` is swallowed here rather than in every
|
|
151
|
+
* adapter, reported through `hooks.onDone`, and ends the stream: it is the
|
|
152
|
+
* body's last word, and a read after it can only fail a finished turn. CRLF and
|
|
153
|
+
* bare CR are normalized: some gateways send them, and a `\r` left on the end
|
|
154
|
+
* of a JSON payload is a parse error nobody enjoys debugging.
|
|
147
155
|
*
|
|
148
156
|
* Exported apart from `streamSse` because the envelope above it is the half an
|
|
149
157
|
* adopting app most often cannot take: an app with its own translated error
|
|
150
158
|
* copy, its own log levels, or its own auth refresh has to keep building the
|
|
151
159
|
* request and reading the failure itself. Framing is the half nobody should
|
|
152
|
-
* write twice
|
|
160
|
+
* write twice. Hand it a `res.body` and keep your own envelope.
|
|
153
161
|
*/
|
|
154
162
|
export async function* parseSseStream(body, hooks = {}) {
|
|
155
163
|
const reader = body.getReader();
|
|
@@ -159,18 +167,37 @@ export async function* parseSseStream(body, hooks = {}) {
|
|
|
159
167
|
// A CR at the very end of a read may be the first half of a CRLF; it waits
|
|
160
168
|
// for the next read before it is turned into a line break.
|
|
161
169
|
let heldCR = false;
|
|
170
|
+
// Whether the body was read to its end. Any other exit (`[DONE]`, a failed
|
|
171
|
+
// read, a consumer that stopped at its own terminal event) cancels it, so the
|
|
172
|
+
// connection is let go now rather than whenever the body is collected.
|
|
173
|
+
let drained = false;
|
|
174
|
+
/** Yields the frame's payload, and returns true when the frame was `[DONE]`. */
|
|
162
175
|
function* emit(frame) {
|
|
163
176
|
const payload = payloadOf(frame);
|
|
164
|
-
if (payload === "[DONE]")
|
|
177
|
+
if (payload === "[DONE]") {
|
|
165
178
|
hooks.onDone?.();
|
|
166
|
-
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
if (payload !== null)
|
|
167
182
|
yield payload;
|
|
183
|
+
return false;
|
|
168
184
|
}
|
|
169
185
|
try {
|
|
170
186
|
for (;;) {
|
|
171
|
-
|
|
172
|
-
|
|
187
|
+
let read;
|
|
188
|
+
try {
|
|
189
|
+
read = await reader.read();
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
if (hooks.finished?.() && !hooks.signal?.aborted)
|
|
193
|
+
return;
|
|
194
|
+
throw err;
|
|
195
|
+
}
|
|
196
|
+
const { done, value } = read;
|
|
197
|
+
if (done) {
|
|
198
|
+
drained = true;
|
|
173
199
|
break;
|
|
200
|
+
}
|
|
174
201
|
hooks.onActivity?.();
|
|
175
202
|
let text = (heldCR ? "\r" : "") + decoder.decode(value, { stream: true });
|
|
176
203
|
heldCR = text.endsWith("\r");
|
|
@@ -187,7 +214,8 @@ export async function* parseSseStream(body, hooks = {}) {
|
|
|
187
214
|
buffer += text;
|
|
188
215
|
let boundary = buffer.indexOf("\n\n", from);
|
|
189
216
|
while (boundary !== -1) {
|
|
190
|
-
yield* emit(buffer.slice(0, boundary))
|
|
217
|
+
if (yield* emit(buffer.slice(0, boundary)))
|
|
218
|
+
return;
|
|
191
219
|
buffer = buffer.slice(boundary + 2);
|
|
192
220
|
from = 0;
|
|
193
221
|
boundary = buffer.indexOf("\n\n");
|
|
@@ -201,9 +229,32 @@ export async function* parseSseStream(body, hooks = {}) {
|
|
|
201
229
|
yield* emit(buffer + decoder.decode() + (heldCR ? "\n" : ""));
|
|
202
230
|
}
|
|
203
231
|
finally {
|
|
232
|
+
if (!drained)
|
|
233
|
+
reader.cancel().catch(() => { });
|
|
204
234
|
reader.releaseLock();
|
|
205
235
|
}
|
|
206
236
|
}
|
|
237
|
+
/**
|
|
238
|
+
* Parse one SSE payload as the JSON event it must be.
|
|
239
|
+
*
|
|
240
|
+
* A frame that is not JSON used to be skipped as "a keep-alive or a frame we do
|
|
241
|
+
* not model". But `parseSseStream` already drops comments and empty frames,
|
|
242
|
+
* which is every keep-alive the vendors send, so what reaches here unparsable
|
|
243
|
+
* is a broken stream: a delta, a tool call or the finish itself, gone, with the
|
|
244
|
+
* turn still reading as whole. It fails as `network`, the same as a socket that
|
|
245
|
+
* dies mid-read (cc-proxy fails these too).
|
|
246
|
+
*/
|
|
247
|
+
export function parseFrame(data, provider) {
|
|
248
|
+
try {
|
|
249
|
+
return JSON.parse(data);
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
throw new ProviderError(provider, "network", `${provider}: a stream frame was not JSON`, {
|
|
253
|
+
body: data.slice(0, 2_000),
|
|
254
|
+
cause: err,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
}
|
|
207
258
|
/**
|
|
208
259
|
* POST an SSE request and stream its payloads: the envelope (auth, the
|
|
209
260
|
* classified error, the retry hints) plus `parseSseStream`.
|
|
@@ -214,6 +265,16 @@ export async function* streamSse(opts) {
|
|
|
214
265
|
// the POST: a backend that withholds them until its first output token (the
|
|
215
266
|
// ChatGPT backend does, for minutes on a large high-effort turn) is working.
|
|
216
267
|
opts.onActivity?.();
|
|
268
|
+
// The window's fill rides every response, the ones that go through too.
|
|
269
|
+
// Read only off a refusal, a caller learns the window was filling once it
|
|
270
|
+
// is already full.
|
|
271
|
+
if (opts.onRateLimit) {
|
|
272
|
+
const reading = parseRateLimitReset(res.headers);
|
|
273
|
+
const { utilization, resetAtMs } = reading;
|
|
274
|
+
if (utilization !== undefined && resetAtMs !== undefined) {
|
|
275
|
+
opts.onRateLimit({ ...reading, utilization, resetAtMs });
|
|
276
|
+
}
|
|
277
|
+
}
|
|
217
278
|
if (!res.ok)
|
|
218
279
|
throw await errorFor(opts.provider, res);
|
|
219
280
|
// A 2xx with no body at all is an upstream anomaly, not a request we got
|
package/dist/transport.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,+EAA+E;AAC/E,sBAAsB;AACtB,EAAE;AACF,6EAA6E;AAC7E,0BAA0B;AAC1B,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
|