@jaypie/llm 1.3.4 → 1.3.6

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 (177) hide show
  1. package/dist/cjs/index.cjs +235 -36
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs/index.d.cts +14 -2
  4. package/dist/cjs/{constants.d.ts → src/constants.d.ts} +1 -1
  5. package/dist/cjs/{index.d.ts → src/index.d.ts} +1 -0
  6. package/dist/cjs/{operate → src/operate}/types.d.ts +2 -0
  7. package/dist/cjs/{util → src/util}/index.d.ts +2 -0
  8. package/dist/cjs/src/util/jsonSchema.d.ts +17 -0
  9. package/dist/cjs/src/util/maxOutputTokens.d.ts +12 -0
  10. package/dist/esm/index.d.ts +14 -2
  11. package/dist/esm/index.js +260 -63
  12. package/dist/esm/index.js.map +1 -1
  13. package/dist/esm/{constants.d.ts → src/constants.d.ts} +1 -1
  14. package/dist/esm/src/index.d.ts +17 -0
  15. package/dist/esm/{operate → src/operate}/types.d.ts +2 -0
  16. package/dist/esm/{util → src/util}/index.d.ts +2 -0
  17. package/dist/esm/src/util/jsonSchema.d.ts +17 -0
  18. package/dist/esm/src/util/maxOutputTokens.d.ts +12 -0
  19. package/package.json +3 -2
  20. /package/dist/cjs/{Llm.d.ts → src/Llm.d.ts} +0 -0
  21. /package/dist/cjs/{observability → src/observability}/llmobs.d.ts +0 -0
  22. /package/dist/cjs/{operate → src/operate}/OperateLoop.d.ts +0 -0
  23. /package/dist/cjs/{operate → src/operate}/StreamLoop.d.ts +0 -0
  24. /package/dist/cjs/{operate → src/operate}/adapters/AnthropicAdapter.d.ts +0 -0
  25. /package/dist/cjs/{operate → src/operate}/adapters/BedrockAdapter.d.ts +0 -0
  26. /package/dist/cjs/{operate → src/operate}/adapters/GoogleAdapter.d.ts +0 -0
  27. /package/dist/cjs/{operate → src/operate}/adapters/OpenAiAdapter.d.ts +0 -0
  28. /package/dist/cjs/{operate → src/operate}/adapters/OpenRouterAdapter.d.ts +0 -0
  29. /package/dist/cjs/{operate → src/operate}/adapters/ProviderAdapter.interface.d.ts +0 -0
  30. /package/dist/cjs/{operate → src/operate}/adapters/XaiAdapter.d.ts +0 -0
  31. /package/dist/cjs/{operate → src/operate}/adapters/index.d.ts +0 -0
  32. /package/dist/cjs/{operate → src/operate}/hooks/HookRunner.d.ts +0 -0
  33. /package/dist/cjs/{operate → src/operate}/hooks/index.d.ts +0 -0
  34. /package/dist/cjs/{operate → src/operate}/index.d.ts +0 -0
  35. /package/dist/cjs/{operate → src/operate}/input/InputProcessor.d.ts +0 -0
  36. /package/dist/cjs/{operate → src/operate}/input/index.d.ts +0 -0
  37. /package/dist/cjs/{operate → src/operate}/response/ResponseBuilder.d.ts +0 -0
  38. /package/dist/cjs/{operate → src/operate}/response/index.d.ts +0 -0
  39. /package/dist/cjs/{operate → src/operate}/retry/RetryExecutor.d.ts +0 -0
  40. /package/dist/cjs/{operate → src/operate}/retry/RetryPolicy.d.ts +0 -0
  41. /package/dist/cjs/{operate → src/operate}/retry/createStaleRejectionGuard.d.ts +0 -0
  42. /package/dist/cjs/{operate → src/operate}/retry/index.d.ts +0 -0
  43. /package/dist/cjs/{operate → src/operate}/retry/isTransientNetworkError.d.ts +0 -0
  44. /package/dist/cjs/{providers → src/providers}/anthropic/AnthropicProvider.class.d.ts +0 -0
  45. /package/dist/cjs/{providers → src/providers}/anthropic/client.d.ts +0 -0
  46. /package/dist/cjs/{providers → src/providers}/anthropic/index.d.ts +0 -0
  47. /package/dist/cjs/{providers → src/providers}/anthropic/types.d.ts +0 -0
  48. /package/dist/cjs/{providers → src/providers}/anthropic/utils.d.ts +0 -0
  49. /package/dist/cjs/{providers → src/providers}/bedrock/BedrockProvider.class.d.ts +0 -0
  50. /package/dist/cjs/{providers → src/providers}/bedrock/index.d.ts +0 -0
  51. /package/dist/cjs/{providers → src/providers}/bedrock/utils.d.ts +0 -0
  52. /package/dist/cjs/{providers → src/providers}/google/GoogleProvider.class.d.ts +0 -0
  53. /package/dist/cjs/{providers → src/providers}/google/client.d.ts +0 -0
  54. /package/dist/cjs/{providers → src/providers}/google/index.d.ts +0 -0
  55. /package/dist/cjs/{providers → src/providers}/google/types.d.ts +0 -0
  56. /package/dist/cjs/{providers → src/providers}/google/utils.d.ts +0 -0
  57. /package/dist/cjs/{providers → src/providers}/openai/OpenAiProvider.class.d.ts +0 -0
  58. /package/dist/cjs/{providers → src/providers}/openai/client.d.ts +0 -0
  59. /package/dist/cjs/{providers → src/providers}/openai/index.d.ts +0 -0
  60. /package/dist/cjs/{providers → src/providers}/openai/responseFormat.d.ts +0 -0
  61. /package/dist/cjs/{providers → src/providers}/openai/types.d.ts +0 -0
  62. /package/dist/cjs/{providers → src/providers}/openai/utils.d.ts +0 -0
  63. /package/dist/cjs/{providers → src/providers}/openrouter/OpenRouterProvider.class.d.ts +0 -0
  64. /package/dist/cjs/{providers → src/providers}/openrouter/client.d.ts +0 -0
  65. /package/dist/cjs/{providers → src/providers}/openrouter/index.d.ts +0 -0
  66. /package/dist/cjs/{providers → src/providers}/openrouter/utils.d.ts +0 -0
  67. /package/dist/cjs/{providers → src/providers}/xai/XaiProvider.class.d.ts +0 -0
  68. /package/dist/cjs/{providers → src/providers}/xai/index.d.ts +0 -0
  69. /package/dist/cjs/{providers → src/providers}/xai/utils.d.ts +0 -0
  70. /package/dist/cjs/{tools → src/tools}/Toolkit.class.d.ts +0 -0
  71. /package/dist/cjs/{tools → src/tools}/index.d.ts +0 -0
  72. /package/dist/cjs/{tools → src/tools}/random.d.ts +0 -0
  73. /package/dist/cjs/{tools → src/tools}/roll.d.ts +0 -0
  74. /package/dist/cjs/{tools → src/tools}/time.d.ts +0 -0
  75. /package/dist/cjs/{tools → src/tools}/weather.d.ts +0 -0
  76. /package/dist/cjs/{types → src/types}/LlmOperateInput.guards.d.ts +0 -0
  77. /package/dist/cjs/{types → src/types}/LlmProvider.interface.d.ts +0 -0
  78. /package/dist/cjs/{types → src/types}/LlmStreamChunk.interface.d.ts +0 -0
  79. /package/dist/cjs/{types → src/types}/LlmTool.interface.d.ts +0 -0
  80. /package/dist/cjs/{upload → src/upload}/detectMimeType.d.ts +0 -0
  81. /package/dist/cjs/{upload → src/upload}/extractPdfPages.d.ts +0 -0
  82. /package/dist/cjs/{upload → src/upload}/index.d.ts +0 -0
  83. /package/dist/cjs/{upload → src/upload}/loadLocalFile.d.ts +0 -0
  84. /package/dist/cjs/{upload → src/upload}/loadS3File.d.ts +0 -0
  85. /package/dist/cjs/{upload → src/upload}/resolveOperateInput.d.ts +0 -0
  86. /package/dist/cjs/{util → src/util}/determineModelProvider.d.ts +0 -0
  87. /package/dist/cjs/{util → src/util}/extractReasoning.d.ts +0 -0
  88. /package/dist/cjs/{util → src/util}/fillFormatArrays.d.ts +0 -0
  89. /package/dist/cjs/{util → src/util}/formatOperateInput.d.ts +0 -0
  90. /package/dist/cjs/{util → src/util}/formatOperateMessage.d.ts +0 -0
  91. /package/dist/cjs/{util → src/util}/jsonSchemaToOpenApi3.d.ts +0 -0
  92. /package/dist/cjs/{util → src/util}/logger.d.ts +0 -0
  93. /package/dist/cjs/{util → src/util}/maxTurnsFromOptions.d.ts +0 -0
  94. /package/dist/cjs/{util → src/util}/naturalZodSchema.d.ts +0 -0
  95. /package/dist/cjs/{util → src/util}/random.d.ts +0 -0
  96. /package/dist/cjs/{util → src/util}/repairFormatKeys.d.ts +0 -0
  97. /package/dist/cjs/{util → src/util}/sse.d.ts +0 -0
  98. /package/dist/cjs/{util → src/util}/tryParseNumber.d.ts +0 -0
  99. /package/dist/esm/{Llm.d.ts → src/Llm.d.ts} +0 -0
  100. /package/dist/esm/{observability → src/observability}/llmobs.d.ts +0 -0
  101. /package/dist/esm/{operate → src/operate}/OperateLoop.d.ts +0 -0
  102. /package/dist/esm/{operate → src/operate}/StreamLoop.d.ts +0 -0
  103. /package/dist/esm/{operate → src/operate}/adapters/AnthropicAdapter.d.ts +0 -0
  104. /package/dist/esm/{operate → src/operate}/adapters/BedrockAdapter.d.ts +0 -0
  105. /package/dist/esm/{operate → src/operate}/adapters/GoogleAdapter.d.ts +0 -0
  106. /package/dist/esm/{operate → src/operate}/adapters/OpenAiAdapter.d.ts +0 -0
  107. /package/dist/esm/{operate → src/operate}/adapters/OpenRouterAdapter.d.ts +0 -0
  108. /package/dist/esm/{operate → src/operate}/adapters/ProviderAdapter.interface.d.ts +0 -0
  109. /package/dist/esm/{operate → src/operate}/adapters/XaiAdapter.d.ts +0 -0
  110. /package/dist/esm/{operate → src/operate}/adapters/index.d.ts +0 -0
  111. /package/dist/esm/{operate → src/operate}/hooks/HookRunner.d.ts +0 -0
  112. /package/dist/esm/{operate → src/operate}/hooks/index.d.ts +0 -0
  113. /package/dist/esm/{operate → src/operate}/index.d.ts +0 -0
  114. /package/dist/esm/{operate → src/operate}/input/InputProcessor.d.ts +0 -0
  115. /package/dist/esm/{operate → src/operate}/input/index.d.ts +0 -0
  116. /package/dist/esm/{operate → src/operate}/response/ResponseBuilder.d.ts +0 -0
  117. /package/dist/esm/{operate → src/operate}/response/index.d.ts +0 -0
  118. /package/dist/esm/{operate → src/operate}/retry/RetryExecutor.d.ts +0 -0
  119. /package/dist/esm/{operate → src/operate}/retry/RetryPolicy.d.ts +0 -0
  120. /package/dist/esm/{operate → src/operate}/retry/createStaleRejectionGuard.d.ts +0 -0
  121. /package/dist/esm/{operate → src/operate}/retry/index.d.ts +0 -0
  122. /package/dist/esm/{operate → src/operate}/retry/isTransientNetworkError.d.ts +0 -0
  123. /package/dist/esm/{providers → src/providers}/anthropic/AnthropicProvider.class.d.ts +0 -0
  124. /package/dist/esm/{providers → src/providers}/anthropic/client.d.ts +0 -0
  125. /package/dist/esm/{providers → src/providers}/anthropic/index.d.ts +0 -0
  126. /package/dist/esm/{providers → src/providers}/anthropic/types.d.ts +0 -0
  127. /package/dist/esm/{providers → src/providers}/anthropic/utils.d.ts +0 -0
  128. /package/dist/esm/{providers → src/providers}/bedrock/BedrockProvider.class.d.ts +0 -0
  129. /package/dist/esm/{providers → src/providers}/bedrock/index.d.ts +0 -0
  130. /package/dist/esm/{providers → src/providers}/bedrock/utils.d.ts +0 -0
  131. /package/dist/esm/{providers → src/providers}/google/GoogleProvider.class.d.ts +0 -0
  132. /package/dist/esm/{providers → src/providers}/google/client.d.ts +0 -0
  133. /package/dist/esm/{providers → src/providers}/google/index.d.ts +0 -0
  134. /package/dist/esm/{providers → src/providers}/google/types.d.ts +0 -0
  135. /package/dist/esm/{providers → src/providers}/google/utils.d.ts +0 -0
  136. /package/dist/esm/{providers → src/providers}/openai/OpenAiProvider.class.d.ts +0 -0
  137. /package/dist/esm/{providers → src/providers}/openai/client.d.ts +0 -0
  138. /package/dist/esm/{providers → src/providers}/openai/index.d.ts +0 -0
  139. /package/dist/esm/{providers → src/providers}/openai/responseFormat.d.ts +0 -0
  140. /package/dist/esm/{providers → src/providers}/openai/types.d.ts +0 -0
  141. /package/dist/esm/{providers → src/providers}/openai/utils.d.ts +0 -0
  142. /package/dist/esm/{providers → src/providers}/openrouter/OpenRouterProvider.class.d.ts +0 -0
  143. /package/dist/esm/{providers → src/providers}/openrouter/client.d.ts +0 -0
  144. /package/dist/esm/{providers → src/providers}/openrouter/index.d.ts +0 -0
  145. /package/dist/esm/{providers → src/providers}/openrouter/utils.d.ts +0 -0
  146. /package/dist/esm/{providers → src/providers}/xai/XaiProvider.class.d.ts +0 -0
  147. /package/dist/esm/{providers → src/providers}/xai/index.d.ts +0 -0
  148. /package/dist/esm/{providers → src/providers}/xai/utils.d.ts +0 -0
  149. /package/dist/esm/{tools → src/tools}/Toolkit.class.d.ts +0 -0
  150. /package/dist/esm/{tools → src/tools}/index.d.ts +0 -0
  151. /package/dist/esm/{tools → src/tools}/random.d.ts +0 -0
  152. /package/dist/esm/{tools → src/tools}/roll.d.ts +0 -0
  153. /package/dist/esm/{tools → src/tools}/time.d.ts +0 -0
  154. /package/dist/esm/{tools → src/tools}/weather.d.ts +0 -0
  155. /package/dist/esm/{types → src/types}/LlmOperateInput.guards.d.ts +0 -0
  156. /package/dist/esm/{types → src/types}/LlmProvider.interface.d.ts +0 -0
  157. /package/dist/esm/{types → src/types}/LlmStreamChunk.interface.d.ts +0 -0
  158. /package/dist/esm/{types → src/types}/LlmTool.interface.d.ts +0 -0
  159. /package/dist/esm/{upload → src/upload}/detectMimeType.d.ts +0 -0
  160. /package/dist/esm/{upload → src/upload}/extractPdfPages.d.ts +0 -0
  161. /package/dist/esm/{upload → src/upload}/index.d.ts +0 -0
  162. /package/dist/esm/{upload → src/upload}/loadLocalFile.d.ts +0 -0
  163. /package/dist/esm/{upload → src/upload}/loadS3File.d.ts +0 -0
  164. /package/dist/esm/{upload → src/upload}/resolveOperateInput.d.ts +0 -0
  165. /package/dist/esm/{util → src/util}/determineModelProvider.d.ts +0 -0
  166. /package/dist/esm/{util → src/util}/extractReasoning.d.ts +0 -0
  167. /package/dist/esm/{util → src/util}/fillFormatArrays.d.ts +0 -0
  168. /package/dist/esm/{util → src/util}/formatOperateInput.d.ts +0 -0
  169. /package/dist/esm/{util → src/util}/formatOperateMessage.d.ts +0 -0
  170. /package/dist/esm/{util → src/util}/jsonSchemaToOpenApi3.d.ts +0 -0
  171. /package/dist/esm/{util → src/util}/logger.d.ts +0 -0
  172. /package/dist/esm/{util → src/util}/maxTurnsFromOptions.d.ts +0 -0
  173. /package/dist/esm/{util → src/util}/naturalZodSchema.d.ts +0 -0
  174. /package/dist/esm/{util → src/util}/random.d.ts +0 -0
  175. /package/dist/esm/{util → src/util}/repairFormatKeys.d.ts +0 -0
  176. /package/dist/esm/{util → src/util}/sse.d.ts +0 -0
  177. /package/dist/esm/{util → src/util}/tryParseNumber.d.ts +0 -0
@@ -101,7 +101,10 @@ const PROVIDER = {
101
101
  ANTHROPIC: {
102
102
  // https://docs.anthropic.com/en/docs/about-claude/models/overview
103
103
  MAX_TOKENS: {
104
- DEFAULT: 4096,
104
+ // Non-streaming ceiling: responses above ~16K output tokens risk HTTP
105
+ // timeouts; streaming requests resolve to the model maximum instead
106
+ // (see util/maxOutputTokens.ts)
107
+ DEFAULT: 16384,
105
108
  },
106
109
  MODEL: {
107
110
  DEFAULT: FIRST_CLASS_PROVIDER.ANTHROPIC.DEFAULT,
@@ -450,14 +453,12 @@ class BaseProviderAdapter {
450
453
  /**
451
454
  * Default implementation returns false - override for providers with native structured output
452
455
  */
453
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
454
456
  hasStructuredOutput(_response) {
455
457
  return false;
456
458
  }
457
459
  /**
458
460
  * Default implementation returns undefined - override for providers with native structured output
459
461
  */
460
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
461
462
  extractStructuredOutput(_response) {
462
463
  return undefined;
463
464
  }
@@ -768,6 +769,119 @@ function formatOperateInput(input, options) {
768
769
  return [input];
769
770
  }
770
771
 
772
+ // Keywords a JSON Schema object node can carry that Natural Schema has no
773
+ // representation for. Anything present here (or any other unrecognized key)
774
+ // is dropped silently and logged, never thrown.
775
+ const LOSSY_OBJECT_KEYWORDS = [
776
+ "$defs",
777
+ "$id",
778
+ "$ref",
779
+ "$schema",
780
+ "additionalProperties",
781
+ "const",
782
+ "default",
783
+ "description",
784
+ "format",
785
+ "maxLength",
786
+ "maximum",
787
+ "minLength",
788
+ "minimum",
789
+ "multipleOf",
790
+ "nullable",
791
+ "allOf",
792
+ "anyOf",
793
+ "oneOf",
794
+ "pattern",
795
+ ];
796
+ const KNOWN_KEYWORDS = new Set([
797
+ "type",
798
+ "properties",
799
+ "required",
800
+ "items",
801
+ "enum",
802
+ ...LOSSY_OBJECT_KEYWORDS,
803
+ ]);
804
+ /**
805
+ * Duck-type check for a bare JSON Schema object node: `{ type: "object", properties: {...} }`.
806
+ * Does not require the OpenAI-style `{ type: "json_schema", ... }` envelope.
807
+ */
808
+ function isJsonSchema$1(value) {
809
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
810
+ return false;
811
+ }
812
+ const schema = value;
813
+ return (schema.type === "object" &&
814
+ typeof schema.properties === "object" &&
815
+ schema.properties !== null &&
816
+ !Array.isArray(schema.properties));
817
+ }
818
+ /**
819
+ * Convert a Natural Schema to JSON Schema. Lossless: Natural Schema is a
820
+ * strict subset of what JSON Schema can express.
821
+ */
822
+ function naturalSchemaToJsonSchema(schema) {
823
+ return v4.z.toJSONSchema(naturalZodSchema(schema));
824
+ }
825
+ function logDroppedKeywords(schema, path) {
826
+ for (const key of Object.keys(schema)) {
827
+ if (!KNOWN_KEYWORDS.has(key)) {
828
+ log$1.debug(`[jsonSchemaToNaturalSchema] Dropping unrecognized keyword "${key}" at "${path}"`);
829
+ }
830
+ else if (LOSSY_OBJECT_KEYWORDS.includes(key) &&
831
+ schema[key] !== undefined) {
832
+ log$1.debug(`[jsonSchemaToNaturalSchema] Dropping unsupported keyword "${key}" at "${path}"`);
833
+ }
834
+ }
835
+ }
836
+ function convertNode(schema, path) {
837
+ logDroppedKeywords(schema, path);
838
+ if (Array.isArray(schema.enum)) {
839
+ return schema.enum;
840
+ }
841
+ switch (schema.type) {
842
+ case "string":
843
+ return String;
844
+ case "number":
845
+ case "integer":
846
+ return Number;
847
+ case "boolean":
848
+ return Boolean;
849
+ case "array": {
850
+ const items = schema.items;
851
+ if (typeof items !== "object" || items === null || Array.isArray(items)) {
852
+ return Array;
853
+ }
854
+ return [convertNode(items, `${path}[]`)];
855
+ }
856
+ case "object": {
857
+ const properties = schema.properties;
858
+ if (!properties || Object.keys(properties).length === 0) {
859
+ return Object;
860
+ }
861
+ const required = new Set(Array.isArray(schema.required) ? schema.required : []);
862
+ const result = {};
863
+ for (const [key, value] of Object.entries(properties)) {
864
+ if (!required.has(key)) {
865
+ log$1.debug(`[jsonSchemaToNaturalSchema] Field "${path}.${key}" is optional; Natural Schema has no optional marker — treating as required`);
866
+ }
867
+ result[key] = convertNode(value, `${path}.${key}`);
868
+ }
869
+ return result;
870
+ }
871
+ default:
872
+ log$1.debug(`[jsonSchemaToNaturalSchema] Unsupported type "${String(schema.type)}" at "${path}"; defaulting to Object`);
873
+ return Object;
874
+ }
875
+ }
876
+ /**
877
+ * Convert a JSON Schema object node to Natural Schema. Lossy: constraints,
878
+ * descriptions, defaults, unions, and optionality have no Natural Schema
879
+ * representation. Dropped keywords are logged at debug level, never thrown.
880
+ */
881
+ function jsonSchemaToNaturalSchema(schema) {
882
+ return convertNode(schema, "$");
883
+ }
884
+
771
885
  /**
772
886
  * Converts a JSON Schema (Draft 2020-12) object to the OpenAPI 3.0 schema subset
773
887
  * that Gemini's `responseSchema` accepts. This constrains generation (not just validation)
@@ -812,6 +926,52 @@ function jsonSchemaToOpenApi3(schema) {
812
926
 
813
927
  const getLogger$6 = () => log$1.log.lib({ lib: kit.JAYPIE.LIB.LLM });
814
928
 
929
+ //
930
+ //
931
+ // Constants
932
+ //
933
+ // Non-streaming requests above ~16K output tokens risk HTTP timeouts
934
+ // (Anthropic guidance is to stream anything larger), so non-streaming
935
+ // defaults are capped here and only streaming requests resolve to the
936
+ // full model maximum.
937
+ const NON_STREAMING_MAX_TOKENS = PROVIDER.ANTHROPIC.MAX_TOKENS.DEFAULT;
938
+ // Maximum output tokens by model; first match wins.
939
+ // Providers without low output ceilings (OpenAI, xAI) are intentionally
940
+ // absent — their requests leave the limit unset.
941
+ const MODEL_MAX_OUTPUT_TOKENS = [
942
+ // Anthropic — https://platform.claude.com/docs/en/about-claude/models/overview
943
+ { pattern: /^claude-opus-4-(0$|1$|1-|2025)/, tokens: 32000 },
944
+ { pattern: /^claude-opus-4-5/, tokens: 64000 },
945
+ { pattern: /^claude-sonnet-4-(0$|5$|5-|2025)/, tokens: 64000 },
946
+ { pattern: /haiku/, tokens: 64000 },
947
+ { pattern: /claude|fable|mythos|opus|sonnet/, tokens: 128000 },
948
+ // Google — https://ai.google.dev/gemini-api/docs/models
949
+ { pattern: /gemini-(2\.5|3)/, tokens: 65536 },
950
+ { pattern: /gemini/, tokens: 8192 },
951
+ ];
952
+ //
953
+ //
954
+ // Main
955
+ //
956
+ /**
957
+ * Maximum output tokens the model supports, or undefined when unknown.
958
+ */
959
+ function maxOutputTokens(model) {
960
+ const match = MODEL_MAX_OUTPUT_TOKENS.find(({ pattern }) => pattern.test(model));
961
+ return match?.tokens;
962
+ }
963
+ /**
964
+ * Default output token limit for a request: the model maximum when
965
+ * streaming, capped at the non-streaming maximum otherwise. Returns
966
+ * undefined when the model's maximum is unknown.
967
+ */
968
+ function resolveMaxOutputTokens(model, { stream = false } = {}) {
969
+ const max = maxOutputTokens(model);
970
+ if (max === undefined)
971
+ return undefined;
972
+ return stream ? max : Math.min(max, NON_STREAMING_MAX_TOKENS);
973
+ }
974
+
815
975
  // Turn policy constants
816
976
  const MAX_TURNS_ABSOLUTE_LIMIT = 72;
817
977
  const MAX_TURNS_DEFAULT_LIMIT = 24;
@@ -1636,11 +1796,13 @@ class AnthropicAdapter extends BaseProviderAdapter {
1636
1796
  lastMsg.content = lastMsg.content + "\n\n" + request.instructions;
1637
1797
  }
1638
1798
  }
1799
+ const model = (request.model ||
1800
+ this.defaultModel);
1639
1801
  const anthropicRequest = {
1640
- model: (request.model ||
1641
- this.defaultModel),
1802
+ model,
1642
1803
  messages,
1643
- max_tokens: PROVIDER.ANTHROPIC.MAX_TOKENS.DEFAULT,
1804
+ max_tokens: resolveMaxOutputTokens(model, { stream: request.stream }) ??
1805
+ PROVIDER.ANTHROPIC.MAX_TOKENS.DEFAULT,
1644
1806
  stream: false,
1645
1807
  };
1646
1808
  if (request.system) {
@@ -1703,7 +1865,6 @@ class AnthropicAdapter extends BaseProviderAdapter {
1703
1865
  // outputSchema is part of the interface contract but Anthropic now uses
1704
1866
  // native `output_format` (set in buildRequest), so we no longer inject a
1705
1867
  // synthetic structured-output tool here.
1706
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
1707
1868
  _outputSchema) {
1708
1869
  return toolkit.tools.map((tool) => ({
1709
1870
  name: tool.name,
@@ -1716,11 +1877,13 @@ class AnthropicAdapter extends BaseProviderAdapter {
1716
1877
  }
1717
1878
  formatOutputSchema(schema) {
1718
1879
  let jsonSchema;
1719
- // Check if schema is already a JsonObject with type "json_schema"
1720
- if (typeof schema === "object" &&
1880
+ // Check if schema is already a JsonObject either the OpenAI-style
1881
+ // `{ type: "json_schema", ... }` envelope or a bare `{ type: "object", properties }` node
1882
+ if ((typeof schema === "object" &&
1721
1883
  schema !== null &&
1722
1884
  !Array.isArray(schema) &&
1723
- schema.type === "json_schema") {
1885
+ schema.type === "json_schema") ||
1886
+ isJsonSchema$1(schema)) {
1724
1887
  jsonSchema = structuredClone(schema);
1725
1888
  jsonSchema.type = "object"; // Validator does not recognize "json_schema"
1726
1889
  }
@@ -2382,6 +2545,10 @@ class BedrockAdapter extends BaseProviderAdapter {
2382
2545
  }));
2383
2546
  }
2384
2547
  formatOutputSchema(schema) {
2548
+ // Bare JSON Schema node: `{ type: "object", properties: {...} }`
2549
+ if (isJsonSchema$1(schema)) {
2550
+ return structuredClone(schema);
2551
+ }
2385
2552
  const zodSchema = schema instanceof v4.z.ZodType
2386
2553
  ? schema
2387
2554
  : naturalZodSchema(schema);
@@ -2884,6 +3051,18 @@ class GoogleAdapter extends BaseProviderAdapter {
2884
3051
  : structuredOutputInstruction,
2885
3052
  };
2886
3053
  }
3054
+ // Default output ceiling: Google's own default (8,192) silently
3055
+ // truncates long generations, so resolve to the model maximum (capped
3056
+ // for non-streaming); providerOptions below override
3057
+ const maxOutputTokens = resolveMaxOutputTokens(geminiRequest.model, {
3058
+ stream: request.stream,
3059
+ });
3060
+ if (maxOutputTokens !== undefined) {
3061
+ geminiRequest.config = {
3062
+ ...geminiRequest.config,
3063
+ maxOutputTokens,
3064
+ };
3065
+ }
2887
3066
  // Add provider-specific options
2888
3067
  if (request.providerOptions) {
2889
3068
  geminiRequest.config = {
@@ -2905,7 +3084,6 @@ class GoogleAdapter extends BaseProviderAdapter {
2905
3084
  // structured output via `responseJsonSchema`/`responseSchema` (or the
2906
3085
  // legacy fake-tool injected in buildRequest as a fallback). We no longer
2907
3086
  // inject a synthetic structured-output tool here.
2908
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2909
3087
  _outputSchema) {
2910
3088
  return toolkit.tools.map((tool) => ({
2911
3089
  name: tool.name,
@@ -2918,11 +3096,13 @@ class GoogleAdapter extends BaseProviderAdapter {
2918
3096
  }
2919
3097
  formatOutputSchema(schema) {
2920
3098
  let jsonSchema;
2921
- // Check if schema is already a JsonObject with type "json_schema"
2922
- if (typeof schema === "object" &&
3099
+ // Check if schema is already a JsonObject either the OpenAI-style
3100
+ // `{ type: "json_schema", ... }` envelope or a bare `{ type: "object", properties }` node
3101
+ if ((typeof schema === "object" &&
2923
3102
  schema !== null &&
2924
3103
  !Array.isArray(schema) &&
2925
- schema.type === "json_schema") {
3104
+ schema.type === "json_schema") ||
3105
+ isJsonSchema$1(schema)) {
2926
3106
  jsonSchema = structuredClone(schema);
2927
3107
  jsonSchema.type = "object";
2928
3108
  }
@@ -3889,21 +4069,35 @@ class OpenAiAdapter extends BaseProviderAdapter {
3889
4069
  schema.type === "json_schema") {
3890
4070
  return schema;
3891
4071
  }
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;
4072
+ // Bare JSON Schema node: `{ type: "object", properties: {...} }`
4073
+ // Skip the zod round-trip and use it directly (still needs the
4074
+ // additionalProperties + envelope treatment below).
4075
+ let jsonSchema;
4076
+ let name = "response";
4077
+ let strict = true;
4078
+ if (isJsonSchema$1(schema)) {
4079
+ jsonSchema = { ...structuredClone(schema) };
4080
+ delete jsonSchema.$schema;
4081
+ }
4082
+ else {
4083
+ // Convert NaturalSchema to Zod schema if needed
4084
+ const zodSchema = schema instanceof v4.z.ZodType
4085
+ ? schema
4086
+ : naturalZodSchema(schema);
4087
+ const responseFormat = zodResponseFormat(zodSchema, "response");
4088
+ // Re-spread to drop zod v4's non-enumerable `~standard` Standard-Schema
4089
+ // interop marker, then strip `$schema`: OpenAI's strict json_schema subset
4090
+ // does not recognize the draft-2020-12 `$schema` keyword, and shipping it
4091
+ // can leave strict structured-output enforcement silently disabled (the
4092
+ // model then free-forms, omitting required fields and corrupting keys).
4093
+ // Mirrors the OpenRouter adapter's sanitization.
4094
+ jsonSchema = {
4095
+ ...v4.z.toJSONSchema(zodSchema),
4096
+ };
4097
+ delete jsonSchema.$schema;
4098
+ name = responseFormat.json_schema.name;
4099
+ strict = responseFormat.json_schema.strict;
4100
+ }
3907
4101
  // OpenAI requires additionalProperties to be false on all objects
3908
4102
  const checks = [jsonSchema];
3909
4103
  while (checks.length > 0) {
@@ -3919,10 +4113,10 @@ class OpenAiAdapter extends BaseProviderAdapter {
3919
4113
  checks.shift();
3920
4114
  }
3921
4115
  return {
3922
- name: responseFormat.json_schema.name,
4116
+ name,
3923
4117
  schema: jsonSchema,
3924
- strict: responseFormat.json_schema.strict,
3925
- type: responseFormat.type,
4118
+ strict,
4119
+ type: "json_schema",
3926
4120
  };
3927
4121
  }
3928
4122
  //
@@ -4554,7 +4748,6 @@ class OpenRouterAdapter extends BaseProviderAdapter {
4554
4748
  // native `response_format` (set in buildRequest), so we no longer inject a
4555
4749
  // synthetic structured-output tool here. The legacy fake-tool injection
4556
4750
  // happens in buildRequest only as a runtime fallback.
4557
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
4558
4751
  _outputSchema) {
4559
4752
  return toolkit.tools.map((tool) => ({
4560
4753
  name: tool.name,
@@ -4564,11 +4757,13 @@ class OpenRouterAdapter extends BaseProviderAdapter {
4564
4757
  }
4565
4758
  formatOutputSchema(schema) {
4566
4759
  let jsonSchema;
4567
- // Check if schema is already a JsonObject with type "json_schema"
4568
- if (typeof schema === "object" &&
4760
+ // Check if schema is already a JsonObject either the OpenAI-style
4761
+ // `{ type: "json_schema", ... }` envelope or a bare `{ type: "object", properties }` node
4762
+ if ((typeof schema === "object" &&
4569
4763
  schema !== null &&
4570
4764
  !Array.isArray(schema) &&
4571
- schema.type === "json_schema") {
4765
+ schema.type === "json_schema") ||
4766
+ isJsonSchema$1(schema)) {
4572
4767
  jsonSchema = structuredClone(schema);
4573
4768
  jsonSchema.type = "object"; // Normalize type
4574
4769
  }
@@ -6884,6 +7079,7 @@ class StreamLoop {
6884
7079
  messages: state.currentInput,
6885
7080
  model: options.model ?? this.adapter.defaultModel,
6886
7081
  providerOptions: options.providerOptions,
7082
+ stream: true,
6887
7083
  system: options.system,
6888
7084
  temperature: options.temperature,
6889
7085
  tools: state.formattedTools,
@@ -6952,6 +7148,7 @@ class StreamLoop {
6952
7148
  messages: state.currentInput,
6953
7149
  model: options.model ?? this.adapter.defaultModel,
6954
7150
  providerOptions: options.providerOptions,
7151
+ stream: true,
6955
7152
  system: options.system,
6956
7153
  temperature: options.temperature,
6957
7154
  tools: state.formattedTools,
@@ -9040,6 +9237,8 @@ exports.isLlmOperateInput = isLlmOperateInput;
9040
9237
  exports.isLlmOperateInputContent = isLlmOperateInputContent;
9041
9238
  exports.isLlmOperateInputFile = isLlmOperateInputFile;
9042
9239
  exports.isLlmOperateInputImage = isLlmOperateInputImage;
9240
+ exports.jsonSchemaToNaturalSchema = jsonSchemaToNaturalSchema;
9241
+ exports.naturalSchemaToJsonSchema = naturalSchemaToJsonSchema;
9043
9242
  exports.toolkit = toolkit;
9044
9243
  exports.tools = tools;
9045
9244
  //# sourceMappingURL=index.cjs.map