Saltar al contenido principal
Exa es un motor de búsqueda web creado para agentes de IA. El endpoint de búsqueda web de Venice puede ejecutar tus consultas en Exa: establece search_provider en "exa" y Venice ejecuta la búsqueda con Exa bajo retención de datos cero. Te autenticas con tu clave de API de Venice, Venice factura la búsqueda y no necesitas una cuenta de Exa. Los resultados tienen la misma forma para todos los proveedores, así que Exa encaja en cualquier cosa que hayas construido sobre la búsqueda de Brave predeterminada de Venice, y cambiar de proveedor solo requiere modificar un campo. Esta guía explica cómo llamar al endpoint, cómo dar a un modelo de Venice la búsqueda de Exa como herramienta, cómo fundamentar tú mismo un prompt en resultados de Exa y cuándo conviene llamar directamente a la API de Exa.

Requisitos previos

  • Una clave de API de Venice
  • Python 3.10 o posterior, o Node.js 22 o posterior
  • Para el ejemplo de agente, un modelo de Venice compatible con function calling. Los ejemplos usan z-ai-glm-5-3-flash.

Configuración

Instala el SDK de OpenAI y, para Python, también requests. Node.js incluye fetch de forma nativa:
Añade tu clave de API de Venice al entorno:

Busca con Exa

Envía una consulta a /augment/search con search_provider establecido en "exa":
La respuesta contiene la consulta y una lista de resultados, cada uno con cuatro campos:
limit tiene un valor predeterminado de 10 y acepta de 1 a 20, y query acepta de 1 a 400 caracteres. Los valores fuera de esos rangos devuelven 400 en lugar de ajustarse al límite. Trata date como opcional, ya que muchas páginas no publican una fecha.

Da a un modelo de Venice la búsqueda de Exa

Para que un modelo decida cuándo y qué buscar, describe una función web_search en el array tools de una solicitud de chat y ejecuta tú mismo la búsqueda cada vez que el modelo la llame. Este programa envuelve la solicitud anterior en una función auxiliar de búsqueda, devuelve los resultados al modelo como un mensaje tool y repite el ciclo hasta que el modelo responde con texto:
El modelo solo escribe la consulta. Tu código decide todo lo demás: el proveedor, el número de resultados y qué ocurre cuando una búsqueda falla. Conviene conservar tres detalles al adaptar el ciclo:
  • Trunca las consultas escritas por el modelo. El endpoint rechaza las consultas de más de 400 caracteres en lugar de acortarlas, y a veces los modelos escriben consultas largas.
  • Devuelve los errores como resultados de herramienta. Una búsqueda fallida se convierte en un mensaje de herramienta que empieza por Error:, de modo que el modelo puede probar otra consulta o explicar el fallo en lugar de que el ciclo se bloquee.
  • Añade el mensaje del asistente antes de sus resultados de herramienta. Cada mensaje tool debe ir después del turno del asistente que lo solicitó. Añadir el propio objeto del mensaje también conserva reasoning_content, que devuelven los modelos de razonamiento como GLM 5.3 Flash, para que el modelo mantenga su razonamiento entre rondas.
El campo content de cada resultado es texto de la página, de hasta unos 10.000 caracteres, así que normalmente el modelo puede responder solo con los resultados de búsqueda. Cuando necesite una página completa, añade una segunda herramienta que llame a /augment/scrape, que devuelve la página como Markdown.

Busca primero, luego genera

Function calling permite que el modelo decida cuándo y qué buscar. Cuando tu código ya sabe qué buscar, puedes omitir el ciclo de herramientas: ejecuta una búsqueda de Exa, numera los resultados y pide a Venice que responda a partir de ellos. Esto funciona con cualquier modelo de texto de Venice y, como conservas la lista de fuentes incluidas en el prompt, cada cita de la respuesta se corresponde con una URL. Usando la función auxiliar de búsqueda, el cliente y el modelo del ejemplo anterior:
Respuestas con citas mediante búsqueda web amplía este patrón con selección de fuentes, extracción de páginas y gestión de páginas que no se cargan. Su función auxiliar de búsqueda acepta un argumento de proveedor, así que pasa "exa" para ejecutarla en Exa.

Usa la API de Exa directamente

El endpoint de búsqueda de Venice acepta una consulta y un número de resultados. La API propia de Exa ofrece más controles: categorías para noticias, artículos de investigación, empresas, personas e informes financieros, filtros de dominio y fecha, fragmentos destacados centrados en la consulta y texto completo de la página, y búsqueda profunda en varios pasos. Para usarlos, llama directamente a Exa con una clave de API del panel de Exa. Esas solicitudes van de tu aplicación a Exa, se rigen por los términos de Exa en lugar de los de Venice y se facturan a tu cuenta de Exa. Exa ofrece Zero Data Retention en los planes Enterprise. Los SDK de Exa, exa-py y exa-js 2.24.0 o posterior, incluyen herramientas en el formato de Chat Completions que se integran directamente en el ciclo anterior. Sustituye la lista de herramientas por las herramientas de Exa:
Después, pasa cada mensaje con llamadas a herramientas al SDK en lugar de a tu propio ejecutor de herramientas: messages += exa.openai.handle_tool_calls(message) en Python, o messages.push(...(await exa.openai.handleToolCalls(message))) en Node.js. El SDK ejecuta cada llamada a Exa y devuelve los mensajes tool correspondientes, con los fallos indicados como resultados Error:. Mantén el límite de texto de página, porque exa-js devuelve páginas completas si no lo tiene. Los argumentos con nombre como category, include_domains y start_published_date se transmiten a la búsqueda de Exa. Consulta la guía de tool calling de Exa para ver todas las opciones.

Modelos recomendados

Los ID de modelo cambian. Obtén el modelo predeterminado actual para function calling en tiempo de ejecución con GET /models/traits, o consulta los modelos de texto para encontrar otros compatibles con function calling.

Privacidad

Con search_provider: "exa", tu aplicación solo se comunica con Venice, y Venice ejecuta cada búsqueda con Exa bajo retención de datos cero. Venice no almacena el contenido de los prompts ni de las respuestas, y el nivel de privacidad del modelo determina lo que ocurre en la capa de inferencia. Los modelos privados se ejecutan en infraestructura con retención de datos cero. Lo que es fácil pasar por alto es que el modelo escribe las consultas de búsqueda a partir de la conversación, así que los detalles de un prompt pueden acabar en una consulta enviada a Exa. Si los prompts pueden contener información personal o confidencial, indica al modelo en tu system prompt que no incluya esos detalles en las búsquedas, o usa el patrón de búsqueda primero para que tu propio código escriba cada consulta. Si llamas directamente a la API de Exa, esas solicitudes van a Exa y se rigen por los términos de Exa.

Costes

Cada búsqueda cuesta 0,01 ,o10, o 10 por cada 1.000, lo mismo que una búsqueda de Brave o Google. Venice la factura en tu cuenta de Venice junto con los tokens que usan tus solicitudes de chat, así que no hay una factura aparte de Exa. Las búsquedas que fallan con un error no se cobran, pero una búsqueda que vuelve vacía sí. Los resultados de búsqueda vuelven al modelo como entrada en la siguiente ronda y, como incluyen texto de página, una búsqueda de cinco resultados suele añadir entre 5.000 y 10.000 tokens de entrada. Algunos hábitos mantienen ambos costes bajos:
  • Reduce limit cuando basten unas pocas fuentes. Una búsqueda cuesta lo mismo con cualquier limit, pero menos resultados implican menos tokens de entrada en la siguiente ronda.
  • Mantén max_rounds bajo. Cada ronda adicional puede añadir búsquedas además de tokens.
  • Usa el patrón de búsqueda primero cuando tu código sepa qué buscar. Ejecuta exactamente una búsqueda y una solicitud de chat.
Los agentes con una wallet de criptomonedas pueden prescindir de la clave de API. Tanto /augment/search como /chat/completions aceptan autenticación con wallet x402, así que un agente puede pagar las búsquedas de Exa y la inferencia con un único saldo prepagado en USDC.

Solución de problemas

Confirma que VENICE_API_KEY está definida en el proceso que ejecuta tu código. Sin ella, Python lanza KeyError: 'VENICE_API_KEY', y el SDK de OpenAI para Node.js recurre a OPENAI_API_KEY. Si esa tampoco está definida, obtienes un error Missing credentials. Si está definida, el SDK envía tu clave de OpenAI a Venice, que la rechaza con 401. Un 401 con VENICE_API_KEY definida significa que Venice rechazó la propia clave, así que revisa si tiene errores tipográficos o genera una nueva.
query debe tener de 1 a 400 caracteres, limit debe estar entre 1 y 20, y search_provider debe ser brave, google o exa. Los valores fuera de esos rangos se rechazan en lugar de ajustarse al límite. En el ciclo de herramientas, una búsqueda rechazada llega al modelo como un resultado de herramienta Error: en lugar de lanzar una excepción.
Tu saldo de Venice no cubre la solicitud. Las solicitudes hechas con una clave de API devuelven INSUFFICIENT_BALANCE, así que recarga tu saldo de Venice. Las solicitudes hechas con autenticación con wallet x402 devuelven instrucciones de recarga en la respuesta.
Algunos modelos, incluidos los de Claude y GPT, devuelven 400 cuando una llamada a herramienta no va seguida de un mensaje tool con su tool_call_id. Los modelos GLM aceptan la conversación de todos modos, así que este error puede aparecer por primera vez al cambiar de modelo. El ciclo responde a cada llamada justo después del mensaje del asistente que la hizo, así que mantén esa estructura si añades herramientas.
Comprueba que el modelo sea compatible con function calling e indica en el system prompt cuándo debe buscar. Los modelos suelen omitir la herramienta cuando creen que pueden responder de memoria, a menos que les indiques que busquen datos recientes o específicos.

Recursos

API Web Search

Parámetros, proveedores de búsqueda y el esquema de la respuesta

Respuestas con citas

Un pipeline completo de búsqueda, extracción y citas en Venice

Function Calling

Cómo funcionan las llamadas a herramientas en Venice

Documentación de Exa

La API propia de Exa, sus SDK y opciones de búsqueda