@jaypie/llm 1.3.4 → 1.3.5

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.
Files changed (175) hide show
  1. package/dist/cjs/index.cjs +166 -27
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs/index.d.cts +13 -1
  4. package/dist/cjs/{index.d.ts → src/index.d.ts} +1 -0
  5. package/dist/cjs/{util → src/util}/index.d.ts +1 -0
  6. package/dist/cjs/src/util/jsonSchema.d.ts +17 -0
  7. package/dist/esm/index.d.ts +13 -1
  8. package/dist/esm/index.js +191 -54
  9. package/dist/esm/index.js.map +1 -1
  10. package/dist/esm/src/index.d.ts +17 -0
  11. package/dist/esm/{util → src/util}/index.d.ts +1 -0
  12. package/dist/esm/src/util/jsonSchema.d.ts +17 -0
  13. package/package.json +3 -2
  14. /package/dist/cjs/{Llm.d.ts → src/Llm.d.ts} +0 -0
  15. /package/dist/cjs/{constants.d.ts → src/constants.d.ts} +0 -0
  16. /package/dist/cjs/{observability → src/observability}/llmobs.d.ts +0 -0
  17. /package/dist/cjs/{operate → src/operate}/OperateLoop.d.ts +0 -0
  18. /package/dist/cjs/{operate → src/operate}/StreamLoop.d.ts +0 -0
  19. /package/dist/cjs/{operate → src/operate}/adapters/AnthropicAdapter.d.ts +0 -0
  20. /package/dist/cjs/{operate → src/operate}/adapters/BedrockAdapter.d.ts +0 -0
  21. /package/dist/cjs/{operate → src/operate}/adapters/GoogleAdapter.d.ts +0 -0
  22. /package/dist/cjs/{operate → src/operate}/adapters/OpenAiAdapter.d.ts +0 -0
  23. /package/dist/cjs/{operate → src/operate}/adapters/OpenRouterAdapter.d.ts +0 -0
  24. /package/dist/cjs/{operate → src/operate}/adapters/ProviderAdapter.interface.d.ts +0 -0
  25. /package/dist/cjs/{operate → src/operate}/adapters/XaiAdapter.d.ts +0 -0
  26. /package/dist/cjs/{operate → src/operate}/adapters/index.d.ts +0 -0
  27. /package/dist/cjs/{operate → src/operate}/hooks/HookRunner.d.ts +0 -0
  28. /package/dist/cjs/{operate → src/operate}/hooks/index.d.ts +0 -0
  29. /package/dist/cjs/{operate → src/operate}/index.d.ts +0 -0
  30. /package/dist/cjs/{operate → src/operate}/input/InputProcessor.d.ts +0 -0
  31. /package/dist/cjs/{operate → src/operate}/input/index.d.ts +0 -0
  32. /package/dist/cjs/{operate → src/operate}/response/ResponseBuilder.d.ts +0 -0
  33. /package/dist/cjs/{operate → src/operate}/response/index.d.ts +0 -0
  34. /package/dist/cjs/{operate → src/operate}/retry/RetryExecutor.d.ts +0 -0
  35. /package/dist/cjs/{operate → src/operate}/retry/RetryPolicy.d.ts +0 -0
  36. /package/dist/cjs/{operate → src/operate}/retry/createStaleRejectionGuard.d.ts +0 -0
  37. /package/dist/cjs/{operate → src/operate}/retry/index.d.ts +0 -0
  38. /package/dist/cjs/{operate → src/operate}/retry/isTransientNetworkError.d.ts +0 -0
  39. /package/dist/cjs/{operate → src/operate}/types.d.ts +0 -0
  40. /package/dist/cjs/{providers → src/providers}/anthropic/AnthropicProvider.class.d.ts +0 -0
  41. /package/dist/cjs/{providers → src/providers}/anthropic/client.d.ts +0 -0
  42. /package/dist/cjs/{providers → src/providers}/anthropic/index.d.ts +0 -0
  43. /package/dist/cjs/{providers → src/providers}/anthropic/types.d.ts +0 -0
  44. /package/dist/cjs/{providers → src/providers}/anthropic/utils.d.ts +0 -0
  45. /package/dist/cjs/{providers → src/providers}/bedrock/BedrockProvider.class.d.ts +0 -0
  46. /package/dist/cjs/{providers → src/providers}/bedrock/index.d.ts +0 -0
  47. /package/dist/cjs/{providers → src/providers}/bedrock/utils.d.ts +0 -0
  48. /package/dist/cjs/{providers → src/providers}/google/GoogleProvider.class.d.ts +0 -0
  49. /package/dist/cjs/{providers → src/providers}/google/client.d.ts +0 -0
  50. /package/dist/cjs/{providers → src/providers}/google/index.d.ts +0 -0
  51. /package/dist/cjs/{providers → src/providers}/google/types.d.ts +0 -0
  52. /package/dist/cjs/{providers → src/providers}/google/utils.d.ts +0 -0
  53. /package/dist/cjs/{providers → src/providers}/openai/OpenAiProvider.class.d.ts +0 -0
  54. /package/dist/cjs/{providers → src/providers}/openai/client.d.ts +0 -0
  55. /package/dist/cjs/{providers → src/providers}/openai/index.d.ts +0 -0
  56. /package/dist/cjs/{providers → src/providers}/openai/responseFormat.d.ts +0 -0
  57. /package/dist/cjs/{providers → src/providers}/openai/types.d.ts +0 -0
  58. /package/dist/cjs/{providers → src/providers}/openai/utils.d.ts +0 -0
  59. /package/dist/cjs/{providers → src/providers}/openrouter/OpenRouterProvider.class.d.ts +0 -0
  60. /package/dist/cjs/{providers → src/providers}/openrouter/client.d.ts +0 -0
  61. /package/dist/cjs/{providers → src/providers}/openrouter/index.d.ts +0 -0
  62. /package/dist/cjs/{providers → src/providers}/openrouter/utils.d.ts +0 -0
  63. /package/dist/cjs/{providers → src/providers}/xai/XaiProvider.class.d.ts +0 -0
  64. /package/dist/cjs/{providers → src/providers}/xai/index.d.ts +0 -0
  65. /package/dist/cjs/{providers → src/providers}/xai/utils.d.ts +0 -0
  66. /package/dist/cjs/{tools → src/tools}/Toolkit.class.d.ts +0 -0
  67. /package/dist/cjs/{tools → src/tools}/index.d.ts +0 -0
  68. /package/dist/cjs/{tools → src/tools}/random.d.ts +0 -0
  69. /package/dist/cjs/{tools → src/tools}/roll.d.ts +0 -0
  70. /package/dist/cjs/{tools → src/tools}/time.d.ts +0 -0
  71. /package/dist/cjs/{tools → src/tools}/weather.d.ts +0 -0
  72. /package/dist/cjs/{types → src/types}/LlmOperateInput.guards.d.ts +0 -0
  73. /package/dist/cjs/{types → src/types}/LlmProvider.interface.d.ts +0 -0
  74. /package/dist/cjs/{types → src/types}/LlmStreamChunk.interface.d.ts +0 -0
  75. /package/dist/cjs/{types → src/types}/LlmTool.interface.d.ts +0 -0
  76. /package/dist/cjs/{upload → src/upload}/detectMimeType.d.ts +0 -0
  77. /package/dist/cjs/{upload → src/upload}/extractPdfPages.d.ts +0 -0
  78. /package/dist/cjs/{upload → src/upload}/index.d.ts +0 -0
  79. /package/dist/cjs/{upload → src/upload}/loadLocalFile.d.ts +0 -0
  80. /package/dist/cjs/{upload → src/upload}/loadS3File.d.ts +0 -0
  81. /package/dist/cjs/{upload → src/upload}/resolveOperateInput.d.ts +0 -0
  82. /package/dist/cjs/{util → src/util}/determineModelProvider.d.ts +0 -0
  83. /package/dist/cjs/{util → src/util}/extractReasoning.d.ts +0 -0
  84. /package/dist/cjs/{util → src/util}/fillFormatArrays.d.ts +0 -0
  85. /package/dist/cjs/{util → src/util}/formatOperateInput.d.ts +0 -0
  86. /package/dist/cjs/{util → src/util}/formatOperateMessage.d.ts +0 -0
  87. /package/dist/cjs/{util → src/util}/jsonSchemaToOpenApi3.d.ts +0 -0
  88. /package/dist/cjs/{util → src/util}/logger.d.ts +0 -0
  89. /package/dist/cjs/{util → src/util}/maxTurnsFromOptions.d.ts +0 -0
  90. /package/dist/cjs/{util → src/util}/naturalZodSchema.d.ts +0 -0
  91. /package/dist/cjs/{util → src/util}/random.d.ts +0 -0
  92. /package/dist/cjs/{util → src/util}/repairFormatKeys.d.ts +0 -0
  93. /package/dist/cjs/{util → src/util}/sse.d.ts +0 -0
  94. /package/dist/cjs/{util → src/util}/tryParseNumber.d.ts +0 -0
  95. /package/dist/esm/{Llm.d.ts → src/Llm.d.ts} +0 -0
  96. /package/dist/esm/{constants.d.ts → src/constants.d.ts} +0 -0
  97. /package/dist/esm/{observability → src/observability}/llmobs.d.ts +0 -0
  98. /package/dist/esm/{operate → src/operate}/OperateLoop.d.ts +0 -0
  99. /package/dist/esm/{operate → src/operate}/StreamLoop.d.ts +0 -0
  100. /package/dist/esm/{operate → src/operate}/adapters/AnthropicAdapter.d.ts +0 -0
  101. /package/dist/esm/{operate → src/operate}/adapters/BedrockAdapter.d.ts +0 -0
  102. /package/dist/esm/{operate → src/operate}/adapters/GoogleAdapter.d.ts +0 -0
  103. /package/dist/esm/{operate → src/operate}/adapters/OpenAiAdapter.d.ts +0 -0
  104. /package/dist/esm/{operate → src/operate}/adapters/OpenRouterAdapter.d.ts +0 -0
  105. /package/dist/esm/{operate → src/operate}/adapters/ProviderAdapter.interface.d.ts +0 -0
  106. /package/dist/esm/{operate → src/operate}/adapters/XaiAdapter.d.ts +0 -0
  107. /package/dist/esm/{operate → src/operate}/adapters/index.d.ts +0 -0
  108. /package/dist/esm/{operate → src/operate}/hooks/HookRunner.d.ts +0 -0
  109. /package/dist/esm/{operate → src/operate}/hooks/index.d.ts +0 -0
  110. /package/dist/esm/{operate → src/operate}/index.d.ts +0 -0
  111. /package/dist/esm/{operate → src/operate}/input/InputProcessor.d.ts +0 -0
  112. /package/dist/esm/{operate → src/operate}/input/index.d.ts +0 -0
  113. /package/dist/esm/{operate → src/operate}/response/ResponseBuilder.d.ts +0 -0
  114. /package/dist/esm/{operate → src/operate}/response/index.d.ts +0 -0
  115. /package/dist/esm/{operate → src/operate}/retry/RetryExecutor.d.ts +0 -0
  116. /package/dist/esm/{operate → src/operate}/retry/RetryPolicy.d.ts +0 -0
  117. /package/dist/esm/{operate → src/operate}/retry/createStaleRejectionGuard.d.ts +0 -0
  118. /package/dist/esm/{operate → src/operate}/retry/index.d.ts +0 -0
  119. /package/dist/esm/{operate → src/operate}/retry/isTransientNetworkError.d.ts +0 -0
  120. /package/dist/esm/{operate → src/operate}/types.d.ts +0 -0
  121. /package/dist/esm/{providers → src/providers}/anthropic/AnthropicProvider.class.d.ts +0 -0
  122. /package/dist/esm/{providers → src/providers}/anthropic/client.d.ts +0 -0
  123. /package/dist/esm/{providers → src/providers}/anthropic/index.d.ts +0 -0
  124. /package/dist/esm/{providers → src/providers}/anthropic/types.d.ts +0 -0
  125. /package/dist/esm/{providers → src/providers}/anthropic/utils.d.ts +0 -0
  126. /package/dist/esm/{providers → src/providers}/bedrock/BedrockProvider.class.d.ts +0 -0
  127. /package/dist/esm/{providers → src/providers}/bedrock/index.d.ts +0 -0
  128. /package/dist/esm/{providers → src/providers}/bedrock/utils.d.ts +0 -0
  129. /package/dist/esm/{providers → src/providers}/google/GoogleProvider.class.d.ts +0 -0
  130. /package/dist/esm/{providers → src/providers}/google/client.d.ts +0 -0
  131. /package/dist/esm/{providers → src/providers}/google/index.d.ts +0 -0
  132. /package/dist/esm/{providers → src/providers}/google/types.d.ts +0 -0
  133. /package/dist/esm/{providers → src/providers}/google/utils.d.ts +0 -0
  134. /package/dist/esm/{providers → src/providers}/openai/OpenAiProvider.class.d.ts +0 -0
  135. /package/dist/esm/{providers → src/providers}/openai/client.d.ts +0 -0
  136. /package/dist/esm/{providers → src/providers}/openai/index.d.ts +0 -0
  137. /package/dist/esm/{providers → src/providers}/openai/responseFormat.d.ts +0 -0
  138. /package/dist/esm/{providers → src/providers}/openai/types.d.ts +0 -0
  139. /package/dist/esm/{providers → src/providers}/openai/utils.d.ts +0 -0
  140. /package/dist/esm/{providers → src/providers}/openrouter/OpenRouterProvider.class.d.ts +0 -0
  141. /package/dist/esm/{providers → src/providers}/openrouter/client.d.ts +0 -0
  142. /package/dist/esm/{providers → src/providers}/openrouter/index.d.ts +0 -0
  143. /package/dist/esm/{providers → src/providers}/openrouter/utils.d.ts +0 -0
  144. /package/dist/esm/{providers → src/providers}/xai/XaiProvider.class.d.ts +0 -0
  145. /package/dist/esm/{providers → src/providers}/xai/index.d.ts +0 -0
  146. /package/dist/esm/{providers → src/providers}/xai/utils.d.ts +0 -0
  147. /package/dist/esm/{tools → src/tools}/Toolkit.class.d.ts +0 -0
  148. /package/dist/esm/{tools → src/tools}/index.d.ts +0 -0
  149. /package/dist/esm/{tools → src/tools}/random.d.ts +0 -0
  150. /package/dist/esm/{tools → src/tools}/roll.d.ts +0 -0
  151. /package/dist/esm/{tools → src/tools}/time.d.ts +0 -0
  152. /package/dist/esm/{tools → src/tools}/weather.d.ts +0 -0
  153. /package/dist/esm/{types → src/types}/LlmOperateInput.guards.d.ts +0 -0
  154. /package/dist/esm/{types → src/types}/LlmProvider.interface.d.ts +0 -0
  155. /package/dist/esm/{types → src/types}/LlmStreamChunk.interface.d.ts +0 -0
  156. /package/dist/esm/{types → src/types}/LlmTool.interface.d.ts +0 -0
  157. /package/dist/esm/{upload → src/upload}/detectMimeType.d.ts +0 -0
  158. /package/dist/esm/{upload → src/upload}/extractPdfPages.d.ts +0 -0
  159. /package/dist/esm/{upload → src/upload}/index.d.ts +0 -0
  160. /package/dist/esm/{upload → src/upload}/loadLocalFile.d.ts +0 -0
  161. /package/dist/esm/{upload → src/upload}/loadS3File.d.ts +0 -0
  162. /package/dist/esm/{upload → src/upload}/resolveOperateInput.d.ts +0 -0
  163. /package/dist/esm/{util → src/util}/determineModelProvider.d.ts +0 -0
  164. /package/dist/esm/{util → src/util}/extractReasoning.d.ts +0 -0
  165. /package/dist/esm/{util → src/util}/fillFormatArrays.d.ts +0 -0
  166. /package/dist/esm/{util → src/util}/formatOperateInput.d.ts +0 -0
  167. /package/dist/esm/{util → src/util}/formatOperateMessage.d.ts +0 -0
  168. /package/dist/esm/{util → src/util}/jsonSchemaToOpenApi3.d.ts +0 -0
  169. /package/dist/esm/{util → src/util}/logger.d.ts +0 -0
  170. /package/dist/esm/{util → src/util}/maxTurnsFromOptions.d.ts +0 -0
  171. /package/dist/esm/{util → src/util}/naturalZodSchema.d.ts +0 -0
  172. /package/dist/esm/{util → src/util}/random.d.ts +0 -0
  173. /package/dist/esm/{util → src/util}/repairFormatKeys.d.ts +0 -0
  174. /package/dist/esm/{util → src/util}/sse.d.ts +0 -0
  175. /package/dist/esm/{util → src/util}/tryParseNumber.d.ts +0 -0
@@ -768,6 +768,119 @@ function formatOperateInput(input, options) {
768
768
  return [input];
769
769
  }
770
770
 
771
+ // Keywords a JSON Schema object node can carry that Natural Schema has no
772
+ // representation for. Anything present here (or any other unrecognized key)
773
+ // is dropped silently and logged, never thrown.
774
+ const LOSSY_OBJECT_KEYWORDS = [
775
+ "$defs",
776
+ "$id",
777
+ "$ref",
778
+ "$schema",
779
+ "additionalProperties",
780
+ "const",
781
+ "default",
782
+ "description",
783
+ "format",
784
+ "maxLength",
785
+ "maximum",
786
+ "minLength",
787
+ "minimum",
788
+ "multipleOf",
789
+ "nullable",
790
+ "allOf",
791
+ "anyOf",
792
+ "oneOf",
793
+ "pattern",
794
+ ];
795
+ const KNOWN_KEYWORDS = new Set([
796
+ "type",
797
+ "properties",
798
+ "required",
799
+ "items",
800
+ "enum",
801
+ ...LOSSY_OBJECT_KEYWORDS,
802
+ ]);
803
+ /**
804
+ * Duck-type check for a bare JSON Schema object node: `{ type: "object", properties: {...} }`.
805
+ * Does not require the OpenAI-style `{ type: "json_schema", ... }` envelope.
806
+ */
807
+ function isJsonSchema$1(value) {
808
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
809
+ return false;
810
+ }
811
+ const schema = value;
812
+ return (schema.type === "object" &&
813
+ typeof schema.properties === "object" &&
814
+ schema.properties !== null &&
815
+ !Array.isArray(schema.properties));
816
+ }
817
+ /**
818
+ * Convert a Natural Schema to JSON Schema. Lossless: Natural Schema is a
819
+ * strict subset of what JSON Schema can express.
820
+ */
821
+ function naturalSchemaToJsonSchema(schema) {
822
+ return v4.z.toJSONSchema(naturalZodSchema(schema));
823
+ }
824
+ function logDroppedKeywords(schema, path) {
825
+ for (const key of Object.keys(schema)) {
826
+ if (!KNOWN_KEYWORDS.has(key)) {
827
+ log$1.debug(`[jsonSchemaToNaturalSchema] Dropping unrecognized keyword "${key}" at "${path}"`);
828
+ }
829
+ else if (LOSSY_OBJECT_KEYWORDS.includes(key) &&
830
+ schema[key] !== undefined) {
831
+ log$1.debug(`[jsonSchemaToNaturalSchema] Dropping unsupported keyword "${key}" at "${path}"`);
832
+ }
833
+ }
834
+ }
835
+ function convertNode(schema, path) {
836
+ logDroppedKeywords(schema, path);
837
+ if (Array.isArray(schema.enum)) {
838
+ return schema.enum;
839
+ }
840
+ switch (schema.type) {
841
+ case "string":
842
+ return String;
843
+ case "number":
844
+ case "integer":
845
+ return Number;
846
+ case "boolean":
847
+ return Boolean;
848
+ case "array": {
849
+ const items = schema.items;
850
+ if (typeof items !== "object" || items === null || Array.isArray(items)) {
851
+ return Array;
852
+ }
853
+ return [convertNode(items, `${path}[]`)];
854
+ }
855
+ case "object": {
856
+ const properties = schema.properties;
857
+ if (!properties || Object.keys(properties).length === 0) {
858
+ return Object;
859
+ }
860
+ const required = new Set(Array.isArray(schema.required) ? schema.required : []);
861
+ const result = {};
862
+ for (const [key, value] of Object.entries(properties)) {
863
+ if (!required.has(key)) {
864
+ log$1.debug(`[jsonSchemaToNaturalSchema] Field "${path}.${key}" is optional; Natural Schema has no optional marker — treating as required`);
865
+ }
866
+ result[key] = convertNode(value, `${path}.${key}`);
867
+ }
868
+ return result;
869
+ }
870
+ default:
871
+ log$1.debug(`[jsonSchemaToNaturalSchema] Unsupported type "${String(schema.type)}" at "${path}"; defaulting to Object`);
872
+ return Object;
873
+ }
874
+ }
875
+ /**
876
+ * Convert a JSON Schema object node to Natural Schema. Lossy: constraints,
877
+ * descriptions, defaults, unions, and optionality have no Natural Schema
878
+ * representation. Dropped keywords are logged at debug level, never thrown.
879
+ */
880
+ function jsonSchemaToNaturalSchema(schema) {
881
+ return convertNode(schema, "$");
882
+ }
883
+
771
884
  /**
772
885
  * Converts a JSON Schema (Draft 2020-12) object to the OpenAPI 3.0 schema subset
773
886
  * that Gemini's `responseSchema` accepts. This constrains generation (not just validation)
@@ -1716,11 +1829,13 @@ class AnthropicAdapter extends BaseProviderAdapter {
1716
1829
  }
1717
1830
  formatOutputSchema(schema) {
1718
1831
  let jsonSchema;
1719
- // Check if schema is already a JsonObject with type "json_schema"
1720
- if (typeof schema === "object" &&
1832
+ // Check if schema is already a JsonObject either the OpenAI-style
1833
+ // `{ type: "json_schema", ... }` envelope or a bare `{ type: "object", properties }` node
1834
+ if ((typeof schema === "object" &&
1721
1835
  schema !== null &&
1722
1836
  !Array.isArray(schema) &&
1723
- schema.type === "json_schema") {
1837
+ schema.type === "json_schema") ||
1838
+ isJsonSchema$1(schema)) {
1724
1839
  jsonSchema = structuredClone(schema);
1725
1840
  jsonSchema.type = "object"; // Validator does not recognize "json_schema"
1726
1841
  }
@@ -2382,6 +2497,10 @@ class BedrockAdapter extends BaseProviderAdapter {
2382
2497
  }));
2383
2498
  }
2384
2499
  formatOutputSchema(schema) {
2500
+ // Bare JSON Schema node: `{ type: "object", properties: {...} }`
2501
+ if (isJsonSchema$1(schema)) {
2502
+ return structuredClone(schema);
2503
+ }
2385
2504
  const zodSchema = schema instanceof v4.z.ZodType
2386
2505
  ? schema
2387
2506
  : naturalZodSchema(schema);
@@ -2918,11 +3037,13 @@ class GoogleAdapter extends BaseProviderAdapter {
2918
3037
  }
2919
3038
  formatOutputSchema(schema) {
2920
3039
  let jsonSchema;
2921
- // Check if schema is already a JsonObject with type "json_schema"
2922
- if (typeof schema === "object" &&
3040
+ // Check if schema is already a JsonObject either the OpenAI-style
3041
+ // `{ type: "json_schema", ... }` envelope or a bare `{ type: "object", properties }` node
3042
+ if ((typeof schema === "object" &&
2923
3043
  schema !== null &&
2924
3044
  !Array.isArray(schema) &&
2925
- schema.type === "json_schema") {
3045
+ schema.type === "json_schema") ||
3046
+ isJsonSchema$1(schema)) {
2926
3047
  jsonSchema = structuredClone(schema);
2927
3048
  jsonSchema.type = "object";
2928
3049
  }
@@ -3889,21 +4010,35 @@ class OpenAiAdapter extends BaseProviderAdapter {
3889
4010
  schema.type === "json_schema") {
3890
4011
  return schema;
3891
4012
  }
3892
- // Convert NaturalSchema to Zod schema if needed
3893
- const zodSchema = schema instanceof v4.z.ZodType
3894
- ? schema
3895
- : naturalZodSchema(schema);
3896
- const responseFormat = zodResponseFormat(zodSchema, "response");
3897
- // Re-spread to drop zod v4's non-enumerable `~standard` Standard-Schema
3898
- // interop marker, then strip `$schema`: OpenAI's strict json_schema subset
3899
- // does not recognize the draft-2020-12 `$schema` keyword, and shipping it
3900
- // can leave strict structured-output enforcement silently disabled (the
3901
- // model then free-forms, omitting required fields and corrupting keys).
3902
- // Mirrors the OpenRouter adapter's sanitization.
3903
- const jsonSchema = {
3904
- ...v4.z.toJSONSchema(zodSchema),
3905
- };
3906
- delete jsonSchema.$schema;
4013
+ // Bare JSON Schema node: `{ type: "object", properties: {...} }`
4014
+ // Skip the zod round-trip and use it directly (still needs the
4015
+ // additionalProperties + envelope treatment below).
4016
+ let jsonSchema;
4017
+ let name = "response";
4018
+ let strict = true;
4019
+ if (isJsonSchema$1(schema)) {
4020
+ jsonSchema = { ...structuredClone(schema) };
4021
+ delete jsonSchema.$schema;
4022
+ }
4023
+ else {
4024
+ // Convert NaturalSchema to Zod schema if needed
4025
+ const zodSchema = schema instanceof v4.z.ZodType
4026
+ ? schema
4027
+ : naturalZodSchema(schema);
4028
+ const responseFormat = zodResponseFormat(zodSchema, "response");
4029
+ // Re-spread to drop zod v4's non-enumerable `~standard` Standard-Schema
4030
+ // interop marker, then strip `$schema`: OpenAI's strict json_schema subset
4031
+ // does not recognize the draft-2020-12 `$schema` keyword, and shipping it
4032
+ // can leave strict structured-output enforcement silently disabled (the
4033
+ // model then free-forms, omitting required fields and corrupting keys).
4034
+ // Mirrors the OpenRouter adapter's sanitization.
4035
+ jsonSchema = {
4036
+ ...v4.z.toJSONSchema(zodSchema),
4037
+ };
4038
+ delete jsonSchema.$schema;
4039
+ name = responseFormat.json_schema.name;
4040
+ strict = responseFormat.json_schema.strict;
4041
+ }
3907
4042
  // OpenAI requires additionalProperties to be false on all objects
3908
4043
  const checks = [jsonSchema];
3909
4044
  while (checks.length > 0) {
@@ -3919,10 +4054,10 @@ class OpenAiAdapter extends BaseProviderAdapter {
3919
4054
  checks.shift();
3920
4055
  }
3921
4056
  return {
3922
- name: responseFormat.json_schema.name,
4057
+ name,
3923
4058
  schema: jsonSchema,
3924
- strict: responseFormat.json_schema.strict,
3925
- type: responseFormat.type,
4059
+ strict,
4060
+ type: "json_schema",
3926
4061
  };
3927
4062
  }
3928
4063
  //
@@ -4564,11 +4699,13 @@ class OpenRouterAdapter extends BaseProviderAdapter {
4564
4699
  }
4565
4700
  formatOutputSchema(schema) {
4566
4701
  let jsonSchema;
4567
- // Check if schema is already a JsonObject with type "json_schema"
4568
- if (typeof schema === "object" &&
4702
+ // Check if schema is already a JsonObject either the OpenAI-style
4703
+ // `{ type: "json_schema", ... }` envelope or a bare `{ type: "object", properties }` node
4704
+ if ((typeof schema === "object" &&
4569
4705
  schema !== null &&
4570
4706
  !Array.isArray(schema) &&
4571
- schema.type === "json_schema") {
4707
+ schema.type === "json_schema") ||
4708
+ isJsonSchema$1(schema)) {
4572
4709
  jsonSchema = structuredClone(schema);
4573
4710
  jsonSchema.type = "object"; // Normalize type
4574
4711
  }
@@ -9040,6 +9177,8 @@ exports.isLlmOperateInput = isLlmOperateInput;
9040
9177
  exports.isLlmOperateInputContent = isLlmOperateInputContent;
9041
9178
  exports.isLlmOperateInputFile = isLlmOperateInputFile;
9042
9179
  exports.isLlmOperateInputImage = isLlmOperateInputImage;
9180
+ exports.jsonSchemaToNaturalSchema = jsonSchemaToNaturalSchema;
9181
+ exports.naturalSchemaToJsonSchema = naturalSchemaToJsonSchema;
9043
9182
  exports.toolkit = toolkit;
9044
9183
  exports.tools = tools;
9045
9184
  //# sourceMappingURL=index.cjs.map