Pular para o conteúdo principal
O Exa é um mecanismo de busca na web criado para agentes de IA. O endpoint de busca na web da Venice pode executar suas consultas no Exa: defina search_provider como "exa" e a Venice executa a busca com o Exa sob retenção zero de dados. Você se autentica com sua chave de API da Venice, a Venice cobra pela busca e você não precisa de uma conta Exa. Os resultados chegam no mesmo formato para todos os provedores, então o Exa se encaixa em qualquer coisa que você já tenha construído sobre a busca padrão do Brave na Venice, e trocar de provedor exige a mudança de um único campo. Este guia mostra como chamar o endpoint, como oferecer a busca do Exa como ferramenta a um modelo Venice, como fundamentar um prompt em resultados do Exa por conta própria e quando chamar a API do próprio Exa.

Pré-requisitos

  • Uma chave de API da Venice
  • Python 3.10 ou posterior, ou Node.js 22 ou posterior
  • Para o exemplo de agente, um modelo Venice com suporte a function calling. Os exemplos usam z-ai-glm-5-3-flash.

Configuração

Instale o SDK da OpenAI e também o requests para Python. O Node.js já tem fetch integrado:
Adicione sua chave de API da Venice ao ambiente:

Pesquisar com o Exa

Envie uma consulta para /augment/search com search_provider definido como "exa":
A resposta contém a consulta e uma lista de resultados, cada um com quatro campos:
limit tem padrão 10 e aceita de 1 a 20, e query aceita de 1 a 400 caracteres. Valores fora desses intervalos retornam 400 em vez de serem ajustados. Trate date como opcional, já que muitas páginas não publicam uma data.

Oferecer a busca do Exa a um modelo Venice

Para deixar o modelo decidir quando e o que pesquisar, descreva uma função web_search no array tools de uma requisição de chat e execute a busca você mesmo sempre que o modelo a chamar. Este programa encapsula a requisição acima em uma função auxiliar de busca, devolve os resultados ao modelo como uma mensagem tool e repete o ciclo até o modelo responder em texto:
O modelo só escreve a consulta. Seu código decide todo o resto: o provedor, o número de resultados e o que acontece quando uma busca falha. Vale manter três detalhes ao adaptar o loop:
  • Trunque as consultas escritas pelo modelo. O endpoint rejeita consultas com mais de 400 caracteres em vez de encurtá-las, e os modelos às vezes escrevem consultas longas.
  • Retorne erros como resultados de ferramenta. Uma busca que falha vira uma mensagem de ferramenta começando com Error:, para que o modelo possa tentar outra consulta ou explicar a falha em vez de o loop travar.
  • Adicione a mensagem do assistente antes dos resultados das ferramentas. Toda mensagem tool precisa vir depois do turno do assistente que a solicitou. Adicionar o próprio objeto da mensagem também preserva o reasoning_content, retornado por modelos de raciocínio como o GLM 5.3 Flash, para que o modelo mantenha seu raciocínio entre as rodadas.
O content de cada resultado é o texto da página, com até cerca de 10.000 caracteres, então o modelo geralmente consegue responder apenas com os resultados da busca. Quando ele precisar de uma página inteira, adicione uma segunda ferramenta que chame /augment/scrape, que retorna a página em Markdown.

Pesquisar primeiro, depois gerar

O function calling deixa o modelo decidir quando e o que pesquisar. Quando seu código já sabe o que pesquisar, você pode dispensar o loop de ferramentas: execute uma busca no Exa, numere os resultados e peça à Venice que responda com base neles. Isso funciona com qualquer modelo de texto da Venice e, como você mantém a lista de fontes que entraram no prompt, cada citação na resposta pode ser associada a uma URL. Usando a função auxiliar de busca, o cliente e o modelo do exemplo anterior:
O guia Respostas com Citações usando Web Search amplia esse padrão com seleção de fontes, extração de páginas e tratamento de páginas que não carregam. A função auxiliar de busca dele recebe um argumento de provedor, então passe "exa" para executá-la no Exa.

Usar a API do Exa diretamente

O endpoint de busca da Venice recebe uma consulta e um número de resultados. A API do próprio Exa tem mais controles: categorias para notícias, artigos científicos, empresas, pessoas e relatórios financeiros, filtros de domínio e data, destaques focados na consulta e texto completo da página, além de busca profunda em várias etapas. Para usá-los, chame o Exa diretamente com uma chave de API do painel do Exa. Essas requisições vão da sua aplicação para o Exa, ficam sujeitas aos termos do Exa e não aos da Venice, e são cobradas na sua conta Exa. O Exa oferece Zero Data Retention nos planos Enterprise. Os SDKs do Exa, exa-py e exa-js 2.24.0 ou posterior, incluem ferramentas no formato Chat Completions que se encaixam no loop acima. Substitua a lista de ferramentas pelas ferramentas do Exa:
Em seguida, passe cada mensagem com chamadas de ferramenta ao SDK em vez do seu próprio executor de ferramentas: messages += exa.openai.handle_tool_calls(message) em Python, ou messages.push(...(await exa.openai.handleToolCalls(message))) em Node.js. Ele executa cada chamada ao Exa e retorna as mensagens tool correspondentes, com as falhas informadas como resultados Error:. Mantenha o limite de texto da página, porque o exa-js retorna páginas inteiras sem limite. Argumentos nomeados como category, include_domains e start_published_date são repassados para a busca do Exa. Consulte o guia de tool calling do Exa para ver todas as opções.

Modelos recomendados

Os IDs de modelo mudam com o tempo. Descubra o padrão atual de function calling em tempo de execução com GET /models/traits, ou navegue pelos modelos de texto para encontrar outros com suporte a function calling.

Privacidade

Com search_provider: "exa", sua aplicação se comunica apenas com a Venice, e a Venice executa cada busca com o Exa sob retenção zero de dados. A Venice não armazena o conteúdo de prompts ou respostas, e o nível de privacidade do modelo define o que acontece na camada de inferência. Os modelos privados rodam em infraestrutura com retenção zero de dados. Um ponto fácil de passar despercebido é que o modelo escreve as consultas de busca a partir da conversa, então detalhes de um prompt podem acabar em uma consulta enviada ao Exa. Se os prompts puderem conter informações pessoais ou confidenciais, instrua o modelo no seu system prompt a deixar esses detalhes fora das buscas, ou use o padrão de pesquisar primeiro para que seu próprio código escreva todas as consultas. Se você chamar a API do Exa diretamente, essas requisições vão para o Exa sob os termos do Exa.

Custos

Cada busca custa US0,01,ouUS 0,01, ou US 10 a cada 1.000, o mesmo que uma busca no Brave ou no Google. A Venice cobra na sua conta Venice junto com os tokens usados pelas suas requisições de chat, então não há uma fatura separada do Exa. Buscas que falham com erro não são cobradas, mas uma busca que retorna vazia ainda é. Os resultados da busca voltam ao modelo como entrada na rodada seguinte e, como trazem o texto das páginas, uma busca com cinco resultados costuma adicionar de 5.000 a 10.000 tokens de entrada. Alguns hábitos mantêm os dois custos baixos:
  • Reduza limit quando poucas fontes forem suficientes. Uma busca custa o mesmo com qualquer limit, mas menos resultados significam menos tokens de entrada na rodada seguinte.
  • Mantenha max_rounds baixo. Cada rodada extra pode adicionar buscas, além de tokens.
  • Use o padrão de pesquisar primeiro quando seu código souber o que pesquisar. Ele executa exatamente uma busca e uma requisição de chat.
Agentes com uma carteira cripto podem dispensar a chave de API. Tanto /augment/search quanto /chat/completions aceitam autenticação por carteira x402, então um agente pode pagar pelas buscas no Exa e pela inferência com um único saldo pré-pago em USDC.

Solução de problemas

Confirme que VENICE_API_KEY está definida no processo que executa seu código. Sem ela, o Python lança KeyError: 'VENICE_API_KEY', e o SDK da OpenAI para Node.js recorre a OPENAI_API_KEY. Se essa também não estiver definida, você recebe um erro Missing credentials. Se estiver definida, o SDK envia sua chave da OpenAI para a Venice, que a rejeita com 401. Um 401 com VENICE_API_KEY definida significa que a Venice rejeitou a própria chave, então verifique se há erros de digitação ou gere uma nova.
query deve ter de 1 a 400 caracteres, limit deve estar entre 1 e 20, e search_provider deve ser brave, google ou exa. Valores fora desses intervalos são rejeitados em vez de ajustados. No loop de ferramentas, uma busca rejeitada chega ao modelo como um resultado de ferramenta Error: em vez de lançar uma exceção.
Seu saldo na Venice não cobre a requisição. Requisições feitas com uma chave de API retornam INSUFFICIENT_BALANCE, então recarregue seu saldo na Venice. Requisições feitas com autenticação por carteira x402 retornam instruções de recarga na resposta.
Alguns modelos, incluindo os modelos Claude e GPT, retornam 400 quando uma chamada de ferramenta não é seguida por uma mensagem tool com seu tool_call_id. Os modelos GLM aceitam a conversa mesmo assim, então isso pode aparecer pela primeira vez quando você troca de modelo. O loop responde a cada chamada logo após a mensagem do assistente que a fez, então mantenha essa estrutura se adicionar ferramentas.
Verifique se o modelo tem suporte a function calling e diga no system prompt quando pesquisar. Os modelos costumam ignorar a ferramenta quando acham que conseguem responder de memória, a menos que você peça que pesquisem fatos recentes ou específicos.

Recursos

API Web Search

Parâmetros, provedores de busca e o esquema da resposta

Respostas com Citações

Um pipeline completo de busca, extração e citação na Venice

Function Calling

Como as chamadas de ferramenta funcionam na Venice

Documentação do Exa

A API do próprio Exa, SDKs e opções de busca