@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.
@@ -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
- reasoning_details: z3.array(ReasoningDetailUnionSchema).optional(),
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 candidateReasoningDetails) {
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 openrouter = (_a16 = part.providerOptions) == null ? void 0 : _a16.openrouter;
2781
- const details = openrouter == null ? void 0 : openrouter.reasoning_details;
2782
- if (Array.isArray(details) && details.length > 0) {
2783
- return details;
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 && ((_c = (_b16 = parsed.data) == null ? void 0 : _b16.openrouter) == null ? void 0 : _c.reasoning_details) && parsed.data.openrouter.reasoning_details.length > 0) {
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
  }