@vertesia/workflow 0.79.0 → 0.79.1

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.
Files changed (134) hide show
  1. package/lib/cjs/activities/advanced/createDocumentTypeFromInteractionRun.js +3 -4
  2. package/lib/cjs/activities/advanced/createDocumentTypeFromInteractionRun.js.map +1 -1
  3. package/lib/cjs/activities/advanced/createOrUpdateDocumentFromInteractionRun.js +10 -4
  4. package/lib/cjs/activities/advanced/createOrUpdateDocumentFromInteractionRun.js.map +1 -1
  5. package/lib/cjs/activities/advanced/updateDocumentFromInteractionRun.js +3 -4
  6. package/lib/cjs/activities/advanced/updateDocumentFromInteractionRun.js.map +1 -1
  7. package/lib/cjs/activities/chunkDocument.js +1 -2
  8. package/lib/cjs/activities/chunkDocument.js.map +1 -1
  9. package/lib/cjs/activities/executeInteraction.js +5 -4
  10. package/lib/cjs/activities/executeInteraction.js.map +1 -1
  11. package/lib/cjs/activities/generateDocumentProperties.js +2 -3
  12. package/lib/cjs/activities/generateDocumentProperties.js.map +1 -1
  13. package/lib/cjs/activities/generateOrAssignContentType.js +2 -3
  14. package/lib/cjs/activities/generateOrAssignContentType.js.map +1 -1
  15. package/lib/cjs/activities/index-dsl.js +3 -1
  16. package/lib/cjs/activities/index-dsl.js.map +1 -1
  17. package/lib/cjs/activities/media/prepareVideo.js +429 -0
  18. package/lib/cjs/activities/media/prepareVideo.js.map +1 -0
  19. package/lib/cjs/activities/media/transcribeMediaWithGladia.js +48 -15
  20. package/lib/cjs/activities/media/transcribeMediaWithGladia.js.map +1 -1
  21. package/lib/cjs/activities/notifyWebhook.js +2 -1
  22. package/lib/cjs/activities/notifyWebhook.js.map +1 -1
  23. package/lib/cjs/dsl/dsl-workflow.js +6 -1
  24. package/lib/cjs/dsl/dsl-workflow.js.map +1 -1
  25. package/lib/cjs/dsl/setup/ActivityContext.js +7 -4
  26. package/lib/cjs/dsl/setup/ActivityContext.js.map +1 -1
  27. package/lib/cjs/errors.js +14 -1
  28. package/lib/cjs/errors.js.map +1 -1
  29. package/lib/cjs/index.js +1 -0
  30. package/lib/cjs/index.js.map +1 -1
  31. package/lib/cjs/iterative-generation/activities/extractToc.js +2 -2
  32. package/lib/cjs/iterative-generation/activities/extractToc.js.map +1 -1
  33. package/lib/cjs/iterative-generation/activities/finalizeOutput.js +7 -4
  34. package/lib/cjs/iterative-generation/activities/finalizeOutput.js.map +1 -1
  35. package/lib/cjs/iterative-generation/activities/generatePart.js +18 -14
  36. package/lib/cjs/iterative-generation/activities/generatePart.js.map +1 -1
  37. package/lib/cjs/iterative-generation/activities/generateToc.js +46 -56
  38. package/lib/cjs/iterative-generation/activities/generateToc.js.map +1 -1
  39. package/lib/cjs/iterative-generation/utils.js.map +1 -1
  40. package/lib/cjs/utils/blobs.js +4 -1
  41. package/lib/cjs/utils/blobs.js.map +1 -1
  42. package/lib/cjs/utils/client.js +3 -1
  43. package/lib/cjs/utils/client.js.map +1 -1
  44. package/lib/esm/activities/advanced/createDocumentTypeFromInteractionRun.js +3 -4
  45. package/lib/esm/activities/advanced/createDocumentTypeFromInteractionRun.js.map +1 -1
  46. package/lib/esm/activities/advanced/createOrUpdateDocumentFromInteractionRun.js +10 -4
  47. package/lib/esm/activities/advanced/createOrUpdateDocumentFromInteractionRun.js.map +1 -1
  48. package/lib/esm/activities/advanced/updateDocumentFromInteractionRun.js +3 -4
  49. package/lib/esm/activities/advanced/updateDocumentFromInteractionRun.js.map +1 -1
  50. package/lib/esm/activities/chunkDocument.js +1 -2
  51. package/lib/esm/activities/chunkDocument.js.map +1 -1
  52. package/lib/esm/activities/executeInteraction.js +5 -4
  53. package/lib/esm/activities/executeInteraction.js.map +1 -1
  54. package/lib/esm/activities/generateDocumentProperties.js +2 -3
  55. package/lib/esm/activities/generateDocumentProperties.js.map +1 -1
  56. package/lib/esm/activities/generateOrAssignContentType.js +2 -3
  57. package/lib/esm/activities/generateOrAssignContentType.js.map +1 -1
  58. package/lib/esm/activities/index-dsl.js +1 -0
  59. package/lib/esm/activities/index-dsl.js.map +1 -1
  60. package/lib/esm/activities/media/prepareVideo.js +390 -0
  61. package/lib/esm/activities/media/prepareVideo.js.map +1 -0
  62. package/lib/esm/activities/media/transcribeMediaWithGladia.js +50 -17
  63. package/lib/esm/activities/media/transcribeMediaWithGladia.js.map +1 -1
  64. package/lib/esm/activities/notifyWebhook.js +2 -1
  65. package/lib/esm/activities/notifyWebhook.js.map +1 -1
  66. package/lib/esm/dsl/dsl-workflow.js +6 -1
  67. package/lib/esm/dsl/dsl-workflow.js.map +1 -1
  68. package/lib/esm/dsl/setup/ActivityContext.js +10 -7
  69. package/lib/esm/dsl/setup/ActivityContext.js.map +1 -1
  70. package/lib/esm/errors.js +12 -0
  71. package/lib/esm/errors.js.map +1 -1
  72. package/lib/esm/index.js +1 -0
  73. package/lib/esm/index.js.map +1 -1
  74. package/lib/esm/iterative-generation/activities/extractToc.js +3 -3
  75. package/lib/esm/iterative-generation/activities/extractToc.js.map +1 -1
  76. package/lib/esm/iterative-generation/activities/finalizeOutput.js +9 -6
  77. package/lib/esm/iterative-generation/activities/finalizeOutput.js.map +1 -1
  78. package/lib/esm/iterative-generation/activities/generatePart.js +19 -15
  79. package/lib/esm/iterative-generation/activities/generatePart.js.map +1 -1
  80. package/lib/esm/iterative-generation/activities/generateToc.js +46 -56
  81. package/lib/esm/iterative-generation/activities/generateToc.js.map +1 -1
  82. package/lib/esm/iterative-generation/utils.js.map +1 -1
  83. package/lib/esm/utils/blobs.js +4 -1
  84. package/lib/esm/utils/blobs.js.map +1 -1
  85. package/lib/esm/utils/client.js +4 -2
  86. package/lib/esm/utils/client.js.map +1 -1
  87. package/lib/tsconfig.tsbuildinfo +1 -1
  88. package/lib/types/activities/advanced/createDocumentTypeFromInteractionRun.d.ts.map +1 -1
  89. package/lib/types/activities/advanced/createOrUpdateDocumentFromInteractionRun.d.ts.map +1 -1
  90. package/lib/types/activities/advanced/updateDocumentFromInteractionRun.d.ts.map +1 -1
  91. package/lib/types/activities/chunkDocument.d.ts.map +1 -1
  92. package/lib/types/activities/executeInteraction.d.ts +1 -1
  93. package/lib/types/activities/executeInteraction.d.ts.map +1 -1
  94. package/lib/types/activities/generateDocumentProperties.d.ts.map +1 -1
  95. package/lib/types/activities/generateOrAssignContentType.d.ts.map +1 -1
  96. package/lib/types/activities/index-dsl.d.ts +1 -0
  97. package/lib/types/activities/index-dsl.d.ts.map +1 -1
  98. package/lib/types/activities/media/prepareVideo.d.ts +30 -0
  99. package/lib/types/activities/media/prepareVideo.d.ts.map +1 -0
  100. package/lib/types/activities/media/transcribeMediaWithGladia.d.ts.map +1 -1
  101. package/lib/types/dsl/dsl-workflow.d.ts.map +1 -1
  102. package/lib/types/dsl/setup/ActivityContext.d.ts.map +1 -1
  103. package/lib/types/errors.d.ts +6 -0
  104. package/lib/types/errors.d.ts.map +1 -1
  105. package/lib/types/index.d.ts +1 -0
  106. package/lib/types/index.d.ts.map +1 -1
  107. package/lib/types/iterative-generation/activities/extractToc.d.ts.map +1 -1
  108. package/lib/types/iterative-generation/activities/finalizeOutput.d.ts.map +1 -1
  109. package/lib/types/iterative-generation/activities/generatePart.d.ts.map +1 -1
  110. package/lib/types/iterative-generation/activities/generateToc.d.ts.map +1 -1
  111. package/lib/types/iterative-generation/utils.d.ts +3 -4
  112. package/lib/types/iterative-generation/utils.d.ts.map +1 -1
  113. package/lib/types/utils/blobs.d.ts.map +1 -1
  114. package/lib/types/utils/client.d.ts +2 -6
  115. package/lib/types/utils/client.d.ts.map +1 -1
  116. package/lib/workflows-bundle.js +9494 -6518
  117. package/package.json +127 -127
  118. package/src/activities/advanced/createDocumentTypeFromInteractionRun.ts +4 -6
  119. package/src/activities/advanced/createOrUpdateDocumentFromInteractionRun.ts +10 -4
  120. package/src/activities/advanced/updateDocumentFromInteractionRun.ts +3 -5
  121. package/src/activities/chunkDocument.ts +1 -2
  122. package/src/activities/executeInteraction.ts +13 -11
  123. package/src/activities/generateDocumentProperties.ts +2 -3
  124. package/src/activities/generateOrAssignContentType.ts +2 -3
  125. package/src/activities/index-dsl.ts +1 -0
  126. package/src/activities/media/prepareVideo.ts +622 -0
  127. package/src/activities/media/transcribeMediaWithGladia.ts +52 -21
  128. package/src/activities/notifyWebhook.ts +2 -1
  129. package/src/dsl/dsl-workflow.ts +7 -1
  130. package/src/errors.ts +15 -0
  131. package/src/index.ts +1 -0
  132. package/src/iterative-generation/activities/generatePart.ts +1 -2
  133. package/src/iterative-generation/activities/generateToc.ts +1 -2
  134. package/src/iterative-generation/utils.ts +4 -5
@@ -1,6 +1,6 @@
1
- import { DSLActivityExecutionPayload, DSLActivitySpec, GladiaConfiguration, SupportedIntegrations } from "@vertesia/common";
1
+ import { DSLActivityExecutionPayload, DSLActivitySpec, GladiaConfiguration, SupportedIntegrations, AUDIO_RENDITION_NAME, VideoMetadata, ContentNature } from "@vertesia/common";
2
2
  import { activityInfo, CompleteAsyncError, log } from "@temporalio/activity";
3
- import { FetchClient } from "@vertesia/api-fetch-client";
3
+ import { FetchClient, RequestError } from "@vertesia/api-fetch-client";
4
4
  import { setupActivity } from "../../dsl/setup/ActivityContext.js";
5
5
  import { DocumentNotFoundError } from "../../errors.js";
6
6
  import { TextExtractionResult, TextExtractionStatus } from "../../index.js";
@@ -27,7 +27,12 @@ export async function transcribeMedia(payload: DSLActivityExecutionPayload<Trans
27
27
 
28
28
  const gladiaConfig = await client.projects.integrations.retrieve(payload.project_id, SupportedIntegrations.gladia) as GladiaConfiguration | undefined;
29
29
  if (!gladiaConfig || !gladiaConfig.enabled) {
30
- throw new DocumentNotFoundError("Gladia integration not enabled");
30
+ return {
31
+ hasText: false,
32
+ objectId,
33
+ status: TextExtractionStatus.error,
34
+ error: "Gladia integration not enabled",
35
+ }
31
36
  }
32
37
 
33
38
  const object = await client.objects.retrieve(objectId, "+text");
@@ -42,37 +47,63 @@ export async function transcribeMedia(payload: DSLActivityExecutionPayload<Trans
42
47
  throw new DocumentNotFoundError(`No source found for object ${objectId}`);
43
48
  }
44
49
 
45
- const mediaUrl = await client.store.objects.getContentSource(objectId).then(res => res.source);
50
+ // Check for audio rendition in video metadata (preferred for videos)
51
+ let mediaSource: string = object.content.source;
52
+ if (object.metadata?.type === ContentNature.Video) {
53
+ const videoMetadata = object.metadata as VideoMetadata;
54
+ const audioRendition = videoMetadata.renditions?.find(r => r.name === AUDIO_RENDITION_NAME);
55
+ if (audioRendition?.content?.source) {
56
+ mediaSource = audioRendition.content.source;
57
+ log.info(`Found audio rendition for video object ${objectId}`, { mediaSource });
58
+ }
59
+ }
60
+
61
+ // Get download URL for the media source
62
+ const { url: mediaUrl } = await client.files.getDownloadUrl(mediaSource);
46
63
 
47
64
  if (!mediaUrl) {
48
- throw new DocumentNotFoundError(`Error fetching source ${object.content.source}`);
65
+ throw new DocumentNotFoundError(`Error fetching media URL for ${mediaSource}`);
49
66
  }
50
67
 
68
+ log.info(`Using media URL for transcription`, { objectId, mediaUrl: mediaSource });
69
+
51
70
  const taskToken = Buffer.from(activityInfo().taskToken).toString('base64url');
52
71
  const callbackUrl = generateCallbackUrlForGladia(client.store.baseUrl, payload.auth_token, taskToken, objectId);
53
72
 
54
73
  log.info(`Transcribing media ${mediaUrl} with Gladia`, { objectId, callbackUrl });
55
74
 
56
- const res = await gladiaClient.post("/transcription", {
57
- payload: {
58
- audio_url: mediaUrl,
59
- callback_url: callbackUrl,
60
- diarization_enhanced: true,
61
- enable_code_switching: true,
62
- subtitles: true,
63
- subtitles_config: {
64
- formats: ["vtt"],
75
+ try {
76
+ const res = await gladiaClient.post("/transcription", {
77
+ payload: {
78
+ audio_url: mediaUrl,
79
+ callback_url: callbackUrl,
80
+ diarization_enhanced: true,
81
+ enable_code_switching: true,
82
+ subtitles: true,
83
+ subtitles_config: {
84
+ formats: ["vtt"],
85
+ }
86
+ }
87
+ }) as GladiaTranscriptRequestResponse;
88
+
89
+ log.info(`Transcription request sent to Gladia`, { objectId, res });
90
+ throw new CompleteAsyncError();
91
+
92
+ } catch (error: any) {
93
+ if (error instanceof RequestError && error.status === 422) {
94
+ return {
95
+ hasText: false,
96
+ objectId,
97
+ status: TextExtractionStatus.error,
98
+ error: `Gladia transcription error: ${error.message}`,
65
99
  }
100
+ } else {
101
+ log.error(`Error sending transcription request to Gladia for object ${objectId}`, { error });
102
+ throw error;
66
103
  }
67
- }) as GladiaTranscriptRequestResponse;
68
-
69
- log.info(`Transcription request sent to Gladia`, { objectId, res });
70
-
71
- throw new CompleteAsyncError();
72
-
104
+ }
73
105
  }
74
106
 
75
-
76
107
  function generateCallbackUrlForGladia(baseUrl: string, authToken: string, taskToken: string, objectId: string) {
77
108
  return `${baseUrl}/api/v1/webhooks/gladia/${objectId}?access_token=${authToken}&task_token=${taskToken}`;
78
109
  }
@@ -180,7 +180,8 @@ async function createOldRequestBody(payload: WorkflowExecutionBaseParams, params
180
180
  let data = params.detail;
181
181
  if (data && data.run_id && params.event_name === "workflow_completed" && params.workflow_type === 'ExecuteInteractionWorkflow') {
182
182
  const client = getVersionedVertesiaClient(payload, null); //ensure client is using no specific version
183
- const run = await client.runs.retrieve(data.run_id);
183
+ // Important Note: we cannot use client.runs.retrieve since it will transform the run result to the new format because of InteractionOutput
184
+ const run = await client.runs.get(data.run_id);
184
185
  // since we use an unversioned client the run will be in old format so we don't need to tranform the result
185
186
  const result = run.result;
186
187
  data = {
@@ -225,7 +225,13 @@ async function executeChildWorkflow(step: DSLChildWorkflowStep, payload: DSLWork
225
225
  }
226
226
 
227
227
  function buildRateLimitParams(activity: DSLActivitySpec, executionPayload: DSLActivityExecutionPayload<any>): RateLimitParams {
228
- const params = executionPayload.params;
228
+ // resolve payload params
229
+ const vars = new Vars({
230
+ ...executionPayload.params, // imported params (doesn't contain expressions)
231
+ ...executionPayload.activity.params, // activity params (may contain expressions)
232
+ });
233
+ const params = vars.resolve();
234
+
229
235
  let interactionId: string;
230
236
 
231
237
  switch (activity.name) {
package/src/errors.ts CHANGED
@@ -64,9 +64,24 @@ export class ResourceExhaustedError extends ApplicationFailure {
64
64
  }
65
65
  }
66
66
 
67
+ export class InvalidContentTypeError extends ApplicationFailure {
68
+ constructor(
69
+ public objectId: string,
70
+ public expectedType: string,
71
+ public actualType: string,
72
+ ) {
73
+ super(
74
+ `Document ${objectId} has invalid content type. Expected ${expectedType}, got ${actualType}`,
75
+ "InvalidContentTypeError",
76
+ true, // non-retryable
77
+ );
78
+ }
79
+ }
80
+
67
81
  export const WF_NON_RETRYABLE_ERRORS = [
68
82
  "DocumentNotFoundError",
69
83
  "ActivityParamInvalidError",
70
84
  "ActivityParamNotFoundError",
71
85
  "WorkflowParamNotFoundError",
86
+ "InvalidContentTypeError",
72
87
  ];
package/src/index.ts CHANGED
@@ -25,6 +25,7 @@ export * from "./activities/notifyWebhook.js";
25
25
  export * from "./activities/rateLimiter.js";
26
26
  export * from "./activities/setDocumentStatus.js";
27
27
  export * from "./iterative-generation/activities/index.js";
28
+ export * from "./activities/media/prepareVideo.js";
28
29
 
29
30
  export * from "./dsl/setup/ActivityContext.js";
30
31
  export * from "./errors.js";
@@ -5,7 +5,6 @@ import { getVertesiaClient } from "../../utils/client.js";
5
5
  import { buildAndPublishMemoryPack, loadMemoryPack } from "../../utils/memory.js";
6
6
  import { IterativeGenerationPayload, OutputMemoryMeta, Section, TocPart, TocSection } from "../types.js";
7
7
  import { executeWithVars, expectMemoryIsConsistent } from "../utils.js";
8
- import { completionResultToString } from "@llumiverse/common";
9
8
 
10
9
  export async function it_gen_generatePart(payload: WorkflowExecutionPayload, path: number[]) {
11
10
  const vars = payload.vars as IterativeGenerationPayload;
@@ -57,7 +56,7 @@ export async function it_gen_generatePart(payload: WorkflowExecutionPayload, pat
57
56
  }
58
57
  });
59
58
 
60
- const result = r.result.map(completionResultToString).join('\n');
59
+ const result = r.result.text();
61
60
  content[content.length - 1].content += result;
62
61
  meta.lastProcessedPart = path;
63
62
  await buildAndPublishMemoryPack(client, `${memory}/output`, async ({ copyText }) => {
@@ -3,7 +3,6 @@ import { getVertesiaClient } from "../../utils/client.js";
3
3
  import { buildAndPublishMemoryPack } from "../../utils/memory.js";
4
4
  import { IterativeGenerationPayload, OutputMemoryMeta, Toc, TocIndex } from "../types.js";
5
5
  import { executeWithVars, tocIndex } from "../utils.js";
6
- import { parseCompletionResultsToJson } from "@llumiverse/common";
7
6
 
8
7
  const defaultTocSchema = {
9
8
  "type": "object",
@@ -86,7 +85,7 @@ export async function it_gen_generateToc(payload: WorkflowExecutionPayload): Pro
86
85
  const run = await executeWithVars(client, vars.interaction, vars, undefined, schema);
87
86
 
88
87
  //Parse the CompletionResult[] to get a Toc object
89
- const jsonResults = parseCompletionResultsToJson(run.result);
88
+ const jsonResults = run.result.object();
90
89
 
91
90
  const toc: Toc = {
92
91
  sections: jsonResults.sections
@@ -1,8 +1,7 @@
1
- import { VertesiaClient } from "@vertesia/client";
2
- import { ExecutionRun } from "@vertesia/common";
1
+ import { ModelOptions, TextFallbackOptions } from "@llumiverse/common";
3
2
  import { ApplicationFailure } from "@temporalio/workflow";
3
+ import { VertesiaClient } from "@vertesia/client";
4
4
  import { OutputMemoryMeta, PartIndex, Toc, TocIndex, TocSection } from "./types.js";
5
- import { ModelOptions, TextFallbackOptions } from "@llumiverse/common";
6
5
 
7
6
  //TODO: For whole file, support for options beyond max_tokens and temperature and multiple modalities.
8
7
  export interface ExecuteOptions {
@@ -15,7 +14,7 @@ export interface ExecuteOptions {
15
14
  result_schema?: Record<string, any>;
16
15
  }
17
16
 
18
- export async function execute(client: VertesiaClient, options: ExecuteOptions): Promise<ExecutionRun> {
17
+ export async function execute(client: VertesiaClient, options: ExecuteOptions) {
19
18
  return client.interactions.executeByName(options.interaction, {
20
19
  data: {
21
20
  ...options.memory_mapping,
@@ -30,7 +29,7 @@ export async function execute(client: VertesiaClient, options: ExecuteOptions):
30
29
  });
31
30
  }
32
31
 
33
- export function executeWithVars(client: VertesiaClient, interaction: string, vars: Record<string, any>, mapping?: Record<string, any>, result_schema?: Record<string, any>): Promise<ExecutionRun> {
32
+ export function executeWithVars(client: VertesiaClient, interaction: string, vars: Record<string, any>, mapping?: Record<string, any>, result_schema?: Record<string, any>) {
34
33
  if (mapping) {
35
34
  mapping = { ...vars.input_mapping, ...mapping };
36
35
  } else {