|
|
|
const axios = require('axios'); |
|
const { StructuredTool } = require('langchain/tools'); |
|
const { z } = require('zod'); |
|
|
|
class WolframAlphaAPI extends StructuredTool { |
|
constructor(fields) { |
|
super(); |
|
this.name = 'wolfram'; |
|
this.apiKey = fields.WOLFRAM_APP_ID || this.getAppId(); |
|
this.description = `WolframAlpha offers computation, math, curated knowledge, and real-time data. It handles natural language queries and performs complex calculations. |
|
Guidelines include: |
|
- Use English for queries and inform users if information isn't from Wolfram. |
|
- Use "6*10^14" for exponent notation and single-line strings for input. |
|
- Use Markdown for formulas and simplify queries to keywords. |
|
- Use single-letter variable names and named physical constants. |
|
- Include a space between compound units and consider equations without units when solving. |
|
- Make separate calls for each property and choose relevant 'Assumptions' if results aren't relevant. |
|
- The tool also performs data analysis, plotting, and information retrieval.`; |
|
this.schema = z.object({ |
|
nl_query: z |
|
.string() |
|
.describe('Natural language query to WolframAlpha following the guidelines'), |
|
}); |
|
} |
|
|
|
async fetchRawText(url) { |
|
try { |
|
const response = await axios.get(url, { responseType: 'text' }); |
|
return response.data; |
|
} catch (error) { |
|
console.error(`Error fetching raw text: ${error}`); |
|
throw error; |
|
} |
|
} |
|
|
|
getAppId() { |
|
const appId = process.env.WOLFRAM_APP_ID || ''; |
|
if (!appId) { |
|
throw new Error('Missing WOLFRAM_APP_ID environment variable.'); |
|
} |
|
return appId; |
|
} |
|
|
|
createWolframAlphaURL(query) { |
|
|
|
const formattedQuery = query.replaceAll(/`/g, '').replaceAll(/\n/g, ' '); |
|
const baseURL = 'https://www.wolframalpha.com/api/v1/llm-api'; |
|
const encodedQuery = encodeURIComponent(formattedQuery); |
|
const appId = this.apiKey || this.getAppId(); |
|
const url = `${baseURL}?input=${encodedQuery}&appid=${appId}`; |
|
return url; |
|
} |
|
|
|
async _call(data) { |
|
try { |
|
const { nl_query } = data; |
|
const url = this.createWolframAlphaURL(nl_query); |
|
const response = await this.fetchRawText(url); |
|
return response; |
|
} catch (error) { |
|
if (error.response && error.response.data) { |
|
console.log('Error data:', error.response.data); |
|
return error.response.data; |
|
} else { |
|
console.log('Error querying Wolfram Alpha', error.message); |
|
|
|
return 'There was an error querying Wolfram Alpha.'; |
|
} |
|
} |
|
} |
|
} |
|
|
|
module.exports = WolframAlphaAPI; |
|
|