xparse-cli 2.6.0-beta.1 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +13 -711
  2. package/package.json +8 -12
package/README.md CHANGED
@@ -1,723 +1,25 @@
1
- # TextIn xParse CLI
1
+ # xparse-cli
2
2
 
3
- TextIn xParse 文档解析命令行工具,基于 [TextIn xParse API](https://docs.textin.com/api-reference/endpoint/xparse/v1/parse-sync) 实现。
3
+ TextIn xParse command-line client for document parsing, image correction and manipulation detection.
4
4
 
5
- 支持将 PDF、图片、Office 文档等 20+ 格式转换为 Markdown 及结构化数据。
5
+ ## Install
6
6
 
7
- ## 安装
8
-
9
- 需要 Node.js 18 或更高版本:
10
-
11
- ### 安装正式版
12
-
13
- ```bash
7
+ ```sh
14
8
  npm install --global xparse-cli
15
- ```
16
-
17
- 国内网络可以显式使用 npmmirror:
18
-
19
- ```bash
20
- npm install --global --registry=https://registry.npmmirror.com xparse-cli
21
- ```
22
-
23
- 安装后运行以下命令检查版本:
24
-
25
- ```bash
26
9
  xparse-cli version
27
10
  ```
28
11
 
29
- ### 安装 beta 或精确版本
30
-
31
- 跟随当前 beta:
32
-
33
- ```bash
34
- npm install --global xparse-cli@beta
35
- ```
36
-
37
- 为了获得可复现的测试环境,应安装精确版本:
38
-
39
- ```bash
40
- npm install --global xparse-cli@2.6.0-beta.1
41
- ```
42
-
43
- ### 升级
44
-
45
- ```bash
46
- npm install --global xparse-cli@latest
47
- ```
48
-
49
- beta、精确版本以及国内镜像同样通过 `npm install --global` 管理。CLI 不再单独下载或替换二进制文件。
50
-
51
- WorkBuddy 集成、国内/海外 Connector 区别、beta 命名规则及完整发版步骤见
52
- [WorkBuddy Connector 概念与发版流程](docs/workbuddy_connector_release.md)。
53
-
54
- ## Remote MCP 服务
55
-
56
- 同一 Go module 还提供 `cmd/xparse-mcp`。它与 CLI 复用 `internal/client` 和
57
- `internal/parseflow`,因此解析参数、额度路由、顺序执行、一次重试和多段结果合并使用
58
- 同一份实现。MCP 只接受服务端可访问的 `file_url` 或已上传的 `file_id`;本地文件由
59
- MCP Host 先调用 `prepare_file_upload`,按返回的通用上传会话直接上传到 TextIn。
60
-
61
- 国内 MCP 新增 `detect_manipulation`,接受 `file_url` 或 `file_id`,支持可选的
62
- `tamper_threshold`、`aigc_threshold`。本地文件先调用
63
- `prepare_file_upload`,设置 `operation=detect_manipulation`,上传后逐个检测。
64
- `get_quota` 可指定 `service=manipulation_detection`。额度不足或未知时,须取得
65
- 用户对本次可能付费调用的同意后设置 `approve_paid=true`,不自动重试计费请求。
66
- 结果包含风险元数据和可选 JPEG 热力图内容块;`image_index` 按图片内容块从零编号。
67
- 图片展示与保存取决于 Host 能力;服务端不缩图,不通过普通文本返回 Base64。
68
-
69
- 国内切边增强矫正通过 CLI `crop-enhance`、MCP `crop_enhance` 调用。
70
- MCP 同样接受 `file_url` 或 `file_id`;本地上传指定 `operation=crop_enhance`。
71
- 查询独立额度使用 `quota --service crop_enhance_image` 或
72
- `get_quota` 的同名 `service`。未传参数时保持服务默认值:开启切边、形变矫正,
73
- 关闭增强和方向校正。CLI 保存结果 JSON 和全部 JPEG;MCP 按顺序返回原始图片内容块。
74
- 仅坐标模式 `only_position=1` 无图片属于正常结果。
75
-
76
- ```bash
77
- xparse-cli crop-enhance scan.jpg --enhance-mode 5 --view json
78
- xparse-cli crop-enhance scan.jpg --crop-image 0 --dewarp-image 0 --enhance-mode 2
79
- ```
80
-
81
- 两类图像服务共用请求、鉴权头、额度判断和结果拆图;CLI 负责落盘,MCP 负责
82
- 协议输出。接口及改造边界见 [图像工具实现说明](docs/image-tools.md)。
83
-
84
- MCP 是独立容器产物,不进入 npm CLI 包:
85
-
86
- ```bash
87
- make mcp-build
88
- make mcp-image MCP_IMAGE=registry.example/xparse-mcp:tag
89
- ```
90
-
91
- 服务通过 OAuth 验证 audience 绑定的 MCP Token,再使用通用 OAuth Token Exchange
92
- 取得短时委托 Token 调用公开 xParse API;不会调用 workflow-backend 内部 MCP 路由,
93
- 也不识别平台或维护 T币确认状态。
94
-
95
- MCP 服务使用 `gopkg/tlog` 输出 JSON 日志,通过 `gopkg/ttrace` 将请求 trace
96
- 发送到 OTLP HTTP 采集器。部署时配置 `OTEL_PROVIDER_ENDPOINT`,值为 `host:port`
97
- (不带协议和路径);国内 TEST/PRE 与现有后端一致,使用 `jaeger-collector:4318`。
98
- 本地调试可指向本机采集器,例如 `OTEL_PROVIDER_ENDPOINT=localhost:4318`。
99
- trace 服务名为 `xparse-mcp`;请求日志和后台遥测发送日志保留同一 `trace_id`,
100
- 请求取消不影响后台发送原有的超时和关闭逻辑。退出时先等待遥测发送,再刷新 trace。
101
-
102
- 构建依赖私有模块 `gitlab.intsig.net/ke_wang/gopkg`。本地 Go 开发需配置
103
- `GOPRIVATE=gitlab.intsig.net` 和 GitLab 读取权限;镜像构建通过 BuildKit secret
104
- `gitlab_token` 传入可读取该模块的 `CI_JOB_TOKEN`,令牌不写入镜像或源码。
105
- `make mcp-image` 同样读取该环境变量;GitLab 的 `gopkg` 项目需允许此项目的 Job Token
106
- 读取仓库。
107
-
108
- ## 开发与发布 Make 命令
109
-
110
- 仓库根目录的 `Makefile` 统一管理 WorkBuddy Connector 组包和 npm 发布。
111
- `REGION` 未设置或为空时默认生成国内包。
112
-
113
- 生成国内、海外或双区域的 Connector 正式审核包:
114
-
115
- ```bash
116
- make connector-review
117
- make connector-review REGION=global
118
- make connector-review-all
119
- ```
120
-
121
- 生成指定环境的 Connector 测试安装包。`VERSION` 为需要测试的精确 CLI 版本,
122
- `ENVIRONMENT` 支持 `test`、`pre` 和 `prod`:
123
-
124
- ```bash
125
- make connector-test VERSION=2.3.1-beta.1 ENVIRONMENT=test
126
- ```
127
-
128
- 如需使用其他通用 xParse Skill 目录,可显式传入:
129
-
130
- ```bash
131
- make connector-test \
132
- VERSION=2.3.1-beta.1 \
133
- ENVIRONMENT=test \
134
- SKILL_DIR=/path/to/xparse-skills/skills/xparse-parse
135
- ```
136
-
137
- 同步 npm 持久版本。该命令会更新主包版本、六个平台依赖版本、npm tag 和
138
- `release-lock.json` 的基础版本:
139
-
140
- ```bash
141
- make set-version VERSION=2.3.1-beta.1
142
- ```
143
-
144
- 执行七个 npm 包的完整打包与发布 dry-run,不会上传包:
145
-
146
- ```bash
147
- make npm-publish-dry-run VERSION=2.3.1-beta.1
148
- ```
149
-
150
- 正式发布七个 npm 包必须同时指定精确版本和确认开关:
151
-
152
- ```bash
153
- make npm-publish VERSION=2.3.1-beta.1 CONFIRM_PUBLISH=1
154
- ```
155
-
156
- `npm-publish` 和 `npm-publish-dry-run` 都会先同步版本,并校验命令版本、源码
157
- manifest、staging 目录和七个待发布包完全一致。stable 版本发布到 `latest`,
158
- `-beta.*` 版本发布到 `beta`。
159
-
160
- ## 快速开始
161
-
162
- ### 1. 零配置解析(自动使用免费额度)
163
-
164
- ```bash
165
- # 输出 Markdown 到终端
166
- xparse-cli parse report.pdf
167
-
168
- # JSON 视图
169
- xparse-cli parse report.pdf --view json
170
-
171
- # 保存到目录
172
- xparse-cli parse report.pdf --output ./output/
173
-
174
- # 指定页码范围
175
- xparse-cli parse report.pdf --page-range "1-5"
176
-
177
- # 加密 PDF
178
- xparse-cli parse secret.pdf --password mypassword
179
- ```
180
-
181
- ### 2. 付费 API(可选)
182
-
183
- 前往 [TextIn 控制台](https://www.textin.com/user/login?redirect=%252Fconsole%252Fdashboard%252Fsetting&from=xparse-parse-skill) 获取凭证(`x-ti-app-id` 和 `x-ti-secret-code`),然后运行:
184
-
185
- ```bash
186
- xparse-cli auth
187
- ```
188
-
189
- 按提示输入 App ID 和 Secret Code,凭证将保存至 `~/.xparse-cli/config.yaml`。
190
-
191
- 也可通过环境变量配置(适合 CI/CD):
192
-
193
- ```bash
194
- export XPARSE_APP_ID=your_app_id
195
- export XPARSE_SECRET_CODE=your_secret_code
196
- ```
197
-
198
- ```bash
199
- # 显式使用付费 API
200
- xparse-cli parse report.pdf --api paid
201
- ```
202
-
203
- ### 3. 多文件 Task Runtime(Agent 推荐)
204
-
205
- 解析与抽取统一使用 `task run`:省略 `--task-type` 时仍为解析,原有参数兼容。
206
-
207
- 独立上传可先取得原始 File Asset ID,不会启动解析或抽取;同一操作重试请保留 `--operation-id`:
208
-
209
- ```bash
210
- xparse-cli upload contract.pdf --operation-id <OPERATION_ID>
211
- xparse-cli task run --task-type extract --instruction '抽取甲乙方' --file-id <UPLOADED_FILE_ID>
212
- ```
213
-
214
- 创建抽取任务时,服务端复用已有解析结果;尚未解析的文件进入现有付费托管解析。解析费与抽取费分别按现有规则结算。创建响应的 `document_count` 仅计已接入抽取的文件,未解析文件可能尚未计入;CLI 的 `submitted_file_count` 是本次提交的 ID 数。
215
-
216
- ```bash
217
- xparse-cli task run --task-type parse a.pdf
218
- xparse-cli task run --task-type extract --instruction '抽取编号与金额' --file-id <FILE_ID>
219
- xparse-cli task add <PARSE_TASK_ID> b.pdf
220
- xparse-cli task add <EXTRACTION_TASK_ID> --file-id <FILE_ID>
221
- xparse-cli task status <TASK_ID>
222
- xparse-cli task result <TASK_ID> --limit 50
223
- xparse-cli task export <EXTRACTION_TASK_ID> --format json --output ./results
224
- ```
225
-
226
- 顶层 `extract` 已移除。创建抽取接受刚上传或已解析的 File Asset,解析专用参数不能用于抽取;追加文件的 `task add --file-id` 仍只接受已解析文件。
227
- 追加根据服务端类型分发;解析会追加输入并请求新一轮处理,抽取沿用既有任务要求。
228
- 解析追加若绑定后启动失败,应保留 `operation_id`、`task_id` 并按错误提示恢复。
229
-
230
- 抽取分页返回 `snapshot`,后续页使用 `--offset` 和同一个 `--snapshot`;快照变化应重取。
231
- 抽取 JSON/CSV 导出分别写入目录内 `results.json` / `results.csv`,只含就绪文档的业务结果;
232
- 命令响应单独返回完整性、未完成/失败文件和需复核字段,不能将部分导出视为全量成功。
233
- 标量保留字符串(不把编号转换为数字),对象/数组保持结构,未找到的值为 null。
234
- 旧解析 `--view markdown|json`、`--output` 目录及 `task read/rerun` 保持兼容。
235
- 新服务端提供抽取类型及结果投影后才能使用新查询与导出命令。
236
-
237
- Task Runtime 把上传、执行状态和结果交给服务端持久化。`task run` 默认在提交 Run
238
- 成功后立即返回 `operation_id`、`task_id` 和 `run_id`;Agent 后续锁定该 Run 查看进度,完成后再按需读取或导出结果,不需要把全部结果放进上下文。WorkBuddy 下 stderr 输出 `xparse_event.v1` JSONL:服务端接受 Run 后立即输出 `run_accepted`,后续状态变化输出 `run_status`;stdout 始终只输出一份最终提交 JSON。
239
-
240
- ```bash
241
- xparse-cli task run --files 'contracts/*.pdf'
242
- xparse-cli task status <task-id> --run-id <run-id>
243
- xparse-cli task export <task-id> --run-id <run-id> --output ./task-output
244
- xparse-cli task export <task-id> --run-id <run-id> --view json --output ./task-json
245
- xparse-cli task read <task-id> contract-a.pdf --run-id <run-id>
246
- xparse-cli task debug <task-id> --run-id <run-id>
247
- ```
248
-
249
- `task export` 默认导出 Markdown;需要消费完整 xParse 结构化结果时显式使用
250
- `--view json`。两种视图都会生成 `task-manifest.json`,其中包含
251
- `total_count`、`completed_count`、`failed_count`、`exported_count` 以及每个文件的
252
- 状态、输出文件名和失败恢复信息,调用方不得把部分成功静默当作全量完成。
253
-
254
- 需要在同一个 Task 下创建新 Run 时,显式选择重跑范围:
255
-
256
- ```bash
257
- # 重跑 Task 已绑定的全部 Resource
258
- xparse-cli task rerun <task-id> --mode all
259
-
260
- # 上传新文件、绑定到现有 Task,并仅处理新 Resource
261
- xparse-cli task rerun <task-id> --mode new-files --files 'new-docs/*.pdf'
262
-
263
- # 只重跑指定的已有 Resource;--resource-id 可重复
264
- xparse-cli task rerun <task-id> --mode selected-files \
265
- --resource-id <resource-id> --resource-id <resource-id>
266
- ```
267
-
268
- `new-files` 不创建替代 Task;返回结果沿用原 `task_id` 并生成新的 `run_id`。
269
- 若新文件受密码保护,使用可重复的 `--password`,多文件时按
270
- `selector=password` 绑定。
271
-
272
- 若提交响应丢失,使用进度事件或错误详情中的同一 `operation_id` 重试:
273
-
274
- ```bash
275
- xparse-cli task run --files 'contracts/*.pdf' --operation-id <operation-id>
276
- ```
277
-
278
- 同一操作 ID 会生成 Task 与 Run 两层幂等键;改了文件、模式或配置后必须使用新的操作 ID。
279
-
280
- 需要在一个终端命令中等待完成并导出时,显式使用 `--wait`:
281
-
282
- ```bash
283
- xparse-cli task run --files 'contracts/*.pdf' --wait --output ./task-output
284
- ```
285
-
286
- `--wait` 只是在客户端持续轮询同一个 `run_id`,不会把服务端 Task 变成同步任务。达到
287
- `--timeout` 时 CLI 正常退出并返回当前状态、原 `task_id` / `run_id`、
288
- `wait_timed_out: true` 和 `next_action: "POLL_STATUS"`;它不会取消或重建 Run。之后使用
289
- `task status` 继续查询同一个 Run。Agent 流程默认不使用 `--wait`,也不要自动附加较短的固定超时。
290
-
291
- 单个文件的密码与 `parse` 一样直接使用 `--password`,CLI 会在第一次上传时携带密码:
292
-
293
- ```bash
294
- xparse-cli task run secret.pdf --password open-password
295
- ```
296
-
297
- 多个输入中只有部分文件有密码时,只为受保护文件重复传入 `selector=password` 绑定。selector
298
- 可使用精确路径、唯一文件名,或 `PASSWORD_INPUT_REQUIRED` 返回的稳定 selector:
299
-
300
- ```bash
301
- xparse-cli task run a.pdf b.jpg c.pdf \
302
- --password a.pdf=open-a \
303
- --password c.pdf=open-c
304
- ```
305
-
306
- 如果上传阶段返回 `PASSWORD_INPUT_REQUIRED`,CLI 会扫描完本批次并一次性返回所有缺失或错误
307
- 密码文件。使用返回的 selector 和同一 `operation_id` 补充 `--password selector=password`,然后
308
- 重放原始命令:首次提交重放 `task run`,`task rerun --mode new-files` 增加文件时则重放原 rerun。
309
- 显式复用同一 `operation_id` 时,CLI 会复用已 ready 的上传资产。此时即使错误中已有 `task_id`,
310
- 尚未成功上传的新文件也不是 Task Resource,不能使用 `task continue`。
311
-
312
- 只有 Task Run 已经接受、`task debug` 确认现有 Resource 在执行阶段返回密码错误时,才更新该
313
- Resource 的访问密码并创建 selected-files Run:
314
-
315
- ```bash
316
- xparse-cli task continue <task-id> \
317
- --password <resource-id>=open-password
318
- ```
319
-
320
- `continue` 同样默认提交即返回;保存新的 `run_id`,完成后再单独执行 `task export`。只有显式添加 `--wait` 时才能同时使用 `--output`。
321
-
322
- 等待人工付费授权或充值后,必须恢复精确 Run:
323
-
324
- ```bash
325
- xparse-cli task resume <task-id> --run-id <run-id> --approve-paid
326
- xparse-cli task resume <task-id> --run-id <run-id> --after-funding
327
- ```
328
-
329
- 文件资源只保存加密的文件访问密码;`force_engine`、页范围和 capabilities 属于具体 Run。Runtime 的 MinerU 恢复只覆盖当前失败 RunItem,不会写回可复用资源。`--api auto/free` 不会自动授权付费;需要付费时会停在可见状态并要求人工批准。
330
-
331
- 也可以使用 OAuth。正式二进制默认使用无 Secret 的 public client
332
- `cli_textin_xparse`;私有部署可以通过 flag、环境变量或配置文件覆盖:
333
-
334
- ```bash
335
- # 终端中进入 AppKey / OAuth / 状态 / 登出选单
336
- xparse-cli auth
337
-
338
- export XPARSE_OAUTH_CLIENT_ID=cli_your_registered_client
339
-
340
- # Device Flow(SSH、服务器、Agent 推荐)
341
- xparse-cli auth device --open-browser=never
342
-
343
- # 本地桌面 Authorization Code + PKCE;默认使用系统分配的可用回调端口
344
- xparse-cli auth browser
345
-
346
- # 强制重新展示授权确认页
347
- xparse-cli auth browser --prompt=consent
348
-
349
- # 显式使用 OAuth 调用 paid API
350
- xparse-cli parse report.pdf --api paid --auth-method oauth
351
- ```
352
-
353
- 认证选单使用方向键或 `j`/`k` 移动,`Enter` 确认,`Esc` 或 `Ctrl+C` 取消。
354
- 菜单会显示当前环境、OAuth/AppKey 配置状态和当前生效的认证方式。需要屏幕阅读器兼容的
355
- 线性提示时,可设置 `XPARSE_TUI_ACCESSIBLE=1`。
356
-
357
- WorkBuddy Connector 使用显式 Profile,避免依赖任务进程是否继承 Connector 环境变量:
358
-
359
- ```bash
360
- xparse-cli --profile workbuddy auth device --open-browser=always
361
- xparse-cli --profile workbuddy parse report.pdf --api paid --auth-method oauth
362
- ```
363
-
364
- 该 Profile 的凭证保存在 `~/.xparse-cli/profiles/workbuddy/`,其登录和登出不会影响
365
- 终端中默认的 `~/.xparse-cli` 凭证;请求会自动携带 `X-From: workbuddy`。
366
-
367
- Larkoffice 使用相同的认证和 Task 命令行为,凭证保存在独立的
368
- `~/.xparse-cli/profiles/larkoffice/`。OAuth 默认使用国内公开客户端
369
- `cli_textin_xparse_larkoffice`,仍遵循 `--client-id`、环境变量和配置文件的覆盖顺序;
370
- AppKey 回退与 WorkBuddy 相同。请求自动携带 `X-From: larkoffice`。
371
-
372
- ```bash
373
- xparse-cli --profile larkoffice auth device --open-browser=always --output=jsonl
374
- xparse-cli --profile larkoffice auth status --output=json
375
- xparse-cli --profile larkoffice parse report.pdf
376
- ```
377
-
378
- EasyClaw 使用独立的 OAuth-only Profile:
379
-
380
- ```bash
381
- xparse-cli --profile easyclaw auth device --output jsonl
382
- xparse-cli --profile easyclaw auth status --output json
383
- xparse-cli --profile easyclaw parse report.pdf
384
- xparse-cli --profile easyclaw parse report.pdf --api paid --auth-method oauth
385
- ```
386
-
387
- 该 Profile 固定使用 OAuth Client `cli_textin_xparse_easyclaw`,凭证保存在
388
- `~/.xparse-cli/profiles/easyclaw/`,不读取 AppKey 或其他 Profile 的 token。普通解析使用
389
- `auto` 路由:符合每日免费接口能力时优先使用每日额度,否则使用已有免费套餐;只有两类
390
- 额度都不足时才要求切换付费。请求自动携带 `X-From: easyclaw`。
391
-
392
- ## 命令一览
393
-
394
- | 命令 | 说明 |
395
- |------|------|
396
- | `xparse-cli parse` | 解析文档,输出 Markdown / JSON |
397
- | `xparse-cli upload` | 单文件上传,返回原始 File Asset ID,不启动解析 |
398
- | `xparse-cli task run` | 上传并执行多文件持久化 Task |
399
- | `xparse-cli task rerun` | 在现有 Task 下按 all/new-files/selected-files 创建新 Run |
400
- | `xparse-cli task status` | 查询 Task 和最新 Run 状态 |
401
- | `xparse-cli task export` | 按 Markdown/JSON 视图批量导出成功结果和带汇总计数的 manifest |
402
- | `xparse-cli task read` | 读取单个文件结果 |
403
- | `xparse-cli task debug` | 查看逐文件错误与恢复证据 |
404
- | `xparse-cli task continue` | 补充逐文件密码并选择性续跑 |
405
- | `xparse-cli task resume` | 在付费授权或充值确认后恢复精确 Run |
406
- | `xparse-cli auth` | TTY 中进入认证选单;非 TTY 保持旧版 AppKey 输入流程 |
407
- | `xparse-cli auth app-key` | 配置 AppKey 凭证 |
408
- | `xparse-cli auth device` | OAuth Device Flow 登录 |
409
- | `xparse-cli auth browser` | OAuth Authorization Code + PKCE 登录 |
410
- | `xparse-cli auth status` | 只读查看登录状态 |
411
- | `xparse-cli auth logout` | 删除指定认证方式的本地凭证 |
412
- | `xparse-cli config` | 管理配置(show / set / reset / path) |
413
- | `xparse-cli quota` | 查看解析与抽取免费额度 |
414
- | `xparse-cli quota --service manipulation_detection --output json` | 查看国内篡改检测免费套餐次数;不会发起检测 |
415
- | `xparse-cli download` | 下载解析结果中 elements 的图片 |
416
- | `xparse-cli cache` | 查看或清理本地文档缓存 |
417
- | `xparse-cli get_doc_info` | 读取本地 PDF 基础信息 |
418
- | `xparse-cli get_outline` | 读取缓存文档的目录结构 |
419
- | `xparse-cli read_content` | 按元素 ID 读取缓存内容 |
420
- | `xparse-cli read_pages` | 按页码范围读取缓存内容 |
421
- | `xparse-cli search_text` | 搜索缓存文档文本 |
422
- | `xparse-cli get_confidence` | 查询元素或页面的 OCR 置信度 |
423
- | `xparse-cli completion` | 生成 shell 自动补全脚本 |
424
- | `xparse-cli version` | 显示版本信息 |
425
-
426
- 全局参数 `--profile workbuddy` 或 `--profile easyclaw` 可放在子命令前后,用于选择隔离凭证。
427
-
428
- 文档解析缓存和 `doc_id` 元数据默认保存在 `~/.xparse-cli/cache` 与
429
- `~/.xparse-cli/docinfo`。Harness 或其他受沙箱管理的宿主可以为每个 session 设置绝对路径
430
- `XPARSE_STATE_DIR`,此时两类状态分别写入该目录下的 `cache/` 与 `docinfo/`。
431
- 该变量只改变文档状态目录,不改变 AppKey、OAuth 或 CLI 配置位置;相对路径会被拒绝。
432
-
433
- ## parse 命令参数
434
-
435
- | 参数 | 默认值 | 说明 |
436
- |------|--------|------|
437
- | `--view` | `markdown` | 输出视图:`markdown`、`json` |
438
- | `--api` | `auto` | API 模式:`auto`、`free`、`paid`;`auto` 根据服务端额度快照路由 |
439
- | `--auth-method` | _(自动)_ | 请求认证:`app-key`、`oauth` |
440
- | `--page-range` | | 页码范围:`"1-5"` 或 `"1-2,5-10"` |
441
- | `--password` | | 加密文档密码 |
442
- | `--include-hierarchy` | `true` | 元素层级关系与父子关联,默认开启。为 `false` 时关闭 |
443
- | `--include-inline-objects` | `true` | 内嵌对象:公式、手写、复选框、嵌入图片,默认开启。为 `false` 时关闭 |
444
- | `--include-image-data` | `true` | 图片 URL 及 Base64 数据,默认开启。为 `false` 时关闭 |
445
- | `--include-table-structure` | `true` | 表格单元格结构与坐标,默认开启。为 `false` 时关闭 |
446
- | `--include-pages` | `true` | 分页元数据与预览图 |
447
- | `--include-title-tree` | `true` | 文档标题层级目录树 |
448
- | `--include-char-details` | `false` | 返回字符级坐标和置信度 |
449
- | `--table-view` | `html` | 表格视图:`html`、`markdown` |
450
- | `--export` | | 额外导出格式:`docx`、`pdf`、`xlsx`,支持逗号分隔或重复传递;需配合 `--api paid --output <目录>` |
451
- | `--list` | | 从文件读取输入列表(需配合 `--output`) |
452
- | `--output` | _(stdout)_ | 输出文件路径或目录(目录不存在时自动创建) |
453
- | `--error-format` | `json` | 错误输出格式:`json`、`text` |
454
-
455
- **全局参数(所有命令均支持):**
456
-
457
- | 参数 | 说明 |
458
- |------|------|
459
- | `--app-id` | TextIn App ID(覆盖环境变量和配置文件) |
460
- | `--secret-code` | TextIn Secret Code(覆盖环境变量和配置文件) |
461
- | `--base-url` | API 地址(私有化部署时使用) |
462
- | `--profile` | 凭证 Profile:`workbuddy`、`easyclaw` |
463
- | `--task-context` | Agent 任务上下文 JSON 文件路径 |
464
- | `--verbose` | 调试模式,打印 HTTP 请求详情 |
465
-
466
- ### API capabilities 默认值
467
-
468
- CLI 默认开启以下能力,Agent 无需额外配置:
469
-
470
- | 能力 | 默认 |
471
- |------|------|
472
- | 标题层级 | 开启 |
473
- | 内嵌对象(图片) | 开启 |
474
- | 图片数据 | 开启 |
475
- | 表格视图 | `html` |
476
- | 表格结构 | 开启 |
477
- | 分页结果 | 开启 |
478
- | 目录树 | 开启 |
479
- | 字符级详情 | **关闭**(`--include-char-details` 开启) |
480
-
481
- ## 使用示例
482
-
483
- ### 导出其他格式
484
-
485
- ```bash
486
- # 自动下载 DOCX、PDF 和 XLSX 到输出目录
487
- xparse-cli parse report.pdf --api paid --export docx,pdf,xlsx --output ./results/
488
- ```
489
-
490
- `xlsx` 会自动使用 `config.scope=table`。CLI 使用付费解析的 AppKey 或 OAuth 身份
491
- 下载导出文件,输出为 `<basename>.docx`、`<basename>.pdf` 和 `<basename>.xlsx`。
492
- 若目标文件会覆盖输入原文,则改用 `<basename>.export.<format>`。
493
-
494
- ### 管道组合
495
-
496
- ```bash
497
- # 解析并搜索
498
- xparse-cli parse report.pdf | grep "revenue"
499
-
500
- # 解析并喂给 LLM
501
- xparse-cli parse paper.pdf | llm "summarize this paper"
502
- ```
503
-
504
- ### 批量处理
505
-
506
- ```bash
507
- # 从文件列表读取
508
- xparse-cli parse --list files.txt --output ./results/
509
- ```
510
-
511
- ### 下载图片
512
-
513
- ```bash
514
- # 从解析结果 JSON 中提取 elements 图片并下载
515
- xparse-cli download --from result.json --output ./images/
516
-
517
- # 直接下载图片 URL
518
- xparse-cli download https://web-api.textin.com/ocr_image/external/abc123.jpg --output ./images/
519
- ```
520
-
521
- ### 配置管理
522
-
523
- ```bash
524
- xparse-cli config show
525
- xparse-cli config set base_url https://your-server.com
526
- xparse-cli config reset
527
- xparse-cli config path
528
- ```
529
-
530
- ### 升级 CLI
531
-
532
- ```bash
533
- npm install --global xparse-cli@latest
534
- ```
535
-
536
- ### 调试模式
537
-
538
- ```bash
539
- xparse-cli parse report.pdf --verbose
540
- ```
541
-
542
- ## 凭证管理
543
-
544
- | 优先级 | 方式 | 说明 |
545
- |--------|------|------|
546
- | 1 | 命令行参数 | `--app-id` 和 `--secret-code` |
547
- | 2 | 环境变量 | `XPARSE_APP_ID` 和 `XPARSE_SECRET_CODE` |
548
- | 3 | 配置文件 | `~/.xparse-cli/config.yaml` |
549
-
550
- AppKey 与 OAuth Token 分开保存:
551
-
552
- ```text
553
- ~/.xparse-cli/config.yaml # AppKey 和非敏感 OAuth 偏好
554
- ~/.xparse-cli/oauth-token.json # OAuth Access/Refresh Token
555
- ```
556
-
557
- 目录权限固定为 `0700`,凭证文件固定为 `0600`,更新通过 fsync + rename 原子替换。
558
- `xparse-cli config reset` 只重置 YAML,不会删除 OAuth Token;请使用
559
- `xparse-cli auth logout --method oauth|app-key|all` 精确登出。
560
- OAuth 登出会先尝试通过 `/oauth21/revoke` 撤销 Refresh Token(没有时撤销 Access
561
- Token),随后始终删除本地 Token。远端暂时不可用只会产生警告,不会阻止本地登出;
562
- 登出不会删除服务端记住的 consent。
563
-
564
- OAuth 参数优先级:
565
-
566
- | 参数 | 优先级 |
567
- |------|--------|
568
- | Client ID | `--client-id` > `XPARSE_OAUTH_CLIENT_ID` > `oauth.client_id` > public default `cli_textin_xparse` |
569
- | Scope | `--scope` > `XPARSE_OAUTH_SCOPE` > `oauth.scope` > `ocr:*` |
570
- | Browser redirect | `--redirect-uri` > `XPARSE_OAUTH_REDIRECT_URI` > `oauth.redirect_uri` > `http://127.0.0.1:0/callback` |
571
- | Base URL | `--base-url` > `XPARSE_BASE_URL` > `base_url` > `https://api.textin.com` |
572
-
573
- 不传 `--api` 时使用 `auto`:CLI 先读取现有 quota 接口,在匿名每日免费额度与登录
574
- 用户的免费套餐额度之间制定执行计划。显式 `--api free` 固定调用免费 Agent 接口,
575
- 显式 `--api paid` 固定调用现有付费接口,不参与自动额度路由,但仍会读取 quota 中的
576
- `standard_max_file_size_mb`,在上传本地文件前执行标准接口大小预检。旧服务端未下发
577
- 该字段时使用 500MB 兼容值;URL 输入仍由服务端检查。
578
-
579
- 认证选择顺序为:显式 `--auth-method` / 环境或配置选择 > OAuth > 完整 AppKey >
580
- 匿名(仅可选认证接口)。自动选择 OAuth 时若刷新失败,会先回退完整 AppKey;两者都
581
- 不可用时,quota、免费解析与 telemetry 才匿名继续。显式选择 OAuth 失败不会切换身份。
582
- 篡改检测的命名 quota 查询需要认证,返回的 `free_package.free_remain_count`
583
- 与默认 quota 中的解析套餐和抽取每日额度无关;未返回套餐时额度为未知。
584
-
585
- 本地 PDF 会使用服务端返回的 `max_pages_per_request` 和 `max_file_size_mb` 预检。
586
- 仅页数超限且原文件体积合规时使用页范围分段;文件体积超限时生成真实临时 PDF
587
- 片段,按可重试错误最多重试一次,并按原始页码顺序合并结果。临时片段执行后删除。
588
-
589
- ## 退出码与错误处理
590
-
591
- `xparse-cli parse` 默认向 stderr 输出一行 JSON;stdout 仍只承载解析结果。退出码保持兼容:
592
-
593
- | 码 | 含义 |
594
- |----|------|
595
- | 0 | 成功 |
596
- | 1 | 一般错误 / 网络异常 |
597
- | 2 | 参数错误 |
598
- | 3 | API 返回错误 |
599
-
600
- 基础字段为 `schema_version`、`error_code`、`message`、`actual_value`、`limit`、
601
- `retryable` 和 `next_action`;需要时还会包含 `upgrade_url`、`request_id`、`task_id`
602
- 和 `details`。`actual_value` 与 `limit` 不可确认时为 `null`,不会使用过期的本地固定值。
603
-
604
- ```json
605
- {"schema_version":"xparse_error.v1","error_code":"FILE_TOO_LARGE","message":"file exceeds the current service limit","actual_value":{"file_size_mb":12.5},"limit":{"source":"service","max_file_size_mb":8},"retryable":false,"next_action":"REDUCE_FILE","request_id":"644e2efdb..."}
606
- ```
607
-
608
- 稳定错误码至少包括:`FILE_NOT_FOUND`、`EMPTY_FILE`、`UNSUPPORTED_FILE_TYPE`、
609
- `FILE_TOO_LARGE`、`PAGE_LIMIT_EXCEEDED`、`PAID_QUOTA_REQUIRED`、
610
- `AUTHENTICATION_FAILED`、`CAPABILITY_QUERY_FAILED`、`OUTPUT_FAILED`、`SPLIT_FAILED`、
611
- `MERGE_FAILED` 和 `RETRY_EXHAUSTED`。服务端返回 `40422` 时仍包装为
612
- `SERVICE_ERROR`,`message` 保留服务端给出的直接原因;程序判断使用 `next_action`,
613
- 诊断时可读取 `details.api_code` 和 `request_id`。
614
-
615
- 人工调试或兼容旧脚本时可使用 `--error-format=text`,恢复原有的多行文本与建议格式。
616
- 其他子命令继续使用原有文本错误格式。
617
-
618
- > stdout 仅输出文档内容,stderr 仅输出错误信息,exit code 严格为 0/1/2/3。
619
- > 完整的错误和建议枚举见 [suggestion.txt](suggestion.txt)。
620
-
621
- ## 支持的文件格式
622
-
623
- | 类型 | 格式 |
624
- |------|------|
625
- | 文档 | PDF, DOC, DOCX, TXT, RTF, OFD |
626
- | 图片 | PNG, JPG, JPEG, BMP, TIFF, WebP |
627
- | 表格 | XLS, XLSX, CSV |
628
- | 演示 | PPT, PPTX |
629
- | 网页 | HTML, MHTML |
630
-
631
- 限制:
632
-
633
- | 限制项 | 免费 API | 付费 API |
634
- |--------|----------|----------|
635
- | 文件大小 | 由 quota 的 `max_file_size_mb` 下发,PDF 可自动分片 | 由 quota 的 `standard_max_file_size_mb` 下发,旧服务端回退 500MB |
636
- | PDF 页数 | 由 quota 的 `max_pages_per_request` 下发,支持自动分段 | 1000 页 |
637
- | XLS/XLSX/CSV | — | 每 sheet ≤ 2000 行 × 100 列 |
638
- | TXT | — | ≤ 100KB |
639
- | 图片尺寸 | 20~20000 像素 | 20~20000 像素 |
640
-
641
- ### Extraction recovery
642
-
643
- `task status <task-id> --details` shows failed resources and private-result settlement status.
644
- For `pending_settlement`, retain the candidate identity and run:
645
-
646
- ```bash
647
- xparse-cli task retry <task-id> --resource-id <resource-id> --pending-result-id <pending-result-id>
648
- ```
649
-
650
- This settles the saved result without another model call. Replaying the same candidate is safe.
651
- The Task stays suspended; use `task result` or `task export` for delivered files. Explicit
652
- `task resume <task-id>` continues remaining Agent work and adds execution budget. Preserve its
653
- `command_id` and `checkpoint_version` for exact replay. Without a saved candidate, `task retry --resource-id RESOURCE_ID`
654
- re-extracts the one resource; do not blindly replay an ambiguous response.
655
-
656
- ## Extraction workspace commands
657
-
658
- The workspace commands below require a matching CLI build and backend. They do
659
- not create a replacement Task. Request JSON is read from `--input FILE` or stdin
660
- with `--input -`; values and version tokens are transmitted without reinterpretation.
661
-
662
- ```bash
663
- xparse-cli task retry TASK_ID
664
- xparse-cli task retry TASK_ID --scope selected --resource-id RESOURCE_ID --field-id FIELD_ID
665
- xparse-cli task retry TASK_ID --only-outdated
666
- xparse-cli task spec get TASK_ID
667
- xparse-cli task spec set TASK_ID --input fields.json
668
- xparse-cli task spec clarify TASK_ID --input clarification.json
669
- xparse-cli task field set TASK_ID RESOURCE_ID FIELD_ID --input correction.json
670
- xparse-cli task field confirm TASK_ID RESOURCE_ID FIELD_ID --input confirmation.json
671
- xparse-cli task history TASK_ID RESOURCE_ID
672
- xparse-cli task preview TASK_ID RESOURCE_ID
673
- xparse-cli task copilot show TASK_ID
674
- xparse-cli task copilot steps TASK_ID --after 0
675
- xparse-cli task copilot send TASK_ID --text 'Recheck the contract amount'
676
- xparse-cli task copilot send TASK_ID --input reply.json
677
- xparse-cli task memory list TASK_ID
678
- xparse-cli task memory revoke TASK_ID MEMORY_ID
679
- xparse-cli task list --search contract --limit 20
680
- xparse-cli task page TASK_ID
681
- xparse-cli task add TASK_ID new.pdf
682
- xparse-cli task add TASK_ID --history-id 123
683
- xparse-cli task add TASK_ID --uploaded-file-id FILE_ID
684
- xparse-cli task add TASK_ID --reconcile
685
- ```
686
-
687
- `retry TASK_ID` re-extracts every file using the current definition. File and field
688
- selectors intersect; with a field definition, only active fields are used. A Task
689
- without a field definition reruns its original instruction and cannot use field
690
- selectors or `--only-outdated`. Old results remain until replaced by new results.
691
- Legacy `retry TASK_ID --resource-id RESOURCE_ID` still recovers one failed file or
692
- settles its saved result; use `--scope selected` to force re-extraction of that file.
693
- `resume` continues suspended work and remains separate from re-extraction.
694
-
695
- `fields.json` is the complete active field list, not a partial patch. Omitting an
696
- existing field deletes it; use `restore_field_ids` to restore deleted fields:
697
-
698
- ```json
699
- {"expected_version":7,"task_rules":"Extract contract data","fields":[{"field_id":"amount","name":"Amount","description":"Total including tax"}],"restore_field_ids":[],"apply_to_existing":false}
700
- ```
701
-
702
- For clarification, send `expected_version`, `name`, and `description`.
703
- For field correction/confirmation, preserve the reviewed result and spec versions:
704
-
705
- ```json
706
- {"base_result_version":3,"expected_spec_version":7,"request_id":"review-unique-id","value":{"value":"100.00"},"review":{"apply_to_future":false}}
707
- ```
12
+ Node.js 18 or later is required. Supports macOS, Linux and Windows on x64 and ARM64.
708
13
 
709
- Copilot supports all page interaction kinds, including edited definitions,
710
- confirm-only, confirm-and-rerun, answers and dismissals. Preserve the original
711
- identities and reviewed draft values. Example (replace all identifiers/versions):
14
+ ## Usage
712
15
 
713
- ```json
714
- {"client_message_id":"reply-unique-id","kind":"confirm_and_rerun","text":"","expected_version":7,"draft_id":"draft-id","draft_revision":2}
16
+ ```sh
17
+ xparse-cli parse document.pdf --api free
18
+ xparse-cli auth --help
19
+ xparse-cli crop-enhance --help
20
+ xparse-cli detect-manipulation --help
715
21
  ```
716
22
 
717
- A conflict is not retried with a silently refreshed version. After an ambiguous
718
- mutation response, query the same Task before any repeat. Managed local additions
719
- return upload identities for recovery and use the page's managed import pipeline.
720
- `task page` requires the backend's `page-session?result_page_url=true` support and
721
- returns the exact server-issued URL; never build grants in the client.
23
+ Use `xparse-cli --help` for all commands. Paid operations require explicit approval.
722
24
 
723
- Regional availability follows the page: task list, spec set/clarify, whole-task or scoped retry, preview and version history are domestic-only. Other operations retain their existing regional rules. These additions require a matching CLI/Connector build; check the installed CLI's command help before using them.
25
+ [TextIn](https://www.textin.com/) · [Agent Skills](https://github.com/intsig-textin/xparse-skills)
package/package.json CHANGED
@@ -1,12 +1,8 @@
1
1
  {
2
2
  "name": "xparse-cli",
3
- "version": "2.6.0-beta.1",
3
+ "version": "2.6.0",
4
4
  "description": "TextIn xParse command-line client for document parsing",
5
5
  "license": "MIT",
6
- "repository": {
7
- "type": "git",
8
- "url": "git+https://gitlab.intsig.net/xparse1/xparse-client.git"
9
- },
10
6
  "homepage": "https://www.textin.com/",
11
7
  "bin": {
12
8
  "xparse-cli": "bin/xparse-cli.js"
@@ -19,15 +15,15 @@
19
15
  "node": ">=18"
20
16
  },
21
17
  "optionalDependencies": {
22
- "xparse-cli-darwin-amd64": "2.6.0-beta.1",
23
- "xparse-cli-darwin-arm64": "2.6.0-beta.1",
24
- "xparse-cli-linux-amd64": "2.6.0-beta.1",
25
- "xparse-cli-linux-arm64": "2.6.0-beta.1",
26
- "xparse-cli-windows-amd64": "2.6.0-beta.1",
27
- "xparse-cli-windows-arm64": "2.6.0-beta.1"
18
+ "xparse-cli-darwin-amd64": "2.6.0",
19
+ "xparse-cli-darwin-arm64": "2.6.0",
20
+ "xparse-cli-linux-amd64": "2.6.0",
21
+ "xparse-cli-linux-arm64": "2.6.0",
22
+ "xparse-cli-windows-amd64": "2.6.0",
23
+ "xparse-cli-windows-arm64": "2.6.0"
28
24
  },
29
25
  "publishConfig": {
30
26
  "access": "public",
31
- "tag": "beta"
27
+ "tag": "latest"
32
28
  }
33
29
  }