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,
|