Pular para o conteúdo principal
A Venice incluiu saídas estruturadas via “response_format” como um campo disponível na API. Esse campo permite que você gere respostas aos seus prompts seguindo um formato predefinido específico. Com esse novo método, os modelos têm menor probabilidade de alucinar chaves ou valores incorretos na resposta, o que era mais prevalente ao tentar via manipulação de prompt do sistema ou por function calling. O campo “response_format” de saída estruturada utiliza o formato da API OpenAI e é descrito no guia da OpenAI aqui. A OpenAI também lançou um artigo introdutório sobre o uso de saídas estruturadas na API especificamente aqui. Como esta é uma funcionalidade avançada, há alguns “detalhes importantes” no final desta página que devem ser seguidos. Essa funcionalidade não está disponível nativamente em todos os modelos. Consulte a seção de modelos aqui e procure por “supportsResponseSchema” para os modelos compatíveis.
    {
      "id": "venice-uncensored",
      "type": "text",
      "object": "model",
      "created": 1726869022,
      "owned_by": "venice.ai",
      "model_spec": {
        "availableContextTokens": 32768,
        "capabilities": {
          "supportsFunctionCalling": true,
          "supportsResponseSchema": true,
          "supportsWebSearch": true
        },

Como usar respostas estruturadas

Para usar adequadamente “response_format”, você pode definir seu schema com várias “properties”, representando categorias de saídas, cada uma com tipos de dados configurados individualmente. Esses objetos podem ser aninhados para criar estruturas mais avançadas de saídas. Aqui está um exemplo de uma chamada de API usando response_format para explicar o processo passo a passo de resolver uma equação matemática. Você pode ver que as properties foram configuradas para exigir tanto “steps” quanto “final_answer” na resposta. No aninhamento, a categoria steps consiste em “explanation” e “output”, cada um como strings.
curl --request POST \
  --url https://api.venice.ai/api/v1/chat/completions \
  --header 'Authorization: Bearer <api-key>' \
  --header 'Content-Type: application/json' \
  --data '{
  "model": "venice-uncensored",
  "messages": [
    {
      "role": "system",
      "content": "You are a helpful math tutor."
    },
    {
      "role": "user",
      "content": "solve 8x + 31 = 2"
    }
  ],
  "response_format": {
    "type": "json_schema",
    "json_schema": {
      "name": "math_response",
      "strict": true,
      "schema": {
        "type": "object",
        "properties": {
          "steps": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "explanation": {
                  "type": "string"
                },
                "output": {
                  "type": "string"
                }
              },
              "required": ["explanation", "output"],
              "additionalProperties": false
            }
          },
          "final_answer": {
            "type": "string"
          }
        },
        "required": ["steps", "final_answer"],
        "additionalProperties": false
      }
    }
  }
}

Aqui está a resposta recebida do modelo. Você pode ver que a estrutura seguiu os requisitos primeiro fornecendo os “steps” com a “explanation” e o “output” de cada passo, e depois a “final answer”.
{
  "steps": [
    {
      "explanation": "Subtract 31 from both sides to isolate the term with x.",
      "output": "8x + 31 - 31 = 2 - 31"
    },
    {
      "explanation": "This simplifies to 8x = -29.",
      "output": "8x = -29"
    },
    {
      "explanation": "Divide both sides by 8 to solve for x.",
      "output": "x = -29 / 8"
    }
  ],
  "final_answer": "x = -29 / 8"
}

Embora este seja um exemplo simples, isso pode ser extrapolado para casos de uso mais avançados como: extração de dados, exercícios de chain of thought, geração de UI, categorização de dados e muitos outros.

Detalhes importantes

Aqui estão alguns requisitos importantes a serem lembrados ao usar saídas estruturadas via response_format:
  • Requisições iniciais usando response_format podem demorar mais para gerar uma resposta. Requisições subsequentes não terão a mesma latência da requisição inicial.
  • Para consultas maiores, o modelo pode falhar em completar se max_tokens ou o timeout do modelo forem atingidos, ou se algum limite de taxa for violado
  • Formato de schema incorreto resultará em erros na conclusão, geralmente por timeout
  • Embora response_format garanta que o modelo produzirá saída de uma forma específica, ele não garante que o modelo forneceu a informação correta dentro dela. O conteúdo é guiado pelo prompt e pelo desempenho do modelo.
  • Saídas estruturadas via response_format não são compatíveis com chamadas de função paralelas
  • Importante: Todos os campos ou parâmetros devem incluir uma tag required. Para tornar um campo opcional, você precisa adicionar uma opção null dentro do type do campo, assim: "type": ["string", "null"]
  • É possível tornar campos opcionais dando uma opção null dentro do campo required para permitir uma resposta vazia.
  • Importante: additionalProperties deve ser definido como false para que response_format funcione corretamente
  • Importante: strict deve ser definido como true para que response_format funcione corretamente