Spaces:
Sleeping
Sleeping
| import os | |
| import gradio as gr | |
| import requests | |
| # Get API keys from Secrets | |
| spoonacular_api_key = os.getenv('SPOONACULAR_API_KEY') # Spoonacular API key | |
| hf_api_key = os.getenv('HF_API_KEY') # Hugging Face API key | |
| # Translation function using Hugging Face | |
| def translate_text_hf(text): | |
| url = "https://api-inference.huggingface.co/models/Helsinki-NLP/opus-mt-et-en" | |
| headers = {"Authorization": f"Bearer {hf_api_key}"} | |
| payload = {"inputs": text} | |
| response = requests.post(url, headers=headers, json=payload) | |
| if response.status_code == 200: | |
| translation = response.json()[0]['translation_text'] | |
| print("Translated ingredients:", translation) # Debug: Print translation | |
| return translation | |
| else: | |
| print("Translation failed with status:", response.status_code) # Debug: Print failure | |
| return "Translation failed!" | |
| # Recipe search function using Spoonacular API | |
| def get_recipes(ingredients, max_calories=None, min_protein=None, max_fat=None, max_carbs=None): | |
| # Translate ingredients to English | |
| translated_ingredients = translate_text_hf(ingredients) | |
| url = "https://api.spoonacular.com/recipes/complexSearch" | |
| # Base parameters for the API request | |
| params = { | |
| "query": translated_ingredients, | |
| "apiKey": spoonacular_api_key, | |
| "number": 5 # Return up to 5 recipes | |
| } | |
| # Add optional parameters only if they are provided and not zero | |
| if max_calories and max_calories > 0: | |
| params["maxCalories"] = max_calories | |
| if min_protein and min_protein > 0: | |
| params["minProtein"] = min_protein | |
| if max_fat and max_fat > 0: | |
| params["maxFat"] = max_fat | |
| if max_carbs and max_carbs > 0: | |
| params["maxCarbs"] = max_carbs | |
| # Send the API request | |
| response = requests.get(url, params=params) | |
| # Check if the request was successful | |
| if response.status_code == 200: | |
| recipes = response.json().get('results', []) | |
| if recipes: | |
| # Format and return the list of recipes as HTML links | |
| html_links = "<br>".join( | |
| [f'<a href="https://spoonacular.com/recipes/{recipe["title"].replace(" ", "-").lower()}-{recipe["id"]}" target="_blank">{recipe["title"]}</a>' | |
| for recipe in recipes] | |
| ) | |
| # Debug: Print each generated URL for the recipes | |
| for recipe in recipes: | |
| print(f"Generated URL: https://spoonacular.com/recipes/{recipe['title'].replace(' ', '-').lower()}-{recipe['id']}") | |
| return html_links | |
| else: | |
| return "No suitable recipes found." | |
| else: | |
| return f"Error fetching recipes: {response.status_code}" | |
| # Gradio Interface | |
| def recipe_app(ingredients, max_calories, min_protein, max_fat, max_carbs): | |
| return get_recipes(ingredients, max_calories, min_protein, max_fat, max_carbs) | |
| # Create Gradio interface | |
| interface = gr.Interface( | |
| fn=recipe_app, | |
| inputs=[ | |
| gr.Textbox(label="Sisesta koostisained"), | |
| gr.Number(label="Maksimaalne kalorikogus (valikuline)"), | |
| gr.Number(label="Minimaalne valk (g, valikuline)"), | |
| gr.Number(label="Maksimaalne rasvasisaldus (g, valikuline)"), | |
| gr.Number(label="Maksimaalne süsivesikute sisaldus (g, valikuline)"), | |
| ], | |
| outputs=gr.HTML(label="Recipes"), # Ensure output is HTML | |
| title="Retseptiotsija", | |
| description="Sisestage koostisosad eesti keeles ja määrake sobivate retseptide leidmiseks valikulised kalorite, valkude, rasvade ja süsivesikute piirangud." | |
| ) | |
| interface.launch() |