@librechat/agents 2.4.31 → 2.4.33

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 (115) hide show
  1. package/dist/cjs/events.cjs +3 -3
  2. package/dist/cjs/events.cjs.map +1 -1
  3. package/dist/cjs/graphs/Graph.cjs +2 -1
  4. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  5. package/dist/cjs/main.cjs +5 -2
  6. package/dist/cjs/main.cjs.map +1 -1
  7. package/dist/cjs/messages/ids.cjs +23 -0
  8. package/dist/cjs/messages/ids.cjs.map +1 -0
  9. package/dist/cjs/splitStream.cjs +2 -1
  10. package/dist/cjs/splitStream.cjs.map +1 -1
  11. package/dist/cjs/stream.cjs +87 -154
  12. package/dist/cjs/stream.cjs.map +1 -1
  13. package/dist/cjs/tools/ToolNode.cjs +14 -3
  14. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  15. package/dist/cjs/tools/handlers.cjs +144 -0
  16. package/dist/cjs/tools/handlers.cjs.map +1 -0
  17. package/dist/cjs/tools/search/content.cjs +140 -0
  18. package/dist/cjs/tools/search/content.cjs.map +1 -0
  19. package/dist/cjs/tools/search/firecrawl.cjs +23 -41
  20. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  21. package/dist/cjs/tools/search/format.cjs +161 -74
  22. package/dist/cjs/tools/search/format.cjs.map +1 -1
  23. package/dist/cjs/tools/search/highlights.cjs +64 -12
  24. package/dist/cjs/tools/search/highlights.cjs.map +1 -1
  25. package/dist/cjs/tools/search/rerankers.cjs +43 -36
  26. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  27. package/dist/cjs/tools/search/schema.cjs +70 -0
  28. package/dist/cjs/tools/search/schema.cjs.map +1 -0
  29. package/dist/cjs/tools/search/search.cjs +150 -69
  30. package/dist/cjs/tools/search/search.cjs.map +1 -1
  31. package/dist/cjs/tools/search/tool.cjs +247 -58
  32. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  33. package/dist/cjs/tools/search/utils.cjs +66 -0
  34. package/dist/cjs/tools/search/utils.cjs.map +1 -0
  35. package/dist/esm/events.mjs +1 -1
  36. package/dist/esm/events.mjs.map +1 -1
  37. package/dist/esm/graphs/Graph.mjs +2 -1
  38. package/dist/esm/graphs/Graph.mjs.map +1 -1
  39. package/dist/esm/main.mjs +3 -1
  40. package/dist/esm/main.mjs.map +1 -1
  41. package/dist/esm/messages/ids.mjs +21 -0
  42. package/dist/esm/messages/ids.mjs.map +1 -0
  43. package/dist/esm/splitStream.mjs +2 -1
  44. package/dist/esm/splitStream.mjs.map +1 -1
  45. package/dist/esm/stream.mjs +87 -152
  46. package/dist/esm/stream.mjs.map +1 -1
  47. package/dist/esm/tools/ToolNode.mjs +14 -3
  48. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  49. package/dist/esm/tools/handlers.mjs +141 -0
  50. package/dist/esm/tools/handlers.mjs.map +1 -0
  51. package/dist/esm/tools/search/content.mjs +119 -0
  52. package/dist/esm/tools/search/content.mjs.map +1 -0
  53. package/dist/esm/tools/search/firecrawl.mjs +24 -41
  54. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  55. package/dist/esm/tools/search/format.mjs +161 -74
  56. package/dist/esm/tools/search/format.mjs.map +1 -1
  57. package/dist/esm/tools/search/highlights.mjs +64 -12
  58. package/dist/esm/tools/search/highlights.mjs.map +1 -1
  59. package/dist/esm/tools/search/rerankers.mjs +43 -36
  60. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  61. package/dist/esm/tools/search/schema.mjs +61 -0
  62. package/dist/esm/tools/search/schema.mjs.map +1 -0
  63. package/dist/esm/tools/search/search.mjs +150 -69
  64. package/dist/esm/tools/search/search.mjs.map +1 -1
  65. package/dist/esm/tools/search/tool.mjs +246 -57
  66. package/dist/esm/tools/search/tool.mjs.map +1 -1
  67. package/dist/esm/tools/search/utils.mjs +61 -0
  68. package/dist/esm/tools/search/utils.mjs.map +1 -0
  69. package/dist/types/graphs/Graph.d.ts +1 -1
  70. package/dist/types/index.d.ts +1 -0
  71. package/dist/types/messages/ids.d.ts +3 -0
  72. package/dist/types/messages/index.d.ts +1 -0
  73. package/dist/types/stream.d.ts +0 -8
  74. package/dist/types/tools/ToolNode.d.ts +6 -0
  75. package/dist/types/tools/example.d.ts +23 -3
  76. package/dist/types/tools/handlers.d.ts +8 -0
  77. package/dist/types/tools/search/content.d.ts +4 -0
  78. package/dist/types/tools/search/firecrawl.d.ts +7 -86
  79. package/dist/types/tools/search/format.d.ts +4 -1
  80. package/dist/types/tools/search/highlights.d.ts +1 -1
  81. package/dist/types/tools/search/rerankers.d.ts +8 -4
  82. package/dist/types/tools/search/schema.d.ts +16 -0
  83. package/dist/types/tools/search/search.d.ts +2 -2
  84. package/dist/types/tools/search/test.d.ts +1 -0
  85. package/dist/types/tools/search/tool.d.ts +25 -4
  86. package/dist/types/tools/search/types.d.ts +443 -53
  87. package/dist/types/tools/search/utils.d.ts +10 -0
  88. package/package.json +9 -7
  89. package/src/events.ts +49 -15
  90. package/src/graphs/Graph.ts +6 -2
  91. package/src/index.ts +1 -0
  92. package/src/messages/ids.ts +26 -0
  93. package/src/messages/index.ts +1 -0
  94. package/src/scripts/search.ts +8 -3
  95. package/src/splitStream.test.ts +132 -71
  96. package/src/splitStream.ts +2 -1
  97. package/src/stream.ts +94 -183
  98. package/src/tools/ToolNode.ts +37 -14
  99. package/src/tools/handlers.ts +167 -0
  100. package/src/tools/search/content.test.ts +173 -0
  101. package/src/tools/search/content.ts +147 -0
  102. package/src/tools/search/firecrawl.ts +36 -148
  103. package/src/tools/search/format.ts +205 -74
  104. package/src/tools/search/highlights.ts +99 -16
  105. package/src/tools/search/output.md +2775 -0
  106. package/src/tools/search/rerankers.ts +57 -36
  107. package/src/tools/search/schema.ts +63 -0
  108. package/src/tools/search/search.ts +230 -117
  109. package/src/tools/search/test.html +884 -0
  110. package/src/tools/search/test.md +643 -0
  111. package/src/tools/search/test.ts +159 -0
  112. package/src/tools/search/tool.ts +363 -87
  113. package/src/tools/search/types.ts +503 -61
  114. package/src/tools/search/utils.ts +79 -0
  115. package/src/utils/llmConfig.ts +1 -1
@@ -1,12 +1,14 @@
1
- /* eslint-disable no-console */
2
1
  import axios from 'axios';
3
2
  import type * as t from './types';
3
+ import { createDefaultLogger } from './utils';
4
4
 
5
5
  export abstract class BaseReranker {
6
6
  protected apiKey: string | undefined;
7
+ protected logger: t.Logger;
7
8
 
8
- constructor() {
9
+ constructor(logger?: t.Logger) {
9
10
  // Each specific reranker will set its API key
11
+ this.logger = logger || createDefaultLogger();
10
12
  }
11
13
 
12
14
  abstract rerank(
@@ -25,16 +27,22 @@ export abstract class BaseReranker {
25
27
  }
26
28
 
27
29
  protected logDocumentSamples(documents: string[]): void {
28
- console.log('Sample documents being sent to API:');
30
+ this.logger.debug('Sample documents being sent to API:');
29
31
  for (let i = 0; i < Math.min(3, documents.length); i++) {
30
- console.log(`Document ${i}: ${documents[i].substring(0, 100)}...`);
32
+ this.logger.debug(`Document ${i}: ${documents[i].substring(0, 100)}...`);
31
33
  }
32
34
  }
33
35
  }
34
36
 
35
37
  export class JinaReranker extends BaseReranker {
36
- constructor({ apiKey = process.env.JINA_API_KEY }: { apiKey?: string }) {
37
- super();
38
+ constructor({
39
+ apiKey = process.env.JINA_API_KEY,
40
+ logger,
41
+ }: {
42
+ apiKey?: string;
43
+ logger?: t.Logger;
44
+ }) {
45
+ super(logger);
38
46
  this.apiKey = apiKey;
39
47
  }
40
48
 
@@ -43,11 +51,11 @@ export class JinaReranker extends BaseReranker {
43
51
  documents: string[],
44
52
  topK: number = 5
45
53
  ): Promise<t.Highlight[]> {
46
- console.log(`Reranking ${documents.length} documents with Jina`);
54
+ this.logger.debug(`Reranking ${documents.length} documents with Jina`);
47
55
 
48
56
  try {
49
57
  if (this.apiKey == null || this.apiKey === '') {
50
- console.warn('JINA_API_KEY is not set. Using default ranking.');
58
+ this.logger.warn('JINA_API_KEY is not set. Using default ranking.');
51
59
  return this.getDefaultRanking(documents, topK);
52
60
  }
53
61
 
@@ -73,14 +81,14 @@ export class JinaReranker extends BaseReranker {
73
81
  );
74
82
 
75
83
  // Log the response data structure
76
- console.log('Jina API response structure:');
77
- console.log('Model:', response.data?.model);
78
- console.log('Usage:', response.data?.usage);
79
- console.log('Results count:', response.data?.results.length);
84
+ this.logger.debug('Jina API response structure:');
85
+ this.logger.debug('Model:', response.data?.model);
86
+ this.logger.debug('Usage:', response.data?.usage);
87
+ this.logger.debug('Results count:', response.data?.results.length);
80
88
 
81
89
  // Log a sample of the results
82
90
  if ((response.data?.results.length ?? 0) > 0) {
83
- console.log(
91
+ this.logger.debug(
84
92
  'Sample result:',
85
93
  JSON.stringify(response.data?.results[0], null, 2)
86
94
  );
@@ -108,13 +116,13 @@ export class JinaReranker extends BaseReranker {
108
116
  return { text, score };
109
117
  });
110
118
  } else {
111
- console.warn(
119
+ this.logger.warn(
112
120
  'Unexpected response format from Jina API. Using default ranking.'
113
121
  );
114
122
  return this.getDefaultRanking(documents, topK);
115
123
  }
116
124
  } catch (error) {
117
- console.error('Error using Jina reranker:', error);
125
+ this.logger.error('Error using Jina reranker:', error);
118
126
  // Fallback to default ranking on error
119
127
  return this.getDefaultRanking(documents, topK);
120
128
  }
@@ -122,8 +130,14 @@ export class JinaReranker extends BaseReranker {
122
130
  }
123
131
 
124
132
  export class CohereReranker extends BaseReranker {
125
- constructor({ apiKey = process.env.COHERE_API_KEY }: { apiKey?: string }) {
126
- super();
133
+ constructor({
134
+ apiKey = process.env.COHERE_API_KEY,
135
+ logger,
136
+ }: {
137
+ apiKey?: string;
138
+ logger?: t.Logger;
139
+ }) {
140
+ super(logger);
127
141
  this.apiKey = apiKey;
128
142
  }
129
143
 
@@ -132,11 +146,11 @@ export class CohereReranker extends BaseReranker {
132
146
  documents: string[],
133
147
  topK: number = 5
134
148
  ): Promise<t.Highlight[]> {
135
- console.log(`Reranking ${documents.length} documents with Cohere`);
149
+ this.logger.debug(`Reranking ${documents.length} documents with Cohere`);
136
150
 
137
151
  try {
138
152
  if (this.apiKey == null || this.apiKey === '') {
139
- console.warn('COHERE_API_KEY is not set. Using default ranking.');
153
+ this.logger.warn('COHERE_API_KEY is not set. Using default ranking.');
140
154
  return this.getDefaultRanking(documents, topK);
141
155
  }
142
156
 
@@ -161,14 +175,14 @@ export class CohereReranker extends BaseReranker {
161
175
  );
162
176
 
163
177
  // Log the response data structure
164
- console.log('Cohere API response structure:');
165
- console.log('ID:', response.data?.id);
166
- console.log('Meta:', response.data?.meta);
167
- console.log('Results count:', response.data?.results.length);
178
+ this.logger.debug('Cohere API response structure:');
179
+ this.logger.debug('ID:', response.data?.id);
180
+ this.logger.debug('Meta:', response.data?.meta);
181
+ this.logger.debug('Results count:', response.data?.results.length);
168
182
 
169
183
  // Log a sample of the results
170
184
  if ((response.data?.results.length ?? 0) > 0) {
171
- console.log(
185
+ this.logger.debug(
172
186
  'Sample result:',
173
187
  JSON.stringify(response.data?.results[0], null, 2)
174
188
  );
@@ -182,13 +196,13 @@ export class CohereReranker extends BaseReranker {
182
196
  return { text, score };
183
197
  });
184
198
  } else {
185
- console.warn(
199
+ this.logger.warn(
186
200
  'Unexpected response format from Cohere API. Using default ranking.'
187
201
  );
188
202
  return this.getDefaultRanking(documents, topK);
189
203
  }
190
204
  } catch (error) {
191
- console.error('Error using Cohere reranker:', error);
205
+ this.logger.error('Error using Cohere reranker:', error);
192
206
  // Fallback to default ranking on error
193
207
  return this.getDefaultRanking(documents, topK);
194
208
  }
@@ -196,8 +210,8 @@ export class CohereReranker extends BaseReranker {
196
210
  }
197
211
 
198
212
  export class InfinityReranker extends BaseReranker {
199
- constructor() {
200
- super();
213
+ constructor(logger?: t.Logger) {
214
+ super(logger);
201
215
  // No API key needed for the placeholder implementation
202
216
  }
203
217
 
@@ -206,7 +220,7 @@ export class InfinityReranker extends BaseReranker {
206
220
  documents: string[],
207
221
  topK: number = 5
208
222
  ): Promise<t.Highlight[]> {
209
- console.log(
223
+ this.logger.debug(
210
224
  `Reranking ${documents.length} documents with Infinity (placeholder)`
211
225
  );
212
226
  // This would be replaced with actual Infinity reranker implementation
@@ -221,24 +235,31 @@ export const createReranker = (config: {
221
235
  rerankerType: t.RerankerType;
222
236
  jinaApiKey?: string;
223
237
  cohereApiKey?: string;
238
+ logger?: t.Logger;
224
239
  }): BaseReranker | undefined => {
225
- const { rerankerType, jinaApiKey, cohereApiKey } = config;
240
+ const { rerankerType, jinaApiKey, cohereApiKey, logger } = config;
241
+
242
+ // Create a default logger if none is provided
243
+ const defaultLogger = logger || createDefaultLogger();
226
244
 
227
245
  switch (rerankerType.toLowerCase()) {
228
246
  case 'jina':
229
- return new JinaReranker({ apiKey: jinaApiKey });
247
+ return new JinaReranker({ apiKey: jinaApiKey, logger: defaultLogger });
230
248
  case 'cohere':
231
- return new CohereReranker({ apiKey: cohereApiKey });
249
+ return new CohereReranker({
250
+ apiKey: cohereApiKey,
251
+ logger: defaultLogger,
252
+ });
232
253
  case 'infinity':
233
- return new InfinityReranker();
254
+ return new InfinityReranker(defaultLogger);
234
255
  case 'none':
235
- console.log('Skipping reranking as reranker is set to "none"');
256
+ defaultLogger.debug('Skipping reranking as reranker is set to "none"');
236
257
  return undefined;
237
258
  default:
238
- console.warn(
259
+ defaultLogger.warn(
239
260
  `Unknown reranker type: ${rerankerType}. Defaulting to InfinityReranker.`
240
261
  );
241
- return new JinaReranker({ apiKey: jinaApiKey });
262
+ return new JinaReranker({ apiKey: jinaApiKey, logger: defaultLogger });
242
263
  }
243
264
  };
244
265
 
@@ -0,0 +1,63 @@
1
+ import { z } from 'zod';
2
+
3
+ export enum DATE_RANGE {
4
+ PAST_HOUR = 'h',
5
+ PAST_24_HOURS = 'd',
6
+ PAST_WEEK = 'w',
7
+ PAST_MONTH = 'm',
8
+ PAST_YEAR = 'y',
9
+ }
10
+
11
+ export const DEFAULT_QUERY_DESCRIPTION = `
12
+ GUIDELINES:
13
+ - Start broad, then narrow: Begin with key concepts, then refine with specifics
14
+ - Think like sources: Use terminology experts would use in the field
15
+ - Consider perspective: Frame queries from different viewpoints for better results
16
+ - Quality over quantity: A precise 3-4 word query often beats lengthy sentences
17
+
18
+ TECHNIQUES (combine for power searches):
19
+ - EXACT PHRASES: Use quotes ("climate change report")
20
+ - EXCLUDE TERMS: Use minus to remove unwanted results (-wikipedia)
21
+ - SITE-SPECIFIC: Restrict to websites (site:edu research)
22
+ - FILETYPE: Find specific documents (filetype:pdf study)
23
+ - OR OPERATOR: Find alternatives (electric OR hybrid cars)
24
+ - DATE RANGE: Recent information (data after:2020)
25
+ - WILDCARDS: Use * for unknown terms (how to * bread)
26
+ - SPECIFIC QUESTIONS: Use who/what/when/where/why/how
27
+ - DOMAIN TERMS: Include technical terminology for specialized topics
28
+ - CONCISE TERMS: Prioritize keywords over sentences
29
+ `.trim();
30
+
31
+ export const DEFAULT_COUNTRY_DESCRIPTION =
32
+ `Country code to localize search results.
33
+ Use standard 2-letter country codes: "us", "uk", "ca", "de", "fr", "jp", "br", etc.
34
+ Provide this when the search should return results specific to a particular country.
35
+ Examples:
36
+ - "us" for United States (default)
37
+ - "de" for Germany
38
+ - "in" for India
39
+ `.trim();
40
+
41
+ export const querySchema = z.string().describe(DEFAULT_QUERY_DESCRIPTION);
42
+ export const dateSchema = z
43
+ .nativeEnum(DATE_RANGE)
44
+ .optional()
45
+ .describe('Date range for search results.');
46
+ export const countrySchema = z
47
+ .string()
48
+ .optional()
49
+ .describe(DEFAULT_COUNTRY_DESCRIPTION);
50
+ export const imagesSchema = z
51
+ .boolean()
52
+ .optional()
53
+ .describe('Whether to also run an image search.');
54
+
55
+ export const videosSchema = z
56
+ .boolean()
57
+ .optional()
58
+ .describe('Whether to also run a video search.');
59
+
60
+ export const newsSchema = z
61
+ .boolean()
62
+ .optional()
63
+ .describe('Whether to also run a news search.');