Spaces:
Runtime error
Runtime error
| const { Tool } = require('langchain/tools'); | |
| const { google } = require('googleapis'); | |
| /** | |
| * Represents a tool that allows an agent to use the Google Custom Search API. | |
| * @extends Tool | |
| */ | |
| class GoogleSearchAPI extends Tool { | |
| constructor(fields = {}) { | |
| super(); | |
| this.cx = fields.GOOGLE_CSE_ID || this.getCx(); | |
| this.apiKey = fields.GOOGLE_API_KEY || this.getApiKey(); | |
| this.customSearch = undefined; | |
| } | |
| /** | |
| * The name of the tool. | |
| * @type {string} | |
| */ | |
| name = 'google'; | |
| /** | |
| * A description for the agent to use | |
| * @type {string} | |
| */ | |
| description = | |
| 'Use the \'google\' tool to retrieve internet search results relevant to your input. The results will return links and snippets of text from the webpages'; | |
| getCx() { | |
| const cx = process.env.GOOGLE_CSE_ID || ''; | |
| if (!cx) { | |
| throw new Error('Missing GOOGLE_CSE_ID environment variable.'); | |
| } | |
| return cx; | |
| } | |
| getApiKey() { | |
| const apiKey = process.env.GOOGLE_API_KEY || ''; | |
| if (!apiKey) { | |
| throw new Error('Missing GOOGLE_API_KEY environment variable.'); | |
| } | |
| return apiKey; | |
| } | |
| getCustomSearch() { | |
| if (!this.customSearch) { | |
| const version = 'v1'; | |
| this.customSearch = google.customsearch(version); | |
| } | |
| return this.customSearch; | |
| } | |
| resultsToReadableFormat(results) { | |
| let output = 'Results:\n'; | |
| results.forEach((resultObj, index) => { | |
| output += `Title: ${resultObj.title}\n`; | |
| output += `Link: ${resultObj.link}\n`; | |
| if (resultObj.snippet) { | |
| output += `Snippet: ${resultObj.snippet}\n`; | |
| } | |
| if (index < results.length - 1) { | |
| output += '\n'; | |
| } | |
| }); | |
| return output; | |
| } | |
| /** | |
| * Calls the tool with the provided input and returns a promise that resolves with a response from the Google Custom Search API. | |
| * @param {string} input - The input to provide to the API. | |
| * @returns {Promise<String>} A promise that resolves with a response from the Google Custom Search API. | |
| */ | |
| async _call(input) { | |
| try { | |
| const metadataResults = []; | |
| const response = await this.getCustomSearch().cse.list({ | |
| q: input, | |
| cx: this.cx, | |
| auth: this.apiKey, | |
| num: 5, // Limit the number of results to 5 | |
| }); | |
| // return response.data; | |
| // console.log(response.data); | |
| if (!response.data.items || response.data.items.length === 0) { | |
| return this.resultsToReadableFormat([ | |
| { title: 'No good Google Search Result was found', link: '' }, | |
| ]); | |
| } | |
| // const results = response.items.slice(0, numResults); | |
| const results = response.data.items; | |
| for (const result of results) { | |
| const metadataResult = { | |
| title: result.title || '', | |
| link: result.link || '', | |
| }; | |
| if (result.snippet) { | |
| metadataResult.snippet = result.snippet; | |
| } | |
| metadataResults.push(metadataResult); | |
| } | |
| return this.resultsToReadableFormat(metadataResults); | |
| } catch (error) { | |
| console.log(`Error searching Google: ${error}`); | |
| // throw error; | |
| return 'There was an error searching Google.'; | |
| } | |
| } | |
| } | |
| module.exports = GoogleSearchAPI; | |