@vertesia/workflow 0.78.0-dev-28b447d → 0.79.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.
- package/lib/cjs/activities/advanced/createDocumentTypeFromInteractionRun.js +34 -0
- package/lib/cjs/activities/advanced/createDocumentTypeFromInteractionRun.js.map +1 -0
- package/lib/cjs/activities/advanced/createOrUpdateDocumentFromInteractionRun.js +67 -0
- package/lib/cjs/activities/advanced/createOrUpdateDocumentFromInteractionRun.js.map +1 -0
- package/lib/cjs/activities/advanced/updateDocumentFromInteractionRun.js +20 -0
- package/lib/cjs/activities/advanced/updateDocumentFromInteractionRun.js.map +1 -0
- package/lib/cjs/activities/chunkDocument.js +86 -0
- package/lib/cjs/activities/chunkDocument.js.map +1 -0
- package/lib/cjs/activities/createDocumentFromOther.js +64 -0
- package/lib/cjs/activities/createDocumentFromOther.js.map +1 -0
- package/lib/cjs/activities/executeInteraction.js +189 -0
- package/lib/cjs/activities/executeInteraction.js.map +1 -0
- package/lib/cjs/activities/extractDocumentText.js +156 -0
- package/lib/cjs/activities/extractDocumentText.js.map +1 -0
- package/lib/cjs/activities/generateDocumentProperties.js +84 -0
- package/lib/cjs/activities/generateDocumentProperties.js.map +1 -0
- package/lib/cjs/activities/generateEmbeddings.js +358 -0
- package/lib/cjs/activities/generateEmbeddings.js.map +1 -0
- package/lib/cjs/activities/generateOrAssignContentType.js +126 -0
- package/lib/cjs/activities/generateOrAssignContentType.js.map +1 -0
- package/lib/cjs/activities/getObjectFromStore.js +20 -0
- package/lib/cjs/activities/getObjectFromStore.js.map +1 -0
- package/lib/cjs/activities/handleError.js +22 -0
- package/lib/cjs/activities/handleError.js.map +1 -0
- package/lib/cjs/activities/index-dsl.js +43 -0
- package/lib/cjs/activities/index-dsl.js.map +1 -0
- package/lib/cjs/activities/index.js +21 -0
- package/lib/cjs/activities/index.js.map +1 -0
- package/lib/cjs/activities/media/processPdfWithTextract.js +103 -0
- package/lib/cjs/activities/media/processPdfWithTextract.js.map +1 -0
- package/lib/cjs/activities/media/transcribeMediaWithGladia.js +51 -0
- package/lib/cjs/activities/media/transcribeMediaWithGladia.js.map +1 -0
- package/lib/cjs/activities/notifyWebhook.js +157 -0
- package/lib/cjs/activities/notifyWebhook.js.map +1 -0
- package/lib/cjs/activities/rateLimiter.js +30 -0
- package/lib/cjs/activities/rateLimiter.js.map +1 -0
- package/lib/cjs/activities/renditions/generateImageRendition.js +66 -0
- package/lib/cjs/activities/renditions/generateImageRendition.js.map +1 -0
- package/lib/cjs/activities/renditions/generateVideoRendition.js +200 -0
- package/lib/cjs/activities/renditions/generateVideoRendition.js.map +1 -0
- package/lib/cjs/activities/setDocumentStatus.js +15 -0
- package/lib/cjs/activities/setDocumentStatus.js.map +1 -0
- package/lib/cjs/conversion/TextractProcessor.js +417 -0
- package/lib/cjs/conversion/TextractProcessor.js.map +1 -0
- package/lib/cjs/conversion/image.js +149 -0
- package/lib/cjs/conversion/image.js.map +1 -0
- package/lib/cjs/conversion/markitdown.js +42 -0
- package/lib/cjs/conversion/markitdown.js.map +1 -0
- package/lib/cjs/conversion/mutool.js +147 -0
- package/lib/cjs/conversion/mutool.js.map +1 -0
- package/lib/cjs/conversion/pandoc.js +39 -0
- package/lib/cjs/conversion/pandoc.js.map +1 -0
- package/lib/cjs/dsl/conditions.js +81 -0
- package/lib/cjs/dsl/conditions.js.map +1 -0
- package/lib/cjs/dsl/dsl-workflow.js +338 -0
- package/lib/cjs/dsl/dsl-workflow.js.map +1 -0
- package/lib/cjs/dsl/dslProxyActivities.js +23 -0
- package/lib/cjs/dsl/dslProxyActivities.js.map +1 -0
- package/lib/cjs/dsl/projections.js +59 -0
- package/lib/cjs/dsl/projections.js.map +1 -0
- package/lib/cjs/dsl/setup/ActivityContext.js +120 -0
- package/lib/cjs/dsl/setup/ActivityContext.js.map +1 -0
- package/lib/cjs/dsl/setup/fetch/DataProvider.js +51 -0
- package/lib/cjs/dsl/setup/fetch/DataProvider.js.map +1 -0
- package/lib/cjs/dsl/setup/fetch/index.js +16 -0
- package/lib/cjs/dsl/setup/fetch/index.js.map +1 -0
- package/lib/cjs/dsl/setup/fetch/providers.js +67 -0
- package/lib/cjs/dsl/setup/fetch/providers.js.map +1 -0
- package/lib/cjs/dsl/test/test-child-workflow.js +10 -0
- package/lib/cjs/dsl/test/test-child-workflow.js.map +1 -0
- package/lib/cjs/dsl/validation.js +122 -0
- package/lib/cjs/dsl/validation.js.map +1 -0
- package/lib/cjs/dsl/vars.js +341 -0
- package/lib/cjs/dsl/vars.js.map +1 -0
- package/lib/cjs/dsl/walk.js +100 -0
- package/lib/cjs/dsl/walk.js.map +1 -0
- package/lib/cjs/dsl.js +20 -0
- package/lib/cjs/dsl.js.map +1 -0
- package/lib/cjs/errors.js +57 -0
- package/lib/cjs/errors.js.map +1 -0
- package/lib/cjs/index.js +54 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/iterative-generation/activities/extractToc.js +47 -0
- package/lib/cjs/iterative-generation/activities/extractToc.js.map +1 -0
- package/lib/cjs/iterative-generation/activities/finalizeOutput.js +69 -0
- package/lib/cjs/iterative-generation/activities/finalizeOutput.js.map +1 -0
- package/lib/cjs/iterative-generation/activities/generatePart.js +74 -0
- package/lib/cjs/iterative-generation/activities/generatePart.js.map +1 -0
- package/lib/cjs/iterative-generation/activities/generateToc.js +96 -0
- package/lib/cjs/iterative-generation/activities/generateToc.js.map +1 -0
- package/lib/cjs/iterative-generation/activities/index.js +12 -0
- package/lib/cjs/iterative-generation/activities/index.js.map +1 -0
- package/lib/cjs/iterative-generation/iterativeGenerationWorkflow.js +56 -0
- package/lib/cjs/iterative-generation/iterativeGenerationWorkflow.js.map +1 -0
- package/lib/cjs/iterative-generation/types.js +5 -0
- package/lib/cjs/iterative-generation/types.js.map +1 -0
- package/lib/cjs/iterative-generation/utils.js +121 -0
- package/lib/cjs/iterative-generation/utils.js.map +1 -0
- package/lib/cjs/package.json +3 -0
- package/lib/cjs/result-types.js +10 -0
- package/lib/cjs/result-types.js.map +1 -0
- package/lib/cjs/system/notifyWebhookWorkflow.js +53 -0
- package/lib/cjs/system/notifyWebhookWorkflow.js.map +1 -0
- package/lib/cjs/system/recalculateEmbeddingsWorkflow.js +33 -0
- package/lib/cjs/system/recalculateEmbeddingsWorkflow.js.map +1 -0
- package/lib/cjs/utils/auth.js +15 -0
- package/lib/cjs/utils/auth.js.map +1 -0
- package/lib/cjs/utils/blobs.js +61 -0
- package/lib/cjs/utils/blobs.js.map +1 -0
- package/lib/cjs/utils/chunks.js +14 -0
- package/lib/cjs/utils/chunks.js.map +1 -0
- package/lib/cjs/utils/client.js +29 -0
- package/lib/cjs/utils/client.js.map +1 -0
- package/lib/cjs/utils/expand-vars.js +33 -0
- package/lib/cjs/utils/expand-vars.js.map +1 -0
- package/lib/cjs/utils/memory.js +65 -0
- package/lib/cjs/utils/memory.js.map +1 -0
- package/lib/cjs/utils/renditions.js +88 -0
- package/lib/cjs/utils/renditions.js.map +1 -0
- package/lib/cjs/utils/storage.js +55 -0
- package/lib/cjs/utils/storage.js.map +1 -0
- package/lib/cjs/utils/tokens.js +38 -0
- package/lib/cjs/utils/tokens.js.map +1 -0
- package/lib/cjs/vars.js +20 -0
- package/lib/cjs/vars.js.map +1 -0
- package/lib/cjs/workflows.js +15 -0
- package/lib/cjs/workflows.js.map +1 -0
- package/lib/esm/activities/advanced/createDocumentTypeFromInteractionRun.js +31 -0
- package/lib/esm/activities/advanced/createDocumentTypeFromInteractionRun.js.map +1 -0
- package/lib/esm/activities/advanced/createOrUpdateDocumentFromInteractionRun.js +64 -0
- package/lib/esm/activities/advanced/createOrUpdateDocumentFromInteractionRun.js.map +1 -0
- package/lib/esm/activities/advanced/updateDocumentFromInteractionRun.js +17 -0
- package/lib/esm/activities/advanced/updateDocumentFromInteractionRun.js.map +1 -0
- package/lib/esm/activities/chunkDocument.js +83 -0
- package/lib/esm/activities/chunkDocument.js.map +1 -0
- package/lib/esm/activities/createDocumentFromOther.js +58 -0
- package/lib/esm/activities/createDocumentFromOther.js.map +1 -0
- package/lib/esm/activities/executeInteraction.js +185 -0
- package/lib/esm/activities/executeInteraction.js.map +1 -0
- package/lib/esm/activities/extractDocumentText.js +153 -0
- package/lib/esm/activities/extractDocumentText.js.map +1 -0
- package/lib/esm/activities/generateDocumentProperties.js +81 -0
- package/lib/esm/activities/generateDocumentProperties.js.map +1 -0
- package/lib/esm/activities/generateEmbeddings.js +355 -0
- package/lib/esm/activities/generateEmbeddings.js.map +1 -0
- package/lib/esm/activities/generateOrAssignContentType.js +123 -0
- package/lib/esm/activities/generateOrAssignContentType.js.map +1 -0
- package/lib/esm/activities/getObjectFromStore.js +17 -0
- package/lib/esm/activities/getObjectFromStore.js.map +1 -0
- package/lib/esm/activities/handleError.js +19 -0
- package/lib/esm/activities/handleError.js.map +1 -0
- package/lib/esm/activities/index-dsl.js +21 -0
- package/lib/esm/activities/index-dsl.js.map +1 -0
- package/lib/esm/activities/index.js +5 -0
- package/lib/esm/activities/index.js.map +1 -0
- package/lib/esm/activities/media/processPdfWithTextract.js +99 -0
- package/lib/esm/activities/media/processPdfWithTextract.js.map +1 -0
- package/lib/esm/activities/media/transcribeMediaWithGladia.js +48 -0
- package/lib/esm/activities/media/transcribeMediaWithGladia.js.map +1 -0
- package/lib/esm/activities/notifyWebhook.js +154 -0
- package/lib/esm/activities/notifyWebhook.js.map +1 -0
- package/lib/esm/activities/rateLimiter.js +27 -0
- package/lib/esm/activities/rateLimiter.js.map +1 -0
- package/lib/esm/activities/renditions/generateImageRendition.js +63 -0
- package/lib/esm/activities/renditions/generateImageRendition.js.map +1 -0
- package/lib/esm/activities/renditions/generateVideoRendition.js +194 -0
- package/lib/esm/activities/renditions/generateVideoRendition.js.map +1 -0
- package/lib/esm/activities/setDocumentStatus.js +12 -0
- package/lib/esm/activities/setDocumentStatus.js.map +1 -0
- package/lib/esm/conversion/TextractProcessor.js +410 -0
- package/lib/esm/conversion/TextractProcessor.js.map +1 -0
- package/lib/esm/conversion/image.js +143 -0
- package/lib/esm/conversion/image.js.map +1 -0
- package/lib/esm/conversion/markitdown.js +36 -0
- package/lib/esm/conversion/markitdown.js.map +1 -0
- package/lib/esm/conversion/mutool.js +139 -0
- package/lib/esm/conversion/mutool.js.map +1 -0
- package/lib/esm/conversion/pandoc.js +36 -0
- package/lib/esm/conversion/pandoc.js.map +1 -0
- package/lib/esm/dsl/conditions.js +75 -0
- package/lib/esm/dsl/conditions.js.map +1 -0
- package/lib/esm/dsl/dsl-workflow.js +331 -0
- package/lib/esm/dsl/dsl-workflow.js.map +1 -0
- package/lib/esm/dsl/dslProxyActivities.js +20 -0
- package/lib/esm/dsl/dslProxyActivities.js.map +1 -0
- package/lib/esm/dsl/projections.js +55 -0
- package/lib/esm/dsl/projections.js.map +1 -0
- package/lib/esm/dsl/setup/ActivityContext.js +115 -0
- package/lib/esm/dsl/setup/ActivityContext.js.map +1 -0
- package/lib/esm/dsl/setup/fetch/DataProvider.js +47 -0
- package/lib/esm/dsl/setup/fetch/DataProvider.js.map +1 -0
- package/lib/esm/dsl/setup/fetch/index.js +12 -0
- package/lib/esm/dsl/setup/fetch/index.js.map +1 -0
- package/lib/esm/dsl/setup/fetch/providers.js +61 -0
- package/lib/esm/dsl/setup/fetch/providers.js.map +1 -0
- package/lib/esm/dsl/test/test-child-workflow.js +5 -0
- package/lib/esm/dsl/test/test-child-workflow.js.map +1 -0
- package/lib/esm/dsl/validation.js +118 -0
- package/lib/esm/dsl/validation.js.map +1 -0
- package/lib/esm/dsl/vars.js +335 -0
- package/lib/esm/dsl/vars.js.map +1 -0
- package/lib/esm/dsl/walk.js +96 -0
- package/lib/esm/dsl/walk.js.map +1 -0
- package/lib/esm/dsl.js +4 -0
- package/lib/esm/dsl.js.map +1 -0
- package/lib/esm/errors.js +49 -0
- package/lib/esm/errors.js.map +1 -0
- package/lib/esm/index.js +36 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/iterative-generation/activities/extractToc.js +44 -0
- package/lib/esm/iterative-generation/activities/extractToc.js.map +1 -0
- package/lib/esm/iterative-generation/activities/finalizeOutput.js +66 -0
- package/lib/esm/iterative-generation/activities/finalizeOutput.js.map +1 -0
- package/lib/esm/iterative-generation/activities/generatePart.js +71 -0
- package/lib/esm/iterative-generation/activities/generatePart.js.map +1 -0
- package/lib/esm/iterative-generation/activities/generateToc.js +93 -0
- package/lib/esm/iterative-generation/activities/generateToc.js.map +1 -0
- package/lib/esm/iterative-generation/activities/index.js +5 -0
- package/lib/esm/iterative-generation/activities/index.js.map +1 -0
- package/lib/esm/iterative-generation/iterativeGenerationWorkflow.js +53 -0
- package/lib/esm/iterative-generation/iterativeGenerationWorkflow.js.map +1 -0
- package/lib/esm/iterative-generation/types.js +2 -0
- package/lib/esm/iterative-generation/types.js.map +1 -0
- package/lib/esm/iterative-generation/utils.js +112 -0
- package/lib/esm/iterative-generation/utils.js.map +1 -0
- package/lib/esm/result-types.js +7 -0
- package/lib/esm/result-types.js.map +1 -0
- package/lib/esm/system/notifyWebhookWorkflow.js +50 -0
- package/lib/esm/system/notifyWebhookWorkflow.js.map +1 -0
- package/lib/esm/system/recalculateEmbeddingsWorkflow.js +30 -0
- package/lib/esm/system/recalculateEmbeddingsWorkflow.js.map +1 -0
- package/lib/esm/utils/auth.js +8 -0
- package/lib/esm/utils/auth.js.map +1 -0
- package/lib/esm/utils/blobs.js +51 -0
- package/lib/esm/utils/blobs.js.map +1 -0
- package/lib/esm/utils/chunks.js +9 -0
- package/lib/esm/utils/chunks.js.map +1 -0
- package/lib/esm/utils/client.js +25 -0
- package/lib/esm/utils/client.js.map +1 -0
- package/lib/esm/utils/expand-vars.js +30 -0
- package/lib/esm/utils/expand-vars.js.map +1 -0
- package/lib/esm/utils/memory.js +55 -0
- package/lib/esm/utils/memory.js.map +1 -0
- package/lib/esm/utils/renditions.js +80 -0
- package/lib/esm/utils/renditions.js.map +1 -0
- package/lib/esm/utils/storage.js +46 -0
- package/lib/esm/utils/storage.js.map +1 -0
- package/lib/esm/utils/tokens.js +34 -0
- package/lib/esm/utils/tokens.js.map +1 -0
- package/lib/esm/vars.js +4 -0
- package/lib/esm/vars.js.map +1 -0
- package/lib/esm/workflows.js +8 -0
- package/lib/esm/workflows.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/lib/types/activities/advanced/createDocumentTypeFromInteractionRun.d.ts +17 -0
- package/lib/types/activities/advanced/createDocumentTypeFromInteractionRun.d.ts.map +1 -0
- package/lib/types/activities/advanced/createOrUpdateDocumentFromInteractionRun.d.ts +39 -0
- package/lib/types/activities/advanced/createOrUpdateDocumentFromInteractionRun.d.ts.map +1 -0
- package/lib/types/activities/advanced/updateDocumentFromInteractionRun.d.ts +19 -0
- package/lib/types/activities/advanced/updateDocumentFromInteractionRun.d.ts.map +1 -0
- package/lib/types/activities/chunkDocument.d.ts +33 -0
- package/lib/types/activities/chunkDocument.d.ts.map +1 -0
- package/lib/types/activities/createDocumentFromOther.d.ts +21 -0
- package/lib/types/activities/createDocumentFromOther.d.ts.map +1 -0
- package/lib/types/activities/executeInteraction.d.ts +61 -0
- package/lib/types/activities/executeInteraction.d.ts.map +1 -0
- package/lib/types/activities/extractDocumentText.d.ts +10 -0
- package/lib/types/activities/extractDocumentText.d.ts.map +1 -0
- package/lib/types/activities/generateDocumentProperties.d.ts +32 -0
- package/lib/types/activities/generateDocumentProperties.d.ts.map +1 -0
- package/lib/types/activities/generateEmbeddings.d.ts +53 -0
- package/lib/types/activities/generateEmbeddings.d.ts.map +1 -0
- package/lib/types/activities/generateOrAssignContentType.d.ts +44 -0
- package/lib/types/activities/generateOrAssignContentType.d.ts.map +1 -0
- package/lib/types/activities/getObjectFromStore.d.ts +14 -0
- package/lib/types/activities/getObjectFromStore.d.ts.map +1 -0
- package/lib/types/activities/handleError.d.ts +6 -0
- package/lib/types/activities/handleError.d.ts.map +1 -0
- package/lib/types/activities/index-dsl.d.ts +20 -0
- package/lib/types/activities/index-dsl.d.ts.map +1 -0
- package/lib/types/activities/index.d.ts +5 -0
- package/lib/types/activities/index.d.ts.map +1 -0
- package/lib/types/activities/media/processPdfWithTextract.d.ts +26 -0
- package/lib/types/activities/media/processPdfWithTextract.d.ts.map +1 -0
- package/lib/types/activities/media/transcribeMediaWithGladia.d.ts +14 -0
- package/lib/types/activities/media/transcribeMediaWithGladia.d.ts.map +1 -0
- package/lib/types/activities/notifyWebhook.d.ts +27 -0
- package/lib/types/activities/notifyWebhook.d.ts.map +1 -0
- package/lib/types/activities/rateLimiter.d.ts +11 -0
- package/lib/types/activities/rateLimiter.d.ts.map +1 -0
- package/lib/types/activities/renditions/generateImageRendition.d.ts +14 -0
- package/lib/types/activities/renditions/generateImageRendition.d.ts.map +1 -0
- package/lib/types/activities/renditions/generateVideoRendition.d.ts +15 -0
- package/lib/types/activities/renditions/generateVideoRendition.d.ts.map +1 -0
- package/lib/types/activities/setDocumentStatus.d.ts +15 -0
- package/lib/types/activities/setDocumentStatus.d.ts.map +1 -0
- package/lib/types/conversion/TextractProcessor.d.ts +45 -0
- package/lib/types/conversion/TextractProcessor.d.ts.map +1 -0
- package/lib/types/conversion/image.d.ts +13 -0
- package/lib/types/conversion/image.d.ts.map +1 -0
- package/lib/types/conversion/markitdown.d.ts +2 -0
- package/lib/types/conversion/markitdown.d.ts.map +1 -0
- package/lib/types/conversion/mutool.d.ts +19 -0
- package/lib/types/conversion/mutool.d.ts.map +1 -0
- package/lib/types/conversion/pandoc.d.ts +2 -0
- package/lib/types/conversion/pandoc.d.ts.map +1 -0
- package/lib/types/dsl/conditions.d.ts +2 -0
- package/lib/types/dsl/conditions.d.ts.map +1 -0
- package/lib/types/dsl/dsl-workflow.d.ts +5 -0
- package/lib/types/dsl/dsl-workflow.d.ts.map +1 -0
- package/lib/types/dsl/dslProxyActivities.d.ts +10 -0
- package/lib/types/dsl/dslProxyActivities.d.ts.map +1 -0
- package/lib/types/dsl/projections.d.ts +4 -0
- package/lib/types/dsl/projections.d.ts.map +1 -0
- package/lib/types/dsl/setup/ActivityContext.d.ts +17 -0
- package/lib/types/dsl/setup/ActivityContext.d.ts.map +1 -0
- package/lib/types/dsl/setup/fetch/DataProvider.d.ts +9 -0
- package/lib/types/dsl/setup/fetch/DataProvider.d.ts.map +1 -0
- package/lib/types/dsl/setup/fetch/index.d.ts +6 -0
- package/lib/types/dsl/setup/fetch/index.d.ts.map +1 -0
- package/lib/types/dsl/setup/fetch/providers.d.ts +25 -0
- package/lib/types/dsl/setup/fetch/providers.d.ts.map +1 -0
- package/lib/types/dsl/test/test-child-workflow.d.ts +4 -0
- package/lib/types/dsl/test/test-child-workflow.d.ts.map +1 -0
- package/lib/types/dsl/validation.d.ts +4 -0
- package/lib/types/dsl/validation.d.ts.map +1 -0
- package/lib/types/dsl/vars.d.ts +48 -0
- package/lib/types/dsl/vars.d.ts.map +1 -0
- package/lib/types/dsl/walk.d.ts +18 -0
- package/lib/types/dsl/walk.d.ts.map +1 -0
- package/lib/types/dsl.d.ts +4 -0
- package/lib/types/dsl.d.ts.map +1 -0
- package/lib/types/errors.d.ts +27 -0
- package/lib/types/errors.d.ts.map +1 -0
- package/lib/types/index.d.ts +35 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/iterative-generation/activities/extractToc.d.ts +10 -0
- package/lib/types/iterative-generation/activities/extractToc.d.ts.map +1 -0
- package/lib/types/iterative-generation/activities/finalizeOutput.d.ts +3 -0
- package/lib/types/iterative-generation/activities/finalizeOutput.d.ts.map +1 -0
- package/lib/types/iterative-generation/activities/generatePart.d.ts +3 -0
- package/lib/types/iterative-generation/activities/generatePart.d.ts.map +1 -0
- package/lib/types/iterative-generation/activities/generateToc.d.ts +4 -0
- package/lib/types/iterative-generation/activities/generateToc.d.ts.map +1 -0
- package/lib/types/iterative-generation/activities/index.d.ts +5 -0
- package/lib/types/iterative-generation/activities/index.d.ts.map +1 -0
- package/lib/types/iterative-generation/iterativeGenerationWorkflow.d.ts +3 -0
- package/lib/types/iterative-generation/iterativeGenerationWorkflow.d.ts.map +1 -0
- package/lib/types/iterative-generation/types.d.ts +79 -0
- package/lib/types/iterative-generation/types.d.ts.map +1 -0
- package/lib/types/iterative-generation/utils.d.ts +27 -0
- package/lib/types/iterative-generation/utils.d.ts.map +1 -0
- package/lib/types/result-types.d.ts +22 -0
- package/lib/types/result-types.d.ts.map +1 -0
- package/lib/types/system/notifyWebhookWorkflow.d.ts +8 -0
- package/lib/types/system/notifyWebhookWorkflow.d.ts.map +1 -0
- package/lib/types/system/recalculateEmbeddingsWorkflow.d.ts +25 -0
- package/lib/types/system/recalculateEmbeddingsWorkflow.d.ts.map +1 -0
- package/lib/types/utils/auth.d.ts +4 -0
- package/lib/types/utils/auth.d.ts.map +1 -0
- package/lib/types/utils/blobs.d.ts +7 -0
- package/lib/types/utils/blobs.d.ts.map +1 -0
- package/lib/types/utils/chunks.d.ts +9 -0
- package/lib/types/utils/chunks.d.ts.map +1 -0
- package/lib/types/utils/client.d.ts +12 -0
- package/lib/types/utils/client.d.ts.map +1 -0
- package/lib/types/utils/expand-vars.d.ts +8 -0
- package/lib/types/utils/expand-vars.d.ts.map +1 -0
- package/lib/types/utils/memory.d.ts +8 -0
- package/lib/types/utils/memory.d.ts.map +1 -0
- package/lib/types/utils/renditions.d.ts +23 -0
- package/lib/types/utils/renditions.d.ts.map +1 -0
- package/lib/types/utils/storage.d.ts +16 -0
- package/lib/types/utils/storage.d.ts.map +1 -0
- package/lib/types/utils/tokens.d.ts +11 -0
- package/lib/types/utils/tokens.d.ts.map +1 -0
- package/lib/types/vars.d.ts +3 -0
- package/lib/types/vars.d.ts.map +1 -0
- package/lib/types/workflows.d.ts +8 -0
- package/lib/types/workflows.d.ts.map +1 -0
- package/lib/workflows-bundle.js +13145 -0
- package/package.json +127 -127
- package/src/activities/notifyWebhook.test.ts +18 -14
- package/src/activities/notifyWebhook.ts +149 -14
- package/src/dsl/setup/ActivityContext.ts +12 -45
- package/src/dsl/workflow-exec-child.test.ts +3 -3
- package/src/dsl/workflow-fetch.test.ts +1 -1
- package/src/dsl/workflow-import.test.ts +1 -1
- package/src/dsl/workflow.test.ts +1 -1
- package/src/iterative-generation/activities/extractToc.ts +12 -26
- package/src/iterative-generation/activities/finalizeOutput.ts +29 -52
- package/src/iterative-generation/activities/generatePart.ts +23 -64
- package/src/iterative-generation/activities/generateToc.ts +65 -78
- package/src/system/notifyWebhookWorkflow.ts +15 -6
- package/src/utils/blobs.ts +1 -3
- package/src/utils/client.ts +8 -22
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Use textract to convert a pdf into a data structure of the following format:
|
|
3
|
+
* <document>
|
|
4
|
+
* <page number="n">
|
|
5
|
+
* <text/>
|
|
6
|
+
* <table/>
|
|
7
|
+
* <text/>
|
|
8
|
+
* <figure/>
|
|
9
|
+
* ...
|
|
10
|
+
* </page>
|
|
11
|
+
*/
|
|
12
|
+
import { fromWebToken } from "@aws-sdk/credential-providers";
|
|
13
|
+
import { SupportedIntegrations } from "@vertesia/common";
|
|
14
|
+
import { log } from "@temporalio/activity";
|
|
15
|
+
import { TextractProcessor } from "../../conversion/TextractProcessor.js";
|
|
16
|
+
import { setupActivity } from "../../dsl/setup/ActivityContext.js";
|
|
17
|
+
import { DocumentNotFoundError } from "../../errors.js";
|
|
18
|
+
import { TextExtractionStatus } from "../../result-types.js";
|
|
19
|
+
import { fetchBlobAsBuffer, md5 } from "../../utils/blobs.js";
|
|
20
|
+
import { countTokens } from "../../utils/tokens.js";
|
|
21
|
+
export async function convertPdfToStructuredText(payload) {
|
|
22
|
+
const { params, client, objectId } = await setupActivity(payload);
|
|
23
|
+
const object = await client.objects.retrieve(objectId, "+text");
|
|
24
|
+
if (object.text && !params.force) {
|
|
25
|
+
return { hasText: true, objectId, status: TextExtractionStatus.skipped, message: "text already present and force not enabled" };
|
|
26
|
+
}
|
|
27
|
+
if (!object.content?.source) {
|
|
28
|
+
throw new DocumentNotFoundError(`No source found for object ${objectId}`);
|
|
29
|
+
}
|
|
30
|
+
const pdfUrl = await client.store.objects.getContentSource(objectId).then(res => res.source);
|
|
31
|
+
if (!pdfUrl) {
|
|
32
|
+
throw new DocumentNotFoundError(`Error fetching source ${object.content.source}`);
|
|
33
|
+
}
|
|
34
|
+
const project = await client.getProject();
|
|
35
|
+
const awsConfig = (await client.projects.integrations.retrieve(project.id, SupportedIntegrations.aws));
|
|
36
|
+
const credentials = await getS3AWSCredentials(awsConfig, payload.auth_token, project.id);
|
|
37
|
+
const processor = new TextractProcessor({
|
|
38
|
+
fileKey: objectId,
|
|
39
|
+
region: "us-west-2",
|
|
40
|
+
bucket: "cp-textract-tests",
|
|
41
|
+
credentials,
|
|
42
|
+
log: log,
|
|
43
|
+
detectImages: true,
|
|
44
|
+
includeConfidenceInTables: true,
|
|
45
|
+
});
|
|
46
|
+
try {
|
|
47
|
+
if (!object.content.source.startsWith("s3://")) {
|
|
48
|
+
const buf = await fetchBlobAsBuffer(client, object.content.source);
|
|
49
|
+
await processor.upload(buf);
|
|
50
|
+
}
|
|
51
|
+
const jobId = await processor.startAnalysis(objectId);
|
|
52
|
+
let jobStatus = await processor.checkJobStatus(jobId);
|
|
53
|
+
while (jobStatus === "IN_PROGRESS") {
|
|
54
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
55
|
+
jobStatus = await processor.checkJobStatus(jobId);
|
|
56
|
+
}
|
|
57
|
+
if (jobStatus === "SUCCEEDED") {
|
|
58
|
+
log.info(`Job ${jobId} succeeded, saving results`, { jobId });
|
|
59
|
+
const fText = await processor.processResults(jobId);
|
|
60
|
+
const tokensData = countTokens(fText);
|
|
61
|
+
const etag = object.content.etag ?? md5(fText);
|
|
62
|
+
const updateData = {
|
|
63
|
+
text: fText,
|
|
64
|
+
text_etag: etag,
|
|
65
|
+
tokens: {
|
|
66
|
+
...tokensData,
|
|
67
|
+
etag: etag,
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
await client.objects.update(objectId, updateData);
|
|
71
|
+
console.log("Full text updated");
|
|
72
|
+
return { hasText: true, objectId, status: TextExtractionStatus.success, message: "Text extracted successfully" };
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
throw new Error(`Job failed with status: ${jobStatus}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.error("Error processing document:", error);
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export async function getS3AWSCredentials(awsConfig, composableAuthToken, projectId) {
|
|
84
|
+
// fetch s3 role ARN
|
|
85
|
+
if (!awsConfig || !awsConfig.enabled) {
|
|
86
|
+
throw new DocumentNotFoundError("AWS integration is not enabled for this project");
|
|
87
|
+
}
|
|
88
|
+
if (!awsConfig.s3_role_arn) {
|
|
89
|
+
throw new DocumentNotFoundError("S3 Role ARN is not defined in AWS project integration");
|
|
90
|
+
}
|
|
91
|
+
log.info("Getting AWS credentials for Textract", { projectId, composableAuthToken, roleArn: awsConfig.s3_role_arn });
|
|
92
|
+
const credentials = fromWebToken({
|
|
93
|
+
webIdentityToken: composableAuthToken,
|
|
94
|
+
roleArn: awsConfig.s3_role_arn,
|
|
95
|
+
roleSessionName: `cp-project-textract-${projectId}`,
|
|
96
|
+
});
|
|
97
|
+
return credentials;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=processPdfWithTextract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processPdfWithTextract.js","sourceRoot":"","sources":["../../../../src/activities/media/processPdfWithTextract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { SupportedIntegrations } from "@vertesia/common";
|
|
2
|
+
import { activityInfo, CompleteAsyncError, log } from "@temporalio/activity";
|
|
3
|
+
import { FetchClient } from "@vertesia/api-fetch-client";
|
|
4
|
+
import { setupActivity } from "../../dsl/setup/ActivityContext.js";
|
|
5
|
+
import { DocumentNotFoundError } from "../../errors.js";
|
|
6
|
+
import { TextExtractionStatus } from "../../index.js";
|
|
7
|
+
const GLADIA_URL = "https://api.gladia.io/v2";
|
|
8
|
+
export async function transcribeMedia(payload) {
|
|
9
|
+
const { params, client, objectId } = await setupActivity(payload);
|
|
10
|
+
const gladiaConfig = await client.projects.integrations.retrieve(payload.project_id, SupportedIntegrations.gladia);
|
|
11
|
+
if (!gladiaConfig || !gladiaConfig.enabled) {
|
|
12
|
+
throw new DocumentNotFoundError("Gladia integration not enabled");
|
|
13
|
+
}
|
|
14
|
+
const object = await client.objects.retrieve(objectId, "+text");
|
|
15
|
+
const gladiaClient = new FetchClient(gladiaConfig.url ?? GLADIA_URL);
|
|
16
|
+
gladiaClient.withHeaders({ "x-gladia-key": gladiaConfig.api_key });
|
|
17
|
+
if (object.text && !params.force) {
|
|
18
|
+
return { hasText: true, objectId, status: TextExtractionStatus.skipped, message: "text already present and force not enabled" };
|
|
19
|
+
}
|
|
20
|
+
if (!object.content?.source) {
|
|
21
|
+
throw new DocumentNotFoundError(`No source found for object ${objectId}`);
|
|
22
|
+
}
|
|
23
|
+
const mediaUrl = await client.store.objects.getContentSource(objectId).then(res => res.source);
|
|
24
|
+
if (!mediaUrl) {
|
|
25
|
+
throw new DocumentNotFoundError(`Error fetching source ${object.content.source}`);
|
|
26
|
+
}
|
|
27
|
+
const taskToken = Buffer.from(activityInfo().taskToken).toString('base64url');
|
|
28
|
+
const callbackUrl = generateCallbackUrlForGladia(client.store.baseUrl, payload.auth_token, taskToken, objectId);
|
|
29
|
+
log.info(`Transcribing media ${mediaUrl} with Gladia`, { objectId, callbackUrl });
|
|
30
|
+
const res = await gladiaClient.post("/transcription", {
|
|
31
|
+
payload: {
|
|
32
|
+
audio_url: mediaUrl,
|
|
33
|
+
callback_url: callbackUrl,
|
|
34
|
+
diarization_enhanced: true,
|
|
35
|
+
enable_code_switching: true,
|
|
36
|
+
subtitles: true,
|
|
37
|
+
subtitles_config: {
|
|
38
|
+
formats: ["vtt"],
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
log.info(`Transcription request sent to Gladia`, { objectId, res });
|
|
43
|
+
throw new CompleteAsyncError();
|
|
44
|
+
}
|
|
45
|
+
function generateCallbackUrlForGladia(baseUrl, authToken, taskToken, objectId) {
|
|
46
|
+
return `${baseUrl}/api/v1/webhooks/gladia/${objectId}?access_token=${authToken}&task_token=${taskToken}`;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=transcribeMediaWithGladia.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcribeMediaWithGladia.js","sourceRoot":"","sources":["../../../../src/activities/media/transcribeMediaWithGladia.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { log } from "@temporalio/activity";
|
|
2
|
+
import { VertesiaClient } from "@vertesia/client";
|
|
3
|
+
import { ApiVersions } from "@vertesia/common";
|
|
4
|
+
import { setupActivity } from "../dsl/setup/ActivityContext.js";
|
|
5
|
+
import { WorkflowParamNotFoundError } from "../errors.js";
|
|
6
|
+
import { getVertesiaClientOptions } from "../utils/client.js";
|
|
7
|
+
export async function notifyWebhook(payload) {
|
|
8
|
+
const { params } = await setupActivity(payload);
|
|
9
|
+
const { webhook, method, headers: defaultHeaders } = params;
|
|
10
|
+
// resolve the url and the api version of the webhook
|
|
11
|
+
let target_url, version;
|
|
12
|
+
if (typeof webhook === 'string') {
|
|
13
|
+
target_url = webhook;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
target_url = webhook.url;
|
|
17
|
+
version = webhook.version;
|
|
18
|
+
}
|
|
19
|
+
if (!target_url)
|
|
20
|
+
throw new WorkflowParamNotFoundError('target_url');
|
|
21
|
+
const hasBody = params.detail && method === 'POST'; //body is sent only for POST
|
|
22
|
+
const headers = {
|
|
23
|
+
...defaultHeaders,
|
|
24
|
+
};
|
|
25
|
+
if (hasBody) {
|
|
26
|
+
headers['Content-Type'] = 'application/json';
|
|
27
|
+
}
|
|
28
|
+
const body = hasBody ? await createRequestBody(payload, params, version) : undefined;
|
|
29
|
+
log.info(`Notifying webhook at ${target_url}`);
|
|
30
|
+
const res = await fetch(target_url, {
|
|
31
|
+
method,
|
|
32
|
+
body,
|
|
33
|
+
headers,
|
|
34
|
+
}).catch(err => {
|
|
35
|
+
log.error(`An error occurred while notifying webhook at ${target_url}`, { err });
|
|
36
|
+
throw err;
|
|
37
|
+
});
|
|
38
|
+
if (!res.ok) {
|
|
39
|
+
log.warn(`Webhook endpoint ${target_url} returned an error - ${res.status} ${res.statusText}`, { fetchResponse: res });
|
|
40
|
+
// Try to get response payload for error message
|
|
41
|
+
let errorMessage = `Webhook Notification to ${target_url} failed with status: ${res.status} ${res.statusText}`;
|
|
42
|
+
try {
|
|
43
|
+
const responseText = await res.text();
|
|
44
|
+
if (responseText) {
|
|
45
|
+
errorMessage += ` - Response: ${responseText}`;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (readError) {
|
|
49
|
+
// If we can't read the response, just use the basic error message
|
|
50
|
+
log.debug('Could not read response body for error', { readError });
|
|
51
|
+
}
|
|
52
|
+
throw new Error(errorMessage);
|
|
53
|
+
}
|
|
54
|
+
return { status: res.status, message: res.statusText, url: res.url };
|
|
55
|
+
}
|
|
56
|
+
// --------------------------------------
|
|
57
|
+
// Data provider for webhooks
|
|
58
|
+
// this allows to customize the payload sent to the webhook depending on the
|
|
59
|
+
// type of workflow and the api version of the webhook
|
|
60
|
+
// --------------------------------------
|
|
61
|
+
function getWorkflowName(workflowType) {
|
|
62
|
+
// remove trailing Workflow or _Workflow case insensitive from the workflow type
|
|
63
|
+
return workflowType.replace(/_?workflow$/i, '');
|
|
64
|
+
}
|
|
65
|
+
async function createRequestBody(payload, params, api_version) {
|
|
66
|
+
if (api_version === undefined || Number(api_version) < ApiVersions.COMPLETION_RESULT_V1) {
|
|
67
|
+
return createOldRequestBody(payload, params);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
return createLatestRequestBody(payload, params, api_version);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async function createLatestRequestBody(payload, params, api_version) {
|
|
74
|
+
const data = await createEventData(payload, params, api_version);
|
|
75
|
+
return JSON.stringify({
|
|
76
|
+
workflow_id: params.workflow_id,
|
|
77
|
+
workflow_name: getWorkflowName(params.workflow_type),
|
|
78
|
+
workflow_run_id: params.workflow_run_id,
|
|
79
|
+
event_name: params.event_name,
|
|
80
|
+
detail: data,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
async function createEventData(payload, params, api_version) {
|
|
84
|
+
const data = params.detail;
|
|
85
|
+
if (data && data.run_id && params.event_name === "workflow_completed" && params.workflow_type === 'ExecuteInteractionWorkflow') {
|
|
86
|
+
const client = getVersionedVertesiaClient(payload, api_version); //ensure client is initialized
|
|
87
|
+
// we replace the result property with the full execution run object
|
|
88
|
+
return await client.runs.retrieve(data.run_id);
|
|
89
|
+
}
|
|
90
|
+
return data;
|
|
91
|
+
}
|
|
92
|
+
function getVersionedVertesiaClient(payload, version) {
|
|
93
|
+
// set the api version header
|
|
94
|
+
return new VertesiaClient(getVertesiaClientOptions(payload)).withApiVersion(version ? String(version) : null);
|
|
95
|
+
}
|
|
96
|
+
// ----------------- Compatibility code -----------------
|
|
97
|
+
/* Before 2025-10-08 the notifyWebhook POST body was in the format:
|
|
98
|
+
|
|
99
|
+
{
|
|
100
|
+
"workflowId": "generation:ExecuteInteractionWorkflow:WhatColor:ox8wu6t4",
|
|
101
|
+
"runId": "0199c2c6-818f-77eb-b931-c1ba8b9e5184",
|
|
102
|
+
"status": "completed",
|
|
103
|
+
"result": {
|
|
104
|
+
"run_id": "68e616274b0e9bb510462378",
|
|
105
|
+
"status": "completed",
|
|
106
|
+
"result": {"Color": "white"}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
After Versions.COMPLETION_RESULT_V1 (20250925) when the completion result interface changed we improved the
|
|
111
|
+
payload to the current format:
|
|
112
|
+
|
|
113
|
+
{
|
|
114
|
+
"workflow_id": "generation:ExecuteInteractionWorkflow:WhatColor:bdedqjqj6",
|
|
115
|
+
"workflow_name": "ExecuteInteraction",
|
|
116
|
+
"workflow_run_id": "0199c2d4-6b1d-7cf2-a1e5-4cac6778091e",
|
|
117
|
+
"event_name": "workflow_completed",
|
|
118
|
+
"detail": ExecutionRun
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
where ExecutionRun contains a result property with the new completion result format.
|
|
122
|
+
|
|
123
|
+
"result": [
|
|
124
|
+
{
|
|
125
|
+
"type": "json",
|
|
126
|
+
"value": {
|
|
127
|
+
"Color": "white"
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
],
|
|
131
|
+
|
|
132
|
+
*/
|
|
133
|
+
//@ts-ignore
|
|
134
|
+
async function createOldRequestBody(payload, params) {
|
|
135
|
+
let data = params.detail;
|
|
136
|
+
if (data && data.run_id && params.event_name === "workflow_completed" && params.workflow_type === 'ExecuteInteractionWorkflow') {
|
|
137
|
+
const client = getVersionedVertesiaClient(payload, null); //ensure client is using no specific version
|
|
138
|
+
const run = await client.runs.retrieve(data.run_id);
|
|
139
|
+
// since we use an unversioned client the run will be in old format so we don't need to tranform the result
|
|
140
|
+
const result = run.result;
|
|
141
|
+
data = {
|
|
142
|
+
workflowId: params.workflow_id,
|
|
143
|
+
runId: params.workflow_run_id,
|
|
144
|
+
status: params.event_name === 'workflow_completed' ? 'completed' : params.event_name,
|
|
145
|
+
result: {
|
|
146
|
+
run_id: run.id,
|
|
147
|
+
status: run.status,
|
|
148
|
+
result: result || null
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
return JSON.stringify(data || {});
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=notifyWebhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifyWebhook.js","sourceRoot":"","sources":["../../../src/activities/notifyWebhook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { activityInfo, log } from "@temporalio/activity";
|
|
2
|
+
import { setupActivity } from "../dsl/setup/ActivityContext.js";
|
|
3
|
+
export async function checkRateLimit(payload) {
|
|
4
|
+
const { client, params } = await setupActivity(payload);
|
|
5
|
+
const { environmentId, modelId } = params;
|
|
6
|
+
const result = {
|
|
7
|
+
delayMs: 0,
|
|
8
|
+
};
|
|
9
|
+
try {
|
|
10
|
+
// Call the studio-server endpoint to get rate limit delay using the Vertesia client
|
|
11
|
+
const info = activityInfo();
|
|
12
|
+
const requestPayload = {
|
|
13
|
+
interaction: params.interactionIdOrEndpoint,
|
|
14
|
+
workflow_run_id: info.workflowExecution.runId,
|
|
15
|
+
environment_id: environmentId,
|
|
16
|
+
model_id: modelId,
|
|
17
|
+
};
|
|
18
|
+
const response = await client.interactions.requestSlot(requestPayload);
|
|
19
|
+
result.delayMs = response.delay_ms;
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
log.warn('Failed to call rate limit API:', { error });
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=rateLimiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimiter.js","sourceRoot":"","sources":["../../../src/activities/rateLimiter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAYhE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAqD;IACxF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAkB,OAAO,CAAC,CAAC;IACzE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAE1C,MAAM,MAAM,GAAoB;QAC9B,OAAO,EAAE,CAAC;KACX,CAAA;IAED,IAAI,CAAC;QACH,oFAAoF;QACpF,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;QAC5B,MAAM,cAAc,GAA4B;YAC9C,WAAW,EAAE,MAAM,CAAC,uBAAuB;YAC3C,eAAe,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK;YAC7C,cAAc,EAAE,aAAa;YAC7B,QAAQ,EAAE,OAAO;SAClB,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QACvE,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAC,KAAK,EAAC,CAAC,CAAC;QACpD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { log } from "@temporalio/activity";
|
|
2
|
+
import { setupActivity } from "../../dsl/setup/ActivityContext.js";
|
|
3
|
+
import { DocumentNotFoundError, WorkflowParamNotFoundError } from "../../errors.js";
|
|
4
|
+
import { saveBlobToTempFile } from "../../utils/blobs.js";
|
|
5
|
+
import { uploadRenditionPages, } from "../../utils/renditions.js";
|
|
6
|
+
export async function generateImageRendition(payload) {
|
|
7
|
+
const { client, objectId, params: originParams, } = await setupActivity(payload);
|
|
8
|
+
// Fix: Use maxHeightWidth if max_hw is not provided
|
|
9
|
+
const params = {
|
|
10
|
+
...originParams,
|
|
11
|
+
max_hw: originParams.max_hw || originParams.maxHeightWidth || 1596, // Default to 1596 if both are missing
|
|
12
|
+
format: originParams.format || originParams.format_output || "png", // Default to png if format is missing
|
|
13
|
+
};
|
|
14
|
+
log.info(`Generating image rendition for ${objectId}`, {
|
|
15
|
+
originParams,
|
|
16
|
+
params,
|
|
17
|
+
});
|
|
18
|
+
const inputObject = await client.objects.retrieve(objectId).catch((err) => {
|
|
19
|
+
log.error(`Failed to retrieve document ${objectId}`, { err });
|
|
20
|
+
if (err.message.includes("not found")) {
|
|
21
|
+
throw new DocumentNotFoundError(`Document ${objectId} not found`, [objectId]);
|
|
22
|
+
}
|
|
23
|
+
throw err;
|
|
24
|
+
});
|
|
25
|
+
if (!inputObject) {
|
|
26
|
+
log.error(`Document ${objectId} not found`);
|
|
27
|
+
throw new DocumentNotFoundError(`Document ${objectId} not found`, [objectId]);
|
|
28
|
+
}
|
|
29
|
+
if (!params.format) {
|
|
30
|
+
log.error(`Format not found`);
|
|
31
|
+
throw new WorkflowParamNotFoundError(`format`);
|
|
32
|
+
}
|
|
33
|
+
if (!inputObject.content?.source) {
|
|
34
|
+
log.error(`Document ${objectId} has no source`);
|
|
35
|
+
throw new DocumentNotFoundError(`Document ${objectId} has no source`, [objectId]);
|
|
36
|
+
}
|
|
37
|
+
if (!inputObject.content.type ||
|
|
38
|
+
!inputObject.content.type?.startsWith("image/")) {
|
|
39
|
+
log.error(`Document ${objectId} is not an image or a video: ${inputObject.content.type}`);
|
|
40
|
+
throw new DocumentNotFoundError(`Document ${objectId} is not an image or a video: ${inputObject.content.type}`, [objectId]);
|
|
41
|
+
}
|
|
42
|
+
//array of rendition files to upload
|
|
43
|
+
let renditionPages = [];
|
|
44
|
+
const imageFile = await saveBlobToTempFile(client, inputObject.content.source);
|
|
45
|
+
log.info(`Image ${objectId} copied to ${imageFile}`);
|
|
46
|
+
renditionPages.push(imageFile);
|
|
47
|
+
//IF no etag, log and use use object id as etag
|
|
48
|
+
if (!inputObject.content.etag) {
|
|
49
|
+
log.warn(`Document ${objectId} has no etag, using object id as etag`);
|
|
50
|
+
}
|
|
51
|
+
const contentEtag = inputObject.content.etag ?? inputObject.id;
|
|
52
|
+
const uploaded = await uploadRenditionPages(client, contentEtag, [imageFile], params);
|
|
53
|
+
if (!uploaded || !uploaded.length || !uploaded[0]) {
|
|
54
|
+
log.error(`Failed to upload rendition for ${objectId}`, { uploaded });
|
|
55
|
+
throw new Error(`Failed to upload rendition for ${objectId} - upload object is empty`);
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
uploads: uploaded.map((u) => u),
|
|
59
|
+
format: params.format,
|
|
60
|
+
status: "success",
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=generateImageRendition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateImageRendition.js","sourceRoot":"","sources":["../../../../src/activities/renditions/generateImageRendition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { log } from "@temporalio/activity";
|
|
2
|
+
import { exec } from "child_process";
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import os from "os";
|
|
5
|
+
import path from "path";
|
|
6
|
+
import { promisify } from "util";
|
|
7
|
+
import { setupActivity } from "../../dsl/setup/ActivityContext.js";
|
|
8
|
+
import { DocumentNotFoundError, WorkflowParamNotFoundError } from "../../errors.js";
|
|
9
|
+
import { saveBlobToTempFile } from "../../utils/blobs.js";
|
|
10
|
+
import { uploadRenditionPages, } from "../../utils/renditions.js";
|
|
11
|
+
const execAsync = promisify(exec);
|
|
12
|
+
async function getVideoMetadata(videoPath) {
|
|
13
|
+
try {
|
|
14
|
+
const command = `ffprobe -v quiet -print_format json -show_format -show_streams "${videoPath}"`;
|
|
15
|
+
const { stdout } = await execAsync(command);
|
|
16
|
+
const metadata = JSON.parse(stdout);
|
|
17
|
+
const videoStream = metadata.streams.find((stream) => stream.codec_type === "video");
|
|
18
|
+
const duration = parseFloat(metadata.format.duration) || 0;
|
|
19
|
+
const width = videoStream?.width || 0;
|
|
20
|
+
const height = videoStream?.height || 0;
|
|
21
|
+
return { duration, width, height };
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
log.error(`Failed to get video metadata: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
25
|
+
throw new Error(`Failed to probe video metadata: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function generateThumbnail(videoPath, outputDir, timestamp, maxSize) {
|
|
29
|
+
//pad timestamp to 5 digits as filename
|
|
30
|
+
const outputFile = path.join(outputDir, `thumb-${timestamp.toString().padStart(5, "0")}.jpg`);
|
|
31
|
+
// FFmpeg command to extract thumbnail at specific timestamp
|
|
32
|
+
// Use proper scale filter syntax: scale=w:h:force_original_aspect_ratio=decrease
|
|
33
|
+
const scaleFilter = `scale=${maxSize}:${maxSize}:force_original_aspect_ratio=decrease`;
|
|
34
|
+
const command = [
|
|
35
|
+
"ffmpeg",
|
|
36
|
+
"-y", // Overwrite output files
|
|
37
|
+
"-ss",
|
|
38
|
+
timestamp.toString(), // Seek to timestamp
|
|
39
|
+
"-i",
|
|
40
|
+
`"${videoPath}"`, // Input file
|
|
41
|
+
"-vframes",
|
|
42
|
+
"1", // Extract only 1 frame
|
|
43
|
+
"-vf",
|
|
44
|
+
`"${scaleFilter}"`, // Scale maintaining aspect ratio
|
|
45
|
+
"-q:v",
|
|
46
|
+
"2", // High quality
|
|
47
|
+
`"${outputFile}"`,
|
|
48
|
+
].join(" ");
|
|
49
|
+
log.info(`Generating thumbnail at ${timestamp}s`), { command };
|
|
50
|
+
try {
|
|
51
|
+
const { stderr } = await execAsync(command);
|
|
52
|
+
// Log any warnings from ffmpeg
|
|
53
|
+
if (stderr && !stderr.includes("frame=")) {
|
|
54
|
+
log.debug(`FFmpeg stderr for thumbnail at ${timestamp}s: ${stderr}`);
|
|
55
|
+
}
|
|
56
|
+
// Verify the file was created
|
|
57
|
+
if (fs.existsSync(outputFile)) {
|
|
58
|
+
log.debug(`Generated thumbnail at ${timestamp}s`);
|
|
59
|
+
return outputFile;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
log.warn(`Thumbnail not generated for timestamp ${timestamp}s`);
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
log.error(`Failed to generate thumbnail at ${timestamp}s: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export async function generateVideoRendition(payload) {
|
|
72
|
+
const { client, objectId, params: originParams, } = await setupActivity(payload);
|
|
73
|
+
// Fix: Use maxHeightWidth if max_hw is not provided
|
|
74
|
+
const params = {
|
|
75
|
+
...originParams,
|
|
76
|
+
max_hw: originParams.max_hw || originParams.maxHeightWidth || 1024, // Default to 1024 if both are missing
|
|
77
|
+
format: originParams.format || originParams.format_output || "png", // Default to png if format is missing
|
|
78
|
+
};
|
|
79
|
+
log.info(`Generating video rendition for ${objectId}`, {
|
|
80
|
+
originParams,
|
|
81
|
+
params,
|
|
82
|
+
});
|
|
83
|
+
const inputObject = await client.objects.retrieve(objectId).catch((err) => {
|
|
84
|
+
log.error(`Failed to retrieve document ${objectId}`, { err });
|
|
85
|
+
if (err.message.includes("not found")) {
|
|
86
|
+
throw new DocumentNotFoundError(`Document ${objectId} not found`, [
|
|
87
|
+
objectId,
|
|
88
|
+
]);
|
|
89
|
+
}
|
|
90
|
+
throw err;
|
|
91
|
+
});
|
|
92
|
+
if (!params.format) {
|
|
93
|
+
log.error(`Format not found`);
|
|
94
|
+
throw new WorkflowParamNotFoundError(`format`);
|
|
95
|
+
}
|
|
96
|
+
if (!inputObject.content?.source) {
|
|
97
|
+
log.error(`Document ${objectId} has no source`);
|
|
98
|
+
throw new DocumentNotFoundError(`Document ${objectId} has no source`, [
|
|
99
|
+
objectId,
|
|
100
|
+
]);
|
|
101
|
+
}
|
|
102
|
+
if (!inputObject.content.type ||
|
|
103
|
+
!inputObject.content.type?.startsWith("video/")) {
|
|
104
|
+
log.error(`Document ${objectId} is not a video: ${inputObject.content.type}`);
|
|
105
|
+
throw new DocumentNotFoundError(`Document ${objectId} is not a video: ${inputObject.content.type}`, [objectId]);
|
|
106
|
+
}
|
|
107
|
+
//array of rendition files to upload
|
|
108
|
+
let renditionPages = [];
|
|
109
|
+
const videoFile = await saveBlobToTempFile(client, inputObject.content.source);
|
|
110
|
+
const tempOutputDir = fs.mkdtempSync(path.join(os.tmpdir(), "video-rendition-"));
|
|
111
|
+
try {
|
|
112
|
+
// Get video metadata using command line ffprobe
|
|
113
|
+
const metadata = await getVideoMetadata(videoFile);
|
|
114
|
+
const duration = metadata.duration;
|
|
115
|
+
// Calculate optimal number of thumbnails based on video length
|
|
116
|
+
const calculateThumbnailCount = (videoDuration) => {
|
|
117
|
+
if (videoDuration <= 60)
|
|
118
|
+
return 3; // Short videos: 3 thumbnails
|
|
119
|
+
if (videoDuration <= 300)
|
|
120
|
+
return 5; // 5min videos: 5 thumbnails
|
|
121
|
+
if (videoDuration <= 600)
|
|
122
|
+
return 8; // 10min videos: 8 thumbnails
|
|
123
|
+
if (videoDuration <= 1800)
|
|
124
|
+
return 12; // 30min videos: 12 thumbnails
|
|
125
|
+
if (videoDuration <= 3600)
|
|
126
|
+
return 16; // 1hr videos: 16 thumbnails
|
|
127
|
+
return 20; // Longer videos: max 20 thumbnails
|
|
128
|
+
};
|
|
129
|
+
const thumbnailCount = calculateThumbnailCount(duration);
|
|
130
|
+
// Generate evenly spaced timestamps, avoiding very beginning and end
|
|
131
|
+
const timestamps = [];
|
|
132
|
+
const startOffset = Math.min(duration * 0.05, 5); // Skip first 5% or 5 seconds
|
|
133
|
+
const endOffset = Math.min(duration * 0.05, 5); // Skip last 5% or 5 seconds
|
|
134
|
+
const usableDuration = duration - startOffset - endOffset;
|
|
135
|
+
for (let i = 0; i < thumbnailCount; i++) {
|
|
136
|
+
const progress = (i + 1) / (thumbnailCount + 1); // Evenly distribute
|
|
137
|
+
const timestamp = startOffset + usableDuration * progress;
|
|
138
|
+
timestamps.push(Math.max(timestamp, 1));
|
|
139
|
+
}
|
|
140
|
+
log.info(`Generating ${thumbnailCount} thumbnails for ${duration}s video`, {
|
|
141
|
+
objectId,
|
|
142
|
+
duration,
|
|
143
|
+
thumbnailCount,
|
|
144
|
+
timestamps: timestamps.map((t) => Math.round(t)),
|
|
145
|
+
tempOutputDir,
|
|
146
|
+
});
|
|
147
|
+
// Generate thumbnails using command line ffmpeg
|
|
148
|
+
const generatedThumbnails = await Promise.all(timestamps.map(async (timestamp) => {
|
|
149
|
+
return await generateThumbnail(videoFile, tempOutputDir, timestamp, params.max_hw);
|
|
150
|
+
}));
|
|
151
|
+
if (generatedThumbnails.length === 0) {
|
|
152
|
+
log.info(`No thumbnails were generated for video ${objectId}`, {
|
|
153
|
+
objectId,
|
|
154
|
+
thumbnailCount,
|
|
155
|
+
tempOutputDir,
|
|
156
|
+
});
|
|
157
|
+
throw new Error(`No thumbnails were generated for video ${objectId}`);
|
|
158
|
+
}
|
|
159
|
+
renditionPages.push(...generatedThumbnails.filter((thumbnail) => thumbnail !== undefined));
|
|
160
|
+
log.info(`Successfully generated ${generatedThumbnails.length} thumbnails for ${objectId}`, {
|
|
161
|
+
objectId,
|
|
162
|
+
generatedCount: generatedThumbnails.length,
|
|
163
|
+
requestedCount: thumbnailCount,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
log.error(`Error generating thumbnails for video: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
168
|
+
throw new Error(`Failed to generate thumbnails for video: ${objectId}`);
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
// Clean up temporary video file
|
|
172
|
+
try {
|
|
173
|
+
if (fs.existsSync(videoFile)) {
|
|
174
|
+
fs.unlinkSync(videoFile);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch (cleanupError) {
|
|
178
|
+
log.warn(`Failed to cleanup temporary video file: ${videoFile}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (!inputObject.content?.etag) {
|
|
182
|
+
log.warn(`Document ${objectId} has no etag, using object id as etag`);
|
|
183
|
+
}
|
|
184
|
+
const etag = inputObject.content.etag ?? inputObject.id;
|
|
185
|
+
// Update the final upload call to handle multiple thumbnails
|
|
186
|
+
const uploaded = await uploadRenditionPages(client, etag, renditionPages, params);
|
|
187
|
+
return {
|
|
188
|
+
uploads: uploaded.map((u) => u),
|
|
189
|
+
format: params.format,
|
|
190
|
+
thumbnailCount: renditionPages.length,
|
|
191
|
+
status: "success",
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=generateVideoRendition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateVideoRendition.js","sourceRoot":"","sources":["../../../../src/activities/renditions/generateVideoRendition.ts"],"names":[],"mappings":"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"}
|