| | const { z } = require('zod'); |
| | const { Tool } = require('@langchain/core/tools'); |
| | const { logger } = require('@librechat/data-schemas'); |
| | const { SearchClient, AzureKeyCredential } = require('@azure/search-documents'); |
| |
|
| | class AzureAISearch extends Tool { |
| | |
| | static DEFAULT_API_VERSION = '2023-11-01'; |
| | static DEFAULT_QUERY_TYPE = 'simple'; |
| | static DEFAULT_TOP = 5; |
| |
|
| | |
| | _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"; |
| | |
| | this.override = fields.override ?? false; |
| |
|
| | |
| | this.schema = z.object({ |
| | query: z.string().describe('Search word or phrase to Azure AI Search'), |
| | }); |
| |
|
| | |
| | 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', |
| | ); |
| |
|
| | |
| | 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; |
| | } |
| |
|
| | |
| | this.client = new SearchClient( |
| | this.serviceEndpoint, |
| | this.indexName, |
| | new AzureKeyCredential(this.apiKey), |
| | { apiVersion: this.apiVersion }, |
| | ); |
| | } |
| |
|
| | |
| | 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; |
| |
|