@polpo-ai/llm 0.18.3 → 0.18.4

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.
@@ -3,7 +3,7 @@ export interface StructuredOutputRuntimeRoute {
3
3
  provider: string;
4
4
  runtimeMode?: ModelRuntimeMode;
5
5
  }
6
- export declare function needsSeparateStructuredOutputReasoningPass(route: StructuredOutputRuntimeRoute, reasoning: string | undefined): boolean;
6
+ export declare function needsSeparateStructuredOutputReasoningPass(route: StructuredOutputRuntimeRoute, reasoning: string | undefined, providerOptions?: Record<string, any>): boolean;
7
7
  /**
8
8
  * Vercel AI Gateway currently implements Anthropic structured output as a
9
9
  * forced synthetic tool. Anthropic rejects forced tool choice while extended
@@ -1 +1 @@
1
- {"version":3,"file":"structured-output-routing.d.ts","sourceRoot":"","sources":["../src/structured-output-routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC;AAED,wBAAgB,0CAA0C,CACxD,KAAK,EAAE,4BAA4B,EACnC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAKT;AAED;;;;;;GAMG;AACH,wBAAgB,sCAAsC,CACpD,KAAK,EAAE,4BAA4B,EACnC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,GAC/C,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAajC"}
1
+ {"version":3,"file":"structured-output-routing.d.ts","sourceRoot":"","sources":["../src/structured-output-routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC;AAED,wBAAgB,0CAA0C,CACxD,KAAK,EAAE,4BAA4B,EACnC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACpC,OAAO,CAiBT;AAED;;;;;;GAMG;AACH,wBAAgB,sCAAsC,CACpD,KAAK,EAAE,4BAA4B,EACnC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,GAC/C,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAajC"}
@@ -1,8 +1,16 @@
1
- export function needsSeparateStructuredOutputReasoningPass(route, reasoning) {
1
+ export function needsSeparateStructuredOutputReasoningPass(route, reasoning, providerOptions) {
2
+ const anthropic = providerOptions?.anthropic;
3
+ const thinking = anthropic && typeof anthropic === "object" && !Array.isArray(anthropic)
4
+ ? anthropic.thinking
5
+ : undefined;
6
+ const hasEffectiveThinking = Boolean(thinking
7
+ && typeof thinking === "object"
8
+ && !Array.isArray(thinking)
9
+ && thinking.type !== "disabled");
2
10
  return route.provider === "anthropic"
3
11
  && route.runtimeMode === "gateway"
4
- && reasoning !== undefined
5
- && reasoning !== "off";
12
+ && (hasEffectiveThinking
13
+ || (reasoning !== undefined && reasoning !== "off"));
6
14
  }
7
15
  /**
8
16
  * Vercel AI Gateway currently implements Anthropic structured output as a
@@ -12,7 +20,7 @@ export function needsSeparateStructuredOutputReasoningPass(route, reasoning) {
12
20
  * reasoning and structured output in one request.
13
21
  */
14
22
  export function providerOptionsForStructuredOutputPass(route, reasoning, providerOptions) {
15
- if (!needsSeparateStructuredOutputReasoningPass(route, reasoning)) {
23
+ if (!needsSeparateStructuredOutputReasoningPass(route, reasoning, providerOptions)) {
16
24
  return providerOptions;
17
25
  }
18
26
  const anthropic = providerOptions?.anthropic;
@@ -1 +1 @@
1
- {"version":3,"file":"structured-output-routing.js","sourceRoot":"","sources":["../src/structured-output-routing.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,0CAA0C,CACxD,KAAmC,EACnC,SAA6B;IAE7B,OAAO,KAAK,CAAC,QAAQ,KAAK,WAAW;WAChC,KAAK,CAAC,WAAW,KAAK,SAAS;WAC/B,SAAS,KAAK,SAAS;WACvB,SAAS,KAAK,KAAK,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sCAAsC,CACpD,KAAmC,EACnC,SAA6B,EAC7B,eAAgD;IAEhD,IAAI,CAAC,0CAA0C,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;QAClE,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,MAAM,SAAS,GAAG,eAAe,EAAE,SAAS,CAAC;IAC7C,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5E,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,iBAAiB,EAAE,GAAG,SAAS,CAAC;IACjF,OAAO;QACL,GAAG,eAAe;QAClB,SAAS,EAAE,iBAAiB;KAC7B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"structured-output-routing.js","sourceRoot":"","sources":["../src/structured-output-routing.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,0CAA0C,CACxD,KAAmC,EACnC,SAA6B,EAC7B,eAAqC;IAErC,MAAM,SAAS,GAAG,eAAe,EAAE,SAAS,CAAC;IAC7C,MAAM,QAAQ,GAAG,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QACtF,CAAC,CAAC,SAAS,CAAC,QAAQ;QACpB,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,oBAAoB,GAAG,OAAO,CAClC,QAAQ;WACL,OAAO,QAAQ,KAAK,QAAQ;WAC5B,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;WACxB,QAAQ,CAAC,IAAI,KAAK,UAAU,CAChC,CAAC;IACF,OAAO,KAAK,CAAC,QAAQ,KAAK,WAAW;WAChC,KAAK,CAAC,WAAW,KAAK,SAAS;WAC/B,CACD,oBAAoB;eACjB,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,KAAK,CAAC,CACpD,CAAC;AACN,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sCAAsC,CACpD,KAAmC,EACnC,SAA6B,EAC7B,eAAgD;IAEhD,IAAI,CAAC,0CAA0C,CAAC,KAAK,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC;QACnF,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,MAAM,SAAS,GAAG,eAAe,EAAE,SAAS,CAAC;IAC7C,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5E,OAAO,eAAe,CAAC;IACzB,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,iBAAiB,EAAE,GAAG,SAAS,CAAC;IACjF,OAAO;QACL,GAAG,eAAe;QAClB,SAAS,EAAE,iBAAiB;KAC7B,CAAC;AACJ,CAAC"}
@@ -11,20 +11,27 @@ describe("structured output runtime routing", () => {
11
11
  gateway: { order: ["anthropic"] },
12
12
  };
13
13
  it("separates Anthropic Gateway reasoning from the terminal schema pass", () => {
14
- expect(needsSeparateStructuredOutputReasoningPass(gatewayAnthropic, "medium")).toBe(true);
14
+ expect(needsSeparateStructuredOutputReasoningPass(gatewayAnthropic, "medium", reasoning)).toBe(true);
15
15
  expect(providerOptionsForStructuredOutputPass(gatewayAnthropic, "medium", reasoning)).toEqual({
16
16
  anthropic: { structuredOutputMode: "auto" },
17
17
  gateway: { order: ["anthropic"] },
18
18
  });
19
19
  });
20
+ it("uses the effective provider thinking when reasoning was defaulted by the host", () => {
21
+ expect(needsSeparateStructuredOutputReasoningPass(gatewayAnthropic, undefined, reasoning)).toBe(true);
22
+ expect(providerOptionsForStructuredOutputPass(gatewayAnthropic, undefined, reasoning)).toEqual({
23
+ anthropic: { structuredOutputMode: "auto" },
24
+ gateway: { order: ["anthropic"] },
25
+ });
26
+ });
20
27
  it.each([
21
- [{ provider: "anthropic", runtimeMode: "provider" }, "medium"],
22
- [gatewayAnthropic, "off"],
23
- [{ provider: "openai", runtimeMode: "gateway" }, "medium"],
24
- [gatewayAnthropic, undefined],
25
- ])("preserves provider options when the route does not conflict: %#", (route, level) => {
26
- expect(needsSeparateStructuredOutputReasoningPass(route, level)).toBe(false);
27
- expect(providerOptionsForStructuredOutputPass(route, level, reasoning)).toBe(reasoning);
28
+ [{ provider: "anthropic", runtimeMode: "provider" }, "medium", reasoning],
29
+ [gatewayAnthropic, "off", { anthropic: { structuredOutputMode: "auto" } }],
30
+ [{ provider: "openai", runtimeMode: "gateway" }, "medium", reasoning],
31
+ [gatewayAnthropic, undefined, { anthropic: { structuredOutputMode: "auto" } }],
32
+ ])("preserves provider options when the route does not conflict: %#", (route, level, options) => {
33
+ expect(needsSeparateStructuredOutputReasoningPass(route, level, options)).toBe(false);
34
+ expect(providerOptionsForStructuredOutputPass(route, level, options)).toBe(options);
28
35
  });
29
36
  });
30
37
  //# sourceMappingURL=structured-output-routing.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"structured-output-routing.test.js","sourceRoot":"","sources":["../src/structured-output-routing.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,0CAA0C,EAC1C,sCAAsC,GACvC,MAAM,gCAAgC,CAAC;AAExC,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,MAAM,gBAAgB,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,SAAkB,EAAE,CAAC;IACpF,MAAM,SAAS,GAAG;QAChB,SAAS,EAAE;YACT,oBAAoB,EAAE,MAAM;YAC5B,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE;YACjD,MAAM,EAAE,QAAQ;SACjB;QACD,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE;KAClC,CAAC;IAEF,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,CAAC,0CAA0C,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1F,MAAM,CAAC,sCAAsC,CAC3C,gBAAgB,EAChB,QAAQ,EACR,SAAS,CACV,CAAC,CAAC,OAAO,CAAC;YACT,SAAS,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE;YAC3C,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE;SAClC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,UAAmB,EAAE,EAAE,QAAQ,CAAC;QACvE,CAAC,gBAAgB,EAAE,KAAK,CAAC;QACzB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAkB,EAAE,EAAE,QAAQ,CAAC;QACnE,CAAC,gBAAgB,EAAE,SAAS,CAAC;KAC9B,CAAC,CAAC,iEAAiE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACrF,MAAM,CAAC,0CAA0C,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7E,MAAM,CAAC,sCAAsC,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"structured-output-routing.test.js","sourceRoot":"","sources":["../src/structured-output-routing.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,0CAA0C,EAC1C,sCAAsC,GACvC,MAAM,gCAAgC,CAAC;AAExC,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,MAAM,gBAAgB,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,SAAkB,EAAE,CAAC;IACpF,MAAM,SAAS,GAAG;QAChB,SAAS,EAAE;YACT,oBAAoB,EAAE,MAAM;YAC5B,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE;YACjD,MAAM,EAAE,QAAQ;SACjB;QACD,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE;KAClC,CAAC;IAEF,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,CAAC,0CAA0C,CAAC,gBAAgB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrG,MAAM,CAAC,sCAAsC,CAC3C,gBAAgB,EAChB,QAAQ,EACR,SAAS,CACV,CAAC,CAAC,OAAO,CAAC;YACT,SAAS,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE;YAC3C,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE;SAClC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,MAAM,CAAC,0CAA0C,CAC/C,gBAAgB,EAChB,SAAS,EACT,SAAS,CACV,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,CAAC,sCAAsC,CAC3C,gBAAgB,EAChB,SAAS,EACT,SAAS,CACV,CAAC,CAAC,OAAO,CAAC;YACT,SAAS,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE;YAC3C,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE;SAClC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,UAAmB,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC;QAClF,CAAC,gBAAgB,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE,EAAE,CAAC;QAC1E,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAkB,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC;QAC9E,CAAC,gBAAgB,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE,EAAE,CAAC;KAC/E,CAAC,CAAC,iEAAiE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC9F,MAAM,CAAC,0CAA0C,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtF,MAAM,CAAC,sCAAsC,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@polpo-ai/llm",
3
- "version": "0.18.3",
3
+ "version": "0.18.4",
4
4
  "description": "LLM abstraction for Polpo — multi-provider model resolution, streaming, cost tracking, and failover built on Vercel AI SDK + AI Gateway",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -27,7 +27,7 @@
27
27
  "@hyperjump/browser": "1.4.0",
28
28
  "@hyperjump/json-schema": "1.17.7",
29
29
  "zod": "^4.3.6",
30
- "@polpo-ai/core": "0.18.3"
30
+ "@polpo-ai/core": "0.18.4"
31
31
  },
32
32
  "peerDependencies": {
33
33
  "@ai-sdk/gateway": ">=3.0.0",