@chenchaolong/plugin-mineru 1.1.1 → 1.1.3
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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"}
|
|
@@ -3,10 +3,13 @@ import { getErrorMessage } from '@xpert-ai/plugin-sdk';
|
|
|
3
3
|
import axios from 'axios';
|
|
4
4
|
import FormData from 'form-data';
|
|
5
5
|
import { randomUUID } from 'crypto';
|
|
6
|
-
import { basename } from 'path';
|
|
6
|
+
import { basename, isAbsolute } 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';
|
|
10
13
|
export class MinerUClient {
|
|
11
14
|
get fileSystem() {
|
|
12
15
|
return this.permissions?.fileSystem;
|
|
@@ -182,7 +185,7 @@ export class MinerUClient {
|
|
|
182
185
|
const tokenFromEnv = this.configService.get(tokenEnvKey);
|
|
183
186
|
const baseUrl = baseUrlFromIntegration ||
|
|
184
187
|
baseUrlFromEnv ||
|
|
185
|
-
(this.serverType === 'official' ? DEFAULT_OFFICIAL_BASE_URL :
|
|
188
|
+
(this.serverType === 'official' ? DEFAULT_OFFICIAL_BASE_URL : DEFAULT_SELF_HOSTED_BASE_URL);
|
|
186
189
|
const token = tokenFromIntegration || tokenFromEnv;
|
|
187
190
|
return { baseUrl, token };
|
|
188
191
|
}
|
|
@@ -252,16 +255,53 @@ export class MinerUClient {
|
|
|
252
255
|
}
|
|
253
256
|
async createSelfHostedTask(options) {
|
|
254
257
|
// Validate fileSystem is available for self-hosted mode
|
|
258
|
+
// 验证文件系统是否可用于自托管模式
|
|
255
259
|
if (!this.fileSystem) {
|
|
256
260
|
throw new Error('MinerU self-hosted mode requires fileSystem permission');
|
|
257
261
|
}
|
|
258
262
|
// Validate filePath is provided
|
|
263
|
+
// 验证是否提供了文件路径
|
|
259
264
|
if (!options.filePath) {
|
|
260
265
|
throw new Error('MinerU self-hosted mode requires filePath to be provided');
|
|
261
266
|
}
|
|
262
|
-
//
|
|
263
|
-
|
|
267
|
+
// Resolve absolute file path
|
|
268
|
+
// 解析绝对文件路径
|
|
269
|
+
// Log original filePath for debugging
|
|
270
|
+
// 记录原始 filePath 以便调试
|
|
271
|
+
const basePath = this.fileSystem ? this.fileSystem.basePath : 'N/A';
|
|
272
|
+
this.logger.debug(`Resolving file path. Original filePath: ${options.filePath}, basePath: ${basePath}`);
|
|
273
|
+
// Check if filePath is already an absolute path
|
|
274
|
+
// 检查 filePath 是否已经是绝对路径
|
|
275
|
+
const isAbsolutePath = isAbsolute(options.filePath);
|
|
276
|
+
// 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/') ||
|
|
283
|
+
options.filePath.startsWith('home/'));
|
|
284
|
+
let filePath;
|
|
285
|
+
if (isAbsolutePath) {
|
|
286
|
+
// Use absolute path directly
|
|
287
|
+
// 直接使用绝对路径
|
|
288
|
+
filePath = options.filePath;
|
|
289
|
+
this.logger.debug(`Using absolute path directly: ${filePath}`);
|
|
290
|
+
}
|
|
291
|
+
else if (looksLikeFullPath) {
|
|
292
|
+
// If it looks like a full path but doesn't start with /, add it
|
|
293
|
+
// 如果看起来像完整路径但没有以 / 开头,添加它
|
|
294
|
+
filePath = options.filePath.startsWith('/') ? options.filePath : '/' + options.filePath;
|
|
295
|
+
this.logger.debug(`Detected full path pattern, normalized to: ${filePath}`);
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
// Use xpFileSystem.fullPath() to resolve relative path to absolute path
|
|
299
|
+
// 使用 xpFileSystem.fullPath() 将相对路径解析为绝对路径
|
|
300
|
+
filePath = this.fileSystem.fullPath(options.filePath);
|
|
301
|
+
this.logger.debug(`Resolved relative path using basePath: ${filePath}`);
|
|
302
|
+
}
|
|
264
303
|
// Validate file exists and is readable before attempting to parse
|
|
304
|
+
// 在尝试解析之前验证文件是否存在且可读
|
|
265
305
|
try {
|
|
266
306
|
await fs.promises.access(filePath, fs.constants.F_OK | fs.constants.R_OK);
|
|
267
307
|
const stats = await fs.promises.stat(filePath);
|
|
@@ -275,8 +315,16 @@ export class MinerUClient {
|
|
|
275
315
|
this.logger.error(`File is empty: ${filePath}`);
|
|
276
316
|
throw error;
|
|
277
317
|
}
|
|
278
|
-
|
|
279
|
-
|
|
318
|
+
// Provide more detailed error information
|
|
319
|
+
// 提供更详细的错误信息
|
|
320
|
+
const basePath = this.fileSystem ? this.fileSystem.basePath : 'N/A';
|
|
321
|
+
this.logger.error(`File not found or not readable. ` +
|
|
322
|
+
`Original path: ${options.filePath}, ` +
|
|
323
|
+
`Resolved path: ${filePath}, ` +
|
|
324
|
+
`Base path: ${basePath}`, error instanceof Error ? error.stack : error);
|
|
325
|
+
throw new Error(`File not found or not readable: ${filePath}. ` +
|
|
326
|
+
`Original path: ${options.filePath}, ` +
|
|
327
|
+
`Base path: ${basePath}`);
|
|
280
328
|
}
|
|
281
329
|
const taskId = randomUUID();
|
|
282
330
|
const result = await this.invokeSelfHostedParse(filePath, options.fileName || basename(filePath), options);
|