Les agents LLM qui utilisent des outils de recherche web consomment souvent trop de jetons car les résultats bruts contiennent des titres, des extraits, des URL, des métadonnées et des fonctionnalités SERP dont l'agent n'a pas besoin. Transmettre l'intégralité des réponses de recherche dans la fenêtre de contexte de l'agent gaspille des jetons et de l'argent. Ce tutoriel montre comment compresser les résultats de recherche en extrayant uniquement les champs nécessaires à l'agent, en tronquant les extraits, en dédoublonnant le contenu et en formatant les résultats sous forme de texte compact. Vous allez construire une couche de compression de recherche qui réduit le nombre de jetons de 60 à 80 % tout en conservant une densité d'information élevée.
Prérequis
- Python 3.8+ installé
- bibliothèque requests installée
- Une clé API Scavio provenant de scavio.dev
- Un agent LLM qui utilise des outils de recherche
Parcours
Étape 1: Récupérer les résultats bruts de la recherche
Interroger l'API Scavio et mesurer le nombre brut de jetons de la réponse complète.
import os, requests, json
API_KEY = os.environ["SCAVIO_API_KEY"]
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": "best CRM for startups 2026"})
raw = resp.json()
raw_size = len(json.dumps(raw))
print(f"Raw response: {raw_size} chars")Étape 2: Extraire uniquement les champs essentiels
Réduire la réponse aux seuls champs dont l'agent a besoin : titre, extrait et URL.
def compress_results(data, max_results=5):
results = []
for r in data.get("organic_results", [])[:max_results]:
results.append({
"title": r.get("title", "")[:80],
"snippet": r.get("snippet", "")[:200],
"url": r.get("link", ""),
})
return results
compressed = compress_results(raw)
comp_size = len(json.dumps(compressed))
print(f"Compressed: {comp_size} chars ({100 - round(comp_size/raw_size*100)}% reduction)")Étape 3: Formater en texte compact pour le contexte de l'agent
Convertir les résultats structurés en un format texte minimal qui utilise moins de jetons que le JSON.
def format_for_agent(results):
lines = []
for i, r in enumerate(results, 1):
lines.append(f"[{i}] {r['title']}")
lines.append(f" {r['snippet']}")
lines.append(f" {r['url']}")
return "\n".join(lines)
agent_text = format_for_agent(compressed)
print(f"Agent text: {len(agent_text)} chars")
print(agent_text[:500])Étape 4: Dédoublonner les résultats qui se chevauchent
Supprimer les résultats quasi identiques qui gaspillent le contexte de l'agent avec des informations redondantes.
def deduplicate(results):
seen_domains = set()
unique = []
for r in results:
from urllib.parse import urlparse
domain = urlparse(r["url"]).netloc
if domain not in seen_domains:
seen_domains.add(domain)
unique.append(r)
return unique
deduped = deduplicate(compressed)
print(f"After dedup: {len(deduped)} results (was {len(compressed)})")Étape 5: Construire l'encapsuleur de compression
Combiner toutes les étapes de compression en une seule fonction qui remplace l'appel de recherche brut dans votre agent.
def agent_search(query, max_results=5):
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": query})
compressed = compress_results(resp.json(), max_results)
deduped = deduplicate(compressed)
return format_for_agent(deduped)
result = agent_search("best CRM for startups 2026")
print(f"Final token-efficient output: {len(result)} chars")Exemple Python
import os, requests, json
API_KEY = os.environ["SCAVIO_API_KEY"]
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": "best CRM for startups 2026"})
results = resp.json().get("organic_results", [])[:5]
for r in results:
print(f"{r['title'][:80]}\n {r.get('snippet', '')[:150]}")Exemple JavaScript
const r = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: {"x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json"},
body: JSON.stringify({platform: "google", query: "best CRM for startups 2026"})
});
const data = await r.json();
(data.organic_results || []).slice(0, 5).forEach(r =>
console.log(r.title.slice(0, 80), "\n ", (r.snippet || "").slice(0, 150))
);Sortie attendue
A compressed text representation of search results that uses 60-80% fewer tokens than the raw JSON response while preserving all information an agent needs.