Spaces:
Sleeping
Sleeping
from smolagents import Tool | |
from typing import Optional | |
class SimpleTool(Tool): | |
name = "CulinAI -- your AI Recipe Assistant" | |
description = "Gets a recipe suggestion based on provided ingredients, dietary preference, and your laziness level (1=active chef, 10=super lazy). After finding a recipe, it retrieves detailed recipe information.\nFor dietary restriction, you can select from: none, vegetarian, vegan, gluten free, ketogenic, paleo, pescetarian, whole30, halal, or low fodmap." | |
inputs = {"ingredients":{"type":"string","description":"A comma-separated string of available ingredients."},"diet":{"type":"string","nullable":True,"description":"Dietary restrictions such as 'vegetarian', 'vegan', or 'gluten free'. Defaults to None."},"laziness":{"type":"integer","nullable":True,"description":"An integer from 1 (active) to 10 (super lazy); higher means recipes with quicker prep."}} | |
output_type = "string" | |
def forward(self, ingredients: str, diet: Optional[str] = None, laziness: Optional[int] = 5) -> str: | |
""" | |
Gets a recipe suggestion based on provided ingredients, dietary preference, | |
and your laziness level (1=active chef, 10=super lazy). After finding a recipe, | |
it retrieves detailed recipe information. | |
Args: | |
ingredients: A comma-separated string of available ingredients. | |
diet: Dietary restrictions such as 'vegetarian', 'vegan', or 'gluten free'. Defaults to None. | |
laziness: An integer from 1 (active) to 10 (super lazy); higher means recipes with quicker prep. | |
Returns: | |
A string with detailed information about the recommended recipe. | |
""" | |
import os | |
import requests | |
api_key = "0cbb3d6a82f5497e818d1f63dc736218" | |
if not api_key: | |
return "Spoonacular API key not set. Please set the SPOONACULAR_API_KEY environment variable." | |
# Step 1: Search for recipes using the ingredients | |
base_search_url = "https://api.spoonacular.com/recipes/findByIngredients" | |
params = { | |
"ingredients": ingredients, | |
"number": 1, # We want one suggestion | |
"ranking": 1, | |
"apiKey": api_key, | |
} | |
# Add diet if provided | |
if diet: | |
params["diet"] = diet | |
# Incorporate the laziness factor: filter by maxReadyTime if needed. | |
try: | |
laziness = int(laziness) | |
except ValueError: | |
return "Laziness must be an integer from 1 to 10." | |
if laziness >= 8: | |
params["maxReadyTime"] = 15 # 15 minutes for super lazy cooks | |
elif 5 <= laziness < 8: | |
params["maxReadyTime"] = 30 # 30 minutes for moderately lazy cooks | |
try: | |
search_response = requests.get(base_search_url, params=params) | |
search_response.raise_for_status() | |
search_data = search_response.json() | |
except Exception as e: | |
return f"Error during recipe search: {e}" | |
if not search_data: | |
return "No recipes found with these parameters. Try adjusting your ingredients, diet, or laziness level." | |
# Assume the first result is the best match | |
recipe = search_data[0] | |
recipe_id = recipe.get("id") | |
if not recipe_id: | |
return "Recipe ID not found in the search result." | |
# Step 2: Retrieve detailed recipe information using the recipe id | |
info_url = f"https://api.spoonacular.com/recipes/{recipe_id}/information" | |
info_params = { | |
"apiKey": api_key, | |
} | |
try: | |
info_response = requests.get(info_url, params=info_params) | |
info_response.raise_for_status() | |
info_data = info_response.json() | |
except Exception as e: | |
return f"Error retrieving detailed recipe information: {e}" | |
# Extract detailed information | |
title = info_data.get("title", "Untitled Recipe") | |
ready_time = info_data.get("readyInMinutes", "N/A") | |
servings = info_data.get("servings", "N/A") | |
instructions = info_data.get("instructions", "No instructions provided.") | |
# Extract ingredients list (names only) | |
ingredients_list = info_data.get("extendedIngredients", []) | |
ingredients_names = [ing.get("name") for ing in ingredients_list if ing.get("name")] | |
ingredients_str = ", ".join(ingredients_names) if ingredients_names else "N/A" | |
# Build the detailed summary message | |
detailed_info = ( | |
f"Recipe suggestion: {title}\n" | |
f"Ready in: {ready_time} minutes | Servings: {servings}\n" | |
f"Ingredients: {ingredients_str}\n\n" | |
f"Instructions:\n{instructions}" | |
) | |
return detailed_info |