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