Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import json | |
| from pydantic import BaseModel | |
| from pydantic import BaseModel | |
| from openai import OpenAI | |
| from typing import List | |
| import os | |
| API_KEY = os.getenv('api_key') | |
| client = OpenAI( | |
| api_key=API_KEY | |
| ) | |
| # Define the Pydantic models | |
| class Ingredient(BaseModel): | |
| """An ingredient for a recipe""" | |
| quantity: str | |
| unit: str | |
| name: str | |
| class Steps(BaseModel): | |
| """Steps to make a recipe""" | |
| stepNumber: int | |
| instruction: str | |
| class ProduceRecipe(BaseModel): | |
| """Makes a recipe for a meal""" | |
| mealName: str | |
| ingredients: list[Ingredient] | |
| steps : list[Steps] | |
| def generate_recipe(meal_name: str, calories: int, meal_time: str) -> ProduceRecipe: | |
| # This is where you'll implement your recipe generation logic | |
| # For now, we'll return a dummy recipe | |
| meal_template = f''' | |
| "role": "user", "content": "Create a recipe for a {meal_time} of {meal_name} with the following ingredients that is roughly {calories} calories." | |
| ''' | |
| completion = client.beta.chat.completions.parse( | |
| model="gpt-4o-2024-08-06", | |
| messages=[ | |
| {"role": "system", "content": "You are an expert chef and nutritionalist. You will be given a meal request and should convert it into a structured Recipe at the correct calories."}, | |
| {"role": "user", "content": meal_template} | |
| ], | |
| response_format=ProduceRecipe, | |
| ) | |
| recipe = completion.choices[0].message.parsed | |
| return recipe | |
| def format_recipe(recipe: ProduceRecipe) -> str: | |
| formatted = f"<h2>{recipe.mealName}</h2>\n\n" | |
| formatted += "<h3>Ingredients:</h3>\n<ul>\n" | |
| for ingredient in recipe.ingredients: | |
| formatted += f"<li>{ingredient.quantity} {ingredient.unit} {ingredient.name}</li>\n" | |
| formatted += "</ul>\n\n" | |
| formatted += "<h3>Instructions:</h3>\n<ol>\n" | |
| for step in recipe.steps: | |
| formatted += f"<li>{step.instruction}</li>\n" | |
| formatted += "</ol>" | |
| return formatted | |
| def recipe_interface(meal_name: str, calories: int, meal_time: str) -> str: | |
| recipe = generate_recipe(meal_name, calories, meal_time) | |
| return format_recipe(recipe) | |
| demo = gr.Interface( | |
| fn=recipe_interface, | |
| inputs=[ | |
| gr.Textbox(label="Meal Name"), | |
| gr.Number(label="Calories"), | |
| gr.Dropdown(["breakfast", "lunch", "dinner"], label="Meal Time") | |
| ], | |
| outputs=gr.HTML(label="Recipe"), | |
| title="Meal Recipe Generator", | |
| description="Generate a recipe based on meal name, calories, and meal time." | |
| ) | |
| demo.launch() |