Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,7 +1,8 @@
|
|
| 1 |
import gradio as gr
|
| 2 |
-
from huggingface_hub import
|
| 3 |
from PIL import Image
|
| 4 |
import io
|
|
|
|
| 5 |
from functools import lru_cache
|
| 6 |
import tempfile
|
| 7 |
|
|
@@ -14,23 +15,41 @@ def update_api_token(new_token):
|
|
| 14 |
API_TOKEN = new_token.strip()
|
| 15 |
return f"✅ Token atualizado com sucesso: {API_TOKEN[:8]}... (ocultado)"
|
| 16 |
|
| 17 |
-
# Função para criar uma instância da API com o token atualizado
|
| 18 |
-
def
|
| 19 |
-
return
|
| 20 |
|
| 21 |
-
#
|
| 22 |
@lru_cache(maxsize=128)
|
| 23 |
def interpret_image_cached(image_bytes):
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
if not description.endswith("."):
|
| 28 |
description += "."
|
| 29 |
return description
|
| 30 |
|
|
|
|
| 31 |
@lru_cache(maxsize=128)
|
| 32 |
def nutritional_analysis_cached(description):
|
| 33 |
-
|
| 34 |
prompt = (
|
| 35 |
f"Com base na descrição do prato de comida abaixo, forneça uma análise nutricional detalhada.\n\n"
|
| 36 |
f"Descrição do prato: {description}\n\n"
|
|
@@ -43,27 +62,28 @@ def nutritional_analysis_cached(description):
|
|
| 43 |
f"- Recomendações para melhorar o prato: [sugestões]\n\n"
|
| 44 |
f"Análise nutricional:"
|
| 45 |
)
|
| 46 |
-
response =
|
| 47 |
analysis = response.get("generated_text", "").replace("Análise nutricional:", "").strip()
|
| 48 |
return analysis
|
| 49 |
|
|
|
|
| 50 |
@lru_cache(maxsize=128)
|
| 51 |
def health_tips_cached(description):
|
| 52 |
-
|
| 53 |
prompt = (
|
| 54 |
f"Com base na descrição do prato de comida abaixo, forneça dicas de saúde e sugestões "
|
| 55 |
f"para melhorar o prato, tornando-o mais equilibrado e nutritivo. Liste as dicas em tópicos.\n\n"
|
| 56 |
f"Descrição do prato: {description}\n\n"
|
| 57 |
f"Dicas de saúde:"
|
| 58 |
)
|
| 59 |
-
response =
|
| 60 |
tips = response.get("generated_text", "").replace("Dicas de saúde:", "").strip()
|
| 61 |
return tips
|
| 62 |
|
| 63 |
# Função principal para processar a imagem e gerar resultados
|
| 64 |
def process_image(image):
|
| 65 |
try:
|
| 66 |
-
# Converter
|
| 67 |
buffered = io.BytesIO()
|
| 68 |
image.save(buffered, format="JPEG")
|
| 69 |
image_bytes = buffered.getvalue()
|
|
@@ -129,7 +149,6 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="cyan")) a
|
|
| 129 |
|
| 130 |
# Estado oculto para armazenar o resultado completo para o download
|
| 131 |
result_state = gr.State("")
|
| 132 |
-
# Campo de feedback para exibir mensagens do processo
|
| 133 |
feedback = gr.Markdown("")
|
| 134 |
|
| 135 |
submit_button.click(
|
|
@@ -143,8 +162,7 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue", secondary_hue="cyan")) a
|
|
| 143 |
inputs=result_state,
|
| 144 |
outputs=gr.File(label="Seu Resultado")
|
| 145 |
)
|
| 146 |
-
|
| 147 |
-
# Conectar botão de atualização do token à função correspondente
|
| 148 |
update_button.click(
|
| 149 |
update_api_token,
|
| 150 |
inputs=api_token_input,
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
+
from huggingface_hub import InferenceClient
|
| 3 |
from PIL import Image
|
| 4 |
import io
|
| 5 |
+
import base64
|
| 6 |
from functools import lru_cache
|
| 7 |
import tempfile
|
| 8 |
|
|
|
|
| 15 |
API_TOKEN = new_token.strip()
|
| 16 |
return f"✅ Token atualizado com sucesso: {API_TOKEN[:8]}... (ocultado)"
|
| 17 |
|
| 18 |
+
# Função para criar uma instância da API com o token atualizado usando InferenceClient
|
| 19 |
+
def get_inference_client(model):
|
| 20 |
+
return InferenceClient(model=model, token=API_TOKEN)
|
| 21 |
|
| 22 |
+
# Função para interpretar a imagem com cache utilizando InferenceClient (captioning)
|
| 23 |
@lru_cache(maxsize=128)
|
| 24 |
def interpret_image_cached(image_bytes):
|
| 25 |
+
# Converter imagem para base64 e criar data URI
|
| 26 |
+
base64_image = base64.b64encode(image_bytes).decode("utf-8")
|
| 27 |
+
data_uri = f"data:image/jpeg;base64,{base64_image}"
|
| 28 |
+
|
| 29 |
+
# Instanciar o client para o modelo de captioning
|
| 30 |
+
client = get_inference_client("Salesforce/blip2-opt-2.7b")
|
| 31 |
+
|
| 32 |
+
# Construção da mensagem seguindo o exemplo da API de chat para visão
|
| 33 |
+
messages = [{
|
| 34 |
+
"role": "user",
|
| 35 |
+
"content": [
|
| 36 |
+
{"type": "image_url", "image_url": {"url": data_uri}},
|
| 37 |
+
{"type": "text", "text": "Descreva esta imagem em uma frase."}
|
| 38 |
+
]
|
| 39 |
+
}]
|
| 40 |
+
|
| 41 |
+
# Chamada da API usando método de chat (a estrutura de retorno segue o padrão da API)
|
| 42 |
+
output = client.chat.completions.create(messages=messages)
|
| 43 |
+
# Supondo que o resultado esteja em output["choices"][0]["message"]["content"]
|
| 44 |
+
description = output["choices"][0]["message"]["content"].strip().capitalize()
|
| 45 |
if not description.endswith("."):
|
| 46 |
description += "."
|
| 47 |
return description
|
| 48 |
|
| 49 |
+
# Função para análise nutricional com cache utilizando InferenceClient e método post
|
| 50 |
@lru_cache(maxsize=128)
|
| 51 |
def nutritional_analysis_cached(description):
|
| 52 |
+
client = get_inference_client("google/flan-t5-large")
|
| 53 |
prompt = (
|
| 54 |
f"Com base na descrição do prato de comida abaixo, forneça uma análise nutricional detalhada.\n\n"
|
| 55 |
f"Descrição do prato: {description}\n\n"
|
|
|
|
| 62 |
f"- Recomendações para melhorar o prato: [sugestões]\n\n"
|
| 63 |
f"Análise nutricional:"
|
| 64 |
)
|
| 65 |
+
response = client.post(json={"inputs": prompt})
|
| 66 |
analysis = response.get("generated_text", "").replace("Análise nutricional:", "").strip()
|
| 67 |
return analysis
|
| 68 |
|
| 69 |
+
# Função para gerar dicas de saúde com cache utilizando InferenceClient e método post
|
| 70 |
@lru_cache(maxsize=128)
|
| 71 |
def health_tips_cached(description):
|
| 72 |
+
client = get_inference_client("google/flan-t5-large")
|
| 73 |
prompt = (
|
| 74 |
f"Com base na descrição do prato de comida abaixo, forneça dicas de saúde e sugestões "
|
| 75 |
f"para melhorar o prato, tornando-o mais equilibrado e nutritivo. Liste as dicas em tópicos.\n\n"
|
| 76 |
f"Descrição do prato: {description}\n\n"
|
| 77 |
f"Dicas de saúde:"
|
| 78 |
)
|
| 79 |
+
response = client.post(json={"inputs": prompt})
|
| 80 |
tips = response.get("generated_text", "").replace("Dicas de saúde:", "").strip()
|
| 81 |
return tips
|
| 82 |
|
| 83 |
# Função principal para processar a imagem e gerar resultados
|
| 84 |
def process_image(image):
|
| 85 |
try:
|
| 86 |
+
# Converter imagem para bytes
|
| 87 |
buffered = io.BytesIO()
|
| 88 |
image.save(buffered, format="JPEG")
|
| 89 |
image_bytes = buffered.getvalue()
|
|
|
|
| 149 |
|
| 150 |
# Estado oculto para armazenar o resultado completo para o download
|
| 151 |
result_state = gr.State("")
|
|
|
|
| 152 |
feedback = gr.Markdown("")
|
| 153 |
|
| 154 |
submit_button.click(
|
|
|
|
| 162 |
inputs=result_state,
|
| 163 |
outputs=gr.File(label="Seu Resultado")
|
| 164 |
)
|
| 165 |
+
|
|
|
|
| 166 |
update_button.click(
|
| 167 |
update_api_token,
|
| 168 |
inputs=api_token_input,
|