@mux/ai 0.35.0 → 0.36.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.
@@ -89,6 +89,12 @@ interface WorkflowMuxClient {
89
89
  interface MuxAIOptions {
90
90
  /** Optional timeout (ms) for helper utilities that support request limits. */
91
91
  timeout?: number;
92
+ /**
93
+ * Optional asset snapshot to reuse instead of retrieving the asset from Mux.
94
+ * The snapshot must belong to `assetId`; callers should capture it immediately
95
+ * before starting the workflow.
96
+ */
97
+ assetSnapshot?: MuxAsset;
92
98
  /**
93
99
  * Optional credentials for workflow execution.
94
100
  * Use encryptForWorkflow when running in Workflow Dev Kit environments.
@@ -1,7 +1,7 @@
1
- export { A as ASK_QUESTIONS_DEFAULT_MAX_ANSWER_OPTION_LENGTH, j as ASK_QUESTIONS_DEFAULT_MAX_FREE_FORM_ANSWER_LENGTH, k as ASK_QUESTIONS_MAX_QUESTION_LENGTH, l as AskQuestionsOptions, m as AskQuestionsResult, n as AskQuestionsType, o as AudioTranslationOptions, p as AudioTranslationResult, q as AutoCensorProfanityOptions, B as BurnedInCaptionsAnalysis, r as BurnedInCaptionsOptions, s as BurnedInCaptionsPromptOverrides, u as BurnedInCaptionsPromptSections, v as BurnedInCaptionsResult, C as CaptionReplacement, w as CensorMode, x as Chapter, y as ChapterSystemPromptSections, z as ChaptersOptions, D as ChaptersPromptOverrides, E as ChaptersPromptSections, F as ChaptersResult, G as ChaptersType, H as DEFAULT_DESCRIPTION_LENGTH, J as DEFAULT_SUMMARY_KEYWORD_LIMIT, K as DEFAULT_TITLE_LENGTH, M as EditCaptionsOptions, N as EditCaptionsResult, O as EmbeddingsOptions, P as EmbeddingsResult, Q as EngagementInsightsOptions, R as EngagementInsightsResult, T as GOOGLE_VISION_LIKELIHOOD_TO_SCORE, U as HIVE_SEXUAL_CATEGORIES, V as HIVE_VIOLENCE_CATEGORIES, W as HiveModerationOutput, X as HiveModerationSource, Y as ModerationOptions, Z as ModerationProvider, _ as ModerationResult, $ as MomentInsight, a0 as OverallInsight, a1 as ProfanityDetectionPayload, a2 as Question, a3 as QuestionAnswer, a4 as QuestionAnswerType, a5 as ReplacementRecord, a6 as StaticRenditionCleanupOutcome, a7 as SummarizationOptions, a8 as SummarizationPromptOverrides, a9 as SummarizationPromptSections, aa as SummaryAndTagsResult, ab as SummaryType, ac as ThumbnailModerationScore, ad as TranslationChunkingOptions, ae as TranslationOptions, af as TranslationPayload, ag as TranslationResult, ah as aggregateTokenUsage, ai as applyOverrideLists, aj as applyReplacements, ak as askQuestions, al as buildReplacementRegex, am as burnedInCaptionsSchema, an as censorVttContent, ao as chapterSchema, ap as chaptersSchema, aq as createReplacer, ar as editCaptions, as as extractTranscriptSegmentsForHotspots, at as generateChapters, au as generateEmbeddings, av as generateEngagementInsights, aw as generateVideoEmbeddings, ax as getModerationScores, ay as getSummaryAndTags, az as hasBurnedInCaptions, aA as mapShotsToHotspots, aB as normalizeTranslatedVtt, aC as profanityDetectionSchema, aD as questionAnswerSchema, aE as shouldSplitChunkTranslationError, aF as summarySchema, aG as transformCueText, aH as translateAudio, aI as translateCaptions, aJ as translationSchema, aK as validateNeverTranslateTerms, aL as verifyNeverTranslateTerms } from '../index-fU3hmKZu.js';
1
+ export { A as ASK_QUESTIONS_DEFAULT_MAX_ANSWER_OPTION_LENGTH, j as ASK_QUESTIONS_DEFAULT_MAX_FREE_FORM_ANSWER_LENGTH, k as ASK_QUESTIONS_MAX_QUESTION_LENGTH, l as AskQuestionsOptions, m as AskQuestionsResult, n as AskQuestionsType, o as AudioTranslationOptions, p as AudioTranslationResult, q as AutoCensorProfanityOptions, B as BurnedInCaptionsAnalysis, r as BurnedInCaptionsOptions, s as BurnedInCaptionsPromptOverrides, u as BurnedInCaptionsPromptSections, v as BurnedInCaptionsResult, C as CaptionReplacement, w as CensorMode, x as Chapter, y as ChapterSystemPromptSections, z as ChaptersOptions, D as ChaptersPromptOverrides, E as ChaptersPromptSections, F as ChaptersResult, G as ChaptersType, H as DEFAULT_DESCRIPTION_LENGTH, J as DEFAULT_SUMMARY_KEYWORD_LIMIT, K as DEFAULT_TITLE_LENGTH, M as EditCaptionsOptions, N as EditCaptionsResult, O as EmbeddingsOptions, P as EmbeddingsResult, Q as EngagementInsightsOptions, R as EngagementInsightsResult, T as GOOGLE_VISION_LIKELIHOOD_TO_SCORE, U as HIVE_SEXUAL_CATEGORIES, V as HIVE_VIOLENCE_CATEGORIES, W as HiveModerationOutput, X as HiveModerationSource, Y as ModerationOptions, Z as ModerationProvider, _ as ModerationResult, $ as MomentInsight, a0 as OverallInsight, a1 as ProfanityDetectionPayload, a2 as Question, a3 as QuestionAnswer, a4 as QuestionAnswerType, a5 as ReplacementRecord, a6 as StaticRenditionCleanupOutcome, a7 as SummarizationOptions, a8 as SummarizationPromptOverrides, a9 as SummarizationPromptSections, aa as SummaryAndTagsResult, ab as SummaryType, ac as ThumbnailModerationScore, ad as TranslationChunkingOptions, ae as TranslationOptions, af as TranslationPayload, ag as TranslationResult, ah as aggregateTokenUsage, ai as applyOverrideLists, aj as applyReplacements, ak as askQuestions, al as buildReplacementRegex, am as burnedInCaptionsSchema, an as censorVttContent, ao as chapterSchema, ap as chaptersSchema, aq as createReplacer, ar as editCaptions, as as extractTranscriptSegmentsForHotspots, at as generateChapters, au as generateEmbeddings, av as generateEngagementInsights, aw as generateVideoEmbeddings, ax as getModerationScores, ay as getSummaryAndTags, az as hasBurnedInCaptions, aA as mapShotsToHotspots, aB as normalizeTranslatedVtt, aC as profanityDetectionSchema, aD as questionAnswerSchema, aE as shouldSplitChunkTranslationError, aF as summarySchema, aG as transformCueText, aH as translateAudio, aI as translateCaptions, aJ as translationSchema, aK as validateNeverTranslateTerms, aL as verifyNeverTranslateTerms } from '../index-C2FORyvQ.js';
2
2
  import 'zod';
3
3
  import '@ai-sdk/anthropic';
4
4
  import '@ai-sdk/google';
5
5
  import '@ai-sdk/openai';
6
- import '../shots-BMbViFbZ.js';
6
+ import '../shots-CUI09Ohe.js';
7
7
  import '@mux/mux-node';
@@ -1635,9 +1635,12 @@ function toPlaybackAsset(asset) {
1635
1635
  const { id: playbackId, policy } = getPlaybackId(asset);
1636
1636
  return { asset, playbackId, policy };
1637
1637
  }
1638
- async function getPlaybackIdForAsset(assetId, credentials) {
1638
+ async function getPlaybackIdForAsset(assetId, credentials, assetSnapshot) {
1639
1639
  "use step";
1640
- const asset = await getMuxAsset(assetId, credentials);
1640
+ const asset = assetSnapshot ?? await getMuxAsset(assetId, credentials);
1641
+ if (asset.id !== assetId) {
1642
+ throw new MuxAiError("Asset snapshot does not match the requested asset ID.", { type: "validation_error" });
1643
+ }
1641
1644
  return toPlaybackAsset(asset);
1642
1645
  }
1643
1646
  async function getMuxAsset(assetId, credentials) {
@@ -3023,7 +3026,7 @@ async function askQuestionsInternal(assetId, questions, options, collectedUsage)
3023
3026
  model,
3024
3027
  provider
3025
3028
  });
3026
- const { asset: assetData, playbackId, policy } = await getPlaybackIdForAsset(assetId, credentials);
3029
+ const { asset: assetData, playbackId, policy } = await getPlaybackIdForAsset(assetId, credentials, options?.assetSnapshot);
3027
3030
  const assetDurationSeconds = getAssetDurationSecondsFromAsset(assetData);
3028
3031
  const isAudioOnly = isAudioOnlyAsset(assetData);
3029
3032
  const effectiveScope = hasWorkflowScopeBoundaries(scope) ? scope : void 0;
@@ -3377,7 +3380,7 @@ async function hasBurnedInCaptionsInternal(assetId, options, collectedUsage) {
3377
3380
  model,
3378
3381
  provider
3379
3382
  });
3380
- const { asset: assetData, playbackId, policy } = await getPlaybackIdForAsset(assetId, credentials);
3383
+ const { asset: assetData, playbackId, policy } = await getPlaybackIdForAsset(assetId, credentials, options.assetSnapshot);
3381
3384
  const assetDurationSeconds = getAssetDurationSecondsFromAsset(assetData);
3382
3385
  const storyboardScope = resolveRenderableVideoScope(
3383
3386
  scope,
@@ -3642,7 +3645,7 @@ async function generateChaptersInternal(assetId, options, collectedUsage) {
3642
3645
  model,
3643
3646
  provider
3644
3647
  });
3645
- const { asset: assetData, playbackId, policy } = await getPlaybackIdForAsset(assetId, credentials);
3648
+ const { asset: assetData, playbackId, policy } = await getPlaybackIdForAsset(assetId, credentials, options.assetSnapshot);
3646
3649
  const assetDurationSeconds = getAssetDurationSecondsFromAsset(assetData);
3647
3650
  const effectiveScope = hasWorkflowScopeBoundaries(scope) ? scope : void 0;
3648
3651
  const resolvedScope = effectiveScope ? resolveWorkflowScope(effectiveScope, assetDurationSeconds) : void 0;
@@ -4338,7 +4341,7 @@ async function editCaptionsInternal(assetId, trackId, options, collectedUsage) {
4338
4341
  { type: "validation_error" }
4339
4342
  );
4340
4343
  }
4341
- const { asset: assetData, playbackId, policy } = await getPlaybackIdForAsset(assetId, credentials);
4344
+ const { asset: assetData, playbackId, policy } = await getPlaybackIdForAsset(assetId, credentials, options.assetSnapshot);
4342
4345
  const assetDurationSeconds = getAssetDurationSecondsFromAsset(assetData);
4343
4346
  const signingContext = await resolveMuxSigningContext(credentials);
4344
4347
  if (policy === "signed" && !signingContext) {
@@ -4774,7 +4777,7 @@ async function generateEmbeddingsInternal(assetId, options, collectedUsage) {
4774
4777
  scope
4775
4778
  } = options;
4776
4779
  const embeddingModel = resolveEmbeddingModelConfig({ ...options, provider, model });
4777
- const { asset: assetData, playbackId, policy } = await getPlaybackIdForAsset(assetId, credentials);
4780
+ const { asset: assetData, playbackId, policy } = await getPlaybackIdForAsset(assetId, credentials, options.assetSnapshot);
4778
4781
  const assetDurationSeconds = getAssetDurationSecondsFromAsset(assetData);
4779
4782
  const effectiveScope = hasWorkflowScopeBoundaries(scope) ? scope : void 0;
4780
4783
  if (effectiveScope) {
@@ -5394,7 +5397,7 @@ async function generateEngagementInsightsInternal(assetId, options, collectedUsa
5394
5397
  model,
5395
5398
  provider
5396
5399
  });
5397
- const { asset, playbackId, policy } = await getPlaybackIdForAsset(assetId, credentials);
5400
+ const { asset, playbackId, policy } = await getPlaybackIdForAsset(assetId, credentials, options.assetSnapshot);
5398
5401
  const assetDurationSeconds = getAssetDurationSecondsFromAsset(asset);
5399
5402
  if (!assetDurationSeconds) {
5400
5403
  throw new MuxAiError(`Asset ${assetId} has no valid duration.`, { type: "validation_error" });
@@ -6152,7 +6155,7 @@ async function getModerationScores(assetId, options = {}) {
6152
6155
  scope
6153
6156
  } = options;
6154
6157
  const credentials = providedCredentials;
6155
- const { asset, playbackId, policy } = await getPlaybackIdForAsset(assetId, credentials);
6158
+ const { asset, playbackId, policy } = await getPlaybackIdForAsset(assetId, credentials, options.assetSnapshot);
6156
6159
  const videoTrackDurationSeconds = getVideoTrackDurationSecondsFromAsset(asset);
6157
6160
  const videoTrackFps = getVideoTrackMaxFrameRateFromAsset(asset);
6158
6161
  const assetDurationSeconds = getAssetDurationSecondsFromAsset(asset);
@@ -6766,7 +6769,7 @@ async function getSummaryAndTagsInternal(assetId, options, collectedUsage) {
6766
6769
  provider
6767
6770
  });
6768
6771
  const workflowCredentials = credentials;
6769
- const { asset: assetData, playbackId, policy } = await getPlaybackIdForAsset(assetId, workflowCredentials);
6772
+ const { asset: assetData, playbackId, policy } = await getPlaybackIdForAsset(assetId, workflowCredentials, options?.assetSnapshot);
6770
6773
  const assetDurationSeconds = getAssetDurationSecondsFromAsset(assetData);
6771
6774
  const isAudioOnly = isAudioOnlyAsset(assetData);
6772
6775
  const effectiveScope = hasWorkflowScopeBoundaries(scope) ? scope : void 0;
@@ -7213,7 +7216,7 @@ async function translateAudio(assetId, toLanguageCode, options = {}) {
7213
7216
  if (uploadToS3 && (!s3Endpoint || !s3Bucket || !effectiveStorageAdapter && (!s3AccessKeyId || !s3SecretAccessKey))) {
7214
7217
  throw new MuxAiError("Storage configuration is required for uploading. Provide s3Endpoint and s3Bucket. If no storageAdapter is supplied, also provide s3AccessKeyId and s3SecretAccessKey in options or set S3_ENDPOINT, S3_BUCKET, S3_ACCESS_KEY_ID, and S3_SECRET_ACCESS_KEY environment variables.", { type: "validation_error" });
7215
7218
  }
7216
- const { asset: initialAsset, playbackId, policy } = await getPlaybackIdForAsset(assetId, credentials);
7219
+ const { asset: initialAsset, playbackId, policy } = await getPlaybackIdForAsset(assetId, credentials, options.assetSnapshot);
7217
7220
  const assetDurationSeconds = getAssetDurationSecondsFromAsset(initialAsset);
7218
7221
  let currentAsset = initialAsset;
7219
7222
  let createdStaticRenditionId;
@@ -8083,7 +8086,7 @@ async function translateCaptionsInternal(assetId, trackId, toLanguageCode, optio
8083
8086
  if (uploadToS3 && (!s3Endpoint || !s3Bucket || !effectiveStorageAdapter && (!s3AccessKeyId || !s3SecretAccessKey))) {
8084
8087
  throw new MuxAiError("Storage configuration is required for uploading. Provide s3Endpoint and s3Bucket. If no storageAdapter is supplied, also provide s3AccessKeyId and s3SecretAccessKey in options or set S3_ENDPOINT, S3_BUCKET, S3_ACCESS_KEY_ID, and S3_SECRET_ACCESS_KEY environment variables.", { type: "validation_error" });
8085
8088
  }
8086
- const { asset: assetData, playbackId, policy } = await getPlaybackIdForAsset(assetId, credentials);
8089
+ const { asset: assetData, playbackId, policy } = await getPlaybackIdForAsset(assetId, credentials, options.assetSnapshot);
8087
8090
  const assetDurationSeconds = getAssetDurationSecondsFromAsset(assetData);
8088
8091
  const signingContext = await resolveMuxSigningContext(credentials);
8089
8092
  if (policy === "signed" && !signingContext) {