mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-17 17:00:15 +01:00
* fix: agent initialization, add `collectedUsage` handling * style: improve side panel styling * refactor(loadAgent): Optimize order agent project ID retrieval * feat: code execution * fix: typing issues * feat: ExecuteCode content part * refactor: use local state for default collapsed state of analysis content parts * fix: code parsing in ExecuteCode component * chore: bump agents package, export loadAuthValues * refactor: Update handleTools.js to use EnvVar for code execution tool authentication * WIP * feat: download code outputs * fix(useEventHandlers): type issues * feat: backend handling for code outputs * Refactor: Remove console.log statement in Part.tsx * refactor: add attachments to TMessage/messageSchema * WIP: prelim handling for code outputs * feat: attachments rendering * refactor: improve attachments rendering * fix: attachments, nullish edge case, handle attachments from event stream, bump agents package * fix filename download * fix: tool assignment for 'run code' on agent creation * fix: image handling by adding attachments * refactor: prevent agent creation without provider/model * refactor: remove unnecessary space in agent creation success message * refactor: select first model if selecting provider from empty on form * fix: Agent avatar bug * fix: `defaultAgentFormValues` causing boolean typing issue and typeerror * fix: capabilities counting as tools, causing duplication of them * fix: formatted messages edge case where consecutive content text type parts with the latter having tool_call_ids would cause consecutive AI messages to be created. furthermore, content could not be an array for tool_use messages (anthropic limitation) * chore: bump @librechat/agents dependency to version 1.6.9 * feat: bedrock agents * feat: new Agents icon * feat: agent titling * feat: agent landing * refactor: allow sharing agent globally only if user is admin or author * feat: initial AgentPanelSkeleton * feat: AgentPanelSkeleton * feat: collaborative agents * chore: add potential authorName as part of schema * chore: Remove unnecessary console.log statement * WIP: agent model parameters * chore: ToolsDialog typing and tool related localization chnages * refactor: update tool instance type (latest langchain class), and rename google tool to 'google' proper * chore: add back tools * feat: Agent knowledge files upload * refactor: better verbiage for disabled knowledge * chore: debug logs for file deletions * chore: debug logs for file deletions * feat: upload/delete agent knowledge/file-search files * feat: file search UI for agents * feat: first pass, file search tool * chore: update default agent capabilities and info
104 lines
3.3 KiB
JavaScript
104 lines
3.3 KiB
JavaScript
const { z } = require('zod');
|
|
const { Tool } = require('@langchain/core/tools');
|
|
const { SearchClient, AzureKeyCredential } = require('@azure/search-documents');
|
|
const { logger } = require('~/config');
|
|
|
|
class AzureAISearch extends Tool {
|
|
// Constants for default values
|
|
static DEFAULT_API_VERSION = '2023-11-01';
|
|
static DEFAULT_QUERY_TYPE = 'simple';
|
|
static DEFAULT_TOP = 5;
|
|
|
|
// Helper function for initializing properties
|
|
_initializeField(field, envVar, defaultValue) {
|
|
return field || process.env[envVar] || defaultValue;
|
|
}
|
|
|
|
constructor(fields = {}) {
|
|
super();
|
|
this.name = 'azure-ai-search';
|
|
this.description =
|
|
'Use the \'azure-ai-search\' tool to retrieve search results relevant to your input';
|
|
/* Used to initialize the Tool without necessary variables. */
|
|
this.override = fields.override ?? false;
|
|
|
|
// Define schema
|
|
this.schema = z.object({
|
|
query: z.string().describe('Search word or phrase to Azure AI Search'),
|
|
});
|
|
|
|
// Initialize properties using helper function
|
|
this.serviceEndpoint = this._initializeField(
|
|
fields.AZURE_AI_SEARCH_SERVICE_ENDPOINT,
|
|
'AZURE_AI_SEARCH_SERVICE_ENDPOINT',
|
|
);
|
|
this.indexName = this._initializeField(
|
|
fields.AZURE_AI_SEARCH_INDEX_NAME,
|
|
'AZURE_AI_SEARCH_INDEX_NAME',
|
|
);
|
|
this.apiKey = this._initializeField(fields.AZURE_AI_SEARCH_API_KEY, 'AZURE_AI_SEARCH_API_KEY');
|
|
this.apiVersion = this._initializeField(
|
|
fields.AZURE_AI_SEARCH_API_VERSION,
|
|
'AZURE_AI_SEARCH_API_VERSION',
|
|
AzureAISearch.DEFAULT_API_VERSION,
|
|
);
|
|
this.queryType = this._initializeField(
|
|
fields.AZURE_AI_SEARCH_SEARCH_OPTION_QUERY_TYPE,
|
|
'AZURE_AI_SEARCH_SEARCH_OPTION_QUERY_TYPE',
|
|
AzureAISearch.DEFAULT_QUERY_TYPE,
|
|
);
|
|
this.top = this._initializeField(
|
|
fields.AZURE_AI_SEARCH_SEARCH_OPTION_TOP,
|
|
'AZURE_AI_SEARCH_SEARCH_OPTION_TOP',
|
|
AzureAISearch.DEFAULT_TOP,
|
|
);
|
|
this.select = this._initializeField(
|
|
fields.AZURE_AI_SEARCH_SEARCH_OPTION_SELECT,
|
|
'AZURE_AI_SEARCH_SEARCH_OPTION_SELECT',
|
|
);
|
|
|
|
// Check for required fields
|
|
if (!this.override && (!this.serviceEndpoint || !this.indexName || !this.apiKey)) {
|
|
throw new Error(
|
|
'Missing AZURE_AI_SEARCH_SERVICE_ENDPOINT, AZURE_AI_SEARCH_INDEX_NAME, or AZURE_AI_SEARCH_API_KEY environment variable.',
|
|
);
|
|
}
|
|
|
|
if (this.override) {
|
|
return;
|
|
}
|
|
|
|
// Create SearchClient
|
|
this.client = new SearchClient(
|
|
this.serviceEndpoint,
|
|
this.indexName,
|
|
new AzureKeyCredential(this.apiKey),
|
|
{ apiVersion: this.apiVersion },
|
|
);
|
|
}
|
|
|
|
// Improved error handling and logging
|
|
async _call(data) {
|
|
const { query } = data;
|
|
try {
|
|
const searchOption = {
|
|
queryType: this.queryType,
|
|
top: typeof this.top === 'string' ? Number(this.top) : this.top,
|
|
};
|
|
if (this.select) {
|
|
searchOption.select = this.select.split(',');
|
|
}
|
|
const searchResults = await this.client.search(query, searchOption);
|
|
const resultDocuments = [];
|
|
for await (const result of searchResults.results) {
|
|
resultDocuments.push(result.document);
|
|
}
|
|
return JSON.stringify(resultDocuments);
|
|
} catch (error) {
|
|
logger.error('Azure AI Search request failed', error);
|
|
return 'There was an error with Azure AI Search.';
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = AzureAISearch;
|