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énrequests. Node.js incluye fetch de forma nativa:
Busca con Exa
Envía una consulta a/augment/search con search_provider establecido en "exa":
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ónweb_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:
- 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
tooldebe ir después del turno del asistente que lo solicitó. Añadir el propio objeto del mensaje también conservareasoning_content, que devuelven los modelos de razonamiento como GLM 5.3 Flash, para que el modelo mantenga su razonamiento entre rondas.
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:"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:
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
Consearch_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 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
limitcuando basten unas pocas fuentes. Una búsqueda cuesta lo mismo con cualquierlimit, pero menos resultados implican menos tokens de entrada en la siguiente ronda. - Mantén
max_roundsbajo. 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.
Solución de problemas
400 desde el endpoint de búsqueda
400 desde el endpoint de búsqueda
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.402 Payment Required
402 Payment Required
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.400 de Venice después de una ronda de herramientas
400 de Venice después de una ronda de herramientas
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.El modelo responde sin buscar
El modelo responde sin buscar
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