@plurnk/plurnk-providers 1.14.2 → 1.16.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/.env.defaults +1 -1
- package/SPEC.md +16 -2
- package/dist/AiSdkProvider.d.ts +3 -0
- package/dist/AiSdkProvider.d.ts.map +1 -1
- package/dist/AiSdkProvider.js +50 -339
- package/dist/AiSdkProvider.js.map +1 -1
- package/dist/AiSdkRequestBody.d.ts +40 -0
- package/dist/AiSdkRequestBody.d.ts.map +1 -0
- package/dist/AiSdkRequestBody.js +361 -0
- package/dist/AiSdkRequestBody.js.map +1 -0
- package/dist/Mock.d.ts +5 -1
- package/dist/Mock.d.ts.map +1 -1
- package/dist/Mock.js +9 -2
- package/dist/Mock.js.map +1 -1
- package/dist/Pool.d.ts +2 -1
- package/dist/Pool.d.ts.map +1 -1
- package/dist/Pool.js +5 -0
- package/dist/Pool.js.map +1 -1
- package/dist/aiSdkTransport.d.ts +1 -1
- package/dist/aiSdkTransport.d.ts.map +1 -1
- package/dist/aiSdkTransport.js +21 -2
- package/dist/aiSdkTransport.js.map +1 -1
- package/dist/capacity.d.ts +0 -1
- package/dist/capacity.d.ts.map +1 -1
- package/dist/capacity.js +1 -1
- package/dist/capacity.js.map +1 -1
- package/dist/catalogProvider.d.ts +2 -1
- package/dist/catalogProvider.d.ts.map +1 -1
- package/dist/catalogProvider.js +6 -0
- package/dist/catalogProvider.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/promptTokens.d.ts.map +1 -1
- package/dist/promptTokens.js +2 -1
- package/dist/promptTokens.js.map +1 -1
- package/dist/reasoning-effort.d.ts +4 -0
- package/dist/reasoning-effort.d.ts.map +1 -0
- package/dist/reasoning-effort.js +14 -0
- package/dist/reasoning-effort.js.map +1 -0
- package/dist/types.d.ts +17 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -1
- package/package.json +6 -6
- package/src/AiSdkProvider.test.ts +22 -3
- package/src/AiSdkProvider.ts +51 -375
- package/src/AiSdkRequestBody.ts +419 -0
- package/src/Mock.ts +10 -2
- package/src/Pool.test.ts +1 -0
- package/src/Pool.ts +6 -1
- package/src/aiSdkTransport.ts +23 -4
- package/src/boundaries.test.ts +2 -0
- package/src/capacity.ts +1 -1
- package/src/catalogProvider.ts +9 -1
- package/src/index.ts +3 -0
- package/src/inputModalities.test.ts +53 -0
- package/src/promptTokens.ts +2 -1
- package/src/reasoning-effort.ts +15 -0
- package/src/types.ts +18 -1
package/dist/promptTokens.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { chatMessageText } from "./types.js";
|
|
1
2
|
const KINDS = new Set([
|
|
2
3
|
"exact",
|
|
3
4
|
"upper_bound",
|
|
@@ -28,7 +29,7 @@ export const assertPromptTokenMeasurement = (value, owner = "provider") => {
|
|
|
28
29
|
};
|
|
29
30
|
export const estimatePromptTokens = (messages, detail = "chars/2 over message content; provider request framing is unknown") => ({
|
|
30
31
|
kind: "estimate",
|
|
31
|
-
tokens: Math.ceil(messages.reduce((sum,
|
|
32
|
+
tokens: Math.ceil(messages.reduce((sum, message) => sum + chatMessageText(message).length, 0) / 2),
|
|
32
33
|
source: "heuristic:chars2",
|
|
33
34
|
detail,
|
|
34
35
|
});
|
package/dist/promptTokens.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promptTokens.js","sourceRoot":"","sources":["../src/promptTokens.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"promptTokens.js","sourceRoot":"","sources":["../src/promptTokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAiC;IAClD,OAAO;IACP,aAAa;IACb,UAAU;IACV,aAAa;CAChB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CACxC,KAAc,EACd,KAAK,GAAG,UAAU,EACI,EAAE;IACxB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC9C,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,8CAA8C,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,SAAS,GAAG,KAAgC,CAAC;IACnD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAsC,CAAC;IAC9D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,+CAA+C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjH,CAAC;IACD,IAAI,IAAI,KAAK,aAAa;WACnB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,IAAK,SAAS,CAAC,MAAiB,GAAG,CAAC,CAAC,EAAE,CAAC;QAC/E,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,kEAAkE,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,8DAA8D,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,aAAa,CAAC;WAC5C,CAAC,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAC7E,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,KAAK,IAAI,2CAA2C,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,KAA+B,CAAC;AAC3C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAChC,QAAgC,EAChC,MAAM,GAAG,mEAAmE,EACtD,EAAE,CAAC,CAAC;IAC1B,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAClG,MAAM,EAAE,kBAAkB;IAC1B,MAAM;CACT,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ReasoningPolicy } from "./types.ts";
|
|
2
|
+
export declare const fixedEffort: (mode: ReasoningPolicy) => "low" | "medium" | "high" | "xhigh" | "max";
|
|
3
|
+
export declare const nativeFixedEffort: (mode: ReasoningPolicy) => "low" | "medium" | "high" | "xhigh";
|
|
4
|
+
//# sourceMappingURL=reasoning-effort.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning-effort.d.ts","sourceRoot":"","sources":["../src/reasoning-effort.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,eAAO,MAAM,WAAW,SAAU,eAAe,KAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAGzF,CAAC;AAIF,eAAO,MAAM,iBAAiB,SAAU,eAAe,KAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAIrF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const fixedEffort = (mode) => {
|
|
2
|
+
if (mode === "low" || mode === "medium" || mode === "high" || mode === "xhigh" || mode === "max")
|
|
3
|
+
return mode;
|
|
4
|
+
throw new TypeError(`reasoning policy '${mode}' is not a fixed effort`);
|
|
5
|
+
};
|
|
6
|
+
// The native SDK effort surface tops at xhigh; admission never grants a native
|
|
7
|
+
// route "max", so reaching it here is a contract violation, not a fallback site.
|
|
8
|
+
export const nativeFixedEffort = (mode) => {
|
|
9
|
+
const effort = fixedEffort(mode);
|
|
10
|
+
if (effort === "max")
|
|
11
|
+
throw new TypeError(`reasoning policy 'max' has no native SDK effort surface`);
|
|
12
|
+
return effort;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=reasoning-effort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning-effort.js","sourceRoot":"","sources":["../src/reasoning-effort.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAqB,EAA+C,EAAE;IAC9F,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAC9G,MAAM,IAAI,SAAS,CAAC,qBAAqB,IAAI,yBAAyB,CAAC,CAAC;AAC5E,CAAC,CAAC;AAEF,+EAA+E;AAC/E,iFAAiF;AACjF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAqB,EAAuC,EAAE;IAC5F,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,MAAM,KAAK,KAAK;QAAE,MAAM,IAAI,SAAS,CAAC,yDAAyD,CAAC,CAAC;IACrG,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -8,10 +8,25 @@ export declare class UnsupportedReasoningPolicyError extends Error {
|
|
|
8
8
|
readonly supported: readonly ReasoningPolicy[];
|
|
9
9
|
constructor(source: string, policy: ReasoningPolicy, supported: readonly ReasoningPolicy[]);
|
|
10
10
|
}
|
|
11
|
+
export type InputModality = "image" | "pdf" | "audio" | "video";
|
|
12
|
+
export declare const INPUT_MODALITIES: readonly InputModality[];
|
|
13
|
+
export type ChatContentPart = {
|
|
14
|
+
readonly type: "text";
|
|
15
|
+
readonly text: string;
|
|
16
|
+
} | {
|
|
17
|
+
readonly type: "image";
|
|
18
|
+
readonly image: Uint8Array;
|
|
19
|
+
readonly mediaType: string;
|
|
20
|
+
} | {
|
|
21
|
+
readonly type: "file";
|
|
22
|
+
readonly data: Uint8Array;
|
|
23
|
+
readonly mediaType: string;
|
|
24
|
+
};
|
|
11
25
|
export interface ChatMessage {
|
|
12
26
|
role: "system" | "user" | "assistant";
|
|
13
|
-
content: string;
|
|
27
|
+
content: string | readonly ChatContentPart[];
|
|
14
28
|
}
|
|
29
|
+
export declare const chatMessageText: (message: Pick<ChatMessage, "content">) => string;
|
|
15
30
|
export type ProviderCallKind = "emission" | "bare";
|
|
16
31
|
export type PromptTokenMeasurement = {
|
|
17
32
|
readonly kind: "exact" | "upper_bound";
|
|
@@ -124,6 +139,7 @@ export interface Provider {
|
|
|
124
139
|
readonly outputBudget: number | null;
|
|
125
140
|
readonly reasoningBudget: number | null;
|
|
126
141
|
readonly supportedReasoningPolicies: readonly ReasoningPolicy[];
|
|
142
|
+
readonly inputModalities: ReadonlySet<InputModality>;
|
|
127
143
|
readonly inputCapacity: number | null;
|
|
128
144
|
readonly model: string;
|
|
129
145
|
readonly servedModel?: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,KAAK,EACR,iBAAiB,EACjB,wBAAwB,EACxB,uBAAuB,EAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EACR,YAAY,EACZ,yBAAyB,EACzB,uBAAuB,EACvB,eAAe,EAClB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EACR,kBAAkB,EAClB,YAAY,EACZ,yBAAyB,EACzB,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EACzB,aAAa,EACb,eAAe,GAClB,MAAM,0BAA0B,CAAC;AAElC,qBAAa,+BAAgC,SAAQ,KAAK;IACtD,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;IAE/C,YAAY,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,eAAe,EAAE,EAazF;CACJ;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -19,4 +19,9 @@ export class UnsupportedReasoningPolicyError extends Error {
|
|
|
19
19
|
this.supported = supported;
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
+
export const INPUT_MODALITIES = Object.freeze(["image", "pdf", "audio", "video"]);
|
|
23
|
+
// The text of a message, for counting and for transports that take only text.
|
|
24
|
+
export const chatMessageText = (message) => typeof message.content === "string"
|
|
25
|
+
? message.content
|
|
26
|
+
: message.content.map((part) => part.type === "text" ? part.text : "").join("");
|
|
22
27
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,6EAA6E;AAC7E,iCAAiC;AA2BjC,MAAM,OAAO,+BAAgC,SAAQ,KAAK;IAC7C,MAAM,CAAkB;IACxB,SAAS,CAA6B;IAE/C,YAAY,MAAc,EAAE,MAAuB,EAAE,SAAqC;QACtF,yEAAyE;QACzE,qEAAqE;QACrE,+DAA+D;QAC/D,yDAAyD;QACzD,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,UAAU;YACnD,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,gHAAgH,CAAC,YAAY,IAAI,QAAQ,CAAC,CAAC,UAAU,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,sBAAsB,MAAM,qBAAqB,CAAC;QACnP,KAAK,CAAC,GAAG,MAAM,uBAAuB,MAAM,yCAAyC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;QACtH,IAAI,CAAC,IAAI,GAAG,iCAAiC,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;CACJ"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,6EAA6E;AAC7E,iCAAiC;AA2BjC,MAAM,OAAO,+BAAgC,SAAQ,KAAK;IAC7C,MAAM,CAAkB;IACxB,SAAS,CAA6B;IAE/C,YAAY,MAAc,EAAE,MAAuB,EAAE,SAAqC;QACtF,yEAAyE;QACzE,qEAAqE;QACrE,+DAA+D;QAC/D,yDAAyD;QACzD,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,UAAU;YACnD,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,gHAAgH,CAAC,YAAY,IAAI,QAAQ,CAAC,CAAC,UAAU,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,sBAAsB,MAAM,qBAAqB,CAAC;QACnP,KAAK,CAAC,GAAG,MAAM,uBAAuB,MAAM,yCAAyC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;QACtH,IAAI,CAAC,IAAI,GAAG,iCAAiC,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;CACJ;AAKD,MAAM,CAAC,MAAM,gBAAgB,GAA6B,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAW5G,8EAA8E;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAqC,EAAU,EAAE,CAC7E,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;IAC/B,CAAC,CAAC,OAAO,CAAC,OAAO;IACjB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plurnk/plurnk-providers",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.16.0",
|
|
4
4
|
"description": "PLURNK's stable model-provider contract and AI SDK adapter.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"plurnk",
|
|
@@ -84,11 +84,11 @@
|
|
|
84
84
|
"@ai-sdk/togetherai": "^3.0.0",
|
|
85
85
|
"@ai-sdk/xai": "^4.0.0",
|
|
86
86
|
"@openrouter/ai-sdk-provider": "^3.0.0",
|
|
87
|
-
"@plurnk/gbnf": "1.
|
|
88
|
-
"@plurnk/plurnk-aliases": "1.
|
|
89
|
-
"@plurnk/plurnk-contracts": "1.
|
|
90
|
-
"@plurnk/plurnk-meta": "1.
|
|
91
|
-
"@plurnk/plurnk-models": "1.
|
|
87
|
+
"@plurnk/gbnf": "1.16.0",
|
|
88
|
+
"@plurnk/plurnk-aliases": "1.16.0",
|
|
89
|
+
"@plurnk/plurnk-contracts": "1.16.0",
|
|
90
|
+
"@plurnk/plurnk-meta": "1.16.0",
|
|
91
|
+
"@plurnk/plurnk-models": "1.16.0",
|
|
92
92
|
"ai": "^7.0.37",
|
|
93
93
|
"zod": "^4.4.3"
|
|
94
94
|
},
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { chatMessageText } from "./types.ts";
|
|
1
2
|
import test, { mock } from "node:test";
|
|
2
3
|
import { strict as assert } from "node:assert";
|
|
3
4
|
import AiSdkProvider, { type AiSdkProviderConfig } from "./AiSdkProvider.ts";
|
|
@@ -554,7 +555,7 @@ test("injected prompt measurement preserves provenance and request cost estimati
|
|
|
554
555
|
const p = testProvider({
|
|
555
556
|
model: "m", url: "http://x/v1/chat/completions", fetchTimeoutMs: 1000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "off", budget: null }, retryAttempts: 0,
|
|
556
557
|
countPromptTokens: (messages) => {
|
|
557
|
-
seen.push(...messages.map((
|
|
558
|
+
seen.push(...messages.map((message) => chatMessageText(message)));
|
|
558
559
|
return { kind: "upper_bound", tokens: 7, source: "test:proven-bound" };
|
|
559
560
|
},
|
|
560
561
|
streaming: false,
|
|
@@ -849,6 +850,24 @@ test("native SDK providers share the first-content surface-at-once contract (#47
|
|
|
849
850
|
assert.equal(calls, 1, "a deadline surfaces at once; no transport retry (#479)");
|
|
850
851
|
});
|
|
851
852
|
|
|
853
|
+
test("{§provider-connectivity} a wedged transport that ignores the abort still surfaces the operation deadline (#505)", async () => {
|
|
854
|
+
// The wedged-adapter case: a fetch that never resolves AND never observes its abort signal, with every
|
|
855
|
+
// SDK attempt deadline disabled. Only the operation deadline — enforced by racing, not by the advisory
|
|
856
|
+
// signal the transport ignores — can keep generate() from hanging the loop.
|
|
857
|
+
const wedgedFetch: typeof globalThis.fetch = () => new Promise<Response>(() => {});
|
|
858
|
+
const provider = testProvider({
|
|
859
|
+
...injectedBase,
|
|
860
|
+
fetch: wedgedFetch,
|
|
861
|
+
fetchTimeoutMs: 0,
|
|
862
|
+
operationTimeoutMs: 100,
|
|
863
|
+
});
|
|
864
|
+
await assert.rejects(
|
|
865
|
+
provider.generate({ workerId: "wedged", messages: [] }),
|
|
866
|
+
(error: ProviderError) => error.kind === "deadline_exceeded"
|
|
867
|
+
&& error.problem.timeoutPhase === "operation",
|
|
868
|
+
);
|
|
869
|
+
});
|
|
870
|
+
|
|
852
871
|
test("compatible xAI wire usage becomes an exact tick charge without raw-body capture", async () => {
|
|
853
872
|
const p = testProvider({
|
|
854
873
|
model: "grok-test",
|
|
@@ -1182,7 +1201,7 @@ test("{§provider-tagged-reasoning} verbatim, non-leading, and structured-reason
|
|
|
1182
1201
|
});
|
|
1183
1202
|
|
|
1184
1203
|
test("{§provider-tagged-reasoning} grammar evidence retains the exact pre-projection tagged sentence", async () => {
|
|
1185
|
-
const content = "<think>🧠reason</think
|
|
1204
|
+
const content = "<think>🧠reason</think>## PLAN0\n\n### SEND0 (TERM)\ndone";
|
|
1186
1205
|
const config = {
|
|
1187
1206
|
...injectedBase,
|
|
1188
1207
|
contextWindow: 640,
|
|
@@ -1200,7 +1219,7 @@ test("{§provider-tagged-reasoning} grammar evidence retains the exact pre-proje
|
|
|
1200
1219
|
});
|
|
1201
1220
|
|
|
1202
1221
|
assert.equal(response.assistant.reasoning, "🧠reason");
|
|
1203
|
-
assert.equal(response.assistant.content, "
|
|
1222
|
+
assert.equal(response.assistant.content, "## PLAN0\n\n### SEND0 (TERM)\ndone");
|
|
1204
1223
|
assert.deepEqual(response.grammarEvidence, {
|
|
1205
1224
|
input: content,
|
|
1206
1225
|
contentStart: [..."<think>🧠reason</think>"].length,
|