@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
package/dist/internal/index.mjs
CHANGED
|
@@ -2148,11 +2148,13 @@ function isDefinedOrNotNull(value) {
|
|
|
2148
2148
|
var ReasoningFormat = /* @__PURE__ */ ((ReasoningFormat2) => {
|
|
2149
2149
|
ReasoningFormat2["Unknown"] = "unknown";
|
|
2150
2150
|
ReasoningFormat2["OpenAIResponsesV1"] = "openai-responses-v1";
|
|
2151
|
+
ReasoningFormat2["AzureOpenAIResponsesV1"] = "azure-openai-responses-v1";
|
|
2151
2152
|
ReasoningFormat2["XAIResponsesV1"] = "xai-responses-v1";
|
|
2152
2153
|
ReasoningFormat2["AnthropicClaudeV1"] = "anthropic-claude-v1";
|
|
2153
2154
|
ReasoningFormat2["GoogleGeminiV1"] = "google-gemini-v1";
|
|
2154
2155
|
return ReasoningFormat2;
|
|
2155
2156
|
})(ReasoningFormat || {});
|
|
2157
|
+
var DEFAULT_REASONING_FORMAT = "anthropic-claude-v1" /* AnthropicClaudeV1 */;
|
|
2156
2158
|
|
|
2157
2159
|
// src/schemas/reasoning-details.ts
|
|
2158
2160
|
var CommonReasoningDetailSchema = z.object({
|
|
@@ -2305,7 +2307,11 @@ var OpenRouterProviderMetadataSchema = z3.object({
|
|
|
2305
2307
|
}).catchall(z3.any());
|
|
2306
2308
|
var OpenRouterProviderOptionsSchema = z3.object({
|
|
2307
2309
|
openrouter: z3.object({
|
|
2308
|
-
|
|
2310
|
+
// Use ReasoningDetailArraySchema (with unknown fallback) instead of
|
|
2311
|
+
// z.array(ReasoningDetailUnionSchema) so that a single malformed entry
|
|
2312
|
+
// (e.g., a future format not yet in the enum) is individually dropped
|
|
2313
|
+
// rather than causing the entire array to fail parsing.
|
|
2314
|
+
reasoning_details: ReasoningDetailArraySchema.optional(),
|
|
2309
2315
|
annotations: z3.array(FileAnnotationSchema).optional()
|
|
2310
2316
|
}).optional()
|
|
2311
2317
|
}).optional();
|
|
@@ -2717,8 +2723,24 @@ function convertToOpenRouterChatMessages(prompt) {
|
|
|
2717
2723
|
const candidateReasoningDetails = messageReasoningDetails && Array.isArray(messageReasoningDetails) && messageReasoningDetails.length > 0 ? messageReasoningDetails : findFirstReasoningDetails(content);
|
|
2718
2724
|
let finalReasoningDetails;
|
|
2719
2725
|
if (candidateReasoningDetails && candidateReasoningDetails.length > 0) {
|
|
2726
|
+
const validDetails = candidateReasoningDetails.filter((detail) => {
|
|
2727
|
+
var _a17;
|
|
2728
|
+
if (detail.type !== "reasoning.text" /* Text */) {
|
|
2729
|
+
return true;
|
|
2730
|
+
}
|
|
2731
|
+
const format = (_a17 = detail.format) != null ? _a17 : DEFAULT_REASONING_FORMAT;
|
|
2732
|
+
if (format !== "anthropic-claude-v1" /* AnthropicClaudeV1 */) {
|
|
2733
|
+
return true;
|
|
2734
|
+
}
|
|
2735
|
+
return !!detail.signature;
|
|
2736
|
+
});
|
|
2737
|
+
if (validDetails.length < candidateReasoningDetails.length) {
|
|
2738
|
+
console.warn(
|
|
2739
|
+
"[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."
|
|
2740
|
+
);
|
|
2741
|
+
}
|
|
2720
2742
|
const uniqueDetails = [];
|
|
2721
|
-
for (const detail of
|
|
2743
|
+
for (const detail of validDetails) {
|
|
2722
2744
|
if (reasoningDetailsTracker.upsert(detail)) {
|
|
2723
2745
|
uniqueDetails.push(detail);
|
|
2724
2746
|
}
|
|
@@ -2767,20 +2789,135 @@ function getToolResultContent(input) {
|
|
|
2767
2789
|
return input.output.value;
|
|
2768
2790
|
case "json":
|
|
2769
2791
|
case "error-json":
|
|
2770
|
-
case "content":
|
|
2771
2792
|
return JSON.stringify(input.output.value);
|
|
2793
|
+
case "content":
|
|
2794
|
+
return mapToolResultContentParts(input.output.value);
|
|
2772
2795
|
case "execution-denied":
|
|
2773
2796
|
return (_a16 = input.output.reason) != null ? _a16 : "Tool execution denied";
|
|
2774
2797
|
}
|
|
2775
2798
|
}
|
|
2799
|
+
function mapToolResultContentParts(parts) {
|
|
2800
|
+
return parts.map((part) => {
|
|
2801
|
+
var _a16, _b16, _c;
|
|
2802
|
+
switch (part.type) {
|
|
2803
|
+
case "text":
|
|
2804
|
+
return { type: "text", text: part.text };
|
|
2805
|
+
case "image-data":
|
|
2806
|
+
return {
|
|
2807
|
+
type: "image_url",
|
|
2808
|
+
image_url: {
|
|
2809
|
+
url: buildFileDataUrl({
|
|
2810
|
+
data: part.data,
|
|
2811
|
+
mediaType: part.mediaType,
|
|
2812
|
+
defaultMediaType: "image/jpeg"
|
|
2813
|
+
})
|
|
2814
|
+
}
|
|
2815
|
+
};
|
|
2816
|
+
case "image-url":
|
|
2817
|
+
return {
|
|
2818
|
+
type: "image_url",
|
|
2819
|
+
image_url: { url: part.url }
|
|
2820
|
+
};
|
|
2821
|
+
case "file-data": {
|
|
2822
|
+
const dataUrl = buildFileDataUrl({
|
|
2823
|
+
data: part.data,
|
|
2824
|
+
mediaType: part.mediaType,
|
|
2825
|
+
defaultMediaType: "application/octet-stream"
|
|
2826
|
+
});
|
|
2827
|
+
if ((_a16 = part.mediaType) == null ? void 0 : _a16.startsWith("image/")) {
|
|
2828
|
+
return {
|
|
2829
|
+
type: "image_url",
|
|
2830
|
+
image_url: { url: dataUrl }
|
|
2831
|
+
};
|
|
2832
|
+
}
|
|
2833
|
+
if ((_b16 = part.mediaType) == null ? void 0 : _b16.startsWith("audio/")) {
|
|
2834
|
+
const rawFormat = part.mediaType.replace("audio/", "");
|
|
2835
|
+
const format = MIME_TO_FORMAT[rawFormat];
|
|
2836
|
+
if (format !== void 0) {
|
|
2837
|
+
return {
|
|
2838
|
+
type: "input_audio",
|
|
2839
|
+
input_audio: {
|
|
2840
|
+
data: getBase64FromDataUrl(dataUrl),
|
|
2841
|
+
format
|
|
2842
|
+
}
|
|
2843
|
+
};
|
|
2844
|
+
}
|
|
2845
|
+
}
|
|
2846
|
+
return {
|
|
2847
|
+
type: "file",
|
|
2848
|
+
file: {
|
|
2849
|
+
filename: (_c = part.filename) != null ? _c : "",
|
|
2850
|
+
file_data: dataUrl
|
|
2851
|
+
}
|
|
2852
|
+
};
|
|
2853
|
+
}
|
|
2854
|
+
case "file-url": {
|
|
2855
|
+
if (looksLikeImageUrl(part.url)) {
|
|
2856
|
+
return {
|
|
2857
|
+
type: "image_url",
|
|
2858
|
+
image_url: { url: part.url }
|
|
2859
|
+
};
|
|
2860
|
+
}
|
|
2861
|
+
return {
|
|
2862
|
+
type: "file",
|
|
2863
|
+
file: {
|
|
2864
|
+
filename: filenameFromUrl(part.url),
|
|
2865
|
+
file_data: part.url
|
|
2866
|
+
}
|
|
2867
|
+
};
|
|
2868
|
+
}
|
|
2869
|
+
case "file-id":
|
|
2870
|
+
case "image-file-id":
|
|
2871
|
+
case "custom":
|
|
2872
|
+
return { type: "text", text: JSON.stringify(part) };
|
|
2873
|
+
default: {
|
|
2874
|
+
const _exhaustiveCheck = part;
|
|
2875
|
+
return { type: "text", text: JSON.stringify(_exhaustiveCheck) };
|
|
2876
|
+
}
|
|
2877
|
+
}
|
|
2878
|
+
});
|
|
2879
|
+
}
|
|
2880
|
+
var IMAGE_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
2881
|
+
"jpg",
|
|
2882
|
+
"jpeg",
|
|
2883
|
+
"png",
|
|
2884
|
+
"gif",
|
|
2885
|
+
"webp",
|
|
2886
|
+
"svg",
|
|
2887
|
+
"bmp",
|
|
2888
|
+
"ico",
|
|
2889
|
+
"tif",
|
|
2890
|
+
"tiff",
|
|
2891
|
+
"avif"
|
|
2892
|
+
]);
|
|
2893
|
+
function looksLikeImageUrl(url) {
|
|
2894
|
+
var _a16;
|
|
2895
|
+
try {
|
|
2896
|
+
const pathname = new URL(url).pathname;
|
|
2897
|
+
const ext = (_a16 = pathname.split(".").pop()) == null ? void 0 : _a16.toLowerCase();
|
|
2898
|
+
return ext !== void 0 && IMAGE_EXTENSIONS.has(ext);
|
|
2899
|
+
} catch (e) {
|
|
2900
|
+
return false;
|
|
2901
|
+
}
|
|
2902
|
+
}
|
|
2903
|
+
function filenameFromUrl(url) {
|
|
2904
|
+
try {
|
|
2905
|
+
const pathname = new URL(url).pathname;
|
|
2906
|
+
const last = pathname.split("/").pop();
|
|
2907
|
+
return (last == null ? void 0 : last.includes(".")) ? last : "";
|
|
2908
|
+
} catch (e) {
|
|
2909
|
+
return "";
|
|
2910
|
+
}
|
|
2911
|
+
}
|
|
2776
2912
|
function findFirstReasoningDetails(content) {
|
|
2777
|
-
var _a16, _b16, _c;
|
|
2913
|
+
var _a16, _b16, _c, _d;
|
|
2778
2914
|
for (const part of content) {
|
|
2779
2915
|
if (part.type === "tool-call") {
|
|
2780
|
-
const
|
|
2781
|
-
|
|
2782
|
-
|
|
2783
|
-
|
|
2916
|
+
const parsed = OpenRouterProviderOptionsSchema.safeParse(
|
|
2917
|
+
part.providerOptions
|
|
2918
|
+
);
|
|
2919
|
+
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) {
|
|
2920
|
+
return parsed.data.openrouter.reasoning_details;
|
|
2784
2921
|
}
|
|
2785
2922
|
}
|
|
2786
2923
|
}
|
|
@@ -2789,7 +2926,7 @@ function findFirstReasoningDetails(content) {
|
|
|
2789
2926
|
const parsed = OpenRouterProviderOptionsSchema.safeParse(
|
|
2790
2927
|
part.providerOptions
|
|
2791
2928
|
);
|
|
2792
|
-
if (parsed.success && ((
|
|
2929
|
+
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) {
|
|
2793
2930
|
return parsed.data.openrouter.reasoning_details;
|
|
2794
2931
|
}
|
|
2795
2932
|
}
|