@chenchaolong/plugin-mineru 1.1.5 → 1.1.7
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mineru.client.d.ts","sourceRoot":"","sources":["../../src/lib/mineru.client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAmB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAK7C,OAAO,EAIL,wBAAwB,EAExB,0BAA0B,EAC1B,gBAAgB,EACjB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"mineru.client.d.ts","sourceRoot":"","sources":["../../src/lib/mineru.client.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,9 +7,6 @@ import { basename, isAbsolute, join as pathJoin } from 'path';
|
|
|
7
7
|
import fs from 'fs';
|
|
8
8
|
import { ENV_MINERU_API_BASE_URL, ENV_MINERU_API_TOKEN, ENV_MINERU_SERVER_TYPE, } from './types.js';
|
|
9
9
|
const DEFAULT_OFFICIAL_BASE_URL = 'https://mineru.net/api/v4';
|
|
10
|
-
// Default base URL for self-hosted MinerU deployments
|
|
11
|
-
// 自托管 MinerU 部署的默认基础 URL
|
|
12
|
-
const DEFAULT_SELF_HOSTED_BASE_URL = 'http://localhost:8000';
|
|
13
10
|
export class MinerUClient {
|
|
14
11
|
get fileSystem() {
|
|
15
12
|
return this.permissions?.fileSystem;
|
|
@@ -185,8 +182,13 @@ export class MinerUClient {
|
|
|
185
182
|
const tokenFromEnv = this.configService.get(tokenEnvKey);
|
|
186
183
|
const baseUrl = baseUrlFromIntegration ||
|
|
187
184
|
baseUrlFromEnv ||
|
|
188
|
-
(this.serverType === 'official' ? DEFAULT_OFFICIAL_BASE_URL :
|
|
185
|
+
(this.serverType === 'official' ? DEFAULT_OFFICIAL_BASE_URL : undefined);
|
|
189
186
|
const token = tokenFromIntegration || tokenFromEnv;
|
|
187
|
+
// Validate baseUrl is provided for self-hosted mode
|
|
188
|
+
if (this.serverType === 'self-hosted' && !baseUrl) {
|
|
189
|
+
throw new Error('MinerU self-hosted mode requires apiUrl to be configured in integration options or ' +
|
|
190
|
+
`${ENV_MINERU_API_BASE_URL} environment variable`);
|
|
191
|
+
}
|
|
190
192
|
return { baseUrl, token };
|
|
191
193
|
}
|
|
192
194
|
readIntegrationOptions(integration) {
|
|
@@ -255,53 +257,39 @@ export class MinerUClient {
|
|
|
255
257
|
}
|
|
256
258
|
async createSelfHostedTask(options) {
|
|
257
259
|
// Validate fileSystem is available for self-hosted mode
|
|
258
|
-
// 验证文件系统是否可用于自托管模式
|
|
259
260
|
if (!this.fileSystem) {
|
|
260
261
|
throw new Error('MinerU self-hosted mode requires fileSystem permission');
|
|
261
262
|
}
|
|
262
263
|
// Validate filePath is provided
|
|
263
|
-
// 验证是否提供了文件路径
|
|
264
264
|
if (!options.filePath) {
|
|
265
265
|
throw new Error('MinerU self-hosted mode requires filePath to be provided');
|
|
266
266
|
}
|
|
267
267
|
// Resolve absolute file path
|
|
268
|
-
// 解析绝对文件路径
|
|
269
268
|
// Log original filePath for debugging
|
|
270
|
-
// 记录原始 filePath 以便调试
|
|
271
269
|
const basePath = this.fileSystem ? this.fileSystem.basePath : 'N/A';
|
|
272
270
|
this.logger.debug(`Resolving file path. Original filePath: ${options.filePath}, basePath: ${basePath}`);
|
|
273
271
|
// Check if filePath is already an absolute path
|
|
274
|
-
// 检查 filePath 是否已经是绝对路径
|
|
275
272
|
const isAbsolutePath = isAbsolute(options.filePath);
|
|
276
273
|
// Also check if it looks like a full path even without leading slash
|
|
277
|
-
|
|
278
|
-
const looksLikeFullPath = !isAbsolutePath && (options.filePath.includes('/apps/api/public/') ||
|
|
279
|
-
options.filePath.includes('/public/files/') ||
|
|
280
|
-
options.filePath.includes('/项目/') ||
|
|
281
|
-
options.filePath.includes('/xpert-dev/') ||
|
|
282
|
-
options.filePath.startsWith('Users/') ||
|
|
274
|
+
const looksLikeFullPath = !isAbsolutePath && (options.filePath.startsWith('Users/') ||
|
|
283
275
|
options.filePath.startsWith('home/'));
|
|
284
276
|
let filePath;
|
|
285
277
|
if (isAbsolutePath) {
|
|
286
278
|
// Use absolute path directly
|
|
287
|
-
// 直接使用绝对路径
|
|
288
279
|
filePath = options.filePath;
|
|
289
280
|
this.logger.debug(`Using absolute path directly: ${filePath}`);
|
|
290
281
|
}
|
|
291
282
|
else if (looksLikeFullPath) {
|
|
292
283
|
// If it looks like a full path but doesn't start with /, add it
|
|
293
|
-
// 如果看起来像完整路径但没有以 / 开头,添加它
|
|
294
284
|
filePath = options.filePath.startsWith('/') ? options.filePath : '/' + options.filePath;
|
|
295
285
|
this.logger.debug(`Detected full path pattern, normalized to: ${filePath}`);
|
|
296
286
|
}
|
|
297
287
|
else {
|
|
298
288
|
// Use xpFileSystem.fullPath() to resolve relative path to absolute path
|
|
299
|
-
// 使用 xpFileSystem.fullPath() 将相对路径解析为绝对路径
|
|
300
289
|
filePath = this.fileSystem.fullPath(options.filePath);
|
|
301
290
|
this.logger.debug(`Resolved relative path using basePath: ${filePath}`);
|
|
302
291
|
}
|
|
303
292
|
// Validate file exists and is readable before attempting to parse
|
|
304
|
-
// 在尝试解析之前验证文件是否存在且可读
|
|
305
293
|
try {
|
|
306
294
|
await fs.promises.access(filePath, fs.constants.F_OK | fs.constants.R_OK);
|
|
307
295
|
const stats = await fs.promises.stat(filePath);
|
|
@@ -312,21 +300,43 @@ export class MinerUClient {
|
|
|
312
300
|
}
|
|
313
301
|
catch (error) {
|
|
314
302
|
// If file not found in the resolved path, try to find it in common alternative locations
|
|
315
|
-
//
|
|
303
|
+
// This handles two scenarios:
|
|
304
|
+
// 1. StorageFile: files/{tenantId}/filename -> apps/api/public/files/{tenantId}/filename (already tried above)
|
|
305
|
+
// 2. VolumeClient: folder/filename or filename -> ~/data/folder/filename or ~/data/filename
|
|
316
306
|
if (error instanceof Error && error.code === 'ENOENT') {
|
|
317
307
|
const homeDir = process.env.HOME || process.env.USERPROFILE;
|
|
318
|
-
const
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
];
|
|
308
|
+
const originalFilePath = options.filePath;
|
|
309
|
+
const fileName = basename(originalFilePath);
|
|
310
|
+
// Build alternative paths for VolumeClient storage
|
|
311
|
+
const alternativePaths = [];
|
|
312
|
+
// If original path contains directory separators, try both full path and just filename
|
|
313
|
+
if (originalFilePath.includes('/') || originalFilePath.includes('\\')) {
|
|
314
|
+
// Try full path in ~/data/
|
|
315
|
+
alternativePaths.push(pathJoin(homeDir || '', 'data', originalFilePath));
|
|
316
|
+
// Try just filename in ~/data/ (for VolumeClient files stored directly in root)
|
|
317
|
+
alternativePaths.push(pathJoin(homeDir || '', 'data', fileName));
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
// If original path is just a filename, try in ~/data/ root
|
|
321
|
+
alternativePaths.push(pathJoin(homeDir || '', 'data', originalFilePath));
|
|
322
|
+
}
|
|
323
|
+
// Also try in knowledge base specific paths if we can determine knowledgebaseId
|
|
324
|
+
// Note: We don't have direct access to knowledgebaseId here, but files might be in knowledges subdirectory
|
|
325
|
+
const resolvedPath = this.fileSystem.fullPath(originalFilePath);
|
|
326
|
+
if (resolvedPath.includes('apps/api/public')) {
|
|
327
|
+
// This looks like a StorageFile path, but file not found
|
|
328
|
+
// Try VolumeClient paths as fallback
|
|
329
|
+
this.logger.debug(`File not found in StorageFile path, trying VolumeClient paths...`);
|
|
330
|
+
}
|
|
331
|
+
let foundPath = null;
|
|
322
332
|
for (const altPath of alternativePaths) {
|
|
323
333
|
try {
|
|
324
334
|
await fs.promises.access(altPath, fs.constants.F_OK | fs.constants.R_OK);
|
|
325
335
|
const stats = await fs.promises.stat(altPath);
|
|
326
336
|
this.logger.debug(`Found file in alternative location: ${altPath}, size: ${stats.size} bytes`);
|
|
327
|
-
|
|
337
|
+
foundPath = altPath;
|
|
328
338
|
if (stats.size === 0) {
|
|
329
|
-
throw new Error(`File is empty: ${
|
|
339
|
+
throw new Error(`File is empty: ${foundPath}`);
|
|
330
340
|
}
|
|
331
341
|
break; // File found, exit loop
|
|
332
342
|
}
|
|
@@ -335,18 +345,22 @@ export class MinerUClient {
|
|
|
335
345
|
continue;
|
|
336
346
|
}
|
|
337
347
|
}
|
|
338
|
-
// If
|
|
339
|
-
|
|
340
|
-
|
|
348
|
+
// If file found in alternative location, use it
|
|
349
|
+
if (foundPath) {
|
|
350
|
+
filePath = foundPath;
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
// If still not found after trying alternatives, throw original error
|
|
341
354
|
const basePath = this.fileSystem ? this.fileSystem.basePath : 'N/A';
|
|
342
355
|
this.logger.error(`File not found or not readable. ` +
|
|
343
|
-
`Original path: ${
|
|
356
|
+
`Original path: ${originalFilePath}, ` +
|
|
344
357
|
`Resolved path: ${filePath}, ` +
|
|
345
358
|
`Base path: ${basePath}, ` +
|
|
346
359
|
`Tried alternative paths: ${alternativePaths.join(', ')}`, error instanceof Error ? error.stack : error);
|
|
347
360
|
throw new Error(`File not found or not readable: ${filePath}. ` +
|
|
348
|
-
`Original path: ${
|
|
349
|
-
`Base path: ${basePath}`
|
|
361
|
+
`Original path: ${originalFilePath}, ` +
|
|
362
|
+
`Base path: ${basePath}. ` +
|
|
363
|
+
`Tried alternative locations: ${alternativePaths.join(', ')}`);
|
|
350
364
|
}
|
|
351
365
|
}
|
|
352
366
|
else if (error instanceof Error && error.message.includes('empty')) {
|
|
@@ -355,7 +369,6 @@ export class MinerUClient {
|
|
|
355
369
|
}
|
|
356
370
|
else {
|
|
357
371
|
// Re-throw other errors
|
|
358
|
-
// 重新抛出其他错误
|
|
359
372
|
throw error;
|
|
360
373
|
}
|
|
361
374
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformer-mineru.strategy.d.ts","sourceRoot":"","sources":["../../src/lib/transformer-mineru.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAG/D,OAAO,EACL,aAAa,
|
|
1
|
+
{"version":3,"file":"transformer-mineru.strategy.d.ts","sourceRoot":"","sources":["../../src/lib/transformer-mineru.strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAG/D,OAAO,EACL,aAAa,EAGb,oBAAoB,EACpB,4BAA4B,EAC5B,qBAAqB,EAEtB,MAAM,sBAAsB,CAAA;AAI7B,OAAO,EAAgB,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAInE,qBAEa,yBAA0B,YAAW,4BAA4B,CAAC,wBAAwB,CAAC;IAEtG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA2B;IAGxD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAE7C,QAAQ,CAAC,WAAW,mDAWnB;IAED,QAAQ,CAAC,IAAI;;;;;;;;;;;kBAWM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAwE1B;IAED,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpC,kBAAkB,CACtB,SAAS,EAAE,OAAO,CAAC,kBAAkB,CAAC,EAAE,EACxC,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;CAwFzD"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
2
|
import { forwardRef, Inject, Injectable } from '@nestjs/common';
|
|
3
3
|
import { ConfigService } from '@nestjs/config';
|
|
4
|
-
import { DocumentTransformerStrategy, } from '@xpert-ai/plugin-sdk';
|
|
4
|
+
import { DocumentTransformerStrategy, downloadRemoteFile, isRemoteFile, } from '@xpert-ai/plugin-sdk';
|
|
5
5
|
import { isNil, omitBy, pick } from 'lodash-es';
|
|
6
6
|
import { MinerUClient } from './mineru.client.js';
|
|
7
7
|
import { MinerUResultParserService } from './result-parser.service.js';
|
|
8
8
|
import { icon, MinerU } from './types.js';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import fsPromises from 'fs/promises';
|
|
9
11
|
let MinerUTransformerStrategy = class MinerUTransformerStrategy {
|
|
10
12
|
constructor() {
|
|
11
13
|
this.permissions = [
|
|
@@ -113,9 +115,30 @@ let MinerUTransformerStrategy = class MinerUTransformerStrategy {
|
|
|
113
115
|
const parsedResults = [];
|
|
114
116
|
for await (const document of documents) {
|
|
115
117
|
if (mineru.serverType === 'self-hosted') {
|
|
118
|
+
// Handle missing filePath: if filePath is not provided but fileUrl is available,
|
|
119
|
+
// download the file to a temporary directory
|
|
120
|
+
let filePath = document.filePath;
|
|
121
|
+
if (!filePath && document.fileUrl && isRemoteFile(document.fileUrl)) {
|
|
122
|
+
const tempDir = config.tempDir || '/tmp/';
|
|
123
|
+
const fileName = document.name || path.basename(document.fileUrl) || 'document.pdf';
|
|
124
|
+
const tempFilePath = path.join(tempDir, `mineru_${Date.now()}_${fileName}`);
|
|
125
|
+
// Ensure the temp directory exists
|
|
126
|
+
await fsPromises.mkdir(path.dirname(tempFilePath), { recursive: true });
|
|
127
|
+
// Download the remote file to a local temporary directory
|
|
128
|
+
filePath = await downloadRemoteFile(document.fileUrl, tempFilePath);
|
|
129
|
+
}
|
|
130
|
+
else if (!filePath && document.fileUrl && config.permissions?.fileSystem) {
|
|
131
|
+
// If fileUrl is not remote but filePath is missing, try to resolve using fileSystem
|
|
132
|
+
// This handles cases where fileUrl might be a relative path
|
|
133
|
+
filePath = config.permissions.fileSystem.fullPath(document.fileUrl);
|
|
134
|
+
}
|
|
135
|
+
if (!filePath) {
|
|
136
|
+
throw new Error('MinerU self-hosted mode requires filePath to be provided. ' +
|
|
137
|
+
'Either provide filePath in the document, or ensure fileUrl is a valid remote URL that can be downloaded.');
|
|
138
|
+
}
|
|
116
139
|
const { taskId } = await mineru.createTask({
|
|
117
140
|
url: document.fileUrl,
|
|
118
|
-
filePath:
|
|
141
|
+
filePath: filePath,
|
|
119
142
|
fileName: document.name,
|
|
120
143
|
isOcr: true,
|
|
121
144
|
enableFormula: true,
|