@uploadista/flow-documents-replicate 0.0.20 → 0.1.0-beta.5

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.
@@ -1,15 +1,16 @@
1
-
2
- > @uploadista/flow-documents-replicate@0.0.20-beta.9 build /Users/denislaboureyras/Documents/uploadista/dev/uploadista-workspace/uploadista-sdk/packages/flow/documents/replicate
3
- > tsc --noEmit && tsdown
4
-
5
- ℹ tsdown v0.18.0 powered by rolldown v1.0.0-beta.53
6
- ℹ entry: src/index.ts
7
- ℹ tsconfig: tsconfig.json
8
- ℹ Build start
9
- ℹ Cleaning 4 files
10
- ℹ dist/index.mjs  5.49 kB │ gzip: 1.83 kB
11
- ℹ dist/index.mjs.map 11.02 kB │ gzip: 3.42 kB
12
- ℹ dist/index.d.mts.map  0.55 kB │ gzip: 0.32 kB
13
- ℹ dist/index.d.mts  1.72 kB │ gzip: 0.62 kB
14
- ℹ 4 files, total: 18.79 kB
15
- ✔ Build complete in 7218ms
1
+
2
+ 
3
+ > @uploadista/flow-documents-replicate@0.1.0-beta.4 build /Users/denislaboureyras/Documents/uploadista/dev/uploadista-workspace/uploadista-sdk/packages/flow/documents/replicate
4
+ > tsc --noEmit && tsdown
5
+
6
+ ℹ tsdown v0.19.0 powered by rolldown v1.0.0-beta.59
7
+ ℹ entry: src/index.ts
8
+ ℹ tsconfig: tsconfig.json
9
+ ℹ Build start
10
+ ℹ Cleaning 4 files
11
+ ℹ dist/index.mjs  5.49 kB │ gzip: 1.83 kB
12
+ ℹ dist/index.mjs.map 11.05 kB │ gzip: 3.42 kB
13
+ ℹ dist/index.d.mts.map  0.55 kB │ gzip: 0.32 kB
14
+ ℹ dist/index.d.mts  1.72 kB │ gzip: 0.62 kB
15
+ ℹ 4 files, total: 18.82 kB
16
+ ✔ Build complete in 4636ms
@@ -0,0 +1,6 @@
1
+
2
+ 
3
+ > @uploadista/flow-documents-replicate@0.1.0-beta.2 check /Users/denislaboureyras/Documents/uploadista/dev/uploadista-workspace/uploadista-sdk/packages/flow/documents/replicate
4
+ > biome check --write ./src
5
+
6
+ Checked 2 files in 148ms. No fixes applied.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/document-ai-plugin.ts"],"sourcesContent":[],"mappings":";;;;;KAWK,OAAA;KAEA,oBAAA;EAFA,MAAA,EAAA,MAAO;AAAA,CAAA;AAEa,KAKpB,oBAAA,GAAA,CAAkB,OAAA,EACZ,iBADY,GAAA;EACZ,WAAA,EAAA,WAAA;CACQ,EAAA,GAAd,MAAA,CAAO,MAAO,CAAA,oBAAA,EAAsB,eAAtB,CAAA;KAGd,YAAA,GAHoC,MAAA,GAAA;EAApC,kBAAO,CAAA,EAMe,oBANf;EAAM,4BAAA,CAAA,EAAA,OAAA;EAGb,UAAA,CAAA,EAKc,OALF;AAgFjB,CAAA;;;;;;AAoKA;AAKA;;;;;;;;;;;;;;cAzKa,2BACH;eAEO;MACd,KAAA,CAAA,MAAA;cAgKU,+BAA6B,KAAA,CAAA,MAAA;cAK7B,0CAxKH;eAEO;MACd,KAAA,CAAA,MAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/document-ai-plugin.ts"],"sourcesContent":[],"mappings":";;;;;KAWK,OAAA;KAEA,oBAAA;EAFA,MAAA,EAAA,MAAO;AAAA,CAAA;AAEa,KAKpB,oBAAA,GAAA,CAAkB,OAAA,EACZ,iBADY,GAAA;EACZ,WAAA,EAAA,WAAA;CACQ,EAAA,GAAd,MAAA,CAAO,MAAO,CAAA,oBAAA,EAAsB,eAAtB,CAAA;KAGd,YAAA,GAHoC,MAAA,GAAA;EAApC,kBAAO,CAAA,EAMe,oBANf;EAAM,4BAAA,CAAA,EAAA,OAAA;EAGb,UAAA,CAAA,EAKc,OALF;AAkFjB,CAAA;;;;;;AAyKA;AAKA;;;;;;;;;;;;;;cA9Ka,2BACH;eAEO;MACd,KAAA,CAAA,MAAA;cAqKU,+BAA6B,KAAA,CAAA,MAAA;cAK7B,0CA7KH;eAEO;MACd,KAAA,CAAA,MAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["CredentialProviderService","input: Record<string, unknown>","extractedText: string"],"sources":["../src/document-ai-plugin.ts"],"sourcesContent":["import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n CredentialProvider as CredentialProviderService,\n type DocumentAiContext,\n DocumentAiPlugin,\n type OcrResult,\n} from \"@uploadista/core/flow\";\nimport { withOperationSpan } from \"@uploadista/observability\";\nimport { Effect, Layer, Option } from \"effect\";\nimport Replicate from \"replicate\";\n\ntype ModelId = `${string}/${string}` | `${string}/${string}:${string}`;\n\ntype ReplicateCredentials = {\n apiKey: string;\n};\n\n// Credential provider function type\ntype CredentialProvider = (\n context: DocumentAiContext & { serviceType: \"replicate\" },\n) => Effect.Effect<ReplicateCredentials, UploadistaError>;\n\n// Plugin configuration can be either a static API key or options with credential provider or service\ntype PluginConfig =\n | string\n | {\n credentialProvider?: CredentialProvider;\n useCredentialProviderService?: boolean;\n ocrModelId?: ModelId;\n };\n\n/**\n * Map OcrTaskType to Replicate model task type\n */\nfunction mapTaskType(taskType: string): string {\n switch (taskType) {\n case \"convertToMarkdown\":\n return \"Convert to Markdown\";\n case \"freeOcr\":\n return \"Free OCR\";\n case \"parseFigure\":\n return \"Parse Figure\";\n case \"locateObject\":\n return \"Locate Object by Reference\";\n default:\n return \"Convert to Markdown\";\n }\n}\n\n/**\n * Map OcrResolution to Replicate resolution parameter\n */\nfunction mapResolution(resolution?: string): string {\n switch (resolution) {\n case \"tiny\":\n return \"Tiny\";\n case \"small\":\n return \"Small\";\n case \"base\":\n return \"Base\";\n case \"gundam\":\n return \"Gundam (Recommended)\";\n case \"large\":\n return \"Large\";\n default:\n return \"Gundam (Recommended)\";\n }\n}\n\n/**\n * Determine format based on task type\n */\nfunction getFormatFromTaskType(taskType: string): \"markdown\" | \"plain\" | \"structured\" {\n switch (taskType) {\n case \"convertToMarkdown\":\n return \"markdown\";\n case \"parseFigure\":\n return \"structured\";\n default:\n return \"plain\";\n }\n}\n\n/**\n * Create the Replicate DocumentAI plugin\n * Supports both static credentials (OSS) and dynamic credential providers (UploadistaCloud)\n *\n * @example\n * // Static credentials (OSS)\n * documentAiPlugin(process.env.REPLICATE_API_TOKEN)\n *\n * @example\n * // Dynamic credentials with function (UploadistaCloud)\n * documentAiPlugin({\n * credentialProvider: (context) => Effect.succeed({ apiKey: \"...\" })\n * })\n *\n * @example\n * // Dynamic credentials with Effect service (UploadistaCloud)\n * documentAiPlugin({\n * useCredentialProviderService: true\n * })\n */\nexport const documentAiPlugin = (\n config: PluginConfig,\n options?: {\n ocrModelId?: ModelId;\n },\n) => {\n // Parse configuration\n const isStatic = typeof config === \"string\";\n const staticApiKey = isStatic ? config : null;\n const credentialProvider = isStatic ? null : config.credentialProvider;\n const useCredentialProviderService = isStatic\n ? false\n : config.useCredentialProviderService;\n\n // Model ID for DeepSeek-OCR\n const ocrModelId =\n (isStatic ? options?.ocrModelId : config.ocrModelId) ||\n \"lucataco/deepseek-ocr:0080ec8faf4da6a14afb8502e96f5bb53afbc28b40e2d4a5e17945b8f69eb863\";\n\n // Helper to get API token (either static, from provider function, or from service)\n const getApiToken = (context: DocumentAiContext) => {\n if (staticApiKey) {\n return Effect.succeed(staticApiKey);\n }\n if (useCredentialProviderService) {\n return Effect.gen(function* () {\n const credentialProviderService = yield* Effect.serviceOption(\n CredentialProviderService,\n );\n\n if (Option.isNone(credentialProviderService)) {\n return yield* Effect.fail(\n UploadistaError.fromCode(\"UNKNOWN_ERROR\", {\n cause: new Error(\"Credential provider service not found\"),\n }),\n );\n }\n\n const credentials =\n yield* credentialProviderService.value.getCredential({\n clientId: context.clientId,\n serviceType: \"replicate\",\n });\n\n if (\n typeof credentials === \"object\" &&\n credentials !== null &&\n \"apiKey\" in credentials &&\n typeof credentials.apiKey === \"string\"\n ) {\n return credentials.apiKey;\n }\n\n return yield* Effect.fail(\n UploadistaError.fromCode(\"UNKNOWN_ERROR\", {\n cause: new Error(\"Invalid credential format from service\"),\n }),\n );\n });\n }\n if (credentialProvider) {\n return Effect.gen(function* () {\n const credentials = yield* credentialProvider({\n ...context,\n serviceType: \"replicate\",\n });\n return credentials.apiKey;\n });\n }\n return Effect.fail(\n UploadistaError.fromCode(\"UNKNOWN_ERROR\", {\n cause: new Error(\"No API credentials configured\"),\n }),\n );\n };\n\n return Layer.succeed(\n DocumentAiPlugin,\n DocumentAiPlugin.of({\n performOCR: (inputUrl, params, context) => {\n return Effect.gen(function* () {\n // Get API token (static or from credential provider)\n const apiToken = yield* getApiToken(context);\n\n yield* Effect.logInfo(\n `Starting OCR for document with task type: ${params.taskType}`\n );\n\n const output = yield* Effect.tryPromise({\n try: async () => {\n const replicate = new Replicate({\n auth: apiToken,\n });\n\n const input: Record<string, unknown> = {\n image: inputUrl,\n task_type: mapTaskType(params.taskType),\n resolution_size: mapResolution(params.resolution),\n };\n\n // Add reference text if provided and task type is locateObject\n if (params.taskType === \"locateObject\" && params.referenceText) {\n input.reference_text = params.referenceText;\n }\n\n const result = await replicate.run(ocrModelId, {\n input,\n });\n\n return result;\n },\n catch: (error) => {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n return UploadistaError.fromCode(\"OCR_FAILED\", {\n cause: errorMessage,\n });\n },\n }).pipe(\n Effect.tapError((error) =>\n Effect.logError(`OCR failed: ${error instanceof UploadistaError ? error.cause : String(error)}`)\n )\n );\n\n // Extract text from the result\n // Replicate OCR typically returns a string or an object with text\n let extractedText: string;\n\n if (typeof output === \"string\") {\n extractedText = output;\n } else if (\n typeof output === \"object\" &&\n output !== null &&\n \"text\" in output &&\n typeof output.text === \"string\"\n ) {\n extractedText = output.text;\n } else {\n // Try to stringify if it's a different format\n extractedText = JSON.stringify(output);\n }\n\n yield* Effect.logInfo(`OCR completed, extracted ${extractedText.length} characters`);\n\n const result: OcrResult = {\n extractedText,\n format: getFormatFromTaskType(params.taskType),\n };\n\n return result;\n }).pipe(\n withOperationSpan(\"ai\", \"ocr\", {\n \"ai.provider\": \"replicate\",\n \"ai.model\": ocrModelId,\n \"ai.task_type\": params.taskType,\n \"ai.credential_id\": context.credentialId,\n }),\n );\n },\n })\n );\n};\n\n// Export live layer with credential provider service\nexport const ReplicateDocumentAiPluginLive = documentAiPlugin({\n useCredentialProviderService: true,\n});\n\n// Export factory function for custom configuration\nexport const createReplicateDocumentAiPlugin = documentAiPlugin;\n"],"mappings":";;;;;;;;;;AAkCA,SAAS,YAAY,UAA0B;AAC7C,SAAQ,UAAR;EACE,KAAK,oBACH,QAAO;EACT,KAAK,UACH,QAAO;EACT,KAAK,cACH,QAAO;EACT,KAAK,eACH,QAAO;EACT,QACE,QAAO;;;;;;AAOb,SAAS,cAAc,YAA6B;AAClD,SAAQ,YAAR;EACE,KAAK,OACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,QACE,QAAO;;;;;;AAOb,SAAS,sBAAsB,UAAuD;AACpF,SAAQ,UAAR;EACE,KAAK,oBACH,QAAO;EACT,KAAK,cACH,QAAO;EACT,QACE,QAAO;;;;;;;;;;;;;;;;;;;;;;;AAwBb,MAAa,oBACX,QACA,YAGG;CAEH,MAAM,WAAW,OAAO,WAAW;CACnC,MAAM,eAAe,WAAW,SAAS;CACzC,MAAM,qBAAqB,WAAW,OAAO,OAAO;CACpD,MAAM,+BAA+B,WACjC,QACA,OAAO;CAGX,MAAM,cACH,WAAW,SAAS,aAAa,OAAO,eACzC;CAGF,MAAM,eAAe,YAA+B;AAClD,MAAI,aACF,QAAO,OAAO,QAAQ,aAAa;AAErC,MAAI,6BACF,QAAO,OAAO,IAAI,aAAa;GAC7B,MAAM,4BAA4B,OAAO,OAAO,cAC9CA,mBACD;AAED,OAAI,OAAO,OAAO,0BAA0B,CAC1C,QAAO,OAAO,OAAO,KACnB,gBAAgB,SAAS,iBAAiB,EACxC,uBAAO,IAAI,MAAM,wCAAwC,EAC1D,CAAC,CACH;GAGH,MAAM,cACJ,OAAO,0BAA0B,MAAM,cAAc;IACnD,UAAU,QAAQ;IAClB,aAAa;IACd,CAAC;AAEJ,OACE,OAAO,gBAAgB,YACvB,gBAAgB,QAChB,YAAY,eACZ,OAAO,YAAY,WAAW,SAE9B,QAAO,YAAY;AAGrB,UAAO,OAAO,OAAO,KACnB,gBAAgB,SAAS,iBAAiB,EACxC,uBAAO,IAAI,MAAM,yCAAyC,EAC3D,CAAC,CACH;IACD;AAEJ,MAAI,mBACF,QAAO,OAAO,IAAI,aAAa;AAK7B,WAJoB,OAAO,mBAAmB;IAC5C,GAAG;IACH,aAAa;IACd,CAAC,EACiB;IACnB;AAEJ,SAAO,OAAO,KACZ,gBAAgB,SAAS,iBAAiB,EACxC,uBAAO,IAAI,MAAM,gCAAgC,EAClD,CAAC,CACH;;AAGH,QAAO,MAAM,QACX,kBACA,iBAAiB,GAAG,EAClB,aAAa,UAAU,QAAQ,YAAY;AACzC,SAAO,OAAO,IAAI,aAAa;GAE7B,MAAM,WAAW,OAAO,YAAY,QAAQ;AAE5C,UAAO,OAAO,QACZ,6CAA6C,OAAO,WACrD;GAED,MAAM,SAAS,OAAO,OAAO,WAAW;IACtC,KAAK,YAAY;KACf,MAAM,YAAY,IAAI,UAAU,EAC9B,MAAM,UACP,CAAC;KAEF,MAAMC,QAAiC;MACrC,OAAO;MACP,WAAW,YAAY,OAAO,SAAS;MACvC,iBAAiB,cAAc,OAAO,WAAW;MAClD;AAGD,SAAI,OAAO,aAAa,kBAAkB,OAAO,cAC/C,OAAM,iBAAiB,OAAO;AAOhC,YAJe,MAAM,UAAU,IAAI,YAAY,EAC7C,OACD,CAAC;;IAIJ,QAAQ,UAAU;KAChB,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAE3E,YAAO,gBAAgB,SAAS,cAAc,EAC5C,OAAO,cACR,CAAC;;IAEL,CAAC,CAAC,KACD,OAAO,UAAU,UACf,OAAO,SAAS,eAAe,iBAAiB,kBAAkB,MAAM,QAAQ,OAAO,MAAM,GAAG,CACjG,CACF;GAID,IAAIC;AAEJ,OAAI,OAAO,WAAW,SACpB,iBAAgB;YAEhB,OAAO,WAAW,YAClB,WAAW,QACX,UAAU,UACV,OAAO,OAAO,SAAS,SAEvB,iBAAgB,OAAO;OAGvB,iBAAgB,KAAK,UAAU,OAAO;AAGxC,UAAO,OAAO,QAAQ,4BAA4B,cAAc,OAAO,aAAa;AAOpF,UAL0B;IACxB;IACA,QAAQ,sBAAsB,OAAO,SAAS;IAC/C;IAGD,CAAC,KACD,kBAAkB,MAAM,OAAO;GAC7B,eAAe;GACf,YAAY;GACZ,gBAAgB,OAAO;GACvB,oBAAoB,QAAQ;GAC7B,CAAC,CACH;IAEJ,CAAC,CACH;;AAIH,MAAa,gCAAgC,iBAAiB,EAC5D,8BAA8B,MAC/B,CAAC;AAGF,MAAa,kCAAkC"}
1
+ {"version":3,"file":"index.mjs","names":["CredentialProviderService"],"sources":["../src/document-ai-plugin.ts"],"sourcesContent":["import { UploadistaError } from \"@uploadista/core/errors\";\nimport {\n CredentialProvider as CredentialProviderService,\n type DocumentAiContext,\n DocumentAiPlugin,\n type OcrResult,\n} from \"@uploadista/core/flow\";\nimport { withOperationSpan } from \"@uploadista/observability\";\nimport { Effect, Layer, Option } from \"effect\";\nimport Replicate from \"replicate\";\n\ntype ModelId = `${string}/${string}` | `${string}/${string}:${string}`;\n\ntype ReplicateCredentials = {\n apiKey: string;\n};\n\n// Credential provider function type\ntype CredentialProvider = (\n context: DocumentAiContext & { serviceType: \"replicate\" },\n) => Effect.Effect<ReplicateCredentials, UploadistaError>;\n\n// Plugin configuration can be either a static API key or options with credential provider or service\ntype PluginConfig =\n | string\n | {\n credentialProvider?: CredentialProvider;\n useCredentialProviderService?: boolean;\n ocrModelId?: ModelId;\n };\n\n/**\n * Map OcrTaskType to Replicate model task type\n */\nfunction mapTaskType(taskType: string): string {\n switch (taskType) {\n case \"convertToMarkdown\":\n return \"Convert to Markdown\";\n case \"freeOcr\":\n return \"Free OCR\";\n case \"parseFigure\":\n return \"Parse Figure\";\n case \"locateObject\":\n return \"Locate Object by Reference\";\n default:\n return \"Convert to Markdown\";\n }\n}\n\n/**\n * Map OcrResolution to Replicate resolution parameter\n */\nfunction mapResolution(resolution?: string): string {\n switch (resolution) {\n case \"tiny\":\n return \"Tiny\";\n case \"small\":\n return \"Small\";\n case \"base\":\n return \"Base\";\n case \"gundam\":\n return \"Gundam (Recommended)\";\n case \"large\":\n return \"Large\";\n default:\n return \"Gundam (Recommended)\";\n }\n}\n\n/**\n * Determine format based on task type\n */\nfunction getFormatFromTaskType(\n taskType: string,\n): \"markdown\" | \"plain\" | \"structured\" {\n switch (taskType) {\n case \"convertToMarkdown\":\n return \"markdown\";\n case \"parseFigure\":\n return \"structured\";\n default:\n return \"plain\";\n }\n}\n\n/**\n * Create the Replicate DocumentAI plugin\n * Supports both static credentials (OSS) and dynamic credential providers (UploadistaCloud)\n *\n * @example\n * // Static credentials (OSS)\n * documentAiPlugin(process.env.REPLICATE_API_TOKEN)\n *\n * @example\n * // Dynamic credentials with function (UploadistaCloud)\n * documentAiPlugin({\n * credentialProvider: (context) => Effect.succeed({ apiKey: \"...\" })\n * })\n *\n * @example\n * // Dynamic credentials with Effect service (UploadistaCloud)\n * documentAiPlugin({\n * useCredentialProviderService: true\n * })\n */\nexport const documentAiPlugin = (\n config: PluginConfig,\n options?: {\n ocrModelId?: ModelId;\n },\n) => {\n // Parse configuration\n const isStatic = typeof config === \"string\";\n const staticApiKey = isStatic ? config : null;\n const credentialProvider = isStatic ? null : config.credentialProvider;\n const useCredentialProviderService = isStatic\n ? false\n : config.useCredentialProviderService;\n\n // Model ID for DeepSeek-OCR\n const ocrModelId =\n (isStatic ? options?.ocrModelId : config.ocrModelId) ||\n \"lucataco/deepseek-ocr:0080ec8faf4da6a14afb8502e96f5bb53afbc28b40e2d4a5e17945b8f69eb863\";\n\n // Helper to get API token (either static, from provider function, or from service)\n const getApiToken = (context: DocumentAiContext) => {\n if (staticApiKey) {\n return Effect.succeed(staticApiKey);\n }\n if (useCredentialProviderService) {\n return Effect.gen(function* () {\n const credentialProviderService = yield* Effect.serviceOption(\n CredentialProviderService,\n );\n\n if (Option.isNone(credentialProviderService)) {\n return yield* Effect.fail(\n UploadistaError.fromCode(\"UNKNOWN_ERROR\", {\n cause: new Error(\"Credential provider service not found\"),\n }),\n );\n }\n\n const credentials =\n yield* credentialProviderService.value.getCredential({\n clientId: context.clientId,\n serviceType: \"replicate\",\n });\n\n if (\n typeof credentials === \"object\" &&\n credentials !== null &&\n \"apiKey\" in credentials &&\n typeof credentials.apiKey === \"string\"\n ) {\n return credentials.apiKey;\n }\n\n return yield* Effect.fail(\n UploadistaError.fromCode(\"UNKNOWN_ERROR\", {\n cause: new Error(\"Invalid credential format from service\"),\n }),\n );\n });\n }\n if (credentialProvider) {\n return Effect.gen(function* () {\n const credentials = yield* credentialProvider({\n ...context,\n serviceType: \"replicate\",\n });\n return credentials.apiKey;\n });\n }\n return Effect.fail(\n UploadistaError.fromCode(\"UNKNOWN_ERROR\", {\n cause: new Error(\"No API credentials configured\"),\n }),\n );\n };\n\n return Layer.succeed(\n DocumentAiPlugin,\n DocumentAiPlugin.of({\n performOCR: (inputUrl, params, context) => {\n return Effect.gen(function* () {\n // Get API token (static or from credential provider)\n const apiToken = yield* getApiToken(context);\n\n yield* Effect.logInfo(\n `Starting OCR for document with task type: ${params.taskType}`,\n );\n\n const output = yield* Effect.tryPromise({\n try: async () => {\n const replicate = new Replicate({\n auth: apiToken,\n });\n\n const input: Record<string, unknown> = {\n image: inputUrl,\n task_type: mapTaskType(params.taskType),\n resolution_size: mapResolution(params.resolution),\n };\n\n // Add reference text if provided and task type is locateObject\n if (params.taskType === \"locateObject\" && params.referenceText) {\n input.reference_text = params.referenceText;\n }\n\n const result = await replicate.run(ocrModelId, {\n input,\n });\n\n return result;\n },\n catch: (error) => {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n return UploadistaError.fromCode(\"OCR_FAILED\", {\n cause: errorMessage,\n });\n },\n }).pipe(\n Effect.tapError((error) =>\n Effect.logError(\n `OCR failed: ${error instanceof UploadistaError ? error.cause : String(error)}`,\n ),\n ),\n );\n\n // Extract text from the result\n // Replicate OCR typically returns a string or an object with text\n let extractedText: string;\n\n if (typeof output === \"string\") {\n extractedText = output;\n } else if (\n typeof output === \"object\" &&\n output !== null &&\n \"text\" in output &&\n typeof output.text === \"string\"\n ) {\n extractedText = output.text;\n } else {\n // Try to stringify if it's a different format\n extractedText = JSON.stringify(output);\n }\n\n yield* Effect.logInfo(\n `OCR completed, extracted ${extractedText.length} characters`,\n );\n\n const result: OcrResult = {\n extractedText,\n format: getFormatFromTaskType(params.taskType),\n };\n\n return result;\n }).pipe(\n withOperationSpan(\"ai\", \"ocr\", {\n \"ai.provider\": \"replicate\",\n \"ai.model\": ocrModelId,\n \"ai.task_type\": params.taskType,\n \"ai.credential_id\": context.credentialId,\n }),\n );\n },\n }),\n );\n};\n\n// Export live layer with credential provider service\nexport const ReplicateDocumentAiPluginLive = documentAiPlugin({\n useCredentialProviderService: true,\n});\n\n// Export factory function for custom configuration\nexport const createReplicateDocumentAiPlugin = documentAiPlugin;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@uploadista/flow-documents-replicate",
3
3
  "type": "module",
4
- "version": "0.0.20",
4
+ "version": "0.1.0-beta.5",
5
5
  "description": "Replicate OCR plugin for Uploadista document processing",
6
6
  "license": "MIT",
7
7
  "author": "Uploadista",
@@ -15,17 +15,17 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "replicate": "1.4.0",
18
- "@uploadista/core": "0.0.20",
19
- "@uploadista/observability": "0.0.20"
18
+ "@uploadista/core": "0.1.0-beta.5",
19
+ "@uploadista/observability": "0.1.0-beta.5"
20
20
  },
21
21
  "peerDependencies": {
22
22
  "effect": "^3.0.0"
23
23
  },
24
24
  "devDependencies": {
25
- "@types/node": "24.10.4",
26
- "effect": "3.19.12",
27
- "tsdown": "0.18.0",
28
- "@uploadista/typescript-config": "0.0.20"
25
+ "@types/node": "24.10.8",
26
+ "effect": "3.19.14",
27
+ "tsdown": "0.19.0",
28
+ "@uploadista/typescript-config": "0.1.0-beta.5"
29
29
  },
30
30
  "scripts": {
31
31
  "build": "tsc --noEmit && tsdown",
@@ -70,7 +70,9 @@ function mapResolution(resolution?: string): string {
70
70
  /**
71
71
  * Determine format based on task type
72
72
  */
73
- function getFormatFromTaskType(taskType: string): "markdown" | "plain" | "structured" {
73
+ function getFormatFromTaskType(
74
+ taskType: string,
75
+ ): "markdown" | "plain" | "structured" {
74
76
  switch (taskType) {
75
77
  case "convertToMarkdown":
76
78
  return "markdown";
@@ -186,7 +188,7 @@ export const documentAiPlugin = (
186
188
  const apiToken = yield* getApiToken(context);
187
189
 
188
190
  yield* Effect.logInfo(
189
- `Starting OCR for document with task type: ${params.taskType}`
191
+ `Starting OCR for document with task type: ${params.taskType}`,
190
192
  );
191
193
 
192
194
  const output = yield* Effect.tryPromise({
@@ -213,7 +215,8 @@ export const documentAiPlugin = (
213
215
  return result;
214
216
  },
215
217
  catch: (error) => {
216
- const errorMessage = error instanceof Error ? error.message : String(error);
218
+ const errorMessage =
219
+ error instanceof Error ? error.message : String(error);
217
220
 
218
221
  return UploadistaError.fromCode("OCR_FAILED", {
219
222
  cause: errorMessage,
@@ -221,8 +224,10 @@ export const documentAiPlugin = (
221
224
  },
222
225
  }).pipe(
223
226
  Effect.tapError((error) =>
224
- Effect.logError(`OCR failed: ${error instanceof UploadistaError ? error.cause : String(error)}`)
225
- )
227
+ Effect.logError(
228
+ `OCR failed: ${error instanceof UploadistaError ? error.cause : String(error)}`,
229
+ ),
230
+ ),
226
231
  );
227
232
 
228
233
  // Extract text from the result
@@ -243,7 +248,9 @@ export const documentAiPlugin = (
243
248
  extractedText = JSON.stringify(output);
244
249
  }
245
250
 
246
- yield* Effect.logInfo(`OCR completed, extracted ${extractedText.length} characters`);
251
+ yield* Effect.logInfo(
252
+ `OCR completed, extracted ${extractedText.length} characters`,
253
+ );
247
254
 
248
255
  const result: OcrResult = {
249
256
  extractedText,
@@ -260,7 +267,7 @@ export const documentAiPlugin = (
260
267
  }),
261
268
  );
262
269
  },
263
- })
270
+ }),
264
271
  );
265
272
  };
266
273
 
package/src/index.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export {
2
+ createReplicateDocumentAiPlugin,
2
3
  documentAiPlugin,
3
4
  ReplicateDocumentAiPluginLive,
4
- createReplicateDocumentAiPlugin,
5
5
  } from "./document-ai-plugin";