Spaces:
Runtime error
Runtime error
lucianotonet
commited on
Commit
•
cf98129
1
Parent(s):
791df4b
Remove detailed request format documentation from endpoint
Browse filesSimplifying the documentation for the prediction endpoint enhances readability and streamlines the codebase. This makes it easier for future developers to understand and maintain the function without unnecessary complexity.
app.py
CHANGED
@@ -6,6 +6,7 @@ import base64
|
|
6 |
import requests
|
7 |
from PIL import Image
|
8 |
from io import BytesIO
|
|
|
9 |
|
10 |
app = FastAPI()
|
11 |
|
@@ -30,42 +31,13 @@ def process_image(image_data: str) -> Image.Image:
|
|
30 |
async def predict(messages: List[Dict[str, Union[str, List[Dict[str, Union[str, None]]]]]] = Body(...)):
|
31 |
"""
|
32 |
Endpoint para prever respostas com base nas mensagens fornecidas.
|
33 |
-
|
34 |
-
Formato esperado para a requisição:
|
35 |
-
- messages: uma lista de dicionários, onde cada dicionário deve conter:
|
36 |
-
- role: (obrigatório) o papel do remetente, como "user" ou "assistant".
|
37 |
-
- content: pode ser uma string ou uma lista de itens.
|
38 |
-
- Se for uma string, deve ser um texto a ser processado.
|
39 |
-
- Se for uma lista, cada item deve ser um dicionário com:
|
40 |
-
- type: deve ser "text" ou "image".
|
41 |
-
- text: (obrigatório se type for "text") o texto a ser processado.
|
42 |
-
- image: (obrigatório se type for "image") a imagem a ser processada, que pode ser uma URL, base64 ou caminho local.
|
43 |
-
|
44 |
-
Exemplo de payload:
|
45 |
-
[
|
46 |
-
{
|
47 |
-
"role": "user",
|
48 |
-
"content": "Qual é a capital da França?"
|
49 |
-
},
|
50 |
-
{
|
51 |
-
"role": "user",
|
52 |
-
"content": [
|
53 |
-
{
|
54 |
-
"type": "text",
|
55 |
-
"text": "Descreva a imagem."
|
56 |
-
},
|
57 |
-
{
|
58 |
-
"type": "image",
|
59 |
-
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA..."
|
60 |
-
}
|
61 |
-
]
|
62 |
-
}
|
63 |
-
]
|
64 |
"""
|
|
|
65 |
texts = []
|
66 |
image_inputs = []
|
|
|
67 |
|
68 |
-
#
|
69 |
for message in messages:
|
70 |
content = message.get("content")
|
71 |
if isinstance(content, str):
|
@@ -83,18 +55,21 @@ async def predict(messages: List[Dict[str, Union[str, List[Dict[str, Union[str,
|
|
83 |
raise ValueError(f"Formato inválido para o conteúdo: {content}")
|
84 |
|
85 |
# Prepara inputs para o modelo
|
|
|
86 |
inputs = processor(
|
87 |
-
text=texts,
|
88 |
-
images=image_inputs
|
|
|
89 |
padding=True,
|
90 |
return_tensors="pt"
|
91 |
).to("cpu")
|
92 |
|
93 |
# Gera as respostas
|
94 |
generated_ids = model.generate(**inputs, max_new_tokens=128)
|
|
|
|
|
|
|
95 |
output_texts = processor.batch_decode(
|
96 |
-
|
97 |
-
skip_special_tokens=True,
|
98 |
-
clean_up_tokenization_spaces=False
|
99 |
)
|
100 |
return {"response": output_texts}
|
|
|
6 |
import requests
|
7 |
from PIL import Image
|
8 |
from io import BytesIO
|
9 |
+
from qwen_vl_utils import process_vision_info
|
10 |
|
11 |
app = FastAPI()
|
12 |
|
|
|
31 |
async def predict(messages: List[Dict[str, Union[str, List[Dict[str, Union[str, None]]]]]] = Body(...)):
|
32 |
"""
|
33 |
Endpoint para prever respostas com base nas mensagens fornecidas.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
"""
|
35 |
+
# Processa as mensagens para texto e imagens
|
36 |
texts = []
|
37 |
image_inputs = []
|
38 |
+
video_inputs = []
|
39 |
|
40 |
+
# Utiliza o qwen_vl_utils para processar as informações visuais
|
41 |
for message in messages:
|
42 |
content = message.get("content")
|
43 |
if isinstance(content, str):
|
|
|
55 |
raise ValueError(f"Formato inválido para o conteúdo: {content}")
|
56 |
|
57 |
# Prepara inputs para o modelo
|
58 |
+
image_inputs, video_inputs = process_vision_info(messages)
|
59 |
inputs = processor(
|
60 |
+
text=[text for text in texts],
|
61 |
+
images=image_inputs,
|
62 |
+
videos=video_inputs,
|
63 |
padding=True,
|
64 |
return_tensors="pt"
|
65 |
).to("cpu")
|
66 |
|
67 |
# Gera as respostas
|
68 |
generated_ids = model.generate(**inputs, max_new_tokens=128)
|
69 |
+
generated_ids_trimmed = [
|
70 |
+
out_ids[len(in_ids):] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
|
71 |
+
]
|
72 |
output_texts = processor.batch_decode(
|
73 |
+
generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
|
|
|
|
|
74 |
)
|
75 |
return {"response": output_texts}
|