| const { z } = require('zod'); |
| const { Tool } = require('@langchain/core/tools'); |
| const { getEnvironmentVariable } = require('@langchain/core/utils/env'); |
|
|
| class GoogleSearchResults extends Tool { |
| static lc_name() { |
| return 'google'; |
| } |
|
|
| constructor(fields = {}) { |
| super(fields); |
| this.name = 'google'; |
| this.envVarApiKey = 'GOOGLE_SEARCH_API_KEY'; |
| this.envVarSearchEngineId = 'GOOGLE_CSE_ID'; |
| this.override = fields.override ?? false; |
| this.apiKey = fields[this.envVarApiKey] ?? getEnvironmentVariable(this.envVarApiKey); |
| this.searchEngineId = |
| fields[this.envVarSearchEngineId] ?? getEnvironmentVariable(this.envVarSearchEngineId); |
|
|
| if (!this.override && (!this.apiKey || !this.searchEngineId)) { |
| throw new Error( |
| `Missing ${this.envVarApiKey} or ${this.envVarSearchEngineId} environment variable.`, |
| ); |
| } |
|
|
| this.kwargs = fields?.kwargs ?? {}; |
| this.name = 'google'; |
| this.description = |
| 'A search engine optimized for comprehensive, accurate, and trusted results. Useful for when you need to answer questions about current events.'; |
|
|
| this.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 10.'), |
| |
| }); |
| } |
|
|
| async _call(input) { |
| const validationResult = this.schema.safeParse(input); |
| if (!validationResult.success) { |
| throw new Error(`Validation failed: ${JSON.stringify(validationResult.error.issues)}`); |
| } |
|
|
| const { query, max_results = 5 } = validationResult.data; |
|
|
| const response = await fetch( |
| `https://www.googleapis.com/customsearch/v1?key=${this.apiKey}&cx=${ |
| this.searchEngineId |
| }&q=${encodeURIComponent(query)}&num=${max_results}`, |
| { |
| method: 'GET', |
| headers: { |
| 'Content-Type': 'application/json', |
| }, |
| }, |
| ); |
|
|
| const json = await response.json(); |
| if (!response.ok) { |
| throw new Error(`Request failed with status ${response.status}: ${json.error.message}`); |
| } |
|
|
| return JSON.stringify(json); |
| } |
| } |
|
|
| module.exports = GoogleSearchResults; |
|
|