@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.
Files changed (42) hide show
  1. package/dist/cjs/llm/google/utils/common.cjs +13 -0
  2. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  3. package/dist/cjs/main.cjs +1 -1
  4. package/dist/cjs/messages/format.cjs +52 -34
  5. package/dist/cjs/messages/format.cjs.map +1 -1
  6. package/dist/cjs/tools/search/firecrawl.cjs +3 -1
  7. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  8. package/dist/cjs/tools/search/search.cjs +5 -5
  9. package/dist/cjs/tools/search/search.cjs.map +1 -1
  10. package/dist/cjs/tools/search/serper-scraper.cjs +132 -0
  11. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -0
  12. package/dist/cjs/tools/search/tool.cjs +45 -9
  13. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  14. package/dist/esm/llm/google/utils/common.mjs +13 -0
  15. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  16. package/dist/esm/main.mjs +1 -1
  17. package/dist/esm/messages/format.mjs +52 -34
  18. package/dist/esm/messages/format.mjs.map +1 -1
  19. package/dist/esm/tools/search/firecrawl.mjs +3 -1
  20. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  21. package/dist/esm/tools/search/search.mjs +5 -5
  22. package/dist/esm/tools/search/search.mjs.map +1 -1
  23. package/dist/esm/tools/search/serper-scraper.mjs +129 -0
  24. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -0
  25. package/dist/esm/tools/search/tool.mjs +45 -9
  26. package/dist/esm/tools/search/tool.mjs.map +1 -1
  27. package/dist/types/messages/format.d.ts +23 -20
  28. package/dist/types/tools/search/firecrawl.d.ts +2 -1
  29. package/dist/types/tools/search/search.d.ts +1 -2
  30. package/dist/types/tools/search/serper-scraper.d.ts +59 -0
  31. package/dist/types/tools/search/tool.d.ts +21 -0
  32. package/dist/types/tools/search/types.d.ts +30 -1
  33. package/package.json +1 -1
  34. package/src/llm/google/utils/common.ts +14 -0
  35. package/src/messages/format.ts +67 -39
  36. package/src/messages/formatMessage.test.ts +418 -2
  37. package/src/scripts/search.ts +5 -1
  38. package/src/tools/search/firecrawl.ts +5 -2
  39. package/src/tools/search/search.ts +6 -8
  40. package/src/tools/search/serper-scraper.ts +155 -0
  41. package/src/tools/search/tool.ts +47 -8
  42. package/src/tools/search/types.ts +45 -0
@@ -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
- const firecrawlScraper = createFirecrawlScraper({
389
- ...firecrawlOptions,
390
- apiKey: firecrawlApiKey ?? process.env.FIRECRAWL_API_KEY,
391
- apiUrl: firecrawlApiUrl,
392
- timeout: scraperTimeout ?? firecrawlOptions?.timeout,
393
- formats: firecrawlOptions?.formats ?? ['markdown', 'rawHtml'],
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
- firecrawlScraper
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;