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 querequests pour Python. Node.js intègre fetch nativement :
Rechercher avec Exa
Envoyez une requête à/augment/search avec search_provider défini sur "exa" :
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 fonctionweb_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 :
- 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
tooldoit suivre le tour de l’assistant qui l’a demandé. Ajouter l’objet message lui-même conserve aussireasoning_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.
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 :"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 :
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é
Avecsearch_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 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
limitlorsque quelques sources suffisent. Une recherche coûte le même prix quelle que soit la valeur delimit, mais moins de résultats signifie moins de tokens d’entrée au tour suivant. - Gardez
max_roundsbas. 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.
Dépannage
Erreur 400 du point de terminaison de recherche
Erreur 400 du point de terminaison de recherche
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.402 Payment Required
402 Payment Required
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.Erreur 400 de Venice après un tour d'outils
Erreur 400 de Venice après un tour d'outils
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.Le modèle répond sans effectuer de recherche
Le modèle répond sans effectuer de recherche
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