Spaces:
Running
Running
# AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/02_vegan_recipe_tools.ipynb. | |
# %% auto 0 | |
__all__ = ['RecipeSerpAPIWrapper', 'get_vegan_recipes_edamam_api', 'vegan_recipe_edamam_search'] | |
# %% ../nbs/02_vegan_recipe_tools.ipynb 3 | |
import os | |
from typing import Dict | |
import requests | |
from langchain.agents import ( | |
AgentExecutor, | |
AgentType, | |
OpenAIFunctionsAgent, | |
Tool, | |
initialize_agent, | |
load_tools, | |
) | |
from langchain.agents.agent_toolkits import create_python_agent | |
from langchain.chat_models import ChatOpenAI | |
from langchain.memory import ConversationBufferMemory | |
from langchain.prompts import MessagesPlaceholder | |
from langchain.python import PythonREPL | |
from langchain.schema import SystemMessage | |
from langchain.tools import tool | |
from langchain.tools.python.tool import PythonREPLTool | |
from langchain.utilities import GoogleSerperAPIWrapper, SerpAPIWrapper | |
from serpapi import GoogleSearch | |
# %% ../nbs/02_vegan_recipe_tools.ipynb 21 | |
class RecipeSerpAPIWrapper(SerpAPIWrapper): | |
def _process_response(res: dict) -> str: | |
"""Process response from SerpAPI.""" | |
if "error" in res.keys(): | |
raise ValueError(f"Got error from SerpAPI: {res['error']}") | |
if "recipes_results" in res.keys(): | |
return res["recipes_results"] | |
# %% ../nbs/02_vegan_recipe_tools.ipynb 48 | |
def get_vegan_recipes_edamam_api(params: Dict) -> requests.Response: | |
""" | |
type is required and can be "any", "public", "user" | |
""" | |
if "health" in params: | |
params["health"].append("vegan") | |
else: | |
params["health"] = ["vegan"] | |
params["app_id"] = os.environ["EDAMAM_APP_ID"] | |
params["app_key"] = os.environ["EDAMAM_APP_KEY"] | |
params["type"] = "public" | |
return requests.get("https://api.edamam.com/api/recipes/v2", params=params) | |
# %% ../nbs/02_vegan_recipe_tools.ipynb 54 | |
def vegan_recipe_edamam_search(query: str) -> str: | |
""" | |
Searches for vegan recipes based on a query. | |
If the query is not vegan friendly, adapt it to be. | |
If the request fails an explanation should be returned. | |
If the cause of the failure was due to no recipes found, prompt the user to try again with a provided shorter query with one word removed. | |
""" | |
max_chars = 45 # 5 chars per word * 9 max words | |
if len(query) > max_chars: | |
return f"The query is too long, try again with a query that is under {max_chars} characters in length." | |
# Veganize the query more | |
if "vegan" not in query.lower(): | |
query = "vegan " + query | |
# TODO integrate additional params like totalTime range, cuisineType choice, nutrients[PROCNT] range of protein, health additional health params like gluten-free | |
params = { | |
"q": query, | |
"field": ["label", "url", "totalTime", "ingredientLines"] | |
# todo figure out how to include "image", "totalNutrients", "ingredientLines" without going over token limits immediately. | |
} | |
response = get_vegan_recipes_edamam_api(params) | |
if not response.ok: | |
return ( | |
f"Received an error from Edamam API: {response.status_code} {response.text}" | |
) | |
if response.json()["count"] <= 0: | |
return f"""No recipes found for query {query}. | |
This usually occurs when there are too many keywords or ingredients that are not commonly found together in recipes. | |
I recommend trying again with `{' '.join(query.split(' ')[0:-1])}.`""" | |
return str([r["recipe"] for r in response.json()["hits"][0:3]]) | |