@echofiles/echo-pdf 0.2.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.
package/README.md ADDED
@@ -0,0 +1,240 @@
1
+ # echo-pdf
2
+
3
+ `echo-pdf` 是一个部署在 Cloudflare Workers 的 PDF Agent,支持:
4
+
5
+ - 页面提取:把 PDF 指定页渲染为图片
6
+ - OCR:识别页面文本
7
+ - 表格识别:提取表格并输出 LaTeX `tabular`
8
+ - MCP 服务:可直接挂到 Claude Desktop / Cursor / Cline / Windsurf 等客户端
9
+
10
+ 支持三种使用方式:
11
+
12
+ - MCP(推荐)
13
+ - CLI
14
+ - HTTP API
15
+
16
+ ## 1. 服务地址
17
+
18
+ 请先确定你的线上地址(Worker 域名)。文档里用:
19
+
20
+ - `https://echo-pdf.echofilesai.workers.dev`
21
+
22
+ 你自己的地址如果不同,把下面命令里的域名全部替换掉。
23
+
24
+ 主要端点:
25
+
26
+ - Web UI: `https://echo-pdf.echofilesai.workers.dev/`
27
+ - MCP: `https://echo-pdf.echofilesai.workers.dev/mcp`
28
+ - HTTP API 根路径: `https://echo-pdf.echofilesai.workers.dev`
29
+
30
+ ## 2. 快速开始(CLI)
31
+
32
+ 安装:
33
+
34
+ ```bash
35
+ npm i -g @echofiles/echo-pdf
36
+ ```
37
+
38
+ 初始化服务地址:
39
+
40
+ ```bash
41
+ echo-pdf init --service-url https://echo-pdf.echofilesai.workers.dev
42
+ ```
43
+
44
+ 配置 API Key(仅保存在本机 CLI 配置,不会上报到服务端存储):
45
+
46
+ ```bash
47
+ echo-pdf provider set --provider openai --api-key <OPENAI_API_KEY>
48
+ echo-pdf provider set --provider openrouter --api-key <OPENROUTER_KEY>
49
+ echo-pdf provider set --provider vercel-ai-gateway --api-key <VERCEL_AI_GATEWAY_API_KEY>
50
+ ```
51
+
52
+ 设置默认 provider + model(项目采用单一默认,不做多层 fallback):
53
+
54
+ ```bash
55
+ echo-pdf provider use --provider vercel_gateway
56
+ echo-pdf model set --provider vercel_gateway --model google/gemini-3-flash
57
+ echo-pdf model list
58
+ ```
59
+
60
+ 拉取 provider 模型列表(实时从 provider API 获取,无 hardcode):
61
+
62
+ ```bash
63
+ echo-pdf models --provider vercel_gateway
64
+ ```
65
+
66
+ 修改运行时配置(写入 `.dev.vars` 的 `ECHO_PDF_CONFIG_JSON`):
67
+
68
+ ```bash
69
+ echo-pdf config set --key service.maxPdfBytes --value 10000000
70
+ echo-pdf config set --key service.storage.maxFileBytes --value 10000000
71
+ echo-pdf config set --key service.maxPagesPerRequest --value 20
72
+ ```
73
+
74
+ ## 3. MCP 使用(推荐)
75
+
76
+ ### 3.1 检查 MCP 服务可用
77
+
78
+ ```bash
79
+ echo-pdf mcp initialize
80
+ echo-pdf mcp tools
81
+ echo-pdf mcp call --tool file_ops --args '{"op":"list"}'
82
+ ```
83
+
84
+ ### 3.2 给客户端生成 MCP 配置片段
85
+
86
+ ```bash
87
+ echo-pdf setup add claude-desktop
88
+ echo-pdf setup add cursor
89
+ echo-pdf setup add cline
90
+ echo-pdf setup add windsurf
91
+ echo-pdf setup add json
92
+ ```
93
+
94
+ `setup add` 输出的是配置片段,把它合并到对应客户端的 MCP 配置文件。
95
+
96
+ ### 3.3 MCP 工具列表
97
+
98
+ - `pdf_extract_pages`
99
+ - `pdf_ocr_pages`
100
+ - `pdf_tables_to_latex`
101
+ - `file_ops`
102
+
103
+ ## 4. Web UI 使用
104
+
105
+ 打开:
106
+
107
+ - `https://echo-pdf.echofilesai.workers.dev/`
108
+
109
+ 流程:
110
+
111
+ 1. 选择 provider。
112
+ 2. 点击“测试模型列表”后,选择一个模型。
113
+ 3. 上传 PDF。
114
+ 4. 选择工具并填写参数(例如 `pages: [1]`)。
115
+ 5. 点击 `Run Tool` 或 `Run Stream`。
116
+
117
+ 说明:
118
+
119
+ - UI 中输入的 key 属于当前会话,不落库到服务端。
120
+ - `returnMode` 目前仅支持 `inline` 和 `file_id`(`url` 尚未实现)。
121
+ - 表格工具返回值会校验并要求包含合法 `tabular`,否则报错。
122
+
123
+ ## 5. HTTP API 使用
124
+
125
+ ### 5.1 上传 PDF
126
+
127
+ ```bash
128
+ curl -sS -X POST https://echo-pdf.echofilesai.workers.dev/api/files/upload \
129
+ -F 'file=@./sample.pdf'
130
+ ```
131
+
132
+ 返回中会拿到 `file.id`。
133
+
134
+ ### 5.2 提取页面图片
135
+
136
+ ```bash
137
+ curl -sS -X POST https://echo-pdf.echofilesai.workers.dev/tools/call \
138
+ -H 'content-type: application/json' \
139
+ -d '{
140
+ "name":"pdf_extract_pages",
141
+ "arguments":{"fileId":"<FILE_ID>","pages":[1],"returnMode":"inline"},
142
+ "provider":"vercel_gateway",
143
+ "model":"google/gemini-3-flash"
144
+ }'
145
+ ```
146
+
147
+ ### 5.3 OCR
148
+
149
+ ```bash
150
+ curl -sS -X POST https://echo-pdf.echofilesai.workers.dev/tools/call \
151
+ -H 'content-type: application/json' \
152
+ -d '{
153
+ "name":"pdf_ocr_pages",
154
+ "arguments":{"fileId":"<FILE_ID>","pages":[1],"provider":"vercel_gateway","model":"google/gemini-3-flash"}
155
+ }'
156
+ ```
157
+
158
+ ### 5.4 表格识别为 LaTeX
159
+
160
+ ```bash
161
+ curl -sS -X POST https://echo-pdf.echofilesai.workers.dev/tools/call \
162
+ -H 'content-type: application/json' \
163
+ -d '{
164
+ "name":"pdf_tables_to_latex",
165
+ "arguments":{"fileId":"<FILE_ID>","pages":[1],"provider":"vercel_gateway","model":"google/gemini-3-flash"}
166
+ }'
167
+ ```
168
+
169
+ ## 6. 配置与环境变量
170
+
171
+ 统一配置文件:`echo-pdf.config.json`
172
+
173
+ 关键字段:
174
+
175
+ - `agent.defaultProvider`
176
+ - `agent.defaultModel`
177
+ - `service.maxPdfBytes`
178
+ - `service.storage.maxFileBytes`
179
+ - `service.storage.maxTotalBytes`
180
+ - `service.storage.ttlHours`
181
+
182
+ 限制关系说明:
183
+
184
+ - `service.maxPdfBytes`:允许处理的 PDF 最大字节数。
185
+ - `service.storage.maxFileBytes`:文件存储单文件上限(上传 PDF、`url/base64` ingest、以及 `file_id` 结果都会落到存储层)。
186
+ - 当前项目要求 `service.storage.maxFileBytes >= service.maxPdfBytes`,否则配置无效并在启动时报错。
187
+ - 默认配置下两者都是 `1200000`(约 1.2MB)。
188
+
189
+ 常用环境变量:
190
+
191
+ - `OPENAI_API_KEY`
192
+ - `OPENROUTER_KEY` / `OPENROUTER_API_KEY`
193
+ - `VERCEL_AI_GATEWAY_API_KEY` / `VERCEL_AI_GATEWAY_KEY`
194
+ - `ECHO_PDF_DEFAULT_PROVIDER`
195
+ - `ECHO_PDF_DEFAULT_MODEL`
196
+ - `ECHO_PDF_MCP_KEY`(可选,启用 MCP 鉴权)
197
+ - `ECHO_PDF_WORKER_NAME`(CLI 默认 URL 推导)
198
+
199
+ ## 7. 本地开发与测试
200
+
201
+ 安装与开发:
202
+
203
+ ```bash
204
+ npm install
205
+ npm run dev
206
+ ```
207
+
208
+ 测试:
209
+
210
+ ```bash
211
+ npm run typecheck
212
+ npm run test
213
+ npm run smoke
214
+ ```
215
+
216
+ 导出真实调用结果到 `fixtures/output`(会先清空输出目录):
217
+
218
+ ```bash
219
+ INPUT_PDF=./fixtures/input.pdf ./scripts/export-fixtures.sh
220
+ ```
221
+
222
+ ## 8. 常见问题
223
+
224
+ ### 8.1 设置了模型但没生效
225
+
226
+ 请确认三处一致:
227
+
228
+ - CLI 当前 profile 的 `model set` 值
229
+ - 请求里传入的 `model`
230
+ - 实际 provider 的模型列表中存在该 model
231
+
232
+ 当前项目策略是“用户设置的 provider/model 即默认”,不会自动切换到其它模型。
233
+
234
+ ### 8.2 `pdf_tables_to_latex` 返回失败
235
+
236
+ 当前实现要求模型输出中必须包含合法 `\\begin{tabular}...\\end{tabular}`。如果模型返回解释性文本或超时,会直接报错。
237
+
238
+ ### 8.3 `returnMode=url` 为什么不可用
239
+
240
+ 当前版本没有对外文件下载路由或签名 URL 能力,因此 `url` 模式未实现。请使用 `inline` 或 `file_id`。