From 25f460f4547855434e62617449349b41739e3756 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=AD=20Santos?= <140329135+itzraiss@users.noreply.github.com> Date: Sat, 2 Dec 2023 21:22:12 -0300 Subject: [PATCH] =?UTF-8?q?Fix:=20AzureAISearch=20Plugin=20Files=20?= =?UTF-8?q?=F0=9F=94=8E=20(#1259)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update azure_cognitive_search.md * Updated: Azure Cognitive Search Plugin to Azure AI Search Plugin. Update Docs: Azure Cognitive Search Plugin to Azure AI Search Plugin. Updated:.env.example Azure Cognitive Search to Azure AI Search Updated: mkdocs.yml link Updated: SDK Azure 11.3.2 to 12.0.0 * fix:.env AZURE- to AZURE_ * Update azure_ai_search.md * Updated:(api/package.json, package-lock.json): updated for new version the plugin (@azure/search-documents) * fix:Resolved incorrect file name AzureAISearch * fix:.env Azure AI Search * fix:"-" to "_" * Update Docs: Azure AI Search ith an improved tutorial featuring images and easier-to-understand instructions fix: Change name of plugin "Azure Ai Search" to "Azure AI Search" i * Update:Version of REST API versions (Azure AI Search) * Update azure_ai_search.md * Update azure_ai_search.md * Update azure_ai_search.md * fix: docs Azure AI Seach Images were not appearing. * fix:Updated to the new repository with working APIs * Update: Added Compatibility for Previous Environment Variable Names in AzureAISearch Plugin * Update: Added Compatibility for Previous Environment Variable Names in AzureAISearch Plugin * Update: Added Compatibility for Previous Environment Variable Names in AzureAISearch Plugin * Update: Added Compatibility for Previous Environment Variable Names in AzureAISearch Plugin * Update: o AzureAiSearch.js * Atualizar o AzureAISearch.js * Update/fix:EnvironmentVariablesForDeprecation * fix:The file is outdated and needs to be updated. * fix:The file is outdated and needs to be updated. * update: translation portuguese brazilian * Refactor:Improve Readability and Cleanliness of AzureAISearch Class * Update AzureAiSearch.js * Update AzureAISearch.js * fix:getServiceEndpoint * fix: getServiceEndpoint * fix:AzureAISearch * fix: Fix functions erros AzureAISearch * fix: Update API_VERSION * fix: AzureAISearch files outdated --- api/app/clients/tools/AzureAiSearch.js | 89 ++++++++++++------- .../clients/tools/structured/AzureAISearch.js | 78 +++++++++------- 2 files changed, 100 insertions(+), 67 deletions(-) diff --git a/api/app/clients/tools/AzureAiSearch.js b/api/app/clients/tools/AzureAiSearch.js index 7a5742b175..0a552884df 100644 --- a/api/app/clients/tools/AzureAiSearch.js +++ b/api/app/clients/tools/AzureAiSearch.js @@ -1,56 +1,77 @@ -const { Tool } = require('langchain/tools'); +const { StructuredTool } = require('langchain/tools'); +const { z } = require('zod'); const { SearchClient, AzureKeyCredential } = require('@azure/search-documents'); -class AzureAISearch extends Tool { +class AzureAISearch extends StructuredTool { + // 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.initializeProperties(fields); - this.initializeClient(); + + // 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.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.'); + } + + // Create SearchClient + this.client = new SearchClient( + this.serviceEndpoint, + this.indexName, + new AzureKeyCredential(this.apiKey), + { apiVersion: this.apiVersion } + ); + + // Define schema + this.schema = z.object({ + query: z.string().describe('Search word or phrase to Azure AI Search'), + }); } - initializeProperties(fields) { - const getValue = (fieldNames, defaultValue) => { - for (const name of fieldNames) { - const value = fields[name] || process.env[name]; - if (value !== undefined && value !== null) return value; - } - return defaultValue; - }; - - this.serviceEndpoint = getValue(['AZURE_AI_SEARCH_SERVICE_ENDPOINT', 'AZURE_COGNITIVE_SEARCH_SERVICE_ENDPOINT'], this.getServiceEndpoint()); - this.indexName = getValue(['AZURE_AI_SEARCH_INDEX_NAME', 'AZURE_COGNITIVE_SEARCH_INDEX_NAME'], this.getIndexName()); - this.apiKey = getValue(['AZURE_AI_SEARCH_API_KEY', 'AZURE_COGNITIVE_SEARCH_API_KEY'], this.getApiKey()); - this.apiVersion = getValue(['AZURE_AI_SEARCH_API_VERSION', 'AZURE_COGNITIVE_SEARCH_API_VERSION'], AzureAISearch.DEFAULT_API_VERSION); - this.queryType = getValue(['AZURE_AI_SEARCH_SEARCH_OPTION_QUERY_TYPE', 'AZURE_COGNITIVE_SEARCH_SEARCH_OPTION_QUERY_TYPE'], AzureAISearch.DEFAULT_QUERY_TYPE); - this.top = getValue(['AZURE_AI_SEARCH_SEARCH_OPTION_TOP', 'AZURE_COGNITIVE_SEARCH_SEARCH_OPTION_TOP'], AzureAISearch.DEFAULT_TOP); - this.select = this.getSelect(); + // Simplified getter methods + get name() { + return 'azure-ai-search'; } - initializeClient() { - this.client = new SearchClient(this.serviceEndpoint, this.indexName, new AzureKeyCredential(this.apiKey), { apiVersion: this.apiVersion }); + get description() { + return 'Use the \'azure-ai-search\' tool to retrieve search results relevant to your input'; } - name = 'azure-ai-search'; - - description = - 'Use the \'azure-ai-search\' tool to retrieve search results relevant to your input'; - - async _call(query) { + // Improved error handling and logging + async _call(data) { + const { query } = data; try { - const searchOptions = { + const searchOption = { queryType: this.queryType, top: this.top, - select: this.select }; - - const searchResults = await this.client.search(query, searchOptions); - return JSON.stringify(searchResults.results.map(result => result.document)); + 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) { - console.error(`Azure AI Search request failed: ${error}`); + console.error(`Azure AI Search request failed: ${error.message}`); return 'There was an error with Azure AI Search.'; } } diff --git a/api/app/clients/tools/structured/AzureAISearch.js b/api/app/clients/tools/structured/AzureAISearch.js index 8d22ced0b1..0a552884df 100644 --- a/api/app/clients/tools/structured/AzureAISearch.js +++ b/api/app/clients/tools/structured/AzureAISearch.js @@ -3,63 +3,75 @@ const { z } = require('zod'); const { SearchClient, AzureKeyCredential } = require('@azure/search-documents'); class AzureAISearch extends StructuredTool { + // 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.initializeProperties(fields); - this.initializeClient(); - this.initializeSchema(); - } - initializeProperties(fields) { - const getValue = (fieldNames, defaultValue) => { - for (const name of fieldNames) { - const value = fields[name] || process.env[name]; - if (value !== undefined && value !== null) return value; - } - return defaultValue; - }; + // 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'); - this.serviceEndpoint = getValue(['AZURE_AI_SEARCH_SERVICE_ENDPOINT', 'AZURE_COGNITIVE_SEARCH_SERVICE_ENDPOINT'], this.getServiceEndpoint()); - this.indexName = getValue(['AZURE_AI_SEARCH_INDEX_NAME', 'AZURE_COGNITIVE_SEARCH_INDEX_NAME'], this.getIndexName()); - this.apiKey = getValue(['AZURE_AI_SEARCH_API_KEY', 'AZURE_COGNITIVE_SEARCH_API_KEY'], this.getApiKey()); - this.apiVersion = getValue(['AZURE_AI_SEARCH_API_VERSION', 'AZURE_COGNITIVE_SEARCH_API_VERSION'], AzureAISearch.DEFAULT_API_VERSION); - this.queryType = getValue(['AZURE_AI_SEARCH_SEARCH_OPTION_QUERY_TYPE', 'AZURE_COGNITIVE_SEARCH_SEARCH_OPTION_QUERY_TYPE'], AzureAISearch.DEFAULT_QUERY_TYPE); - this.top = getValue(['AZURE_AI_SEARCH_SEARCH_OPTION_TOP', 'AZURE_COGNITIVE_SEARCH_SEARCH_OPTION_TOP'], AzureAISearch.DEFAULT_TOP); - this.select = this.getSelect(); - } + // Check for required fields + if (!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.'); + } - initializeClient() { - this.client = new SearchClient(this.serviceEndpoint, this.indexName, new AzureKeyCredential(this.apiKey), { apiVersion: this.apiVersion }); - } + // Create SearchClient + this.client = new SearchClient( + this.serviceEndpoint, + this.indexName, + new AzureKeyCredential(this.apiKey), + { apiVersion: this.apiVersion } + ); - initializeSchema() { + // Define schema this.schema = z.object({ query: z.string().describe('Search word or phrase to Azure AI Search'), }); } - name = 'azure-ai-search'; + // Simplified getter methods + get name() { + return 'azure-ai-search'; + } - description = - 'Use the \'azure-ai-search\' tool to retrieve search results relevant to your input'; + get description() { + return 'Use the \'azure-ai-search\' tool to retrieve search results relevant to your input'; + } + // Improved error handling and logging async _call(data) { const { query } = data; try { - const searchOptions = { + const searchOption = { queryType: this.queryType, top: this.top, - select: this.select }; - - const searchResults = await this.client.search(query, searchOptions); - return JSON.stringify(searchResults.results.map(result => result.document)); + 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) { - console.error(`Azure AI Search request failed: ${error}`); + console.error(`Azure AI Search request failed: ${error.message}`); return 'There was an error with Azure AI Search.'; } }