Retseptiotsija / app.py
irins's picture
Update app.py
67336d1 verified
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()