import wolframalpha import requests from .logging import Logger from typing import Dict, List, Tuple, Generator, Optional class WolframAlpha: api_key: str logger: Logger client: wolframalpha.Client api_code: str = "wolfram" calculation_api: str = "alpha" operator: str = "Wolfram ([https://www.wolfram.com](https://www.wolfram.com))" def __init__(self, api_key: str, logger: Optional[Logger] = None): self.api_key: str = api_key self.logger: Logger = logger or Logger() self.client = wolframalpha.Client(self.api_key) def generate_calculation_response(self, query: str, text: Optional[bool] = False, results_only: Optional[bool] = False, user: Optional[str] = None) -> Generator[str | bytes, None, None]: self.logger.log(f"Querying WolframAlpha for {query}") response: wolframalpha.Result = self.client.query(query) if not response.success: yield "Could not process your query." if response.didyoumeans: yield "Did you mean: " + response.didyoumeans["didyoumean"][0]["#text"] return if response.error: self.logger.log("Error in query to WolframAlpha: " + response.error, "error") for pod in response.pods if not results_only else (response.results if len(list(response.results)) else response.pods): self.logger.log(pod.keys(), "debug") if pod.title: yield "*" + pod.title + "*" for subpod in pod.subpods: self.logger.log(subpod.keys(), "debug") if subpod.title: yield "*" + subpod.title + "*" if subpod.img and not text: image = requests.get(subpod.img.src).content yield image elif subpod.plaintext: yield "```\n" + subpod.plaintext + "\n```"