@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/esm/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ConfigurationError, BadGatewayError, TooManyRequestsError, NotImplementedError } from '@jaypie/errors';
|
|
2
|
-
import log$
|
|
2
|
+
import log$1, { log as log$2 } from '@jaypie/logger';
|
|
3
3
|
import { z } from 'zod/v4';
|
|
4
4
|
import { placeholders, JAYPIE, resolveValue, sleep } from '@jaypie/kit';
|
|
5
5
|
import RandomLib from 'random';
|
|
@@ -98,7 +98,10 @@ const PROVIDER = {
|
|
|
98
98
|
ANTHROPIC: {
|
|
99
99
|
// https://docs.anthropic.com/en/docs/about-claude/models/overview
|
|
100
100
|
MAX_TOKENS: {
|
|
101
|
-
|
|
101
|
+
// Non-streaming ceiling: responses above ~16K output tokens risk HTTP
|
|
102
|
+
// timeouts; streaming requests resolve to the model maximum instead
|
|
103
|
+
// (see util/maxOutputTokens.ts)
|
|
104
|
+
DEFAULT: 16384,
|
|
102
105
|
},
|
|
103
106
|
MODEL: {
|
|
104
107
|
DEFAULT: FIRST_CLASS_PROVIDER.ANTHROPIC.DEFAULT,
|
|
@@ -447,14 +450,12 @@ class BaseProviderAdapter {
|
|
|
447
450
|
/**
|
|
448
451
|
* Default implementation returns false - override for providers with native structured output
|
|
449
452
|
*/
|
|
450
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
451
453
|
hasStructuredOutput(_response) {
|
|
452
454
|
return false;
|
|
453
455
|
}
|
|
454
456
|
/**
|
|
455
457
|
* Default implementation returns undefined - override for providers with native structured output
|
|
456
458
|
*/
|
|
457
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
458
459
|
extractStructuredOutput(_response) {
|
|
459
460
|
return undefined;
|
|
460
461
|
}
|
|
@@ -765,6 +766,119 @@ function formatOperateInput(input, options) {
|
|
|
765
766
|
return [input];
|
|
766
767
|
}
|
|
767
768
|
|
|
769
|
+
// Keywords a JSON Schema object node can carry that Natural Schema has no
|
|
770
|
+
// representation for. Anything present here (or any other unrecognized key)
|
|
771
|
+
// is dropped silently and logged, never thrown.
|
|
772
|
+
const LOSSY_OBJECT_KEYWORDS = [
|
|
773
|
+
"$defs",
|
|
774
|
+
"$id",
|
|
775
|
+
"$ref",
|
|
776
|
+
"$schema",
|
|
777
|
+
"additionalProperties",
|
|
778
|
+
"const",
|
|
779
|
+
"default",
|
|
780
|
+
"description",
|
|
781
|
+
"format",
|
|
782
|
+
"maxLength",
|
|
783
|
+
"maximum",
|
|
784
|
+
"minLength",
|
|
785
|
+
"minimum",
|
|
786
|
+
"multipleOf",
|
|
787
|
+
"nullable",
|
|
788
|
+
"allOf",
|
|
789
|
+
"anyOf",
|
|
790
|
+
"oneOf",
|
|
791
|
+
"pattern",
|
|
792
|
+
];
|
|
793
|
+
const KNOWN_KEYWORDS = new Set([
|
|
794
|
+
"type",
|
|
795
|
+
"properties",
|
|
796
|
+
"required",
|
|
797
|
+
"items",
|
|
798
|
+
"enum",
|
|
799
|
+
...LOSSY_OBJECT_KEYWORDS,
|
|
800
|
+
]);
|
|
801
|
+
/**
|
|
802
|
+
* Duck-type check for a bare JSON Schema object node: `{ type: "object", properties: {...} }`.
|
|
803
|
+
* Does not require the OpenAI-style `{ type: "json_schema", ... }` envelope.
|
|
804
|
+
*/
|
|
805
|
+
function isJsonSchema$1(value) {
|
|
806
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
807
|
+
return false;
|
|
808
|
+
}
|
|
809
|
+
const schema = value;
|
|
810
|
+
return (schema.type === "object" &&
|
|
811
|
+
typeof schema.properties === "object" &&
|
|
812
|
+
schema.properties !== null &&
|
|
813
|
+
!Array.isArray(schema.properties));
|
|
814
|
+
}
|
|
815
|
+
/**
|
|
816
|
+
* Convert a Natural Schema to JSON Schema. Lossless: Natural Schema is a
|
|
817
|
+
* strict subset of what JSON Schema can express.
|
|
818
|
+
*/
|
|
819
|
+
function naturalSchemaToJsonSchema(schema) {
|
|
820
|
+
return z.toJSONSchema(naturalZodSchema(schema));
|
|
821
|
+
}
|
|
822
|
+
function logDroppedKeywords(schema, path) {
|
|
823
|
+
for (const key of Object.keys(schema)) {
|
|
824
|
+
if (!KNOWN_KEYWORDS.has(key)) {
|
|
825
|
+
log$1.debug(`[jsonSchemaToNaturalSchema] Dropping unrecognized keyword "${key}" at "${path}"`);
|
|
826
|
+
}
|
|
827
|
+
else if (LOSSY_OBJECT_KEYWORDS.includes(key) &&
|
|
828
|
+
schema[key] !== undefined) {
|
|
829
|
+
log$1.debug(`[jsonSchemaToNaturalSchema] Dropping unsupported keyword "${key}" at "${path}"`);
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
function convertNode(schema, path) {
|
|
834
|
+
logDroppedKeywords(schema, path);
|
|
835
|
+
if (Array.isArray(schema.enum)) {
|
|
836
|
+
return schema.enum;
|
|
837
|
+
}
|
|
838
|
+
switch (schema.type) {
|
|
839
|
+
case "string":
|
|
840
|
+
return String;
|
|
841
|
+
case "number":
|
|
842
|
+
case "integer":
|
|
843
|
+
return Number;
|
|
844
|
+
case "boolean":
|
|
845
|
+
return Boolean;
|
|
846
|
+
case "array": {
|
|
847
|
+
const items = schema.items;
|
|
848
|
+
if (typeof items !== "object" || items === null || Array.isArray(items)) {
|
|
849
|
+
return Array;
|
|
850
|
+
}
|
|
851
|
+
return [convertNode(items, `${path}[]`)];
|
|
852
|
+
}
|
|
853
|
+
case "object": {
|
|
854
|
+
const properties = schema.properties;
|
|
855
|
+
if (!properties || Object.keys(properties).length === 0) {
|
|
856
|
+
return Object;
|
|
857
|
+
}
|
|
858
|
+
const required = new Set(Array.isArray(schema.required) ? schema.required : []);
|
|
859
|
+
const result = {};
|
|
860
|
+
for (const [key, value] of Object.entries(properties)) {
|
|
861
|
+
if (!required.has(key)) {
|
|
862
|
+
log$1.debug(`[jsonSchemaToNaturalSchema] Field "${path}.${key}" is optional; Natural Schema has no optional marker — treating as required`);
|
|
863
|
+
}
|
|
864
|
+
result[key] = convertNode(value, `${path}.${key}`);
|
|
865
|
+
}
|
|
866
|
+
return result;
|
|
867
|
+
}
|
|
868
|
+
default:
|
|
869
|
+
log$1.debug(`[jsonSchemaToNaturalSchema] Unsupported type "${String(schema.type)}" at "${path}"; defaulting to Object`);
|
|
870
|
+
return Object;
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
/**
|
|
874
|
+
* Convert a JSON Schema object node to Natural Schema. Lossy: constraints,
|
|
875
|
+
* descriptions, defaults, unions, and optionality have no Natural Schema
|
|
876
|
+
* representation. Dropped keywords are logged at debug level, never thrown.
|
|
877
|
+
*/
|
|
878
|
+
function jsonSchemaToNaturalSchema(schema) {
|
|
879
|
+
return convertNode(schema, "$");
|
|
880
|
+
}
|
|
881
|
+
|
|
768
882
|
/**
|
|
769
883
|
* Converts a JSON Schema (Draft 2020-12) object to the OpenAPI 3.0 schema subset
|
|
770
884
|
* that Gemini's `responseSchema` accepts. This constrains generation (not just validation)
|
|
@@ -807,7 +921,53 @@ function jsonSchemaToOpenApi3(schema) {
|
|
|
807
921
|
return result;
|
|
808
922
|
}
|
|
809
923
|
|
|
810
|
-
const getLogger$6 = () => log$
|
|
924
|
+
const getLogger$6 = () => log$2.lib({ lib: JAYPIE.LIB.LLM });
|
|
925
|
+
|
|
926
|
+
//
|
|
927
|
+
//
|
|
928
|
+
// Constants
|
|
929
|
+
//
|
|
930
|
+
// Non-streaming requests above ~16K output tokens risk HTTP timeouts
|
|
931
|
+
// (Anthropic guidance is to stream anything larger), so non-streaming
|
|
932
|
+
// defaults are capped here and only streaming requests resolve to the
|
|
933
|
+
// full model maximum.
|
|
934
|
+
const NON_STREAMING_MAX_TOKENS = PROVIDER.ANTHROPIC.MAX_TOKENS.DEFAULT;
|
|
935
|
+
// Maximum output tokens by model; first match wins.
|
|
936
|
+
// Providers without low output ceilings (OpenAI, xAI) are intentionally
|
|
937
|
+
// absent — their requests leave the limit unset.
|
|
938
|
+
const MODEL_MAX_OUTPUT_TOKENS = [
|
|
939
|
+
// Anthropic — https://platform.claude.com/docs/en/about-claude/models/overview
|
|
940
|
+
{ pattern: /^claude-opus-4-(0$|1$|1-|2025)/, tokens: 32000 },
|
|
941
|
+
{ pattern: /^claude-opus-4-5/, tokens: 64000 },
|
|
942
|
+
{ pattern: /^claude-sonnet-4-(0$|5$|5-|2025)/, tokens: 64000 },
|
|
943
|
+
{ pattern: /haiku/, tokens: 64000 },
|
|
944
|
+
{ pattern: /claude|fable|mythos|opus|sonnet/, tokens: 128000 },
|
|
945
|
+
// Google — https://ai.google.dev/gemini-api/docs/models
|
|
946
|
+
{ pattern: /gemini-(2\.5|3)/, tokens: 65536 },
|
|
947
|
+
{ pattern: /gemini/, tokens: 8192 },
|
|
948
|
+
];
|
|
949
|
+
//
|
|
950
|
+
//
|
|
951
|
+
// Main
|
|
952
|
+
//
|
|
953
|
+
/**
|
|
954
|
+
* Maximum output tokens the model supports, or undefined when unknown.
|
|
955
|
+
*/
|
|
956
|
+
function maxOutputTokens(model) {
|
|
957
|
+
const match = MODEL_MAX_OUTPUT_TOKENS.find(({ pattern }) => pattern.test(model));
|
|
958
|
+
return match?.tokens;
|
|
959
|
+
}
|
|
960
|
+
/**
|
|
961
|
+
* Default output token limit for a request: the model maximum when
|
|
962
|
+
* streaming, capped at the non-streaming maximum otherwise. Returns
|
|
963
|
+
* undefined when the model's maximum is unknown.
|
|
964
|
+
*/
|
|
965
|
+
function resolveMaxOutputTokens(model, { stream = false } = {}) {
|
|
966
|
+
const max = maxOutputTokens(model);
|
|
967
|
+
if (max === undefined)
|
|
968
|
+
return undefined;
|
|
969
|
+
return stream ? max : Math.min(max, NON_STREAMING_MAX_TOKENS);
|
|
970
|
+
}
|
|
811
971
|
|
|
812
972
|
// Turn policy constants
|
|
813
973
|
const MAX_TURNS_ABSOLUTE_LIMIT = 72;
|
|
@@ -1633,11 +1793,13 @@ class AnthropicAdapter extends BaseProviderAdapter {
|
|
|
1633
1793
|
lastMsg.content = lastMsg.content + "\n\n" + request.instructions;
|
|
1634
1794
|
}
|
|
1635
1795
|
}
|
|
1796
|
+
const model = (request.model ||
|
|
1797
|
+
this.defaultModel);
|
|
1636
1798
|
const anthropicRequest = {
|
|
1637
|
-
model
|
|
1638
|
-
this.defaultModel),
|
|
1799
|
+
model,
|
|
1639
1800
|
messages,
|
|
1640
|
-
max_tokens:
|
|
1801
|
+
max_tokens: resolveMaxOutputTokens(model, { stream: request.stream }) ??
|
|
1802
|
+
PROVIDER.ANTHROPIC.MAX_TOKENS.DEFAULT,
|
|
1641
1803
|
stream: false,
|
|
1642
1804
|
};
|
|
1643
1805
|
if (request.system) {
|
|
@@ -1649,7 +1811,7 @@ class AnthropicAdapter extends BaseProviderAdapter {
|
|
|
1649
1811
|
? [...request.tools]
|
|
1650
1812
|
: [];
|
|
1651
1813
|
if (useFallbackStructuredOutput && request.format) {
|
|
1652
|
-
log$
|
|
1814
|
+
log$2.warn(`[AnthropicAdapter] Using legacy structured_output tool fallback for model ${anthropicRequest.model}; native output_config previously rejected for this model.`);
|
|
1653
1815
|
allTools.push({
|
|
1654
1816
|
name: STRUCTURED_OUTPUT_TOOL_NAME$3,
|
|
1655
1817
|
description: "Output a structured JSON object, " +
|
|
@@ -1700,7 +1862,6 @@ class AnthropicAdapter extends BaseProviderAdapter {
|
|
|
1700
1862
|
// outputSchema is part of the interface contract but Anthropic now uses
|
|
1701
1863
|
// native `output_format` (set in buildRequest), so we no longer inject a
|
|
1702
1864
|
// synthetic structured-output tool here.
|
|
1703
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1704
1865
|
_outputSchema) {
|
|
1705
1866
|
return toolkit.tools.map((tool) => ({
|
|
1706
1867
|
name: tool.name,
|
|
@@ -1713,11 +1874,13 @@ class AnthropicAdapter extends BaseProviderAdapter {
|
|
|
1713
1874
|
}
|
|
1714
1875
|
formatOutputSchema(schema) {
|
|
1715
1876
|
let jsonSchema;
|
|
1716
|
-
// Check if schema is already a JsonObject
|
|
1717
|
-
|
|
1877
|
+
// Check if schema is already a JsonObject — either the OpenAI-style
|
|
1878
|
+
// `{ type: "json_schema", ... }` envelope or a bare `{ type: "object", properties }` node
|
|
1879
|
+
if ((typeof schema === "object" &&
|
|
1718
1880
|
schema !== null &&
|
|
1719
1881
|
!Array.isArray(schema) &&
|
|
1720
|
-
schema.type === "json_schema")
|
|
1882
|
+
schema.type === "json_schema") ||
|
|
1883
|
+
isJsonSchema$1(schema)) {
|
|
1721
1884
|
jsonSchema = structuredClone(schema);
|
|
1722
1885
|
jsonSchema.type = "object"; // Validator does not recognize "json_schema"
|
|
1723
1886
|
}
|
|
@@ -1764,7 +1927,7 @@ class AnthropicAdapter extends BaseProviderAdapter {
|
|
|
1764
1927
|
if (wantsStructuredOutput && isStructuredOutputUnsupportedError$1(error)) {
|
|
1765
1928
|
const model = anthropicRequest.model;
|
|
1766
1929
|
this.rememberModelRejectsStructuredOutput(model);
|
|
1767
|
-
log$
|
|
1930
|
+
log$2.warn(`[AnthropicAdapter] Model ${model} rejected native output_config; falling back to legacy structured_output tool emulation.`);
|
|
1768
1931
|
const fallbackRequest = this.toFallbackStructuredOutputRequest(anthropicRequest);
|
|
1769
1932
|
return (await anthropic.messages.create(fallbackRequest, signal ? { signal } : undefined));
|
|
1770
1933
|
}
|
|
@@ -2379,6 +2542,10 @@ class BedrockAdapter extends BaseProviderAdapter {
|
|
|
2379
2542
|
}));
|
|
2380
2543
|
}
|
|
2381
2544
|
formatOutputSchema(schema) {
|
|
2545
|
+
// Bare JSON Schema node: `{ type: "object", properties: {...} }`
|
|
2546
|
+
if (isJsonSchema$1(schema)) {
|
|
2547
|
+
return structuredClone(schema);
|
|
2548
|
+
}
|
|
2382
2549
|
const zodSchema = schema instanceof z.ZodType
|
|
2383
2550
|
? schema
|
|
2384
2551
|
: naturalZodSchema(schema);
|
|
@@ -2827,7 +2994,7 @@ class GoogleAdapter extends BaseProviderAdapter {
|
|
|
2827
2994
|
? [...request.tools]
|
|
2828
2995
|
: [];
|
|
2829
2996
|
if (request.format && hasUserTools && !useNativeCombo) {
|
|
2830
|
-
log$
|
|
2997
|
+
log$2.warn(`[GoogleAdapter] Using legacy structured_output tool fallback for model ${geminiRequest.model}; native responseJsonSchema + tools combo is only available on Gemini 3.`);
|
|
2831
2998
|
allTools.push({
|
|
2832
2999
|
name: STRUCTURED_OUTPUT_TOOL_NAME$1,
|
|
2833
3000
|
description: "Output a structured JSON object, " +
|
|
@@ -2881,6 +3048,18 @@ class GoogleAdapter extends BaseProviderAdapter {
|
|
|
2881
3048
|
: structuredOutputInstruction,
|
|
2882
3049
|
};
|
|
2883
3050
|
}
|
|
3051
|
+
// Default output ceiling: Google's own default (8,192) silently
|
|
3052
|
+
// truncates long generations, so resolve to the model maximum (capped
|
|
3053
|
+
// for non-streaming); providerOptions below override
|
|
3054
|
+
const maxOutputTokens = resolveMaxOutputTokens(geminiRequest.model, {
|
|
3055
|
+
stream: request.stream,
|
|
3056
|
+
});
|
|
3057
|
+
if (maxOutputTokens !== undefined) {
|
|
3058
|
+
geminiRequest.config = {
|
|
3059
|
+
...geminiRequest.config,
|
|
3060
|
+
maxOutputTokens,
|
|
3061
|
+
};
|
|
3062
|
+
}
|
|
2884
3063
|
// Add provider-specific options
|
|
2885
3064
|
if (request.providerOptions) {
|
|
2886
3065
|
geminiRequest.config = {
|
|
@@ -2902,7 +3081,6 @@ class GoogleAdapter extends BaseProviderAdapter {
|
|
|
2902
3081
|
// structured output via `responseJsonSchema`/`responseSchema` (or the
|
|
2903
3082
|
// legacy fake-tool injected in buildRequest as a fallback). We no longer
|
|
2904
3083
|
// inject a synthetic structured-output tool here.
|
|
2905
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2906
3084
|
_outputSchema) {
|
|
2907
3085
|
return toolkit.tools.map((tool) => ({
|
|
2908
3086
|
name: tool.name,
|
|
@@ -2915,11 +3093,13 @@ class GoogleAdapter extends BaseProviderAdapter {
|
|
|
2915
3093
|
}
|
|
2916
3094
|
formatOutputSchema(schema) {
|
|
2917
3095
|
let jsonSchema;
|
|
2918
|
-
// Check if schema is already a JsonObject
|
|
2919
|
-
|
|
3096
|
+
// Check if schema is already a JsonObject — either the OpenAI-style
|
|
3097
|
+
// `{ type: "json_schema", ... }` envelope or a bare `{ type: "object", properties }` node
|
|
3098
|
+
if ((typeof schema === "object" &&
|
|
2920
3099
|
schema !== null &&
|
|
2921
3100
|
!Array.isArray(schema) &&
|
|
2922
|
-
schema.type === "json_schema")
|
|
3101
|
+
schema.type === "json_schema") ||
|
|
3102
|
+
isJsonSchema$1(schema)) {
|
|
2923
3103
|
jsonSchema = structuredClone(schema);
|
|
2924
3104
|
jsonSchema.type = "object";
|
|
2925
3105
|
}
|
|
@@ -2958,7 +3138,7 @@ class GoogleAdapter extends BaseProviderAdapter {
|
|
|
2958
3138
|
if (wantsNativeCombo && isStructuredOutputComboUnsupportedError(error)) {
|
|
2959
3139
|
const model = geminiRequest.model;
|
|
2960
3140
|
this.rememberModelRejectsStructuredOutputCombo(model);
|
|
2961
|
-
log$
|
|
3141
|
+
log$2.warn(`[GoogleAdapter] Model ${model} rejected native responseJsonSchema + tools combo; falling back to legacy structured_output tool emulation.`);
|
|
2962
3142
|
const fallbackRequest = this.toFallbackStructuredOutputRequest(geminiRequest);
|
|
2963
3143
|
const response = await genAI.models.generateContent({
|
|
2964
3144
|
model: fallbackRequest.model,
|
|
@@ -3886,21 +4066,35 @@ class OpenAiAdapter extends BaseProviderAdapter {
|
|
|
3886
4066
|
schema.type === "json_schema") {
|
|
3887
4067
|
return schema;
|
|
3888
4068
|
}
|
|
3889
|
-
//
|
|
3890
|
-
|
|
3891
|
-
|
|
3892
|
-
|
|
3893
|
-
|
|
3894
|
-
|
|
3895
|
-
|
|
3896
|
-
|
|
3897
|
-
|
|
3898
|
-
|
|
3899
|
-
|
|
3900
|
-
|
|
3901
|
-
|
|
3902
|
-
|
|
3903
|
-
|
|
4069
|
+
// Bare JSON Schema node: `{ type: "object", properties: {...} }`
|
|
4070
|
+
// Skip the zod round-trip and use it directly (still needs the
|
|
4071
|
+
// additionalProperties + envelope treatment below).
|
|
4072
|
+
let jsonSchema;
|
|
4073
|
+
let name = "response";
|
|
4074
|
+
let strict = true;
|
|
4075
|
+
if (isJsonSchema$1(schema)) {
|
|
4076
|
+
jsonSchema = { ...structuredClone(schema) };
|
|
4077
|
+
delete jsonSchema.$schema;
|
|
4078
|
+
}
|
|
4079
|
+
else {
|
|
4080
|
+
// Convert NaturalSchema to Zod schema if needed
|
|
4081
|
+
const zodSchema = schema instanceof z.ZodType
|
|
4082
|
+
? schema
|
|
4083
|
+
: naturalZodSchema(schema);
|
|
4084
|
+
const responseFormat = zodResponseFormat(zodSchema, "response");
|
|
4085
|
+
// Re-spread to drop zod v4's non-enumerable `~standard` Standard-Schema
|
|
4086
|
+
// interop marker, then strip `$schema`: OpenAI's strict json_schema subset
|
|
4087
|
+
// does not recognize the draft-2020-12 `$schema` keyword, and shipping it
|
|
4088
|
+
// can leave strict structured-output enforcement silently disabled (the
|
|
4089
|
+
// model then free-forms, omitting required fields and corrupting keys).
|
|
4090
|
+
// Mirrors the OpenRouter adapter's sanitization.
|
|
4091
|
+
jsonSchema = {
|
|
4092
|
+
...z.toJSONSchema(zodSchema),
|
|
4093
|
+
};
|
|
4094
|
+
delete jsonSchema.$schema;
|
|
4095
|
+
name = responseFormat.json_schema.name;
|
|
4096
|
+
strict = responseFormat.json_schema.strict;
|
|
4097
|
+
}
|
|
3904
4098
|
// OpenAI requires additionalProperties to be false on all objects
|
|
3905
4099
|
const checks = [jsonSchema];
|
|
3906
4100
|
while (checks.length > 0) {
|
|
@@ -3916,10 +4110,10 @@ class OpenAiAdapter extends BaseProviderAdapter {
|
|
|
3916
4110
|
checks.shift();
|
|
3917
4111
|
}
|
|
3918
4112
|
return {
|
|
3919
|
-
name
|
|
4113
|
+
name,
|
|
3920
4114
|
schema: jsonSchema,
|
|
3921
|
-
strict
|
|
3922
|
-
type:
|
|
4115
|
+
strict,
|
|
4116
|
+
type: "json_schema",
|
|
3923
4117
|
};
|
|
3924
4118
|
}
|
|
3925
4119
|
//
|
|
@@ -4325,7 +4519,7 @@ function convertContentToOpenRouter(content) {
|
|
|
4325
4519
|
if (item.type === LlmMessageType.InputImage) {
|
|
4326
4520
|
const url = item.image_url ?? "";
|
|
4327
4521
|
if (!url) {
|
|
4328
|
-
log$
|
|
4522
|
+
log$2.warn("OpenRouter image content missing image_url; image discarded");
|
|
4329
4523
|
continue;
|
|
4330
4524
|
}
|
|
4331
4525
|
parts.push({ type: "image_url", imageUrl: { url } });
|
|
@@ -4334,7 +4528,7 @@ function convertContentToOpenRouter(content) {
|
|
|
4334
4528
|
if (item.type === LlmMessageType.InputFile) {
|
|
4335
4529
|
const fileData = typeof item.file_data === "string" ? item.file_data : "";
|
|
4336
4530
|
if (!fileData) {
|
|
4337
|
-
log$
|
|
4531
|
+
log$2.warn({ filename: item.filename }, "OpenRouter file content missing file_data; file discarded");
|
|
4338
4532
|
continue;
|
|
4339
4533
|
}
|
|
4340
4534
|
parts.push({
|
|
@@ -4347,7 +4541,7 @@ function convertContentToOpenRouter(content) {
|
|
|
4347
4541
|
continue;
|
|
4348
4542
|
}
|
|
4349
4543
|
// Unknown type - warn and skip
|
|
4350
|
-
log$
|
|
4544
|
+
log$2.warn({ item }, "Unknown content type for OpenRouter; discarded");
|
|
4351
4545
|
}
|
|
4352
4546
|
// If no parts remain, return empty string to avoid empty array
|
|
4353
4547
|
if (parts.length === 0) {
|
|
@@ -4495,7 +4689,7 @@ class OpenRouterAdapter extends BaseProviderAdapter {
|
|
|
4495
4689
|
? [...request.tools]
|
|
4496
4690
|
: [];
|
|
4497
4691
|
if (useFallbackStructuredOutput && request.format) {
|
|
4498
|
-
log$
|
|
4692
|
+
log$2.warn(`[OpenRouterAdapter] Using legacy structured_output tool fallback for model ${openRouterRequest.model}; native response_format previously rejected for this model.`);
|
|
4499
4693
|
allTools.push({
|
|
4500
4694
|
name: STRUCTURED_OUTPUT_TOOL_NAME,
|
|
4501
4695
|
description: "REQUIRED: You MUST call this tool to provide your final response. " +
|
|
@@ -4551,7 +4745,6 @@ class OpenRouterAdapter extends BaseProviderAdapter {
|
|
|
4551
4745
|
// native `response_format` (set in buildRequest), so we no longer inject a
|
|
4552
4746
|
// synthetic structured-output tool here. The legacy fake-tool injection
|
|
4553
4747
|
// happens in buildRequest only as a runtime fallback.
|
|
4554
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
4555
4748
|
_outputSchema) {
|
|
4556
4749
|
return toolkit.tools.map((tool) => ({
|
|
4557
4750
|
name: tool.name,
|
|
@@ -4561,11 +4754,13 @@ class OpenRouterAdapter extends BaseProviderAdapter {
|
|
|
4561
4754
|
}
|
|
4562
4755
|
formatOutputSchema(schema) {
|
|
4563
4756
|
let jsonSchema;
|
|
4564
|
-
// Check if schema is already a JsonObject
|
|
4565
|
-
|
|
4757
|
+
// Check if schema is already a JsonObject — either the OpenAI-style
|
|
4758
|
+
// `{ type: "json_schema", ... }` envelope or a bare `{ type: "object", properties }` node
|
|
4759
|
+
if ((typeof schema === "object" &&
|
|
4566
4760
|
schema !== null &&
|
|
4567
4761
|
!Array.isArray(schema) &&
|
|
4568
|
-
schema.type === "json_schema")
|
|
4762
|
+
schema.type === "json_schema") ||
|
|
4763
|
+
isJsonSchema$1(schema)) {
|
|
4569
4764
|
jsonSchema = structuredClone(schema);
|
|
4570
4765
|
jsonSchema.type = "object"; // Normalize type
|
|
4571
4766
|
}
|
|
@@ -4628,7 +4823,7 @@ class OpenRouterAdapter extends BaseProviderAdapter {
|
|
|
4628
4823
|
if (wantsStructuredOutput && isStructuredOutputUnsupportedError(error)) {
|
|
4629
4824
|
const model = openRouterRequest.model;
|
|
4630
4825
|
this.rememberModelRejectsStructuredOutput(model);
|
|
4631
|
-
log$
|
|
4826
|
+
log$2.warn(`[OpenRouterAdapter] Model ${model} rejected native response_format; falling back to legacy structured_output tool emulation.`);
|
|
4632
4827
|
const fallbackRequest = this.toFallbackStructuredOutputRequest(openRouterRequest);
|
|
4633
4828
|
return (await openRouter.chatCompletion(this.toWireBody(fallbackRequest), signal ? { signal } : undefined));
|
|
4634
4829
|
}
|
|
@@ -5168,7 +5363,7 @@ class XaiAdapter extends OpenAiAdapter {
|
|
|
5168
5363
|
const xaiAdapter = new XaiAdapter();
|
|
5169
5364
|
|
|
5170
5365
|
const DEFAULT_TOOL_TYPE = "function";
|
|
5171
|
-
const log = log$
|
|
5366
|
+
const log = log$2.lib({ lib: JAYPIE.LIB.LLM });
|
|
5172
5367
|
function logToolMessage(message, context) {
|
|
5173
5368
|
log.trace.var({ [context.name]: message });
|
|
5174
5369
|
}
|
|
@@ -6881,6 +7076,7 @@ class StreamLoop {
|
|
|
6881
7076
|
messages: state.currentInput,
|
|
6882
7077
|
model: options.model ?? this.adapter.defaultModel,
|
|
6883
7078
|
providerOptions: options.providerOptions,
|
|
7079
|
+
stream: true,
|
|
6884
7080
|
system: options.system,
|
|
6885
7081
|
temperature: options.temperature,
|
|
6886
7082
|
tools: state.formattedTools,
|
|
@@ -6949,6 +7145,7 @@ class StreamLoop {
|
|
|
6949
7145
|
messages: state.currentInput,
|
|
6950
7146
|
model: options.model ?? this.adapter.defaultModel,
|
|
6951
7147
|
providerOptions: options.providerOptions,
|
|
7148
|
+
stream: true,
|
|
6952
7149
|
system: options.system,
|
|
6953
7150
|
temperature: options.temperature,
|
|
6954
7151
|
tools: state.formattedTools,
|
|
@@ -7384,7 +7581,7 @@ class AnthropicClient {
|
|
|
7384
7581
|
}
|
|
7385
7582
|
|
|
7386
7583
|
// Logger
|
|
7387
|
-
const getLogger$5 = () => log$
|
|
7584
|
+
const getLogger$5 = () => log$2.lib({ lib: JAYPIE.LIB.LLM });
|
|
7388
7585
|
// Client initialization
|
|
7389
7586
|
async function initializeClient$5({ apiKey, } = {}) {
|
|
7390
7587
|
const logger = getLogger$5();
|
|
@@ -7422,7 +7619,7 @@ function prepareMessages$3(message, { data, placeholders } = {}) {
|
|
|
7422
7619
|
}
|
|
7423
7620
|
// Basic text completion
|
|
7424
7621
|
async function createTextCompletion$1(client, messages, model, systemMessage) {
|
|
7425
|
-
log$
|
|
7622
|
+
log$2.trace("Using text output (unstructured)");
|
|
7426
7623
|
const params = {
|
|
7427
7624
|
model,
|
|
7428
7625
|
messages,
|
|
@@ -7431,19 +7628,19 @@ async function createTextCompletion$1(client, messages, model, systemMessage) {
|
|
|
7431
7628
|
// Add system instruction if provided
|
|
7432
7629
|
if (systemMessage) {
|
|
7433
7630
|
params.system = systemMessage;
|
|
7434
|
-
log$
|
|
7631
|
+
log$2.trace(`System message: ${systemMessage.length} characters`);
|
|
7435
7632
|
}
|
|
7436
7633
|
const response = await client.messages.create(params);
|
|
7437
7634
|
const firstContent = response.content[0];
|
|
7438
7635
|
const text = firstContent && "text" in firstContent ? firstContent.text : "";
|
|
7439
|
-
log$
|
|
7636
|
+
log$2.trace(`Assistant reply: ${text.length} characters`);
|
|
7440
7637
|
return text;
|
|
7441
7638
|
}
|
|
7442
7639
|
// Structured output completion using Anthropic's native `output_config.format`
|
|
7443
7640
|
// field. Returns a JsonObject parsed and validated against the caller's
|
|
7444
7641
|
// Zod schema.
|
|
7445
7642
|
async function createStructuredCompletion$1(client, messages, model, responseSchema, systemMessage) {
|
|
7446
|
-
log$
|
|
7643
|
+
log$2.trace("Using native structured output");
|
|
7447
7644
|
const schema = responseSchema instanceof z.ZodType
|
|
7448
7645
|
? responseSchema
|
|
7449
7646
|
: naturalZodSchema(responseSchema);
|
|
@@ -7481,7 +7678,7 @@ async function createStructuredCompletion$1(client, messages, model, responseSch
|
|
|
7481
7678
|
if (!validation.success) {
|
|
7482
7679
|
throw new Error(`JSON response from Anthropic does not match schema: ${textBlock.text}`);
|
|
7483
7680
|
}
|
|
7484
|
-
log$
|
|
7681
|
+
log$2.trace("Received structured response", { result: validation.data });
|
|
7485
7682
|
return validation.data;
|
|
7486
7683
|
}
|
|
7487
7684
|
|
|
@@ -7593,7 +7790,7 @@ async function loadSdk() {
|
|
|
7593
7790
|
throw new ConfigurationError("@aws-sdk/client-bedrock-runtime is required but not installed. Run: npm install @aws-sdk/client-bedrock-runtime");
|
|
7594
7791
|
}
|
|
7595
7792
|
}
|
|
7596
|
-
const getLogger$4 = () => log$
|
|
7793
|
+
const getLogger$4 = () => log$2.lib({ lib: JAYPIE.LIB.LLM });
|
|
7597
7794
|
async function initializeClient$4({ region, } = {}) {
|
|
7598
7795
|
const logger = getLogger$4();
|
|
7599
7796
|
const resolvedRegion = region || process.env.AWS_REGION || "us-east-1";
|
|
@@ -7813,7 +8010,7 @@ class GoogleClient {
|
|
|
7813
8010
|
}
|
|
7814
8011
|
|
|
7815
8012
|
// Logger
|
|
7816
|
-
const getLogger$3 = () => log$
|
|
8013
|
+
const getLogger$3 = () => log$2.lib({ lib: JAYPIE.LIB.LLM });
|
|
7817
8014
|
// Client initialization
|
|
7818
8015
|
async function initializeClient$3({ apiKey, } = {}) {
|
|
7819
8016
|
const logger = getLogger$3();
|
|
@@ -7962,7 +8159,7 @@ class GoogleProvider {
|
|
|
7962
8159
|
}
|
|
7963
8160
|
|
|
7964
8161
|
// Logger
|
|
7965
|
-
const getLogger$2 = () => log$
|
|
8162
|
+
const getLogger$2 = () => log$2.lib({ lib: JAYPIE.LIB.LLM });
|
|
7966
8163
|
// Client initialization
|
|
7967
8164
|
async function initializeClient$2({ apiKey, } = {}) {
|
|
7968
8165
|
const logger = getLogger$2();
|
|
@@ -8266,7 +8463,7 @@ class OpenRouterClient {
|
|
|
8266
8463
|
}
|
|
8267
8464
|
|
|
8268
8465
|
// Logger
|
|
8269
|
-
const getLogger$1 = () => log$
|
|
8466
|
+
const getLogger$1 = () => log$2.lib({ lib: JAYPIE.LIB.LLM });
|
|
8270
8467
|
// Client initialization
|
|
8271
8468
|
async function initializeClient$1({ apiKey, } = {}) {
|
|
8272
8469
|
const logger = getLogger$1();
|
|
@@ -8415,7 +8612,7 @@ class OpenRouterProvider {
|
|
|
8415
8612
|
}
|
|
8416
8613
|
|
|
8417
8614
|
// Logger
|
|
8418
|
-
const getLogger = () => log$
|
|
8615
|
+
const getLogger = () => log$2.lib({ lib: JAYPIE.LIB.LLM });
|
|
8419
8616
|
// Client initialization
|
|
8420
8617
|
async function initializeClient({ apiKey, } = {}) {
|
|
8421
8618
|
const logger = getLogger();
|
|
@@ -8522,7 +8719,7 @@ class Llm {
|
|
|
8522
8719
|
let finalModel = model;
|
|
8523
8720
|
// Legacy: accept "gemini" but warn
|
|
8524
8721
|
if (providerName === "gemini") {
|
|
8525
|
-
log$
|
|
8722
|
+
log$1.warn(`Provider "gemini" is deprecated, use "${PROVIDER.GOOGLE.NAME}" instead`);
|
|
8526
8723
|
}
|
|
8527
8724
|
if (model) {
|
|
8528
8725
|
const modelDetermined = determineModelProvider(model);
|
|
@@ -8636,7 +8833,7 @@ class Llm {
|
|
|
8636
8833
|
}
|
|
8637
8834
|
catch (error) {
|
|
8638
8835
|
lastError = error;
|
|
8639
|
-
log$
|
|
8836
|
+
log$1.warn(`Provider ${this._provider} failed`, {
|
|
8640
8837
|
error: lastError.message,
|
|
8641
8838
|
fallbacksRemaining: fallbackChain.length,
|
|
8642
8839
|
});
|
|
@@ -8656,7 +8853,7 @@ class Llm {
|
|
|
8656
8853
|
}
|
|
8657
8854
|
catch (error) {
|
|
8658
8855
|
lastError = error;
|
|
8659
|
-
log$
|
|
8856
|
+
log$1.warn(`Fallback provider ${fallbackConfig.provider} failed`, {
|
|
8660
8857
|
error: lastError.message,
|
|
8661
8858
|
fallbacksRemaining: fallbackChain.length - attempts + 1,
|
|
8662
8859
|
});
|
|
@@ -9023,5 +9220,5 @@ const toolkit = new JaypieToolkit(tools);
|
|
|
9023
9220
|
[LlmMessageRole.Developer]: "user",
|
|
9024
9221
|
});
|
|
9025
9222
|
|
|
9026
|
-
export { BedrockProvider, GoogleProvider as GeminiProvider, GoogleProvider, JaypieToolkit, constants as LLM, Llm, LlmMessageRole, LlmMessageType, LlmStreamChunkType, OpenRouterProvider, Toolkit, XaiProvider, extractReasoning, isLlmOperateInput, isLlmOperateInputContent, isLlmOperateInputFile, isLlmOperateInputImage, toolkit, tools };
|
|
9223
|
+
export { BedrockProvider, GoogleProvider as GeminiProvider, GoogleProvider, JaypieToolkit, constants as LLM, Llm, LlmMessageRole, LlmMessageType, LlmStreamChunkType, OpenRouterProvider, Toolkit, XaiProvider, extractReasoning, isLlmOperateInput, isLlmOperateInputContent, isLlmOperateInputFile, isLlmOperateInputImage, jsonSchemaToNaturalSchema, naturalSchemaToJsonSchema, toolkit, tools };
|
|
9027
9224
|
//# sourceMappingURL=index.js.map
|