TimInf commited on
Commit
d027733
·
verified ·
1 Parent(s): 23f2a90

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +20 -59
app.py CHANGED
@@ -3,10 +3,7 @@ from transformers import FlaxAutoModelForSeq2SeqLM, AutoTokenizer, AutoModel
3
  import torch
4
  import numpy as np
5
  import random
6
- import json
7
- from fastapi import FastAPI, Request
8
- from fastapi.responses import JSONResponse
9
- from pydantic import BaseModel
10
 
11
  # Lade RecipeBERT Modell (für semantische Zutat-Kombination)
12
  bert_model_name = "alexdseo/RecipeBERT"
@@ -276,7 +273,8 @@ def generate_recipe_with_t5(ingredients_list, max_retries=5):
276
  "directions": ["Fehler beim Generieren der Rezeptanweisungen"]
277
  }
278
 
279
- # Diese Funktion wird von der Gradio-UI und der neuen FastAPI-Route aufgerufen.
 
280
  def process_recipe_request_logic(required_ingredients, available_ingredients, max_ingredients, max_retries):
281
  """
282
  Kernlogik zur Verarbeitung einer Rezeptgenerierungsanfrage.
@@ -308,13 +306,14 @@ def process_recipe_request_logic(required_ingredients, available_ingredients, ma
308
  except Exception as e:
309
  return {"error": f"Fehler bei der Rezeptgenerierung: {str(e)}"}
310
 
311
- def flutter_api_generate_recipe(ingredients_data):
312
  """
313
- Flutter-freundliche API-Funktion für den Gradio-API-Test-Tab.
314
- Verarbeitet JSON-String-Eingabe und gibt JSON-String-Ausgabe zurück.
315
  """
316
  try:
317
- data = json.loads(ingredients_data) # Muss ein JSON-String sein
 
318
 
319
  required_ingredients = data.get('required_ingredients', [])
320
  available_ingredients = data.get('available_ingredients', [])
@@ -325,10 +324,12 @@ def flutter_api_generate_recipe(ingredients_data):
325
  result_dict = process_recipe_request_logic(
326
  required_ingredients, available_ingredients, max_ingredients, max_retries
327
  )
328
- return json.dumps(result_dict) # Gibt einen JSON-String zurück
329
 
330
  except Exception as e:
331
- return json.dumps({"error": f"Fehler bei der Rezeptgenerierung: {str(e)}"})
 
 
332
 
333
  def gradio_ui_generate_recipe(required_ingredients_text, available_ingredients_text, max_ingredients_val, max_retries_val):
334
  """Gradio UI Funktion für die Web-Oberfläche"""
@@ -356,6 +357,7 @@ def gradio_ui_generate_recipe(required_ingredients_text, available_ingredients_t
356
  )
357
 
358
  except Exception as e:
 
359
  return f"Fehler: {str(e)}", "", "", ""
360
 
361
  # Erstelle die Gradio Oberfläche
@@ -394,23 +396,22 @@ with gr.Blocks(title="AI Rezept Generator") as demo:
394
  )
395
 
396
  with gr.Tab("API-Test"):
397
- gr.Markdown("### Teste die Gradio API (für interne Tests)")
398
- gr.Markdown("Dieser Tab verwendet die interne Gradio API für Testzwecke.")
399
 
400
  api_input = gr.Textbox(
401
- label="JSON-Eingabe (Flutter API-Format)",
402
  placeholder='{"required_ingredients": ["chicken", "rice"], "available_ingredients": ["onion", "garlic"], "max_ingredients": 6}',
403
  lines=4
404
  )
405
  api_output = gr.Textbox(label="JSON-Ausgabe", lines=15, interactive=False)
406
  api_test_btn = gr.Button("API testen", variant="secondary")
407
 
408
- # Hier wird die Funktion weiterhin für den Gradio-eigenen API-Test-Tab verwendet.
409
  api_test_btn.click(
410
  fn=flutter_api_generate_recipe,
411
  inputs=[api_input],
412
  outputs=[api_output],
413
- api_name="generate_recipe_for_flutter" # Gradio-interner API-Name
414
  )
415
 
416
  gr.Examples(
@@ -421,46 +422,6 @@ with gr.Blocks(title="AI Rezept Generator") as demo:
421
  inputs=[api_input]
422
  )
423
 
424
- # --- FastAPI-Integration ---
425
- app = FastAPI()
426
-
427
- class RecipeRequest(BaseModel):
428
- required_ingredients: list[str] = []
429
- available_ingredients: list[str] = []
430
- max_ingredients: int = 7
431
- max_retries: int = 5
432
-
433
- @app.post("/api/generate_recipe_rest")
434
- async def generate_recipe_rest_api(request_data: RecipeRequest):
435
- """
436
- Standard-REST-API-Endpunkt für die Flutter-App.
437
- Nimmt direkt JSON-Daten an und gibt direkt JSON zurück.
438
- """
439
- required_ingredients = request_data.required_ingredients
440
- available_ingredients = request_data.available_ingredients
441
- max_ingredients = request_data.max_ingredients
442
- max_retries = request_data.max_retries
443
-
444
- # Abwärtskompatibilität, falls 'ingredients' statt 'required_ingredients' gesendet wird
445
- # Dies ist in der FastAPI-Pydantic-Modelldefinition nicht direkt abbildbar,
446
- # aber du könntest es manuell hinzufügen, falls nötig, wenn das Pydantic-Modell flexibler wäre.
447
- # Für den Einfachheit halber gehen wir davon aus, dass Flutter die korrekten Felder sendet.
448
-
449
- result_dict = process_recipe_request_logic(
450
- required_ingredients, available_ingredients, max_ingredients, max_retries
451
- )
452
-
453
- return JSONResponse(content=result_dict)
454
-
455
- # Gradio-App als Sub-App in die FastAPI-App mounten
456
- # Dies ist der Standardweg, um Gradio in eine FastAPI-Anwendung einzubetten.
457
- # Der Gradio-Teil wird dann unter dem Wurzelpfad '/'.
458
- app = gr.mount_gradio_app(app, demo, path="/") # Gradio unter dem Wurzelpfad mounten
459
-
460
- # Wenn du deine App lokal ausführst, kannst du FastAPI mit Uvicorn starten:
461
- # if __name__ == "__main__":
462
- # import uvicorn
463
- # uvicorn.run(app, host="0.0.0.0", port=8000)
464
-
465
- # Für Hugging Face Spaces ist der if __name__ == "__main__": Block nicht nötig,
466
- # da Spaces Uvicorn automatisch startet und die "app"-Variable sucht.
 
3
  import torch
4
  import numpy as np
5
  import random
6
+ import json # Beibehalten, da es in flutter_api_generate_recipe verwendet wird
 
 
 
7
 
8
  # Lade RecipeBERT Modell (für semantische Zutat-Kombination)
9
  bert_model_name = "alexdseo/RecipeBERT"
 
273
  "directions": ["Fehler beim Generieren der Rezeptanweisungen"]
274
  }
275
 
276
+ # Diese Funktion wird von der Gradio-UI und der FastAPI-Route aufgerufen.
277
+ # Sie ist für die Kernlogik zuständig.
278
  def process_recipe_request_logic(required_ingredients, available_ingredients, max_ingredients, max_retries):
279
  """
280
  Kernlogik zur Verarbeitung einer Rezeptgenerierungsanfrage.
 
306
  except Exception as e:
307
  return {"error": f"Fehler bei der Rezeptgenerierung: {str(e)}"}
308
 
309
+ def flutter_api_generate_recipe(ingredients_data: str): # Typ-Hint für Klarheit
310
  """
311
+ Diese Funktion wird vom 'hugging_face_chat_gradio'-Paket über die API aufgerufen.
312
+ Sie erwartet einen JSON-STRING als Eingabe.
313
  """
314
  try:
315
+ # Der 'hugging_face_chat_gradio'-Client sendet das Payload als String.
316
+ data = json.loads(ingredients_data)
317
 
318
  required_ingredients = data.get('required_ingredients', [])
319
  available_ingredients = data.get('available_ingredients', [])
 
324
  result_dict = process_recipe_request_logic(
325
  required_ingredients, available_ingredients, max_ingredients, max_retries
326
  )
327
+ return json.dumps(result_dict) # Gibt einen JSON-STRING zurück
328
 
329
  except Exception as e:
330
+ # Logge den Fehler für Debugging im Space-Log
331
+ print(f"Error in flutter_api_generate_recipe: {str(e)}")
332
+ return json.dumps({"error": f"Internal API Error: {str(e)}"})
333
 
334
  def gradio_ui_generate_recipe(required_ingredients_text, available_ingredients_text, max_ingredients_val, max_retries_val):
335
  """Gradio UI Funktion für die Web-Oberfläche"""
 
357
  )
358
 
359
  except Exception as e:
360
+ # Fehlermeldung für die Gradio UI
361
  return f"Fehler: {str(e)}", "", "", ""
362
 
363
  # Erstelle die Gradio Oberfläche
 
396
  )
397
 
398
  with gr.Tab("API-Test"):
399
+ gr.Markdown("### Teste die Flutter API (via 'hugging_face_chat_gradio' Client)")
400
+ gr.Markdown("Dieser Tab zeigt, wie die Eingabe für die 'generate_recipe_for_flutter'-API aussehen sollte.")
401
 
402
  api_input = gr.Textbox(
403
+ label="JSON-Eingabe (für API-Aufruf)",
404
  placeholder='{"required_ingredients": ["chicken", "rice"], "available_ingredients": ["onion", "garlic"], "max_ingredients": 6}',
405
  lines=4
406
  )
407
  api_output = gr.Textbox(label="JSON-Ausgabe", lines=15, interactive=False)
408
  api_test_btn = gr.Button("API testen", variant="secondary")
409
 
 
410
  api_test_btn.click(
411
  fn=flutter_api_generate_recipe,
412
  inputs=[api_input],
413
  outputs=[api_output],
414
+ api_name="generate_recipe_for_flutter" # Dies ist der api_name, den das Flutter-Paket verwendet
415
  )
416
 
417
  gr.Examples(
 
422
  inputs=[api_input]
423
  )
424
 
425
+ # Gradio-App starten
426
+ if __name__ == "__main__":
427
+ demo.launch()