@lutery/vision-mcp 1.0.0 → 1.0.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 +136 -337
- package/dist/adapters/gemini-adapter.d.ts +73 -0
- package/dist/adapters/gemini-adapter.d.ts.map +1 -0
- package/dist/adapters/gemini-adapter.js +406 -0
- package/dist/adapters/gemini-adapter.js.map +1 -0
- package/dist/providers/provider-registry.d.ts.map +1 -1
- package/dist/providers/provider-registry.js +23 -1
- package/dist/providers/provider-registry.js.map +1 -1
- package/dist/utils/errors.d.ts +12 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +44 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/logger.d.ts +13 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +56 -9
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/thinking-extractors.d.ts +11 -0
- package/dist/utils/thinking-extractors.d.ts.map +1 -1
- package/dist/utils/thinking-extractors.js +47 -0
- package/dist/utils/thinking-extractors.js.map +1 -1
- package/dist/utils/thinking-filter.d.ts.map +1 -1
- package/dist/utils/thinking-filter.js +2 -1
- package/dist/utils/thinking-filter.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini Adapter
|
|
3
|
+
*
|
|
4
|
+
* @description Gemini generateContent API 适配器实现,支持 Google Gemini 多模态视觉模型
|
|
5
|
+
* @see https://ai.google.dev/api/rest/v1beta/models/generateContent
|
|
6
|
+
*/
|
|
7
|
+
import { BaseVisionModelAdapter } from './base-adapter.js';
|
|
8
|
+
import { ModelAPIError, ModelConfigError } from '../utils/errors.js';
|
|
9
|
+
import { logger } from '../utils/logger.js';
|
|
10
|
+
import { parseDataUrl } from '../utils/data-url-parser.js';
|
|
11
|
+
import { filterThinkingContent } from '../utils/thinking-filter.js';
|
|
12
|
+
// Supported MIME types for images
|
|
13
|
+
const SUPPORTED_IMAGE_TYPES = new Set(['image/jpeg', 'image/jpg', 'image/png', 'image/webp']);
|
|
14
|
+
const MAX_DOWNLOAD_SIZE = 10 * 1024 * 1024; // 10MB
|
|
15
|
+
const DOWNLOAD_TIMEOUT = 30000; // 30 seconds
|
|
16
|
+
export class GeminiAdapter extends BaseVisionModelAdapter {
|
|
17
|
+
options;
|
|
18
|
+
constructor(config, options = {}) {
|
|
19
|
+
super(config);
|
|
20
|
+
if (config.type !== 'gemini') {
|
|
21
|
+
throw new ModelConfigError('Invalid model type. Expected: gemini', { expected: 'gemini', received: config.type });
|
|
22
|
+
}
|
|
23
|
+
this.options = {
|
|
24
|
+
maxTokens: options.maxTokens || 2048,
|
|
25
|
+
apiVersion: options.apiVersion ||
|
|
26
|
+
process.env.VISION_GEMINI_API_VERSION ||
|
|
27
|
+
'v1beta',
|
|
28
|
+
authMode: options.authMode ||
|
|
29
|
+
process.env.VISION_GEMINI_AUTH_MODE ||
|
|
30
|
+
'bearer',
|
|
31
|
+
imagePartMode: options.imagePartMode ||
|
|
32
|
+
process.env.VISION_GEMINI_IMAGE_PART_MODE ||
|
|
33
|
+
'inline_data'
|
|
34
|
+
};
|
|
35
|
+
logger.info('Initialized Gemini adapter', {
|
|
36
|
+
model: config.name,
|
|
37
|
+
baseUrl: config.baseUrl,
|
|
38
|
+
apiVersion: this.options.apiVersion,
|
|
39
|
+
authMode: this.options.authMode,
|
|
40
|
+
imagePartMode: this.options.imagePartMode
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
async analyze(imageData, prompt) {
|
|
44
|
+
logger.logRequest('Analyzing image with Gemini', {
|
|
45
|
+
modelType: 'gemini',
|
|
46
|
+
model: this.config.name,
|
|
47
|
+
imageLength: imageData.length
|
|
48
|
+
});
|
|
49
|
+
try {
|
|
50
|
+
return await this.withRetry(async (signal) => {
|
|
51
|
+
const response = await this.callGeminiAPI(imageData, prompt, signal);
|
|
52
|
+
logger.logRequest('Gemini analysis completed', {
|
|
53
|
+
modelType: 'gemini',
|
|
54
|
+
model: this.config.name,
|
|
55
|
+
responseLength: response.content.length
|
|
56
|
+
});
|
|
57
|
+
return response.content;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
logger.error('Gemini analysis failed', error);
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async analyzeWithResponse(imageData, prompt) {
|
|
66
|
+
logger.logRequest('Analyzing image with Gemini (full response)', {
|
|
67
|
+
modelType: 'gemini',
|
|
68
|
+
model: this.config.name,
|
|
69
|
+
imageLength: imageData.length
|
|
70
|
+
});
|
|
71
|
+
try {
|
|
72
|
+
return await this.withRetry(async (signal) => {
|
|
73
|
+
const response = await this.callGeminiAPI(imageData, prompt, signal);
|
|
74
|
+
logger.logRequest('Gemini analysis completed', {
|
|
75
|
+
modelType: 'gemini',
|
|
76
|
+
model: this.config.name,
|
|
77
|
+
responseLength: response.content.length,
|
|
78
|
+
usage: response.usage
|
|
79
|
+
});
|
|
80
|
+
return response;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
logger.error('Gemini analysis failed', error);
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async callGeminiAPI(imageData, prompt, signal) {
|
|
89
|
+
const apiUrl = this.buildApiUrl();
|
|
90
|
+
const requestBody = await this.buildRequest(imageData, prompt);
|
|
91
|
+
const headers = this.buildAuthHeaders();
|
|
92
|
+
logger.debug('Calling Gemini generateContent API', {
|
|
93
|
+
endpoint: this.sanitizeUrl(apiUrl),
|
|
94
|
+
model: this.config.name,
|
|
95
|
+
hasImage: !!imageData,
|
|
96
|
+
imagePartMode: this.options.imagePartMode
|
|
97
|
+
});
|
|
98
|
+
try {
|
|
99
|
+
const response = await fetch(apiUrl, {
|
|
100
|
+
method: 'POST',
|
|
101
|
+
headers: {
|
|
102
|
+
'Content-Type': 'application/json',
|
|
103
|
+
...headers
|
|
104
|
+
},
|
|
105
|
+
body: JSON.stringify(requestBody),
|
|
106
|
+
signal
|
|
107
|
+
});
|
|
108
|
+
// Handle error responses
|
|
109
|
+
if (!response.ok) {
|
|
110
|
+
await this.handleErrorResponse(response);
|
|
111
|
+
}
|
|
112
|
+
// Parse response
|
|
113
|
+
const responseData = await this.parseResponseData(response);
|
|
114
|
+
// Normalize response
|
|
115
|
+
return this.normalizeResponse(responseData);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
// Re-throw if it's our error
|
|
119
|
+
if (error instanceof ModelAPIError) {
|
|
120
|
+
throw error;
|
|
121
|
+
}
|
|
122
|
+
// Handle AbortError
|
|
123
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
124
|
+
throw new ModelAPIError('Request timed out', {
|
|
125
|
+
timeout: this.config.timeout || 60000,
|
|
126
|
+
reason: 'API request exceeded timeout'
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* 构建 API URL
|
|
134
|
+
* Format: {baseUrl}/{apiVersion}/models/{model}:generateContent
|
|
135
|
+
*/
|
|
136
|
+
buildApiUrl() {
|
|
137
|
+
let baseUrl = this.config.baseUrl.replace(/\/$/, '');
|
|
138
|
+
// Build URL based on auth mode
|
|
139
|
+
let url = `${baseUrl}/${this.options.apiVersion}/models/${this.config.name}:generateContent`;
|
|
140
|
+
// For query auth mode, append API key to URL
|
|
141
|
+
if (this.options.authMode === 'query') {
|
|
142
|
+
url += `?key=${this.config.apiKey}`;
|
|
143
|
+
}
|
|
144
|
+
return url;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* 构建认证头
|
|
148
|
+
*/
|
|
149
|
+
buildAuthHeaders() {
|
|
150
|
+
if (this.options.authMode === 'bearer') {
|
|
151
|
+
return {
|
|
152
|
+
'Authorization': `Bearer ${this.config.apiKey}`
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
else if (this.options.authMode === 'x-goog') {
|
|
156
|
+
return {
|
|
157
|
+
'x-goog-api-key': this.config.apiKey
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
// query mode - no headers needed
|
|
161
|
+
return {};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* 构建请求体
|
|
165
|
+
*/
|
|
166
|
+
async buildRequest(imageData, prompt) {
|
|
167
|
+
const imagePart = await this.buildImagePart(imageData);
|
|
168
|
+
return {
|
|
169
|
+
contents: [
|
|
170
|
+
{
|
|
171
|
+
role: 'user',
|
|
172
|
+
parts: [
|
|
173
|
+
imagePart,
|
|
174
|
+
{ text: prompt }
|
|
175
|
+
]
|
|
176
|
+
}
|
|
177
|
+
],
|
|
178
|
+
generationConfig: {
|
|
179
|
+
maxOutputTokens: this.options.maxTokens
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* 构建图片 part
|
|
185
|
+
* 支持三种输入格式:
|
|
186
|
+
* 1. HTTP(S) URL - 下载并转换为 base64
|
|
187
|
+
* 2. Data URL - 直接解析
|
|
188
|
+
* 3. Base64 字符串 - 假设为图片
|
|
189
|
+
*/
|
|
190
|
+
async buildImagePart(imageData) {
|
|
191
|
+
// Check if it's an HTTP(S) URL
|
|
192
|
+
if (imageData.startsWith('http://') || imageData.startsWith('https://')) {
|
|
193
|
+
logger.debug('Image is a URL, downloading...', { url: imageData });
|
|
194
|
+
const { mimeType, data } = await this.downloadImageAsBase64(imageData);
|
|
195
|
+
return this.createInlineDataPart(mimeType, data);
|
|
196
|
+
}
|
|
197
|
+
// Check if it's a data URL
|
|
198
|
+
if (imageData.startsWith('data:')) {
|
|
199
|
+
const parsed = parseDataUrl(imageData);
|
|
200
|
+
return this.createInlineDataPart(parsed.mimeType, parsed.data);
|
|
201
|
+
}
|
|
202
|
+
// Assume it's already base64 data
|
|
203
|
+
// Default to PNG if no type info
|
|
204
|
+
return this.createInlineDataPart('image/png', imageData);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* 创建 inline_data part
|
|
208
|
+
*/
|
|
209
|
+
createInlineDataPart(mimeType, data) {
|
|
210
|
+
if (this.options.imagePartMode === 'inline_bytes') {
|
|
211
|
+
// Proxy/legacy format
|
|
212
|
+
return {
|
|
213
|
+
mime_type: mimeType,
|
|
214
|
+
inline_bytes: data
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
// Official format
|
|
218
|
+
return {
|
|
219
|
+
inline_data: {
|
|
220
|
+
mime_type: mimeType,
|
|
221
|
+
data: data
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* 脱敏 URL 用于日志记录(移除敏感的查询参数)
|
|
227
|
+
* @param url - 原始 URL
|
|
228
|
+
* @returns 脱敏后的 URL(query 模式下的 key 会被替换为 ***)
|
|
229
|
+
*/
|
|
230
|
+
sanitizeUrl(url) {
|
|
231
|
+
if (this.options.authMode === 'query') {
|
|
232
|
+
return url.replace(/\?key=([^&\s]+)/, '?key=***');
|
|
233
|
+
}
|
|
234
|
+
return url;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* 下载图片并转换为 base64
|
|
238
|
+
* Gemini 不支持直接的 URL 输入,必须先下载
|
|
239
|
+
*/
|
|
240
|
+
async downloadImageAsBase64(url) {
|
|
241
|
+
logger.debug('Downloading image from URL', { url });
|
|
242
|
+
try {
|
|
243
|
+
const response = await fetch(url, {
|
|
244
|
+
method: 'GET',
|
|
245
|
+
signal: AbortSignal.timeout(DOWNLOAD_TIMEOUT)
|
|
246
|
+
});
|
|
247
|
+
if (!response.ok) {
|
|
248
|
+
throw new ModelAPIError(`Failed to download image: ${response.status} ${response.statusText}`, { url, status: response.status });
|
|
249
|
+
}
|
|
250
|
+
// Check content length
|
|
251
|
+
const contentLength = response.headers.get('content-length');
|
|
252
|
+
if (contentLength && parseInt(contentLength) > MAX_DOWNLOAD_SIZE) {
|
|
253
|
+
throw new ModelAPIError(`Image too large: ${contentLength} bytes (max: ${MAX_DOWNLOAD_SIZE})`, { url, size: contentLength, maxSize: MAX_DOWNLOAD_SIZE });
|
|
254
|
+
}
|
|
255
|
+
// Get MIME type from Content-Type header
|
|
256
|
+
const contentType = response.headers.get('content-type') || 'image/png';
|
|
257
|
+
const mimeType = contentType.split(';')[0].trim();
|
|
258
|
+
// Validate MIME type
|
|
259
|
+
if (!SUPPORTED_IMAGE_TYPES.has(mimeType)) {
|
|
260
|
+
throw new ModelAPIError(`Unsupported image type: ${mimeType}. Supported types: ${Array.from(SUPPORTED_IMAGE_TYPES).join(', ')}`, { url, mimeType, supportedTypes: Array.from(SUPPORTED_IMAGE_TYPES) });
|
|
261
|
+
}
|
|
262
|
+
// Read and convert to base64
|
|
263
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
264
|
+
const buffer = Buffer.from(arrayBuffer);
|
|
265
|
+
// Check size after download
|
|
266
|
+
if (buffer.length > MAX_DOWNLOAD_SIZE) {
|
|
267
|
+
throw new ModelAPIError(`Downloaded image too large: ${buffer.length} bytes (max: ${MAX_DOWNLOAD_SIZE})`, { url, size: buffer.length, maxSize: MAX_DOWNLOAD_SIZE });
|
|
268
|
+
}
|
|
269
|
+
const base64 = buffer.toString('base64');
|
|
270
|
+
logger.debug('Image downloaded successfully', {
|
|
271
|
+
url,
|
|
272
|
+
mimeType,
|
|
273
|
+
size: buffer.length
|
|
274
|
+
});
|
|
275
|
+
return { mimeType, data: base64 };
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
if (error instanceof ModelAPIError) {
|
|
279
|
+
throw error;
|
|
280
|
+
}
|
|
281
|
+
throw new ModelAPIError(`Failed to download image from URL: ${url}`, { url, error: error instanceof Error ? error.message : String(error) }, error instanceof Error ? error : undefined);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* 处理错误响应
|
|
286
|
+
*/
|
|
287
|
+
async handleErrorResponse(response) {
|
|
288
|
+
const status = response.status;
|
|
289
|
+
let errorDetails = { status };
|
|
290
|
+
try {
|
|
291
|
+
const errorText = await response.text();
|
|
292
|
+
try {
|
|
293
|
+
const errorJson = JSON.parse(errorText);
|
|
294
|
+
errorDetails.error = errorJson;
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
errorDetails.errorText = errorText.slice(0, 500);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
// Unable to read response body
|
|
302
|
+
}
|
|
303
|
+
// Special handling for 429
|
|
304
|
+
if (status === 429) {
|
|
305
|
+
const retryAfter = response.headers.get('retry-after');
|
|
306
|
+
throw new ModelAPIError(`Rate limit exceeded (429).${retryAfter ? ` Retry after ${retryAfter}s` : ''}`, errorDetails);
|
|
307
|
+
}
|
|
308
|
+
throw new ModelAPIError(`Gemini API request failed: ${status}`, errorDetails);
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* 解析响应数据
|
|
312
|
+
*/
|
|
313
|
+
async parseResponseData(response) {
|
|
314
|
+
const contentType = response.headers.get('content-type');
|
|
315
|
+
try {
|
|
316
|
+
const rawText = await response.text();
|
|
317
|
+
try {
|
|
318
|
+
return JSON.parse(rawText);
|
|
319
|
+
}
|
|
320
|
+
catch (parseError) {
|
|
321
|
+
const bodyPreview = rawText.length > 500
|
|
322
|
+
? `${rawText.slice(0, 500)}... (truncated, total length: ${rawText.length})`
|
|
323
|
+
: rawText;
|
|
324
|
+
logger.error('Failed to parse Gemini response as JSON', parseError, {
|
|
325
|
+
contentType,
|
|
326
|
+
bodyLength: rawText.length,
|
|
327
|
+
bodyPreview
|
|
328
|
+
});
|
|
329
|
+
throw new ModelAPIError('Failed to parse Gemini response as JSON', {
|
|
330
|
+
contentType,
|
|
331
|
+
bodyLength: rawText.length,
|
|
332
|
+
bodyPreview
|
|
333
|
+
}, parseError);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
if (error instanceof ModelAPIError) {
|
|
338
|
+
throw error;
|
|
339
|
+
}
|
|
340
|
+
throw new ModelAPIError('Failed to read Gemini response', { contentType }, error);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* 归一化 Gemini 响应为 VisionModelResponse
|
|
345
|
+
* 支持两种响应格式:
|
|
346
|
+
* 1. 官方格式: candidates[0].content.parts[].text
|
|
347
|
+
* 2. 代理格式: candidates[0].output.parts[].text
|
|
348
|
+
*/
|
|
349
|
+
normalizeResponse(geminiResponse) {
|
|
350
|
+
const candidate = geminiResponse?.candidates?.[0];
|
|
351
|
+
if (!candidate) {
|
|
352
|
+
throw new ModelAPIError('No candidates in Gemini response', {
|
|
353
|
+
response: geminiResponse
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
// Try both response formats
|
|
357
|
+
const parts = candidate?.content?.parts || candidate?.output?.parts || [];
|
|
358
|
+
if (!parts || parts.length === 0) {
|
|
359
|
+
throw new ModelAPIError('No parts in Gemini response', {
|
|
360
|
+
response: geminiResponse
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
// Extract all text parts
|
|
364
|
+
const textParts = parts
|
|
365
|
+
.filter((part) => part?.text)
|
|
366
|
+
.map((part) => part.text);
|
|
367
|
+
const content = textParts.join('\n\n');
|
|
368
|
+
if (!content) {
|
|
369
|
+
throw new ModelAPIError('Empty content in Gemini response', {
|
|
370
|
+
response: geminiResponse
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
// Filter thinking/reasoning content
|
|
374
|
+
let filteredContent;
|
|
375
|
+
try {
|
|
376
|
+
filteredContent = filterThinkingContent(geminiResponse, 'gemini');
|
|
377
|
+
if (filteredContent.length < content.length) {
|
|
378
|
+
logger.debug('Filtered thinking content from Gemini response', {
|
|
379
|
+
originalLength: content.length,
|
|
380
|
+
filteredLength: filteredContent.length,
|
|
381
|
+
reduction: content.length - filteredContent.length
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
catch (error) {
|
|
386
|
+
logger.warn('Failed to filter thinking content from Gemini response', {
|
|
387
|
+
error: error instanceof Error ? error.message : error
|
|
388
|
+
});
|
|
389
|
+
filteredContent = content;
|
|
390
|
+
}
|
|
391
|
+
// Map usage metadata
|
|
392
|
+
const usageMetadata = geminiResponse?.usageMetadata || geminiResponse?.usage;
|
|
393
|
+
const usage = usageMetadata ? {
|
|
394
|
+
promptTokens: usageMetadata.promptTokenCount || usageMetadata.inputTokens,
|
|
395
|
+
completionTokens: usageMetadata.candidatesTokenCount || usageMetadata.outputTokens,
|
|
396
|
+
totalTokens: usageMetadata.totalTokens || ((usageMetadata.promptTokenCount || usageMetadata.inputTokens || 0) +
|
|
397
|
+
(usageMetadata.candidatesTokenCount || usageMetadata.outputTokens || 0))
|
|
398
|
+
} : undefined;
|
|
399
|
+
return {
|
|
400
|
+
content: filteredContent,
|
|
401
|
+
usage,
|
|
402
|
+
model: geminiResponse?.modelVersion || this.config.name
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
//# sourceMappingURL=gemini-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-adapter.js","sourceRoot":"","sources":["../../src/adapters/gemini-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-registry.d.ts","sourceRoot":"","sources":["../../src/providers/provider-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"provider-registry.d.ts","sourceRoot":"","sources":["../../src/providers/provider-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAA2F,MAAM,iCAAiC,CAAC;AAQ7J;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,cAAc;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW;IACX,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,mBAAmB;IACnB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,CAAC;IACtD,cAAc;IACd,aAAa,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,kBAAkB,CAAC;IAC3D,mBAAmB;IACnB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,oBAAoB;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,cAAM,gBAAgB;IACpB,OAAO,CAAC,SAAS,CAAyC;IAE1D;;OAEG;IACI,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAInD;;OAEG;IACI,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAIxD;;OAEG;IACI,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACI,iBAAiB,IAAI,MAAM,EAAE;CAGrC;AAGD,eAAO,MAAM,QAAQ,kBAAyB,CAAC"}
|
|
@@ -4,12 +4,13 @@
|
|
|
4
4
|
* @description 提供方注册表,集中管理所有支持的模型提供商
|
|
5
5
|
* 添加新提供商只需在这里注册,无需修改其他文件
|
|
6
6
|
*/
|
|
7
|
-
import { extractGLMThinking, extractOpenAIThinking, extractClaudeThinking } from '../utils/thinking-extractors.js';
|
|
7
|
+
import { extractGLMThinking, extractOpenAIThinking, extractClaudeThinking, extractGeminiThinking } from '../utils/thinking-extractors.js';
|
|
8
8
|
import { GLM4VisionAdapter } from '../adapters/glm-adapter.js';
|
|
9
9
|
import { SiliconFlowAdapter } from '../adapters/siliconflow-adapter.js';
|
|
10
10
|
import { ModelScopeAdapter } from '../adapters/modelscope-adapter.js';
|
|
11
11
|
import { OpenAIAdapter } from '../adapters/openai-adapter.js';
|
|
12
12
|
import { ClaudeAdapter } from '../adapters/claude-adapter.js';
|
|
13
|
+
import { GeminiAdapter } from '../adapters/gemini-adapter.js';
|
|
13
14
|
/**
|
|
14
15
|
* 提供商注册表
|
|
15
16
|
*/
|
|
@@ -170,4 +171,25 @@ registry.register({
|
|
|
170
171
|
thinkingExtractor: extractClaudeThinking,
|
|
171
172
|
enableThinking: false
|
|
172
173
|
});
|
|
174
|
+
// Gemini (Google generateContent API) Provider
|
|
175
|
+
registry.register({
|
|
176
|
+
type: 'gemini',
|
|
177
|
+
displayName: 'Google Gemini',
|
|
178
|
+
defaults: {
|
|
179
|
+
baseUrl: 'https://api.gptsapi.net',
|
|
180
|
+
modelName: 'gemini-2.0-flash-exp',
|
|
181
|
+
timeout: 60000,
|
|
182
|
+
maxRetries: 2
|
|
183
|
+
},
|
|
184
|
+
validateApiKey: (apiKey) => {
|
|
185
|
+
// Gemini API key validation - should be at least 10 characters
|
|
186
|
+
if (apiKey.length < 10) {
|
|
187
|
+
return 'Gemini API Key should be at least 10 characters';
|
|
188
|
+
}
|
|
189
|
+
return true;
|
|
190
|
+
},
|
|
191
|
+
createAdapter: (config) => new GeminiAdapter(config),
|
|
192
|
+
thinkingExtractor: extractGeminiThinking,
|
|
193
|
+
enableThinking: false
|
|
194
|
+
});
|
|
173
195
|
//# sourceMappingURL=provider-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../src/providers/provider-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAqB,kBAAkB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../src/providers/provider-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAqB,kBAAkB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC7J,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AA2B9D;;GAEG;AACH,MAAM,gBAAgB;IACZ,SAAS,GAAG,IAAI,GAAG,EAA8B,CAAC;IAE1D;;OAEG;IACI,QAAQ,CAAC,QAA4B;QAC1C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACI,GAAG,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACI,GAAG,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACI,iBAAiB;QACtB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;CACF;AAED,YAAY;AACZ,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAE/C,2EAA2E;AAC3E,UAAU;AACV,2EAA2E;AAE3E,oBAAoB;AACpB,QAAQ,CAAC,QAAQ,CAAC;IAChB,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,UAAU;IACvB,QAAQ,EAAE;QACR,OAAO,EAAE,sCAAsC;QAC/C,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,CAAC;KACd;IACD,cAAc,EAAE,CAAC,MAAc,EAAE,EAAE;QACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,sCAAsC,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC;IACxD,iBAAiB,EAAE,kBAAkB;IACrC,cAAc,EAAE,IAAI;CACrB,CAAC,CAAC;AAEH,kFAAkF;AAClF,QAAQ,CAAC,QAAQ,CAAC;IAChB,IAAI,EAAE,KAAK;IACX,WAAW,EAAE,kBAAkB;IAC/B,QAAQ,EAAE;QACR,OAAO,EAAE,sCAAsC;QAC/C,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,CAAC;KACd;IACD,cAAc,EAAE,CAAC,MAAc,EAAE,EAAE;QACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,sCAAsC,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC;QAC/C,GAAG,MAAM;QACT,IAAI,EAAE,UAAU,CAAC,oCAAoC;KACtD,CAAC;IACF,iBAAiB,EAAE,kBAAkB;IACrC,cAAc,EAAE,IAAI;CACrB,CAAC,CAAC;AAEH,uBAAuB;AACvB,QAAQ,CAAC,QAAQ,CAAC;IAChB,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,aAAa;IAC1B,QAAQ,EAAE;QACR,OAAO,EAAE,+BAA+B;QACxC,SAAS,EAAE,4BAA4B;QACvC,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,CAAC;KACd;IACD,cAAc,EAAE,CAAC,MAAc,EAAE,EAAE;QACjC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,6CAA6C,CAAC;QACvD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC;IACzD,iBAAiB,EAAE,qBAAqB;IACxC,cAAc,EAAE,KAAK;CACtB,CAAC,CAAC;AAEH,sBAAsB;AACtB,QAAQ,CAAC,QAAQ,CAAC;IAChB,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,0BAA0B;IACvC,QAAQ,EAAE;QACR,OAAO,EAAE,wCAAwC;QACjD,SAAS,EAAE,kBAAkB;QAC7B,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,CAAC;KACd;IACD,cAAc,EAAE,CAAC,MAAc,EAAE,EAAE;QACjC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,4CAA4C,CAAC;QACtD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC;IACxD,iBAAiB,EAAE,qBAAqB;IACxC,cAAc,EAAE,KAAK;CACtB,CAAC,CAAC;AAEH,kBAAkB;AAClB,QAAQ,CAAC,QAAQ,CAAC;IAChB,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,QAAQ;IACrB,QAAQ,EAAE;QACR,OAAO,EAAE,2BAA2B;QACpC,SAAS,EAAE,QAAQ;QACnB,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,CAAC;KACd;IACD,cAAc,EAAE,CAAC,MAAc,EAAE,EAAE;QACjC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,wCAAwC,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC;IACpD,iBAAiB,EAAE,qBAAqB;IACxC,cAAc,EAAE,KAAK;CACtB,CAAC,CAAC;AAEH,2CAA2C;AAC3C,QAAQ,CAAC,QAAQ,CAAC;IAChB,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,kBAAkB;IAC/B,QAAQ,EAAE;QACR,OAAO,EAAE,2BAA2B;QACpC,SAAS,EAAE,4BAA4B;QACvC,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,CAAC;KACd;IACD,cAAc,EAAE,CAAC,MAAc,EAAE,EAAE;QACjC,oCAAoC;QACpC,qEAAqE;QACrE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,OAAO,4FAA4F,CAAC;QACtG,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC;IACpD,iBAAiB,EAAE,qBAAqB;IACxC,cAAc,EAAE,KAAK;CACtB,CAAC,CAAC;AAEH,+CAA+C;AAC/C,QAAQ,CAAC,QAAQ,CAAC;IAChB,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,eAAe;IAC5B,QAAQ,EAAE;QACR,OAAO,EAAE,yBAAyB;QAClC,SAAS,EAAE,sBAAsB;QACjC,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,CAAC;KACd;IACD,cAAc,EAAE,CAAC,MAAc,EAAE,EAAE;QACjC,+DAA+D;QAC/D,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACvB,OAAO,iDAAiD,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC;IACpD,iBAAiB,EAAE,qBAAqB;IACxC,cAAc,EAAE,KAAK;CACtB,CAAC,CAAC"}
|
package/dist/utils/errors.d.ts
CHANGED
|
@@ -44,6 +44,18 @@ export declare class ImageLoadError extends VisionMCPError {
|
|
|
44
44
|
}
|
|
45
45
|
export declare class ModelAPIError extends VisionMCPError {
|
|
46
46
|
constructor(message: string, details?: Record<string, any>, cause?: unknown);
|
|
47
|
+
/**
|
|
48
|
+
* 递归脱敏 details 中的 URL(移除 query 参数中的敏感信息如 API key)
|
|
49
|
+
* @param details - 原始 details 对象
|
|
50
|
+
* @returns 脱敏后的 details 对象
|
|
51
|
+
*/
|
|
52
|
+
private static sanitizeDetails;
|
|
53
|
+
/**
|
|
54
|
+
* 脱敏字符串中的 URL(移除 query 参数中的敏感信息)
|
|
55
|
+
* @param text - 可能包含 URL 的文本
|
|
56
|
+
* @returns 脱敏后的文本
|
|
57
|
+
*/
|
|
58
|
+
private static sanitizeUrlInString;
|
|
47
59
|
}
|
|
48
60
|
export declare class TimeoutError extends VisionMCPError {
|
|
49
61
|
constructor(message: string, details?: Record<string, any>, cause?: unknown);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,oBAAY,kBAAkB;IAC5B,aAAa,kBAAkB;IAC/B,kBAAkB,uBAAuB;IACzC,gBAAgB,qBAAqB;IACrC,eAAe,oBAAoB;IACnC,aAAa,kBAAkB;IAC/B,aAAa,kBAAkB;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,kBAAkB,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,cAAe,SAAQ,KAAK;IACvC,SAAgB,IAAI,EAAE,kBAAkB,CAAC;IACzC,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9C,SAAgB,SAAS,EAAE,IAAI,CAAC;gBAEpB,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,qBAAqB;IAiBpE,MAAM;;;;;;;;;;CAaP;AAED,qBAAa,iBAAkB,SAAQ,cAAc;gBACvC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO;CAS5E;AAED,qBAAa,gBAAiB,SAAQ,cAAc;gBACtC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO;CAS5E;AAED,qBAAa,cAAe,SAAQ,cAAc;gBACpC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO;CAS5E;AAED,qBAAa,aAAc,SAAQ,cAAc;gBACnC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,oBAAY,kBAAkB;IAC5B,aAAa,kBAAkB;IAC/B,kBAAkB,uBAAuB;IACzC,gBAAgB,qBAAqB;IACrC,eAAe,oBAAoB;IACnC,aAAa,kBAAkB;IAC/B,aAAa,kBAAkB;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,kBAAkB,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,cAAe,SAAQ,KAAK;IACvC,SAAgB,IAAI,EAAE,kBAAkB,CAAC;IACzC,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9C,SAAgB,SAAS,EAAE,IAAI,CAAC;gBAEpB,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,qBAAqB;IAiBpE,MAAM;;;;;;;;;;CAaP;AAED,qBAAa,iBAAkB,SAAQ,cAAc;gBACvC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO;CAS5E;AAED,qBAAa,gBAAiB,SAAQ,cAAc;gBACtC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO;CAS5E;AAED,qBAAa,cAAe,SAAQ,cAAc;gBACpC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO;CAS5E;AAED,qBAAa,aAAc,SAAQ,cAAc;gBACnC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO;IAU3E;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IA4B9B;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;CAWnC;AAED,qBAAa,YAAa,SAAQ,cAAc;gBAClC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,OAAO;CAS5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,CA+BjF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc;;;;;;EAUvD"}
|
package/dist/utils/errors.js
CHANGED
|
@@ -81,11 +81,54 @@ export class ModelAPIError extends VisionMCPError {
|
|
|
81
81
|
super({
|
|
82
82
|
message: `Model API error: ${message}`,
|
|
83
83
|
code: VisionMCPErrorCode.MODEL_API_ERROR,
|
|
84
|
-
details,
|
|
84
|
+
details: ModelAPIError.sanitizeDetails(details || {}),
|
|
85
85
|
cause
|
|
86
86
|
});
|
|
87
87
|
this.name = 'ModelAPIError';
|
|
88
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* 递归脱敏 details 中的 URL(移除 query 参数中的敏感信息如 API key)
|
|
91
|
+
* @param details - 原始 details 对象
|
|
92
|
+
* @returns 脱敏后的 details 对象
|
|
93
|
+
*/
|
|
94
|
+
static sanitizeDetails(details) {
|
|
95
|
+
const sanitized = {};
|
|
96
|
+
for (const key in details) {
|
|
97
|
+
const value = details[key];
|
|
98
|
+
if (typeof value === 'string') {
|
|
99
|
+
// 脱敏 URL 中的 query 参数(如 ?key=xxx)
|
|
100
|
+
sanitized[key] = ModelAPIError.sanitizeUrlInString(value);
|
|
101
|
+
}
|
|
102
|
+
else if (Array.isArray(value)) {
|
|
103
|
+
// 递归处理数组
|
|
104
|
+
sanitized[key] = value.map(item => typeof item === 'string' ? ModelAPIError.sanitizeUrlInString(item) :
|
|
105
|
+
typeof item === 'object' && item !== null ? ModelAPIError.sanitizeDetails(item) :
|
|
106
|
+
item);
|
|
107
|
+
}
|
|
108
|
+
else if (typeof value === 'object' && value !== null) {
|
|
109
|
+
// 递归处理嵌套对象
|
|
110
|
+
sanitized[key] = ModelAPIError.sanitizeDetails(value);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
// 保留其他类型不变(布尔值、数字等)
|
|
114
|
+
sanitized[key] = value;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return sanitized;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 脱敏字符串中的 URL(移除 query 参数中的敏感信息)
|
|
121
|
+
* @param text - 可能包含 URL 的文本
|
|
122
|
+
* @returns 脱敏后的文本
|
|
123
|
+
*/
|
|
124
|
+
static sanitizeUrlInString(text) {
|
|
125
|
+
// 匹配 URL 中的 ?key= 参数(匹配各种常见的 API key 参数名)
|
|
126
|
+
// 支持: ?key=, ?api_key=, ?apikey=, ?token=, ?access_token=
|
|
127
|
+
return text.replace(/[?&](?:key|api_key|apikey|token|access_token|api-key|apikey)=([^&\s]+)/gi, (match, param, offset, string) => {
|
|
128
|
+
const separator = match[0] === '?' ? '?' : '&';
|
|
129
|
+
return `${separator}${match.slice(1).split('=')[0]}=***`;
|
|
130
|
+
});
|
|
131
|
+
}
|
|
89
132
|
}
|
|
90
133
|
export class TimeoutError extends VisionMCPError {
|
|
91
134
|
constructor(message, details, cause) {
|
package/dist/utils/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAN,IAAY,kBAOX;AAPD,WAAY,kBAAkB;IAC5B,qDAA+B,CAAA;IAC/B,+DAAyC,CAAA;IACzC,2DAAqC,CAAA;IACrC,yDAAmC,CAAA;IACnC,qDAA+B,CAAA;IAC/B,qDAA+B,CAAA;AACjC,CAAC,EAPW,kBAAkB,KAAlB,kBAAkB,QAO7B;AASD,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvB,IAAI,CAAqB;IACzB,OAAO,CAAuB;IAC9B,SAAS,CAAO;IAEhC,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAyB;QAClE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAE5B,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;QAED,YAAY;QACZ,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,MAAM;QACJ,wBAAwB;QACxB,MAAM,EAAE,KAAK,EAAE,GAAG,mBAAmB,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QAE7D,OAAO;YACL,KAAK,EAAE;gBACL,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,mBAAmB;gBAC5B,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;aACxC;SACF,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,cAAc;IACnD,YAAY,OAAe,EAAE,OAA6B,EAAE,KAAe;QACzE,KAAK,CAAC;YACJ,OAAO,EAAE,kBAAkB,OAAO,EAAE;YACpC,IAAI,EAAE,kBAAkB,CAAC,aAAa;YACtC,OAAO;YACP,KAAK;SACN,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,cAAc;IAClD,YAAY,OAAe,EAAE,OAA6B,EAAE,KAAe;QACzE,KAAK,CAAC;YACJ,OAAO,EAAE,8BAA8B,OAAO,EAAE;YAChD,IAAI,EAAE,kBAAkB,CAAC,kBAAkB;YAC3C,OAAO;YACP,KAAK;SACN,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,cAAc;IAChD,YAAY,OAAe,EAAE,OAA6B,EAAE,KAAe;QACzE,KAAK,CAAC;YACJ,OAAO,EAAE,yBAAyB,OAAO,EAAE;YAC3C,IAAI,EAAE,kBAAkB,CAAC,gBAAgB;YACzC,OAAO;YACP,KAAK;SACN,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,cAAc;IAC/C,YAAY,OAAe,EAAE,OAA6B,EAAE,KAAe;QACzE,KAAK,CAAC;YACJ,OAAO,EAAE,oBAAoB,OAAO,EAAE;YACtC,IAAI,EAAE,kBAAkB,CAAC,eAAe;YACxC,OAAO;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Logger Utility
|
|
3
3
|
*
|
|
4
|
-
* @description 统一的日志工具,确保只使用
|
|
4
|
+
* @description 统一的日志工具,确保只使用 stderr 输出
|
|
5
5
|
* 符合 MCP 协议要求:stdout 用于 JSON-RPC 通信,日志使用 stderr
|
|
6
6
|
*/
|
|
7
7
|
export declare enum LogLevel {
|
|
@@ -23,6 +23,18 @@ export declare class Logger {
|
|
|
23
23
|
private static instance;
|
|
24
24
|
private logLevel;
|
|
25
25
|
private constructor();
|
|
26
|
+
/**
|
|
27
|
+
* 脱敏可能包含敏感信息的字符串(如 URL 中的 API key)
|
|
28
|
+
* @param text - 可能包含敏感信息的文本
|
|
29
|
+
* @returns 脱敏后的文本
|
|
30
|
+
*/
|
|
31
|
+
private sanitizeForLogging;
|
|
32
|
+
/**
|
|
33
|
+
* 递归脱敏对象中的所有字符串值
|
|
34
|
+
* @param obj - 要脱敏的对象
|
|
35
|
+
* @returns 脱敏后的对象
|
|
36
|
+
*/
|
|
37
|
+
private sanitizeObject;
|
|
26
38
|
static getInstance(): Logger;
|
|
27
39
|
/**
|
|
28
40
|
* 写入日志到 stderr
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,OAAO,QAAQ,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAW;IAE3B,OAAO;
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,OAAO,QAAQ,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAW;IAE3B,OAAO;IAkBP;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;;;OAIG;IACH,OAAO,CAAC,cAAc;WA0BR,WAAW,IAAI,MAAM;IAOnC;;;OAGG;IACH,OAAO,CAAC,KAAK;IAKb;;OAEG;IACI,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAW/D;;OAEG;IACI,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAW9D;;OAEG;IACI,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAW9D;;OAEG;IACI,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IA6BxF;;OAEG;IACI,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;QAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,GAAG,IAAI;CAUT;AAGD,eAAO,MAAM,MAAM,QAAuB,CAAC;AAE3C;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,sBAgC3F"}
|