| import gradio as gr |
| import openai |
| import os |
| from dotenv import load_dotenv |
| import logging |
|
|
| |
| logging.basicConfig(level=logging.INFO) |
| logger = logging.getLogger(__name__) |
|
|
| |
| load_dotenv() |
|
|
| |
| openai.api_key = os.getenv("OPENAI_API_KEY") |
| if not openai.api_key: |
| raise ValueError("OPENAI_API_KEY environment variable is not set") |
|
|
| def generate_recipe(query, diet_preference=None, cuisine_type=None): |
| """Generate a recipe with optional diet and cuisine preferences""" |
| logger.info(f"Generating recipe for query: {query}, diet: {diet_preference}, cuisine: {cuisine_type}") |
| |
| if not query: |
| raise ValueError("Recipe query is required") |
|
|
| |
| prompt = f"""Create a detailed recipe for {query}""" |
| if diet_preference: |
| prompt += f" that is {diet_preference}" |
| if cuisine_type: |
| prompt += f" in {cuisine_type} style" |
| |
| prompt += """\n\nFormat the recipe in markdown with the following sections: |
| 1. Brief Description |
| 2. Ingredients (as a bulleted list) |
| 3. Instructions (as numbered steps) |
| 4. Tips (as a bulleted list) |
| 5. Nutritional Information (as a bulleted list) |
| |
| Use markdown formatting like: |
| - Headers (###) |
| - Bold text (**) |
| - Lists (- and 1.) |
| - Sections (>) |
| """ |
|
|
| try: |
| |
| completion = openai.chat.completions.create( |
| model="gpt-3.5-turbo", |
| messages=[ |
| {"role": "system", "content": "You are a professional chef who provides detailed recipes with ingredients, instructions, nutritional information, and cooking tips. Format your responses in markdown."}, |
| {"role": "user", "content": prompt} |
| ], |
| temperature=0.7 |
| ) |
| recipe_text = completion.choices[0].message.content |
|
|
| |
| image_response = openai.images.generate( |
| model="dall-e-3", |
| prompt=f"Professional food photography of {query}, appetizing, high-quality, restaurant style", |
| n=1, |
| size="1024x1024" |
| ) |
| image_url = image_response.data[0].url |
|
|
| |
| learning_resources = [ |
| { |
| "title": f"Master the Art of {query}", |
| "url": f"https://cooking-school.example.com/learn/{query.lower().replace(' ', '-')}", |
| "type": "video" |
| }, |
| { |
| "title": f"Tips and Tricks for Perfect {query}", |
| "url": f"https://recipes.example.com/tips/{query.lower().replace(' ', '-')}", |
| "type": "article" |
| } |
| ] |
|
|
| return recipe_text, image_url, learning_resources |
|
|
| except Exception as e: |
| logger.error(f"Error generating recipe: {str(e)}") |
| raise |
|
|
| def format_learning_resources(resources): |
| """Format learning resources as a markdown list""" |
| if not resources: |
| return "No learning resources available." |
| |
| return "\n".join([f"- **{r['title']}** ({r['type']}): {r['url']}" for r in resources]) |
|
|
| def recipe_generation_app(): |
| """Create Gradio interface for recipe generation""" |
| |
| recipe_input = gr.Textbox(label="Recipe Query", placeholder="Enter a recipe name (e.g., chocolate chip cookies)") |
| diet_input = gr.Dropdown( |
| label="Diet Preference", |
| choices=["None", "Vegetarian", "Vegan", "Gluten-Free", "Keto"], |
| value="None" |
| ) |
| cuisine_input = gr.Dropdown( |
| label="Cuisine Type", |
| choices=["None", "Italian", "Mexican", "Chinese", "Indian", "French"], |
| value="None" |
| ) |
|
|
| |
| recipe_output = gr.Markdown(label="Generated Recipe") |
| image_output = gr.Image(label="Recipe Image") |
| resources_output = gr.Markdown(label="Learning Resources") |
|
|
| |
| demo = gr.Interface( |
| fn=lambda query, diet, cuisine: ( |
| *generate_recipe( |
| query, |
| diet if diet != "None" else None, |
| cuisine if cuisine != "None" else None |
| )[:2], |
| format_learning_resources(generate_recipe( |
| query, |
| diet if diet != "None" else None, |
| cuisine if cuisine != "None" else None |
| )[2]) |
| ), |
| inputs=[recipe_input, diet_input, cuisine_input], |
| outputs=[recipe_output, image_output, resources_output], |
| title="🍳 AI Recipe Assistant", |
| description="Generate delicious recipes with AI-powered suggestions!" |
| ) |
|
|
| return demo |
|
|
| |
| if __name__ == "__main__": |
| app = recipe_generation_app() |
| app.launch(share=True) |