@pan-sec/notebooklm-mcp 1.7.0 → 1.9.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 +382 -56
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -1
- package/dist/gemini/gemini-client.d.ts +86 -0
- package/dist/gemini/gemini-client.d.ts.map +1 -0
- package/dist/gemini/gemini-client.js +473 -0
- package/dist/gemini/gemini-client.js.map +1 -0
- package/dist/gemini/index.d.ts +8 -0
- package/dist/gemini/index.d.ts.map +1 -0
- package/dist/gemini/index.js +8 -0
- package/dist/gemini/index.js.map +1 -0
- package/dist/gemini/types.d.ts +232 -0
- package/dist/gemini/types.d.ts.map +1 -0
- package/dist/gemini/types.js +10 -0
- package/dist/gemini/types.js.map +1 -0
- package/dist/index.js +36 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/definitions/gemini.d.ts +12 -0
- package/dist/tools/definitions/gemini.d.ts.map +1 -0
- package/dist/tools/definitions/gemini.js +300 -0
- package/dist/tools/definitions/gemini.js.map +1 -0
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +2 -0
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/handlers.d.ts +63 -0
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/tools/handlers.js +332 -0
- package/dist/tools/handlers.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini Interactions API Client
|
|
3
|
+
*
|
|
4
|
+
* Provides access to Gemini models and the Deep Research agent
|
|
5
|
+
* via the Interactions API for stable, API-based research capabilities.
|
|
6
|
+
*/
|
|
7
|
+
import type { ProgressCallback } from "../types.js";
|
|
8
|
+
import type { GeminiQueryOptions, GeminiInteraction, DeepResearchOptions, UploadDocumentOptions, QueryDocumentOptions, GeminiFile, UploadDocumentResult, QueryDocumentResult, ListDocumentsResult } from "./types.js";
|
|
9
|
+
export { DEEP_RESEARCH_AGENT } from "./types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Client for Gemini Interactions API
|
|
12
|
+
*/
|
|
13
|
+
export declare class GeminiClient {
|
|
14
|
+
private client;
|
|
15
|
+
constructor(apiKey?: string);
|
|
16
|
+
/**
|
|
17
|
+
* Check if the client is available (API key configured)
|
|
18
|
+
*/
|
|
19
|
+
isAvailable(): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Perform a quick query to Gemini
|
|
22
|
+
*/
|
|
23
|
+
query(options: GeminiQueryOptions): Promise<GeminiInteraction>;
|
|
24
|
+
/**
|
|
25
|
+
* Start deep research using the Deep Research agent
|
|
26
|
+
*/
|
|
27
|
+
deepResearch(options: DeepResearchOptions): Promise<GeminiInteraction>;
|
|
28
|
+
/**
|
|
29
|
+
* Get an existing interaction by ID
|
|
30
|
+
*/
|
|
31
|
+
getInteraction(interactionId: string): Promise<GeminiInteraction>;
|
|
32
|
+
/**
|
|
33
|
+
* Poll for interaction completion
|
|
34
|
+
*/
|
|
35
|
+
pollForCompletion(interactionId: string, maxWaitMs: number, progressCallback?: ProgressCallback): Promise<GeminiInteraction>;
|
|
36
|
+
/**
|
|
37
|
+
* Delete a stored interaction
|
|
38
|
+
*/
|
|
39
|
+
deleteInteraction(interactionId: string): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Map SDK response to our interface
|
|
42
|
+
*/
|
|
43
|
+
private mapInteraction;
|
|
44
|
+
/**
|
|
45
|
+
* Upload a document to Gemini Files API
|
|
46
|
+
* Files are retained for 48 hours and can be used in multiple queries
|
|
47
|
+
*/
|
|
48
|
+
uploadDocument(options: UploadDocumentOptions): Promise<UploadDocumentResult>;
|
|
49
|
+
/**
|
|
50
|
+
* Wait for file processing to complete
|
|
51
|
+
*/
|
|
52
|
+
private waitForFileProcessing;
|
|
53
|
+
/**
|
|
54
|
+
* Get file metadata
|
|
55
|
+
*/
|
|
56
|
+
getFile(fileName: string): Promise<GeminiFile>;
|
|
57
|
+
/**
|
|
58
|
+
* List all uploaded files
|
|
59
|
+
*/
|
|
60
|
+
listFiles(pageSize?: number, pageToken?: string): Promise<ListDocumentsResult>;
|
|
61
|
+
/**
|
|
62
|
+
* Delete an uploaded file
|
|
63
|
+
*/
|
|
64
|
+
deleteFile(fileName: string): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Query an uploaded document
|
|
67
|
+
*/
|
|
68
|
+
queryDocument(options: QueryDocumentOptions): Promise<QueryDocumentResult>;
|
|
69
|
+
/**
|
|
70
|
+
* Map SDK file response to our interface
|
|
71
|
+
*/
|
|
72
|
+
private mapFile;
|
|
73
|
+
/**
|
|
74
|
+
* Detect MIME type from file extension
|
|
75
|
+
*/
|
|
76
|
+
private detectMimeType;
|
|
77
|
+
/**
|
|
78
|
+
* Format bytes to human-readable string
|
|
79
|
+
*/
|
|
80
|
+
private formatBytes;
|
|
81
|
+
/**
|
|
82
|
+
* Calculate expiration time (48 hours from now)
|
|
83
|
+
*/
|
|
84
|
+
private calculateExpiration;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=gemini-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-client.d.ts","sourceRoot":"","sources":["../../src/gemini/gemini-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EAGnB,qBAAqB,EACrB,oBAAoB,EACpB,UAAU,EAEV,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAKpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA4B;gBAE9B,MAAM,CAAC,EAAE,MAAM;IAU3B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA+CpE;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAwC5E;;OAEG;IACG,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAevE;;OAEG;IACG,iBAAiB,CACrB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,OAAO,CAAC,iBAAiB,CAAC;IAgD7B;;OAEG;IACG,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe7D;;OAEG;IACH,OAAO,CAAC,cAAc;IAkDtB;;;OAGG;IACG,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAoDnF;;OAEG;YACW,qBAAqB;IAsBnC;;OAEG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAepD;;OAEG;IACG,SAAS,CAAC,QAAQ,SAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAyBjF;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAejD;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA6EhF;;OAEG;IACH,OAAO,CAAC,OAAO;IA0Bf;;OAEG;IACH,OAAO,CAAC,cAAc;IAyBtB;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAK5B"}
|
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini Interactions API Client
|
|
3
|
+
*
|
|
4
|
+
* Provides access to Gemini models and the Deep Research agent
|
|
5
|
+
* via the Interactions API for stable, API-based research capabilities.
|
|
6
|
+
*/
|
|
7
|
+
import { GoogleGenAI } from "@google/genai";
|
|
8
|
+
import { log } from "../utils/logger.js";
|
|
9
|
+
import { CONFIG } from "../config.js";
|
|
10
|
+
import fs from "fs";
|
|
11
|
+
import path from "path";
|
|
12
|
+
// Re-export the agent constant
|
|
13
|
+
export { DEEP_RESEARCH_AGENT } from "./types.js";
|
|
14
|
+
/**
|
|
15
|
+
* Client for Gemini Interactions API
|
|
16
|
+
*/
|
|
17
|
+
export class GeminiClient {
|
|
18
|
+
client = null;
|
|
19
|
+
constructor(apiKey) {
|
|
20
|
+
const key = apiKey || CONFIG.geminiApiKey;
|
|
21
|
+
if (key) {
|
|
22
|
+
this.client = new GoogleGenAI({ apiKey: key });
|
|
23
|
+
log.info("Gemini client initialized");
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
log.info("Gemini client not initialized (no API key)");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if the client is available (API key configured)
|
|
31
|
+
*/
|
|
32
|
+
isAvailable() {
|
|
33
|
+
return this.client !== null;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Perform a quick query to Gemini
|
|
37
|
+
*/
|
|
38
|
+
async query(options) {
|
|
39
|
+
if (!this.client) {
|
|
40
|
+
throw new Error("Gemini API key not configured. Set GEMINI_API_KEY environment variable.");
|
|
41
|
+
}
|
|
42
|
+
const model = options.model || CONFIG.geminiDefaultModel || "gemini-2.5-flash";
|
|
43
|
+
log.info(`Gemini query to ${model}: ${options.query.substring(0, 50)}...`);
|
|
44
|
+
try {
|
|
45
|
+
// Build tools array - use 'as any' to bypass strict SDK typing
|
|
46
|
+
const tools = [];
|
|
47
|
+
if (options.tools) {
|
|
48
|
+
for (const tool of options.tools) {
|
|
49
|
+
tools.push({ type: tool });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Build input - just use string for simplicity
|
|
53
|
+
let input = options.query;
|
|
54
|
+
// If URLs are provided, append them to the query
|
|
55
|
+
if (options.urls && options.urls.length > 0) {
|
|
56
|
+
input = `${options.query}\n\nPlease analyze these URLs:\n${options.urls.join("\n")}`;
|
|
57
|
+
}
|
|
58
|
+
// Create interaction - use 'as any' to handle SDK type strictness
|
|
59
|
+
const response = await this.client.interactions.create({
|
|
60
|
+
model,
|
|
61
|
+
input,
|
|
62
|
+
tools: tools.length > 0 ? tools : undefined,
|
|
63
|
+
previousInteractionId: options.previousInteractionId,
|
|
64
|
+
store: true,
|
|
65
|
+
generationConfig: options.generationConfig ? {
|
|
66
|
+
temperature: options.generationConfig.temperature,
|
|
67
|
+
maxOutputTokens: options.generationConfig.maxOutputTokens,
|
|
68
|
+
thinkingLevel: options.generationConfig.thinkingLevel,
|
|
69
|
+
} : undefined,
|
|
70
|
+
});
|
|
71
|
+
return this.mapInteraction(response);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
75
|
+
log.error(`Gemini query failed: ${msg}`);
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Start deep research using the Deep Research agent
|
|
81
|
+
*/
|
|
82
|
+
async deepResearch(options) {
|
|
83
|
+
if (!this.client) {
|
|
84
|
+
throw new Error("Gemini API key not configured. Set GEMINI_API_KEY environment variable.");
|
|
85
|
+
}
|
|
86
|
+
if (!CONFIG.geminiDeepResearchEnabled) {
|
|
87
|
+
throw new Error("Deep Research is disabled. Set GEMINI_DEEP_RESEARCH_ENABLED=true to enable.");
|
|
88
|
+
}
|
|
89
|
+
log.info(`Starting deep research: ${options.query.substring(0, 50)}...`);
|
|
90
|
+
try {
|
|
91
|
+
// Start research in background - use 'as any' to handle SDK type strictness
|
|
92
|
+
const response = await this.client.interactions.create({
|
|
93
|
+
input: options.query,
|
|
94
|
+
agent: "deep-research-pro-preview-12-2025",
|
|
95
|
+
background: options.background !== false,
|
|
96
|
+
store: true,
|
|
97
|
+
});
|
|
98
|
+
const interaction = this.mapInteraction(response);
|
|
99
|
+
log.info(`Deep research started: ${interaction.id}`);
|
|
100
|
+
// If waiting for completion, poll
|
|
101
|
+
if (options.waitForCompletion !== false) {
|
|
102
|
+
return this.pollForCompletion(interaction.id, options.maxWaitMs || 300000, // 5 minutes default
|
|
103
|
+
options.progressCallback);
|
|
104
|
+
}
|
|
105
|
+
return interaction;
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
109
|
+
log.error(`Deep research failed: ${msg}`);
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get an existing interaction by ID
|
|
115
|
+
*/
|
|
116
|
+
async getInteraction(interactionId) {
|
|
117
|
+
if (!this.client) {
|
|
118
|
+
throw new Error("Gemini API key not configured.");
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
const response = await this.client.interactions.get(interactionId);
|
|
122
|
+
return this.mapInteraction(response);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
126
|
+
log.error(`Failed to get interaction ${interactionId}: ${msg}`);
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Poll for interaction completion
|
|
132
|
+
*/
|
|
133
|
+
async pollForCompletion(interactionId, maxWaitMs, progressCallback) {
|
|
134
|
+
const startTime = Date.now();
|
|
135
|
+
const pollInterval = 10000; // 10 seconds
|
|
136
|
+
let lastStatus = null;
|
|
137
|
+
log.info(`Polling for completion: ${interactionId} (max ${maxWaitMs / 1000}s)`);
|
|
138
|
+
while (Date.now() - startTime < maxWaitMs) {
|
|
139
|
+
const interaction = await this.getInteraction(interactionId);
|
|
140
|
+
const elapsed = Math.round((Date.now() - startTime) / 1000);
|
|
141
|
+
// Report progress - ProgressCallback signature is (message, progress?, total?)
|
|
142
|
+
if (progressCallback && interaction.status !== lastStatus) {
|
|
143
|
+
const progress = Math.min(90, Math.round((elapsed / (maxWaitMs / 1000)) * 100));
|
|
144
|
+
await progressCallback(`Research ${interaction.status}... (${elapsed}s elapsed)`, progress, 100);
|
|
145
|
+
lastStatus = interaction.status;
|
|
146
|
+
}
|
|
147
|
+
// Check if done
|
|
148
|
+
if (interaction.status === "completed") {
|
|
149
|
+
if (progressCallback) {
|
|
150
|
+
await progressCallback("Research complete", 100, 100);
|
|
151
|
+
}
|
|
152
|
+
log.success(`Research completed in ${elapsed}s`);
|
|
153
|
+
return interaction;
|
|
154
|
+
}
|
|
155
|
+
if (interaction.status === "failed") {
|
|
156
|
+
if (progressCallback) {
|
|
157
|
+
await progressCallback("Research failed", 100, 100);
|
|
158
|
+
}
|
|
159
|
+
log.error(`Research failed: ${interaction.error || "Unknown error"}`);
|
|
160
|
+
return interaction;
|
|
161
|
+
}
|
|
162
|
+
// Wait before next poll
|
|
163
|
+
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
164
|
+
}
|
|
165
|
+
// Timeout
|
|
166
|
+
const elapsed = Math.round((Date.now() - startTime) / 1000);
|
|
167
|
+
throw new Error(`Research timed out after ${elapsed} seconds`);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Delete a stored interaction
|
|
171
|
+
*/
|
|
172
|
+
async deleteInteraction(interactionId) {
|
|
173
|
+
if (!this.client) {
|
|
174
|
+
throw new Error("Gemini API key not configured.");
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
await this.client.interactions.delete(interactionId);
|
|
178
|
+
log.info(`Deleted interaction: ${interactionId}`);
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
182
|
+
log.error(`Failed to delete interaction: ${msg}`);
|
|
183
|
+
throw error;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Map SDK response to our interface
|
|
188
|
+
*/
|
|
189
|
+
mapInteraction(response) {
|
|
190
|
+
// The SDK returns an object with id, model, status, outputs, usage
|
|
191
|
+
const r = response;
|
|
192
|
+
const outputs = (r.outputs || []).map(o => ({
|
|
193
|
+
type: o.type || "text",
|
|
194
|
+
text: o.text,
|
|
195
|
+
name: o.name,
|
|
196
|
+
arguments: o.arguments,
|
|
197
|
+
id: o.id,
|
|
198
|
+
}));
|
|
199
|
+
return {
|
|
200
|
+
id: r.id || "",
|
|
201
|
+
model: r.model,
|
|
202
|
+
status: r.status || "pending",
|
|
203
|
+
outputs,
|
|
204
|
+
usage: r.usage ? {
|
|
205
|
+
totalTokens: r.usage.totalTokens || r.usage.total_tokens || 0,
|
|
206
|
+
promptTokens: r.usage.promptTokens || r.usage.prompt_tokens,
|
|
207
|
+
completionTokens: r.usage.completionTokens || r.usage.completion_tokens,
|
|
208
|
+
} : undefined,
|
|
209
|
+
error: r.error,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
// ===========================================================================
|
|
213
|
+
// Files API Methods (v1.9.0)
|
|
214
|
+
// ===========================================================================
|
|
215
|
+
/**
|
|
216
|
+
* Upload a document to Gemini Files API
|
|
217
|
+
* Files are retained for 48 hours and can be used in multiple queries
|
|
218
|
+
*/
|
|
219
|
+
async uploadDocument(options) {
|
|
220
|
+
if (!this.client) {
|
|
221
|
+
throw new Error("Gemini API key not configured. Set GEMINI_API_KEY environment variable.");
|
|
222
|
+
}
|
|
223
|
+
const { filePath, displayName, mimeType } = options;
|
|
224
|
+
// Verify file exists
|
|
225
|
+
if (!fs.existsSync(filePath)) {
|
|
226
|
+
throw new Error(`File not found: ${filePath}`);
|
|
227
|
+
}
|
|
228
|
+
// Get file stats
|
|
229
|
+
const stats = fs.statSync(filePath);
|
|
230
|
+
const fileName = displayName || path.basename(filePath);
|
|
231
|
+
// Auto-detect MIME type if not provided
|
|
232
|
+
const detectedMimeType = mimeType || this.detectMimeType(filePath);
|
|
233
|
+
log.info(`Uploading document: ${fileName} (${this.formatBytes(stats.size)})`);
|
|
234
|
+
try {
|
|
235
|
+
// Upload file using SDK
|
|
236
|
+
const uploadResult = await this.client.files.upload({
|
|
237
|
+
file: filePath,
|
|
238
|
+
config: {
|
|
239
|
+
displayName: fileName,
|
|
240
|
+
mimeType: detectedMimeType,
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
// Poll for processing completion
|
|
244
|
+
let file = await this.waitForFileProcessing(uploadResult.name);
|
|
245
|
+
log.success(`Document uploaded: ${file.name}`);
|
|
246
|
+
return {
|
|
247
|
+
fileName: file.name,
|
|
248
|
+
displayName: file.displayName || fileName,
|
|
249
|
+
uri: file.uri,
|
|
250
|
+
mimeType: file.mimeType,
|
|
251
|
+
sizeBytes: file.sizeBytes,
|
|
252
|
+
expiresAt: file.expirationTime || this.calculateExpiration(),
|
|
253
|
+
state: file.state,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
258
|
+
log.error(`Failed to upload document: ${msg}`);
|
|
259
|
+
throw error;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Wait for file processing to complete
|
|
264
|
+
*/
|
|
265
|
+
async waitForFileProcessing(fileName, maxWaitMs = 60000) {
|
|
266
|
+
const startTime = Date.now();
|
|
267
|
+
const pollInterval = 2000; // 2 seconds
|
|
268
|
+
while (Date.now() - startTime < maxWaitMs) {
|
|
269
|
+
const file = await this.getFile(fileName);
|
|
270
|
+
if (file.state === "ACTIVE") {
|
|
271
|
+
return file;
|
|
272
|
+
}
|
|
273
|
+
if (file.state === "FAILED") {
|
|
274
|
+
throw new Error(`File processing failed: ${file.error || "Unknown error"}`);
|
|
275
|
+
}
|
|
276
|
+
// Still processing, wait and retry
|
|
277
|
+
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
278
|
+
}
|
|
279
|
+
throw new Error(`File processing timed out after ${maxWaitMs / 1000} seconds`);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Get file metadata
|
|
283
|
+
*/
|
|
284
|
+
async getFile(fileName) {
|
|
285
|
+
if (!this.client) {
|
|
286
|
+
throw new Error("Gemini API key not configured.");
|
|
287
|
+
}
|
|
288
|
+
try {
|
|
289
|
+
const response = await this.client.files.get({ name: fileName });
|
|
290
|
+
return this.mapFile(response);
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
294
|
+
log.error(`Failed to get file ${fileName}: ${msg}`);
|
|
295
|
+
throw error;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* List all uploaded files
|
|
300
|
+
*/
|
|
301
|
+
async listFiles(pageSize = 100, pageToken) {
|
|
302
|
+
if (!this.client) {
|
|
303
|
+
throw new Error("Gemini API key not configured.");
|
|
304
|
+
}
|
|
305
|
+
try {
|
|
306
|
+
const response = await this.client.files.list({
|
|
307
|
+
pageSize,
|
|
308
|
+
pageToken,
|
|
309
|
+
});
|
|
310
|
+
const files = (response.files || []).map((f) => this.mapFile(f));
|
|
311
|
+
return {
|
|
312
|
+
files,
|
|
313
|
+
totalCount: files.length,
|
|
314
|
+
nextPageToken: response.nextPageToken,
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
319
|
+
log.error(`Failed to list files: ${msg}`);
|
|
320
|
+
throw error;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Delete an uploaded file
|
|
325
|
+
*/
|
|
326
|
+
async deleteFile(fileName) {
|
|
327
|
+
if (!this.client) {
|
|
328
|
+
throw new Error("Gemini API key not configured.");
|
|
329
|
+
}
|
|
330
|
+
try {
|
|
331
|
+
await this.client.files.delete({ name: fileName });
|
|
332
|
+
log.info(`Deleted file: ${fileName}`);
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
336
|
+
log.error(`Failed to delete file ${fileName}: ${msg}`);
|
|
337
|
+
throw error;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Query an uploaded document
|
|
342
|
+
*/
|
|
343
|
+
async queryDocument(options) {
|
|
344
|
+
if (!this.client) {
|
|
345
|
+
throw new Error("Gemini API key not configured. Set GEMINI_API_KEY environment variable.");
|
|
346
|
+
}
|
|
347
|
+
const { fileName, query, model, additionalFiles, generationConfig } = options;
|
|
348
|
+
const modelId = model || CONFIG.geminiDefaultModel || "gemini-2.5-flash";
|
|
349
|
+
log.info(`Querying document ${fileName}: ${query.substring(0, 50)}...`);
|
|
350
|
+
try {
|
|
351
|
+
// Get file metadata for URI
|
|
352
|
+
const file = await this.getFile(fileName);
|
|
353
|
+
if (file.state !== "ACTIVE") {
|
|
354
|
+
throw new Error(`File is not ready for querying. State: ${file.state}`);
|
|
355
|
+
}
|
|
356
|
+
// Build content parts with file references
|
|
357
|
+
const fileParts = [
|
|
358
|
+
{ fileData: { fileUri: file.uri, mimeType: file.mimeType } },
|
|
359
|
+
];
|
|
360
|
+
// Add additional files if specified
|
|
361
|
+
const filesUsed = [fileName];
|
|
362
|
+
if (additionalFiles) {
|
|
363
|
+
for (const additionalFileName of additionalFiles) {
|
|
364
|
+
const additionalFile = await this.getFile(additionalFileName);
|
|
365
|
+
if (additionalFile.state === "ACTIVE") {
|
|
366
|
+
fileParts.push({
|
|
367
|
+
fileData: { fileUri: additionalFile.uri, mimeType: additionalFile.mimeType },
|
|
368
|
+
});
|
|
369
|
+
filesUsed.push(additionalFileName);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
// Generate content with the document
|
|
374
|
+
const response = await this.client.models.generateContent({
|
|
375
|
+
model: modelId,
|
|
376
|
+
contents: [
|
|
377
|
+
{
|
|
378
|
+
role: "user",
|
|
379
|
+
parts: [
|
|
380
|
+
...fileParts,
|
|
381
|
+
{ text: query },
|
|
382
|
+
],
|
|
383
|
+
},
|
|
384
|
+
],
|
|
385
|
+
generationConfig: generationConfig ? {
|
|
386
|
+
temperature: generationConfig.temperature,
|
|
387
|
+
maxOutputTokens: generationConfig.maxOutputTokens,
|
|
388
|
+
} : undefined,
|
|
389
|
+
});
|
|
390
|
+
// Extract response text
|
|
391
|
+
const answer = response.response?.text?.() ||
|
|
392
|
+
response.response?.candidates?.[0]?.content?.parts?.[0]?.text ||
|
|
393
|
+
"";
|
|
394
|
+
// Extract usage
|
|
395
|
+
const usage = response.response?.usageMetadata;
|
|
396
|
+
log.success(`Document query completed`);
|
|
397
|
+
return {
|
|
398
|
+
answer,
|
|
399
|
+
model: modelId,
|
|
400
|
+
tokensUsed: usage?.totalTokenCount,
|
|
401
|
+
filesUsed,
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
catch (error) {
|
|
405
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
406
|
+
log.error(`Document query failed: ${msg}`);
|
|
407
|
+
throw error;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Map SDK file response to our interface
|
|
412
|
+
*/
|
|
413
|
+
mapFile(response) {
|
|
414
|
+
const r = response;
|
|
415
|
+
return {
|
|
416
|
+
name: r.name || "",
|
|
417
|
+
displayName: r.displayName,
|
|
418
|
+
mimeType: r.mimeType || "application/octet-stream",
|
|
419
|
+
sizeBytes: typeof r.sizeBytes === "string" ? parseInt(r.sizeBytes, 10) : r.sizeBytes,
|
|
420
|
+
createTime: r.createTime,
|
|
421
|
+
expirationTime: r.expirationTime,
|
|
422
|
+
state: r.state || "PROCESSING",
|
|
423
|
+
uri: r.uri || "",
|
|
424
|
+
error: r.error?.message,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Detect MIME type from file extension
|
|
429
|
+
*/
|
|
430
|
+
detectMimeType(filePath) {
|
|
431
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
432
|
+
const mimeTypes = {
|
|
433
|
+
".pdf": "application/pdf",
|
|
434
|
+
".txt": "text/plain",
|
|
435
|
+
".md": "text/markdown",
|
|
436
|
+
".html": "text/html",
|
|
437
|
+
".htm": "text/html",
|
|
438
|
+
".csv": "text/csv",
|
|
439
|
+
".json": "application/json",
|
|
440
|
+
".xml": "application/xml",
|
|
441
|
+
".doc": "application/msword",
|
|
442
|
+
".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
443
|
+
".png": "image/png",
|
|
444
|
+
".jpg": "image/jpeg",
|
|
445
|
+
".jpeg": "image/jpeg",
|
|
446
|
+
".gif": "image/gif",
|
|
447
|
+
".webp": "image/webp",
|
|
448
|
+
".mp3": "audio/mpeg",
|
|
449
|
+
".wav": "audio/wav",
|
|
450
|
+
".mp4": "video/mp4",
|
|
451
|
+
};
|
|
452
|
+
return mimeTypes[ext] || "application/octet-stream";
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Format bytes to human-readable string
|
|
456
|
+
*/
|
|
457
|
+
formatBytes(bytes) {
|
|
458
|
+
if (bytes < 1024)
|
|
459
|
+
return `${bytes} B`;
|
|
460
|
+
if (bytes < 1024 * 1024)
|
|
461
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
462
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Calculate expiration time (48 hours from now)
|
|
466
|
+
*/
|
|
467
|
+
calculateExpiration() {
|
|
468
|
+
const expiration = new Date();
|
|
469
|
+
expiration.setHours(expiration.getHours() + 48);
|
|
470
|
+
return expiration.toISOString();
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
//# sourceMappingURL=gemini-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-client.js","sourceRoot":"","sources":["../../src/gemini/gemini-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gemini/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gemini/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC"}
|