Passer au contenu principal
Exa est un moteur de recherche web conçu pour les agents IA. Le point de terminaison de recherche web de Venice peut exécuter vos requêtes sur Exa : définissez search_provider sur "exa" et Venice effectue la recherche avec Exa en non-conservation des données (Zero Data Retention). Vous vous authentifiez avec votre clé API Venice, Venice facture la recherche et vous n’avez pas besoin de compte Exa. Les résultats ont le même format quel que soit le fournisseur : Exa s’intègre donc à tout ce que vous avez construit sur la recherche Brave par défaut de Venice, et changer de fournisseur ne demande de modifier qu’un seul champ. Ce guide explique comment appeler le point de terminaison, donner à un modèle Venice la recherche Exa comme outil, ancrer vous-même un prompt dans des résultats Exa, et quand appeler plutôt l’API d’Exa.

Prérequis

  • Une clé API Venice
  • Python 3.10 ou version ultérieure, ou Node.js 22 ou version ultérieure
  • Pour l’exemple d’agent, un modèle Venice compatible avec l’appel de fonctions. Les exemples utilisent z-ai-glm-5-3-flash.

Configuration

Installez le SDK OpenAI, ainsi que requests pour Python. Node.js intègre fetch nativement :
Ajoutez votre clé API Venice à l’environnement :

Rechercher avec Exa

Envoyez une requête à /augment/search avec search_provider défini sur "exa" :
La réponse contient la requête et une liste de résultats, chacun comportant quatre champs :
limit vaut 10 par défaut et accepte des valeurs de 1 à 20, et query accepte de 1 à 400 caractères. Les valeurs hors de ces plages renvoient une erreur 400 au lieu d’être ramenées dans la plage. Considérez date comme facultatif, car de nombreuses pages n’en publient pas.

Donner la recherche Exa à un modèle Venice

Pour laisser un modèle décider quand et quoi rechercher, décrivez une fonction web_search dans le tableau tools d’une requête de chat, et exécutez vous-même la recherche chaque fois que le modèle l’appelle. Ce programme encapsule la requête ci-dessus dans une fonction de recherche, renvoie les résultats au modèle sous forme de message tool et boucle jusqu’à ce que le modèle réponde en texte :
Le modèle ne fait qu’écrire la requête. Votre code décide de tout le reste : le fournisseur, le nombre de résultats et ce qui se passe en cas d’échec d’une recherche. Trois détails méritent d’être conservés lorsque vous adaptez la boucle :
  • Tronquez les requêtes écrites par le modèle. Le point de terminaison rejette les requêtes de plus de 400 caractères au lieu de les raccourcir, et les modèles en écrivent parfois de longues.
  • Renvoyez les erreurs comme résultats d’outil. Une recherche échouée devient un message d’outil commençant par Error:, ce qui permet au modèle d’essayer une autre requête ou d’expliquer l’échec au lieu de faire planter la boucle.
  • Ajoutez le message de l’assistant avant ses résultats d’outil. Chaque message tool doit suivre le tour de l’assistant qui l’a demandé. Ajouter l’objet message lui-même conserve aussi reasoning_content, que renvoient les modèles de raisonnement comme GLM 5.3 Flash, afin que le modèle garde son raisonnement d’un tour à l’autre.
Le champ content de chaque résultat contient le texte de la page, jusqu’à environ 10 000 caractères, de sorte que le modèle peut généralement répondre à partir des seuls résultats de recherche. Lorsqu’il a besoin d’une page entière, ajoutez un second outil qui appelle /augment/scrape, lequel renvoie la page en Markdown.

Commencer par la recherche

L’appel de fonctions laisse le modèle décider quand et quoi rechercher. Lorsque votre code sait déjà quoi rechercher, vous pouvez vous passer de la boucle d’outils : lancez une seule recherche Exa, numérotez les résultats et demandez à Venice de répondre à partir de ceux-ci. Cela fonctionne avec n’importe quel modèle de texte Venice, et comme vous conservez la liste des sources incluses dans le prompt, chaque citation de la réponse renvoie à une URL. En reprenant la fonction de recherche, le client et le modèle de l’exemple précédent :
Réponses sourcées avec la recherche web étend ce modèle avec la sélection des sources, l’extraction des pages et la gestion des pages qui ne se chargent pas. Sa fonction de recherche accepte un argument de fournisseur : passez "exa" pour l’exécuter sur Exa.

Appeler Exa directement

Le point de terminaison de recherche de Venice accepte une requête et un nombre de résultats. L’API d’Exa propose davantage de contrôles : des catégories pour les actualités, les articles de recherche, les entreprises, les personnes et les rapports financiers, des filtres par domaine et par date, des extraits ciblés sur la requête et le texte intégral des pages, ainsi qu’une recherche approfondie en plusieurs étapes. Pour les utiliser, appelez Exa directement avec une clé API obtenue depuis le tableau de bord Exa. Ces requêtes vont de votre application à Exa, relèvent des conditions d’Exa et non de celles de Venice, et sont facturées sur votre compte Exa. Exa propose la non-conservation des données avec ses offres Enterprise. Les SDK Exa, exa-py et exa-js 2.24.0 ou version ultérieure, incluent des outils au format Chat Completions qui s’intègrent directement à la boucle ci-dessus. Remplacez la liste d’outils par les outils d’Exa :
Transmettez ensuite chaque message contenant des appels d’outils au SDK au lieu de votre propre gestionnaire d’outils : messages += exa.openai.handle_tool_calls(message) en Python, ou messages.push(...(await exa.openai.handleToolCalls(message))) en Node.js. Le SDK exécute chaque appel Exa et renvoie les messages tool correspondants, les échecs étant signalés sous forme de résultats Error:. Conservez la limite de texte par page, car exa-js renvoie des pages entières sans limite. Les arguments nommés tels que category, include_domains et start_published_date sont transmis à la recherche Exa. Consultez le guide d’appel d’outils d’Exa pour toutes les options.

Modèles recommandés

Les identifiants de modèles évoluent. Déterminez le modèle par défaut actuel pour l’appel de fonctions à l’exécution avec GET /models/traits, ou parcourez les modèles de texte pour en trouver d’autres compatibles avec l’appel de fonctions.

Confidentialité

Avec search_provider: "exa", votre application communique uniquement avec Venice, et Venice effectue chaque recherche avec Exa en non-conservation des données. Venice ne stocke pas le contenu des prompts ni des réponses, et le niveau de confidentialité du modèle détermine ce qui se passe au niveau de l’inférence. Les modèles privés s’exécutent sur une infrastructure sans conservation des données. Un point facile à négliger : le modèle rédige les requêtes de recherche à partir de la conversation, si bien que des détails d’un prompt peuvent se retrouver dans une requête envoyée à Exa. Si les prompts peuvent contenir des informations personnelles ou confidentielles, demandez au modèle dans votre prompt système de ne pas inclure ces détails dans les recherches, ou utilisez le modèle « rechercher d’abord » afin que votre propre code rédige chaque requête. Si vous appelez directement l’API Exa, ces requêtes sont envoyées à Exa et relèvent alors des conditions d’Exa.

Coûts

Chaque recherche coûte 0,01 ,soit10, soit 10 pour 1 000, comme une recherche Brave ou Google. Venice la facture sur votre compte Venice avec les tokens utilisés par vos requêtes de chat : il n’y a donc pas de facture Exa séparée. Les recherches qui échouent avec une erreur ne sont pas facturées, mais une recherche qui ne renvoie aucun résultat l’est. Les résultats de recherche sont renvoyés au modèle en entrée au tour suivant, et comme ils contiennent le texte des pages, une recherche de cinq résultats ajoute souvent 5 000 à 10 000 tokens d’entrée. Quelques habitudes permettent de limiter les deux :
  • Réduisez limit lorsque quelques sources suffisent. Une recherche coûte le même prix quelle que soit la valeur de limit, mais moins de résultats signifie moins de tokens d’entrée au tour suivant.
  • Gardez max_rounds bas. Chaque tour supplémentaire peut ajouter des recherches en plus des tokens.
  • Utilisez le modèle « rechercher d’abord » lorsque votre code sait quoi rechercher. Il exécute exactement une recherche et une requête de chat.
Les agents disposant d’un portefeuille crypto peuvent se passer de clé API. /augment/search et /chat/completions acceptent tous deux l’authentification par portefeuille x402, de sorte qu’un agent peut payer les recherches Exa et l’inférence à partir d’un seul solde USDC prépayé.

Dépannage

Vérifiez que VENICE_API_KEY est défini dans le processus qui exécute votre code. Sans elle, Python lève KeyError: 'VENICE_API_KEY', et le SDK OpenAI pour Node.js se rabat sur OPENAI_API_KEY. Si celle-ci n’est pas définie non plus, vous obtenez une erreur Missing credentials. Si elle est définie, le SDK envoie votre clé OpenAI à Venice, qui la rejette avec une erreur 401. Une erreur 401 alors que VENICE_API_KEY est défini signifie que Venice a rejeté la clé elle-même : vérifiez qu’elle ne contient pas de faute de frappe ou générez-en une nouvelle.
query doit contenir de 1 à 400 caractères, limit doit être compris entre 1 et 20, et search_provider doit valoir brave, google ou exa. Les valeurs hors de ces plages sont rejetées au lieu d’être ramenées dans la plage. Dans la boucle d’outils, une recherche rejetée parvient au modèle sous forme de résultat d’outil Error: au lieu de lever une exception.
Votre solde Venice ne suffit pas à couvrir la requête. Les requêtes effectuées avec une clé API renvoient INSUFFICIENT_BALANCE : rechargez alors votre solde Venice. Les requêtes effectuées avec l’authentification par portefeuille x402 renvoient des instructions de rechargement dans la réponse.
Certains modèles, dont les modèles Claude et GPT, renvoient une erreur 400 lorsqu’un appel d’outil n’est pas suivi d’un message tool portant son tool_call_id. Les modèles GLM acceptent tout de même la conversation, si bien que cette erreur peut n’apparaître qu’au moment où vous changez de modèle. La boucle répond à chaque appel juste après le message de l’assistant qui l’a émis : conservez cette structure si vous ajoutez des outils.
Vérifiez que le modèle prend en charge l’appel de fonctions, et indiquez dans le prompt système quand effectuer une recherche. Les modèles ignorent souvent l’outil lorsqu’ils pensent pouvoir répondre de mémoire, sauf si vous leur demandez de rechercher les faits récents ou précis.

Ressources

API Web Search

Paramètres, fournisseurs de recherche et schéma de réponse

Réponses sourcées

Un pipeline complet de recherche, d’extraction et de citation sur Venice

Appel de fonctions

Fonctionnement des appels d’outils sur Venice

Documentation Exa

L’API, les SDK et les options de recherche d’Exa