@anyul/koishi-plugin-rss 5.2.3 → 5.2.4

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.
Files changed (70) hide show
  1. package/README.md +92 -37
  2. package/lib/commands/error-handler.js +13 -1
  3. package/lib/commands/index.d.ts +3 -0
  4. package/lib/commands/index.js +7 -1
  5. package/lib/commands/runtime.d.ts +17 -0
  6. package/lib/commands/runtime.js +27 -0
  7. package/lib/commands/subscription-create.d.ts +23 -0
  8. package/lib/commands/subscription-create.js +145 -0
  9. package/lib/commands/web-monitor.d.ts +15 -0
  10. package/lib/commands/web-monitor.js +222 -0
  11. package/lib/config.js +7 -1
  12. package/lib/constants.d.ts +1 -1
  13. package/lib/constants.js +46 -83
  14. package/lib/core/ai-cache.d.ts +27 -0
  15. package/lib/core/ai-cache.js +169 -0
  16. package/lib/core/ai-client.d.ts +12 -0
  17. package/lib/core/ai-client.js +65 -0
  18. package/lib/core/ai-selector.d.ts +2 -0
  19. package/lib/core/ai-selector.js +80 -0
  20. package/lib/core/ai-summary.d.ts +10 -0
  21. package/lib/core/ai-summary.js +73 -0
  22. package/lib/core/ai-utils.d.ts +10 -0
  23. package/lib/core/ai-utils.js +104 -0
  24. package/lib/core/ai.d.ts +3 -91
  25. package/lib/core/ai.js +13 -522
  26. package/lib/core/feeder-arg.d.ts +17 -0
  27. package/lib/core/feeder-arg.js +234 -0
  28. package/lib/core/feeder-runtime.d.ts +96 -0
  29. package/lib/core/feeder-runtime.js +233 -0
  30. package/lib/core/feeder.d.ts +3 -5
  31. package/lib/core/feeder.js +61 -358
  32. package/lib/core/item-processor-runtime.d.ts +46 -0
  33. package/lib/core/item-processor-runtime.js +215 -0
  34. package/lib/core/item-processor-template.d.ts +16 -0
  35. package/lib/core/item-processor-template.js +158 -0
  36. package/lib/core/item-processor.d.ts +1 -15
  37. package/lib/core/item-processor.js +44 -319
  38. package/lib/core/notification-queue-retry.d.ts +25 -0
  39. package/lib/core/notification-queue-retry.js +78 -0
  40. package/lib/core/notification-queue-sender.d.ts +20 -0
  41. package/lib/core/notification-queue-sender.js +118 -0
  42. package/lib/core/notification-queue-store.d.ts +19 -0
  43. package/lib/core/notification-queue-store.js +137 -0
  44. package/lib/core/notification-queue-types.d.ts +49 -0
  45. package/lib/core/notification-queue-types.js +2 -0
  46. package/lib/core/notification-queue.d.ts +11 -72
  47. package/lib/core/notification-queue.js +81 -258
  48. package/lib/core/search-format.d.ts +3 -0
  49. package/lib/core/search-format.js +36 -0
  50. package/lib/core/search-providers.d.ts +13 -0
  51. package/lib/core/search-providers.js +175 -0
  52. package/lib/core/search-rotation.d.ts +4 -0
  53. package/lib/core/search-rotation.js +55 -0
  54. package/lib/core/search-service.d.ts +3 -0
  55. package/lib/core/search-service.js +100 -0
  56. package/lib/core/search-types.d.ts +39 -0
  57. package/lib/core/search-types.js +2 -0
  58. package/lib/core/search.d.ts +4 -101
  59. package/lib/core/search.js +10 -508
  60. package/lib/index.js +27 -381
  61. package/lib/tsconfig.tsbuildinfo +1 -1
  62. package/lib/types.d.ts +27 -6
  63. package/lib/utils/legacy-config.d.ts +12 -0
  64. package/lib/utils/legacy-config.js +56 -0
  65. package/lib/utils/logger.js +50 -29
  66. package/lib/utils/proxy.d.ts +3 -0
  67. package/lib/utils/proxy.js +14 -0
  68. package/lib/utils/structured-logger.d.ts +7 -3
  69. package/lib/utils/structured-logger.js +26 -19
  70. package/package.json +1 -1
@@ -1,510 +1,12 @@
1
1
  "use strict";
2
- /**
3
- * 联网搜索模块
4
- *
5
- * 支持多种搜索引擎:
6
- * - Tavily: 专业的 AI 搜索引擎
7
- * - Searxng: 开源隐私友好的元搜索引擎
8
- * - Volcengine: 火山引擎联网搜索(支持模型轮询)
9
- *
10
- * @module core/search
11
- */
12
- var __importDefault = (this && this.__importDefault) || function (mod) {
13
- return (mod && mod.__esModule) ? mod : { "default": mod };
14
- };
15
2
  Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.searchWithTavily = searchWithTavily;
17
- exports.searchWithSearxng = searchWithSearxng;
18
- exports.searchWithVolcengine = searchWithVolcengine;
19
- exports.webSearch = webSearch;
20
- exports.formatSearchResults = formatSearchResults;
21
- exports.buildPromptWithSearchContext = buildPromptWithSearchContext;
22
- const axios_1 = __importDefault(require("axios"));
23
- const https_proxy_agent_1 = require("https-proxy-agent");
24
- const logger_1 = require("../utils/logger");
25
- // 全局模型轮询状态
26
- const modelRotationStates = new Map();
27
- /**
28
- * 获取或初始化模型轮询状态
29
- */
30
- function getModelRotationState(key, models) {
31
- if (!modelRotationStates.has(key)) {
32
- modelRotationStates.set(key, {
33
- currentIndex: 0,
34
- models,
35
- lastFailureTime: 0,
36
- failureCount: 0
37
- });
38
- }
39
- return modelRotationStates.get(key);
40
- }
41
- /**
42
- * 获取下一个可用模型(轮询)
43
- */
44
- function getNextModel(config, searchConfig) {
45
- // 如果配置了模型列表,使用轮询
46
- if (searchConfig.volcengine?.models && searchConfig.volcengine.models.length > 0) {
47
- const state = getModelRotationState('volcengine', searchConfig.volcengine.models);
48
- // 如果上次失败时间在 1 分钟内,跳到下一个模型
49
- const now = Date.now();
50
- if (state.lastFailureTime > 0 && now - state.lastFailureTime < 60000) {
51
- state.currentIndex = (state.currentIndex + 1) % state.models.length;
52
- (0, logger_1.debug)(config, `模型轮询: 上次失败,切换到模型 ${state.models[state.currentIndex]}`, 'Search-Volcengine', 'info');
53
- }
54
- const model = state.models[state.currentIndex];
55
- state.lastFailureTime = 0; // 重置失败时间
56
- return model;
57
- }
58
- // 否则使用 AI 配置中的模型
59
- if (searchConfig.volcengine?.useAiModel !== false && config.ai.model) {
60
- return config.ai.model;
61
- }
62
- // 默认模型列表(轮询)
63
- const defaultModels = [
64
- 'doubao-seed-1-6-lite-251015',
65
- 'doubao-seed-1-6-flash-250828'
66
- ];
67
- const state = getModelRotationState('volcengine-default', defaultModels);
68
- const model = defaultModels[state.currentIndex];
69
- // 轮询到下一个模型
70
- state.currentIndex = (state.currentIndex + 1) % defaultModels.length;
71
- return model;
72
- }
73
- /**
74
- * 标记模型失败(触发切换到下一个模型)
75
- */
76
- function markModelFailure(config, searchConfig, model) {
77
- const key = searchConfig.volcengine?.models ? 'volcengine' : 'volcengine-default';
78
- const state = modelRotationStates.get(key);
79
- if (state) {
80
- state.lastFailureTime = Date.now();
81
- state.failureCount++;
82
- state.currentIndex = (state.currentIndex + 1) % state.models.length;
83
- (0, logger_1.debug)(config, `模型 ${model} 失败,切换到下一个模型 ${state.models[state.currentIndex]} (失败次数: ${state.failureCount})`, 'Search-Volcengine', 'info');
84
- }
85
- }
86
- /**
87
- * 构建代理配置
88
- */
89
- function buildProxyConfig(config) {
90
- const requestConfig = {};
91
- if (config.net.proxyAgent?.enabled) {
92
- const proxyUrl = `${config.net.proxyAgent.protocol}://${config.net.proxyAgent.host}:${config.net.proxyAgent.port}`;
93
- requestConfig.httpsAgent = new https_proxy_agent_1.HttpsProxyAgent(proxyUrl);
94
- requestConfig.proxy = false;
95
- }
96
- return requestConfig;
97
- }
98
- /**
99
- * Tavily 搜索引擎
100
- *
101
- * @param config - 插件配置
102
- * @param query - 搜索查询
103
- * @param apiKey - Tavily API Key
104
- * @returns 搜索结果
105
- */
106
- async function searchWithTavily(config, query, apiKey, options) {
107
- try {
108
- (0, logger_1.debug)(config, `使用 Tavily 搜索: ${query}`, 'Search-Tavily', 'info');
109
- const requestConfig = {
110
- headers: {
111
- 'Authorization': `Bearer ${apiKey}`,
112
- 'Content-Type': 'application/json'
113
- },
114
- timeout: config.ai.timeout || 30000,
115
- ...buildProxyConfig(config)
116
- };
117
- const requestBody = {
118
- query,
119
- max_results: options?.maxResults || 5,
120
- search_depth: options?.searchDepth || 'basic',
121
- include_answer: options?.includeAnswer !== false,
122
- include_raw_content: false
123
- };
124
- const response = await axios_1.default.post('https://api.tavily.com/search', requestBody, requestConfig);
125
- const results = response.data.results.map(item => ({
126
- title: item.title,
127
- url: item.url,
128
- content: item.content,
129
- snippet: item.content.substring(0, 200) + '...',
130
- score: item.score,
131
- publishedDate: item.published_date,
132
- source: 'tavily'
133
- }));
134
- (0, logger_1.debug)(config, `Tavily 搜索成功,找到 ${results.length} 条结果`, 'Search-Tavily', 'details');
135
- return {
136
- success: true,
137
- results,
138
- query,
139
- engine: 'tavily'
140
- };
141
- }
142
- catch (error) {
143
- const errorMsg = `Tavily 搜索失败: ${error.message}`;
144
- (0, logger_1.debug)(config, errorMsg, 'Search-Tavily', 'error');
145
- return {
146
- success: false,
147
- results: [],
148
- query,
149
- engine: 'tavily',
150
- error: errorMsg
151
- };
152
- }
153
- }
154
- /**
155
- * SearXNG 搜索引擎
156
- *
157
- * @param config - 插件配置
158
- * @param query - 搜索查询
159
- * @param instanceUrl - SearXNG 实例 URL
160
- * @returns 搜索结果
161
- */
162
- async function searchWithSearxng(config, query, instanceUrl, options) {
163
- try {
164
- (0, logger_1.debug)(config, `使用 SearXNG 搜索: ${query}`, 'Search-SearXNG', 'info');
165
- const baseUrl = instanceUrl.replace(/\/+$/, '');
166
- const requestConfig = {
167
- timeout: config.ai.timeout || 30000,
168
- ...buildProxyConfig(config)
169
- };
170
- const params = {
171
- q: query,
172
- format: 'json',
173
- language: options?.language || 'all',
174
- categories: options?.categories?.join(',') || 'general'
175
- };
176
- const response = await axios_1.default.get(`${baseUrl}/search`, {
177
- ...requestConfig,
178
- params
179
- });
180
- const maxResults = options?.maxResults || 5;
181
- const results = response.data.results
182
- .slice(0, maxResults)
183
- .map(item => ({
184
- title: item.title,
185
- url: item.url,
186
- content: item.content,
187
- snippet: item.snippet || item.content.substring(0, 200) + '...',
188
- score: item.score,
189
- source: `searxng-${item.engine || 'unknown'}`
190
- }));
191
- (0, logger_1.debug)(config, `SearXNG 搜索成功,找到 ${results.length} 条结果`, 'Search-SearXNG', 'details');
192
- return {
193
- success: true,
194
- results,
195
- query,
196
- engine: 'searxng'
197
- };
198
- }
199
- catch (error) {
200
- const errorMsg = `SearXNG 搜索失败: ${error.message}`;
201
- (0, logger_1.debug)(config, errorMsg, 'Search-SearXNG', 'error');
202
- return {
203
- success: false,
204
- results: [],
205
- query,
206
- engine: 'searxng',
207
- error: errorMsg
208
- };
209
- }
210
- }
211
- /**
212
- * 火山引擎联网搜索(支持模型轮询)
213
- *
214
- * @param config - 插件配置
215
- * @param query - 搜索查询
216
- * @param baseUrl - API Base URL
217
- * @param apiKey - API Key
218
- * @param model - 模型名称(可选,如果不指定则使用轮询)
219
- * @param searchConfig - 搜索配置(用于模型轮询)
220
- * @returns 搜索结果
221
- */
222
- async function searchWithVolcengine(config, query, baseUrl, apiKey, model, searchConfig) {
223
- // 获取要使用的模型
224
- const actualModel = model || getNextModel(config, searchConfig || {});
225
- try {
226
- (0, logger_1.debug)(config, `使用火山引擎搜索: ${query} (模型: ${actualModel})`, 'Search-Volcengine', 'info');
227
- const requestConfig = {
228
- headers: {
229
- 'Authorization': `Bearer ${apiKey}`,
230
- 'Content-Type': 'application/json'
231
- },
232
- timeout: config.ai.timeout || 30000,
233
- ...buildProxyConfig(config)
234
- };
235
- // 使用 Responses API 调用联网搜索工具
236
- const response = await axios_1.default.post(`${baseUrl.replace(/\/+$/, '')}/responses`, {
237
- model: actualModel, // 使用轮询获取的模型
238
- input: [
239
- {
240
- role: 'user',
241
- content: query
242
- }
243
- ],
244
- tools: [
245
- {
246
- type: 'web_search'
247
- }
248
- ]
249
- }, requestConfig);
250
- // 从响应中提取搜索结果
251
- let searchResults = [];
252
- // 火山引擎的搜索结果嵌入在 AI 响应的 annotations 中
253
- if (response.data?.output && Array.isArray(response.data.output)) {
254
- for (const outputItem of response.data.output) {
255
- if (outputItem.type === 'message' &&
256
- outputItem.role === 'assistant' &&
257
- outputItem.content &&
258
- Array.isArray(outputItem.content)) {
259
- for (const contentItem of outputItem.content) {
260
- if (contentItem.type === 'output_text' &&
261
- contentItem.annotations &&
262
- Array.isArray(contentItem.annotations)) {
263
- // 从 annotations 中提取 url_citation 类型的引用
264
- for (const annotation of contentItem.annotations) {
265
- if (annotation.type === 'url_citation') {
266
- searchResults.push({
267
- title: annotation.title || '',
268
- url: annotation.url || '',
269
- content: annotation.summary || '',
270
- snippet: (annotation.summary || '')?.substring(0, 200) + '...',
271
- source: annotation.site_name || 'volcengine',
272
- publishedDate: annotation.publish_time || undefined
273
- });
274
- }
275
- }
276
- }
277
- }
278
- }
279
- }
280
- }
281
- (0, logger_1.debug)(config, `火山引擎搜索成功,找到 ${searchResults.length} 条结果 (模型: ${actualModel})`, 'Search-Volcengine', 'details');
282
- return {
283
- success: true,
284
- results: searchResults,
285
- query,
286
- engine: 'volcengine',
287
- model: actualModel // 返回使用的模型
288
- };
289
- }
290
- catch (error) {
291
- const errorMsg = `火山引擎搜索失败: ${error.message}`;
292
- (0, logger_1.debug)(config, errorMsg, 'Search-Volcengine', 'error');
293
- // 标记模型失败,触发轮询切换
294
- if (searchConfig) {
295
- markModelFailure(config, searchConfig, actualModel);
296
- }
297
- return {
298
- success: false,
299
- results: [],
300
- query,
301
- engine: 'volcengine',
302
- model: actualModel,
303
- error: errorMsg
304
- };
305
- }
306
- }
307
- /**
308
- * 统一搜索接口
309
- *
310
- * 根据配置自动选择搜索引擎并执行搜索
311
- * - 如果 engine 为 'auto',则根据配置的 API Keys 按优先级自动选择
312
- * - 支持多引擎配置时智能选择
313
- *
314
- * @param config - 插件配置
315
- * @param query - 搜索查询
316
- * @param searchConfig - 搜索配置
317
- * @returns 搜索结果
318
- */
319
- async function webSearch(config, query, searchConfig) {
320
- // 检查是否启用搜索
321
- if (!searchConfig.enabled) {
322
- return {
323
- success: false,
324
- results: [],
325
- query,
326
- engine: 'none',
327
- error: '联网搜索未启用'
328
- };
329
- }
330
- // 如果 engine 为 auto,则自动选择可用的引擎
331
- if (searchConfig.engine === 'auto') {
332
- return autoSelectEngineAndSearch(config, query, searchConfig);
333
- }
334
- // 根据选择的搜索引擎执行搜索
335
- switch (searchConfig.engine) {
336
- case 'tavily':
337
- if (!searchConfig.tavily?.apiKey) {
338
- return {
339
- success: false,
340
- results: [],
341
- query,
342
- engine: 'tavily',
343
- error: 'Tavily API Key 未配置'
344
- };
345
- }
346
- return searchWithTavily(config, query, searchConfig.tavily.apiKey, {
347
- maxResults: searchConfig.maxResults || 5,
348
- searchDepth: searchConfig.tavily.searchDepth || 'basic',
349
- includeAnswer: searchConfig.tavily.includeAnswer !== false
350
- });
351
- case 'searxng':
352
- if (!searchConfig.searxng?.instanceUrl) {
353
- return {
354
- success: false,
355
- results: [],
356
- query,
357
- engine: 'searxng',
358
- error: 'SearXNG 实例 URL 未配置'
359
- };
360
- }
361
- return searchWithSearxng(config, query, searchConfig.searxng.instanceUrl, {
362
- maxResults: searchConfig.maxResults || 5,
363
- language: searchConfig.searxng.language || 'all',
364
- categories: searchConfig.searxng.categories || ['general']
365
- });
366
- case 'volcengine':
367
- if (!searchConfig.volcengine?.apiKey) {
368
- return {
369
- success: false,
370
- results: [],
371
- query,
372
- engine: 'volcengine',
373
- error: '火山引擎 API Key 未配置'
374
- };
375
- }
376
- return searchWithVolcengine(config, query, config.ai.baseUrl || 'https://ark.cn-beijing.volces.com/api/v3', searchConfig.volcengine.apiKey, undefined, // 不指定模型,使用轮询
377
- searchConfig // 传递 searchConfig 用于模型轮询
378
- );
379
- default:
380
- return {
381
- success: false,
382
- results: [],
383
- query,
384
- engine: 'unknown',
385
- error: `未知的搜索引擎: ${searchConfig.engine}`
386
- };
387
- }
388
- }
389
- /**
390
- * 自动选择搜索引擎并执行搜索
391
- *
392
- * @param config - 插件配置
393
- * @param query - 搜索查询
394
- * @param searchConfig - 搜索配置
395
- * @returns 搜索结果
396
- */
397
- async function autoSelectEngineAndSearch(config, query, searchConfig) {
398
- // 确定可用引擎的优先级
399
- let enginePriority = searchConfig.enginePriority || ['tavily', 'volcengine', 'searxng'];
400
- // 根据配置过滤出可用的引擎
401
- const availableEngines = enginePriority.filter(engine => {
402
- switch (engine) {
403
- case 'tavily':
404
- return !!searchConfig.tavily?.apiKey;
405
- case 'searxng':
406
- return !!searchConfig.searxng?.instanceUrl;
407
- case 'volcengine':
408
- return !!searchConfig.volcengine?.apiKey;
409
- default:
410
- return false;
411
- }
412
- });
413
- if (availableEngines.length === 0) {
414
- return {
415
- success: false,
416
- results: [],
417
- query,
418
- engine: 'auto',
419
- error: '没有配置任何可用的搜索引擎'
420
- };
421
- }
422
- (0, logger_1.debug)(config, `自动选择搜索引擎,可用引擎: ${availableEngines.join(', ')}`, 'Search-Auto', 'info');
423
- // 按优先级尝试每个引擎
424
- for (const engine of availableEngines) {
425
- (0, logger_1.debug)(config, `尝试使用搜索引擎: ${engine}`, 'Search-Auto', 'info');
426
- let result;
427
- switch (engine) {
428
- case 'tavily':
429
- result = await searchWithTavily(config, query, searchConfig.tavily.apiKey, {
430
- maxResults: searchConfig.maxResults || 5,
431
- searchDepth: searchConfig.tavily?.searchDepth || 'basic',
432
- includeAnswer: searchConfig.tavily?.includeAnswer !== false
433
- });
434
- break;
435
- case 'searxng':
436
- result = await searchWithSearxng(config, query, searchConfig.searxng.instanceUrl, {
437
- maxResults: searchConfig.maxResults || 5,
438
- language: searchConfig.searxng?.language || 'all',
439
- categories: searchConfig.searxng?.categories || ['general']
440
- });
441
- break;
442
- case 'volcengine':
443
- result = await searchWithVolcengine(config, query, config.ai.baseUrl || 'https://ark.cn-beijing.volces.com/api/v3', searchConfig.volcengine.apiKey, undefined, searchConfig);
444
- break;
445
- default:
446
- continue;
447
- }
448
- // 如果成功,返回结果
449
- if (result.success && result.results.length > 0) {
450
- (0, logger_1.debug)(config, `搜索引擎 ${engine} 成功返回 ${result.results.length} 条结果`, 'Search-Auto', 'info');
451
- return result;
452
- }
453
- // 如果失败,记录日志并尝试下一个引擎
454
- (0, logger_1.debug)(config, `搜索引擎 ${engine} 失败: ${result.error || '无结果'},尝试下一个引擎`, 'Search-Auto', 'info');
455
- }
456
- // 所有引擎都失败了
457
- return {
458
- success: false,
459
- results: [],
460
- query,
461
- engine: 'auto',
462
- error: '所有搜索引擎都失败了'
463
- };
464
- }
465
- /**
466
- * 将搜索结果格式化为 AI 可读的文本
467
- *
468
- * @param response - 搜索响应
469
- * @returns 格式化的文本
470
- */
471
- function formatSearchResults(response) {
472
- if (!response.success || response.results.length === 0) {
473
- return '';
474
- }
475
- const lines = [];
476
- lines.push(`\n联网搜索结果 (${response.engine}):\n`);
477
- response.results.forEach((result, index) => {
478
- lines.push(`${index + 1}. ${result.title}`);
479
- lines.push(` 链接: ${result.url}`);
480
- if (result.snippet) {
481
- lines.push(` 摘要: ${result.snippet}`);
482
- }
483
- if (result.publishedDate) {
484
- lines.push(` 发布时间: ${result.publishedDate}`);
485
- }
486
- lines.push('');
487
- });
488
- return lines.join('\n');
489
- }
490
- /**
491
- * 构建带搜索上下文的 AI Prompt
492
- *
493
- * @param originalPrompt - 原始提示词
494
- * @param searchResults - 搜索结果
495
- * @param searchQuery - 搜索查询
496
- * @returns 增强后的提示词
497
- */
498
- function buildPromptWithSearchContext(originalPrompt, searchResults, searchQuery) {
499
- if (!searchResults.success || searchResults.results.length === 0) {
500
- return originalPrompt;
501
- }
502
- const formattedResults = formatSearchResults(searchResults);
503
- return `${originalPrompt}
504
-
505
- ${formattedResults}
506
-
507
- 【搜索结果使用原则】:
508
- 1. 若 RSS 原始内容残缺,请使用以上搜索结果进行补全。
509
- 2. 搜索结果仅作为背景参考,若搜索结果中的人物、时间、事件与 RSS 原文冲突,**必须以 RSS 原文为准**!请提取并生成一份事实准确、语言简洁流畅的摘要。`;
510
- }
3
+ exports.webSearch = exports.searchWithVolcengine = exports.searchWithTavily = exports.searchWithSearxng = exports.formatSearchResults = exports.buildPromptWithSearchContext = void 0;
4
+ var search_format_1 = require("./search-format");
5
+ Object.defineProperty(exports, "buildPromptWithSearchContext", { enumerable: true, get: function () { return search_format_1.buildPromptWithSearchContext; } });
6
+ Object.defineProperty(exports, "formatSearchResults", { enumerable: true, get: function () { return search_format_1.formatSearchResults; } });
7
+ var search_providers_1 = require("./search-providers");
8
+ Object.defineProperty(exports, "searchWithSearxng", { enumerable: true, get: function () { return search_providers_1.searchWithSearxng; } });
9
+ Object.defineProperty(exports, "searchWithTavily", { enumerable: true, get: function () { return search_providers_1.searchWithTavily; } });
10
+ Object.defineProperty(exports, "searchWithVolcengine", { enumerable: true, get: function () { return search_providers_1.searchWithVolcengine; } });
11
+ var search_service_1 = require("./search-service");
12
+ Object.defineProperty(exports, "webSearch", { enumerable: true, get: function () { return search_service_1.webSearch; } });