@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 +240 -0
- package/bin/echo-pdf.js +593 -0
- package/echo-pdf.config.json +58 -0
- package/package.json +44 -0
- package/scripts/check-runtime.sh +26 -0
- package/scripts/export-fixtures.sh +204 -0
- package/scripts/smoke.sh +14 -0
- package/src/agent-defaults.ts +25 -0
- package/src/file-ops.ts +52 -0
- package/src/file-store-do.ts +340 -0
- package/src/file-utils.ts +43 -0
- package/src/index.ts +334 -0
- package/src/mcp-server.ts +109 -0
- package/src/pdf-agent.ts +224 -0
- package/src/pdf-config.ts +105 -0
- package/src/pdf-storage.ts +94 -0
- package/src/pdf-types.ts +79 -0
- package/src/pdfium-engine.ts +207 -0
- package/src/provider-client.ts +176 -0
- package/src/provider-keys.ts +44 -0
- package/src/tool-registry.ts +203 -0
- package/src/types.ts +39 -0
- package/src/wasm.d.ts +4 -0
- package/wrangler.toml +15 -0
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`。
|