@vertesia/workflow 1.0.0-dev.20260128.144200 → 1.0.0-dev.20260225.024852Z
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/lib/cjs/activities/advanced/createOrUpdateDocumentFromInteractionRun.js +1 -1
- package/lib/cjs/activities/advanced/createOrUpdateDocumentFromInteractionRun.js.map +1 -1
- package/lib/cjs/activities/chunkDocument.js +3 -1
- package/lib/cjs/activities/chunkDocument.js.map +1 -1
- package/lib/cjs/activities/extractDocumentText.js +56 -16
- package/lib/cjs/activities/extractDocumentText.js.map +1 -1
- package/lib/cjs/activities/generateDocumentProperties.js +4 -2
- package/lib/cjs/activities/generateDocumentProperties.js.map +1 -1
- package/lib/cjs/activities/generateEmbeddings.js +20 -10
- package/lib/cjs/activities/generateEmbeddings.js.map +1 -1
- package/lib/cjs/activities/generateOrAssignContentType.js +2 -2
- package/lib/cjs/activities/generateOrAssignContentType.js.map +1 -1
- package/lib/cjs/activities/index-dsl.js +7 -7
- package/lib/cjs/activities/index-dsl.js.map +1 -1
- package/lib/cjs/activities/media/saveGladiaTranscription.js +38 -24
- package/lib/cjs/activities/media/saveGladiaTranscription.js.map +1 -1
- package/lib/cjs/activities/media/transcribeMediaWithGladia.js +41 -24
- package/lib/cjs/activities/media/transcribeMediaWithGladia.js.map +1 -1
- package/lib/cjs/activities/notifyWebhook.js +11 -2
- package/lib/cjs/activities/notifyWebhook.js.map +1 -1
- package/lib/cjs/activities/renditions/generateImageRendition.js +2 -2
- package/lib/cjs/activities/renditions/generateImageRendition.js.map +1 -1
- package/lib/cjs/activities/setDocumentStatus.js +13 -2
- package/lib/cjs/activities/setDocumentStatus.js.map +1 -1
- package/lib/cjs/conversion/image.js +10 -10
- package/lib/cjs/conversion/image.js.map +1 -1
- package/lib/cjs/dsl/dsl-workflow.js +44 -7
- package/lib/cjs/dsl/dsl-workflow.js.map +1 -1
- package/lib/cjs/dsl/setup/ActivityContext.js +56 -0
- package/lib/cjs/dsl/setup/ActivityContext.js.map +1 -1
- package/lib/cjs/errors.js +11 -1
- package/lib/cjs/errors.js.map +1 -1
- package/lib/cjs/index.js +6 -5
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/result-types.js.map +1 -1
- package/lib/cjs/utils/renditions.js +9 -5
- package/lib/cjs/utils/renditions.js.map +1 -1
- package/lib/cjs/utils/text-preview-utils.js +43 -0
- package/lib/cjs/utils/text-preview-utils.js.map +1 -0
- package/lib/esm/activities/advanced/createOrUpdateDocumentFromInteractionRun.js +1 -1
- package/lib/esm/activities/advanced/createOrUpdateDocumentFromInteractionRun.js.map +1 -1
- package/lib/esm/activities/chunkDocument.js +3 -1
- package/lib/esm/activities/chunkDocument.js.map +1 -1
- package/lib/esm/activities/extractDocumentText.js +56 -16
- package/lib/esm/activities/extractDocumentText.js.map +1 -1
- package/lib/esm/activities/generateDocumentProperties.js +4 -2
- package/lib/esm/activities/generateDocumentProperties.js.map +1 -1
- package/lib/esm/activities/generateEmbeddings.js +20 -10
- package/lib/esm/activities/generateEmbeddings.js.map +1 -1
- package/lib/esm/activities/generateOrAssignContentType.js +2 -2
- package/lib/esm/activities/generateOrAssignContentType.js.map +1 -1
- package/lib/esm/activities/index-dsl.js +3 -3
- package/lib/esm/activities/index-dsl.js.map +1 -1
- package/lib/esm/activities/media/saveGladiaTranscription.js +38 -24
- package/lib/esm/activities/media/saveGladiaTranscription.js.map +1 -1
- package/lib/esm/activities/media/transcribeMediaWithGladia.js +41 -24
- package/lib/esm/activities/media/transcribeMediaWithGladia.js.map +1 -1
- package/lib/esm/activities/notifyWebhook.js +11 -2
- package/lib/esm/activities/notifyWebhook.js.map +1 -1
- package/lib/esm/activities/renditions/generateImageRendition.js +2 -2
- package/lib/esm/activities/renditions/generateImageRendition.js.map +1 -1
- package/lib/esm/activities/setDocumentStatus.js +13 -2
- package/lib/esm/activities/setDocumentStatus.js.map +1 -1
- package/lib/esm/conversion/image.js +10 -10
- package/lib/esm/conversion/image.js.map +1 -1
- package/lib/esm/dsl/dsl-workflow.js +44 -7
- package/lib/esm/dsl/dsl-workflow.js.map +1 -1
- package/lib/esm/dsl/setup/ActivityContext.js +57 -1
- package/lib/esm/dsl/setup/ActivityContext.js.map +1 -1
- package/lib/esm/errors.js +9 -0
- package/lib/esm/errors.js.map +1 -1
- package/lib/esm/index.js +6 -5
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/result-types.js.map +1 -1
- package/lib/esm/utils/renditions.js +9 -5
- package/lib/esm/utils/renditions.js.map +1 -1
- package/lib/esm/utils/text-preview-utils.js +38 -0
- package/lib/esm/utils/text-preview-utils.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/types/activities/chunkDocument.d.ts.map +1 -1
- package/lib/types/activities/extractDocumentText.d.ts +1 -0
- package/lib/types/activities/extractDocumentText.d.ts.map +1 -1
- package/lib/types/activities/generateDocumentProperties.d.ts.map +1 -1
- package/lib/types/activities/generateEmbeddings.d.ts.map +1 -1
- package/lib/types/activities/index-dsl.d.ts +3 -3
- package/lib/types/activities/index-dsl.d.ts.map +1 -1
- package/lib/types/activities/media/saveGladiaTranscription.d.ts +1 -0
- package/lib/types/activities/media/saveGladiaTranscription.d.ts.map +1 -1
- package/lib/types/activities/media/transcribeMediaWithGladia.d.ts +1 -0
- package/lib/types/activities/media/transcribeMediaWithGladia.d.ts.map +1 -1
- package/lib/types/activities/setDocumentStatus.d.ts +1 -1
- package/lib/types/activities/setDocumentStatus.d.ts.map +1 -1
- package/lib/types/dsl/dsl-workflow.d.ts.map +1 -1
- package/lib/types/dsl/setup/ActivityContext.d.ts +32 -2
- package/lib/types/dsl/setup/ActivityContext.d.ts.map +1 -1
- package/lib/types/errors.d.ts +4 -0
- package/lib/types/errors.d.ts.map +1 -1
- package/lib/types/index.d.ts +6 -5
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/result-types.d.ts +5 -1
- package/lib/types/result-types.d.ts.map +1 -1
- package/lib/types/utils/renditions.d.ts +2 -0
- package/lib/types/utils/renditions.d.ts.map +1 -1
- package/lib/types/utils/text-preview-utils.d.ts +15 -0
- package/lib/types/utils/text-preview-utils.d.ts.map +1 -0
- package/lib/workflows-bundle.js +11747 -11141
- package/package.json +6 -7
- package/src/activities/advanced/createOrUpdateDocumentFromInteractionRun.ts +1 -1
- package/src/activities/chunkDocument.ts +3 -1
- package/src/activities/extractDocumentText.ts +85 -26
- package/src/activities/generateDocumentProperties.ts +4 -2
- package/src/activities/generateEmbeddings.ts +22 -14
- package/src/activities/generateOrAssignContentType.ts +2 -2
- package/src/activities/index-dsl.ts +4 -3
- package/src/activities/media/saveGladiaTranscription.test.ts +406 -0
- package/src/activities/media/saveGladiaTranscription.ts +41 -26
- package/src/activities/media/transcribeMediaWithGladia.test.ts +583 -0
- package/src/activities/media/transcribeMediaWithGladia.ts +46 -25
- package/src/activities/notifyWebhook.test.ts +121 -8
- package/src/activities/notifyWebhook.ts +10 -2
- package/src/activities/renditions/generateImageRendition.ts +2 -2
- package/src/activities/setDocumentStatus.ts +12 -4
- package/src/conversion/image.test.ts +1 -0
- package/src/conversion/image.ts +10 -10
- package/src/dsl/dsl-workflow.ts +57 -9
- package/src/dsl/setup/ActivityContext.ts +73 -0
- package/src/dsl.ts +1 -0
- package/src/errors.ts +15 -0
- package/src/index.ts +6 -5
- package/src/result-types.ts +5 -1
- package/src/utils/renditions.ts +11 -5
- package/src/utils/text-preview-utils.ts +62 -0
|
@@ -0,0 +1,583 @@
|
|
|
1
|
+
import { CompleteAsyncError } from "@temporalio/activity";
|
|
2
|
+
import { MockActivityEnvironment } from "@temporalio/testing";
|
|
3
|
+
import type { VertesiaClient } from "@vertesia/client";
|
|
4
|
+
import { AUDIO_RENDITION_NAME, ContentEventName, ContentNature, DSLActivityExecutionPayload } from "@vertesia/common";
|
|
5
|
+
import type { ActivityContext } from "@vertesia/workflow";
|
|
6
|
+
import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
|
|
7
|
+
import { TextExtractionStatus } from "../../result-types.js";
|
|
8
|
+
import { transcribeMedia, TranscriptMediaParams, TranscriptMediaResult } from "./transcribeMediaWithGladia.js";
|
|
9
|
+
|
|
10
|
+
// Mock setupActivity from the relative path used by the activity
|
|
11
|
+
vi.mock("../../dsl/setup/ActivityContext.js", async (importOriginal) => {
|
|
12
|
+
const actual = await importOriginal<typeof import("../../dsl/setup/ActivityContext.js")>();
|
|
13
|
+
return {
|
|
14
|
+
...actual,
|
|
15
|
+
setupActivity: vi.fn(),
|
|
16
|
+
};
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
// Mock FetchClient as a constructor
|
|
20
|
+
vi.mock("@vertesia/api-fetch-client", async (importOriginal) => {
|
|
21
|
+
const actual = await importOriginal<typeof import("@vertesia/api-fetch-client")>();
|
|
22
|
+
return {
|
|
23
|
+
...actual,
|
|
24
|
+
FetchClient: vi.fn(),
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
let testEnv: MockActivityEnvironment;
|
|
30
|
+
|
|
31
|
+
beforeAll(async () => {
|
|
32
|
+
testEnv = new MockActivityEnvironment();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
beforeEach(() => {
|
|
36
|
+
vi.clearAllMocks();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// Helper function to create test payload
|
|
40
|
+
const createTestPayload = (
|
|
41
|
+
params: TranscriptMediaParams,
|
|
42
|
+
objectId?: string,
|
|
43
|
+
fileInput?: { url: string; mimetype: string }
|
|
44
|
+
): DSLActivityExecutionPayload<TranscriptMediaParams> => {
|
|
45
|
+
return {
|
|
46
|
+
auth_token: process.env.VERTESIA_KEY || "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwOi8vbW9jay10b2tlbi1zZXJ2ZXIiLCJzdWIiOiJ0ZXN0In0.signature",
|
|
47
|
+
account_id: "test-account",
|
|
48
|
+
project_id: "test-project",
|
|
49
|
+
params,
|
|
50
|
+
config: {
|
|
51
|
+
studio_url: "http://mock-studio",
|
|
52
|
+
store_url: "http://mock-store",
|
|
53
|
+
},
|
|
54
|
+
workflow_name: "test-workflow",
|
|
55
|
+
event: ContentEventName.create,
|
|
56
|
+
objectIds: objectId ? [objectId] : [],
|
|
57
|
+
input: fileInput
|
|
58
|
+
? { inputType: 'files' as const, files: [fileInput] }
|
|
59
|
+
: objectId
|
|
60
|
+
? { inputType: 'objectIds' as const, objectIds: [objectId] }
|
|
61
|
+
: undefined,
|
|
62
|
+
vars: {},
|
|
63
|
+
activity: { name: "TranscribeMedia", params }
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
describe("TranscribeMedia", () => {
|
|
68
|
+
it("should send transcription request in object mode", async () => {
|
|
69
|
+
const { setupActivity } = await import("../../dsl/setup/ActivityContext.js");
|
|
70
|
+
const { FetchClient } = await import("@vertesia/api-fetch-client");
|
|
71
|
+
|
|
72
|
+
const mockFetchClient = {
|
|
73
|
+
withHeaders: vi.fn().mockReturnThis(),
|
|
74
|
+
post: vi.fn().mockResolvedValue({
|
|
75
|
+
id: "test-transcription-id",
|
|
76
|
+
result_url: "https://api.gladia.io/v2/transcription/test-transcription-id",
|
|
77
|
+
}),
|
|
78
|
+
};
|
|
79
|
+
vi.mocked(FetchClient).mockImplementation(function(this: any) {
|
|
80
|
+
return mockFetchClient as any;
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
const mockClient = {
|
|
84
|
+
projects: {
|
|
85
|
+
integrations: {
|
|
86
|
+
retrieve: vi.fn().mockResolvedValue({
|
|
87
|
+
enabled: true,
|
|
88
|
+
api_key: "test-api-key",
|
|
89
|
+
url: "https://api.gladia.io/v2",
|
|
90
|
+
}),
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
objects: {
|
|
94
|
+
retrieve: vi.fn().mockResolvedValue({
|
|
95
|
+
content: {
|
|
96
|
+
source: "gs://test-bucket/audio.mp3",
|
|
97
|
+
type: "audio/mpeg",
|
|
98
|
+
},
|
|
99
|
+
text: null,
|
|
100
|
+
}),
|
|
101
|
+
},
|
|
102
|
+
files: {
|
|
103
|
+
getDownloadUrl: vi.fn().mockResolvedValue({
|
|
104
|
+
url: "https://download.example.com/audio.mp3",
|
|
105
|
+
}),
|
|
106
|
+
},
|
|
107
|
+
store: {
|
|
108
|
+
baseUrl: "http://mock-store",
|
|
109
|
+
},
|
|
110
|
+
} as unknown as VertesiaClient;
|
|
111
|
+
|
|
112
|
+
const params: TranscriptMediaParams = {};
|
|
113
|
+
|
|
114
|
+
vi.mocked(setupActivity).mockResolvedValue({
|
|
115
|
+
client: mockClient,
|
|
116
|
+
objectId: "test-object-id",
|
|
117
|
+
inputType: 'objectIds',
|
|
118
|
+
params,
|
|
119
|
+
} as unknown as ActivityContext<TranscriptMediaParams>);
|
|
120
|
+
|
|
121
|
+
const payload = createTestPayload(params, "test-object-id");
|
|
122
|
+
|
|
123
|
+
await expect(testEnv.run(transcribeMedia, payload)).rejects.toThrow(CompleteAsyncError);
|
|
124
|
+
|
|
125
|
+
expect(mockFetchClient.post).toHaveBeenCalledWith("/transcription", {
|
|
126
|
+
payload: {
|
|
127
|
+
audio_url: "https://download.example.com/audio.mp3",
|
|
128
|
+
callback_url: expect.stringContaining("http://mock-store/webhooks/gladia?task_token="),
|
|
129
|
+
diarization_enhanced: true,
|
|
130
|
+
enable_code_switching: true,
|
|
131
|
+
subtitles: true,
|
|
132
|
+
subtitles_config: {
|
|
133
|
+
formats: ["vtt"],
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it("should use audio rendition for video objects", async () => {
|
|
140
|
+
const { setupActivity } = await import("../../dsl/setup/ActivityContext.js");
|
|
141
|
+
const { FetchClient } = await import("@vertesia/api-fetch-client");
|
|
142
|
+
|
|
143
|
+
const mockFetchClient = {
|
|
144
|
+
withHeaders: vi.fn().mockReturnThis(),
|
|
145
|
+
post: vi.fn().mockResolvedValue({
|
|
146
|
+
id: "test-transcription-id",
|
|
147
|
+
result_url: "https://api.gladia.io/v2/transcription/test-transcription-id",
|
|
148
|
+
}),
|
|
149
|
+
};
|
|
150
|
+
vi.mocked(FetchClient).mockImplementation(function(this: any) {
|
|
151
|
+
return mockFetchClient as any;
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
const mockClient = {
|
|
155
|
+
projects: {
|
|
156
|
+
integrations: {
|
|
157
|
+
retrieve: vi.fn().mockResolvedValue({
|
|
158
|
+
enabled: true,
|
|
159
|
+
api_key: "test-api-key",
|
|
160
|
+
url: "https://api.gladia.io/v2",
|
|
161
|
+
}),
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
objects: {
|
|
165
|
+
retrieve: vi.fn().mockResolvedValue({
|
|
166
|
+
content: {
|
|
167
|
+
source: "gs://test-bucket/video.mp4",
|
|
168
|
+
type: "video/mp4",
|
|
169
|
+
},
|
|
170
|
+
metadata: {
|
|
171
|
+
type: ContentNature.Video,
|
|
172
|
+
renditions: [
|
|
173
|
+
{
|
|
174
|
+
name: AUDIO_RENDITION_NAME,
|
|
175
|
+
content: {
|
|
176
|
+
source: "gs://test-bucket/audio-rendition.mp3",
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
],
|
|
180
|
+
},
|
|
181
|
+
text: null,
|
|
182
|
+
}),
|
|
183
|
+
},
|
|
184
|
+
files: {
|
|
185
|
+
getDownloadUrl: vi.fn().mockResolvedValue({
|
|
186
|
+
url: "https://download.example.com/audio-rendition.mp3",
|
|
187
|
+
}),
|
|
188
|
+
},
|
|
189
|
+
store: {
|
|
190
|
+
baseUrl: "http://mock-store",
|
|
191
|
+
},
|
|
192
|
+
} as unknown as VertesiaClient;
|
|
193
|
+
|
|
194
|
+
const params: TranscriptMediaParams = {};
|
|
195
|
+
|
|
196
|
+
vi.mocked(setupActivity).mockResolvedValue({
|
|
197
|
+
client: mockClient,
|
|
198
|
+
objectId: "test-video-id",
|
|
199
|
+
inputType: 'objectIds',
|
|
200
|
+
params,
|
|
201
|
+
} as unknown as ActivityContext<TranscriptMediaParams>);
|
|
202
|
+
|
|
203
|
+
const payload = createTestPayload(params, "test-video-id");
|
|
204
|
+
|
|
205
|
+
await expect(testEnv.run(transcribeMedia, payload)).rejects.toThrow(CompleteAsyncError);
|
|
206
|
+
|
|
207
|
+
// Should use audio rendition source
|
|
208
|
+
expect(mockClient.files.getDownloadUrl).toHaveBeenCalledWith("gs://test-bucket/audio-rendition.mp3");
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it("should skip transcription when text already exists", async () => {
|
|
212
|
+
const { setupActivity } = await import("../../dsl/setup/ActivityContext.js");
|
|
213
|
+
|
|
214
|
+
const mockClient = {
|
|
215
|
+
projects: {
|
|
216
|
+
integrations: {
|
|
217
|
+
retrieve: vi.fn().mockResolvedValue({
|
|
218
|
+
enabled: true,
|
|
219
|
+
api_key: "test-api-key",
|
|
220
|
+
}),
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
objects: {
|
|
224
|
+
retrieve: vi.fn().mockResolvedValue({
|
|
225
|
+
content: {
|
|
226
|
+
source: "gs://test-bucket/audio.mp3",
|
|
227
|
+
},
|
|
228
|
+
text: "Existing transcription text",
|
|
229
|
+
}),
|
|
230
|
+
},
|
|
231
|
+
} as unknown as VertesiaClient;
|
|
232
|
+
|
|
233
|
+
const params: TranscriptMediaParams = {};
|
|
234
|
+
|
|
235
|
+
vi.mocked(setupActivity).mockResolvedValue({
|
|
236
|
+
client: mockClient,
|
|
237
|
+
objectId: "test-object-id",
|
|
238
|
+
inputType: 'objectIds',
|
|
239
|
+
params,
|
|
240
|
+
} as unknown as ActivityContext<TranscriptMediaParams>);
|
|
241
|
+
|
|
242
|
+
const payload = createTestPayload(params, "test-object-id");
|
|
243
|
+
const result: TranscriptMediaResult = await testEnv.run(transcribeMedia, payload);
|
|
244
|
+
|
|
245
|
+
expect(result).toMatchObject({
|
|
246
|
+
hasText: true,
|
|
247
|
+
objectId: "test-object-id",
|
|
248
|
+
status: TextExtractionStatus.skipped,
|
|
249
|
+
message: "text already present and force not enabled",
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
it("should force transcription when force=true", async () => {
|
|
254
|
+
const { setupActivity } = await import("../../dsl/setup/ActivityContext.js");
|
|
255
|
+
const { FetchClient } = await import("@vertesia/api-fetch-client");
|
|
256
|
+
|
|
257
|
+
const mockFetchClient = {
|
|
258
|
+
withHeaders: vi.fn().mockReturnThis(),
|
|
259
|
+
post: vi.fn().mockResolvedValue({
|
|
260
|
+
id: "test-transcription-id",
|
|
261
|
+
result_url: "https://api.gladia.io/v2/transcription/test-transcription-id",
|
|
262
|
+
}),
|
|
263
|
+
};
|
|
264
|
+
vi.mocked(FetchClient).mockImplementation(function(this: any) {
|
|
265
|
+
return mockFetchClient as any;
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
const mockClient = {
|
|
269
|
+
projects: {
|
|
270
|
+
integrations: {
|
|
271
|
+
retrieve: vi.fn().mockResolvedValue({
|
|
272
|
+
enabled: true,
|
|
273
|
+
api_key: "test-api-key",
|
|
274
|
+
url: "https://api.gladia.io/v2",
|
|
275
|
+
}),
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
objects: {
|
|
279
|
+
retrieve: vi.fn().mockResolvedValue({
|
|
280
|
+
content: {
|
|
281
|
+
source: "gs://test-bucket/audio.mp3",
|
|
282
|
+
},
|
|
283
|
+
text: "Existing transcription text",
|
|
284
|
+
}),
|
|
285
|
+
},
|
|
286
|
+
files: {
|
|
287
|
+
getDownloadUrl: vi.fn().mockResolvedValue({
|
|
288
|
+
url: "https://download.example.com/audio.mp3",
|
|
289
|
+
}),
|
|
290
|
+
},
|
|
291
|
+
store: {
|
|
292
|
+
baseUrl: "http://mock-store",
|
|
293
|
+
},
|
|
294
|
+
} as unknown as VertesiaClient;
|
|
295
|
+
|
|
296
|
+
const params: TranscriptMediaParams = {
|
|
297
|
+
force: true,
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
vi.mocked(setupActivity).mockResolvedValue({
|
|
301
|
+
client: mockClient,
|
|
302
|
+
objectId: "test-object-id",
|
|
303
|
+
inputType: 'objectIds',
|
|
304
|
+
params,
|
|
305
|
+
} as unknown as ActivityContext<TranscriptMediaParams>);
|
|
306
|
+
|
|
307
|
+
const payload = createTestPayload(params, "test-object-id");
|
|
308
|
+
|
|
309
|
+
await expect(testEnv.run(transcribeMedia, payload)).rejects.toThrow(CompleteAsyncError);
|
|
310
|
+
|
|
311
|
+
expect(mockFetchClient.post).toHaveBeenCalled();
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
it("should send transcription request in file mode", async () => {
|
|
315
|
+
const { setupActivity } = await import("../../dsl/setup/ActivityContext.js");
|
|
316
|
+
const { FetchClient } = await import("@vertesia/api-fetch-client");
|
|
317
|
+
|
|
318
|
+
const mockFetchClient = {
|
|
319
|
+
withHeaders: vi.fn().mockReturnThis(),
|
|
320
|
+
post: vi.fn().mockResolvedValue({
|
|
321
|
+
id: "test-transcription-id",
|
|
322
|
+
result_url: "https://api.gladia.io/v2/transcription/test-transcription-id",
|
|
323
|
+
}),
|
|
324
|
+
};
|
|
325
|
+
vi.mocked(FetchClient).mockImplementation(function(this: any) {
|
|
326
|
+
return mockFetchClient as any;
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
const mockClient = {
|
|
330
|
+
projects: {
|
|
331
|
+
integrations: {
|
|
332
|
+
retrieve: vi.fn().mockResolvedValue({
|
|
333
|
+
enabled: true,
|
|
334
|
+
api_key: "test-api-key",
|
|
335
|
+
url: "https://api.gladia.io/v2",
|
|
336
|
+
}),
|
|
337
|
+
},
|
|
338
|
+
},
|
|
339
|
+
files: {
|
|
340
|
+
getDownloadUrl: vi.fn().mockResolvedValue({
|
|
341
|
+
url: "https://download.example.com/audio.mp3",
|
|
342
|
+
}),
|
|
343
|
+
},
|
|
344
|
+
store: {
|
|
345
|
+
baseUrl: "http://mock-store",
|
|
346
|
+
},
|
|
347
|
+
} as unknown as VertesiaClient;
|
|
348
|
+
|
|
349
|
+
const params: TranscriptMediaParams = {
|
|
350
|
+
output_storage_path: "test-storage-path",
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
vi.mocked(setupActivity).mockResolvedValue({
|
|
354
|
+
client: mockClient,
|
|
355
|
+
file: { url: "gs://test-bucket/audio.mp3", mimetype: "audio/mpeg" },
|
|
356
|
+
inputType: 'files',
|
|
357
|
+
params,
|
|
358
|
+
} as unknown as ActivityContext<TranscriptMediaParams>);
|
|
359
|
+
|
|
360
|
+
const payload = createTestPayload(
|
|
361
|
+
params,
|
|
362
|
+
undefined,
|
|
363
|
+
{ url: "gs://test-bucket/audio.mp3", mimetype: "audio/mpeg" }
|
|
364
|
+
);
|
|
365
|
+
|
|
366
|
+
await expect(testEnv.run(transcribeMedia, payload)).rejects.toThrow(CompleteAsyncError);
|
|
367
|
+
|
|
368
|
+
expect(mockClient.files.getDownloadUrl).toHaveBeenCalledWith("gs://test-bucket/audio.mp3");
|
|
369
|
+
expect(mockFetchClient.post).toHaveBeenCalled();
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
it("should throw error when output_storage_path is missing in file mode", async () => {
|
|
373
|
+
const { setupActivity } = await import("../../dsl/setup/ActivityContext.js");
|
|
374
|
+
|
|
375
|
+
const mockClient = {
|
|
376
|
+
projects: {
|
|
377
|
+
integrations: {
|
|
378
|
+
retrieve: vi.fn().mockResolvedValue({
|
|
379
|
+
enabled: true,
|
|
380
|
+
api_key: "test-api-key",
|
|
381
|
+
}),
|
|
382
|
+
},
|
|
383
|
+
},
|
|
384
|
+
} as unknown as VertesiaClient;
|
|
385
|
+
|
|
386
|
+
const params: TranscriptMediaParams = {};
|
|
387
|
+
|
|
388
|
+
vi.mocked(setupActivity).mockResolvedValue({
|
|
389
|
+
client: mockClient,
|
|
390
|
+
file: { url: "gs://test-bucket/audio.mp3", mimetype: "audio/mpeg" },
|
|
391
|
+
inputType: 'files',
|
|
392
|
+
params,
|
|
393
|
+
} as unknown as ActivityContext<TranscriptMediaParams>);
|
|
394
|
+
|
|
395
|
+
const payload = createTestPayload(
|
|
396
|
+
params,
|
|
397
|
+
undefined,
|
|
398
|
+
{ url: "gs://test-bucket/audio.mp3", mimetype: "audio/mpeg" }
|
|
399
|
+
);
|
|
400
|
+
|
|
401
|
+
await expect(testEnv.run(transcribeMedia, payload)).rejects.toThrow(
|
|
402
|
+
"output_storage_path is required when using file input"
|
|
403
|
+
);
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
it("should handle Gladia integration not enabled", async () => {
|
|
407
|
+
const { setupActivity } = await import("../../dsl/setup/ActivityContext.js");
|
|
408
|
+
|
|
409
|
+
const mockClient = {
|
|
410
|
+
projects: {
|
|
411
|
+
integrations: {
|
|
412
|
+
retrieve: vi.fn().mockResolvedValue({
|
|
413
|
+
enabled: false,
|
|
414
|
+
}),
|
|
415
|
+
},
|
|
416
|
+
},
|
|
417
|
+
} as unknown as VertesiaClient;
|
|
418
|
+
|
|
419
|
+
const params: TranscriptMediaParams = {};
|
|
420
|
+
|
|
421
|
+
vi.mocked(setupActivity).mockResolvedValue({
|
|
422
|
+
client: mockClient,
|
|
423
|
+
objectId: "test-object-id",
|
|
424
|
+
inputType: 'objectIds',
|
|
425
|
+
params,
|
|
426
|
+
} as unknown as ActivityContext<TranscriptMediaParams>);
|
|
427
|
+
|
|
428
|
+
const payload = createTestPayload(params, "test-object-id");
|
|
429
|
+
const result: TranscriptMediaResult = await testEnv.run(transcribeMedia, payload);
|
|
430
|
+
|
|
431
|
+
expect(result).toMatchObject({
|
|
432
|
+
hasText: false,
|
|
433
|
+
objectId: "test-object-id",
|
|
434
|
+
status: TextExtractionStatus.error,
|
|
435
|
+
error: "Gladia integration not enabled",
|
|
436
|
+
});
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
it("should handle missing source in object mode", async () => {
|
|
440
|
+
const { setupActivity } = await import("../../dsl/setup/ActivityContext.js");
|
|
441
|
+
|
|
442
|
+
const mockClient = {
|
|
443
|
+
projects: {
|
|
444
|
+
integrations: {
|
|
445
|
+
retrieve: vi.fn().mockResolvedValue({
|
|
446
|
+
enabled: true,
|
|
447
|
+
api_key: "test-api-key",
|
|
448
|
+
}),
|
|
449
|
+
},
|
|
450
|
+
},
|
|
451
|
+
objects: {
|
|
452
|
+
retrieve: vi.fn().mockResolvedValue({
|
|
453
|
+
content: null,
|
|
454
|
+
}),
|
|
455
|
+
},
|
|
456
|
+
} as unknown as VertesiaClient;
|
|
457
|
+
|
|
458
|
+
const params: TranscriptMediaParams = {};
|
|
459
|
+
|
|
460
|
+
vi.mocked(setupActivity).mockResolvedValue({
|
|
461
|
+
client: mockClient,
|
|
462
|
+
objectId: "test-object-id",
|
|
463
|
+
inputType: 'objectIds',
|
|
464
|
+
params,
|
|
465
|
+
} as unknown as ActivityContext<TranscriptMediaParams>);
|
|
466
|
+
|
|
467
|
+
const payload = createTestPayload(params, "test-object-id");
|
|
468
|
+
|
|
469
|
+
await expect(testEnv.run(transcribeMedia, payload)).rejects.toThrow(
|
|
470
|
+
"No source found for object test-object-id"
|
|
471
|
+
);
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
it("should handle Gladia 422 error", async () => {
|
|
475
|
+
const { setupActivity } = await import("../../dsl/setup/ActivityContext.js");
|
|
476
|
+
const { FetchClient, RequestError } = await import("@vertesia/api-fetch-client");
|
|
477
|
+
|
|
478
|
+
// Create a mock Request object
|
|
479
|
+
const mockRequest = new Request("https://api.gladia.io/v2/transcription", {
|
|
480
|
+
method: "POST",
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
const mockFetchClient = {
|
|
484
|
+
withHeaders: vi.fn().mockReturnThis(),
|
|
485
|
+
post: vi.fn().mockRejectedValue(
|
|
486
|
+
new RequestError("Invalid audio format", mockRequest, 422, { error: "Invalid audio format" })
|
|
487
|
+
),
|
|
488
|
+
};
|
|
489
|
+
vi.mocked(FetchClient).mockImplementation(function(this: any) {
|
|
490
|
+
return mockFetchClient as any;
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
const mockClient = {
|
|
494
|
+
projects: {
|
|
495
|
+
integrations: {
|
|
496
|
+
retrieve: vi.fn().mockResolvedValue({
|
|
497
|
+
enabled: true,
|
|
498
|
+
api_key: "test-api-key",
|
|
499
|
+
url: "https://api.gladia.io/v2",
|
|
500
|
+
}),
|
|
501
|
+
},
|
|
502
|
+
},
|
|
503
|
+
objects: {
|
|
504
|
+
retrieve: vi.fn().mockResolvedValue({
|
|
505
|
+
content: {
|
|
506
|
+
source: "gs://test-bucket/audio.mp3",
|
|
507
|
+
},
|
|
508
|
+
text: null,
|
|
509
|
+
}),
|
|
510
|
+
},
|
|
511
|
+
files: {
|
|
512
|
+
getDownloadUrl: vi.fn().mockResolvedValue({
|
|
513
|
+
url: "https://download.example.com/audio.mp3",
|
|
514
|
+
}),
|
|
515
|
+
},
|
|
516
|
+
store: {
|
|
517
|
+
baseUrl: "http://mock-store",
|
|
518
|
+
},
|
|
519
|
+
} as unknown as VertesiaClient;
|
|
520
|
+
|
|
521
|
+
const params: TranscriptMediaParams = {};
|
|
522
|
+
|
|
523
|
+
vi.mocked(setupActivity).mockResolvedValue({
|
|
524
|
+
client: mockClient,
|
|
525
|
+
objectId: "test-object-id",
|
|
526
|
+
inputType: 'objectIds',
|
|
527
|
+
params,
|
|
528
|
+
} as unknown as ActivityContext<TranscriptMediaParams>);
|
|
529
|
+
|
|
530
|
+
const payload = createTestPayload(params, "test-object-id");
|
|
531
|
+
const result: TranscriptMediaResult = await testEnv.run(transcribeMedia, payload);
|
|
532
|
+
|
|
533
|
+
expect(result).toMatchObject({
|
|
534
|
+
hasText: false,
|
|
535
|
+
objectId: "test-object-id",
|
|
536
|
+
status: TextExtractionStatus.error,
|
|
537
|
+
error: expect.stringContaining("Gladia transcription error"),
|
|
538
|
+
});
|
|
539
|
+
});
|
|
540
|
+
|
|
541
|
+
it("should handle missing download URL", async () => {
|
|
542
|
+
const { setupActivity } = await import("../../dsl/setup/ActivityContext.js");
|
|
543
|
+
|
|
544
|
+
const mockClient = {
|
|
545
|
+
projects: {
|
|
546
|
+
integrations: {
|
|
547
|
+
retrieve: vi.fn().mockResolvedValue({
|
|
548
|
+
enabled: true,
|
|
549
|
+
api_key: "test-api-key",
|
|
550
|
+
}),
|
|
551
|
+
},
|
|
552
|
+
},
|
|
553
|
+
objects: {
|
|
554
|
+
retrieve: vi.fn().mockResolvedValue({
|
|
555
|
+
content: {
|
|
556
|
+
source: "gs://test-bucket/audio.mp3",
|
|
557
|
+
},
|
|
558
|
+
text: null,
|
|
559
|
+
}),
|
|
560
|
+
},
|
|
561
|
+
files: {
|
|
562
|
+
getDownloadUrl: vi.fn().mockResolvedValue({
|
|
563
|
+
url: null,
|
|
564
|
+
}),
|
|
565
|
+
},
|
|
566
|
+
} as unknown as VertesiaClient;
|
|
567
|
+
|
|
568
|
+
const params: TranscriptMediaParams = {};
|
|
569
|
+
|
|
570
|
+
vi.mocked(setupActivity).mockResolvedValue({
|
|
571
|
+
client: mockClient,
|
|
572
|
+
objectId: "test-object-id",
|
|
573
|
+
inputType: 'objectIds',
|
|
574
|
+
params,
|
|
575
|
+
} as unknown as ActivityContext<TranscriptMediaParams>);
|
|
576
|
+
|
|
577
|
+
const payload = createTestPayload(params, "test-object-id");
|
|
578
|
+
|
|
579
|
+
await expect(testEnv.run(transcribeMedia, payload)).rejects.toThrow(
|
|
580
|
+
"Error fetching media URL"
|
|
581
|
+
);
|
|
582
|
+
});
|
|
583
|
+
});
|