wolframalpha.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import wolframalpha
  2. import requests
  3. from .logging import Logger
  4. from typing import Dict, List, Tuple, Generator, Optional
  5. class WolframAlpha:
  6. api_key: str
  7. logger: Logger
  8. client: wolframalpha.Client
  9. api_code: str = "wolfram"
  10. calculation_api: str = "alpha"
  11. operator: str = "Wolfram ([https://www.wolfram.com](https://www.wolfram.com))"
  12. def __init__(self, api_key: str, logger: Optional[Logger] = None):
  13. self.api_key: str = api_key
  14. self.logger: Logger = logger or Logger()
  15. self.client = wolframalpha.Client(self.api_key)
  16. 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]:
  17. self.logger.log(f"Querying WolframAlpha for {query}")
  18. response: wolframalpha.Result = self.client.query(query)
  19. if not response.success:
  20. yield "Could not process your query."
  21. if response.didyoumeans:
  22. yield "Did you mean: " + response.didyoumeans["didyoumean"][0]["#text"]
  23. return
  24. if response.error:
  25. self.logger.log("Error in query to WolframAlpha: " + response.error, "error")
  26. for pod in response.pods if not results_only else (response.results if len(list(response.results)) else response.pods):
  27. self.logger.log(pod.keys(), "debug")
  28. if pod.title:
  29. yield "*" + pod.title + "*"
  30. for subpod in pod.subpods:
  31. self.logger.log(subpod.keys(), "debug")
  32. if subpod.title:
  33. yield "*" + subpod.title + "*"
  34. if subpod.img and not text:
  35. image = requests.get(subpod.img.src).content
  36. yield image
  37. elif subpod.plaintext:
  38. yield "```\n" + subpod.plaintext + "\n```"