mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-16 16:30:15 +01:00
* 🖥️ feat: Add Proxy Support for Tavily API Tool
- Integrated ProxyAgent from undici to enable proxy support for API requests in TavilySearch and TavilySearchResults.
- Updated fetch options to conditionally include the proxy configuration based on the environment variable, enhancing flexibility for network requests.
* ci: TavilySearchResults with Proxy Support Tests
- Added tests to verify the integration of ProxyAgent for API requests in TavilySearchResults.
- Implemented conditional logic to check for the PROXY environment variable, ensuring correct usage of ProxyAgent based on its presence.
- Updated test setup to clear mocks before each test for improved isolation and reliability.
77 lines
2.4 KiB
JavaScript
77 lines
2.4 KiB
JavaScript
const { z } = require('zod');
|
|
const { ProxyAgent, fetch } = require('undici');
|
|
const { tool } = require('@langchain/core/tools');
|
|
const { getApiKey } = require('./credentials');
|
|
|
|
function createTavilySearchTool(fields = {}) {
|
|
const envVar = 'TAVILY_API_KEY';
|
|
const override = fields.override ?? false;
|
|
const apiKey = fields.apiKey ?? getApiKey(envVar, override);
|
|
const kwargs = fields?.kwargs ?? {};
|
|
|
|
return tool(
|
|
async (input) => {
|
|
const { query, ...rest } = input;
|
|
|
|
const requestBody = {
|
|
api_key: apiKey,
|
|
query,
|
|
...rest,
|
|
...kwargs,
|
|
};
|
|
|
|
const fetchOptions = {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify(requestBody),
|
|
};
|
|
|
|
if (process.env.PROXY) {
|
|
fetchOptions.dispatcher = new ProxyAgent(process.env.PROXY);
|
|
}
|
|
|
|
const response = await fetch('https://api.tavily.com/search', fetchOptions);
|
|
|
|
const json = await response.json();
|
|
if (!response.ok) {
|
|
throw new Error(`Request failed with status ${response.status}: ${json.error}`);
|
|
}
|
|
|
|
return JSON.stringify(json);
|
|
},
|
|
{
|
|
name: 'tavily_search_results_json',
|
|
description:
|
|
'A search engine optimized for comprehensive, accurate, and trusted results. Useful for when you need to answer questions about current events.',
|
|
schema: z.object({
|
|
query: z.string().min(1).describe('The search query string.'),
|
|
max_results: z
|
|
.number()
|
|
.min(1)
|
|
.max(10)
|
|
.optional()
|
|
.describe('The maximum number of search results to return. Defaults to 5.'),
|
|
search_depth: z
|
|
.enum(['basic', 'advanced'])
|
|
.optional()
|
|
.describe(
|
|
'The depth of the search, affecting result quality and response time (`basic` or `advanced`). Default is basic for quick results and advanced for indepth high quality results but longer response time. Advanced calls equals 2 requests.',
|
|
),
|
|
include_images: z
|
|
.boolean()
|
|
.optional()
|
|
.describe(
|
|
'Whether to include a list of query-related images in the response. Default is False.',
|
|
),
|
|
include_answer: z
|
|
.boolean()
|
|
.optional()
|
|
.describe('Whether to include answers in the search results. Default is False.'),
|
|
}),
|
|
},
|
|
);
|
|
}
|
|
|
|
module.exports = createTavilySearchTool;
|