lucianotonet commited on
Commit
cf98129
1 Parent(s): 791df4b

Remove detailed request format documentation from endpoint

Browse files

Simplifying 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.

Files changed (1) hide show
  1. app.py +12 -37
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
- # Processa as mensagens recebidas
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 if image_inputs else None, # Passa as imagens se houver
 
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
- generated_ids[:, inputs.input_ids.shape[-1]:],
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}