2023-06-15 21:06:17 -04:00
/* eslint-disable no-useless-escape */
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 ( {
2023-07-14 09:36:49 -04:00
nl _query : z
. string ( )
. describe ( 'Natural language query to WolframAlpha following the guidelines' ) ,
2023-06-15 21:06:17 -04:00
} ) ;
}
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 ) {
// Clean up 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 {
2023-07-14 09:36:49 -04:00
console . log ( 'Error querying Wolfram Alpha' , error . message ) ;
2023-06-15 21:06:17 -04:00
// throw error;
return 'There was an error querying Wolfram Alpha.' ;
}
}
}
}
module . exports = WolframAlphaAPI ;