@librechat/agents 2.4.83 → 2.4.85
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/dist/cjs/llm/google/utils/common.cjs +13 -0
- package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
- package/dist/cjs/main.cjs +1 -1
- package/dist/cjs/messages/format.cjs +52 -34
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/tools/search/firecrawl.cjs +3 -1
- package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +5 -5
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/serper-scraper.cjs +132 -0
- package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -0
- package/dist/cjs/tools/search/tool.cjs +45 -9
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/esm/llm/google/utils/common.mjs +13 -0
- package/dist/esm/llm/google/utils/common.mjs.map +1 -1
- package/dist/esm/main.mjs +1 -1
- package/dist/esm/messages/format.mjs +52 -34
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/tools/search/firecrawl.mjs +3 -1
- package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +5 -5
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/serper-scraper.mjs +129 -0
- package/dist/esm/tools/search/serper-scraper.mjs.map +1 -0
- package/dist/esm/tools/search/tool.mjs +45 -9
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/types/messages/format.d.ts +23 -20
- package/dist/types/tools/search/firecrawl.d.ts +2 -1
- package/dist/types/tools/search/search.d.ts +1 -2
- package/dist/types/tools/search/serper-scraper.d.ts +59 -0
- package/dist/types/tools/search/tool.d.ts +21 -0
- package/dist/types/tools/search/types.d.ts +30 -1
- package/package.json +1 -1
- package/src/llm/google/utils/common.ts +14 -0
- package/src/messages/format.ts +67 -39
- package/src/messages/formatMessage.test.ts +418 -2
- package/src/scripts/search.ts +5 -1
- package/src/tools/search/firecrawl.ts +5 -2
- package/src/tools/search/search.ts +6 -8
- package/src/tools/search/serper-scraper.ts +155 -0
- package/src/tools/search/tool.ts +47 -8
- package/src/tools/search/types.ts +45 -0
package/src/tools/search/tool.ts
CHANGED
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
newsSchema,
|
|
13
13
|
} from './schema';
|
|
14
14
|
import { createSearchAPI, createSourceProcessor } from './search';
|
|
15
|
+
import { createSerperScraper } from './serper-scraper';
|
|
15
16
|
import { createFirecrawlScraper } from './firecrawl';
|
|
16
17
|
import { expandHighlights } from './highlights';
|
|
17
18
|
import { formatResultsForLLM } from './format';
|
|
@@ -328,6 +329,27 @@ Use anchor marker(s) immediately after the statement:
|
|
|
328
329
|
* Creates a search tool with a schema that dynamically includes the country field
|
|
329
330
|
* only when the searchProvider is 'serper'.
|
|
330
331
|
*
|
|
332
|
+
* Supports multiple scraper providers:
|
|
333
|
+
* - Firecrawl (default): Full-featured web scraping with multiple formats
|
|
334
|
+
* - Serper: Lightweight scraping using Serper's scrape API
|
|
335
|
+
*
|
|
336
|
+
* @example
|
|
337
|
+
* ```typescript
|
|
338
|
+
* // Using Firecrawl scraper (default)
|
|
339
|
+
* const searchTool = createSearchTool({
|
|
340
|
+
* searchProvider: 'serper',
|
|
341
|
+
* scraperProvider: 'firecrawl',
|
|
342
|
+
* firecrawlApiKey: 'your-firecrawl-key'
|
|
343
|
+
* });
|
|
344
|
+
*
|
|
345
|
+
* // Using Serper scraper
|
|
346
|
+
* const searchTool = createSearchTool({
|
|
347
|
+
* searchProvider: 'serper',
|
|
348
|
+
* scraperProvider: 'serper',
|
|
349
|
+
* serperApiKey: 'your-serper-key'
|
|
350
|
+
* });
|
|
351
|
+
* ```
|
|
352
|
+
*
|
|
331
353
|
* @param config - The search tool configuration
|
|
332
354
|
* @returns A DynamicStructuredTool with a schema that depends on the searchProvider
|
|
333
355
|
*/
|
|
@@ -344,9 +366,12 @@ export const createSearchTool = (
|
|
|
344
366
|
strategies = ['no_extraction'],
|
|
345
367
|
filterContent = true,
|
|
346
368
|
safeSearch = 1,
|
|
369
|
+
scraperProvider = 'firecrawl',
|
|
347
370
|
firecrawlApiKey,
|
|
348
371
|
firecrawlApiUrl,
|
|
372
|
+
firecrawlVersion,
|
|
349
373
|
firecrawlOptions,
|
|
374
|
+
serperScraperOptions,
|
|
350
375
|
scraperTimeout,
|
|
351
376
|
jinaApiKey,
|
|
352
377
|
jinaApiUrl,
|
|
@@ -385,13 +410,27 @@ export const createSearchTool = (
|
|
|
385
410
|
searxngApiKey,
|
|
386
411
|
});
|
|
387
412
|
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
413
|
+
/** Create scraper based on scraperProvider */
|
|
414
|
+
let scraperInstance: t.BaseScraper;
|
|
415
|
+
|
|
416
|
+
if (scraperProvider === 'serper') {
|
|
417
|
+
scraperInstance = createSerperScraper({
|
|
418
|
+
...serperScraperOptions,
|
|
419
|
+
apiKey: serperApiKey,
|
|
420
|
+
timeout: scraperTimeout ?? serperScraperOptions?.timeout,
|
|
421
|
+
logger,
|
|
422
|
+
});
|
|
423
|
+
} else {
|
|
424
|
+
scraperInstance = createFirecrawlScraper({
|
|
425
|
+
...firecrawlOptions,
|
|
426
|
+
apiKey: firecrawlApiKey ?? process.env.FIRECRAWL_API_KEY,
|
|
427
|
+
apiUrl: firecrawlApiUrl,
|
|
428
|
+
version: firecrawlVersion,
|
|
429
|
+
timeout: scraperTimeout ?? firecrawlOptions?.timeout,
|
|
430
|
+
formats: firecrawlOptions?.formats ?? ['markdown', 'rawHtml'],
|
|
431
|
+
logger,
|
|
432
|
+
});
|
|
433
|
+
}
|
|
395
434
|
|
|
396
435
|
const selectedReranker = createReranker({
|
|
397
436
|
rerankerType,
|
|
@@ -413,7 +452,7 @@ export const createSearchTool = (
|
|
|
413
452
|
filterContent,
|
|
414
453
|
logger,
|
|
415
454
|
},
|
|
416
|
-
|
|
455
|
+
scraperInstance
|
|
417
456
|
);
|
|
418
457
|
|
|
419
458
|
const search = createSearchProcessor({
|
|
@@ -5,6 +5,7 @@ import type { BaseReranker } from './rerankers';
|
|
|
5
5
|
import { DATE_RANGE } from './schema';
|
|
6
6
|
|
|
7
7
|
export type SearchProvider = 'serper' | 'searxng';
|
|
8
|
+
export type ScraperProvider = 'firecrawl' | 'serper';
|
|
8
9
|
export type RerankerType = 'infinity' | 'jina' | 'cohere' | 'none';
|
|
9
10
|
|
|
10
11
|
export interface Highlight {
|
|
@@ -94,9 +95,18 @@ export interface ProcessSourcesConfig {
|
|
|
94
95
|
export interface FirecrawlConfig {
|
|
95
96
|
firecrawlApiKey?: string;
|
|
96
97
|
firecrawlApiUrl?: string;
|
|
98
|
+
firecrawlVersion?: string;
|
|
97
99
|
firecrawlOptions?: FirecrawlScraperConfig;
|
|
98
100
|
}
|
|
99
101
|
|
|
102
|
+
export interface SerperScraperConfig {
|
|
103
|
+
apiKey?: string;
|
|
104
|
+
apiUrl?: string;
|
|
105
|
+
timeout?: number;
|
|
106
|
+
logger?: Logger;
|
|
107
|
+
includeMarkdown?: boolean;
|
|
108
|
+
}
|
|
109
|
+
|
|
100
110
|
export interface ScraperContentResult {
|
|
101
111
|
content: string;
|
|
102
112
|
}
|
|
@@ -151,7 +161,9 @@ export interface SearchToolConfig
|
|
|
151
161
|
jinaApiUrl?: string;
|
|
152
162
|
cohereApiKey?: string;
|
|
153
163
|
rerankerType?: RerankerType;
|
|
164
|
+
scraperProvider?: ScraperProvider;
|
|
154
165
|
scraperTimeout?: number;
|
|
166
|
+
serperScraperOptions?: SerperScraperConfig;
|
|
155
167
|
onSearchResults?: (
|
|
156
168
|
results: SearchResult,
|
|
157
169
|
runnableConfig?: RunnableConfig
|
|
@@ -170,9 +182,30 @@ export type UsedReferences = {
|
|
|
170
182
|
reference: MediaReference;
|
|
171
183
|
}[];
|
|
172
184
|
|
|
185
|
+
/** Base Scraper Interface */
|
|
186
|
+
export interface BaseScraper {
|
|
187
|
+
scrapeUrl(
|
|
188
|
+
url: string,
|
|
189
|
+
options?: unknown
|
|
190
|
+
): Promise<[string, FirecrawlScrapeResponse | SerperScrapeResponse]>;
|
|
191
|
+
extractContent(
|
|
192
|
+
response: FirecrawlScrapeResponse | SerperScrapeResponse
|
|
193
|
+
): [string, undefined | References];
|
|
194
|
+
extractMetadata(
|
|
195
|
+
response: FirecrawlScrapeResponse | SerperScrapeResponse
|
|
196
|
+
):
|
|
197
|
+
| ScrapeMetadata
|
|
198
|
+
| Record<string, string | number | boolean | null | undefined>;
|
|
199
|
+
}
|
|
200
|
+
|
|
173
201
|
/** Firecrawl */
|
|
174
202
|
export type FirecrawlScrapeOptions = Omit<
|
|
175
203
|
FirecrawlScraperConfig,
|
|
204
|
+
'apiKey' | 'apiUrl' | 'version' | 'logger'
|
|
205
|
+
>;
|
|
206
|
+
|
|
207
|
+
export type SerperScrapeOptions = Omit<
|
|
208
|
+
SerperScraperConfig,
|
|
176
209
|
'apiKey' | 'apiUrl' | 'logger'
|
|
177
210
|
>;
|
|
178
211
|
|
|
@@ -251,9 +284,21 @@ export interface FirecrawlScrapeResponse {
|
|
|
251
284
|
error?: string;
|
|
252
285
|
}
|
|
253
286
|
|
|
287
|
+
export interface SerperScrapeResponse {
|
|
288
|
+
success: boolean;
|
|
289
|
+
data?: {
|
|
290
|
+
text?: string;
|
|
291
|
+
markdown?: string;
|
|
292
|
+
metadata?: Record<string, string | number | boolean | null | undefined>;
|
|
293
|
+
credits?: number;
|
|
294
|
+
};
|
|
295
|
+
error?: string;
|
|
296
|
+
}
|
|
297
|
+
|
|
254
298
|
export interface FirecrawlScraperConfig {
|
|
255
299
|
apiKey?: string;
|
|
256
300
|
apiUrl?: string;
|
|
301
|
+
version?: string;
|
|
257
302
|
formats?: string[];
|
|
258
303
|
timeout?: number;
|
|
259
304
|
logger?: Logger;
|