@openrouter/ai-sdk-provider 2.6.0 → 2.8.0

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.
@@ -36,7 +36,7 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
36
36
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
37
37
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
38
38
 
39
- // node_modules/.pnpm/@ai-sdk+provider@3.0.0/node_modules/@ai-sdk/provider/dist/index.mjs
39
+ // node_modules/.pnpm/@ai-sdk+provider@3.0.8/node_modules/@ai-sdk/provider/dist/index.mjs
40
40
  var marker = "vercel.ai.error";
41
41
  var symbol = Symbol.for(marker);
42
42
  var _a;
@@ -306,34 +306,61 @@ var symbol13 = Symbol.for(marker13);
306
306
  var _a13;
307
307
  var _b13;
308
308
  var TypeValidationError = class _TypeValidationError extends (_b13 = AISDKError, _a13 = symbol13, _b13) {
309
- constructor({ value, cause }) {
309
+ constructor({
310
+ value,
311
+ cause,
312
+ context
313
+ }) {
314
+ let contextPrefix = "Type validation failed";
315
+ if (context == null ? void 0 : context.field) {
316
+ contextPrefix += ` for ${context.field}`;
317
+ }
318
+ if ((context == null ? void 0 : context.entityName) || (context == null ? void 0 : context.entityId)) {
319
+ contextPrefix += " (";
320
+ const parts = [];
321
+ if (context.entityName) {
322
+ parts.push(context.entityName);
323
+ }
324
+ if (context.entityId) {
325
+ parts.push(`id: "${context.entityId}"`);
326
+ }
327
+ contextPrefix += parts.join(", ");
328
+ contextPrefix += ")";
329
+ }
310
330
  super({
311
331
  name: name12,
312
- message: `Type validation failed: Value: ${JSON.stringify(value)}.
332
+ message: `${contextPrefix}: Value: ${JSON.stringify(value)}.
313
333
  Error message: ${getErrorMessage(cause)}`,
314
334
  cause
315
335
  });
316
336
  this[_a13] = true;
317
337
  this.value = value;
338
+ this.context = context;
318
339
  }
319
340
  static isInstance(error) {
320
341
  return AISDKError.hasMarker(error, marker13);
321
342
  }
322
343
  /**
323
344
  * Wraps an error into a TypeValidationError.
324
- * If the cause is already a TypeValidationError with the same value, it returns the cause.
345
+ * If the cause is already a TypeValidationError with the same value and context, it returns the cause.
325
346
  * Otherwise, it creates a new TypeValidationError.
326
347
  *
327
348
  * @param {Object} params - The parameters for wrapping the error.
328
349
  * @param {unknown} params.value - The value that failed validation.
329
350
  * @param {unknown} params.cause - The original error or cause of the validation failure.
351
+ * @param {TypeValidationContext} params.context - Optional context about what is being validated.
330
352
  * @returns {TypeValidationError} A TypeValidationError instance.
331
353
  */
332
354
  static wrap({
333
355
  value,
334
- cause
356
+ cause,
357
+ context
335
358
  }) {
336
- return _TypeValidationError.isInstance(cause) && cause.value === value ? cause : new _TypeValidationError({ value, cause });
359
+ var _a152, _b152, _c;
360
+ if (_TypeValidationError.isInstance(cause) && cause.value === value && ((_a152 = cause.context) == null ? void 0 : _a152.field) === (context == null ? void 0 : context.field) && ((_b152 = cause.context) == null ? void 0 : _b152.entityName) === (context == null ? void 0 : context.entityName) && ((_c = cause.context) == null ? void 0 : _c.entityId) === (context == null ? void 0 : context.entityId)) {
361
+ return cause;
362
+ }
363
+ return new _TypeValidationError({ value, cause, context });
337
364
  }
338
365
  };
339
366
  var name13 = "AI_UnsupportedFunctionalityError";
@@ -355,7 +382,7 @@ var UnsupportedFunctionalityError = class extends (_b14 = AISDKError, _a14 = sym
355
382
  }
356
383
  };
357
384
 
358
- // node_modules/.pnpm/@ai-sdk+provider-utils@4.0.1_zod@4.3.5/node_modules/@ai-sdk/provider-utils/dist/index.mjs
385
+ // node_modules/.pnpm/@ai-sdk+provider-utils@4.0.23_zod@4.3.5/node_modules/@ai-sdk/provider-utils/dist/index.mjs
359
386
  import * as z4 from "zod/v4";
360
387
  import { ZodFirstPartyTypeKind as ZodFirstPartyTypeKind3 } from "zod/v3";
361
388
  import { ZodFirstPartyTypeKind } from "zod/v3";
@@ -490,13 +517,41 @@ var EventSourceParserStream = class extends TransformStream {
490
517
  }
491
518
  };
492
519
 
493
- // node_modules/.pnpm/@ai-sdk+provider-utils@4.0.1_zod@4.3.5/node_modules/@ai-sdk/provider-utils/dist/index.mjs
520
+ // node_modules/.pnpm/@ai-sdk+provider-utils@4.0.23_zod@4.3.5/node_modules/@ai-sdk/provider-utils/dist/index.mjs
494
521
  function combineHeaders(...headers) {
495
522
  return headers.reduce(
496
523
  (combinedHeaders, currentHeaders) => __spreadValues(__spreadValues({}, combinedHeaders), currentHeaders != null ? currentHeaders : {}),
497
524
  {}
498
525
  );
499
526
  }
527
+ async function delay(delayInMs, options) {
528
+ if (delayInMs == null) {
529
+ return Promise.resolve();
530
+ }
531
+ const signal = options == null ? void 0 : options.abortSignal;
532
+ return new Promise((resolve2, reject) => {
533
+ if (signal == null ? void 0 : signal.aborted) {
534
+ reject(createAbortError());
535
+ return;
536
+ }
537
+ const timeoutId = setTimeout(() => {
538
+ cleanup();
539
+ resolve2();
540
+ }, delayInMs);
541
+ const cleanup = () => {
542
+ clearTimeout(timeoutId);
543
+ signal == null ? void 0 : signal.removeEventListener("abort", onAbort);
544
+ };
545
+ const onAbort = () => {
546
+ cleanup();
547
+ reject(createAbortError());
548
+ };
549
+ signal == null ? void 0 : signal.addEventListener("abort", onAbort);
550
+ });
551
+ }
552
+ function createAbortError() {
553
+ return new DOMException("Delay was aborted", "AbortError");
554
+ }
500
555
  function extractResponseHeaders(response) {
501
556
  return Object.fromEntries([...response.headers]);
502
557
  }
@@ -531,6 +586,7 @@ var DownloadError = class extends (_b15 = AISDKError, _a15 = symbol15, _b15) {
531
586
  return AISDKError.hasMarker(error, marker15);
532
587
  }
533
588
  };
589
+ var DEFAULT_MAX_DOWNLOAD_SIZE = 2 * 1024 * 1024 * 1024;
534
590
  var createIdGenerator = ({
535
591
  prefix,
536
592
  size = 16,
@@ -562,6 +618,25 @@ function isAbortError(error) {
562
618
  error.name === "TimeoutError");
563
619
  }
564
620
  var FETCH_FAILED_ERROR_MESSAGES = ["fetch failed", "failed to fetch"];
621
+ var BUN_ERROR_CODES = [
622
+ "ConnectionRefused",
623
+ "ConnectionClosed",
624
+ "FailedToOpenSocket",
625
+ "ECONNRESET",
626
+ "ECONNREFUSED",
627
+ "ETIMEDOUT",
628
+ "EPIPE"
629
+ ];
630
+ function isBunNetworkError(error) {
631
+ if (!(error instanceof Error)) {
632
+ return false;
633
+ }
634
+ const code = error.code;
635
+ if (typeof code === "string" && BUN_ERROR_CODES.includes(code)) {
636
+ return true;
637
+ }
638
+ return false;
639
+ }
565
640
  function handleFetchError({
566
641
  error,
567
642
  url,
@@ -583,6 +658,15 @@ function handleFetchError({
583
658
  });
584
659
  }
585
660
  }
661
+ if (isBunNetworkError(error)) {
662
+ return new APICallError({
663
+ message: `Cannot connect to API: ${error.message}`,
664
+ cause: error,
665
+ url,
666
+ requestBodyValues,
667
+ isRetryable: true
668
+ });
669
+ }
586
670
  return error;
587
671
  }
588
672
  function getRuntimeEnvironmentUserAgent(globalThisAny = globalThis) {
@@ -631,9 +715,77 @@ function withUserAgentSuffix(headers, ...userAgentSuffixParts) {
631
715
  );
632
716
  return Object.fromEntries(normalizedHeaders.entries());
633
717
  }
634
- var VERSION = true ? "4.0.1" : "0.0.0-test";
635
- var suspectProtoRx = /"__proto__"\s*:/;
636
- var suspectConstructorRx = /"constructor"\s*:/;
718
+ var VERSION = true ? "4.0.23" : "0.0.0-test";
719
+ var getOriginalFetch = () => globalThis.fetch;
720
+ var getFromApi = async ({
721
+ url,
722
+ headers = {},
723
+ successfulResponseHandler,
724
+ failedResponseHandler,
725
+ abortSignal,
726
+ fetch: fetch2 = getOriginalFetch()
727
+ }) => {
728
+ try {
729
+ const response = await fetch2(url, {
730
+ method: "GET",
731
+ headers: withUserAgentSuffix(
732
+ headers,
733
+ `ai-sdk/provider-utils/${VERSION}`,
734
+ getRuntimeEnvironmentUserAgent()
735
+ ),
736
+ signal: abortSignal
737
+ });
738
+ const responseHeaders = extractResponseHeaders(response);
739
+ if (!response.ok) {
740
+ let errorInformation;
741
+ try {
742
+ errorInformation = await failedResponseHandler({
743
+ response,
744
+ url,
745
+ requestBodyValues: {}
746
+ });
747
+ } catch (error) {
748
+ if (isAbortError(error) || APICallError.isInstance(error)) {
749
+ throw error;
750
+ }
751
+ throw new APICallError({
752
+ message: "Failed to process error response",
753
+ cause: error,
754
+ statusCode: response.status,
755
+ url,
756
+ responseHeaders,
757
+ requestBodyValues: {}
758
+ });
759
+ }
760
+ throw errorInformation.value;
761
+ }
762
+ try {
763
+ return await successfulResponseHandler({
764
+ response,
765
+ url,
766
+ requestBodyValues: {}
767
+ });
768
+ } catch (error) {
769
+ if (error instanceof Error) {
770
+ if (isAbortError(error) || APICallError.isInstance(error)) {
771
+ throw error;
772
+ }
773
+ }
774
+ throw new APICallError({
775
+ message: "Failed to process successful response",
776
+ cause: error,
777
+ statusCode: response.status,
778
+ url,
779
+ responseHeaders,
780
+ requestBodyValues: {}
781
+ });
782
+ }
783
+ } catch (error) {
784
+ throw handleFetchError({ error, url, requestBodyValues: {} });
785
+ }
786
+ };
787
+ var suspectProtoRx = /"(?:_|\\u005[Ff])(?:_|\\u005[Ff])(?:p|\\u0070)(?:r|\\u0072)(?:o|\\u006[Ff])(?:t|\\u0074)(?:o|\\u006[Ff])(?:_|\\u005[Ff])(?:_|\\u005[Ff])"\s*:/;
788
+ var suspectConstructorRx = /"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/;
637
789
  function _parse(text) {
638
790
  const obj = JSON.parse(text);
639
791
  if (obj === null || typeof obj !== "object") {
@@ -653,7 +805,7 @@ function filter(obj) {
653
805
  if (Object.prototype.hasOwnProperty.call(node, "__proto__")) {
654
806
  throw new SyntaxError("Object contains forbidden prototype property");
655
807
  }
656
- if (Object.prototype.hasOwnProperty.call(node, "constructor") && Object.prototype.hasOwnProperty.call(node.constructor, "prototype")) {
808
+ if (Object.prototype.hasOwnProperty.call(node, "constructor") && node.constructor !== null && typeof node.constructor === "object" && Object.prototype.hasOwnProperty.call(node.constructor, "prototype")) {
657
809
  throw new SyntaxError("Object contains forbidden prototype property");
658
810
  }
659
811
  for (const key in node) {
@@ -680,31 +832,40 @@ function secureJsonParse(text) {
680
832
  }
681
833
  }
682
834
  function addAdditionalPropertiesToJsonSchema(jsonSchema2) {
683
- if (jsonSchema2.type === "object") {
835
+ if (jsonSchema2.type === "object" || Array.isArray(jsonSchema2.type) && jsonSchema2.type.includes("object")) {
684
836
  jsonSchema2.additionalProperties = false;
685
- const properties = jsonSchema2.properties;
837
+ const { properties } = jsonSchema2;
686
838
  if (properties != null) {
687
- for (const property in properties) {
688
- properties[property] = addAdditionalPropertiesToJsonSchema(
689
- properties[property]
690
- );
839
+ for (const key of Object.keys(properties)) {
840
+ properties[key] = visit(properties[key]);
691
841
  }
692
842
  }
693
843
  }
694
- if (jsonSchema2.type === "array" && jsonSchema2.items != null) {
695
- if (Array.isArray(jsonSchema2.items)) {
696
- jsonSchema2.items = jsonSchema2.items.map(
697
- (item) => addAdditionalPropertiesToJsonSchema(item)
698
- );
699
- } else {
700
- jsonSchema2.items = addAdditionalPropertiesToJsonSchema(
701
- jsonSchema2.items
702
- );
844
+ if (jsonSchema2.items != null) {
845
+ jsonSchema2.items = Array.isArray(jsonSchema2.items) ? jsonSchema2.items.map(visit) : visit(jsonSchema2.items);
846
+ }
847
+ if (jsonSchema2.anyOf != null) {
848
+ jsonSchema2.anyOf = jsonSchema2.anyOf.map(visit);
849
+ }
850
+ if (jsonSchema2.allOf != null) {
851
+ jsonSchema2.allOf = jsonSchema2.allOf.map(visit);
852
+ }
853
+ if (jsonSchema2.oneOf != null) {
854
+ jsonSchema2.oneOf = jsonSchema2.oneOf.map(visit);
855
+ }
856
+ const { definitions } = jsonSchema2;
857
+ if (definitions != null) {
858
+ for (const key of Object.keys(definitions)) {
859
+ definitions[key] = visit(definitions[key]);
703
860
  }
704
861
  }
705
862
  return jsonSchema2;
706
863
  }
707
- var ignoreOverride = Symbol(
864
+ function visit(def) {
865
+ if (typeof def === "boolean") return def;
866
+ return addAdditionalPropertiesToJsonSchema(def);
867
+ }
868
+ var ignoreOverride = /* @__PURE__ */ Symbol(
708
869
  "Let zodToJsonSchema decide on which parser to use"
709
870
  );
710
871
  var defaultOptions = {
@@ -1770,7 +1931,7 @@ var zod3ToJsonSchema = (schema, options) => {
1770
1931
  combined.$schema = "http://json-schema.org/draft-07/schema#";
1771
1932
  return combined;
1772
1933
  };
1773
- var schemaSymbol = Symbol.for("vercel.ai.schema");
1934
+ var schemaSymbol = /* @__PURE__ */ Symbol.for("vercel.ai.schema");
1774
1935
  function jsonSchema(jsonSchema2, {
1775
1936
  validate
1776
1937
  } = {}) {
@@ -1795,9 +1956,11 @@ function asSchema(schema) {
1795
1956
  }
1796
1957
  function standardSchema(standardSchema2) {
1797
1958
  return jsonSchema(
1798
- () => standardSchema2["~standard"].jsonSchema.input({
1799
- target: "draft-07"
1800
- }),
1959
+ () => addAdditionalPropertiesToJsonSchema(
1960
+ standardSchema2["~standard"].jsonSchema.input({
1961
+ target: "draft-07"
1962
+ })
1963
+ ),
1801
1964
  {
1802
1965
  validate: async (value) => {
1803
1966
  const result = await standardSchema2["~standard"].validate(value);
@@ -1860,17 +2023,19 @@ function zodSchema(zodSchema2, options) {
1860
2023
  }
1861
2024
  async function validateTypes({
1862
2025
  value,
1863
- schema
2026
+ schema,
2027
+ context
1864
2028
  }) {
1865
- const result = await safeValidateTypes({ value, schema });
2029
+ const result = await safeValidateTypes({ value, schema, context });
1866
2030
  if (!result.success) {
1867
- throw TypeValidationError.wrap({ value, cause: result.error });
2031
+ throw TypeValidationError.wrap({ value, cause: result.error, context });
1868
2032
  }
1869
2033
  return result.value;
1870
2034
  }
1871
2035
  async function safeValidateTypes({
1872
2036
  value,
1873
- schema
2037
+ schema,
2038
+ context
1874
2039
  }) {
1875
2040
  const actualSchema = asSchema(schema);
1876
2041
  try {
@@ -1883,13 +2048,13 @@ async function safeValidateTypes({
1883
2048
  }
1884
2049
  return {
1885
2050
  success: false,
1886
- error: TypeValidationError.wrap({ value, cause: result.error }),
2051
+ error: TypeValidationError.wrap({ value, cause: result.error, context }),
1887
2052
  rawValue: value
1888
2053
  };
1889
2054
  } catch (error) {
1890
2055
  return {
1891
2056
  success: false,
1892
- error: TypeValidationError.wrap({ value, cause: error }),
2057
+ error: TypeValidationError.wrap({ value, cause: error, context }),
1893
2058
  rawValue: value
1894
2059
  };
1895
2060
  }
@@ -3277,7 +3442,7 @@ var OpenRouterChatLanguageModel = class {
3277
3442
  tools,
3278
3443
  toolChoice
3279
3444
  }) {
3280
- var _a16;
3445
+ var _a16, _b16;
3281
3446
  const baseArgs = __spreadValues(__spreadValues({
3282
3447
  // model id:
3283
3448
  model: this.modelId,
@@ -3288,12 +3453,12 @@ var OpenRouterChatLanguageModel = class {
3288
3453
  top_logprobs: typeof this.settings.logprobs === "number" ? this.settings.logprobs : typeof this.settings.logprobs === "boolean" ? this.settings.logprobs ? 0 : void 0 : void 0,
3289
3454
  user: this.settings.user,
3290
3455
  parallel_tool_calls: this.settings.parallelToolCalls,
3291
- // standardized settings:
3292
- max_tokens: maxOutputTokens,
3293
- temperature,
3294
- top_p: topP,
3295
- frequency_penalty: frequencyPenalty,
3296
- presence_penalty: presencePenalty,
3456
+ // standardized settings (call-level options override model-level settings):
3457
+ max_tokens: maxOutputTokens != null ? maxOutputTokens : this.settings.maxTokens,
3458
+ temperature: temperature != null ? temperature : this.settings.temperature,
3459
+ top_p: topP != null ? topP : this.settings.topP,
3460
+ frequency_penalty: frequencyPenalty != null ? frequencyPenalty : this.settings.frequencyPenalty,
3461
+ presence_penalty: presencePenalty != null ? presencePenalty : this.settings.presencePenalty,
3297
3462
  seed,
3298
3463
  stop: stopSequences,
3299
3464
  response_format: (responseFormat == null ? void 0 : responseFormat.type) === "json" ? responseFormat.schema != null ? {
@@ -3306,7 +3471,7 @@ var OpenRouterChatLanguageModel = class {
3306
3471
  description: responseFormat.description
3307
3472
  })
3308
3473
  } : { type: "json_object" } : void 0,
3309
- top_k: topK,
3474
+ top_k: topK != null ? topK : this.settings.topK,
3310
3475
  // messages:
3311
3476
  messages: convertToOpenRouterChatMessages(prompt),
3312
3477
  // OpenRouter specific settings:
@@ -3327,14 +3492,18 @@ var OpenRouterChatLanguageModel = class {
3327
3492
  const mappedTools = [];
3328
3493
  for (const tool of tools) {
3329
3494
  if (tool.type === "function") {
3330
- mappedTools.push({
3495
+ const openrouterOptions = (_b16 = tool.providerOptions) == null ? void 0 : _b16.openrouter;
3496
+ const eagerInputStreaming = openrouterOptions == null ? void 0 : openrouterOptions.eager_input_streaming;
3497
+ mappedTools.push(__spreadValues({
3331
3498
  type: "function",
3332
3499
  function: {
3333
3500
  name: tool.name,
3334
3501
  description: tool.description,
3335
3502
  parameters: tool.inputSchema
3336
3503
  }
3337
- });
3504
+ }, eagerInputStreaming != null && {
3505
+ eager_input_streaming: eagerInputStreaming
3506
+ }));
3338
3507
  } else if (tool.type === "provider") {
3339
3508
  mappedTools.push(mapProviderTool(tool));
3340
3509
  }
@@ -3672,18 +3841,16 @@ var OpenRouterChatLanguageModel = class {
3672
3841
  return;
3673
3842
  }
3674
3843
  const delta = choice.delta;
3675
- const emitReasoningChunk = (chunkText, providerMetadata) => {
3844
+ const emitReasoningChunk = (chunkText) => {
3676
3845
  if (!reasoningStarted) {
3677
3846
  reasoningId = generateId();
3678
3847
  controller.enqueue({
3679
- providerMetadata,
3680
3848
  type: "reasoning-start",
3681
3849
  id: reasoningId
3682
3850
  });
3683
3851
  reasoningStarted = true;
3684
3852
  }
3685
3853
  controller.enqueue({
3686
- providerMetadata,
3687
3854
  type: "reasoning-delta",
3688
3855
  delta: chunkText,
3689
3856
  id: reasoningId || generateId()
@@ -3705,15 +3872,10 @@ var OpenRouterChatLanguageModel = class {
3705
3872
  }
3706
3873
  }
3707
3874
  if (!textStarted) {
3708
- const reasoningMetadata = {
3709
- openrouter: {
3710
- reasoning_details: accumulatedReasoningDetails.map((d) => __spreadValues({}, d))
3711
- }
3712
- };
3713
3875
  for (const detail of delta.reasoning_details) {
3714
3876
  switch (detail.type) {
3715
3877
  case "reasoning.text" /* Text */: {
3716
- emitReasoningChunk(detail.text || "", reasoningMetadata);
3878
+ emitReasoningChunk(detail.text || "");
3717
3879
  break;
3718
3880
  }
3719
3881
  case "reasoning.encrypted" /* Encrypted */: {
@@ -3721,7 +3883,7 @@ var OpenRouterChatLanguageModel = class {
3721
3883
  }
3722
3884
  case "reasoning.summary" /* Summary */: {
3723
3885
  if (detail.summary) {
3724
- emitReasoningChunk(detail.summary, reasoningMetadata);
3886
+ emitReasoningChunk(detail.summary);
3725
3887
  }
3726
3888
  break;
3727
3889
  }
@@ -4010,6 +4172,12 @@ var OpenRouterChatLanguageModel = class {
4010
4172
  if (accumulatedFileAnnotations.length > 0) {
4011
4173
  openrouterMetadata.annotations = accumulatedFileAnnotations;
4012
4174
  }
4175
+ if (usage.inputTokens.total === void 0 && openrouterUsage.promptTokens !== void 0) {
4176
+ usage.inputTokens.total = openrouterUsage.promptTokens;
4177
+ }
4178
+ if (usage.outputTokens.total === void 0 && openrouterUsage.completionTokens !== void 0) {
4179
+ usage.outputTokens.total = openrouterUsage.completionTokens;
4180
+ }
4013
4181
  usage.raw = rawUsage;
4014
4182
  controller.enqueue({
4015
4183
  type: "finish",
@@ -4245,16 +4413,16 @@ var OpenRouterCompletionLanguageModel = class {
4245
4413
  logprobs: typeof this.settings.logprobs === "number" ? this.settings.logprobs : typeof this.settings.logprobs === "boolean" ? this.settings.logprobs ? 0 : void 0 : void 0,
4246
4414
  suffix: this.settings.suffix,
4247
4415
  user: this.settings.user,
4248
- // standardized settings:
4249
- max_tokens: maxOutputTokens,
4250
- temperature,
4251
- top_p: topP,
4252
- frequency_penalty: frequencyPenalty,
4253
- presence_penalty: presencePenalty,
4416
+ // standardized settings (call-level options override model-level settings):
4417
+ max_tokens: maxOutputTokens != null ? maxOutputTokens : this.settings.maxTokens,
4418
+ temperature: temperature != null ? temperature : this.settings.temperature,
4419
+ top_p: topP != null ? topP : this.settings.topP,
4420
+ frequency_penalty: frequencyPenalty != null ? frequencyPenalty : this.settings.frequencyPenalty,
4421
+ presence_penalty: presencePenalty != null ? presencePenalty : this.settings.presencePenalty,
4254
4422
  seed,
4255
4423
  stop: stopSequences,
4256
4424
  response_format: responseFormat,
4257
- top_k: topK,
4425
+ top_k: topK != null ? topK : this.settings.topK,
4258
4426
  // prompt:
4259
4427
  prompt: completionPrompt,
4260
4428
  // OpenRouter specific settings:
@@ -4712,10 +4880,203 @@ function convertImageFileToContentPart(file) {
4712
4880
  image_url: { url }
4713
4881
  };
4714
4882
  }
4883
+
4884
+ // src/video/schemas.ts
4885
+ import { z as z11 } from "zod/v4";
4886
+ var VideoGenerationSubmitResponseSchema = z11.object({
4887
+ id: z11.string(),
4888
+ generation_id: z11.string().optional(),
4889
+ polling_url: z11.string(),
4890
+ status: z11.string()
4891
+ }).passthrough();
4892
+ var VideoGenerationPollResponseSchema = z11.object({
4893
+ id: z11.string(),
4894
+ generation_id: z11.string().optional(),
4895
+ polling_url: z11.string(),
4896
+ status: z11.string(),
4897
+ unsigned_urls: z11.array(z11.string()).optional(),
4898
+ usage: z11.object({
4899
+ cost: z11.number().optional(),
4900
+ is_byok: z11.boolean().optional()
4901
+ }).passthrough().optional(),
4902
+ error: z11.string().optional()
4903
+ }).passthrough();
4904
+
4905
+ // src/video/index.ts
4906
+ var DEFAULT_POLL_INTERVAL_MS = 2e3;
4907
+ var DEFAULT_MAX_POLL_TIME_MS = 6e5;
4908
+ var OpenRouterVideoModel = class {
4909
+ constructor(modelId, settings, config) {
4910
+ this.specificationVersion = "v3";
4911
+ this.provider = "openrouter";
4912
+ this.maxVideosPerCall = 1;
4913
+ this.modelId = modelId;
4914
+ this.settings = settings;
4915
+ this.config = config;
4916
+ }
4917
+ async doGenerate(options) {
4918
+ var _a16, _b16, _c, _d, _e;
4919
+ const {
4920
+ prompt,
4921
+ n,
4922
+ aspectRatio,
4923
+ resolution,
4924
+ duration,
4925
+ seed,
4926
+ image,
4927
+ abortSignal,
4928
+ headers,
4929
+ providerOptions
4930
+ } = options;
4931
+ const warnings = [];
4932
+ if (n > 1) {
4933
+ warnings.push({
4934
+ type: "unsupported",
4935
+ feature: "n > 1",
4936
+ details: `OpenRouter video generation returns 1 video per call. Requested ${n} videos.`
4937
+ });
4938
+ }
4939
+ const body = __spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
4940
+ model: this.modelId,
4941
+ prompt: prompt != null ? prompt : ""
4942
+ }, aspectRatio !== void 0 && { aspect_ratio: aspectRatio }), resolution !== void 0 && { size: resolution }), duration !== void 0 && { duration }), seed !== void 0 && { seed }), this.settings.generateAudio !== void 0 && {
4943
+ generate_audio: this.settings.generateAudio
4944
+ }), image !== void 0 && {
4945
+ frame_images: [convertImageToFrameImage(image)]
4946
+ }), this.config.extraBody), this.settings.extraBody), providerOptions.openrouter);
4947
+ const mergedHeaders = combineHeaders(this.config.headers(), headers);
4948
+ const { value: submitResponse, responseHeaders } = await postJsonToApi({
4949
+ url: this.config.url({
4950
+ path: "/videos",
4951
+ modelId: this.modelId
4952
+ }),
4953
+ headers: mergedHeaders,
4954
+ body,
4955
+ failedResponseHandler: openrouterFailedResponseHandler,
4956
+ successfulResponseHandler: createJsonResponseHandler(
4957
+ VideoGenerationSubmitResponseSchema
4958
+ ),
4959
+ abortSignal,
4960
+ fetch: this.config.fetch
4961
+ });
4962
+ const pollIntervalMs = (_a16 = this.settings.pollIntervalMs) != null ? _a16 : DEFAULT_POLL_INTERVAL_MS;
4963
+ const maxPollTimeMs = (_b16 = this.settings.maxPollTimeMs) != null ? _b16 : DEFAULT_MAX_POLL_TIME_MS;
4964
+ const pollResult = await this.pollUntilComplete({
4965
+ jobId: submitResponse.id,
4966
+ headers: mergedHeaders,
4967
+ abortSignal,
4968
+ pollIntervalMs,
4969
+ maxPollTimeMs
4970
+ });
4971
+ const videos = [];
4972
+ if (pollResult.unsigned_urls) {
4973
+ for (const url of pollResult.unsigned_urls) {
4974
+ videos.push({
4975
+ type: "url",
4976
+ url,
4977
+ mediaType: "video/mp4"
4978
+ });
4979
+ }
4980
+ }
4981
+ const providerMetadata = {
4982
+ openrouter: {
4983
+ generationId: (_c = pollResult.generation_id) != null ? _c : null,
4984
+ cost: (_e = (_d = pollResult.usage) == null ? void 0 : _d.cost) != null ? _e : null
4985
+ }
4986
+ };
4987
+ return {
4988
+ videos,
4989
+ warnings,
4990
+ providerMetadata,
4991
+ response: {
4992
+ timestamp: /* @__PURE__ */ new Date(),
4993
+ modelId: this.modelId,
4994
+ headers: responseHeaders
4995
+ }
4996
+ };
4997
+ }
4998
+ async pollUntilComplete({
4999
+ jobId,
5000
+ headers,
5001
+ abortSignal,
5002
+ pollIntervalMs,
5003
+ maxPollTimeMs
5004
+ }) {
5005
+ var _a16;
5006
+ const startTime = Date.now();
5007
+ while (Date.now() - startTime < maxPollTimeMs) {
5008
+ abortSignal == null ? void 0 : abortSignal.throwIfAborted();
5009
+ await delay(pollIntervalMs);
5010
+ abortSignal == null ? void 0 : abortSignal.throwIfAborted();
5011
+ const { value: pollResponse } = await getFromApi({
5012
+ url: this.config.url({
5013
+ path: `/videos/${jobId}`,
5014
+ modelId: this.modelId
5015
+ }),
5016
+ headers,
5017
+ failedResponseHandler: openrouterFailedResponseHandler,
5018
+ successfulResponseHandler: createJsonResponseHandler(
5019
+ VideoGenerationPollResponseSchema
5020
+ ),
5021
+ abortSignal,
5022
+ fetch: this.config.fetch
5023
+ });
5024
+ if (pollResponse.status === "completed") {
5025
+ return {
5026
+ generation_id: pollResponse.generation_id,
5027
+ unsigned_urls: pollResponse.unsigned_urls,
5028
+ usage: pollResponse.usage
5029
+ };
5030
+ }
5031
+ if (pollResponse.status === "failed" || pollResponse.status === "dead" || pollResponse.status === "cancelled" || pollResponse.status === "expired") {
5032
+ throw new APICallError({
5033
+ message: (_a16 = pollResponse.error) != null ? _a16 : `Video generation failed with status: ${pollResponse.status}`,
5034
+ url: this.config.url({
5035
+ path: `/videos/${jobId}`,
5036
+ modelId: this.modelId
5037
+ }),
5038
+ requestBodyValues: {},
5039
+ statusCode: 500,
5040
+ isRetryable: false
5041
+ });
5042
+ }
5043
+ }
5044
+ throw new APICallError({
5045
+ message: `Video generation timed out after ${maxPollTimeMs}ms`,
5046
+ url: this.config.url({
5047
+ path: `/videos/${jobId}`,
5048
+ modelId: this.modelId
5049
+ }),
5050
+ requestBodyValues: {},
5051
+ statusCode: 408,
5052
+ isRetryable: true
5053
+ });
5054
+ }
5055
+ };
5056
+ function convertImageToFrameImage(file) {
5057
+ if (file.type === "url") {
5058
+ return {
5059
+ type: "image_url",
5060
+ image_url: { url: file.url },
5061
+ frame_type: "first_frame"
5062
+ };
5063
+ }
5064
+ const url = buildFileDataUrl({
5065
+ data: file.data,
5066
+ mediaType: file.mediaType,
5067
+ defaultMediaType: "image/png"
5068
+ });
5069
+ return {
5070
+ type: "image_url",
5071
+ image_url: { url },
5072
+ frame_type: "first_frame"
5073
+ };
5074
+ }
4715
5075
  export {
4716
5076
  OpenRouterChatLanguageModel,
4717
5077
  OpenRouterCompletionLanguageModel,
4718
5078
  OpenRouterEmbeddingModel,
4719
- OpenRouterImageModel
5079
+ OpenRouterImageModel,
5080
+ OpenRouterVideoModel
4720
5081
  };
4721
5082
  //# sourceMappingURL=index.mjs.map