@intelligentelectron/pdf-analyzer 0.0.5 → 0.1.1
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 +22 -108
- package/dist/chunker.d.ts +17 -0
- package/dist/chunker.js +49 -0
- package/dist/chunker.js.map +1 -0
- package/dist/chunker.test.d.ts +1 -0
- package/dist/chunker.test.js +106 -0
- package/dist/chunker.test.js.map +1 -0
- package/dist/cli/updater.js +1 -1
- package/dist/cli/updater.js.map +1 -1
- package/dist/server.js +18 -9
- package/dist/server.js.map +1 -1
- package/dist/service.d.ts +6 -3
- package/dist/service.js +253 -30
- package/dist/service.js.map +1 -1
- package/dist/types.d.ts +13 -3
- package/dist/types.js +29 -1
- package/dist/types.js.map +1 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -64,144 +64,59 @@ npm update -g @intelligentelectron/pdf-analyzer
|
|
|
64
64
|
|
|
65
65
|
1. Go to [Google AI Studio](https://aistudio.google.com/apikey)
|
|
66
66
|
2. Create a new API key (free tier available)
|
|
67
|
-
3.
|
|
68
|
-
|
|
69
|
-
```
|
|
70
|
-
GEMINI_API_KEY=your-api-key-here
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
The server automatically loads the API key from `.env` in your current working directory.
|
|
67
|
+
3. Copy your API key, we will use it to setup the MCP in the next section
|
|
74
68
|
|
|
75
69
|
## Connect the MCP with your favorite AI tool
|
|
76
70
|
|
|
77
|
-
|
|
71
|
+
After installing the MCP with one of the methods above, you can connect it to your AI agent of choice.
|
|
78
72
|
|
|
79
|
-
|
|
80
|
-
or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
|
|
73
|
+
### Claude Code
|
|
81
74
|
|
|
82
|
-
|
|
83
|
-
{
|
|
84
|
-
"mcpServers": {
|
|
85
|
-
"pdf-analyzer": {
|
|
86
|
-
"command": "pdf-analyzer"
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
<details>
|
|
93
|
-
<summary><strong>Claude Code</strong></summary>
|
|
75
|
+
Install [Claude Code](https://docs.anthropic.com/en/docs/claude-code), then run:
|
|
94
76
|
|
|
95
77
|
```bash
|
|
96
|
-
claude mcp add pdf-analyzer -- pdf-analyzer
|
|
78
|
+
claude mcp add --scope user pdf-analyzer --env GEMINI_API_KEY=your-key -- pdf-analyzer
|
|
97
79
|
```
|
|
98
80
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
macOS:
|
|
81
|
+
### OpenAI Codex
|
|
102
82
|
|
|
103
|
-
|
|
104
|
-
claude mcp add pdf-analyzer -- ~/Library/Application\ Support/pdf-analyzer/bin/pdf-analyzer
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
Linux:
|
|
83
|
+
Install [OpenAI Codex](https://developers.openai.com/codex/cli/), then run:
|
|
108
84
|
|
|
109
85
|
```bash
|
|
110
|
-
|
|
86
|
+
codex mcp add pdf-analyzer --env GEMINI_API_KEY=your-key -- pdf-analyzer
|
|
111
87
|
```
|
|
112
88
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
<details>
|
|
116
|
-
<summary><strong>VS Code (GitHub Copilot)</strong></summary>
|
|
89
|
+
### Gemini CLI
|
|
117
90
|
|
|
118
|
-
|
|
91
|
+
Install [Gemini CLI](https://geminicli.com/docs/get-started/installation/), then run:
|
|
119
92
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
```json
|
|
123
|
-
{
|
|
124
|
-
"servers": {
|
|
125
|
-
"pdf-analyzer": {
|
|
126
|
-
"type": "stdio",
|
|
127
|
-
"command": "/Users/YOUR_USERNAME/Library/Application Support/pdf-analyzer/bin/pdf-analyzer"
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
93
|
+
```bash
|
|
94
|
+
gemini mcp add --scope user -e GEMINI_API_KEY=your-key pdf-analyzer pdf-analyzer
|
|
131
95
|
```
|
|
132
96
|
|
|
133
|
-
|
|
97
|
+
### VS Code (GitHub Copilot)
|
|
134
98
|
|
|
135
|
-
|
|
136
|
-
{
|
|
137
|
-
"servers": {
|
|
138
|
-
"pdf-analyzer": {
|
|
139
|
-
"type": "stdio",
|
|
140
|
-
"command": "/home/YOUR_USERNAME/.pdf-analyzer/bin/pdf-analyzer"
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
```
|
|
99
|
+
Download [VS Code](https://code.visualstudio.com/)
|
|
145
100
|
|
|
146
|
-
|
|
101
|
+
Add to `.vscode/mcp.json` in your project:
|
|
147
102
|
|
|
148
103
|
```json
|
|
149
104
|
{
|
|
150
105
|
"servers": {
|
|
151
106
|
"pdf-analyzer": {
|
|
152
107
|
"type": "stdio",
|
|
153
|
-
"command": "
|
|
108
|
+
"command": "pdf-analyzer",
|
|
109
|
+
"env": {
|
|
110
|
+
"GEMINI_API_KEY": "your-key"
|
|
111
|
+
}
|
|
154
112
|
}
|
|
155
113
|
}
|
|
156
114
|
}
|
|
157
115
|
```
|
|
158
116
|
|
|
159
|
-
Then enable in **Configure Tools** (click the tools icon in Copilot chat).
|
|
160
|
-
|
|
161
|
-
</details>
|
|
162
|
-
|
|
163
|
-
<details>
|
|
164
|
-
<summary><strong>Gemini CLI</strong></summary>
|
|
165
|
-
|
|
166
|
-
Add to `~/.gemini/settings.json` (global) or `.gemini/settings.json` (project).
|
|
167
|
-
|
|
168
|
-
**macOS:**
|
|
169
|
-
|
|
170
|
-
```json
|
|
171
|
-
{
|
|
172
|
-
"mcpServers": {
|
|
173
|
-
"pdf-analyzer": {
|
|
174
|
-
"command": "/Users/YOUR_USERNAME/Library/Application Support/pdf-analyzer/bin/pdf-analyzer"
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
**Linux:**
|
|
181
|
-
|
|
182
|
-
```json
|
|
183
|
-
{
|
|
184
|
-
"mcpServers": {
|
|
185
|
-
"pdf-analyzer": {
|
|
186
|
-
"command": "/home/YOUR_USERNAME/.pdf-analyzer/bin/pdf-analyzer"
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
**Windows:**
|
|
193
|
-
|
|
194
|
-
```json
|
|
195
|
-
{
|
|
196
|
-
"mcpServers": {
|
|
197
|
-
"pdf-analyzer": {
|
|
198
|
-
"command": "C:\\Users\\YOUR_USERNAME\\AppData\\Local\\pdf-analyzer\\bin\\pdf-analyzer.exe"
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
```
|
|
117
|
+
Then enable it in **Configure Tools** (click the tools icon in Copilot chat).
|
|
203
118
|
|
|
204
|
-
|
|
119
|
+
> **Warning:** Do not commit `.vscode/mcp.json` to version control — it contains your API key. Add it to your `.gitignore`.
|
|
205
120
|
|
|
206
121
|
## Usage
|
|
207
122
|
|
|
@@ -219,8 +134,7 @@ The server accepts:
|
|
|
219
134
|
|
|
220
135
|
| Platform | Binary |
|
|
221
136
|
|----------|--------|
|
|
222
|
-
| macOS (
|
|
223
|
-
| macOS (Intel) | `pdf-analyzer-darwin-x64` |
|
|
137
|
+
| macOS (Universal) | `pdf-analyzer-darwin-universal` |
|
|
224
138
|
| Linux (x64) | `pdf-analyzer-linux-x64` |
|
|
225
139
|
| Linux (ARM64) | `pdf-analyzer-linux-arm64` |
|
|
226
140
|
| Windows (x64) | `pdf-analyzer-windows-x64.exe` |
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** A chunk of pages extracted from a larger PDF */
|
|
2
|
+
export interface PdfChunk {
|
|
3
|
+
bytes: Uint8Array;
|
|
4
|
+
startPage: number;
|
|
5
|
+
pageCount: number;
|
|
6
|
+
totalPages: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Wrap raw PDF bytes into a PdfChunk with metadata.
|
|
10
|
+
*/
|
|
11
|
+
export declare function pdfBytesToChunk(pdfBytes: Uint8Array): Promise<PdfChunk>;
|
|
12
|
+
/**
|
|
13
|
+
* Split a PdfChunk in half by page count.
|
|
14
|
+
* First half gets the extra page when the count is odd.
|
|
15
|
+
* Throws if the chunk has only 1 page (can't split further).
|
|
16
|
+
*/
|
|
17
|
+
export declare function splitPdfInHalf(chunk: PdfChunk): Promise<[PdfChunk, PdfChunk]>;
|
package/dist/chunker.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { PDFDocument } from "pdf-lib";
|
|
2
|
+
/**
|
|
3
|
+
* Wrap raw PDF bytes into a PdfChunk with metadata.
|
|
4
|
+
*/
|
|
5
|
+
export async function pdfBytesToChunk(pdfBytes) {
|
|
6
|
+
const doc = await PDFDocument.load(pdfBytes);
|
|
7
|
+
const pageCount = doc.getPageCount();
|
|
8
|
+
if (pageCount === 0) {
|
|
9
|
+
throw new Error("PDF has no pages");
|
|
10
|
+
}
|
|
11
|
+
return { bytes: pdfBytes, startPage: 0, pageCount, totalPages: pageCount };
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Split a PdfChunk in half by page count.
|
|
15
|
+
* First half gets the extra page when the count is odd.
|
|
16
|
+
* Throws if the chunk has only 1 page (can't split further).
|
|
17
|
+
*/
|
|
18
|
+
export async function splitPdfInHalf(chunk) {
|
|
19
|
+
if (chunk.pageCount <= 1) {
|
|
20
|
+
throw new Error(`Cannot split a single-page chunk (page ${chunk.startPage + 1} of the original PDF)`);
|
|
21
|
+
}
|
|
22
|
+
const srcDoc = await PDFDocument.load(chunk.bytes);
|
|
23
|
+
const firstCount = Math.ceil(chunk.pageCount / 2);
|
|
24
|
+
const secondCount = chunk.pageCount - firstCount;
|
|
25
|
+
const firstDoc = await PDFDocument.create();
|
|
26
|
+
const firstIndices = Array.from({ length: firstCount }, (_, i) => i);
|
|
27
|
+
const firstPages = await firstDoc.copyPages(srcDoc, firstIndices);
|
|
28
|
+
for (const page of firstPages)
|
|
29
|
+
firstDoc.addPage(page);
|
|
30
|
+
const secondDoc = await PDFDocument.create();
|
|
31
|
+
const secondIndices = Array.from({ length: secondCount }, (_, i) => firstCount + i);
|
|
32
|
+
const secondPages = await secondDoc.copyPages(srcDoc, secondIndices);
|
|
33
|
+
for (const page of secondPages)
|
|
34
|
+
secondDoc.addPage(page);
|
|
35
|
+
const firstHalf = {
|
|
36
|
+
bytes: await firstDoc.save(),
|
|
37
|
+
startPage: chunk.startPage,
|
|
38
|
+
pageCount: firstCount,
|
|
39
|
+
totalPages: chunk.totalPages,
|
|
40
|
+
};
|
|
41
|
+
const secondHalf = {
|
|
42
|
+
bytes: await secondDoc.save(),
|
|
43
|
+
startPage: chunk.startPage + firstCount,
|
|
44
|
+
pageCount: secondCount,
|
|
45
|
+
totalPages: chunk.totalPages,
|
|
46
|
+
};
|
|
47
|
+
return [firstHalf, secondHalf];
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=chunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.js","sourceRoot":"","sources":["../src/chunker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAUtC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAoB;IACxD,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;IACrC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AAC7E,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAe;IAClD,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,0CAA0C,KAAK,CAAC,SAAS,GAAG,CAAC,uBAAuB,CACrF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,GAAG,UAAU,CAAC;IAEjD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;IAC5C,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAClE,KAAK,MAAM,IAAI,IAAI,UAAU;QAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtD,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;IAC7C,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IACpF,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACrE,KAAK,MAAM,IAAI,IAAI,WAAW;QAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAExD,MAAM,SAAS,GAAa;QAC1B,KAAK,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE;QAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,UAAU;QACrB,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC;IAEF,MAAM,UAAU,GAAa;QAC3B,KAAK,EAAE,MAAM,SAAS,CAAC,IAAI,EAAE;QAC7B,SAAS,EAAE,KAAK,CAAC,SAAS,GAAG,UAAU;QACvC,SAAS,EAAE,WAAW;QACtB,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC;IAEF,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { PDFDocument } from "pdf-lib";
|
|
5
|
+
import { pdfBytesToChunk, splitPdfInHalf } from "./chunker.js";
|
|
6
|
+
/**
|
|
7
|
+
* Create a synthetic PDF with the given number of pages.
|
|
8
|
+
* Each page has some text content to give it realistic size.
|
|
9
|
+
*/
|
|
10
|
+
async function createSyntheticPdf(pageCount, contentPerPage = "") {
|
|
11
|
+
const doc = await PDFDocument.create();
|
|
12
|
+
for (let i = 0; i < pageCount; i++) {
|
|
13
|
+
const page = doc.addPage();
|
|
14
|
+
if (contentPerPage) {
|
|
15
|
+
page.drawText(contentPerPage, { x: 50, y: 500, size: 12 });
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
page.drawText(`Page ${i + 1}`, { x: 50, y: 500, size: 12 });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return doc.save();
|
|
22
|
+
}
|
|
23
|
+
describe("pdfBytesToChunk", () => {
|
|
24
|
+
it("creates a chunk with correct metadata", async () => {
|
|
25
|
+
const pdfBytes = await createSyntheticPdf(7);
|
|
26
|
+
const chunk = await pdfBytesToChunk(pdfBytes);
|
|
27
|
+
expect(chunk.startPage).toBe(0);
|
|
28
|
+
expect(chunk.pageCount).toBe(7);
|
|
29
|
+
expect(chunk.totalPages).toBe(7);
|
|
30
|
+
expect(chunk.bytes).toBe(pdfBytes);
|
|
31
|
+
});
|
|
32
|
+
it("handles a single-page PDF from PDFDocument.create()", async () => {
|
|
33
|
+
// pdf-lib's PDFDocument.create() + save() produces a valid 1-page-like structure
|
|
34
|
+
// that getPageCount() reports as having pages, so this just verifies it doesn't throw
|
|
35
|
+
const pdfBytes = await createSyntheticPdf(1);
|
|
36
|
+
const chunk = await pdfBytesToChunk(pdfBytes);
|
|
37
|
+
expect(chunk.pageCount).toBe(1);
|
|
38
|
+
expect(chunk.totalPages).toBe(1);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe("splitPdfInHalf", () => {
|
|
42
|
+
it("splits an even page count into two equal halves", async () => {
|
|
43
|
+
const pdfBytes = await createSyntheticPdf(10);
|
|
44
|
+
const chunk = await pdfBytesToChunk(pdfBytes);
|
|
45
|
+
const [first, second] = await splitPdfInHalf(chunk);
|
|
46
|
+
expect(first.pageCount).toBe(5);
|
|
47
|
+
expect(second.pageCount).toBe(5);
|
|
48
|
+
expect(first.startPage).toBe(0);
|
|
49
|
+
expect(second.startPage).toBe(5);
|
|
50
|
+
});
|
|
51
|
+
it("gives the first half the extra page on odd count", async () => {
|
|
52
|
+
const pdfBytes = await createSyntheticPdf(7);
|
|
53
|
+
const chunk = await pdfBytesToChunk(pdfBytes);
|
|
54
|
+
const [first, second] = await splitPdfInHalf(chunk);
|
|
55
|
+
expect(first.pageCount).toBe(4);
|
|
56
|
+
expect(second.pageCount).toBe(3);
|
|
57
|
+
expect(first.startPage).toBe(0);
|
|
58
|
+
expect(second.startPage).toBe(4);
|
|
59
|
+
});
|
|
60
|
+
it("throws on a 1-page chunk", async () => {
|
|
61
|
+
const pdfBytes = await createSyntheticPdf(1);
|
|
62
|
+
const chunk = await pdfBytesToChunk(pdfBytes);
|
|
63
|
+
await expect(splitPdfInHalf(chunk)).rejects.toThrow("Cannot split a single-page chunk");
|
|
64
|
+
});
|
|
65
|
+
it("preserves totalPages from the original PDF", async () => {
|
|
66
|
+
const pdfBytes = await createSyntheticPdf(20);
|
|
67
|
+
const chunk = await pdfBytesToChunk(pdfBytes);
|
|
68
|
+
const [first, second] = await splitPdfInHalf(chunk);
|
|
69
|
+
expect(first.totalPages).toBe(20);
|
|
70
|
+
expect(second.totalPages).toBe(20);
|
|
71
|
+
});
|
|
72
|
+
it("produces contiguous page ranges", async () => {
|
|
73
|
+
const pdfBytes = await createSyntheticPdf(12);
|
|
74
|
+
const chunk = await pdfBytesToChunk(pdfBytes);
|
|
75
|
+
const [first, second] = await splitPdfInHalf(chunk);
|
|
76
|
+
expect(first.startPage + first.pageCount).toBe(second.startPage);
|
|
77
|
+
expect(first.pageCount + second.pageCount).toBe(12);
|
|
78
|
+
});
|
|
79
|
+
it("produces valid PDFs for each half", async () => {
|
|
80
|
+
const pdfBytes = await createSyntheticPdf(8);
|
|
81
|
+
const chunk = await pdfBytesToChunk(pdfBytes);
|
|
82
|
+
const [first, second] = await splitPdfInHalf(chunk);
|
|
83
|
+
const firstDoc = await PDFDocument.load(first.bytes);
|
|
84
|
+
expect(firstDoc.getPageCount()).toBe(first.pageCount);
|
|
85
|
+
const secondDoc = await PDFDocument.load(second.bytes);
|
|
86
|
+
expect(secondDoc.getPageCount()).toBe(second.pageCount);
|
|
87
|
+
});
|
|
88
|
+
it("works with the oversized-doc.pdf fixture", async () => {
|
|
89
|
+
const fixturePath = join(__dirname, "..", "test", "fixtures", "oversized-doc.pdf");
|
|
90
|
+
const pdfBytes = new Uint8Array(readFileSync(fixturePath));
|
|
91
|
+
const chunk = await pdfBytesToChunk(pdfBytes);
|
|
92
|
+
expect(chunk.pageCount).toBeGreaterThan(1);
|
|
93
|
+
const [first, second] = await splitPdfInHalf(chunk);
|
|
94
|
+
// Both halves are valid PDFs
|
|
95
|
+
const firstDoc = await PDFDocument.load(first.bytes);
|
|
96
|
+
const secondDoc = await PDFDocument.load(second.bytes);
|
|
97
|
+
expect(firstDoc.getPageCount()).toBe(first.pageCount);
|
|
98
|
+
expect(secondDoc.getPageCount()).toBe(second.pageCount);
|
|
99
|
+
// Page counts sum to original
|
|
100
|
+
expect(first.pageCount + second.pageCount).toBe(chunk.pageCount);
|
|
101
|
+
// Each half is smaller than the original
|
|
102
|
+
expect(first.bytes.byteLength).toBeLessThan(pdfBytes.byteLength);
|
|
103
|
+
expect(second.bytes.byteLength).toBeLessThan(pdfBytes.byteLength);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=chunker.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.test.js","sourceRoot":"","sources":["../src/chunker.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/updater.js
CHANGED
|
@@ -16,7 +16,7 @@ const getPlatformBinaryName = () => {
|
|
|
16
16
|
const platform = process.platform;
|
|
17
17
|
const arch = process.arch;
|
|
18
18
|
if (platform === "darwin") {
|
|
19
|
-
return
|
|
19
|
+
return `${BINARY_NAME}-darwin-universal`;
|
|
20
20
|
}
|
|
21
21
|
else if (platform === "linux") {
|
|
22
22
|
return arch === "arm64" ? `${BINARY_NAME}-linux-arm64` : `${BINARY_NAME}-linux-x64`;
|
package/dist/cli/updater.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../../src/cli/updater.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,GACZ,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAoBlE;;GAEG;AACH,MAAM,qBAAqB,GAAG,GAAW,EAAE;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1B,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../../src/cli/updater.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -18,28 +18,34 @@ Analyzes PDF documents using Gemini's vision capabilities.
|
|
|
18
18
|
|
|
19
19
|
## Tool: analyze_pdf
|
|
20
20
|
|
|
21
|
-
Pass an absolute file path or
|
|
21
|
+
Pass an absolute file path, URL, or Gemini file URI(s) and a list of queries. The server reads the PDF,
|
|
22
22
|
sends it to Gemini with your queries, and returns structured responses.
|
|
23
23
|
|
|
24
|
+
Large PDFs that exceed Gemini's token limit are automatically split into chunks and processed
|
|
25
|
+
sequentially with rolling context. No user intervention is needed.
|
|
26
|
+
|
|
24
27
|
## Caching Strategy
|
|
25
28
|
|
|
26
|
-
The response includes a \`
|
|
29
|
+
The response includes a \`cached_uris\` array (Gemini File API URIs) that you should reuse for subsequent
|
|
27
30
|
queries on the same document. This avoids re-uploading and is cached by Gemini for 48 hours.
|
|
28
31
|
|
|
29
32
|
**Input types accepted:**
|
|
30
33
|
- Local file path: \`/Users/name/docs/report.pdf\`
|
|
31
34
|
- Web URL: \`https://example.com/doc.pdf\`
|
|
32
35
|
- Gemini file URI: \`https://generativelanguage.googleapis.com/v1beta/files/abc123\` (from previous response)
|
|
36
|
+
- Array of Gemini file URIs: for re-analyzing a previously chunked document
|
|
33
37
|
|
|
34
38
|
**Workflow for multiple queries on same document:**
|
|
35
|
-
1. First call: pass local path or URL → receive \`
|
|
36
|
-
2. Subsequent calls: pass the \`
|
|
39
|
+
1. First call: pass local path or URL → receive \`cached_uris\` in response
|
|
40
|
+
2. Subsequent calls: pass the \`cached_uris\` value as \`pdf_source\` → no re-upload, faster response
|
|
41
|
+
- If \`cached_uris\` has one element, pass the single URI string
|
|
42
|
+
- If \`cached_uris\` has multiple elements (chunked PDF), pass the full array
|
|
37
43
|
|
|
38
44
|
## Usage Tips
|
|
39
45
|
|
|
40
46
|
- Ask specific, focused queries for best results
|
|
41
47
|
- For multi-page PDFs, reference page numbers in queries when relevant
|
|
42
|
-
- Reuse the returned \`
|
|
48
|
+
- Reuse the returned \`cached_uris\` for follow-up questions on the same document
|
|
43
49
|
|
|
44
50
|
## Example
|
|
45
51
|
|
|
@@ -108,12 +114,15 @@ export const createServer = () => {
|
|
|
108
114
|
// Tool: analyze_pdf
|
|
109
115
|
// -------------------------------------------------------------------------
|
|
110
116
|
server.registerTool("analyze_pdf", {
|
|
111
|
-
description: "Analyze a PDF document using Gemini AI. Provide an absolute file path, URL, or Gemini file
|
|
117
|
+
description: "Analyze a PDF document using Gemini AI. Provide an absolute file path, URL, Gemini file URI (from a previous response), or array of Gemini file URIs (from a previous chunked response) and a list of questions to ask about the PDF content. Returns a cached_uris array that can be reused for subsequent queries on the same document (cached by Gemini for 48 hours).",
|
|
112
118
|
inputSchema: {
|
|
113
119
|
pdf_source: z
|
|
114
|
-
.string()
|
|
115
|
-
.describe("PDF source: absolute local file path (e.g., /Users/name/docs/report.pdf), URL (e.g., https://example.com/doc.pdf),
|
|
116
|
-
queries: z
|
|
120
|
+
.union([z.string(), z.array(z.string().min(1)).min(1)])
|
|
121
|
+
.describe("PDF source: absolute local file path (e.g., /Users/name/docs/report.pdf), URL (e.g., https://example.com/doc.pdf), Gemini file URI from a previous response (e.g., https://generativelanguage.googleapis.com/v1beta/files/abc123), or array of Gemini file URIs from a previous chunked response"),
|
|
122
|
+
queries: z
|
|
123
|
+
.array(z.string().min(1))
|
|
124
|
+
.min(1)
|
|
125
|
+
.describe("Array of questions to ask about the PDF"),
|
|
117
126
|
},
|
|
118
127
|
}, async ({ pdf_source, queries }) => {
|
|
119
128
|
try {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE9F,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF,MAAM,mBAAmB,GAAG
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/service.d.ts
CHANGED
|
@@ -19,9 +19,12 @@ export declare function isUrl(source: string): boolean;
|
|
|
19
19
|
*/
|
|
20
20
|
export declare function validateLocalPath(pdfPath: string): void;
|
|
21
21
|
/**
|
|
22
|
-
* Analyzes a PDF document using Gemini
|
|
23
|
-
*
|
|
24
|
-
*
|
|
22
|
+
* Analyzes a PDF document using Gemini.
|
|
23
|
+
*
|
|
24
|
+
* Routing:
|
|
25
|
+
* - string[] → cached chunk URIs, sequential processing with rolling findings
|
|
26
|
+
* - Gemini URI string → direct single-file analysis (no bytes to split)
|
|
27
|
+
* - path/URL → read bytes, try full PDF first, split on token limit error
|
|
25
28
|
*/
|
|
26
29
|
export declare function analyzePdf(client: GoogleGenAI, input: AnalyzePdfInput): Promise<AnalyzePdfResponse>;
|
|
27
30
|
/**
|
package/dist/service.js
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
import { GoogleGenAI, ApiError, ThinkingLevel } from "@google/genai";
|
|
2
|
-
import { readFileSync, existsSync } from "node:fs";
|
|
3
2
|
import * as fs from "node:fs";
|
|
4
3
|
import * as path from "node:path";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
4
|
+
import { ChunkedGeminiResponseSchema, GeminiResponseSchema } from "./types.js";
|
|
5
|
+
import { pdfBytesToChunk, splitPdfInHalf } from "./chunker.js";
|
|
7
6
|
/**
|
|
8
7
|
* Load environment variables from .env file in current working directory.
|
|
9
8
|
* Only sets variables that are not already defined in process.env.
|
|
10
9
|
*/
|
|
11
10
|
function loadEnvFile() {
|
|
12
|
-
const envPath = join(process.cwd(), ".env");
|
|
13
|
-
if (!existsSync(envPath))
|
|
11
|
+
const envPath = path.join(process.cwd(), ".env");
|
|
12
|
+
if (!fs.existsSync(envPath))
|
|
14
13
|
return;
|
|
15
|
-
const content = readFileSync(envPath, "utf-8");
|
|
14
|
+
const content = fs.readFileSync(envPath, "utf-8");
|
|
16
15
|
for (const line of content.split("\n")) {
|
|
17
16
|
const trimmed = line.trim();
|
|
18
17
|
if (!trimmed || trimmed.startsWith("#"))
|
|
@@ -21,12 +20,16 @@ function loadEnvFile() {
|
|
|
21
20
|
if (eqIndex === -1)
|
|
22
21
|
continue;
|
|
23
22
|
const key = trimmed.slice(0, eqIndex).trim();
|
|
24
|
-
const value = trimmed
|
|
23
|
+
const value = trimmed
|
|
24
|
+
.slice(eqIndex + 1)
|
|
25
|
+
.trim()
|
|
26
|
+
.replace(/^["']|["']$/g, "");
|
|
25
27
|
if (!process.env[key]) {
|
|
26
28
|
process.env[key] = value;
|
|
27
29
|
}
|
|
28
30
|
}
|
|
29
31
|
}
|
|
32
|
+
const GEMINI_MODEL = "gemini-3-pro-preview";
|
|
30
33
|
const SYSTEM_INSTRUCTION = `You are a document analysis assistant. Analyze PDF documents and answer questions based on their content.
|
|
31
34
|
For each question, provide a clear, detailed answer based on the content of the PDF.
|
|
32
35
|
If the answer cannot be determined from the PDF, say so explicitly.
|
|
@@ -140,7 +143,7 @@ async function waitForFileReady(client, fileName, maxAttempts = 10) {
|
|
|
140
143
|
/**
|
|
141
144
|
* Upload a PDF to the Gemini File API, or return the URI if already a Gemini file.
|
|
142
145
|
* Accepts local paths, web URLs, or Gemini File API URIs.
|
|
143
|
-
* Returns the Gemini
|
|
146
|
+
* Returns the Gemini URI for use in subsequent calls.
|
|
144
147
|
*/
|
|
145
148
|
async function uploadPdf(client, source) {
|
|
146
149
|
// If already a Gemini file URI, return as-is (no upload needed)
|
|
@@ -177,21 +180,38 @@ function buildUserPrompt(queries) {
|
|
|
177
180
|
const queriesText = queries.map((q, i) => `${i + 1}. ${q}`).join("\n");
|
|
178
181
|
return `Please analyze the attached PDF and answer these questions:\n\n${queriesText}`;
|
|
179
182
|
}
|
|
183
|
+
/** Maximum chunk size for File API upload: 50MB × 0.85 safety margin */
|
|
184
|
+
const MAX_UPLOAD_BYTES = 50 * 1024 * 1024 * 0.85;
|
|
180
185
|
/**
|
|
181
|
-
*
|
|
182
|
-
* Uses the File API for uploads and structured output for reliable JSON responses.
|
|
183
|
-
* Returns the Gemini file_uri so calling agents can reuse it for subsequent queries.
|
|
186
|
+
* Ensure every query has an answer, filling gaps if the model missed some.
|
|
184
187
|
*/
|
|
185
|
-
|
|
186
|
-
const
|
|
188
|
+
function ensureAllQueriesAnswered(queries, parsed) {
|
|
189
|
+
const responseMap = new Map(parsed.map((r) => [r.query, r.answer]));
|
|
190
|
+
return queries.map((query, i) => {
|
|
191
|
+
const existingAnswer = parsed[i];
|
|
192
|
+
if (existingAnswer) {
|
|
193
|
+
return existingAnswer;
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
query,
|
|
197
|
+
answer: responseMap.get(query) || "No answer found for this query.",
|
|
198
|
+
};
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Direct single-file analysis path.
|
|
203
|
+
* Uploads the PDF via File API and sends it to Gemini in one call.
|
|
204
|
+
*/
|
|
205
|
+
async function analyzePdfDirect(client, source, queries) {
|
|
206
|
+
const fileUri = await uploadPdf(client, source);
|
|
187
207
|
const response = await client.models.generateContent({
|
|
188
|
-
model:
|
|
208
|
+
model: GEMINI_MODEL,
|
|
189
209
|
contents: [
|
|
190
210
|
{
|
|
191
211
|
role: "user",
|
|
192
212
|
parts: [
|
|
193
213
|
{ fileData: { fileUri, mimeType: "application/pdf" } },
|
|
194
|
-
{ text: buildUserPrompt(
|
|
214
|
+
{ text: buildUserPrompt(queries) },
|
|
195
215
|
],
|
|
196
216
|
},
|
|
197
217
|
],
|
|
@@ -204,24 +224,227 @@ export async function analyzePdf(client, input) {
|
|
|
204
224
|
});
|
|
205
225
|
const responseText = response.text || "{}";
|
|
206
226
|
const parsed = JSON.parse(responseText);
|
|
207
|
-
// Ensure all queries have answers (in case model missed some)
|
|
208
|
-
const responseMap = new Map(parsed.responses.map((r) => [r.query, r.answer]));
|
|
209
|
-
const responses = input.queries.map((query, i) => {
|
|
210
|
-
const existingAnswer = parsed.responses[i];
|
|
211
|
-
if (existingAnswer) {
|
|
212
|
-
return existingAnswer;
|
|
213
|
-
}
|
|
214
|
-
return {
|
|
215
|
-
query,
|
|
216
|
-
answer: responseMap.get(query) || "No answer found for this query.",
|
|
217
|
-
};
|
|
218
|
-
});
|
|
219
227
|
return {
|
|
220
|
-
pdf_source:
|
|
221
|
-
|
|
222
|
-
responses,
|
|
228
|
+
pdf_source: source,
|
|
229
|
+
cached_uris: [fileUri],
|
|
230
|
+
responses: ensureAllQueriesAnswered(queries, parsed.responses),
|
|
223
231
|
};
|
|
224
232
|
}
|
|
233
|
+
/**
|
|
234
|
+
* Upload raw PDF bytes to the Gemini File API.
|
|
235
|
+
* Returns the Gemini URI for use in Gemini calls.
|
|
236
|
+
*/
|
|
237
|
+
async function uploadChunkBytes(client, chunkBytes) {
|
|
238
|
+
const file = await client.files.upload({
|
|
239
|
+
file: new Blob([chunkBytes], { type: "application/pdf" }),
|
|
240
|
+
config: { mimeType: "application/pdf" },
|
|
241
|
+
});
|
|
242
|
+
if (!file.name || !file.uri) {
|
|
243
|
+
throw new Error("Chunk upload failed: missing name or URI");
|
|
244
|
+
}
|
|
245
|
+
await waitForFileReady(client, file.name);
|
|
246
|
+
return file.uri;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Build system instruction for a chunk at a given position.
|
|
250
|
+
* When `chunk` metadata is provided, page range info is included in the position line.
|
|
251
|
+
*/
|
|
252
|
+
function buildChunkedSystemInstruction(chunkIndex, totalChunks, previousFindings, chunk) {
|
|
253
|
+
let position = `Processing chunk ${chunkIndex + 1} of ${totalChunks}`;
|
|
254
|
+
if (chunk) {
|
|
255
|
+
const pageRange = `pages ${chunk.startPage + 1}–${chunk.startPage + chunk.pageCount}`;
|
|
256
|
+
position += ` (${pageRange} of ${chunk.totalPages} total)`;
|
|
257
|
+
}
|
|
258
|
+
position += ".";
|
|
259
|
+
const base = `You are a document analysis assistant analyzing a large PDF that has been split into ${totalChunks} chunks.
|
|
260
|
+
${position}
|
|
261
|
+
For each question, provide a clear, detailed answer based on the content of this chunk.
|
|
262
|
+
Always cite page numbers from the original document when possible.`;
|
|
263
|
+
const findingsInstruction = `
|
|
264
|
+
In addition to answering the queries, produce a "findings_summary" field that tracks:
|
|
265
|
+
- What has been found so far (with page citations)
|
|
266
|
+
- What is partially answered
|
|
267
|
+
- What remains unanswered`;
|
|
268
|
+
if (chunkIndex === 0) {
|
|
269
|
+
return `${base}
|
|
270
|
+
This is the first chunk. Some answers may be incomplete — that's expected.${findingsInstruction}`;
|
|
271
|
+
}
|
|
272
|
+
const previousContext = `
|
|
273
|
+
Here are the findings from the previous chunks:
|
|
274
|
+
<previous_findings>
|
|
275
|
+
${previousFindings}
|
|
276
|
+
</previous_findings>
|
|
277
|
+
|
|
278
|
+
Update your answers by combining the previous findings with any new information from this chunk.`;
|
|
279
|
+
if (chunkIndex === totalChunks - 1) {
|
|
280
|
+
return `${base}
|
|
281
|
+
This is the final chunk.${previousContext}
|
|
282
|
+
Provide final, comprehensive answers incorporating all findings across the entire document.${findingsInstruction}`;
|
|
283
|
+
}
|
|
284
|
+
return `${base}${previousContext}${findingsInstruction}`;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Check if an error is a Gemini token limit error (input too large).
|
|
288
|
+
*/
|
|
289
|
+
function isTokenLimitError(error) {
|
|
290
|
+
if (!(error instanceof ApiError))
|
|
291
|
+
return false;
|
|
292
|
+
if (error.status !== 400)
|
|
293
|
+
return false;
|
|
294
|
+
return error.message.includes("input token count exceeds");
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Process a work queue of PdfChunks, splitting on token limit errors.
|
|
298
|
+
*
|
|
299
|
+
* Algorithm:
|
|
300
|
+
* 1. Shift a chunk from the queue
|
|
301
|
+
* 2. Upload it and call Gemini
|
|
302
|
+
* 3. On success: accumulate findings, collect cached_uri
|
|
303
|
+
* 4. On token limit error: split the chunk in half, unshift both back
|
|
304
|
+
* 5. Repeat until queue is empty
|
|
305
|
+
*/
|
|
306
|
+
async function processChunkQueue(client, queue, queries, pdfSource) {
|
|
307
|
+
let previousFindings = null;
|
|
308
|
+
const fileUris = [];
|
|
309
|
+
let processedCount = 0;
|
|
310
|
+
// We don't know total chunks upfront (splitting changes it),
|
|
311
|
+
// so we track completed chunks and estimate total as completed + remaining.
|
|
312
|
+
while (queue.length > 0) {
|
|
313
|
+
const chunk = queue.shift();
|
|
314
|
+
const totalChunks = processedCount + 1 + queue.length;
|
|
315
|
+
// Pre-split chunks that exceed File API upload limit
|
|
316
|
+
if (chunk.bytes.byteLength > MAX_UPLOAD_BYTES) {
|
|
317
|
+
const [firstHalf, secondHalf] = await splitPdfInHalf(chunk);
|
|
318
|
+
queue.unshift(firstHalf, secondHalf);
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
const fileUri = await uploadChunkBytes(client, chunk.bytes);
|
|
322
|
+
const systemInstruction = buildChunkedSystemInstruction(processedCount, totalChunks, previousFindings, chunk);
|
|
323
|
+
try {
|
|
324
|
+
const response = await client.models.generateContent({
|
|
325
|
+
model: GEMINI_MODEL,
|
|
326
|
+
contents: [
|
|
327
|
+
{
|
|
328
|
+
role: "user",
|
|
329
|
+
parts: [
|
|
330
|
+
{ fileData: { fileUri, mimeType: "application/pdf" } },
|
|
331
|
+
{ text: buildUserPrompt(queries) },
|
|
332
|
+
],
|
|
333
|
+
},
|
|
334
|
+
],
|
|
335
|
+
config: {
|
|
336
|
+
systemInstruction,
|
|
337
|
+
responseMimeType: "application/json",
|
|
338
|
+
responseSchema: ChunkedGeminiResponseSchema,
|
|
339
|
+
thinkingConfig: { thinkingLevel: ThinkingLevel.HIGH },
|
|
340
|
+
},
|
|
341
|
+
});
|
|
342
|
+
const responseText = response.text || "{}";
|
|
343
|
+
const parsed = JSON.parse(responseText);
|
|
344
|
+
previousFindings = parsed.findings_summary;
|
|
345
|
+
fileUris.push(fileUri);
|
|
346
|
+
processedCount++;
|
|
347
|
+
// On the last chunk, return the final responses
|
|
348
|
+
if (queue.length === 0) {
|
|
349
|
+
return {
|
|
350
|
+
pdf_source: pdfSource,
|
|
351
|
+
cached_uris: fileUris,
|
|
352
|
+
responses: ensureAllQueriesAnswered(queries, parsed.responses),
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
catch (error) {
|
|
357
|
+
if (!isTokenLimitError(error))
|
|
358
|
+
throw error;
|
|
359
|
+
// Token limit hit — split this chunk and retry
|
|
360
|
+
const [firstHalf, secondHalf] = await splitPdfInHalf(chunk);
|
|
361
|
+
queue.unshift(firstHalf, secondHalf);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
// Unreachable — loop returns on last successful chunk
|
|
365
|
+
throw new Error("No chunks to process");
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Process an array of cached Gemini file URIs with rolling findings.
|
|
369
|
+
* Used for re-analysis of a previously chunked PDF.
|
|
370
|
+
*/
|
|
371
|
+
async function processCachedUris(client, fileUris, queries) {
|
|
372
|
+
let previousFindings = null;
|
|
373
|
+
for (let i = 0; i < fileUris.length; i++) {
|
|
374
|
+
const fileUri = fileUris[i];
|
|
375
|
+
const systemInstruction = buildChunkedSystemInstruction(i, fileUris.length, previousFindings);
|
|
376
|
+
const response = await client.models.generateContent({
|
|
377
|
+
model: GEMINI_MODEL,
|
|
378
|
+
contents: [
|
|
379
|
+
{
|
|
380
|
+
role: "user",
|
|
381
|
+
parts: [
|
|
382
|
+
{ fileData: { fileUri, mimeType: "application/pdf" } },
|
|
383
|
+
{ text: buildUserPrompt(queries) },
|
|
384
|
+
],
|
|
385
|
+
},
|
|
386
|
+
],
|
|
387
|
+
config: {
|
|
388
|
+
systemInstruction,
|
|
389
|
+
responseMimeType: "application/json",
|
|
390
|
+
responseSchema: ChunkedGeminiResponseSchema,
|
|
391
|
+
thinkingConfig: { thinkingLevel: ThinkingLevel.HIGH },
|
|
392
|
+
},
|
|
393
|
+
});
|
|
394
|
+
const responseText = response.text || "{}";
|
|
395
|
+
const parsed = JSON.parse(responseText);
|
|
396
|
+
previousFindings = parsed.findings_summary;
|
|
397
|
+
if (i === fileUris.length - 1) {
|
|
398
|
+
return {
|
|
399
|
+
pdf_source: fileUris,
|
|
400
|
+
cached_uris: fileUris,
|
|
401
|
+
responses: ensureAllQueriesAnswered(queries, parsed.responses),
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
throw new Error("No URIs to process");
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Read PDF bytes from a source (URL or local file).
|
|
409
|
+
*/
|
|
410
|
+
async function readPdfBytes(source) {
|
|
411
|
+
if (isUrl(source)) {
|
|
412
|
+
return fetchPdfFromUrl(source);
|
|
413
|
+
}
|
|
414
|
+
validateLocalPath(source);
|
|
415
|
+
return fs.readFileSync(source.trim());
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Analyzes a PDF document using Gemini.
|
|
419
|
+
*
|
|
420
|
+
* Routing:
|
|
421
|
+
* - string[] → cached chunk URIs, sequential processing with rolling findings
|
|
422
|
+
* - Gemini URI string → direct single-file analysis (no bytes to split)
|
|
423
|
+
* - path/URL → read bytes, try full PDF first, split on token limit error
|
|
424
|
+
*/
|
|
425
|
+
export async function analyzePdf(client, input) {
|
|
426
|
+
const { pdf_source, queries } = input;
|
|
427
|
+
// Array of cached Gemini file URIs — re-analysis path
|
|
428
|
+
if (Array.isArray(pdf_source)) {
|
|
429
|
+
return processCachedUris(client, pdf_source, queries);
|
|
430
|
+
}
|
|
431
|
+
// Single Gemini file URI — direct path, no splitting possible
|
|
432
|
+
if (isGeminiFileUri(pdf_source)) {
|
|
433
|
+
return analyzePdfDirect(client, pdf_source, queries);
|
|
434
|
+
}
|
|
435
|
+
// Path or URL — try the full PDF first via the direct path
|
|
436
|
+
try {
|
|
437
|
+
return await analyzePdfDirect(client, pdf_source, queries);
|
|
438
|
+
}
|
|
439
|
+
catch (error) {
|
|
440
|
+
if (!isTokenLimitError(error))
|
|
441
|
+
throw error;
|
|
442
|
+
}
|
|
443
|
+
// Token limit exceeded — read bytes, split into chunks, and process via work queue
|
|
444
|
+
const pdfBytes = await readPdfBytes(pdf_source);
|
|
445
|
+
const initialChunk = await pdfBytesToChunk(new Uint8Array(pdfBytes));
|
|
446
|
+
return processChunkQueue(client, [initialChunk], queries, pdf_source);
|
|
447
|
+
}
|
|
225
448
|
/**
|
|
226
449
|
* Check if an error is an ApiError and return typed error info.
|
|
227
450
|
*/
|
package/dist/service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import { type Schema } from "@google/genai";
|
|
3
3
|
/** Schema for the analyze_pdf tool input */
|
|
4
4
|
export declare const AnalyzePdfInputSchema: z.ZodObject<{
|
|
5
|
-
pdf_source: z.ZodString
|
|
5
|
+
pdf_source: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
|
|
6
6
|
queries: z.ZodArray<z.ZodString>;
|
|
7
7
|
}, z.core.$strip>;
|
|
8
8
|
/** Input type for the analyze_pdf tool */
|
|
@@ -14,8 +14,8 @@ export interface QueryResponse {
|
|
|
14
14
|
}
|
|
15
15
|
/** Response from the analyze_pdf tool */
|
|
16
16
|
export interface AnalyzePdfResponse {
|
|
17
|
-
pdf_source: string;
|
|
18
|
-
|
|
17
|
+
pdf_source: string | string[];
|
|
18
|
+
cached_uris: string[];
|
|
19
19
|
responses: QueryResponse[];
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
@@ -23,6 +23,16 @@ export interface AnalyzePdfResponse {
|
|
|
23
23
|
* This ensures the model returns a predictable JSON structure.
|
|
24
24
|
*/
|
|
25
25
|
export declare const GeminiResponseSchema: Schema;
|
|
26
|
+
/**
|
|
27
|
+
* Gemini response schema for chunked PDF processing.
|
|
28
|
+
* Extends the base schema with a findings_summary field for rolling context.
|
|
29
|
+
*/
|
|
30
|
+
export declare const ChunkedGeminiResponseSchema: Schema;
|
|
31
|
+
/** Response from a chunked Gemini call, including rolling findings */
|
|
32
|
+
export interface ChunkedQueryResponse {
|
|
33
|
+
responses: QueryResponse[];
|
|
34
|
+
findings_summary: string;
|
|
35
|
+
}
|
|
26
36
|
/** Error response from the tool */
|
|
27
37
|
export interface ToolError {
|
|
28
38
|
error: string;
|
package/dist/types.js
CHANGED
|
@@ -2,7 +2,9 @@ import { z } from "zod";
|
|
|
2
2
|
import { Type } from "@google/genai";
|
|
3
3
|
/** Schema for the analyze_pdf tool input */
|
|
4
4
|
export const AnalyzePdfInputSchema = z.object({
|
|
5
|
-
pdf_source: z
|
|
5
|
+
pdf_source: z
|
|
6
|
+
.union([z.string(), z.array(z.string().min(1)).min(1)])
|
|
7
|
+
.describe("PDF source: file path, URL, single Gemini file URI, or array of Gemini file URIs from a previous chunked response"),
|
|
6
8
|
queries: z.array(z.string().min(1)).min(1).describe("Array of questions to ask about the PDF"),
|
|
7
9
|
});
|
|
8
10
|
/**
|
|
@@ -27,4 +29,30 @@ export const GeminiResponseSchema = {
|
|
|
27
29
|
},
|
|
28
30
|
required: ["responses"],
|
|
29
31
|
};
|
|
32
|
+
/**
|
|
33
|
+
* Gemini response schema for chunked PDF processing.
|
|
34
|
+
* Extends the base schema with a findings_summary field for rolling context.
|
|
35
|
+
*/
|
|
36
|
+
export const ChunkedGeminiResponseSchema = {
|
|
37
|
+
type: Type.OBJECT,
|
|
38
|
+
properties: {
|
|
39
|
+
responses: {
|
|
40
|
+
type: Type.ARRAY,
|
|
41
|
+
items: {
|
|
42
|
+
type: Type.OBJECT,
|
|
43
|
+
properties: {
|
|
44
|
+
query: { type: Type.STRING, description: "The original question" },
|
|
45
|
+
answer: { type: Type.STRING, description: "The answer based on PDF content" },
|
|
46
|
+
},
|
|
47
|
+
required: ["query", "answer"],
|
|
48
|
+
},
|
|
49
|
+
description: "Array of query-answer pairs",
|
|
50
|
+
},
|
|
51
|
+
findings_summary: {
|
|
52
|
+
type: Type.STRING,
|
|
53
|
+
description: "Summary of findings so far across all processed chunks. Include page citations, partial answers, and what remains unanswered.",
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
required: ["responses", "findings_summary"],
|
|
57
|
+
};
|
|
30
58
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAe,MAAM,eAAe,CAAC;AAElD,4CAA4C;AAC5C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAe,MAAM,eAAe,CAAC;AAElD,4CAA4C;AAC5C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,UAAU,EAAE,CAAC;SACV,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SACtD,QAAQ,CACP,mHAAmH,CACpH;IACH,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC;CAC/F,CAAC,CAAC;AAkBH;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAW;IAC1C,IAAI,EAAE,IAAI,CAAC,MAAM;IACjB,UAAU,EAAE;QACV,SAAS,EAAE;YACT,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,KAAK,EAAE;gBACL,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,UAAU,EAAE;oBACV,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,uBAAuB,EAAE;oBAClE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,iCAAiC,EAAE;iBAC9E;gBACD,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;aAC9B;YACD,WAAW,EAAE,6BAA6B;SAC3C;KACF;IACD,QAAQ,EAAE,CAAC,WAAW,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAW;IACjD,IAAI,EAAE,IAAI,CAAC,MAAM;IACjB,UAAU,EAAE;QACV,SAAS,EAAE;YACT,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,KAAK,EAAE;gBACL,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,UAAU,EAAE;oBACV,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,uBAAuB,EAAE;oBAClE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,iCAAiC,EAAE;iBAC9E;gBACD,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;aAC9B;YACD,WAAW,EAAE,6BAA6B;SAC3C;QACD,gBAAgB,EAAE;YAChB,IAAI,EAAE,IAAI,CAAC,MAAM;YACjB,WAAW,EACT,+HAA+H;SAClI;KACF;IACD,QAAQ,EAAE,CAAC,WAAW,EAAE,kBAAkB,CAAC;CAC5C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@intelligentelectron/pdf-analyzer",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "MCP server for analyzing PDF documents using Gemini API",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
"format:check": "prettier --check \"src/**/*.ts\"",
|
|
21
21
|
"test": "vitest run",
|
|
22
22
|
"test:watch": "vitest",
|
|
23
|
-
"compile:all": "npm run compile:darwin-arm64 && npm run compile:darwin-x64 && npm run compile:linux-arm64 && npm run compile:linux-x64 && npm run compile:windows-x64",
|
|
23
|
+
"compile:all": "npm run compile:darwin-arm64 && npm run compile:darwin-x64 && npm run compile:linux-arm64 && npm run compile:linux-x64 && npm run compile:windows-x64 && lipo -create bin/pdf-analyzer-darwin-arm64 bin/pdf-analyzer-darwin-x64 -output bin/pdf-analyzer-darwin-universal",
|
|
24
|
+
"compile:darwin-universal": "npm run compile:darwin-arm64 && npm run compile:darwin-x64 && lipo -create bin/pdf-analyzer-darwin-arm64 bin/pdf-analyzer-darwin-x64 -output bin/pdf-analyzer-darwin-universal",
|
|
24
25
|
"compile:darwin-arm64": "bun build --compile --minify --target=bun-darwin-arm64 --define BUILD_VERSION=\"\\\"$(node -p 'require(\\\"./package.json\\\").version')\\\"\" src/index.ts --outfile=bin/pdf-analyzer-darwin-arm64",
|
|
25
26
|
"compile:darwin-x64": "bun build --compile --minify --target=bun-darwin-x64 --define BUILD_VERSION=\"\\\"$(node -p 'require(\\\"./package.json\\\").version')\\\"\" src/index.ts --outfile=bin/pdf-analyzer-darwin-x64",
|
|
26
27
|
"compile:linux-arm64": "bun build --compile --minify --target=bun-linux-arm64 --define BUILD_VERSION=\"\\\"$(node -p 'require(\\\"./package.json\\\").version')\\\"\" src/index.ts --outfile=bin/pdf-analyzer-linux-arm64",
|
|
@@ -30,6 +31,7 @@
|
|
|
30
31
|
"dependencies": {
|
|
31
32
|
"@google/genai": "^1.37.0",
|
|
32
33
|
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
34
|
+
"pdf-lib": "^1.17.1",
|
|
33
35
|
"zod": "^4.1.12"
|
|
34
36
|
},
|
|
35
37
|
"devDependencies": {
|