mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-16 16:30:15 +01:00
* adding youtube tool * refactor: use short `url` param instead of `videoUrl` * refactor: move API key retrieval to a separate credentials module * refactor: remove unnecessary `isEdited` message property * refactor: remove unnecessary `isEdited` message property pt. 2 * refactor: YouTube Tool with new `tool()` generator, handle tools already created by new `tool` generator * fix: only reset request data for multi-convo messages * refactor: enhance YouTube tool by adding transcript parsing and returning structured JSON responses * refactor: update transcript parsing to handle raw response and clean up text output * feat: support toolkits and refactor YouTube tool as a toolkit for better LLM usage * refactor: remove unused OpenAPI specs and streamline tools transformation in loadAsyncEndpoints * refactor: implement manifestToolMap for better tool management and streamline authentication handling * feat: support toolkits for assistants * refactor: rename loadedTools to toolDefinitions for clarity in PluginController and assistant controllers * feat: complete support of toolkits for assistants --------- Co-authored-by: Danilo Pejakovic <danilo.pejakovic@leoninestudios.com>
70 lines
2.2 KiB
JavaScript
70 lines
2.2 KiB
JavaScript
const { z } = require('zod');
|
|
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 response = await fetch('https://api.tavily.com/search', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify(requestBody),
|
|
});
|
|
|
|
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;
|