@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
package/.eslintrc.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"root": true,
|
|
3
|
+
"parser": "@typescript-eslint/parser",
|
|
4
|
+
"plugins": ["@typescript-eslint"],
|
|
5
|
+
"extends": [
|
|
6
|
+
"eslint:recommended",
|
|
7
|
+
"plugin:@typescript-eslint/recommended"
|
|
8
|
+
],
|
|
9
|
+
"parserOptions": {
|
|
10
|
+
"ecmaVersion": 2022,
|
|
11
|
+
"sourceType": "module",
|
|
12
|
+
"project": "./tsconfig.json"
|
|
13
|
+
},
|
|
14
|
+
"rules": {
|
|
15
|
+
"@typescript-eslint/explicit-function-return-type": "off",
|
|
16
|
+
"@typescript-eslint/no-explicit-any": "warn",
|
|
17
|
+
"@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }],
|
|
18
|
+
"no-console": ["warn", { "allow": ["warn", "error"] }]
|
|
19
|
+
},
|
|
20
|
+
"ignorePatterns": ["dist", "node_modules", "coverage", "*.js"]
|
|
21
|
+
}
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# @framers/agentos-ext-web-search
|
|
2
|
+
|
|
3
|
+
## 1.1.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`e6a2eb6`](https://github.com/framersai/agentos-extensions/commit/e6a2eb61145c5715df63668b795fe90720a3c7c1) Thanks [@jddunn](https://github.com/jddunn)! - Initial release of AgentOS extension packages.
|
|
8
|
+
|
|
9
|
+
- Auth: JWT authentication and subscription management
|
|
10
|
+
- Anchor Providers: Solana on-chain provenance anchoring
|
|
11
|
+
- Wunderland Tip Ingestion: Tip content processing pipeline
|
|
12
|
+
- Web Search: Search, research aggregation, and fact-checking
|
|
13
|
+
- Web Browser: Browser automation and content extraction
|
|
14
|
+
- Telegram Integration: Telegram Bot API integration
|
|
15
|
+
- Telegram Bot: Telegram bot communications handler
|
|
16
|
+
- CLI Executor: Shell command execution and file management
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Frame.dev
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# Web Search Extension for AgentOS
|
|
2
|
+
|
|
3
|
+
Enable powerful web search capabilities for your AgentOS agents.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- 🔍 **Web Search** - Search the web with multiple providers
|
|
8
|
+
- 📚 **Research Aggregator** - Compile research from multiple searches
|
|
9
|
+
- ✅ **Fact Checker** - Verify claims across sources
|
|
10
|
+
- 🌍 **Multi-provider Support** - Serper, SerpAPI, Brave, DuckDuckGo
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install @framers/agentos-ext-search
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Quick Start
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
import { AgentOS } from '@framers/agentos';
|
|
22
|
+
import searchExtension from '@framers/agentos-ext-search';
|
|
23
|
+
|
|
24
|
+
const agentos = new AgentOS();
|
|
25
|
+
|
|
26
|
+
await agentos.initialize({
|
|
27
|
+
// ... other config
|
|
28
|
+
extensionManifest: {
|
|
29
|
+
packs: [
|
|
30
|
+
{
|
|
31
|
+
factory: () => searchExtension({
|
|
32
|
+
manifestEntry: {} as any,
|
|
33
|
+
source: { sourceName: '@framers/agentos-ext-search' },
|
|
34
|
+
options: {
|
|
35
|
+
search: {
|
|
36
|
+
provider: 'serper',
|
|
37
|
+
apiKey: process.env.SERPER_API_KEY
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
})
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Configuration
|
|
48
|
+
|
|
49
|
+
### Environment Variables
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# Option 1: Serper (2,500 free queries)
|
|
53
|
+
SERPER_API_KEY=your_serper_api_key
|
|
54
|
+
|
|
55
|
+
# Option 2: SerpAPI (100 free/month)
|
|
56
|
+
SERPAPI_API_KEY=your_serpapi_key
|
|
57
|
+
|
|
58
|
+
# Option 3: Brave (2,000 free/month)
|
|
59
|
+
BRAVE_SEARCH_API_KEY=your_brave_api_key
|
|
60
|
+
|
|
61
|
+
# Optional: Override provider
|
|
62
|
+
SEARCH_PROVIDER=serper # or serpapi, brave, duckduckgo
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Programmatic Configuration
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
{
|
|
69
|
+
search: {
|
|
70
|
+
provider: 'serper', // 'serper' | 'serpapi' | 'brave' | 'duckduckgo'
|
|
71
|
+
apiKey: 'your-api-key',
|
|
72
|
+
rateLimit: 5 // requests per second
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Available Tools
|
|
78
|
+
|
|
79
|
+
### 1. Web Search
|
|
80
|
+
|
|
81
|
+
Search the web for information.
|
|
82
|
+
|
|
83
|
+
**Input:**
|
|
84
|
+
```typescript
|
|
85
|
+
{
|
|
86
|
+
query: string; // Search query
|
|
87
|
+
numResults?: number; // Results to return (1-10, default: 5)
|
|
88
|
+
searchType?: string; // 'web' | 'news' | 'images' | 'videos'
|
|
89
|
+
timeRange?: string; // 'any' | 'day' | 'week' | 'month' | 'year'
|
|
90
|
+
region?: string; // Country code: 'us', 'uk', 'fr', etc.
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Example:**
|
|
95
|
+
```typescript
|
|
96
|
+
const result = await tool.execute({
|
|
97
|
+
query: "latest AI developments",
|
|
98
|
+
numResults: 5,
|
|
99
|
+
timeRange: "week"
|
|
100
|
+
});
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### 2. Research Aggregator
|
|
104
|
+
|
|
105
|
+
Perform comprehensive research on a topic.
|
|
106
|
+
|
|
107
|
+
**Input:**
|
|
108
|
+
```typescript
|
|
109
|
+
{
|
|
110
|
+
topic: string; // Research topic
|
|
111
|
+
searchQueries?: string[]; // Specific queries to run
|
|
112
|
+
sources?: string[]; // 'web' | 'academic' | 'news'
|
|
113
|
+
maxResultsPerQuery?: number; // Results per query (default: 3)
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 3. Fact Checker
|
|
118
|
+
|
|
119
|
+
Verify claims across multiple sources.
|
|
120
|
+
|
|
121
|
+
**Input:**
|
|
122
|
+
```typescript
|
|
123
|
+
{
|
|
124
|
+
claim: string; // Claim to verify
|
|
125
|
+
context?: string; // Additional context
|
|
126
|
+
sources?: string[]; // Specific sources to check
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Provider Setup
|
|
131
|
+
|
|
132
|
+
### Serper.dev (Recommended)
|
|
133
|
+
1. Sign up: https://serper.dev/signup
|
|
134
|
+
2. Get API key from dashboard
|
|
135
|
+
3. 2,500 free queries
|
|
136
|
+
|
|
137
|
+
### SerpAPI
|
|
138
|
+
1. Sign up: https://serpapi.com/users/sign_up
|
|
139
|
+
2. Copy API key from account page
|
|
140
|
+
3. 100 free searches/month
|
|
141
|
+
|
|
142
|
+
### Brave Search
|
|
143
|
+
1. Register: https://brave.com/search/api/
|
|
144
|
+
2. Get API key
|
|
145
|
+
3. 2,000 free queries/month
|
|
146
|
+
|
|
147
|
+
### DuckDuckGo (Fallback)
|
|
148
|
+
- No API key required
|
|
149
|
+
- Limited functionality
|
|
150
|
+
- Rate limited
|
|
151
|
+
|
|
152
|
+
## Usage with Agents
|
|
153
|
+
|
|
154
|
+
Once installed, agents can use search tools:
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
// Agent conversation
|
|
158
|
+
User: "Search for information about quantum computing"
|
|
159
|
+
Agent: [Uses webSearch tool] Here's what I found about quantum computing...
|
|
160
|
+
|
|
161
|
+
User: "Research the latest renewable energy developments"
|
|
162
|
+
Agent: [Uses researchAggregator tool] I've compiled research from multiple sources...
|
|
163
|
+
|
|
164
|
+
User: "Fact check: Is coffee the second most traded commodity?"
|
|
165
|
+
Agent: [Uses factCheck tool] After checking multiple sources...
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Error Handling
|
|
169
|
+
|
|
170
|
+
The extension handles various error scenarios:
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
// Missing API key
|
|
174
|
+
{
|
|
175
|
+
success: false,
|
|
176
|
+
error: "Search provider not configured",
|
|
177
|
+
details: {
|
|
178
|
+
message: "Please configure a search API key",
|
|
179
|
+
providers: [/* signup links */]
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Rate limiting
|
|
184
|
+
// Automatically enforced based on provider limits
|
|
185
|
+
|
|
186
|
+
// Network errors
|
|
187
|
+
{
|
|
188
|
+
success: false,
|
|
189
|
+
error: "Search failed: Network error",
|
|
190
|
+
details: { provider: "serper", timestamp: "..." }
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Development
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
# Install dependencies
|
|
198
|
+
npm install
|
|
199
|
+
|
|
200
|
+
# Build
|
|
201
|
+
npm run build
|
|
202
|
+
|
|
203
|
+
# Run tests
|
|
204
|
+
npm test
|
|
205
|
+
|
|
206
|
+
# Watch mode
|
|
207
|
+
npm run dev
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## License
|
|
211
|
+
|
|
212
|
+
MIT © Frame.dev
|
|
213
|
+
|
|
214
|
+
## Support
|
|
215
|
+
|
|
216
|
+
- Issues: https://github.com/framersai/agentos-extensions/issues
|
|
217
|
+
- Documentation: https://agentos.sh/docs/extensions
|
|
218
|
+
- Discord: https://discord.gg/agentos
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentOS Web Search Extension
|
|
3
|
+
*
|
|
4
|
+
* Provides web search capabilities through multiple providers with automatic fallback.
|
|
5
|
+
*
|
|
6
|
+
* @module @framers/agentos-ext-web-search
|
|
7
|
+
* @version 1.0.0
|
|
8
|
+
* @license MIT
|
|
9
|
+
*/
|
|
10
|
+
import { ExtensionContext, ExtensionPack } from '@framers/agentos';
|
|
11
|
+
import { WebSearchTool } from './tools/webSearch';
|
|
12
|
+
import { ResearchAggregatorTool } from './tools/researchAggregator';
|
|
13
|
+
import { FactCheckTool } from './tools/factCheck';
|
|
14
|
+
/**
|
|
15
|
+
* Extension configuration options
|
|
16
|
+
*/
|
|
17
|
+
export interface WebSearchExtensionOptions {
|
|
18
|
+
/** Serper.dev API key */
|
|
19
|
+
serperApiKey?: string;
|
|
20
|
+
/** SerpAPI API key */
|
|
21
|
+
serpApiKey?: string;
|
|
22
|
+
/** Brave Search API key */
|
|
23
|
+
braveApiKey?: string;
|
|
24
|
+
/** Default maximum results for searches */
|
|
25
|
+
defaultMaxResults?: number;
|
|
26
|
+
/** Rate limiting configuration */
|
|
27
|
+
rateLimit?: {
|
|
28
|
+
maxRequests: number;
|
|
29
|
+
windowMs: number;
|
|
30
|
+
};
|
|
31
|
+
/** Extension priority in the stack */
|
|
32
|
+
priority?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Creates the web search extension pack
|
|
36
|
+
*
|
|
37
|
+
* @param {ExtensionContext} context - The extension context
|
|
38
|
+
* @returns {ExtensionPack} The configured extension pack
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* import { createExtensionPack } from '@framers/agentos-ext-web-search';
|
|
43
|
+
*
|
|
44
|
+
* const pack = createExtensionPack({
|
|
45
|
+
* options: {
|
|
46
|
+
* serperApiKey: process.env.SERPER_API_KEY,
|
|
47
|
+
* defaultMaxResults: 10
|
|
48
|
+
* },
|
|
49
|
+
* logger: console
|
|
50
|
+
* });
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare function createExtensionPack(context: ExtensionContext): ExtensionPack;
|
|
54
|
+
export { WebSearchTool, ResearchAggregatorTool, FactCheckTool };
|
|
55
|
+
export { SearchProviderService, SearchResult, ProviderResponse } from './services/searchProvider';
|
|
56
|
+
export type { SearchProviderConfig } from './services/searchProvider';
|
|
57
|
+
export default createExtensionPack;
|
|
58
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlD;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,yBAAyB;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sBAAsB;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kCAAkC;IAClC,SAAS,CAAC,EAAE;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa,CA0D5E;AAGD,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,aAAa,EAAE,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClG,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGtE,eAAe,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AgentOS Web Search Extension
|
|
4
|
+
*
|
|
5
|
+
* Provides web search capabilities through multiple providers with automatic fallback.
|
|
6
|
+
*
|
|
7
|
+
* @module @framers/agentos-ext-web-search
|
|
8
|
+
* @version 1.0.0
|
|
9
|
+
* @license MIT
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.SearchProviderService = exports.FactCheckTool = exports.ResearchAggregatorTool = exports.WebSearchTool = void 0;
|
|
13
|
+
exports.createExtensionPack = createExtensionPack;
|
|
14
|
+
const webSearch_1 = require("./tools/webSearch");
|
|
15
|
+
Object.defineProperty(exports, "WebSearchTool", { enumerable: true, get: function () { return webSearch_1.WebSearchTool; } });
|
|
16
|
+
const researchAggregator_1 = require("./tools/researchAggregator");
|
|
17
|
+
Object.defineProperty(exports, "ResearchAggregatorTool", { enumerable: true, get: function () { return researchAggregator_1.ResearchAggregatorTool; } });
|
|
18
|
+
const factCheck_1 = require("./tools/factCheck");
|
|
19
|
+
Object.defineProperty(exports, "FactCheckTool", { enumerable: true, get: function () { return factCheck_1.FactCheckTool; } });
|
|
20
|
+
const searchProvider_1 = require("./services/searchProvider");
|
|
21
|
+
/**
|
|
22
|
+
* Creates the web search extension pack
|
|
23
|
+
*
|
|
24
|
+
* @param {ExtensionContext} context - The extension context
|
|
25
|
+
* @returns {ExtensionPack} The configured extension pack
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* import { createExtensionPack } from '@framers/agentos-ext-web-search';
|
|
30
|
+
*
|
|
31
|
+
* const pack = createExtensionPack({
|
|
32
|
+
* options: {
|
|
33
|
+
* serperApiKey: process.env.SERPER_API_KEY,
|
|
34
|
+
* defaultMaxResults: 10
|
|
35
|
+
* },
|
|
36
|
+
* logger: console
|
|
37
|
+
* });
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
function createExtensionPack(context) {
|
|
41
|
+
const options = context.options || {};
|
|
42
|
+
// Initialize search service with configuration
|
|
43
|
+
const searchService = new searchProvider_1.SearchProviderService({
|
|
44
|
+
serperApiKey: options.serperApiKey,
|
|
45
|
+
serpApiKey: options.serpApiKey,
|
|
46
|
+
braveApiKey: options.braveApiKey,
|
|
47
|
+
rateLimit: options.rateLimit
|
|
48
|
+
});
|
|
49
|
+
// Create tool instances
|
|
50
|
+
const webSearchTool = new webSearch_1.WebSearchTool(searchService);
|
|
51
|
+
const researchAggregator = new researchAggregator_1.ResearchAggregatorTool(searchService);
|
|
52
|
+
const factCheckTool = new factCheck_1.FactCheckTool(searchService);
|
|
53
|
+
return {
|
|
54
|
+
name: '@framers/agentos-ext-web-search',
|
|
55
|
+
version: '1.0.0',
|
|
56
|
+
descriptors: [
|
|
57
|
+
{
|
|
58
|
+
id: 'webSearch',
|
|
59
|
+
kind: 'tool',
|
|
60
|
+
priority: options.priority || 50,
|
|
61
|
+
payload: webSearchTool
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: 'researchAggregator',
|
|
65
|
+
kind: 'tool',
|
|
66
|
+
priority: options.priority || 50,
|
|
67
|
+
payload: researchAggregator
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: 'factCheck',
|
|
71
|
+
kind: 'tool',
|
|
72
|
+
priority: options.priority || 50,
|
|
73
|
+
payload: factCheckTool
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
/**
|
|
77
|
+
* Called when extension is activated
|
|
78
|
+
*/
|
|
79
|
+
onActivate: async () => {
|
|
80
|
+
if (context.onActivate) {
|
|
81
|
+
await context.onActivate();
|
|
82
|
+
}
|
|
83
|
+
context.logger?.info('Web Search Extension activated');
|
|
84
|
+
},
|
|
85
|
+
/**
|
|
86
|
+
* Called when extension is deactivated
|
|
87
|
+
*/
|
|
88
|
+
onDeactivate: async () => {
|
|
89
|
+
if (context.onDeactivate) {
|
|
90
|
+
await context.onDeactivate();
|
|
91
|
+
}
|
|
92
|
+
context.logger?.info('Web Search Extension deactivated');
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
var searchProvider_2 = require("./services/searchProvider");
|
|
97
|
+
Object.defineProperty(exports, "SearchProviderService", { enumerable: true, get: function () { return searchProvider_2.SearchProviderService; } });
|
|
98
|
+
// Default export for convenience
|
|
99
|
+
exports.default = createExtensionPack;
|
|
100
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAgDH,kDA0DC;AAvGD,iDAAkD;AA0GzC,8FA1GA,yBAAa,OA0GA;AAzGtB,mEAAoE;AAyG5C,uGAzGf,2CAAsB,OAyGe;AAxG9C,iDAAkD;AAwGF,8FAxGvC,yBAAa,OAwGuC;AAvG7D,8DAAkE;AAuBlE;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,mBAAmB,CAAC,OAAyB;IAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAoC,IAAI,EAAE,CAAC;IAEnE,+CAA+C;IAC/C,MAAM,aAAa,GAAG,IAAI,sCAAqB,CAAC;QAC9C,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;IAEH,wBAAwB;IACxB,MAAM,aAAa,GAAG,IAAI,yBAAa,CAAC,aAAa,CAAC,CAAC;IACvD,MAAM,kBAAkB,GAAG,IAAI,2CAAsB,CAAC,aAAa,CAAC,CAAC;IACrE,MAAM,aAAa,GAAG,IAAI,yBAAa,CAAC,aAAa,CAAC,CAAC;IAEvD,OAAO;QACL,IAAI,EAAE,iCAAiC;QACvC,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE;YACX;gBACE,EAAE,EAAE,WAAW;gBACf,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;gBAChC,OAAO,EAAE,aAAa;aACvB;YACD;gBACE,EAAE,EAAE,oBAAoB;gBACxB,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;gBAChC,OAAO,EAAE,kBAAkB;aAC5B;YACD;gBACE,EAAE,EAAE,WAAW;gBACf,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;gBAChC,OAAO,EAAE,aAAa;aACvB;SACF;QACD;;WAEG;QACH,UAAU,EAAE,KAAK,IAAI,EAAE;YACrB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;YAC7B,CAAC;YACD,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,gCAAgC,CAAC,CAAC;QACzD,CAAC;QACD;;WAEG;QACH,YAAY,EAAE,KAAK,IAAI,EAAE;YACvB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBACzB,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;YAC/B,CAAC;YACD,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC3D,CAAC;KACF,CAAC;AACJ,CAAC;AAID,4DAAkG;AAAzF,uHAAA,qBAAqB,OAAA;AAG9B,iCAAiC;AACjC,kBAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for search providers
|
|
3
|
+
*/
|
|
4
|
+
export interface SearchProviderConfig {
|
|
5
|
+
serperApiKey?: string;
|
|
6
|
+
serpApiKey?: string;
|
|
7
|
+
braveApiKey?: string;
|
|
8
|
+
maxRetries?: number;
|
|
9
|
+
rateLimit?: {
|
|
10
|
+
maxRequests: number;
|
|
11
|
+
windowMs: number;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Search result structure
|
|
16
|
+
*/
|
|
17
|
+
export interface SearchResult {
|
|
18
|
+
title: string;
|
|
19
|
+
url: string;
|
|
20
|
+
snippet: string;
|
|
21
|
+
position?: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Provider-specific response
|
|
25
|
+
*/
|
|
26
|
+
export interface ProviderResponse {
|
|
27
|
+
provider: string;
|
|
28
|
+
results: SearchResult[];
|
|
29
|
+
metadata: {
|
|
30
|
+
query: string;
|
|
31
|
+
timestamp: string;
|
|
32
|
+
responseTime?: number;
|
|
33
|
+
fallback?: boolean;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Service for managing multiple search providers with fallback support
|
|
38
|
+
*
|
|
39
|
+
* @class SearchProviderService
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* const service = new SearchProviderService({
|
|
44
|
+
* serperApiKey: 'your-key',
|
|
45
|
+
* rateLimit: { maxRequests: 10, windowMs: 60000 }
|
|
46
|
+
* });
|
|
47
|
+
*
|
|
48
|
+
* const results = await service.search('query');
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare class SearchProviderService {
|
|
52
|
+
private config;
|
|
53
|
+
private rateLimitState;
|
|
54
|
+
/**
|
|
55
|
+
* Creates an instance of SearchProviderService
|
|
56
|
+
*
|
|
57
|
+
* @param {SearchProviderConfig} config - Configuration for the service
|
|
58
|
+
*/
|
|
59
|
+
constructor(config: SearchProviderConfig);
|
|
60
|
+
/**
|
|
61
|
+
* Performs a search across available providers with automatic fallback
|
|
62
|
+
*
|
|
63
|
+
* @param {string} query - The search query
|
|
64
|
+
* @param {Object} options - Search options
|
|
65
|
+
* @param {number} [options.maxResults=10] - Maximum results to return
|
|
66
|
+
* @param {string} [options.provider] - Specific provider to use
|
|
67
|
+
* @returns {Promise<ProviderResponse>} Search results with metadata
|
|
68
|
+
*
|
|
69
|
+
* @throws {Error} If all providers fail and no fallback is available
|
|
70
|
+
*/
|
|
71
|
+
search(query: string, options?: {
|
|
72
|
+
maxResults?: number;
|
|
73
|
+
provider?: string;
|
|
74
|
+
}): Promise<ProviderResponse>;
|
|
75
|
+
/**
|
|
76
|
+
* Searches using a specific provider
|
|
77
|
+
*
|
|
78
|
+
* @private
|
|
79
|
+
* @param {string} query - Search query
|
|
80
|
+
* @param {string} provider - Provider name
|
|
81
|
+
* @param {number} maxResults - Maximum results
|
|
82
|
+
* @param {number} startTime - Request start timestamp
|
|
83
|
+
* @returns {Promise<ProviderResponse>} Search results
|
|
84
|
+
*/
|
|
85
|
+
private searchWithProvider;
|
|
86
|
+
/**
|
|
87
|
+
* Gets list of available providers based on configured API keys
|
|
88
|
+
*
|
|
89
|
+
* @private
|
|
90
|
+
* @returns {string[]} Array of available provider names
|
|
91
|
+
*/
|
|
92
|
+
private getAvailableProviders;
|
|
93
|
+
/**
|
|
94
|
+
* Checks if a provider is within rate limits
|
|
95
|
+
*
|
|
96
|
+
* @private
|
|
97
|
+
* @param {string} provider - Provider name
|
|
98
|
+
* @returns {Promise<boolean>} True if within limits
|
|
99
|
+
*/
|
|
100
|
+
private checkRateLimit;
|
|
101
|
+
/**
|
|
102
|
+
* Search using Serper.dev API
|
|
103
|
+
*
|
|
104
|
+
* @private
|
|
105
|
+
* @param {string} query - Search query
|
|
106
|
+
* @param {number} maxResults - Maximum results
|
|
107
|
+
* @returns {Promise<SearchResult[]>} Search results
|
|
108
|
+
*/
|
|
109
|
+
private searchSerper;
|
|
110
|
+
/**
|
|
111
|
+
* Search using SerpAPI
|
|
112
|
+
*
|
|
113
|
+
* @private
|
|
114
|
+
* @param {string} query - Search query
|
|
115
|
+
* @param {number} maxResults - Maximum results
|
|
116
|
+
* @returns {Promise<SearchResult[]>} Search results
|
|
117
|
+
*/
|
|
118
|
+
private searchSerpApi;
|
|
119
|
+
/**
|
|
120
|
+
* Search using Brave Search API
|
|
121
|
+
*
|
|
122
|
+
* @private
|
|
123
|
+
* @param {string} query - Search query
|
|
124
|
+
* @param {number} maxResults - Maximum results
|
|
125
|
+
* @returns {Promise<SearchResult[]>} Search results
|
|
126
|
+
*/
|
|
127
|
+
private searchBrave;
|
|
128
|
+
/**
|
|
129
|
+
* Search using DuckDuckGo (HTML scraping fallback)
|
|
130
|
+
*
|
|
131
|
+
* @private
|
|
132
|
+
* @param {string} query - Search query
|
|
133
|
+
* @param {number} maxResults - Maximum results
|
|
134
|
+
* @param {number} startTime - Request start timestamp
|
|
135
|
+
* @returns {Promise<ProviderResponse>} Search results
|
|
136
|
+
*/
|
|
137
|
+
private searchDuckDuckGo;
|
|
138
|
+
/**
|
|
139
|
+
* Search using DuckDuckGo instant answer API
|
|
140
|
+
*
|
|
141
|
+
* @private
|
|
142
|
+
* @param {string} query - Search query
|
|
143
|
+
* @param {number} maxResults - Maximum results
|
|
144
|
+
* @returns {Promise<SearchResult[]>} Search results
|
|
145
|
+
*/
|
|
146
|
+
private searchDuckDuckGoAPI;
|
|
147
|
+
/**
|
|
148
|
+
* Gets recommended search providers with signup information
|
|
149
|
+
*
|
|
150
|
+
* @static
|
|
151
|
+
* @returns {Array} Array of provider recommendations
|
|
152
|
+
*/
|
|
153
|
+
static getRecommendedProviders(): {
|
|
154
|
+
name: string;
|
|
155
|
+
signupUrl: string;
|
|
156
|
+
freeQuota: string;
|
|
157
|
+
description: string;
|
|
158
|
+
}[];
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=searchProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchProvider.d.ts","sourceRoot":"","sources":["../../src/services/searchProvider.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;CACH;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,cAAc,CAAoD;IAE1E;;;;OAIG;gBACS,MAAM,EAAE,oBAAoB;IAYxC;;;;;;;;;;OAUG;IACG,MAAM,CACV,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;QACP,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;KACb,GACL,OAAO,CAAC,gBAAgB,CAAC;IA2B5B;;;;;;;;;OASG;YACW,kBAAkB;IAmChC;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAU7B;;;;;;OAMG;YACW,cAAc;IAoB5B;;;;;;;OAOG;YACW,YAAY;IAqB1B;;;;;;;OAOG;YACW,aAAa;IAmB3B;;;;;;;OAOG;YACW,WAAW;IAuBzB;;;;;;;;OAQG;YACW,gBAAgB;IAgC9B;;;;;;;OAOG;YACW,mBAAmB;IAuCjC;;;;;OAKG;IACH,MAAM,CAAC,uBAAuB;;;;;;CA4B/B"}
|