@openrouter/ai-sdk-provider 2.3.1 → 2.3.3
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/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +147 -10
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +147 -10
- package/dist/index.mjs.map +1 -1
- package/dist/internal/index.d.mts +1 -0
- package/dist/internal/index.d.ts +1 -0
- package/dist/internal/index.js +146 -9
- package/dist/internal/index.js.map +1 -1
- package/dist/internal/index.mjs +146 -9
- package/dist/internal/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -6,6 +6,7 @@ import { z } from 'zod/v4';
|
|
|
6
6
|
declare enum ReasoningFormat {
|
|
7
7
|
Unknown = "unknown",
|
|
8
8
|
OpenAIResponsesV1 = "openai-responses-v1",
|
|
9
|
+
AzureOpenAIResponsesV1 = "azure-openai-responses-v1",
|
|
9
10
|
XAIResponsesV1 = "xai-responses-v1",
|
|
10
11
|
AnthropicClaudeV1 = "anthropic-claude-v1",
|
|
11
12
|
GoogleGeminiV1 = "google-gemini-v1"
|
package/dist/internal/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { z } from 'zod/v4';
|
|
|
6
6
|
declare enum ReasoningFormat {
|
|
7
7
|
Unknown = "unknown",
|
|
8
8
|
OpenAIResponsesV1 = "openai-responses-v1",
|
|
9
|
+
AzureOpenAIResponsesV1 = "azure-openai-responses-v1",
|
|
9
10
|
XAIResponsesV1 = "xai-responses-v1",
|
|
10
11
|
AnthropicClaudeV1 = "anthropic-claude-v1",
|
|
11
12
|
GoogleGeminiV1 = "google-gemini-v1"
|
package/dist/internal/index.js
CHANGED
|
@@ -2182,11 +2182,13 @@ function isDefinedOrNotNull(value) {
|
|
|
2182
2182
|
var ReasoningFormat = /* @__PURE__ */ ((ReasoningFormat2) => {
|
|
2183
2183
|
ReasoningFormat2["Unknown"] = "unknown";
|
|
2184
2184
|
ReasoningFormat2["OpenAIResponsesV1"] = "openai-responses-v1";
|
|
2185
|
+
ReasoningFormat2["AzureOpenAIResponsesV1"] = "azure-openai-responses-v1";
|
|
2185
2186
|
ReasoningFormat2["XAIResponsesV1"] = "xai-responses-v1";
|
|
2186
2187
|
ReasoningFormat2["AnthropicClaudeV1"] = "anthropic-claude-v1";
|
|
2187
2188
|
ReasoningFormat2["GoogleGeminiV1"] = "google-gemini-v1";
|
|
2188
2189
|
return ReasoningFormat2;
|
|
2189
2190
|
})(ReasoningFormat || {});
|
|
2191
|
+
var DEFAULT_REASONING_FORMAT = "anthropic-claude-v1" /* AnthropicClaudeV1 */;
|
|
2190
2192
|
|
|
2191
2193
|
// src/schemas/reasoning-details.ts
|
|
2192
2194
|
var CommonReasoningDetailSchema = import_v4.z.object({
|
|
@@ -2339,7 +2341,11 @@ var OpenRouterProviderMetadataSchema = import_v43.z.object({
|
|
|
2339
2341
|
}).catchall(import_v43.z.any());
|
|
2340
2342
|
var OpenRouterProviderOptionsSchema = import_v43.z.object({
|
|
2341
2343
|
openrouter: import_v43.z.object({
|
|
2342
|
-
|
|
2344
|
+
// Use ReasoningDetailArraySchema (with unknown fallback) instead of
|
|
2345
|
+
// z.array(ReasoningDetailUnionSchema) so that a single malformed entry
|
|
2346
|
+
// (e.g., a future format not yet in the enum) is individually dropped
|
|
2347
|
+
// rather than causing the entire array to fail parsing.
|
|
2348
|
+
reasoning_details: ReasoningDetailArraySchema.optional(),
|
|
2343
2349
|
annotations: import_v43.z.array(FileAnnotationSchema).optional()
|
|
2344
2350
|
}).optional()
|
|
2345
2351
|
}).optional();
|
|
@@ -2751,8 +2757,24 @@ function convertToOpenRouterChatMessages(prompt) {
|
|
|
2751
2757
|
const candidateReasoningDetails = messageReasoningDetails && Array.isArray(messageReasoningDetails) && messageReasoningDetails.length > 0 ? messageReasoningDetails : findFirstReasoningDetails(content);
|
|
2752
2758
|
let finalReasoningDetails;
|
|
2753
2759
|
if (candidateReasoningDetails && candidateReasoningDetails.length > 0) {
|
|
2760
|
+
const validDetails = candidateReasoningDetails.filter((detail) => {
|
|
2761
|
+
var _a17;
|
|
2762
|
+
if (detail.type !== "reasoning.text" /* Text */) {
|
|
2763
|
+
return true;
|
|
2764
|
+
}
|
|
2765
|
+
const format = (_a17 = detail.format) != null ? _a17 : DEFAULT_REASONING_FORMAT;
|
|
2766
|
+
if (format !== "anthropic-claude-v1" /* AnthropicClaudeV1 */) {
|
|
2767
|
+
return true;
|
|
2768
|
+
}
|
|
2769
|
+
return !!detail.signature;
|
|
2770
|
+
});
|
|
2771
|
+
if (validDetails.length < candidateReasoningDetails.length) {
|
|
2772
|
+
console.warn(
|
|
2773
|
+
"[openrouter] Some reasoning_details entries were removed because they were missing signatures. See https://github.com/OpenRouterTeam/ai-sdk-provider/issues/423 for more details."
|
|
2774
|
+
);
|
|
2775
|
+
}
|
|
2754
2776
|
const uniqueDetails = [];
|
|
2755
|
-
for (const detail of
|
|
2777
|
+
for (const detail of validDetails) {
|
|
2756
2778
|
if (reasoningDetailsTracker.upsert(detail)) {
|
|
2757
2779
|
uniqueDetails.push(detail);
|
|
2758
2780
|
}
|
|
@@ -2801,20 +2823,135 @@ function getToolResultContent(input) {
|
|
|
2801
2823
|
return input.output.value;
|
|
2802
2824
|
case "json":
|
|
2803
2825
|
case "error-json":
|
|
2804
|
-
case "content":
|
|
2805
2826
|
return JSON.stringify(input.output.value);
|
|
2827
|
+
case "content":
|
|
2828
|
+
return mapToolResultContentParts(input.output.value);
|
|
2806
2829
|
case "execution-denied":
|
|
2807
2830
|
return (_a16 = input.output.reason) != null ? _a16 : "Tool execution denied";
|
|
2808
2831
|
}
|
|
2809
2832
|
}
|
|
2833
|
+
function mapToolResultContentParts(parts) {
|
|
2834
|
+
return parts.map((part) => {
|
|
2835
|
+
var _a16, _b16, _c;
|
|
2836
|
+
switch (part.type) {
|
|
2837
|
+
case "text":
|
|
2838
|
+
return { type: "text", text: part.text };
|
|
2839
|
+
case "image-data":
|
|
2840
|
+
return {
|
|
2841
|
+
type: "image_url",
|
|
2842
|
+
image_url: {
|
|
2843
|
+
url: buildFileDataUrl({
|
|
2844
|
+
data: part.data,
|
|
2845
|
+
mediaType: part.mediaType,
|
|
2846
|
+
defaultMediaType: "image/jpeg"
|
|
2847
|
+
})
|
|
2848
|
+
}
|
|
2849
|
+
};
|
|
2850
|
+
case "image-url":
|
|
2851
|
+
return {
|
|
2852
|
+
type: "image_url",
|
|
2853
|
+
image_url: { url: part.url }
|
|
2854
|
+
};
|
|
2855
|
+
case "file-data": {
|
|
2856
|
+
const dataUrl = buildFileDataUrl({
|
|
2857
|
+
data: part.data,
|
|
2858
|
+
mediaType: part.mediaType,
|
|
2859
|
+
defaultMediaType: "application/octet-stream"
|
|
2860
|
+
});
|
|
2861
|
+
if ((_a16 = part.mediaType) == null ? void 0 : _a16.startsWith("image/")) {
|
|
2862
|
+
return {
|
|
2863
|
+
type: "image_url",
|
|
2864
|
+
image_url: { url: dataUrl }
|
|
2865
|
+
};
|
|
2866
|
+
}
|
|
2867
|
+
if ((_b16 = part.mediaType) == null ? void 0 : _b16.startsWith("audio/")) {
|
|
2868
|
+
const rawFormat = part.mediaType.replace("audio/", "");
|
|
2869
|
+
const format = MIME_TO_FORMAT[rawFormat];
|
|
2870
|
+
if (format !== void 0) {
|
|
2871
|
+
return {
|
|
2872
|
+
type: "input_audio",
|
|
2873
|
+
input_audio: {
|
|
2874
|
+
data: getBase64FromDataUrl(dataUrl),
|
|
2875
|
+
format
|
|
2876
|
+
}
|
|
2877
|
+
};
|
|
2878
|
+
}
|
|
2879
|
+
}
|
|
2880
|
+
return {
|
|
2881
|
+
type: "file",
|
|
2882
|
+
file: {
|
|
2883
|
+
filename: (_c = part.filename) != null ? _c : "",
|
|
2884
|
+
file_data: dataUrl
|
|
2885
|
+
}
|
|
2886
|
+
};
|
|
2887
|
+
}
|
|
2888
|
+
case "file-url": {
|
|
2889
|
+
if (looksLikeImageUrl(part.url)) {
|
|
2890
|
+
return {
|
|
2891
|
+
type: "image_url",
|
|
2892
|
+
image_url: { url: part.url }
|
|
2893
|
+
};
|
|
2894
|
+
}
|
|
2895
|
+
return {
|
|
2896
|
+
type: "file",
|
|
2897
|
+
file: {
|
|
2898
|
+
filename: filenameFromUrl(part.url),
|
|
2899
|
+
file_data: part.url
|
|
2900
|
+
}
|
|
2901
|
+
};
|
|
2902
|
+
}
|
|
2903
|
+
case "file-id":
|
|
2904
|
+
case "image-file-id":
|
|
2905
|
+
case "custom":
|
|
2906
|
+
return { type: "text", text: JSON.stringify(part) };
|
|
2907
|
+
default: {
|
|
2908
|
+
const _exhaustiveCheck = part;
|
|
2909
|
+
return { type: "text", text: JSON.stringify(_exhaustiveCheck) };
|
|
2910
|
+
}
|
|
2911
|
+
}
|
|
2912
|
+
});
|
|
2913
|
+
}
|
|
2914
|
+
var IMAGE_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
2915
|
+
"jpg",
|
|
2916
|
+
"jpeg",
|
|
2917
|
+
"png",
|
|
2918
|
+
"gif",
|
|
2919
|
+
"webp",
|
|
2920
|
+
"svg",
|
|
2921
|
+
"bmp",
|
|
2922
|
+
"ico",
|
|
2923
|
+
"tif",
|
|
2924
|
+
"tiff",
|
|
2925
|
+
"avif"
|
|
2926
|
+
]);
|
|
2927
|
+
function looksLikeImageUrl(url) {
|
|
2928
|
+
var _a16;
|
|
2929
|
+
try {
|
|
2930
|
+
const pathname = new URL(url).pathname;
|
|
2931
|
+
const ext = (_a16 = pathname.split(".").pop()) == null ? void 0 : _a16.toLowerCase();
|
|
2932
|
+
return ext !== void 0 && IMAGE_EXTENSIONS.has(ext);
|
|
2933
|
+
} catch (e) {
|
|
2934
|
+
return false;
|
|
2935
|
+
}
|
|
2936
|
+
}
|
|
2937
|
+
function filenameFromUrl(url) {
|
|
2938
|
+
try {
|
|
2939
|
+
const pathname = new URL(url).pathname;
|
|
2940
|
+
const last = pathname.split("/").pop();
|
|
2941
|
+
return (last == null ? void 0 : last.includes(".")) ? last : "";
|
|
2942
|
+
} catch (e) {
|
|
2943
|
+
return "";
|
|
2944
|
+
}
|
|
2945
|
+
}
|
|
2810
2946
|
function findFirstReasoningDetails(content) {
|
|
2811
|
-
var _a16, _b16, _c;
|
|
2947
|
+
var _a16, _b16, _c, _d;
|
|
2812
2948
|
for (const part of content) {
|
|
2813
2949
|
if (part.type === "tool-call") {
|
|
2814
|
-
const
|
|
2815
|
-
|
|
2816
|
-
|
|
2817
|
-
|
|
2950
|
+
const parsed = OpenRouterProviderOptionsSchema.safeParse(
|
|
2951
|
+
part.providerOptions
|
|
2952
|
+
);
|
|
2953
|
+
if (parsed.success && ((_b16 = (_a16 = parsed.data) == null ? void 0 : _a16.openrouter) == null ? void 0 : _b16.reasoning_details) && parsed.data.openrouter.reasoning_details.length > 0) {
|
|
2954
|
+
return parsed.data.openrouter.reasoning_details;
|
|
2818
2955
|
}
|
|
2819
2956
|
}
|
|
2820
2957
|
}
|
|
@@ -2823,7 +2960,7 @@ function findFirstReasoningDetails(content) {
|
|
|
2823
2960
|
const parsed = OpenRouterProviderOptionsSchema.safeParse(
|
|
2824
2961
|
part.providerOptions
|
|
2825
2962
|
);
|
|
2826
|
-
if (parsed.success && ((
|
|
2963
|
+
if (parsed.success && ((_d = (_c = parsed.data) == null ? void 0 : _c.openrouter) == null ? void 0 : _d.reasoning_details) && parsed.data.openrouter.reasoning_details.length > 0) {
|
|
2827
2964
|
return parsed.data.openrouter.reasoning_details;
|
|
2828
2965
|
}
|
|
2829
2966
|
}
|