Les workflows d'agents multi-étapes transmettent les résultats de recherche entre les étapes, mais les réponses brutes de l'API gaspillent les tokens de la fenêtre de contexte sur des champs non pertinents. Un pont de contexte sérialise les résultats de recherche dans le JSON structuré minimum dont chaque étape d'agent a besoin, réduisant l'utilisation de tokens de 60 à 80 % tout en préservant les données importantes. Ce tutoriel construit un pont qui compresse et formate les résultats de recherche pour la consommation des agents.
Prérequis
- Python 3.8+
- bibliothèque requests
- Une clé API Scavio depuis scavio.dev
- Un cadre d'agent (LangChain, CrewAI ou personnalisé)
Parcours
Étape 1: Définir les stratégies de compression de contexte
Créer des niveaux de compression pour différentes tailles de fenêtre de contexte d'agent.
import os, requests, json
API_KEY = os.environ['SCAVIO_API_KEY']
SH = {'x-api-key': API_KEY, 'Content-Type': 'application/json'}
def compress_results(results, level='medium'):
"""Compress search results for agent context windows."""
if level == 'minimal':
# ~20 tokens per result (for 4K context models)
return [{'t': r.get('title', '')[:40], 'u': r.get('link', '').split('/')[2] if r.get('link') else ''}
for r in results[:3]]
elif level == 'medium':
# ~60 tokens per result (for 8K-16K context)
return [{'title': r.get('title', '')[:60], 'domain': r.get('link', '').split('/')[2] if r.get('link') else '',
'snippet': r.get('snippet', '')[:100]} for r in results[:5]]
else: # full
# ~120 tokens per result (for 32K+ context)
return [{'title': r.get('title', ''), 'link': r.get('link', ''),
'snippet': r.get('snippet', ''), 'position': r.get('position', 0)}
for r in results[:10]]
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': 'best serp api 2026', 'country_code': 'us'}).json()
results = data.get('organic_results', [])
for level in ['minimal', 'medium', 'full']:
compressed = compress_results(results, level)
tokens_est = len(json.dumps(compressed)) // 4
print(f'{level:8}: {len(compressed)} results, ~{tokens_est} tokens')Étape 2: Construire la classe du pont de contexte
Créer un pont qui gère le contexte de recherche à travers les étapes de l'agent.
class ContextBridge:
def __init__(self, max_tokens=4000):
self.max_tokens = max_tokens
self.context = []
self.token_count = 0
self.searches = 0
self.cost = 0.0
def search(self, query, platform=None):
body = {'query': query, 'country_code': 'us'}
if platform: body['platform'] = platform
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json=body).json()
self.searches += 1
self.cost += 0.005
results = data.get('organic_results', [])
# Auto-select compression based on remaining budget
remaining = self.max_tokens - self.token_count
if remaining < 500: level = 'minimal'
elif remaining < 2000: level = 'medium'
else: level = 'full'
compressed = compress_results(results, level)
entry = {'query': query, 'platform': platform or 'google',
'results': compressed, 'level': level}
tokens = len(json.dumps(entry)) // 4
self.context.append(entry)
self.token_count += tokens
return entry
def get_context(self):
return json.dumps(self.context, indent=None)
def stats(self):
return f'{self.searches} searches, ~{self.token_count} tokens, ${self.cost:.3f}'
bridge = ContextBridge(max_tokens=4000)
bridge.search('best serp api 2026')
bridge.search('serp api user reviews', platform='reddit')
print(f'Stats: {bridge.stats()}')Étape 3: Ajouter l'extraction de fonctionnalités SERP
Extraire les données de l'aperçu IA et de l'extrait en vedette pour le contexte de l'agent.
def extract_features(data):
"""Extract SERP features into agent-friendly format."""
features = {}
if data.get('ai_overview'):
ao = data['ai_overview']
features['ai_overview'] = {
'present': True,
'text': json.dumps(ao)[:200] if isinstance(ao, dict) else str(ao)[:200]
}
if data.get('answer_box'):
ab = data['answer_box']
features['answer_box'] = {
'title': ab.get('title', '')[:60],
'answer': ab.get('answer', ab.get('snippet', ''))[:150]
}
paa = data.get('related_questions', [])
if paa:
features['people_also_ask'] = [q.get('question', '')[:80] for q in paa[:4]]
return features
def search_with_features(query):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': query, 'country_code': 'us', 'include_ai_overview': True}).json()
results = compress_results(data.get('organic_results', []), 'medium')
features = extract_features(data)
return {'query': query, 'results': results, 'features': features}
context = search_with_features('best python framework 2026')
print(json.dumps(context, indent=2)[:500])Étape 4: Sérialiser le contexte pour les workflows multi-étapes
Formater le contexte accumulé pour le transfert entre les étapes de l'agent.
def format_for_agent(bridge, task_description):
"""Format accumulated search context for the next agent step."""
context_str = bridge.get_context()
prompt = f"""Based on the following search results gathered across {bridge.searches} searches:
{context_str}
Task: {task_description}
Provide your analysis based solely on the search data above. Note any gaps."""
token_est = len(prompt) // 4
print(f'Context prompt: ~{token_est} tokens ({bridge.stats()})')
return prompt
# Example multi-step workflow
bridge = ContextBridge(max_tokens=6000)
bridge.search('serp api pricing comparison 2026')
bridge.search('serp api developer reviews', platform='reddit')
bridge.search('serp api python tutorial', platform='youtube')
prompt = format_for_agent(bridge,
'Compare the top 3 SERP APIs by pricing, developer experience, and community sentiment.')
print(f'\nPrompt preview:\n{prompt[:300]}...')
print(f'\nTotal search cost: ${bridge.cost:.3f}')Exemple Python
import os, requests, json
SH = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
def bridge_search(query, max_results=3):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': query, 'country_code': 'us'}).json()
compressed = [{'title': r['title'][:50], 'snippet': r.get('snippet', '')[:80]}
for r in data.get('organic_results', [])[:max_results]]
tokens = len(json.dumps(compressed)) // 4
print(f'{query}: {len(compressed)} results, ~{tokens} tokens. Cost: $0.005')
return compressed
bridge_search('best serp api 2026')Exemple JavaScript
const SH = { 'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json' };
async function bridgeSearch(query, maxResults = 3) {
const data = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: SH,
body: JSON.stringify({ query, country_code: 'us' })
}).then(r => r.json());
const compressed = (data.organic_results || []).slice(0, maxResults)
.map(r => ({ title: r.title.slice(0, 50), snippet: (r.snippet || '').slice(0, 80) }));
const tokens = Math.ceil(JSON.stringify(compressed).length / 4);
console.log(`${query}: ${compressed.length} results, ~${tokens} tokens`);
return compressed;
}
await bridgeSearch('best serp api 2026');Sortie attendue
minimal : 3 results, ~45 tokens
medium : 5 results, ~190 tokens
full : 10 results, ~520 tokens
Stats: 2 searches, ~380 tokens, $0.010
Context prompt: ~450 tokens (3 searches, ~520 tokens, $0.015)
Prompt preview:
Based on the following search results gathered across 3 searches:
[{"query": "serp api pricing comparison 2026", "platform": "google", "results": [...
Total search cost: $0.015