mineru-open-sdk 0.2.1 โ†’ 0.2.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.
package/README.md CHANGED
@@ -31,7 +31,7 @@ npm install mineru-open-sdk
31
31
 
32
32
  ## ๐Ÿ› ๏ธ Quick Start
33
33
 
34
- ### 1. Flash Extract (Fast, No Auth, Markdown-only)
34
+ ### 1. Flash Extract (Fast, No Auth)
35
35
  Ideal for quick previews. No token required.
36
36
 
37
37
  ```typescript
@@ -119,7 +119,7 @@ console.log(result.images);
119
119
  | **File Limit** | Max 10 MB | Max 200 MB |
120
120
  | **Page Limit** | Max 20 Pages | Max 600 Pages |
121
121
  | **Formats** | PDF, Images, Docx, PPTx, Excel | PDF, Images, Doc/x, Ppt/x, Html |
122
- | **Content** | Markdown only (Placeholders) | Full assets (Images, Tables, Formulas) |
122
+ | **Content** | Markdown (formula & table on by default, OCR off) | Full assets (Images, Tables, Formulas) |
123
123
  | **Output** | Markdown | MD, Docx, LaTeX, HTML, JSON |
124
124
 
125
125
  ---
@@ -165,6 +165,9 @@ These defaults apply to `extract()`, `submit()`, `extractBatch()`, and `submitBa
165
165
  | :--- | :--- | :--- |
166
166
  | `language` | `"ch"` | Chinese is the default |
167
167
  | `pageRange` | `undefined` | Full page range allowed by the flash API |
168
+ | `ocr` | `undefined` | OCR is off (API default) |
169
+ | `formula` | `undefined` | Formula recognition is on (API default) |
170
+ | `table` | `undefined` | Table recognition is on (API default) |
168
171
  | `timeout` | `300` seconds | Max total polling time |
169
172
 
170
173
  ---
package/README.zh-CN.md CHANGED
@@ -31,7 +31,7 @@ npm install mineru-open-sdk
31
31
 
32
32
  ## ๐Ÿ› ๏ธ ๅฟซ้€ŸไธŠๆ‰‹
33
33
 
34
- ### 1. Agent ่ฝป้‡่งฃๆž (Flash Extract - ๅ…็™ปๅฝ•๏ผŒๅชๆ”ฏๆŒ Markdown)
34
+ ### 1. Agent ่ฝป้‡่งฃๆž (Flash Extract - ๅ…็™ปๅฝ•)
35
35
  ้€‚ๅˆๅฟซ้€Ÿ้ข„่งˆใ€‚ๆ— ้œ€้…็ฝฎ Tokenใ€‚
36
36
 
37
37
  ```typescript
@@ -119,7 +119,7 @@ console.log(result.images);
119
119
  | **ๆ–‡ไปถๅคงๅฐไธŠ้™** | ๆœ€ๅคง 10 MB | ๆœ€ๅคง 200 MB |
120
120
  | **ๆ–‡ไปถ้กตๆ•ฐไธŠ้™** | ๆœ€ๅคง 20 ้กต | ๆœ€ๅคง 600 ้กต |
121
121
  | **ๆ”ฏๆŒๆ ผๅผ** | PDF, ๅ›พ็‰‡, Docx, PPTx, Excel | PDF, ๅ›พ็‰‡, Doc/x, Ppt/x, Html |
122
- | **ๅ†…ๅฎนๅฎŒๆ•ดๅบฆ** | ไป…ๆ–‡ๆœฌ (ๅ›พ็‰‡ใ€่กจๆ ผใ€ๅ…ฌๅผๆ˜พ็คบๅ ไฝ็ฌฆ) | ๅฎŒๆ•ด่ต„ๆบ (ๅ›พ็‰‡ใ€่กจๆ ผใ€ๅ…ฌๅผๅ…จ้ƒจไฟ็•™) |
122
+ | **ๅ†…ๅฎนๅฎŒๆ•ดๅบฆ** | Markdown๏ผˆๅ…ฌๅผๅ’Œ่กจๆ ผ้ป˜่ฎคๅผ€ๅฏ๏ผŒOCR ้ป˜่ฎคๅ…ณ้—ญ๏ผ‰ | ๅฎŒๆ•ด่ต„ๆบ (ๅ›พ็‰‡ใ€่กจๆ ผใ€ๅ…ฌๅผๅ…จ้ƒจไฟ็•™) |
123
123
  | **่พ“ๅ‡บๆ ผๅผ** | Markdown | MD, Docx, LaTeX, HTML, JSON |
124
124
 
125
125
  ---
@@ -165,6 +165,9 @@ console.log(result.images);
165
165
  | :--- | :--- | :--- |
166
166
  | `language` | `"ch"` | ้ป˜่ฎคไธญๆ–‡ |
167
167
  | `pageRange` | `undefined` | ้ป˜่ฎคๅค„็† flash API ๅ…่ฎธ็š„ๅฎŒๆ•ด้กต่Œƒๅ›ด |
168
+ | `ocr` | `undefined` | OCR ้ป˜่ฎคๅ…ณ้—ญ๏ผˆAPI ้ป˜่ฎค่กŒไธบ๏ผ‰ |
169
+ | `formula` | `undefined` | ๅ…ฌๅผ่ฏ†ๅˆซ้ป˜่ฎคๅผ€ๅฏ๏ผˆAPI ้ป˜่ฎค่กŒไธบ๏ผ‰ |
170
+ | `table` | `undefined` | ่กจๆ ผ่ฏ†ๅˆซ้ป˜่ฎคๅผ€ๅฏ๏ผˆAPI ้ป˜่ฎค่กŒไธบ๏ผ‰ |
168
171
  | `timeout` | `300` ็ง’ | ๆ€ป่ฝฎ่ฏข่ถ…ๆ—ถ |
169
172
 
170
173
  ---
package/dist/index.cjs CHANGED
@@ -60,6 +60,7 @@ module.exports = __toCommonJS(index_exports);
60
60
  // src/constants.ts
61
61
  var DEFAULT_BASE_URL = "https://mineru.net/api/v4";
62
62
  var DEFAULT_FLASH_BASE_URL = "https://mineru.net/api/v1/agent";
63
+ var UPLOAD_TIMEOUT_MS = 3e5;
63
64
 
64
65
  // src/client.ts
65
66
  var import_promises2 = require("fs/promises");
@@ -222,7 +223,8 @@ var ApiClient = class {
222
223
  async putFile(url, data) {
223
224
  const resp = await fetch(url, {
224
225
  method: "PUT",
225
- body: data
226
+ body: data,
227
+ signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS)
226
228
  });
227
229
  if (!resp.ok) {
228
230
  throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);
@@ -282,7 +284,7 @@ var FlashApiClient = class {
282
284
  return this.handle(resp);
283
285
  }
284
286
  async putFile(url, data) {
285
- const resp = await fetch(url, { method: "PUT", body: data });
287
+ const resp = await fetch(url, { method: "PUT", body: data, signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS) });
286
288
  if (!resp.ok) {
287
289
  throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);
288
290
  }
@@ -738,26 +740,32 @@ var MinerU = class {
738
740
  // Flash (agent) mode
739
741
  // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
740
742
  async flashExtract(source, options = {}) {
741
- const { language = "ch", pageRange, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;
743
+ const { language = "ch", pageRange, ocr, formula, table, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;
742
744
  let taskId;
743
745
  if (isUrl(source)) {
744
- taskId = await this.flashSubmitUrl(source, language, pageRange);
746
+ taskId = await this.flashSubmitUrl(source, language, pageRange, ocr, formula, table);
745
747
  } else {
746
- taskId = await this.flashSubmitFile(source, language, pageRange);
748
+ taskId = await this.flashSubmitFile(source, language, pageRange, ocr, formula, table);
747
749
  }
748
750
  return this.flashWait(taskId, timeout);
749
751
  }
750
752
  // โ”€โ”€ Flash internal helpers โ”€โ”€
751
- async flashSubmitUrl(url, language, pageRange) {
753
+ async flashSubmitUrl(url, language, pageRange, ocr, formula, table) {
752
754
  const payload = { url, language };
753
755
  if (pageRange != null) payload["page_range"] = pageRange;
756
+ if (ocr != null) payload["is_ocr"] = ocr;
757
+ if (formula != null) payload["enable_formula"] = formula;
758
+ if (table != null) payload["enable_table"] = table;
754
759
  const body = await this.flashApi.post("/parse/url", payload);
755
760
  return body.data["task_id"];
756
761
  }
757
- async flashSubmitFile(filePath, language, pageRange) {
762
+ async flashSubmitFile(filePath, language, pageRange, ocr, formula, table) {
758
763
  const fileName = (0, import_node_path2.basename)(filePath);
759
764
  const payload = { file_name: fileName, language };
760
765
  if (pageRange != null) payload["page_range"] = pageRange;
766
+ if (ocr != null) payload["is_ocr"] = ocr;
767
+ if (formula != null) payload["enable_formula"] = formula;
768
+ if (table != null) payload["enable_table"] = table;
761
769
  const body = await this.flashApi.post("/parse/file", payload);
762
770
  const taskId = body.data["task_id"];
763
771
  const fileUrl = body.data["file_url"];
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/client.ts","../src/errors.ts","../src/api.ts","../src/flash-api.ts","../src/models.ts","../src/zip.ts"],"sourcesContent":["export { DEFAULT_BASE_URL, DEFAULT_FLASH_BASE_URL } from \"./constants.js\";\n\nexport { MinerU } from \"./client.js\";\nexport type { ExtractOptions, BatchOptions, FlashExtractOptions, FileParam } from \"./client.js\";\n\nexport type { ExtractResult, Image, Progress } from \"./models.js\";\nexport {\n saveMarkdown,\n saveDocx,\n saveHtml,\n saveLatex,\n saveAll,\n progressPercent,\n progressToString,\n} from \"./models.js\";\n\nexport {\n MinerUError,\n AuthError,\n ParamError,\n FileTooLargeError,\n PageLimitError,\n TaskNotFoundError,\n ExtractFailedError,\n TimeoutError,\n QuotaExceededError,\n FlashFileTooLargeError,\n FlashUnsupportedTypeError,\n FlashPageLimitError,\n FlashParamError,\n NoAuthClientError,\n} from \"./errors.js\";\n","export const DEFAULT_BASE_URL = \"https://mineru.net/api/v4\";\n\nexport const DEFAULT_FLASH_BASE_URL = \"https://mineru.net/api/v1/agent\";\n","import { readFile } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\n\nimport { ApiClient } from \"./api.js\";\nimport { DEFAULT_BASE_URL } from \"./constants.js\";\nimport { NoAuthClientError, TimeoutError } from \"./errors.js\";\nimport { FlashApiClient } from \"./flash-api.js\";\nimport type { ExtractResult, Progress } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\nimport { parseZip } from \"./zip.js\";\n\nconst MODEL_MAP: Record<string, string> = {\n pipeline: \"pipeline\",\n vlm: \"vlm\",\n html: \"MinerU-HTML\",\n};\n\nconst HTML_EXTENSIONS = new Set([\".html\", \".htm\"]);\n\nconst DEFAULT_SOURCE = \"open-api-sdk-js\";\n\n/** Default total business timeouts for extraction tasks (in seconds). */\nconst DEFAULT_TIMEOUT_POLL_SINGLE = 300;\nconst DEFAULT_TIMEOUT_POLL_BATCH = 1800;\n\nfunction isUrl(source: string): boolean {\n return source.startsWith(\"http://\") || source.startsWith(\"https://\");\n}\n\nfunction getExtension(source: string): string {\n if (isUrl(source)) {\n const path = source.split(\"?\")[0]!.split(\"#\")[0]!;\n const dot = path.lastIndexOf(\".\");\n return dot === -1 ? \"\" : path.slice(dot).toLowerCase();\n }\n return extname(source).toLowerCase();\n}\n\nfunction inferModel(source: string): string {\n return HTML_EXTENSIONS.has(getExtension(source)) ? \"MinerU-HTML\" : \"vlm\";\n}\n\nfunction resolveModel(model: string | undefined, source: string): string {\n if (model != null) {\n return MODEL_MAP[model] ?? model;\n }\n return inferModel(source);\n}\n\nexport interface ExtractOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n pages?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\nexport interface BatchOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for all tasks (polling). */\n timeout?: number;\n}\n\nexport interface FlashExtractOptions {\n language?: string;\n pageRange?: string;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\n/** Per-file parameter overrides for batch methods. */\nexport interface FileParam {\n /** Override page_ranges for this file (e.g. \"1-10,15\"). */\n pages?: string;\n /** Override is_ocr for this file. */\n ocr?: boolean;\n /** Set data_id for this file. */\n dataId?: string;\n}\n\n/** Only includes fields the user explicitly set. Never assumes API defaults. */\nfunction buildApiOptions(\n modelVersion: string,\n opts: ExtractOptions | BatchOptions,\n): Record<string, unknown> {\n const o: Record<string, unknown> = { model_version: modelVersion };\n if (opts.formula !== undefined) o[\"enable_formula\"] = opts.formula;\n if (opts.table !== undefined) o[\"enable_table\"] = opts.table;\n if (opts.language !== undefined) o[\"language\"] = opts.language;\n if (opts.extraFormats?.length) {\n o[\"extra_formats\"] = opts.extraFormats;\n }\n return o;\n}\n\n/** Adds per-file fields (is_ocr, page_ranges, data_id) to a file entry. */\nfunction applyFileFields(\n entry: Record<string, unknown>,\n key: string,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n): void {\n const fp = fileParams?.[key];\n\n // OCR: per-file overrides global\n const effectiveOcr = fp?.ocr !== undefined ? fp.ocr : ocr;\n if (effectiveOcr !== undefined) entry[\"is_ocr\"] = effectiveOcr;\n\n // Pages: per-file overrides global\n const effectivePages = fp?.pages || pages;\n if (effectivePages) entry[\"page_ranges\"] = effectivePages;\n\n // DataID: per-file only\n if (fp?.dataId) entry[\"data_id\"] = fp.dataId;\n}\n\nfunction parseTaskResult(data: Record<string, unknown>): ExtractResult {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n result.filename = (data[\"file_name\"] as string) ?? null;\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n result.zipUrl = (data[\"full_zip_url\"] as string) ?? null;\n\n const ep = data[\"extract_progress\"] as Record<string, unknown> | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n } satisfies Progress;\n }\n return result;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * MinerU API client. Turn documents into Markdown with one method call.\n */\nexport class MinerU {\n private readonly api: ApiClient | null;\n private readonly flashApi: FlashApiClient;\n\n /**\n * @param token - API token.\n * @param baseUrl - API base URL.\n * @param flashBaseUrl - Flash API base URL.\n */\n constructor(\n token?: string,\n baseUrl = DEFAULT_BASE_URL,\n flashBaseUrl?: string,\n ) {\n const resolved = token ?? process.env[\"MINERU_TOKEN\"];\n if (resolved) {\n // ApiClient should ideally use DEFAULT_TIMEOUT_REQUEST internally\n this.api = new ApiClient(resolved, baseUrl, DEFAULT_SOURCE);\n } else {\n this.api = null; // flash-only mode\n }\n this.flashApi = new FlashApiClient(flashBaseUrl, DEFAULT_SOURCE);\n }\n\n setSource(source: string): void {\n if (this.api !== null) {\n this.api.setSource(source);\n }\n this.flashApi.setSource(source);\n }\n\n private requireAuth(): ApiClient {\n if (this.api === null) {\n throw new NoAuthClientError();\n }\n return this.api;\n }\n\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n // Synchronous (blocking) methods\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n\n async extract(\n source: string,\n options: ExtractOptions = {},\n ): Promise<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_SINGLE, ...opts } = options;\n const modelVersion = resolveModel(opts.model, source);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n let batchId: string;\n if (isUrl(source)) {\n batchId = await this.submitUrlsBatch([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n } else {\n batchId = await this.uploadAndSubmit([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n }\n const results = await this.waitBatch(batchId, timeout);\n return results[0]!;\n }\n\n async *extractBatch(\n sources: string[],\n options: BatchOptions = {},\n ): AsyncGenerator<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_BATCH, ...opts } = options;\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(opts.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n const batchIds: string[] = [];\n if (urls.length > 0) {\n batchIds.push(await this.submitUrlsBatch(urls, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n if (files.length > 0) {\n batchIds.push(await this.uploadAndSubmit(files, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n\n yield* this.yieldBatch(batchIds, sources.length, timeout);\n }\n\n async crawl(\n url: string,\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): Promise<ExtractResult> {\n return this.extract(url, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_SINGLE, ...options });\n }\n\n async *crawlBatch(\n urls: string[],\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): AsyncGenerator<ExtractResult> {\n yield* this.extractBatch(urls, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_BATCH, ...options });\n }\n\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n // Async primitives (no polling, no waiting)\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n\n async submit(\n source: string,\n options: Omit<ExtractOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const modelVersion = resolveModel(options.model, source);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n if (isUrl(source)) {\n return this.submitUrlsBatch([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n return this.uploadAndSubmit([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n\n async submitBatch(\n sources: string[],\n options: Omit<BatchOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(options.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n if (urls.length === 0 && files.length === 0) {\n throw new Error(\"No sources provided.\");\n }\n if (urls.length > 0 && files.length > 0) {\n throw new Error(\n \"submitBatch() does not support mixing URLs and local files in one call. \" +\n \"Please submit them separately or use extractBatch() instead.\",\n );\n }\n\n if (urls.length > 0) {\n return this.submitUrlsBatch(urls, apiOpts, options.ocr, undefined, options.fileParams);\n }\n return this.uploadAndSubmit(files, apiOpts, options.ocr, undefined, options.fileParams);\n }\n\n async getTask(taskId: string): Promise<ExtractResult> {\n const api = this.requireAuth();\n const body = await api.get(`/extract/task/${taskId}`);\n const result = parseTaskResult(body.data);\n if (result.state === \"done\" && result.zipUrl) {\n return this.downloadAndParse(result);\n }\n return result;\n }\n\n async getBatch(batchId: string): Promise<ExtractResult[]> {\n const api = this.requireAuth();\n const body = await api.get(`/extract-results/batch/${batchId}`);\n const items = (body.data[\"extract_result\"] as Record<string, unknown>[]) ?? [];\n const results: ExtractResult[] = [];\n for (const item of items) {\n let r = parseTaskResult(item);\n if (r.state === \"done\" && r.zipUrl) {\n r = await this.downloadAndParse(r);\n }\n results.push(r);\n }\n return results;\n }\n\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n // Internal helpers\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n\n private async submitUrlsBatch(\n urls: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const files = urls.map((u) => {\n const entry: Record<string, unknown> = { url: u };\n applyFileFields(entry, u, ocr, pages, fileParams);\n return entry;\n });\n const body = await this.requireAuth().post(\"/extract/task/batch\", {\n files,\n ...opts,\n });\n return body.data[\"batch_id\"] as string;\n }\n\n private async uploadAndSubmit(\n filePaths: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const api = this.requireAuth();\n const filesMeta = filePaths.map((p) => {\n const entry: Record<string, unknown> = { name: basename(p) };\n applyFileFields(entry, p, ocr, pages, fileParams);\n return entry;\n });\n const body = await api.post(\"/file-urls/batch\", {\n files: filesMeta,\n ...opts,\n });\n const batchId = body.data[\"batch_id\"] as string;\n const uploadUrls = body.data[\"file_urls\"] as string[];\n\n for (let i = 0; i < filePaths.length; i++) {\n const data = await readFile(filePaths[i]!);\n await api.putFile(uploadUrls[i]!, new Uint8Array(data));\n }\n\n return batchId;\n }\n\n private async downloadAndParse(\n result: ExtractResult,\n ): Promise<ExtractResult> {\n const zipBytes = await this.requireAuth().download(result.zipUrl!);\n const parsed = parseZip(zipBytes, result.taskId, result.filename);\n parsed.zipUrl = result.zipUrl;\n return parsed;\n }\n\n private async waitBatch(\n batchId: string,\n timeout: number,\n ): Promise<ExtractResult[]> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const results = await this.getBatch(batchId);\n if (results.every((r) => r.state === \"done\" || r.state === \"failed\")) {\n return results;\n }\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchId);\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async *yieldBatch(\n batchIds: string[],\n total: number,\n timeout: number,\n ): AsyncGenerator<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n const yielded = new Set<string>();\n let interval = 2000;\n\n while (yielded.size < total) {\n for (const bid of batchIds) {\n const results = await this.getBatch(bid);\n for (let idx = 0; idx < results.length; idx++) {\n const key = `${bid}:${idx}`;\n const r = results[idx]!;\n if (!yielded.has(key) && (r.state === \"done\" || r.state === \"failed\")) {\n yielded.add(key);\n yield r;\n }\n }\n }\n\n if (yielded.size >= total) break;\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchIds.join(\",\"));\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n // Flash (agent) mode\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n\n async flashExtract(\n source: string,\n options: FlashExtractOptions = {},\n ): Promise<ExtractResult> {\n const { language = \"ch\", pageRange, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;\n\n let taskId: string;\n if (isUrl(source)) {\n taskId = await this.flashSubmitUrl(source, language, pageRange);\n } else {\n taskId = await this.flashSubmitFile(source, language, pageRange);\n }\n\n return this.flashWait(taskId, timeout);\n }\n\n // โ”€โ”€ Flash internal helpers โ”€โ”€\n\n private async flashSubmitUrl(\n url: string,\n language: string,\n pageRange?: string,\n ): Promise<string> {\n const payload: Record<string, unknown> = { url, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n const body = await this.flashApi.post(\"/parse/url\", payload);\n return body.data[\"task_id\"] as string;\n }\n\n private async flashSubmitFile(\n filePath: string,\n language: string,\n pageRange?: string,\n ): Promise<string> {\n const fileName = basename(filePath);\n const payload: Record<string, unknown> = { file_name: fileName, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n const body = await this.flashApi.post(\"/parse/file\", payload);\n const taskId = body.data[\"task_id\"] as string;\n const fileUrl = body.data[\"file_url\"] as string;\n\n const data = await readFile(filePath);\n await this.flashApi.putFile(fileUrl, new Uint8Array(data));\n return taskId;\n }\n\n private async flashWait(\n taskId: string,\n timeout: number,\n ): Promise<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const result = await this.flashGetTask(taskId);\n if (result.state === \"done\" || result.state === \"failed\") return result;\n if (Date.now() > deadline) throw new TimeoutError(timeout, taskId);\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async flashGetTask(taskId: string): Promise<ExtractResult> {\n const body = await this.flashApi.get(`/parse/${taskId}`);\n return this.parseFlashTask(body.data);\n }\n\n private async parseFlashTask(\n data: Record<string, unknown>,\n ): Promise<ExtractResult> {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n\n const ep = data[\"extract_progress\"] as\n | Record<string, unknown>\n | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n };\n }\n\n if (result.state === \"done\" && data[\"markdown_url\"]) {\n result.markdown = await this.flashApi.downloadText(\n data[\"markdown_url\"] as string,\n );\n }\n\n return result;\n }\n}\n","export class MinerUError extends Error {\n readonly code: string;\n readonly traceId: string;\n\n constructor(code: string | number, message: string, traceId = \"\") {\n const tag = traceId ? ` (trace: ${traceId})` : \"\";\n super(`[${code}] ${message}${tag}`);\n this.name = \"MinerUError\";\n this.code = String(code);\n this.traceId = traceId;\n }\n}\n\nexport class AuthError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"AuthError\";\n }\n}\n\nexport class ParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ParamError\";\n }\n}\n\nexport class FileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FileTooLargeError\";\n }\n}\n\nexport class PageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"PageLimitError\";\n }\n}\n\nexport class TaskNotFoundError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"TaskNotFoundError\";\n }\n}\n\nexport class ExtractFailedError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ExtractFailedError\";\n }\n}\n\nexport class TimeoutError extends MinerUError {\n readonly timeout: number;\n readonly taskId: string;\n\n constructor(timeout: number, taskId: string) {\n super(\"TIMEOUT\", `Task ${taskId} did not complete within ${timeout}s`);\n this.name = \"TimeoutError\";\n this.timeout = timeout;\n this.taskId = taskId;\n }\n}\n\nexport class QuotaExceededError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"QuotaExceededError\";\n }\n}\n\n// Flash API specific errors\n\nexport class FlashFileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashFileTooLargeError\";\n }\n}\n\nexport class FlashUnsupportedTypeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashUnsupportedTypeError\";\n }\n}\n\nexport class FlashPageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashPageLimitError\";\n }\n}\n\nexport class FlashParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashParamError\";\n }\n}\n\nexport class NoAuthClientError extends MinerUError {\n constructor() {\n super(\n \"-1\",\n \"This operation requires an authenticated client; pass token to MinerU() or set MINERU_TOKEN env var.\",\n );\n this.name = \"NoAuthClientError\";\n }\n}\n\nconst CODE_TO_ERROR: Record<string, typeof MinerUError> = {\n A0202: AuthError,\n A0211: AuthError,\n \"-500\": ParamError,\n \"-10002\": ParamError,\n \"-60005\": FileTooLargeError,\n \"-60006\": PageLimitError,\n \"-60010\": ExtractFailedError,\n \"-60012\": TaskNotFoundError,\n \"-60013\": MinerUError,\n \"-60018\": QuotaExceededError,\n \"-60019\": QuotaExceededError,\n \"-30001\": FlashFileTooLargeError,\n \"-30002\": FlashUnsupportedTypeError,\n \"-30003\": FlashPageLimitError,\n \"-30004\": FlashParamError,\n};\n\nexport function raiseForCode(\n code: number | string,\n msg: string,\n traceId = \"\",\n): never {\n const ErrorClass = CODE_TO_ERROR[String(code)] ?? MinerUError;\n throw new ErrorClass(code, msg, traceId);\n}\n","import { raiseForCode } from \"./errors.js\";\n\ninterface ApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class ApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(token: string, baseUrl: string, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<ApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<ApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n headers: this.headers,\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, {\n method: \"PUT\",\n body: data,\n });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async download(url: string): Promise<Uint8Array> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return new Uint8Array(await resp.arrayBuffer());\n }\n\n private async handle(resp: Response): Promise<ApiResponse> {\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` โ€” ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as ApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { raiseForCode } from \"./errors.js\";\nimport { DEFAULT_FLASH_BASE_URL } from \"./constants.js\";\n\ninterface FlashApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class FlashApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(baseUrl: string = DEFAULT_FLASH_BASE_URL, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = { \"Content-Type\": \"application/json\" };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<FlashApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<FlashApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, { method: \"PUT\", body: data });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async downloadText(url: string): Promise<string> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return resp.text();\n }\n\n private async handle(resp: Response): Promise<FlashApiResponse> {\n if (resp.status === 429) {\n raiseForCode(\n \"RATE_LIMITED\",\n \"flash API rate limit exceeded; try again later\",\n );\n }\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` โ€” ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as FlashApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nexport interface Image {\n name: string;\n data: Uint8Array;\n path: string;\n}\n\nexport interface Progress {\n extractedPages: number;\n totalPages: number;\n startTime: string;\n}\n\nexport function progressPercent(p: Progress): number {\n if (p.totalPages === 0) return 0;\n return (p.extractedPages / p.totalPages) * 100;\n}\n\nexport function progressToString(p: Progress): string {\n return `${p.extractedPages}/${p.totalPages} (${progressPercent(p).toFixed(0)}%)`;\n}\n\nexport interface ExtractResult {\n taskId: string;\n state: string;\n filename: string | null;\n errCode: string;\n error: string | null;\n zipUrl: string | null;\n\n progress: Progress | null;\n\n markdown: string | null;\n contentList: Record<string, unknown>[] | null;\n images: Image[];\n\n docx: Uint8Array | null;\n html: string | null;\n latex: string | null;\n\n /** @internal */\n _zipBytes: Uint8Array | null;\n}\n\nexport function createEmptyResult(\n taskId: string,\n state: string,\n): ExtractResult {\n return {\n taskId,\n state,\n filename: null,\n errCode: \"\",\n error: null,\n zipUrl: null,\n progress: null,\n markdown: null,\n contentList: null,\n images: [],\n docx: null,\n html: null,\n latex: null,\n _zipBytes: null,\n };\n}\n\nasync function ensureDir(filePath: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n}\n\nexport async function saveMarkdown(\n result: ExtractResult,\n path: string,\n withImages = true,\n): Promise<void> {\n if (result.markdown == null) {\n throw new Error(\"No markdown content available (state != done)\");\n }\n await ensureDir(path);\n await writeFile(path, result.markdown, \"utf-8\");\n if (withImages && result.images.length > 0) {\n const imgDir = join(dirname(path), \"images\");\n await mkdir(imgDir, { recursive: true });\n for (const img of result.images) {\n await writeFile(join(imgDir, img.name), img.data);\n }\n }\n}\n\nexport async function saveDocx(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.docx == null) {\n throw new Error(\n \"No docx content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.docx);\n}\n\nexport async function saveHtml(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.html == null) {\n throw new Error(\n \"No html content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.html, \"utf-8\");\n}\n\nexport async function saveLatex(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.latex == null) {\n throw new Error(\n \"No latex content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.latex, \"utf-8\");\n}\n\nexport async function saveAll(\n result: ExtractResult,\n dir: string,\n): Promise<void> {\n if (result._zipBytes == null) {\n throw new Error(\"No zip data available (state != done)\");\n }\n const { unzipSync } = await import(\"fflate\");\n const entries = unzipSync(new Uint8Array(result._zipBytes));\n await mkdir(dir, { recursive: true });\n for (const [relativePath, content] of Object.entries(entries)) {\n if (relativePath.endsWith(\"/\")) continue;\n const fullPath = join(dir, relativePath);\n await ensureDir(fullPath);\n await writeFile(fullPath, content);\n }\n}\n","import { unzipSync } from \"fflate\";\nimport type { ExtractResult, Image } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\n\nconst IMAGE_EXTENSIONS = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\", \".svg\", \".webp\",\n]);\n\nfunction extname(filename: string): string {\n const dot = filename.lastIndexOf(\".\");\n return dot === -1 ? \"\" : filename.slice(dot).toLowerCase();\n}\n\nfunction basename(filepath: string): string {\n const parts = filepath.replace(/\\\\/g, \"/\").split(\"/\");\n return parts[parts.length - 1] ?? \"\";\n}\n\nexport function parseZip(\n zipBytes: Uint8Array,\n taskId: string,\n filename: string | null = null,\n): ExtractResult {\n const result = createEmptyResult(taskId, \"done\");\n result.filename = filename;\n result._zipBytes = zipBytes;\n\n const entries = unzipSync(zipBytes);\n const images: Image[] = [];\n let contentList: Record<string, unknown>[] | null = null;\n\n for (const [relPath, data] of Object.entries(entries)) {\n if (relPath.endsWith(\"/\")) continue;\n\n const name = basename(relPath);\n const ext = extname(name);\n const text = () => new TextDecoder().decode(data);\n\n if (ext === \".md\") {\n result.markdown = text();\n } else if (\n name.endsWith(\"_content_list.json\") ||\n name === \"content_list.json\"\n ) {\n contentList = JSON.parse(text()) as Record<string, unknown>[];\n } else if (ext === \".json\" && contentList == null) {\n try {\n const parsed: unknown = JSON.parse(text());\n if (Array.isArray(parsed)) {\n contentList = parsed as Record<string, unknown>[];\n }\n } catch {\n // not a valid JSON array โ€” skip\n }\n } else if (IMAGE_EXTENSIONS.has(ext)) {\n images.push({ name, data: new Uint8Array(data), path: relPath });\n } else if (ext === \".docx\") {\n result.docx = new Uint8Array(data);\n } else if (ext === \".html\" || ext === \".htm\") {\n result.html = text();\n } else if (ext === \".tex\") {\n result.latex = text();\n }\n }\n\n result.contentList = contentList;\n result.images = images;\n return result;\n}\n"],"mappings":"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","names":["import_promises","import_node_path","unzipSync"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/client.ts","../src/errors.ts","../src/api.ts","../src/flash-api.ts","../src/models.ts","../src/zip.ts"],"sourcesContent":["export { DEFAULT_BASE_URL, DEFAULT_FLASH_BASE_URL } from \"./constants.js\";\n\nexport { MinerU } from \"./client.js\";\nexport type { ExtractOptions, BatchOptions, FlashExtractOptions, FileParam } from \"./client.js\";\n\nexport type { ExtractResult, Image, Progress } from \"./models.js\";\nexport {\n saveMarkdown,\n saveDocx,\n saveHtml,\n saveLatex,\n saveAll,\n progressPercent,\n progressToString,\n} from \"./models.js\";\n\nexport {\n MinerUError,\n AuthError,\n ParamError,\n FileTooLargeError,\n PageLimitError,\n TaskNotFoundError,\n ExtractFailedError,\n TimeoutError,\n QuotaExceededError,\n FlashFileTooLargeError,\n FlashUnsupportedTypeError,\n FlashPageLimitError,\n FlashParamError,\n NoAuthClientError,\n} from \"./errors.js\";\n","export const DEFAULT_BASE_URL = \"https://mineru.net/api/v4\";\n\nexport const DEFAULT_FLASH_BASE_URL = \"https://mineru.net/api/v1/agent\";\n\n/** Timeout for file uploads in milliseconds (PUT to pre-signed URL). */\nexport const UPLOAD_TIMEOUT_MS = 300_000;\n","import { readFile } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\n\nimport { ApiClient } from \"./api.js\";\nimport { DEFAULT_BASE_URL } from \"./constants.js\";\nimport { NoAuthClientError, TimeoutError } from \"./errors.js\";\nimport { FlashApiClient } from \"./flash-api.js\";\nimport type { ExtractResult, Progress } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\nimport { parseZip } from \"./zip.js\";\n\nconst MODEL_MAP: Record<string, string> = {\n pipeline: \"pipeline\",\n vlm: \"vlm\",\n html: \"MinerU-HTML\",\n};\n\nconst HTML_EXTENSIONS = new Set([\".html\", \".htm\"]);\n\nconst DEFAULT_SOURCE = \"open-api-sdk-js\";\n\n/** Default total business timeouts for extraction tasks (in seconds). */\nconst DEFAULT_TIMEOUT_POLL_SINGLE = 300;\nconst DEFAULT_TIMEOUT_POLL_BATCH = 1800;\n\nfunction isUrl(source: string): boolean {\n return source.startsWith(\"http://\") || source.startsWith(\"https://\");\n}\n\nfunction getExtension(source: string): string {\n if (isUrl(source)) {\n const path = source.split(\"?\")[0]!.split(\"#\")[0]!;\n const dot = path.lastIndexOf(\".\");\n return dot === -1 ? \"\" : path.slice(dot).toLowerCase();\n }\n return extname(source).toLowerCase();\n}\n\nfunction inferModel(source: string): string {\n return HTML_EXTENSIONS.has(getExtension(source)) ? \"MinerU-HTML\" : \"vlm\";\n}\n\nfunction resolveModel(model: string | undefined, source: string): string {\n if (model != null) {\n return MODEL_MAP[model] ?? model;\n }\n return inferModel(source);\n}\n\nexport interface ExtractOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n pages?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\nexport interface BatchOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for all tasks (polling). */\n timeout?: number;\n}\n\nexport interface FlashExtractOptions {\n language?: string;\n pageRange?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\n/** Per-file parameter overrides for batch methods. */\nexport interface FileParam {\n /** Override page_ranges for this file (e.g. \"1-10,15\"). */\n pages?: string;\n /** Override is_ocr for this file. */\n ocr?: boolean;\n /** Set data_id for this file. */\n dataId?: string;\n}\n\n/** Only includes fields the user explicitly set. Never assumes API defaults. */\nfunction buildApiOptions(\n modelVersion: string,\n opts: ExtractOptions | BatchOptions,\n): Record<string, unknown> {\n const o: Record<string, unknown> = { model_version: modelVersion };\n if (opts.formula !== undefined) o[\"enable_formula\"] = opts.formula;\n if (opts.table !== undefined) o[\"enable_table\"] = opts.table;\n if (opts.language !== undefined) o[\"language\"] = opts.language;\n if (opts.extraFormats?.length) {\n o[\"extra_formats\"] = opts.extraFormats;\n }\n return o;\n}\n\n/** Adds per-file fields (is_ocr, page_ranges, data_id) to a file entry. */\nfunction applyFileFields(\n entry: Record<string, unknown>,\n key: string,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n): void {\n const fp = fileParams?.[key];\n\n // OCR: per-file overrides global\n const effectiveOcr = fp?.ocr !== undefined ? fp.ocr : ocr;\n if (effectiveOcr !== undefined) entry[\"is_ocr\"] = effectiveOcr;\n\n // Pages: per-file overrides global\n const effectivePages = fp?.pages || pages;\n if (effectivePages) entry[\"page_ranges\"] = effectivePages;\n\n // DataID: per-file only\n if (fp?.dataId) entry[\"data_id\"] = fp.dataId;\n}\n\nfunction parseTaskResult(data: Record<string, unknown>): ExtractResult {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n result.filename = (data[\"file_name\"] as string) ?? null;\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n result.zipUrl = (data[\"full_zip_url\"] as string) ?? null;\n\n const ep = data[\"extract_progress\"] as Record<string, unknown> | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n } satisfies Progress;\n }\n return result;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * MinerU API client. Turn documents into Markdown with one method call.\n */\nexport class MinerU {\n private readonly api: ApiClient | null;\n private readonly flashApi: FlashApiClient;\n\n /**\n * @param token - API token.\n * @param baseUrl - API base URL.\n * @param flashBaseUrl - Flash API base URL.\n */\n constructor(\n token?: string,\n baseUrl = DEFAULT_BASE_URL,\n flashBaseUrl?: string,\n ) {\n const resolved = token ?? process.env[\"MINERU_TOKEN\"];\n if (resolved) {\n // ApiClient should ideally use DEFAULT_TIMEOUT_REQUEST internally\n this.api = new ApiClient(resolved, baseUrl, DEFAULT_SOURCE);\n } else {\n this.api = null; // flash-only mode\n }\n this.flashApi = new FlashApiClient(flashBaseUrl, DEFAULT_SOURCE);\n }\n\n setSource(source: string): void {\n if (this.api !== null) {\n this.api.setSource(source);\n }\n this.flashApi.setSource(source);\n }\n\n private requireAuth(): ApiClient {\n if (this.api === null) {\n throw new NoAuthClientError();\n }\n return this.api;\n }\n\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n // Synchronous (blocking) methods\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n\n async extract(\n source: string,\n options: ExtractOptions = {},\n ): Promise<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_SINGLE, ...opts } = options;\n const modelVersion = resolveModel(opts.model, source);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n let batchId: string;\n if (isUrl(source)) {\n batchId = await this.submitUrlsBatch([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n } else {\n batchId = await this.uploadAndSubmit([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n }\n const results = await this.waitBatch(batchId, timeout);\n return results[0]!;\n }\n\n async *extractBatch(\n sources: string[],\n options: BatchOptions = {},\n ): AsyncGenerator<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_BATCH, ...opts } = options;\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(opts.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n const batchIds: string[] = [];\n if (urls.length > 0) {\n batchIds.push(await this.submitUrlsBatch(urls, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n if (files.length > 0) {\n batchIds.push(await this.uploadAndSubmit(files, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n\n yield* this.yieldBatch(batchIds, sources.length, timeout);\n }\n\n async crawl(\n url: string,\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): Promise<ExtractResult> {\n return this.extract(url, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_SINGLE, ...options });\n }\n\n async *crawlBatch(\n urls: string[],\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): AsyncGenerator<ExtractResult> {\n yield* this.extractBatch(urls, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_BATCH, ...options });\n }\n\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n // Async primitives (no polling, no waiting)\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n\n async submit(\n source: string,\n options: Omit<ExtractOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const modelVersion = resolveModel(options.model, source);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n if (isUrl(source)) {\n return this.submitUrlsBatch([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n return this.uploadAndSubmit([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n\n async submitBatch(\n sources: string[],\n options: Omit<BatchOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(options.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n if (urls.length === 0 && files.length === 0) {\n throw new Error(\"No sources provided.\");\n }\n if (urls.length > 0 && files.length > 0) {\n throw new Error(\n \"submitBatch() does not support mixing URLs and local files in one call. \" +\n \"Please submit them separately or use extractBatch() instead.\",\n );\n }\n\n if (urls.length > 0) {\n return this.submitUrlsBatch(urls, apiOpts, options.ocr, undefined, options.fileParams);\n }\n return this.uploadAndSubmit(files, apiOpts, options.ocr, undefined, options.fileParams);\n }\n\n async getTask(taskId: string): Promise<ExtractResult> {\n const api = this.requireAuth();\n const body = await api.get(`/extract/task/${taskId}`);\n const result = parseTaskResult(body.data);\n if (result.state === \"done\" && result.zipUrl) {\n return this.downloadAndParse(result);\n }\n return result;\n }\n\n async getBatch(batchId: string): Promise<ExtractResult[]> {\n const api = this.requireAuth();\n const body = await api.get(`/extract-results/batch/${batchId}`);\n const items = (body.data[\"extract_result\"] as Record<string, unknown>[]) ?? [];\n const results: ExtractResult[] = [];\n for (const item of items) {\n let r = parseTaskResult(item);\n if (r.state === \"done\" && r.zipUrl) {\n r = await this.downloadAndParse(r);\n }\n results.push(r);\n }\n return results;\n }\n\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n // Internal helpers\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n\n private async submitUrlsBatch(\n urls: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const files = urls.map((u) => {\n const entry: Record<string, unknown> = { url: u };\n applyFileFields(entry, u, ocr, pages, fileParams);\n return entry;\n });\n const body = await this.requireAuth().post(\"/extract/task/batch\", {\n files,\n ...opts,\n });\n return body.data[\"batch_id\"] as string;\n }\n\n private async uploadAndSubmit(\n filePaths: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const api = this.requireAuth();\n const filesMeta = filePaths.map((p) => {\n const entry: Record<string, unknown> = { name: basename(p) };\n applyFileFields(entry, p, ocr, pages, fileParams);\n return entry;\n });\n const body = await api.post(\"/file-urls/batch\", {\n files: filesMeta,\n ...opts,\n });\n const batchId = body.data[\"batch_id\"] as string;\n const uploadUrls = body.data[\"file_urls\"] as string[];\n\n for (let i = 0; i < filePaths.length; i++) {\n const data = await readFile(filePaths[i]!);\n await api.putFile(uploadUrls[i]!, new Uint8Array(data));\n }\n\n return batchId;\n }\n\n private async downloadAndParse(\n result: ExtractResult,\n ): Promise<ExtractResult> {\n const zipBytes = await this.requireAuth().download(result.zipUrl!);\n const parsed = parseZip(zipBytes, result.taskId, result.filename);\n parsed.zipUrl = result.zipUrl;\n return parsed;\n }\n\n private async waitBatch(\n batchId: string,\n timeout: number,\n ): Promise<ExtractResult[]> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const results = await this.getBatch(batchId);\n if (results.every((r) => r.state === \"done\" || r.state === \"failed\")) {\n return results;\n }\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchId);\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async *yieldBatch(\n batchIds: string[],\n total: number,\n timeout: number,\n ): AsyncGenerator<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n const yielded = new Set<string>();\n let interval = 2000;\n\n while (yielded.size < total) {\n for (const bid of batchIds) {\n const results = await this.getBatch(bid);\n for (let idx = 0; idx < results.length; idx++) {\n const key = `${bid}:${idx}`;\n const r = results[idx]!;\n if (!yielded.has(key) && (r.state === \"done\" || r.state === \"failed\")) {\n yielded.add(key);\n yield r;\n }\n }\n }\n\n if (yielded.size >= total) break;\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchIds.join(\",\"));\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n // Flash (agent) mode\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n\n async flashExtract(\n source: string,\n options: FlashExtractOptions = {},\n ): Promise<ExtractResult> {\n const { language = \"ch\", pageRange, ocr, formula, table, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;\n\n let taskId: string;\n if (isUrl(source)) {\n taskId = await this.flashSubmitUrl(source, language, pageRange, ocr, formula, table);\n } else {\n taskId = await this.flashSubmitFile(source, language, pageRange, ocr, formula, table);\n }\n\n return this.flashWait(taskId, timeout);\n }\n\n // โ”€โ”€ Flash internal helpers โ”€โ”€\n\n private async flashSubmitUrl(\n url: string,\n language: string,\n pageRange?: string,\n ocr?: boolean,\n formula?: boolean,\n table?: boolean,\n ): Promise<string> {\n const payload: Record<string, unknown> = { url, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n if (ocr != null) payload[\"is_ocr\"] = ocr;\n if (formula != null) payload[\"enable_formula\"] = formula;\n if (table != null) payload[\"enable_table\"] = table;\n const body = await this.flashApi.post(\"/parse/url\", payload);\n return body.data[\"task_id\"] as string;\n }\n\n private async flashSubmitFile(\n filePath: string,\n language: string,\n pageRange?: string,\n ocr?: boolean,\n formula?: boolean,\n table?: boolean,\n ): Promise<string> {\n const fileName = basename(filePath);\n const payload: Record<string, unknown> = { file_name: fileName, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n if (ocr != null) payload[\"is_ocr\"] = ocr;\n if (formula != null) payload[\"enable_formula\"] = formula;\n if (table != null) payload[\"enable_table\"] = table;\n const body = await this.flashApi.post(\"/parse/file\", payload);\n const taskId = body.data[\"task_id\"] as string;\n const fileUrl = body.data[\"file_url\"] as string;\n\n const data = await readFile(filePath);\n await this.flashApi.putFile(fileUrl, new Uint8Array(data));\n return taskId;\n }\n\n private async flashWait(\n taskId: string,\n timeout: number,\n ): Promise<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const result = await this.flashGetTask(taskId);\n if (result.state === \"done\" || result.state === \"failed\") return result;\n if (Date.now() > deadline) throw new TimeoutError(timeout, taskId);\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async flashGetTask(taskId: string): Promise<ExtractResult> {\n const body = await this.flashApi.get(`/parse/${taskId}`);\n return this.parseFlashTask(body.data);\n }\n\n private async parseFlashTask(\n data: Record<string, unknown>,\n ): Promise<ExtractResult> {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n\n const ep = data[\"extract_progress\"] as\n | Record<string, unknown>\n | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n };\n }\n\n if (result.state === \"done\" && data[\"markdown_url\"]) {\n result.markdown = await this.flashApi.downloadText(\n data[\"markdown_url\"] as string,\n );\n }\n\n return result;\n }\n}\n","export class MinerUError extends Error {\n readonly code: string;\n readonly traceId: string;\n\n constructor(code: string | number, message: string, traceId = \"\") {\n const tag = traceId ? ` (trace: ${traceId})` : \"\";\n super(`[${code}] ${message}${tag}`);\n this.name = \"MinerUError\";\n this.code = String(code);\n this.traceId = traceId;\n }\n}\n\nexport class AuthError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"AuthError\";\n }\n}\n\nexport class ParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ParamError\";\n }\n}\n\nexport class FileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FileTooLargeError\";\n }\n}\n\nexport class PageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"PageLimitError\";\n }\n}\n\nexport class TaskNotFoundError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"TaskNotFoundError\";\n }\n}\n\nexport class ExtractFailedError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ExtractFailedError\";\n }\n}\n\nexport class TimeoutError extends MinerUError {\n readonly timeout: number;\n readonly taskId: string;\n\n constructor(timeout: number, taskId: string) {\n super(\"TIMEOUT\", `Task ${taskId} did not complete within ${timeout}s`);\n this.name = \"TimeoutError\";\n this.timeout = timeout;\n this.taskId = taskId;\n }\n}\n\nexport class QuotaExceededError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"QuotaExceededError\";\n }\n}\n\n// Flash API specific errors\n\nexport class FlashFileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashFileTooLargeError\";\n }\n}\n\nexport class FlashUnsupportedTypeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashUnsupportedTypeError\";\n }\n}\n\nexport class FlashPageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashPageLimitError\";\n }\n}\n\nexport class FlashParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashParamError\";\n }\n}\n\nexport class NoAuthClientError extends MinerUError {\n constructor() {\n super(\n \"-1\",\n \"This operation requires an authenticated client; pass token to MinerU() or set MINERU_TOKEN env var.\",\n );\n this.name = \"NoAuthClientError\";\n }\n}\n\nconst CODE_TO_ERROR: Record<string, typeof MinerUError> = {\n A0202: AuthError,\n A0211: AuthError,\n \"-500\": ParamError,\n \"-10002\": ParamError,\n \"-60005\": FileTooLargeError,\n \"-60006\": PageLimitError,\n \"-60010\": ExtractFailedError,\n \"-60012\": TaskNotFoundError,\n \"-60013\": MinerUError,\n \"-60018\": QuotaExceededError,\n \"-60019\": QuotaExceededError,\n \"-30001\": FlashFileTooLargeError,\n \"-30002\": FlashUnsupportedTypeError,\n \"-30003\": FlashPageLimitError,\n \"-30004\": FlashParamError,\n};\n\nexport function raiseForCode(\n code: number | string,\n msg: string,\n traceId = \"\",\n): never {\n const ErrorClass = CODE_TO_ERROR[String(code)] ?? MinerUError;\n throw new ErrorClass(code, msg, traceId);\n}\n","import { raiseForCode } from \"./errors.js\";\nimport { UPLOAD_TIMEOUT_MS } from \"./constants.js\";\n\ninterface ApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class ApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(token: string, baseUrl: string, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<ApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<ApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n headers: this.headers,\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, {\n method: \"PUT\",\n body: data,\n signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS),\n });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async download(url: string): Promise<Uint8Array> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return new Uint8Array(await resp.arrayBuffer());\n }\n\n private async handle(resp: Response): Promise<ApiResponse> {\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` โ€” ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as ApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { raiseForCode } from \"./errors.js\";\nimport { DEFAULT_FLASH_BASE_URL, UPLOAD_TIMEOUT_MS } from \"./constants.js\";\n\ninterface FlashApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class FlashApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(baseUrl: string = DEFAULT_FLASH_BASE_URL, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = { \"Content-Type\": \"application/json\" };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<FlashApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<FlashApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, { method: \"PUT\", body: data, signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS) });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async downloadText(url: string): Promise<string> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return resp.text();\n }\n\n private async handle(resp: Response): Promise<FlashApiResponse> {\n if (resp.status === 429) {\n raiseForCode(\n \"RATE_LIMITED\",\n \"flash API rate limit exceeded; try again later\",\n );\n }\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` โ€” ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as FlashApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nexport interface Image {\n name: string;\n data: Uint8Array;\n path: string;\n}\n\nexport interface Progress {\n extractedPages: number;\n totalPages: number;\n startTime: string;\n}\n\nexport function progressPercent(p: Progress): number {\n if (p.totalPages === 0) return 0;\n return (p.extractedPages / p.totalPages) * 100;\n}\n\nexport function progressToString(p: Progress): string {\n return `${p.extractedPages}/${p.totalPages} (${progressPercent(p).toFixed(0)}%)`;\n}\n\nexport interface ExtractResult {\n taskId: string;\n state: string;\n filename: string | null;\n errCode: string;\n error: string | null;\n zipUrl: string | null;\n\n progress: Progress | null;\n\n markdown: string | null;\n contentList: Record<string, unknown>[] | null;\n images: Image[];\n\n docx: Uint8Array | null;\n html: string | null;\n latex: string | null;\n\n /** @internal */\n _zipBytes: Uint8Array | null;\n}\n\nexport function createEmptyResult(\n taskId: string,\n state: string,\n): ExtractResult {\n return {\n taskId,\n state,\n filename: null,\n errCode: \"\",\n error: null,\n zipUrl: null,\n progress: null,\n markdown: null,\n contentList: null,\n images: [],\n docx: null,\n html: null,\n latex: null,\n _zipBytes: null,\n };\n}\n\nasync function ensureDir(filePath: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n}\n\nexport async function saveMarkdown(\n result: ExtractResult,\n path: string,\n withImages = true,\n): Promise<void> {\n if (result.markdown == null) {\n throw new Error(\"No markdown content available (state != done)\");\n }\n await ensureDir(path);\n await writeFile(path, result.markdown, \"utf-8\");\n if (withImages && result.images.length > 0) {\n const imgDir = join(dirname(path), \"images\");\n await mkdir(imgDir, { recursive: true });\n for (const img of result.images) {\n await writeFile(join(imgDir, img.name), img.data);\n }\n }\n}\n\nexport async function saveDocx(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.docx == null) {\n throw new Error(\n \"No docx content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.docx);\n}\n\nexport async function saveHtml(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.html == null) {\n throw new Error(\n \"No html content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.html, \"utf-8\");\n}\n\nexport async function saveLatex(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.latex == null) {\n throw new Error(\n \"No latex content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.latex, \"utf-8\");\n}\n\nexport async function saveAll(\n result: ExtractResult,\n dir: string,\n): Promise<void> {\n if (result._zipBytes == null) {\n throw new Error(\"No zip data available (state != done)\");\n }\n const { unzipSync } = await import(\"fflate\");\n const entries = unzipSync(new Uint8Array(result._zipBytes));\n await mkdir(dir, { recursive: true });\n for (const [relativePath, content] of Object.entries(entries)) {\n if (relativePath.endsWith(\"/\")) continue;\n const fullPath = join(dir, relativePath);\n await ensureDir(fullPath);\n await writeFile(fullPath, content);\n }\n}\n","import { unzipSync } from \"fflate\";\nimport type { ExtractResult, Image } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\n\nconst IMAGE_EXTENSIONS = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\", \".svg\", \".webp\",\n]);\n\nfunction extname(filename: string): string {\n const dot = filename.lastIndexOf(\".\");\n return dot === -1 ? \"\" : filename.slice(dot).toLowerCase();\n}\n\nfunction basename(filepath: string): string {\n const parts = filepath.replace(/\\\\/g, \"/\").split(\"/\");\n return parts[parts.length - 1] ?? \"\";\n}\n\nexport function parseZip(\n zipBytes: Uint8Array,\n taskId: string,\n filename: string | null = null,\n): ExtractResult {\n const result = createEmptyResult(taskId, \"done\");\n result.filename = filename;\n result._zipBytes = zipBytes;\n\n const entries = unzipSync(zipBytes);\n const images: Image[] = [];\n let contentList: Record<string, unknown>[] | null = null;\n\n for (const [relPath, data] of Object.entries(entries)) {\n if (relPath.endsWith(\"/\")) continue;\n\n const name = basename(relPath);\n const ext = extname(name);\n const text = () => new TextDecoder().decode(data);\n\n if (ext === \".md\") {\n result.markdown = text();\n } else if (\n name.endsWith(\"_content_list.json\") ||\n name === \"content_list.json\"\n ) {\n contentList = JSON.parse(text()) as Record<string, unknown>[];\n } else if (ext === \".json\" && contentList == null) {\n try {\n const parsed: unknown = JSON.parse(text());\n if (Array.isArray(parsed)) {\n contentList = parsed as Record<string, unknown>[];\n }\n } catch {\n // not a valid JSON array โ€” skip\n }\n } else if (IMAGE_EXTENSIONS.has(ext)) {\n images.push({ name, data: new Uint8Array(data), path: relPath });\n } else if (ext === \".docx\") {\n result.docx = new Uint8Array(data);\n } else if (ext === \".html\" || ext === \".htm\") {\n result.html = text();\n } else if (ext === \".tex\") {\n result.latex = text();\n }\n }\n\n result.contentList = contentList;\n result.images = images;\n return result;\n}\n"],"mappings":"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","names":["import_promises","import_node_path","unzipSync"]}
package/dist/index.d.cts CHANGED
@@ -64,6 +64,9 @@ interface BatchOptions {
64
64
  interface FlashExtractOptions {
65
65
  language?: string;
66
66
  pageRange?: string;
67
+ ocr?: boolean;
68
+ formula?: boolean;
69
+ table?: boolean;
67
70
  /** Max total seconds to wait for task completion (polling). */
68
71
  timeout?: number;
69
72
  }
package/dist/index.d.ts CHANGED
@@ -64,6 +64,9 @@ interface BatchOptions {
64
64
  interface FlashExtractOptions {
65
65
  language?: string;
66
66
  pageRange?: string;
67
+ ocr?: boolean;
68
+ formula?: boolean;
69
+ table?: boolean;
67
70
  /** Max total seconds to wait for task completion (polling). */
68
71
  timeout?: number;
69
72
  }
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  // src/constants.ts
2
2
  var DEFAULT_BASE_URL = "https://mineru.net/api/v4";
3
3
  var DEFAULT_FLASH_BASE_URL = "https://mineru.net/api/v1/agent";
4
+ var UPLOAD_TIMEOUT_MS = 3e5;
4
5
 
5
6
  // src/client.ts
6
7
  import { readFile } from "fs/promises";
@@ -163,7 +164,8 @@ var ApiClient = class {
163
164
  async putFile(url, data) {
164
165
  const resp = await fetch(url, {
165
166
  method: "PUT",
166
- body: data
167
+ body: data,
168
+ signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS)
167
169
  });
168
170
  if (!resp.ok) {
169
171
  throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);
@@ -223,7 +225,7 @@ var FlashApiClient = class {
223
225
  return this.handle(resp);
224
226
  }
225
227
  async putFile(url, data) {
226
- const resp = await fetch(url, { method: "PUT", body: data });
228
+ const resp = await fetch(url, { method: "PUT", body: data, signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS) });
227
229
  if (!resp.ok) {
228
230
  throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);
229
231
  }
@@ -679,26 +681,32 @@ var MinerU = class {
679
681
  // Flash (agent) mode
680
682
  // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
681
683
  async flashExtract(source, options = {}) {
682
- const { language = "ch", pageRange, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;
684
+ const { language = "ch", pageRange, ocr, formula, table, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;
683
685
  let taskId;
684
686
  if (isUrl(source)) {
685
- taskId = await this.flashSubmitUrl(source, language, pageRange);
687
+ taskId = await this.flashSubmitUrl(source, language, pageRange, ocr, formula, table);
686
688
  } else {
687
- taskId = await this.flashSubmitFile(source, language, pageRange);
689
+ taskId = await this.flashSubmitFile(source, language, pageRange, ocr, formula, table);
688
690
  }
689
691
  return this.flashWait(taskId, timeout);
690
692
  }
691
693
  // โ”€โ”€ Flash internal helpers โ”€โ”€
692
- async flashSubmitUrl(url, language, pageRange) {
694
+ async flashSubmitUrl(url, language, pageRange, ocr, formula, table) {
693
695
  const payload = { url, language };
694
696
  if (pageRange != null) payload["page_range"] = pageRange;
697
+ if (ocr != null) payload["is_ocr"] = ocr;
698
+ if (formula != null) payload["enable_formula"] = formula;
699
+ if (table != null) payload["enable_table"] = table;
695
700
  const body = await this.flashApi.post("/parse/url", payload);
696
701
  return body.data["task_id"];
697
702
  }
698
- async flashSubmitFile(filePath, language, pageRange) {
703
+ async flashSubmitFile(filePath, language, pageRange, ocr, formula, table) {
699
704
  const fileName = basename2(filePath);
700
705
  const payload = { file_name: fileName, language };
701
706
  if (pageRange != null) payload["page_range"] = pageRange;
707
+ if (ocr != null) payload["is_ocr"] = ocr;
708
+ if (formula != null) payload["enable_formula"] = formula;
709
+ if (table != null) payload["enable_table"] = table;
702
710
  const body = await this.flashApi.post("/parse/file", payload);
703
711
  const taskId = body.data["task_id"];
704
712
  const fileUrl = body.data["file_url"];
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/client.ts","../src/errors.ts","../src/api.ts","../src/flash-api.ts","../src/models.ts","../src/zip.ts"],"sourcesContent":["export const DEFAULT_BASE_URL = \"https://mineru.net/api/v4\";\n\nexport const DEFAULT_FLASH_BASE_URL = \"https://mineru.net/api/v1/agent\";\n","import { readFile } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\n\nimport { ApiClient } from \"./api.js\";\nimport { DEFAULT_BASE_URL } from \"./constants.js\";\nimport { NoAuthClientError, TimeoutError } from \"./errors.js\";\nimport { FlashApiClient } from \"./flash-api.js\";\nimport type { ExtractResult, Progress } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\nimport { parseZip } from \"./zip.js\";\n\nconst MODEL_MAP: Record<string, string> = {\n pipeline: \"pipeline\",\n vlm: \"vlm\",\n html: \"MinerU-HTML\",\n};\n\nconst HTML_EXTENSIONS = new Set([\".html\", \".htm\"]);\n\nconst DEFAULT_SOURCE = \"open-api-sdk-js\";\n\n/** Default total business timeouts for extraction tasks (in seconds). */\nconst DEFAULT_TIMEOUT_POLL_SINGLE = 300;\nconst DEFAULT_TIMEOUT_POLL_BATCH = 1800;\n\nfunction isUrl(source: string): boolean {\n return source.startsWith(\"http://\") || source.startsWith(\"https://\");\n}\n\nfunction getExtension(source: string): string {\n if (isUrl(source)) {\n const path = source.split(\"?\")[0]!.split(\"#\")[0]!;\n const dot = path.lastIndexOf(\".\");\n return dot === -1 ? \"\" : path.slice(dot).toLowerCase();\n }\n return extname(source).toLowerCase();\n}\n\nfunction inferModel(source: string): string {\n return HTML_EXTENSIONS.has(getExtension(source)) ? \"MinerU-HTML\" : \"vlm\";\n}\n\nfunction resolveModel(model: string | undefined, source: string): string {\n if (model != null) {\n return MODEL_MAP[model] ?? model;\n }\n return inferModel(source);\n}\n\nexport interface ExtractOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n pages?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\nexport interface BatchOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for all tasks (polling). */\n timeout?: number;\n}\n\nexport interface FlashExtractOptions {\n language?: string;\n pageRange?: string;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\n/** Per-file parameter overrides for batch methods. */\nexport interface FileParam {\n /** Override page_ranges for this file (e.g. \"1-10,15\"). */\n pages?: string;\n /** Override is_ocr for this file. */\n ocr?: boolean;\n /** Set data_id for this file. */\n dataId?: string;\n}\n\n/** Only includes fields the user explicitly set. Never assumes API defaults. */\nfunction buildApiOptions(\n modelVersion: string,\n opts: ExtractOptions | BatchOptions,\n): Record<string, unknown> {\n const o: Record<string, unknown> = { model_version: modelVersion };\n if (opts.formula !== undefined) o[\"enable_formula\"] = opts.formula;\n if (opts.table !== undefined) o[\"enable_table\"] = opts.table;\n if (opts.language !== undefined) o[\"language\"] = opts.language;\n if (opts.extraFormats?.length) {\n o[\"extra_formats\"] = opts.extraFormats;\n }\n return o;\n}\n\n/** Adds per-file fields (is_ocr, page_ranges, data_id) to a file entry. */\nfunction applyFileFields(\n entry: Record<string, unknown>,\n key: string,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n): void {\n const fp = fileParams?.[key];\n\n // OCR: per-file overrides global\n const effectiveOcr = fp?.ocr !== undefined ? fp.ocr : ocr;\n if (effectiveOcr !== undefined) entry[\"is_ocr\"] = effectiveOcr;\n\n // Pages: per-file overrides global\n const effectivePages = fp?.pages || pages;\n if (effectivePages) entry[\"page_ranges\"] = effectivePages;\n\n // DataID: per-file only\n if (fp?.dataId) entry[\"data_id\"] = fp.dataId;\n}\n\nfunction parseTaskResult(data: Record<string, unknown>): ExtractResult {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n result.filename = (data[\"file_name\"] as string) ?? null;\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n result.zipUrl = (data[\"full_zip_url\"] as string) ?? null;\n\n const ep = data[\"extract_progress\"] as Record<string, unknown> | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n } satisfies Progress;\n }\n return result;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * MinerU API client. Turn documents into Markdown with one method call.\n */\nexport class MinerU {\n private readonly api: ApiClient | null;\n private readonly flashApi: FlashApiClient;\n\n /**\n * @param token - API token.\n * @param baseUrl - API base URL.\n * @param flashBaseUrl - Flash API base URL.\n */\n constructor(\n token?: string,\n baseUrl = DEFAULT_BASE_URL,\n flashBaseUrl?: string,\n ) {\n const resolved = token ?? process.env[\"MINERU_TOKEN\"];\n if (resolved) {\n // ApiClient should ideally use DEFAULT_TIMEOUT_REQUEST internally\n this.api = new ApiClient(resolved, baseUrl, DEFAULT_SOURCE);\n } else {\n this.api = null; // flash-only mode\n }\n this.flashApi = new FlashApiClient(flashBaseUrl, DEFAULT_SOURCE);\n }\n\n setSource(source: string): void {\n if (this.api !== null) {\n this.api.setSource(source);\n }\n this.flashApi.setSource(source);\n }\n\n private requireAuth(): ApiClient {\n if (this.api === null) {\n throw new NoAuthClientError();\n }\n return this.api;\n }\n\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n // Synchronous (blocking) methods\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n\n async extract(\n source: string,\n options: ExtractOptions = {},\n ): Promise<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_SINGLE, ...opts } = options;\n const modelVersion = resolveModel(opts.model, source);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n let batchId: string;\n if (isUrl(source)) {\n batchId = await this.submitUrlsBatch([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n } else {\n batchId = await this.uploadAndSubmit([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n }\n const results = await this.waitBatch(batchId, timeout);\n return results[0]!;\n }\n\n async *extractBatch(\n sources: string[],\n options: BatchOptions = {},\n ): AsyncGenerator<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_BATCH, ...opts } = options;\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(opts.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n const batchIds: string[] = [];\n if (urls.length > 0) {\n batchIds.push(await this.submitUrlsBatch(urls, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n if (files.length > 0) {\n batchIds.push(await this.uploadAndSubmit(files, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n\n yield* this.yieldBatch(batchIds, sources.length, timeout);\n }\n\n async crawl(\n url: string,\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): Promise<ExtractResult> {\n return this.extract(url, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_SINGLE, ...options });\n }\n\n async *crawlBatch(\n urls: string[],\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): AsyncGenerator<ExtractResult> {\n yield* this.extractBatch(urls, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_BATCH, ...options });\n }\n\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n // Async primitives (no polling, no waiting)\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n\n async submit(\n source: string,\n options: Omit<ExtractOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const modelVersion = resolveModel(options.model, source);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n if (isUrl(source)) {\n return this.submitUrlsBatch([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n return this.uploadAndSubmit([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n\n async submitBatch(\n sources: string[],\n options: Omit<BatchOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(options.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n if (urls.length === 0 && files.length === 0) {\n throw new Error(\"No sources provided.\");\n }\n if (urls.length > 0 && files.length > 0) {\n throw new Error(\n \"submitBatch() does not support mixing URLs and local files in one call. \" +\n \"Please submit them separately or use extractBatch() instead.\",\n );\n }\n\n if (urls.length > 0) {\n return this.submitUrlsBatch(urls, apiOpts, options.ocr, undefined, options.fileParams);\n }\n return this.uploadAndSubmit(files, apiOpts, options.ocr, undefined, options.fileParams);\n }\n\n async getTask(taskId: string): Promise<ExtractResult> {\n const api = this.requireAuth();\n const body = await api.get(`/extract/task/${taskId}`);\n const result = parseTaskResult(body.data);\n if (result.state === \"done\" && result.zipUrl) {\n return this.downloadAndParse(result);\n }\n return result;\n }\n\n async getBatch(batchId: string): Promise<ExtractResult[]> {\n const api = this.requireAuth();\n const body = await api.get(`/extract-results/batch/${batchId}`);\n const items = (body.data[\"extract_result\"] as Record<string, unknown>[]) ?? [];\n const results: ExtractResult[] = [];\n for (const item of items) {\n let r = parseTaskResult(item);\n if (r.state === \"done\" && r.zipUrl) {\n r = await this.downloadAndParse(r);\n }\n results.push(r);\n }\n return results;\n }\n\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n // Internal helpers\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n\n private async submitUrlsBatch(\n urls: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const files = urls.map((u) => {\n const entry: Record<string, unknown> = { url: u };\n applyFileFields(entry, u, ocr, pages, fileParams);\n return entry;\n });\n const body = await this.requireAuth().post(\"/extract/task/batch\", {\n files,\n ...opts,\n });\n return body.data[\"batch_id\"] as string;\n }\n\n private async uploadAndSubmit(\n filePaths: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const api = this.requireAuth();\n const filesMeta = filePaths.map((p) => {\n const entry: Record<string, unknown> = { name: basename(p) };\n applyFileFields(entry, p, ocr, pages, fileParams);\n return entry;\n });\n const body = await api.post(\"/file-urls/batch\", {\n files: filesMeta,\n ...opts,\n });\n const batchId = body.data[\"batch_id\"] as string;\n const uploadUrls = body.data[\"file_urls\"] as string[];\n\n for (let i = 0; i < filePaths.length; i++) {\n const data = await readFile(filePaths[i]!);\n await api.putFile(uploadUrls[i]!, new Uint8Array(data));\n }\n\n return batchId;\n }\n\n private async downloadAndParse(\n result: ExtractResult,\n ): Promise<ExtractResult> {\n const zipBytes = await this.requireAuth().download(result.zipUrl!);\n const parsed = parseZip(zipBytes, result.taskId, result.filename);\n parsed.zipUrl = result.zipUrl;\n return parsed;\n }\n\n private async waitBatch(\n batchId: string,\n timeout: number,\n ): Promise<ExtractResult[]> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const results = await this.getBatch(batchId);\n if (results.every((r) => r.state === \"done\" || r.state === \"failed\")) {\n return results;\n }\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchId);\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async *yieldBatch(\n batchIds: string[],\n total: number,\n timeout: number,\n ): AsyncGenerator<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n const yielded = new Set<string>();\n let interval = 2000;\n\n while (yielded.size < total) {\n for (const bid of batchIds) {\n const results = await this.getBatch(bid);\n for (let idx = 0; idx < results.length; idx++) {\n const key = `${bid}:${idx}`;\n const r = results[idx]!;\n if (!yielded.has(key) && (r.state === \"done\" || r.state === \"failed\")) {\n yielded.add(key);\n yield r;\n }\n }\n }\n\n if (yielded.size >= total) break;\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchIds.join(\",\"));\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n // Flash (agent) mode\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n\n async flashExtract(\n source: string,\n options: FlashExtractOptions = {},\n ): Promise<ExtractResult> {\n const { language = \"ch\", pageRange, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;\n\n let taskId: string;\n if (isUrl(source)) {\n taskId = await this.flashSubmitUrl(source, language, pageRange);\n } else {\n taskId = await this.flashSubmitFile(source, language, pageRange);\n }\n\n return this.flashWait(taskId, timeout);\n }\n\n // โ”€โ”€ Flash internal helpers โ”€โ”€\n\n private async flashSubmitUrl(\n url: string,\n language: string,\n pageRange?: string,\n ): Promise<string> {\n const payload: Record<string, unknown> = { url, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n const body = await this.flashApi.post(\"/parse/url\", payload);\n return body.data[\"task_id\"] as string;\n }\n\n private async flashSubmitFile(\n filePath: string,\n language: string,\n pageRange?: string,\n ): Promise<string> {\n const fileName = basename(filePath);\n const payload: Record<string, unknown> = { file_name: fileName, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n const body = await this.flashApi.post(\"/parse/file\", payload);\n const taskId = body.data[\"task_id\"] as string;\n const fileUrl = body.data[\"file_url\"] as string;\n\n const data = await readFile(filePath);\n await this.flashApi.putFile(fileUrl, new Uint8Array(data));\n return taskId;\n }\n\n private async flashWait(\n taskId: string,\n timeout: number,\n ): Promise<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const result = await this.flashGetTask(taskId);\n if (result.state === \"done\" || result.state === \"failed\") return result;\n if (Date.now() > deadline) throw new TimeoutError(timeout, taskId);\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async flashGetTask(taskId: string): Promise<ExtractResult> {\n const body = await this.flashApi.get(`/parse/${taskId}`);\n return this.parseFlashTask(body.data);\n }\n\n private async parseFlashTask(\n data: Record<string, unknown>,\n ): Promise<ExtractResult> {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n\n const ep = data[\"extract_progress\"] as\n | Record<string, unknown>\n | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n };\n }\n\n if (result.state === \"done\" && data[\"markdown_url\"]) {\n result.markdown = await this.flashApi.downloadText(\n data[\"markdown_url\"] as string,\n );\n }\n\n return result;\n }\n}\n","export class MinerUError extends Error {\n readonly code: string;\n readonly traceId: string;\n\n constructor(code: string | number, message: string, traceId = \"\") {\n const tag = traceId ? ` (trace: ${traceId})` : \"\";\n super(`[${code}] ${message}${tag}`);\n this.name = \"MinerUError\";\n this.code = String(code);\n this.traceId = traceId;\n }\n}\n\nexport class AuthError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"AuthError\";\n }\n}\n\nexport class ParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ParamError\";\n }\n}\n\nexport class FileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FileTooLargeError\";\n }\n}\n\nexport class PageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"PageLimitError\";\n }\n}\n\nexport class TaskNotFoundError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"TaskNotFoundError\";\n }\n}\n\nexport class ExtractFailedError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ExtractFailedError\";\n }\n}\n\nexport class TimeoutError extends MinerUError {\n readonly timeout: number;\n readonly taskId: string;\n\n constructor(timeout: number, taskId: string) {\n super(\"TIMEOUT\", `Task ${taskId} did not complete within ${timeout}s`);\n this.name = \"TimeoutError\";\n this.timeout = timeout;\n this.taskId = taskId;\n }\n}\n\nexport class QuotaExceededError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"QuotaExceededError\";\n }\n}\n\n// Flash API specific errors\n\nexport class FlashFileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashFileTooLargeError\";\n }\n}\n\nexport class FlashUnsupportedTypeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashUnsupportedTypeError\";\n }\n}\n\nexport class FlashPageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashPageLimitError\";\n }\n}\n\nexport class FlashParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashParamError\";\n }\n}\n\nexport class NoAuthClientError extends MinerUError {\n constructor() {\n super(\n \"-1\",\n \"This operation requires an authenticated client; pass token to MinerU() or set MINERU_TOKEN env var.\",\n );\n this.name = \"NoAuthClientError\";\n }\n}\n\nconst CODE_TO_ERROR: Record<string, typeof MinerUError> = {\n A0202: AuthError,\n A0211: AuthError,\n \"-500\": ParamError,\n \"-10002\": ParamError,\n \"-60005\": FileTooLargeError,\n \"-60006\": PageLimitError,\n \"-60010\": ExtractFailedError,\n \"-60012\": TaskNotFoundError,\n \"-60013\": MinerUError,\n \"-60018\": QuotaExceededError,\n \"-60019\": QuotaExceededError,\n \"-30001\": FlashFileTooLargeError,\n \"-30002\": FlashUnsupportedTypeError,\n \"-30003\": FlashPageLimitError,\n \"-30004\": FlashParamError,\n};\n\nexport function raiseForCode(\n code: number | string,\n msg: string,\n traceId = \"\",\n): never {\n const ErrorClass = CODE_TO_ERROR[String(code)] ?? MinerUError;\n throw new ErrorClass(code, msg, traceId);\n}\n","import { raiseForCode } from \"./errors.js\";\n\ninterface ApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class ApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(token: string, baseUrl: string, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<ApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<ApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n headers: this.headers,\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, {\n method: \"PUT\",\n body: data,\n });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async download(url: string): Promise<Uint8Array> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return new Uint8Array(await resp.arrayBuffer());\n }\n\n private async handle(resp: Response): Promise<ApiResponse> {\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` โ€” ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as ApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { raiseForCode } from \"./errors.js\";\nimport { DEFAULT_FLASH_BASE_URL } from \"./constants.js\";\n\ninterface FlashApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class FlashApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(baseUrl: string = DEFAULT_FLASH_BASE_URL, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = { \"Content-Type\": \"application/json\" };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<FlashApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<FlashApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, { method: \"PUT\", body: data });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async downloadText(url: string): Promise<string> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return resp.text();\n }\n\n private async handle(resp: Response): Promise<FlashApiResponse> {\n if (resp.status === 429) {\n raiseForCode(\n \"RATE_LIMITED\",\n \"flash API rate limit exceeded; try again later\",\n );\n }\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` โ€” ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as FlashApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nexport interface Image {\n name: string;\n data: Uint8Array;\n path: string;\n}\n\nexport interface Progress {\n extractedPages: number;\n totalPages: number;\n startTime: string;\n}\n\nexport function progressPercent(p: Progress): number {\n if (p.totalPages === 0) return 0;\n return (p.extractedPages / p.totalPages) * 100;\n}\n\nexport function progressToString(p: Progress): string {\n return `${p.extractedPages}/${p.totalPages} (${progressPercent(p).toFixed(0)}%)`;\n}\n\nexport interface ExtractResult {\n taskId: string;\n state: string;\n filename: string | null;\n errCode: string;\n error: string | null;\n zipUrl: string | null;\n\n progress: Progress | null;\n\n markdown: string | null;\n contentList: Record<string, unknown>[] | null;\n images: Image[];\n\n docx: Uint8Array | null;\n html: string | null;\n latex: string | null;\n\n /** @internal */\n _zipBytes: Uint8Array | null;\n}\n\nexport function createEmptyResult(\n taskId: string,\n state: string,\n): ExtractResult {\n return {\n taskId,\n state,\n filename: null,\n errCode: \"\",\n error: null,\n zipUrl: null,\n progress: null,\n markdown: null,\n contentList: null,\n images: [],\n docx: null,\n html: null,\n latex: null,\n _zipBytes: null,\n };\n}\n\nasync function ensureDir(filePath: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n}\n\nexport async function saveMarkdown(\n result: ExtractResult,\n path: string,\n withImages = true,\n): Promise<void> {\n if (result.markdown == null) {\n throw new Error(\"No markdown content available (state != done)\");\n }\n await ensureDir(path);\n await writeFile(path, result.markdown, \"utf-8\");\n if (withImages && result.images.length > 0) {\n const imgDir = join(dirname(path), \"images\");\n await mkdir(imgDir, { recursive: true });\n for (const img of result.images) {\n await writeFile(join(imgDir, img.name), img.data);\n }\n }\n}\n\nexport async function saveDocx(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.docx == null) {\n throw new Error(\n \"No docx content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.docx);\n}\n\nexport async function saveHtml(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.html == null) {\n throw new Error(\n \"No html content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.html, \"utf-8\");\n}\n\nexport async function saveLatex(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.latex == null) {\n throw new Error(\n \"No latex content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.latex, \"utf-8\");\n}\n\nexport async function saveAll(\n result: ExtractResult,\n dir: string,\n): Promise<void> {\n if (result._zipBytes == null) {\n throw new Error(\"No zip data available (state != done)\");\n }\n const { unzipSync } = await import(\"fflate\");\n const entries = unzipSync(new Uint8Array(result._zipBytes));\n await mkdir(dir, { recursive: true });\n for (const [relativePath, content] of Object.entries(entries)) {\n if (relativePath.endsWith(\"/\")) continue;\n const fullPath = join(dir, relativePath);\n await ensureDir(fullPath);\n await writeFile(fullPath, content);\n }\n}\n","import { unzipSync } from \"fflate\";\nimport type { ExtractResult, Image } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\n\nconst IMAGE_EXTENSIONS = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\", \".svg\", \".webp\",\n]);\n\nfunction extname(filename: string): string {\n const dot = filename.lastIndexOf(\".\");\n return dot === -1 ? \"\" : filename.slice(dot).toLowerCase();\n}\n\nfunction basename(filepath: string): string {\n const parts = filepath.replace(/\\\\/g, \"/\").split(\"/\");\n return parts[parts.length - 1] ?? \"\";\n}\n\nexport function parseZip(\n zipBytes: Uint8Array,\n taskId: string,\n filename: string | null = null,\n): ExtractResult {\n const result = createEmptyResult(taskId, \"done\");\n result.filename = filename;\n result._zipBytes = zipBytes;\n\n const entries = unzipSync(zipBytes);\n const images: Image[] = [];\n let contentList: Record<string, unknown>[] | null = null;\n\n for (const [relPath, data] of Object.entries(entries)) {\n if (relPath.endsWith(\"/\")) continue;\n\n const name = basename(relPath);\n const ext = extname(name);\n const text = () => new TextDecoder().decode(data);\n\n if (ext === \".md\") {\n result.markdown = text();\n } else if (\n name.endsWith(\"_content_list.json\") ||\n name === \"content_list.json\"\n ) {\n contentList = JSON.parse(text()) as Record<string, unknown>[];\n } else if (ext === \".json\" && contentList == null) {\n try {\n const parsed: unknown = JSON.parse(text());\n if (Array.isArray(parsed)) {\n contentList = parsed as Record<string, unknown>[];\n }\n } catch {\n // not a valid JSON array โ€” skip\n }\n } else if (IMAGE_EXTENSIONS.has(ext)) {\n images.push({ name, data: new Uint8Array(data), path: relPath });\n } else if (ext === \".docx\") {\n result.docx = new Uint8Array(data);\n } else if (ext === \".html\" || ext === \".htm\") {\n result.html = text();\n } else if (ext === \".tex\") {\n result.latex = text();\n }\n }\n\n result.contentList = contentList;\n result.images = images;\n return result;\n}\n"],"mappings":"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","names":["basename","extname","unzipSync","extname","basename"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/client.ts","../src/errors.ts","../src/api.ts","../src/flash-api.ts","../src/models.ts","../src/zip.ts"],"sourcesContent":["export const DEFAULT_BASE_URL = \"https://mineru.net/api/v4\";\n\nexport const DEFAULT_FLASH_BASE_URL = \"https://mineru.net/api/v1/agent\";\n\n/** Timeout for file uploads in milliseconds (PUT to pre-signed URL). */\nexport const UPLOAD_TIMEOUT_MS = 300_000;\n","import { readFile } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\n\nimport { ApiClient } from \"./api.js\";\nimport { DEFAULT_BASE_URL } from \"./constants.js\";\nimport { NoAuthClientError, TimeoutError } from \"./errors.js\";\nimport { FlashApiClient } from \"./flash-api.js\";\nimport type { ExtractResult, Progress } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\nimport { parseZip } from \"./zip.js\";\n\nconst MODEL_MAP: Record<string, string> = {\n pipeline: \"pipeline\",\n vlm: \"vlm\",\n html: \"MinerU-HTML\",\n};\n\nconst HTML_EXTENSIONS = new Set([\".html\", \".htm\"]);\n\nconst DEFAULT_SOURCE = \"open-api-sdk-js\";\n\n/** Default total business timeouts for extraction tasks (in seconds). */\nconst DEFAULT_TIMEOUT_POLL_SINGLE = 300;\nconst DEFAULT_TIMEOUT_POLL_BATCH = 1800;\n\nfunction isUrl(source: string): boolean {\n return source.startsWith(\"http://\") || source.startsWith(\"https://\");\n}\n\nfunction getExtension(source: string): string {\n if (isUrl(source)) {\n const path = source.split(\"?\")[0]!.split(\"#\")[0]!;\n const dot = path.lastIndexOf(\".\");\n return dot === -1 ? \"\" : path.slice(dot).toLowerCase();\n }\n return extname(source).toLowerCase();\n}\n\nfunction inferModel(source: string): string {\n return HTML_EXTENSIONS.has(getExtension(source)) ? \"MinerU-HTML\" : \"vlm\";\n}\n\nfunction resolveModel(model: string | undefined, source: string): string {\n if (model != null) {\n return MODEL_MAP[model] ?? model;\n }\n return inferModel(source);\n}\n\nexport interface ExtractOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n pages?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\nexport interface BatchOptions {\n model?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n language?: string;\n extraFormats?: string[];\n /** Per-file overrides keyed by path or URL. */\n fileParams?: Record<string, FileParam>;\n /** Max total seconds to wait for all tasks (polling). */\n timeout?: number;\n}\n\nexport interface FlashExtractOptions {\n language?: string;\n pageRange?: string;\n ocr?: boolean;\n formula?: boolean;\n table?: boolean;\n /** Max total seconds to wait for task completion (polling). */\n timeout?: number;\n}\n\n/** Per-file parameter overrides for batch methods. */\nexport interface FileParam {\n /** Override page_ranges for this file (e.g. \"1-10,15\"). */\n pages?: string;\n /** Override is_ocr for this file. */\n ocr?: boolean;\n /** Set data_id for this file. */\n dataId?: string;\n}\n\n/** Only includes fields the user explicitly set. Never assumes API defaults. */\nfunction buildApiOptions(\n modelVersion: string,\n opts: ExtractOptions | BatchOptions,\n): Record<string, unknown> {\n const o: Record<string, unknown> = { model_version: modelVersion };\n if (opts.formula !== undefined) o[\"enable_formula\"] = opts.formula;\n if (opts.table !== undefined) o[\"enable_table\"] = opts.table;\n if (opts.language !== undefined) o[\"language\"] = opts.language;\n if (opts.extraFormats?.length) {\n o[\"extra_formats\"] = opts.extraFormats;\n }\n return o;\n}\n\n/** Adds per-file fields (is_ocr, page_ranges, data_id) to a file entry. */\nfunction applyFileFields(\n entry: Record<string, unknown>,\n key: string,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n): void {\n const fp = fileParams?.[key];\n\n // OCR: per-file overrides global\n const effectiveOcr = fp?.ocr !== undefined ? fp.ocr : ocr;\n if (effectiveOcr !== undefined) entry[\"is_ocr\"] = effectiveOcr;\n\n // Pages: per-file overrides global\n const effectivePages = fp?.pages || pages;\n if (effectivePages) entry[\"page_ranges\"] = effectivePages;\n\n // DataID: per-file only\n if (fp?.dataId) entry[\"data_id\"] = fp.dataId;\n}\n\nfunction parseTaskResult(data: Record<string, unknown>): ExtractResult {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n result.filename = (data[\"file_name\"] as string) ?? null;\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n result.zipUrl = (data[\"full_zip_url\"] as string) ?? null;\n\n const ep = data[\"extract_progress\"] as Record<string, unknown> | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n } satisfies Progress;\n }\n return result;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * MinerU API client. Turn documents into Markdown with one method call.\n */\nexport class MinerU {\n private readonly api: ApiClient | null;\n private readonly flashApi: FlashApiClient;\n\n /**\n * @param token - API token.\n * @param baseUrl - API base URL.\n * @param flashBaseUrl - Flash API base URL.\n */\n constructor(\n token?: string,\n baseUrl = DEFAULT_BASE_URL,\n flashBaseUrl?: string,\n ) {\n const resolved = token ?? process.env[\"MINERU_TOKEN\"];\n if (resolved) {\n // ApiClient should ideally use DEFAULT_TIMEOUT_REQUEST internally\n this.api = new ApiClient(resolved, baseUrl, DEFAULT_SOURCE);\n } else {\n this.api = null; // flash-only mode\n }\n this.flashApi = new FlashApiClient(flashBaseUrl, DEFAULT_SOURCE);\n }\n\n setSource(source: string): void {\n if (this.api !== null) {\n this.api.setSource(source);\n }\n this.flashApi.setSource(source);\n }\n\n private requireAuth(): ApiClient {\n if (this.api === null) {\n throw new NoAuthClientError();\n }\n return this.api;\n }\n\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n // Synchronous (blocking) methods\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n\n async extract(\n source: string,\n options: ExtractOptions = {},\n ): Promise<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_SINGLE, ...opts } = options;\n const modelVersion = resolveModel(opts.model, source);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n let batchId: string;\n if (isUrl(source)) {\n batchId = await this.submitUrlsBatch([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n } else {\n batchId = await this.uploadAndSubmit([source], apiOpts, opts.ocr, opts.pages, opts.fileParams);\n }\n const results = await this.waitBatch(batchId, timeout);\n return results[0]!;\n }\n\n async *extractBatch(\n sources: string[],\n options: BatchOptions = {},\n ): AsyncGenerator<ExtractResult> {\n this.requireAuth();\n const { timeout = DEFAULT_TIMEOUT_POLL_BATCH, ...opts } = options;\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(opts.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, opts);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n const batchIds: string[] = [];\n if (urls.length > 0) {\n batchIds.push(await this.submitUrlsBatch(urls, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n if (files.length > 0) {\n batchIds.push(await this.uploadAndSubmit(files, apiOpts, opts.ocr, undefined, opts.fileParams));\n }\n\n yield* this.yieldBatch(batchIds, sources.length, timeout);\n }\n\n async crawl(\n url: string,\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): Promise<ExtractResult> {\n return this.extract(url, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_SINGLE, ...options });\n }\n\n async *crawlBatch(\n urls: string[],\n options: { extraFormats?: string[]; timeout?: number } = {},\n ): AsyncGenerator<ExtractResult> {\n yield* this.extractBatch(urls, { model: \"html\", timeout: DEFAULT_TIMEOUT_POLL_BATCH, ...options });\n }\n\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n // Async primitives (no polling, no waiting)\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n\n async submit(\n source: string,\n options: Omit<ExtractOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const modelVersion = resolveModel(options.model, source);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n if (isUrl(source)) {\n return this.submitUrlsBatch([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n return this.uploadAndSubmit([source], apiOpts, options.ocr, options.pages, options.fileParams);\n }\n\n async submitBatch(\n sources: string[],\n options: Omit<BatchOptions, \"timeout\"> = {},\n ): Promise<string> {\n this.requireAuth();\n const firstSource = sources[0] ?? \"\";\n const modelVersion = resolveModel(options.model, firstSource);\n const apiOpts = buildApiOptions(modelVersion, options);\n\n const urls = sources.filter(isUrl);\n const files = sources.filter((s) => !isUrl(s));\n\n if (urls.length === 0 && files.length === 0) {\n throw new Error(\"No sources provided.\");\n }\n if (urls.length > 0 && files.length > 0) {\n throw new Error(\n \"submitBatch() does not support mixing URLs and local files in one call. \" +\n \"Please submit them separately or use extractBatch() instead.\",\n );\n }\n\n if (urls.length > 0) {\n return this.submitUrlsBatch(urls, apiOpts, options.ocr, undefined, options.fileParams);\n }\n return this.uploadAndSubmit(files, apiOpts, options.ocr, undefined, options.fileParams);\n }\n\n async getTask(taskId: string): Promise<ExtractResult> {\n const api = this.requireAuth();\n const body = await api.get(`/extract/task/${taskId}`);\n const result = parseTaskResult(body.data);\n if (result.state === \"done\" && result.zipUrl) {\n return this.downloadAndParse(result);\n }\n return result;\n }\n\n async getBatch(batchId: string): Promise<ExtractResult[]> {\n const api = this.requireAuth();\n const body = await api.get(`/extract-results/batch/${batchId}`);\n const items = (body.data[\"extract_result\"] as Record<string, unknown>[]) ?? [];\n const results: ExtractResult[] = [];\n for (const item of items) {\n let r = parseTaskResult(item);\n if (r.state === \"done\" && r.zipUrl) {\n r = await this.downloadAndParse(r);\n }\n results.push(r);\n }\n return results;\n }\n\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n // Internal helpers\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n\n private async submitUrlsBatch(\n urls: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const files = urls.map((u) => {\n const entry: Record<string, unknown> = { url: u };\n applyFileFields(entry, u, ocr, pages, fileParams);\n return entry;\n });\n const body = await this.requireAuth().post(\"/extract/task/batch\", {\n files,\n ...opts,\n });\n return body.data[\"batch_id\"] as string;\n }\n\n private async uploadAndSubmit(\n filePaths: string[],\n opts: Record<string, unknown>,\n ocr: boolean | undefined,\n pages: string | undefined,\n fileParams: Record<string, FileParam> | undefined,\n ): Promise<string> {\n const api = this.requireAuth();\n const filesMeta = filePaths.map((p) => {\n const entry: Record<string, unknown> = { name: basename(p) };\n applyFileFields(entry, p, ocr, pages, fileParams);\n return entry;\n });\n const body = await api.post(\"/file-urls/batch\", {\n files: filesMeta,\n ...opts,\n });\n const batchId = body.data[\"batch_id\"] as string;\n const uploadUrls = body.data[\"file_urls\"] as string[];\n\n for (let i = 0; i < filePaths.length; i++) {\n const data = await readFile(filePaths[i]!);\n await api.putFile(uploadUrls[i]!, new Uint8Array(data));\n }\n\n return batchId;\n }\n\n private async downloadAndParse(\n result: ExtractResult,\n ): Promise<ExtractResult> {\n const zipBytes = await this.requireAuth().download(result.zipUrl!);\n const parsed = parseZip(zipBytes, result.taskId, result.filename);\n parsed.zipUrl = result.zipUrl;\n return parsed;\n }\n\n private async waitBatch(\n batchId: string,\n timeout: number,\n ): Promise<ExtractResult[]> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const results = await this.getBatch(batchId);\n if (results.every((r) => r.state === \"done\" || r.state === \"failed\")) {\n return results;\n }\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchId);\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async *yieldBatch(\n batchIds: string[],\n total: number,\n timeout: number,\n ): AsyncGenerator<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n const yielded = new Set<string>();\n let interval = 2000;\n\n while (yielded.size < total) {\n for (const bid of batchIds) {\n const results = await this.getBatch(bid);\n for (let idx = 0; idx < results.length; idx++) {\n const key = `${bid}:${idx}`;\n const r = results[idx]!;\n if (!yielded.has(key) && (r.state === \"done\" || r.state === \"failed\")) {\n yielded.add(key);\n yield r;\n }\n }\n }\n\n if (yielded.size >= total) break;\n if (Date.now() > deadline) {\n throw new TimeoutError(timeout, batchIds.join(\",\"));\n }\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n // Flash (agent) mode\n // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n\n async flashExtract(\n source: string,\n options: FlashExtractOptions = {},\n ): Promise<ExtractResult> {\n const { language = \"ch\", pageRange, ocr, formula, table, timeout = DEFAULT_TIMEOUT_POLL_SINGLE } = options;\n\n let taskId: string;\n if (isUrl(source)) {\n taskId = await this.flashSubmitUrl(source, language, pageRange, ocr, formula, table);\n } else {\n taskId = await this.flashSubmitFile(source, language, pageRange, ocr, formula, table);\n }\n\n return this.flashWait(taskId, timeout);\n }\n\n // โ”€โ”€ Flash internal helpers โ”€โ”€\n\n private async flashSubmitUrl(\n url: string,\n language: string,\n pageRange?: string,\n ocr?: boolean,\n formula?: boolean,\n table?: boolean,\n ): Promise<string> {\n const payload: Record<string, unknown> = { url, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n if (ocr != null) payload[\"is_ocr\"] = ocr;\n if (formula != null) payload[\"enable_formula\"] = formula;\n if (table != null) payload[\"enable_table\"] = table;\n const body = await this.flashApi.post(\"/parse/url\", payload);\n return body.data[\"task_id\"] as string;\n }\n\n private async flashSubmitFile(\n filePath: string,\n language: string,\n pageRange?: string,\n ocr?: boolean,\n formula?: boolean,\n table?: boolean,\n ): Promise<string> {\n const fileName = basename(filePath);\n const payload: Record<string, unknown> = { file_name: fileName, language };\n if (pageRange != null) payload[\"page_range\"] = pageRange;\n if (ocr != null) payload[\"is_ocr\"] = ocr;\n if (formula != null) payload[\"enable_formula\"] = formula;\n if (table != null) payload[\"enable_table\"] = table;\n const body = await this.flashApi.post(\"/parse/file\", payload);\n const taskId = body.data[\"task_id\"] as string;\n const fileUrl = body.data[\"file_url\"] as string;\n\n const data = await readFile(filePath);\n await this.flashApi.putFile(fileUrl, new Uint8Array(data));\n return taskId;\n }\n\n private async flashWait(\n taskId: string,\n timeout: number,\n ): Promise<ExtractResult> {\n const deadline = Date.now() + timeout * 1000;\n let interval = 2000;\n for (;;) {\n const result = await this.flashGetTask(taskId);\n if (result.state === \"done\" || result.state === \"failed\") return result;\n if (Date.now() > deadline) throw new TimeoutError(timeout, taskId);\n await sleep(Math.min(interval, Math.max(0, deadline - Date.now())));\n interval = Math.min(interval * 2, 30_000);\n }\n }\n\n private async flashGetTask(taskId: string): Promise<ExtractResult> {\n const body = await this.flashApi.get(`/parse/${taskId}`);\n return this.parseFlashTask(body.data);\n }\n\n private async parseFlashTask(\n data: Record<string, unknown>,\n ): Promise<ExtractResult> {\n const result = createEmptyResult(\n (data[\"task_id\"] as string) ?? \"\",\n (data[\"state\"] as string) ?? \"unknown\",\n );\n const errCodeRaw = data[\"err_code\"];\n result.errCode = errCodeRaw == null ? \"\" : String(errCodeRaw);\n result.error = (data[\"err_msg\"] as string) || null;\n\n const ep = data[\"extract_progress\"] as\n | Record<string, unknown>\n | undefined;\n if (ep) {\n result.progress = {\n extractedPages: (ep[\"extracted_pages\"] as number) ?? 0,\n totalPages: (ep[\"total_pages\"] as number) ?? 0,\n startTime: (ep[\"start_time\"] as string) ?? \"\",\n };\n }\n\n if (result.state === \"done\" && data[\"markdown_url\"]) {\n result.markdown = await this.flashApi.downloadText(\n data[\"markdown_url\"] as string,\n );\n }\n\n return result;\n }\n}\n","export class MinerUError extends Error {\n readonly code: string;\n readonly traceId: string;\n\n constructor(code: string | number, message: string, traceId = \"\") {\n const tag = traceId ? ` (trace: ${traceId})` : \"\";\n super(`[${code}] ${message}${tag}`);\n this.name = \"MinerUError\";\n this.code = String(code);\n this.traceId = traceId;\n }\n}\n\nexport class AuthError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"AuthError\";\n }\n}\n\nexport class ParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ParamError\";\n }\n}\n\nexport class FileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FileTooLargeError\";\n }\n}\n\nexport class PageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"PageLimitError\";\n }\n}\n\nexport class TaskNotFoundError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"TaskNotFoundError\";\n }\n}\n\nexport class ExtractFailedError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"ExtractFailedError\";\n }\n}\n\nexport class TimeoutError extends MinerUError {\n readonly timeout: number;\n readonly taskId: string;\n\n constructor(timeout: number, taskId: string) {\n super(\"TIMEOUT\", `Task ${taskId} did not complete within ${timeout}s`);\n this.name = \"TimeoutError\";\n this.timeout = timeout;\n this.taskId = taskId;\n }\n}\n\nexport class QuotaExceededError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"QuotaExceededError\";\n }\n}\n\n// Flash API specific errors\n\nexport class FlashFileTooLargeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashFileTooLargeError\";\n }\n}\n\nexport class FlashUnsupportedTypeError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashUnsupportedTypeError\";\n }\n}\n\nexport class FlashPageLimitError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashPageLimitError\";\n }\n}\n\nexport class FlashParamError extends MinerUError {\n constructor(code: string | number, message: string, traceId = \"\") {\n super(code, message, traceId);\n this.name = \"FlashParamError\";\n }\n}\n\nexport class NoAuthClientError extends MinerUError {\n constructor() {\n super(\n \"-1\",\n \"This operation requires an authenticated client; pass token to MinerU() or set MINERU_TOKEN env var.\",\n );\n this.name = \"NoAuthClientError\";\n }\n}\n\nconst CODE_TO_ERROR: Record<string, typeof MinerUError> = {\n A0202: AuthError,\n A0211: AuthError,\n \"-500\": ParamError,\n \"-10002\": ParamError,\n \"-60005\": FileTooLargeError,\n \"-60006\": PageLimitError,\n \"-60010\": ExtractFailedError,\n \"-60012\": TaskNotFoundError,\n \"-60013\": MinerUError,\n \"-60018\": QuotaExceededError,\n \"-60019\": QuotaExceededError,\n \"-30001\": FlashFileTooLargeError,\n \"-30002\": FlashUnsupportedTypeError,\n \"-30003\": FlashPageLimitError,\n \"-30004\": FlashParamError,\n};\n\nexport function raiseForCode(\n code: number | string,\n msg: string,\n traceId = \"\",\n): never {\n const ErrorClass = CODE_TO_ERROR[String(code)] ?? MinerUError;\n throw new ErrorClass(code, msg, traceId);\n}\n","import { raiseForCode } from \"./errors.js\";\nimport { UPLOAD_TIMEOUT_MS } from \"./constants.js\";\n\ninterface ApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class ApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(token: string, baseUrl: string, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<ApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<ApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n headers: this.headers,\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, {\n method: \"PUT\",\n body: data,\n signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS),\n });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async download(url: string): Promise<Uint8Array> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return new Uint8Array(await resp.arrayBuffer());\n }\n\n private async handle(resp: Response): Promise<ApiResponse> {\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` โ€” ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as ApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { raiseForCode } from \"./errors.js\";\nimport { DEFAULT_FLASH_BASE_URL, UPLOAD_TIMEOUT_MS } from \"./constants.js\";\n\ninterface FlashApiResponse {\n code: number;\n msg?: string;\n trace_id?: string;\n data: Record<string, unknown>;\n}\n\nexport class FlashApiClient {\n private readonly baseUrl: string;\n private readonly headers: Record<string, string>;\n private source: string;\n\n constructor(baseUrl: string = DEFAULT_FLASH_BASE_URL, source = \"\") {\n this.baseUrl = baseUrl;\n this.headers = { \"Content-Type\": \"application/json\" };\n this.source = source;\n }\n\n setSource(source: string): void {\n this.source = source;\n }\n\n async post(\n path: string,\n json: Record<string, unknown>,\n ): Promise<FlashApiResponse> {\n const headers: Record<string, string> = { ...this.headers };\n if (this.source) {\n headers[\"source\"] = this.source;\n }\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(json),\n });\n return this.handle(resp);\n }\n\n async get(path: string): Promise<FlashApiResponse> {\n const resp = await fetch(`${this.baseUrl}${path}`, {\n method: \"GET\",\n });\n return this.handle(resp);\n }\n\n async putFile(url: string, data: Uint8Array): Promise<void> {\n const resp = await fetch(url, { method: \"PUT\", body: data, signal: AbortSignal.timeout(UPLOAD_TIMEOUT_MS) });\n if (!resp.ok) {\n throw new Error(`Upload failed: ${resp.status} ${resp.statusText}`);\n }\n }\n\n async downloadText(url: string): Promise<string> {\n const resp = await fetch(url, { redirect: \"follow\" });\n if (!resp.ok) {\n throw new Error(`Download failed: ${resp.status} ${resp.statusText}`);\n }\n return resp.text();\n }\n\n private async handle(resp: Response): Promise<FlashApiResponse> {\n if (resp.status === 429) {\n raiseForCode(\n \"RATE_LIMITED\",\n \"flash API rate limit exceeded; try again later\",\n );\n }\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n throw new Error(\n `HTTP ${resp.status}: ${resp.statusText}${text ? ` โ€” ${text}` : \"\"}`,\n );\n }\n const body = (await resp.json()) as FlashApiResponse;\n if (body.code !== 0) {\n raiseForCode(body.code, body.msg ?? \"unknown error\", body.trace_id ?? \"\");\n }\n return body;\n }\n}\n","import { writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nexport interface Image {\n name: string;\n data: Uint8Array;\n path: string;\n}\n\nexport interface Progress {\n extractedPages: number;\n totalPages: number;\n startTime: string;\n}\n\nexport function progressPercent(p: Progress): number {\n if (p.totalPages === 0) return 0;\n return (p.extractedPages / p.totalPages) * 100;\n}\n\nexport function progressToString(p: Progress): string {\n return `${p.extractedPages}/${p.totalPages} (${progressPercent(p).toFixed(0)}%)`;\n}\n\nexport interface ExtractResult {\n taskId: string;\n state: string;\n filename: string | null;\n errCode: string;\n error: string | null;\n zipUrl: string | null;\n\n progress: Progress | null;\n\n markdown: string | null;\n contentList: Record<string, unknown>[] | null;\n images: Image[];\n\n docx: Uint8Array | null;\n html: string | null;\n latex: string | null;\n\n /** @internal */\n _zipBytes: Uint8Array | null;\n}\n\nexport function createEmptyResult(\n taskId: string,\n state: string,\n): ExtractResult {\n return {\n taskId,\n state,\n filename: null,\n errCode: \"\",\n error: null,\n zipUrl: null,\n progress: null,\n markdown: null,\n contentList: null,\n images: [],\n docx: null,\n html: null,\n latex: null,\n _zipBytes: null,\n };\n}\n\nasync function ensureDir(filePath: string): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n}\n\nexport async function saveMarkdown(\n result: ExtractResult,\n path: string,\n withImages = true,\n): Promise<void> {\n if (result.markdown == null) {\n throw new Error(\"No markdown content available (state != done)\");\n }\n await ensureDir(path);\n await writeFile(path, result.markdown, \"utf-8\");\n if (withImages && result.images.length > 0) {\n const imgDir = join(dirname(path), \"images\");\n await mkdir(imgDir, { recursive: true });\n for (const img of result.images) {\n await writeFile(join(imgDir, img.name), img.data);\n }\n }\n}\n\nexport async function saveDocx(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.docx == null) {\n throw new Error(\n \"No docx content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.docx);\n}\n\nexport async function saveHtml(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.html == null) {\n throw new Error(\n \"No html content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.html, \"utf-8\");\n}\n\nexport async function saveLatex(\n result: ExtractResult,\n path: string,\n): Promise<void> {\n if (result.latex == null) {\n throw new Error(\n \"No latex content available\",\n );\n }\n await ensureDir(path);\n await writeFile(path, result.latex, \"utf-8\");\n}\n\nexport async function saveAll(\n result: ExtractResult,\n dir: string,\n): Promise<void> {\n if (result._zipBytes == null) {\n throw new Error(\"No zip data available (state != done)\");\n }\n const { unzipSync } = await import(\"fflate\");\n const entries = unzipSync(new Uint8Array(result._zipBytes));\n await mkdir(dir, { recursive: true });\n for (const [relativePath, content] of Object.entries(entries)) {\n if (relativePath.endsWith(\"/\")) continue;\n const fullPath = join(dir, relativePath);\n await ensureDir(fullPath);\n await writeFile(fullPath, content);\n }\n}\n","import { unzipSync } from \"fflate\";\nimport type { ExtractResult, Image } from \"./models.js\";\nimport { createEmptyResult } from \"./models.js\";\n\nconst IMAGE_EXTENSIONS = new Set([\n \".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\", \".svg\", \".webp\",\n]);\n\nfunction extname(filename: string): string {\n const dot = filename.lastIndexOf(\".\");\n return dot === -1 ? \"\" : filename.slice(dot).toLowerCase();\n}\n\nfunction basename(filepath: string): string {\n const parts = filepath.replace(/\\\\/g, \"/\").split(\"/\");\n return parts[parts.length - 1] ?? \"\";\n}\n\nexport function parseZip(\n zipBytes: Uint8Array,\n taskId: string,\n filename: string | null = null,\n): ExtractResult {\n const result = createEmptyResult(taskId, \"done\");\n result.filename = filename;\n result._zipBytes = zipBytes;\n\n const entries = unzipSync(zipBytes);\n const images: Image[] = [];\n let contentList: Record<string, unknown>[] | null = null;\n\n for (const [relPath, data] of Object.entries(entries)) {\n if (relPath.endsWith(\"/\")) continue;\n\n const name = basename(relPath);\n const ext = extname(name);\n const text = () => new TextDecoder().decode(data);\n\n if (ext === \".md\") {\n result.markdown = text();\n } else if (\n name.endsWith(\"_content_list.json\") ||\n name === \"content_list.json\"\n ) {\n contentList = JSON.parse(text()) as Record<string, unknown>[];\n } else if (ext === \".json\" && contentList == null) {\n try {\n const parsed: unknown = JSON.parse(text());\n if (Array.isArray(parsed)) {\n contentList = parsed as Record<string, unknown>[];\n }\n } catch {\n // not a valid JSON array โ€” skip\n }\n } else if (IMAGE_EXTENSIONS.has(ext)) {\n images.push({ name, data: new Uint8Array(data), path: relPath });\n } else if (ext === \".docx\") {\n result.docx = new Uint8Array(data);\n } else if (ext === \".html\" || ext === \".htm\") {\n result.html = text();\n } else if (ext === \".tex\") {\n result.latex = text();\n }\n }\n\n result.contentList = contentList;\n result.images = images;\n return result;\n}\n"],"mappings":"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","names":["basename","extname","unzipSync","extname","basename"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mineru-open-sdk",
3
- "version": "0.2.1",
3
+ "version": "0.2.5",
4
4
  "description": "MinerU API SDK โ€” one line to turn documents into Markdown",
5
5
  "license": "Apache-2.0",
6
6
  "author": "yangqi",