@framers/agentos-ext-web-search 1.1.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/.eslintrc.json +21 -0
- package/CHANGELOG.md +16 -0
- package/LICENSE +21 -0
- package/README.md +218 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +100 -0
- package/dist/index.js.map +1 -0
- package/dist/services/searchProvider.d.ts +160 -0
- package/dist/services/searchProvider.d.ts.map +1 -0
- package/dist/services/searchProvider.js +342 -0
- package/dist/services/searchProvider.js.map +1 -0
- package/dist/tools/factCheck.d.ts +99 -0
- package/dist/tools/factCheck.d.ts.map +1 -0
- package/dist/tools/factCheck.js +287 -0
- package/dist/tools/factCheck.js.map +1 -0
- package/dist/tools/researchAggregator.d.ts +101 -0
- package/dist/tools/researchAggregator.d.ts.map +1 -0
- package/dist/tools/researchAggregator.js +275 -0
- package/dist/tools/researchAggregator.js.map +1 -0
- package/dist/tools/webSearch.d.ts +66 -0
- package/dist/tools/webSearch.d.ts.map +1 -0
- package/dist/tools/webSearch.js +122 -0
- package/dist/tools/webSearch.js.map +1 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/manifest.json +65 -0
- package/package.json +73 -0
- package/src/index.ts +123 -0
- package/src/services/searchProvider.ts +416 -0
- package/src/tools/factCheck.ts +318 -0
- package/src/tools/researchAggregator.ts +297 -0
- package/src/tools/webSearch.ts +128 -0
- package/src/types.ts +41 -0
- package/test/integration.spec.ts +173 -0
- package/test/searchProvider.spec.ts +153 -0
- package/test/webSearch.spec.ts +128 -0
- package/tsconfig.json +21 -0
- package/vitest.config.ts +32 -0
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SearchProviderService = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Service for managing multiple search providers with fallback support
|
|
6
|
+
*
|
|
7
|
+
* @class SearchProviderService
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const service = new SearchProviderService({
|
|
12
|
+
* serperApiKey: 'your-key',
|
|
13
|
+
* rateLimit: { maxRequests: 10, windowMs: 60000 }
|
|
14
|
+
* });
|
|
15
|
+
*
|
|
16
|
+
* const results = await service.search('query');
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
class SearchProviderService {
|
|
20
|
+
config;
|
|
21
|
+
rateLimitState;
|
|
22
|
+
/**
|
|
23
|
+
* Creates an instance of SearchProviderService
|
|
24
|
+
*
|
|
25
|
+
* @param {SearchProviderConfig} config - Configuration for the service
|
|
26
|
+
*/
|
|
27
|
+
constructor(config) {
|
|
28
|
+
this.config = {
|
|
29
|
+
maxRetries: 3,
|
|
30
|
+
rateLimit: {
|
|
31
|
+
maxRequests: 10,
|
|
32
|
+
windowMs: 60000
|
|
33
|
+
},
|
|
34
|
+
...config
|
|
35
|
+
};
|
|
36
|
+
this.rateLimitState = new Map();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Performs a search across available providers with automatic fallback
|
|
40
|
+
*
|
|
41
|
+
* @param {string} query - The search query
|
|
42
|
+
* @param {Object} options - Search options
|
|
43
|
+
* @param {number} [options.maxResults=10] - Maximum results to return
|
|
44
|
+
* @param {string} [options.provider] - Specific provider to use
|
|
45
|
+
* @returns {Promise<ProviderResponse>} Search results with metadata
|
|
46
|
+
*
|
|
47
|
+
* @throws {Error} If all providers fail and no fallback is available
|
|
48
|
+
*/
|
|
49
|
+
async search(query, options = {}) {
|
|
50
|
+
const startTime = Date.now();
|
|
51
|
+
const maxResults = options.maxResults || 10;
|
|
52
|
+
// If specific provider requested, try only that one
|
|
53
|
+
if (options.provider) {
|
|
54
|
+
return this.searchWithProvider(query, options.provider, maxResults, startTime);
|
|
55
|
+
}
|
|
56
|
+
// Try providers in order of preference
|
|
57
|
+
const providers = this.getAvailableProviders();
|
|
58
|
+
for (const provider of providers) {
|
|
59
|
+
try {
|
|
60
|
+
if (await this.checkRateLimit(provider)) {
|
|
61
|
+
return await this.searchWithProvider(query, provider, maxResults, startTime);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
console.warn(`Provider ${provider} failed:`, error);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Final fallback to DuckDuckGo (no API key required)
|
|
70
|
+
return this.searchDuckDuckGo(query, maxResults, startTime);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Searches using a specific provider
|
|
74
|
+
*
|
|
75
|
+
* @private
|
|
76
|
+
* @param {string} query - Search query
|
|
77
|
+
* @param {string} provider - Provider name
|
|
78
|
+
* @param {number} maxResults - Maximum results
|
|
79
|
+
* @param {number} startTime - Request start timestamp
|
|
80
|
+
* @returns {Promise<ProviderResponse>} Search results
|
|
81
|
+
*/
|
|
82
|
+
async searchWithProvider(query, provider, maxResults, startTime) {
|
|
83
|
+
let results;
|
|
84
|
+
switch (provider) {
|
|
85
|
+
case 'serper':
|
|
86
|
+
results = await this.searchSerper(query, maxResults);
|
|
87
|
+
break;
|
|
88
|
+
case 'serpapi':
|
|
89
|
+
results = await this.searchSerpApi(query, maxResults);
|
|
90
|
+
break;
|
|
91
|
+
case 'brave':
|
|
92
|
+
results = await this.searchBrave(query, maxResults);
|
|
93
|
+
break;
|
|
94
|
+
case 'duckduckgo':
|
|
95
|
+
default:
|
|
96
|
+
results = await this.searchDuckDuckGoAPI(query, maxResults);
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
provider,
|
|
101
|
+
results: results.slice(0, maxResults),
|
|
102
|
+
metadata: {
|
|
103
|
+
query,
|
|
104
|
+
timestamp: new Date().toISOString(),
|
|
105
|
+
responseTime: Date.now() - startTime
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Gets list of available providers based on configured API keys
|
|
111
|
+
*
|
|
112
|
+
* @private
|
|
113
|
+
* @returns {string[]} Array of available provider names
|
|
114
|
+
*/
|
|
115
|
+
getAvailableProviders() {
|
|
116
|
+
const providers = [];
|
|
117
|
+
if (this.config.serperApiKey)
|
|
118
|
+
providers.push('serper');
|
|
119
|
+
if (this.config.serpApiKey)
|
|
120
|
+
providers.push('serpapi');
|
|
121
|
+
if (this.config.braveApiKey)
|
|
122
|
+
providers.push('brave');
|
|
123
|
+
return providers;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Checks if a provider is within rate limits
|
|
127
|
+
*
|
|
128
|
+
* @private
|
|
129
|
+
* @param {string} provider - Provider name
|
|
130
|
+
* @returns {Promise<boolean>} True if within limits
|
|
131
|
+
*/
|
|
132
|
+
async checkRateLimit(provider) {
|
|
133
|
+
const now = Date.now();
|
|
134
|
+
const state = this.rateLimitState.get(provider);
|
|
135
|
+
if (!state || now > state.resetTime) {
|
|
136
|
+
this.rateLimitState.set(provider, {
|
|
137
|
+
count: 1,
|
|
138
|
+
resetTime: now + this.config.rateLimit.windowMs
|
|
139
|
+
});
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
if (state.count >= this.config.rateLimit.maxRequests) {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
state.count++;
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Search using Serper.dev API
|
|
150
|
+
*
|
|
151
|
+
* @private
|
|
152
|
+
* @param {string} query - Search query
|
|
153
|
+
* @param {number} maxResults - Maximum results
|
|
154
|
+
* @returns {Promise<SearchResult[]>} Search results
|
|
155
|
+
*/
|
|
156
|
+
async searchSerper(query, maxResults) {
|
|
157
|
+
const response = await fetch('https://google.serper.dev/search', {
|
|
158
|
+
method: 'POST',
|
|
159
|
+
headers: {
|
|
160
|
+
'X-API-KEY': this.config.serperApiKey,
|
|
161
|
+
'Content-Type': 'application/json'
|
|
162
|
+
},
|
|
163
|
+
body: JSON.stringify({ q: query, num: maxResults })
|
|
164
|
+
});
|
|
165
|
+
if (!response.ok)
|
|
166
|
+
throw new Error(`Serper API error: ${response.statusText}`);
|
|
167
|
+
const data = await response.json();
|
|
168
|
+
return (data.organic || []).map((item) => ({
|
|
169
|
+
title: item.title,
|
|
170
|
+
url: item.link,
|
|
171
|
+
snippet: item.snippet,
|
|
172
|
+
position: item.position
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Search using SerpAPI
|
|
177
|
+
*
|
|
178
|
+
* @private
|
|
179
|
+
* @param {string} query - Search query
|
|
180
|
+
* @param {number} maxResults - Maximum results
|
|
181
|
+
* @returns {Promise<SearchResult[]>} Search results
|
|
182
|
+
*/
|
|
183
|
+
async searchSerpApi(query, maxResults) {
|
|
184
|
+
const params = new URLSearchParams({
|
|
185
|
+
q: query,
|
|
186
|
+
api_key: this.config.serpApiKey,
|
|
187
|
+
num: maxResults.toString()
|
|
188
|
+
});
|
|
189
|
+
const response = await fetch(`https://serpapi.com/search?${params}`);
|
|
190
|
+
if (!response.ok)
|
|
191
|
+
throw new Error(`SerpAPI error: ${response.statusText}`);
|
|
192
|
+
const data = await response.json();
|
|
193
|
+
return (data.organic_results || []).map((item) => ({
|
|
194
|
+
title: item.title,
|
|
195
|
+
url: item.link,
|
|
196
|
+
snippet: item.snippet,
|
|
197
|
+
position: item.position
|
|
198
|
+
}));
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Search using Brave Search API
|
|
202
|
+
*
|
|
203
|
+
* @private
|
|
204
|
+
* @param {string} query - Search query
|
|
205
|
+
* @param {number} maxResults - Maximum results
|
|
206
|
+
* @returns {Promise<SearchResult[]>} Search results
|
|
207
|
+
*/
|
|
208
|
+
async searchBrave(query, maxResults) {
|
|
209
|
+
const params = new URLSearchParams({
|
|
210
|
+
q: query,
|
|
211
|
+
count: maxResults.toString()
|
|
212
|
+
});
|
|
213
|
+
const response = await fetch(`https://api.search.brave.com/res/v1/web/search?${params}`, {
|
|
214
|
+
headers: {
|
|
215
|
+
'X-Subscription-Token': this.config.braveApiKey
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
if (!response.ok)
|
|
219
|
+
throw new Error(`Brave API error: ${response.statusText}`);
|
|
220
|
+
const data = await response.json();
|
|
221
|
+
return (data.web?.results || []).map((item, index) => ({
|
|
222
|
+
title: item.title,
|
|
223
|
+
url: item.url,
|
|
224
|
+
snippet: item.description,
|
|
225
|
+
position: index + 1
|
|
226
|
+
}));
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Search using DuckDuckGo (HTML scraping fallback)
|
|
230
|
+
*
|
|
231
|
+
* @private
|
|
232
|
+
* @param {string} query - Search query
|
|
233
|
+
* @param {number} maxResults - Maximum results
|
|
234
|
+
* @param {number} startTime - Request start timestamp
|
|
235
|
+
* @returns {Promise<ProviderResponse>} Search results
|
|
236
|
+
*/
|
|
237
|
+
async searchDuckDuckGo(query, maxResults, startTime) {
|
|
238
|
+
try {
|
|
239
|
+
const results = await this.searchDuckDuckGoAPI(query, maxResults);
|
|
240
|
+
return {
|
|
241
|
+
provider: 'duckduckgo',
|
|
242
|
+
results,
|
|
243
|
+
metadata: {
|
|
244
|
+
query,
|
|
245
|
+
timestamp: new Date().toISOString(),
|
|
246
|
+
responseTime: Date.now() - startTime,
|
|
247
|
+
fallback: true
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
// Return empty results rather than throwing
|
|
253
|
+
return {
|
|
254
|
+
provider: 'duckduckgo',
|
|
255
|
+
results: [],
|
|
256
|
+
metadata: {
|
|
257
|
+
query,
|
|
258
|
+
timestamp: new Date().toISOString(),
|
|
259
|
+
responseTime: Date.now() - startTime,
|
|
260
|
+
fallback: true
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Search using DuckDuckGo instant answer API
|
|
267
|
+
*
|
|
268
|
+
* @private
|
|
269
|
+
* @param {string} query - Search query
|
|
270
|
+
* @param {number} maxResults - Maximum results
|
|
271
|
+
* @returns {Promise<SearchResult[]>} Search results
|
|
272
|
+
*/
|
|
273
|
+
async searchDuckDuckGoAPI(query, maxResults) {
|
|
274
|
+
// DuckDuckGo instant answer API (limited but free)
|
|
275
|
+
const params = new URLSearchParams({
|
|
276
|
+
q: query,
|
|
277
|
+
format: 'json',
|
|
278
|
+
no_html: '1',
|
|
279
|
+
skip_disambig: '1'
|
|
280
|
+
});
|
|
281
|
+
const response = await fetch(`https://api.duckduckgo.com/?${params}`);
|
|
282
|
+
const data = await response.json();
|
|
283
|
+
const results = [];
|
|
284
|
+
// Add instant answer if available
|
|
285
|
+
if (data.AbstractText && data.AbstractURL) {
|
|
286
|
+
results.push({
|
|
287
|
+
title: data.Heading || query,
|
|
288
|
+
url: data.AbstractURL,
|
|
289
|
+
snippet: data.AbstractText
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
// Add related topics
|
|
293
|
+
if (data.RelatedTopics) {
|
|
294
|
+
for (const topic of data.RelatedTopics.slice(0, maxResults - 1)) {
|
|
295
|
+
if (topic.FirstURL && topic.Text) {
|
|
296
|
+
results.push({
|
|
297
|
+
title: topic.Text.split(' - ')[0] || topic.Text,
|
|
298
|
+
url: topic.FirstURL,
|
|
299
|
+
snippet: topic.Text
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return results.slice(0, maxResults);
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Gets recommended search providers with signup information
|
|
308
|
+
*
|
|
309
|
+
* @static
|
|
310
|
+
* @returns {Array} Array of provider recommendations
|
|
311
|
+
*/
|
|
312
|
+
static getRecommendedProviders() {
|
|
313
|
+
return [
|
|
314
|
+
{
|
|
315
|
+
name: 'Serper',
|
|
316
|
+
signupUrl: 'https://serper.dev',
|
|
317
|
+
freeQuota: '2,500 queries/month',
|
|
318
|
+
description: 'Google search results API'
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
name: 'SerpAPI',
|
|
322
|
+
signupUrl: 'https://serpapi.com',
|
|
323
|
+
freeQuota: '100 searches/month',
|
|
324
|
+
description: 'Multiple search engines API'
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
name: 'Brave Search',
|
|
328
|
+
signupUrl: 'https://brave.com/search-api',
|
|
329
|
+
freeQuota: '2,000 queries/month',
|
|
330
|
+
description: 'Privacy-focused search API'
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
name: 'DuckDuckGo',
|
|
334
|
+
signupUrl: 'No signup required',
|
|
335
|
+
freeQuota: 'Unlimited (rate limited)',
|
|
336
|
+
description: 'Privacy-focused, no API key needed'
|
|
337
|
+
}
|
|
338
|
+
];
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
exports.SearchProviderService = SearchProviderService;
|
|
342
|
+
//# sourceMappingURL=searchProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchProvider.js","sourceRoot":"","sources":["../../src/services/searchProvider.ts"],"names":[],"mappings":";;;AAsCA;;;;;;;;;;;;;;GAcG;AACH,MAAa,qBAAqB;IACxB,MAAM,CAAuB;IAC7B,cAAc,CAAoD;IAE1E;;;;OAIG;IACH,YAAY,MAA4B;QACtC,IAAI,CAAC,MAAM,GAAG;YACZ,UAAU,EAAE,CAAC;YACb,SAAS,EAAE;gBACT,WAAW,EAAE,EAAE;gBACf,QAAQ,EAAE,KAAK;aAChB;YACD,GAAG,MAAM;SACV,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;IAClC,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,MAAM,CACV,KAAa,EACb,UAGI,EAAE;QAEN,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;QAE5C,oDAAoD;QACpD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QACjF,CAAC;QAED,uCAAuC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE/C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,IAAI,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACxC,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;gBAC/E,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,YAAY,QAAQ,UAAU,EAAE,KAAK,CAAC,CAAC;gBACpD,SAAS;YACX,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;;;;;OASG;IACK,KAAK,CAAC,kBAAkB,CAC9B,KAAa,EACb,QAAgB,EAChB,UAAkB,EAClB,SAAiB;QAEjB,IAAI,OAAuB,CAAC;QAE5B,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,QAAQ;gBACX,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBACrD,MAAM;YACR,KAAK,SAAS;gBACZ,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBACtD,MAAM;YACR,KAAK,OAAO;gBACV,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBACpD,MAAM;YACR,KAAK,YAAY,CAAC;YAClB;gBACE,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBAC5D,MAAM;QACV,CAAC;QAED,OAAO;YACL,QAAQ;YACR,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;YACrC,QAAQ,EAAE;gBACR,KAAK;gBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aACrC;SACF,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,qBAAqB;QAC3B,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY;YAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAErD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,cAAc,CAAC,QAAgB;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE;gBAChC,KAAK,EAAE,CAAC;gBACR,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,SAAU,CAAC,QAAQ;aACjD,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,SAAU,CAAC,WAAW,EAAE,CAAC;YACtD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,UAAkB;QAC1D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kCAAkC,EAAE;YAC/D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,YAAa;gBACtC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;SACpD,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAE9E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;YAC9C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,IAAI;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,UAAkB;QAC3D,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,CAAC,EAAE,KAAK;YACR,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,UAAW;YAChC,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE;SAC3B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAE3E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;YACtD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,IAAI;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,UAAkB;QACzD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,CAAC,EAAE,KAAK;YACR,KAAK,EAAE,UAAU,CAAC,QAAQ,EAAE;SAC7B,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kDAAkD,MAAM,EAAE,EAAE;YACvF,OAAO,EAAE;gBACP,sBAAsB,EAAE,IAAI,CAAC,MAAM,CAAC,WAAY;aACjD;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAE7E,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC;YAClE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,WAAW;YACzB,QAAQ,EAAE,KAAK,GAAG,CAAC;SACpB,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;;;;;OAQG;IACK,KAAK,CAAC,gBAAgB,CAC5B,KAAa,EACb,UAAkB,EAClB,SAAiB;QAEjB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YAClE,OAAO;gBACL,QAAQ,EAAE,YAAY;gBACtB,OAAO;gBACP,QAAQ,EAAE;oBACR,KAAK;oBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBACpC,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4CAA4C;YAC5C,OAAO;gBACL,QAAQ,EAAE,YAAY;gBACtB,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE;oBACR,KAAK;oBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBACpC,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,mBAAmB,CAAC,KAAa,EAAE,UAAkB;QACjE,mDAAmD;QACnD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,CAAC,EAAE,KAAK;YACR,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,GAAG;YACZ,aAAa,EAAE,GAAG;SACnB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,kCAAkC;QAClC,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;gBAC5B,GAAG,EAAE,IAAI,CAAC,WAAW;gBACrB,OAAO,EAAE,IAAI,CAAC,YAAY;aAC3B,CAAC,CAAC;QACL,CAAC;QAED,qBAAqB;QACrB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;gBAChE,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBACjC,OAAO,CAAC,IAAI,CAAC;wBACX,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI;wBAC/C,GAAG,EAAE,KAAK,CAAC,QAAQ;wBACnB,OAAO,EAAE,KAAK,CAAC,IAAI;qBACpB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,uBAAuB;QAC5B,OAAO;YACL;gBACE,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,oBAAoB;gBAC/B,SAAS,EAAE,qBAAqB;gBAChC,WAAW,EAAE,2BAA2B;aACzC;YACD;gBACE,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,qBAAqB;gBAChC,SAAS,EAAE,oBAAoB;gBAC/B,WAAW,EAAE,6BAA6B;aAC3C;YACD;gBACE,IAAI,EAAE,cAAc;gBACpB,SAAS,EAAE,8BAA8B;gBACzC,SAAS,EAAE,qBAAqB;gBAChC,WAAW,EAAE,4BAA4B;aAC1C;YACD;gBACE,IAAI,EAAE,YAAY;gBAClB,SAAS,EAAE,oBAAoB;gBAC/B,SAAS,EAAE,0BAA0B;gBACrC,WAAW,EAAE,oCAAoC;aAClD;SACF,CAAC;IACJ,CAAC;CACF;AA1WD,sDA0WC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { ITool } from '@framers/agentos';
|
|
2
|
+
import { SearchProviderService } from '../services/searchProvider';
|
|
3
|
+
/**
|
|
4
|
+
* Fact checking tool that verifies statements against web sources
|
|
5
|
+
*
|
|
6
|
+
* @class FactCheckTool
|
|
7
|
+
* @implements {ITool}
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const tool = new FactCheckTool(searchService);
|
|
12
|
+
* const result = await tool.execute({
|
|
13
|
+
* statement: 'The Earth orbits the Sun',
|
|
14
|
+
* checkSources: true,
|
|
15
|
+
* confidence: 'high'
|
|
16
|
+
* });
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare class FactCheckTool implements ITool {
|
|
20
|
+
private searchService;
|
|
21
|
+
readonly id = "factCheck";
|
|
22
|
+
readonly name = "Fact Check";
|
|
23
|
+
readonly description = "Verify facts and statements against web sources";
|
|
24
|
+
/**
|
|
25
|
+
* Creates an instance of FactCheckTool
|
|
26
|
+
* @param {SearchProviderService} searchService - The search provider service
|
|
27
|
+
*/
|
|
28
|
+
constructor(searchService: SearchProviderService);
|
|
29
|
+
/**
|
|
30
|
+
* Executes fact checking on a statement
|
|
31
|
+
*
|
|
32
|
+
* @param {Object} input - The fact check parameters
|
|
33
|
+
* @param {string} input.statement - The statement to fact-check
|
|
34
|
+
* @param {boolean} [input.checkSources=true] - Whether to include source citations
|
|
35
|
+
* @param {string} [input.confidence='medium'] - Required confidence level
|
|
36
|
+
* @returns {Promise<{success: boolean, output?: any, error?: string}>} Fact check results
|
|
37
|
+
*/
|
|
38
|
+
execute(input: {
|
|
39
|
+
statement: string;
|
|
40
|
+
checkSources?: boolean;
|
|
41
|
+
confidence?: 'low' | 'medium' | 'high';
|
|
42
|
+
}): Promise<{
|
|
43
|
+
success: boolean;
|
|
44
|
+
output?: any;
|
|
45
|
+
error?: string;
|
|
46
|
+
}>;
|
|
47
|
+
/**
|
|
48
|
+
* Generates queries for fact-checking a statement
|
|
49
|
+
*
|
|
50
|
+
* @private
|
|
51
|
+
* @param {string} statement - The statement to check
|
|
52
|
+
* @returns {string[]} Array of search queries
|
|
53
|
+
*/
|
|
54
|
+
private generateFactCheckQueries;
|
|
55
|
+
/**
|
|
56
|
+
* Analyzes search results to determine fact validity
|
|
57
|
+
*
|
|
58
|
+
* @private
|
|
59
|
+
* @param {string} statement - Original statement
|
|
60
|
+
* @param {any[]} searchResults - Search results to analyze
|
|
61
|
+
* @param {string} requiredConfidence - Required confidence level
|
|
62
|
+
* @returns {Object} Analysis results with verdict and confidence
|
|
63
|
+
*/
|
|
64
|
+
private analyzeFactCheckResults;
|
|
65
|
+
/**
|
|
66
|
+
* Checks if confidence level meets requirement
|
|
67
|
+
*
|
|
68
|
+
* @private
|
|
69
|
+
* @param {string} actual - Actual confidence level
|
|
70
|
+
* @param {string} required - Required confidence level
|
|
71
|
+
* @returns {boolean} True if requirement is met
|
|
72
|
+
*/
|
|
73
|
+
private meetsConfidenceRequirement;
|
|
74
|
+
/**
|
|
75
|
+
* Compiles relevant sources from search results
|
|
76
|
+
*
|
|
77
|
+
* @private
|
|
78
|
+
* @param {any[]} searchResults - Search results to compile from
|
|
79
|
+
* @returns {any[]} Compiled sources with metadata
|
|
80
|
+
*/
|
|
81
|
+
private compileSources;
|
|
82
|
+
/**
|
|
83
|
+
* Validates input parameters
|
|
84
|
+
*
|
|
85
|
+
* @param {any} input - Input to validate
|
|
86
|
+
* @returns {{valid: boolean, errors: string[]}} Validation result
|
|
87
|
+
*/
|
|
88
|
+
validate(input: any): {
|
|
89
|
+
valid: boolean;
|
|
90
|
+
errors: string[];
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Returns the JSON schema for the tool's input
|
|
94
|
+
*
|
|
95
|
+
* @returns {Object} JSON Schema object
|
|
96
|
+
*/
|
|
97
|
+
getSchema(): any;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=factCheck.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factCheck.d.ts","sourceRoot":"","sources":["../../src/tools/factCheck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,aAAc,YAAW,KAAK;IAS7B,OAAO,CAAC,aAAa;IARjC,SAAgB,EAAE,eAAe;IACjC,SAAgB,IAAI,gBAAgB;IACpC,SAAgB,WAAW,qDAAqD;IAEhF;;;OAGG;gBACiB,aAAa,EAAE,qBAAqB;IAExD;;;;;;;;OAQG;IACG,OAAO,CAAC,KAAK,EAAE;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,UAAU,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;KACxC,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAmD/D;;;;;;OAMG;IACH,OAAO,CAAC,wBAAwB;IAUhC;;;;;;;;OAQG;IACH,OAAO,CAAC,uBAAuB;IA2F/B;;;;;;;OAOG;IACH,OAAO,CAAC,0BAA0B;IAKlC;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAwBtB;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IA2B1D;;;;OAIG;IACH,SAAS,IAAI,GAAG;CAwBjB"}
|