@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.
- package/dist/cjs/index.cjs +235 -36
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +14 -2
- package/dist/cjs/{constants.d.ts → src/constants.d.ts} +1 -1
- package/dist/cjs/{index.d.ts → src/index.d.ts} +1 -0
- package/dist/cjs/{operate → src/operate}/types.d.ts +2 -0
- package/dist/cjs/{util → src/util}/index.d.ts +2 -0
- package/dist/cjs/src/util/jsonSchema.d.ts +17 -0
- package/dist/cjs/src/util/maxOutputTokens.d.ts +12 -0
- package/dist/esm/index.d.ts +14 -2
- package/dist/esm/index.js +260 -63
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/{constants.d.ts → src/constants.d.ts} +1 -1
- package/dist/esm/src/index.d.ts +17 -0
- package/dist/esm/{operate → src/operate}/types.d.ts +2 -0
- package/dist/esm/{util → src/util}/index.d.ts +2 -0
- package/dist/esm/src/util/jsonSchema.d.ts +17 -0
- package/dist/esm/src/util/maxOutputTokens.d.ts +12 -0
- package/package.json +3 -2
- /package/dist/cjs/{Llm.d.ts → src/Llm.d.ts} +0 -0
- /package/dist/cjs/{observability → src/observability}/llmobs.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/OperateLoop.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/StreamLoop.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/adapters/AnthropicAdapter.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/adapters/BedrockAdapter.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/adapters/GoogleAdapter.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/adapters/OpenAiAdapter.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/adapters/OpenRouterAdapter.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/adapters/ProviderAdapter.interface.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/adapters/XaiAdapter.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/adapters/index.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/hooks/HookRunner.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/hooks/index.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/index.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/input/InputProcessor.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/input/index.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/response/ResponseBuilder.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/response/index.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/retry/RetryExecutor.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/retry/RetryPolicy.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/retry/createStaleRejectionGuard.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/retry/index.d.ts +0 -0
- /package/dist/cjs/{operate → src/operate}/retry/isTransientNetworkError.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/anthropic/AnthropicProvider.class.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/anthropic/client.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/anthropic/index.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/anthropic/types.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/anthropic/utils.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/bedrock/BedrockProvider.class.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/bedrock/index.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/bedrock/utils.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/google/GoogleProvider.class.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/google/client.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/google/index.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/google/types.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/google/utils.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/openai/OpenAiProvider.class.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/openai/client.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/openai/index.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/openai/responseFormat.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/openai/types.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/openai/utils.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/openrouter/OpenRouterProvider.class.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/openrouter/client.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/openrouter/index.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/openrouter/utils.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/xai/XaiProvider.class.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/xai/index.d.ts +0 -0
- /package/dist/cjs/{providers → src/providers}/xai/utils.d.ts +0 -0
- /package/dist/cjs/{tools → src/tools}/Toolkit.class.d.ts +0 -0
- /package/dist/cjs/{tools → src/tools}/index.d.ts +0 -0
- /package/dist/cjs/{tools → src/tools}/random.d.ts +0 -0
- /package/dist/cjs/{tools → src/tools}/roll.d.ts +0 -0
- /package/dist/cjs/{tools → src/tools}/time.d.ts +0 -0
- /package/dist/cjs/{tools → src/tools}/weather.d.ts +0 -0
- /package/dist/cjs/{types → src/types}/LlmOperateInput.guards.d.ts +0 -0
- /package/dist/cjs/{types → src/types}/LlmProvider.interface.d.ts +0 -0
- /package/dist/cjs/{types → src/types}/LlmStreamChunk.interface.d.ts +0 -0
- /package/dist/cjs/{types → src/types}/LlmTool.interface.d.ts +0 -0
- /package/dist/cjs/{upload → src/upload}/detectMimeType.d.ts +0 -0
- /package/dist/cjs/{upload → src/upload}/extractPdfPages.d.ts +0 -0
- /package/dist/cjs/{upload → src/upload}/index.d.ts +0 -0
- /package/dist/cjs/{upload → src/upload}/loadLocalFile.d.ts +0 -0
- /package/dist/cjs/{upload → src/upload}/loadS3File.d.ts +0 -0
- /package/dist/cjs/{upload → src/upload}/resolveOperateInput.d.ts +0 -0
- /package/dist/cjs/{util → src/util}/determineModelProvider.d.ts +0 -0
- /package/dist/cjs/{util → src/util}/extractReasoning.d.ts +0 -0
- /package/dist/cjs/{util → src/util}/fillFormatArrays.d.ts +0 -0
- /package/dist/cjs/{util → src/util}/formatOperateInput.d.ts +0 -0
- /package/dist/cjs/{util → src/util}/formatOperateMessage.d.ts +0 -0
- /package/dist/cjs/{util → src/util}/jsonSchemaToOpenApi3.d.ts +0 -0
- /package/dist/cjs/{util → src/util}/logger.d.ts +0 -0
- /package/dist/cjs/{util → src/util}/maxTurnsFromOptions.d.ts +0 -0
- /package/dist/cjs/{util → src/util}/naturalZodSchema.d.ts +0 -0
- /package/dist/cjs/{util → src/util}/random.d.ts +0 -0
- /package/dist/cjs/{util → src/util}/repairFormatKeys.d.ts +0 -0
- /package/dist/cjs/{util → src/util}/sse.d.ts +0 -0
- /package/dist/cjs/{util → src/util}/tryParseNumber.d.ts +0 -0
- /package/dist/esm/{Llm.d.ts → src/Llm.d.ts} +0 -0
- /package/dist/esm/{observability → src/observability}/llmobs.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/OperateLoop.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/StreamLoop.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/adapters/AnthropicAdapter.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/adapters/BedrockAdapter.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/adapters/GoogleAdapter.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/adapters/OpenAiAdapter.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/adapters/OpenRouterAdapter.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/adapters/ProviderAdapter.interface.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/adapters/XaiAdapter.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/adapters/index.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/hooks/HookRunner.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/hooks/index.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/index.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/input/InputProcessor.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/input/index.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/response/ResponseBuilder.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/response/index.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/retry/RetryExecutor.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/retry/RetryPolicy.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/retry/createStaleRejectionGuard.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/retry/index.d.ts +0 -0
- /package/dist/esm/{operate → src/operate}/retry/isTransientNetworkError.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/anthropic/AnthropicProvider.class.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/anthropic/client.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/anthropic/index.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/anthropic/types.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/anthropic/utils.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/bedrock/BedrockProvider.class.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/bedrock/index.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/bedrock/utils.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/google/GoogleProvider.class.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/google/client.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/google/index.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/google/types.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/google/utils.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/openai/OpenAiProvider.class.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/openai/client.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/openai/index.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/openai/responseFormat.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/openai/types.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/openai/utils.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/openrouter/OpenRouterProvider.class.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/openrouter/client.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/openrouter/index.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/openrouter/utils.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/xai/XaiProvider.class.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/xai/index.d.ts +0 -0
- /package/dist/esm/{providers → src/providers}/xai/utils.d.ts +0 -0
- /package/dist/esm/{tools → src/tools}/Toolkit.class.d.ts +0 -0
- /package/dist/esm/{tools → src/tools}/index.d.ts +0 -0
- /package/dist/esm/{tools → src/tools}/random.d.ts +0 -0
- /package/dist/esm/{tools → src/tools}/roll.d.ts +0 -0
- /package/dist/esm/{tools → src/tools}/time.d.ts +0 -0
- /package/dist/esm/{tools → src/tools}/weather.d.ts +0 -0
- /package/dist/esm/{types → src/types}/LlmOperateInput.guards.d.ts +0 -0
- /package/dist/esm/{types → src/types}/LlmProvider.interface.d.ts +0 -0
- /package/dist/esm/{types → src/types}/LlmStreamChunk.interface.d.ts +0 -0
- /package/dist/esm/{types → src/types}/LlmTool.interface.d.ts +0 -0
- /package/dist/esm/{upload → src/upload}/detectMimeType.d.ts +0 -0
- /package/dist/esm/{upload → src/upload}/extractPdfPages.d.ts +0 -0
- /package/dist/esm/{upload → src/upload}/index.d.ts +0 -0
- /package/dist/esm/{upload → src/upload}/loadLocalFile.d.ts +0 -0
- /package/dist/esm/{upload → src/upload}/loadS3File.d.ts +0 -0
- /package/dist/esm/{upload → src/upload}/resolveOperateInput.d.ts +0 -0
- /package/dist/esm/{util → src/util}/determineModelProvider.d.ts +0 -0
- /package/dist/esm/{util → src/util}/extractReasoning.d.ts +0 -0
- /package/dist/esm/{util → src/util}/fillFormatArrays.d.ts +0 -0
- /package/dist/esm/{util → src/util}/formatOperateInput.d.ts +0 -0
- /package/dist/esm/{util → src/util}/formatOperateMessage.d.ts +0 -0
- /package/dist/esm/{util → src/util}/jsonSchemaToOpenApi3.d.ts +0 -0
- /package/dist/esm/{util → src/util}/logger.d.ts +0 -0
- /package/dist/esm/{util → src/util}/maxTurnsFromOptions.d.ts +0 -0
- /package/dist/esm/{util → src/util}/naturalZodSchema.d.ts +0 -0
- /package/dist/esm/{util → src/util}/random.d.ts +0 -0
- /package/dist/esm/{util → src/util}/repairFormatKeys.d.ts +0 -0
- /package/dist/esm/{util → src/util}/sse.d.ts +0 -0
- /package/dist/esm/{util → src/util}/tryParseNumber.d.ts +0 -0
package/dist/cjs/index.cjs
CHANGED
|
@@ -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
|
-
|
|
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
|
|
1641
|
-
this.defaultModel),
|
|
1802
|
+
model,
|
|
1642
1803
|
messages,
|
|
1643
|
-
max_tokens:
|
|
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
|
|
1720
|
-
|
|
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
|
|
2922
|
-
|
|
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
|
-
//
|
|
3893
|
-
|
|
3894
|
-
|
|
3895
|
-
|
|
3896
|
-
|
|
3897
|
-
|
|
3898
|
-
|
|
3899
|
-
|
|
3900
|
-
|
|
3901
|
-
|
|
3902
|
-
|
|
3903
|
-
|
|
3904
|
-
|
|
3905
|
-
|
|
3906
|
-
|
|
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
|
|
4116
|
+
name,
|
|
3923
4117
|
schema: jsonSchema,
|
|
3924
|
-
strict
|
|
3925
|
-
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
|
|
4568
|
-
|
|
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
|