Les agents qui appellent des API de recherche peuvent consommer des milliers de tokens par requête si les résultats ne sont pas contrôlés. Un système de budget de tokens garantit que les résultats de recherche ne dépassent jamais une limite définie, préservant ainsi la fenêtre de contexte de votre agent pour le raisonnement. Ceci est particulièrement important pour les agents qui effectuent plusieurs appels d'outils par tour.
Prérequis
- Python 3.8+
- tiktoken installé (pip install tiktoken)
- Une clé API Scavio
Parcours
Étape 1: Installer tiktoken pour le comptage des tokens
Configurer le comptage des tokens pour mesurer la taille des résultats de recherche.
pip install tiktokenÉtape 2: Construire une fonction de recherche budgétée
Créer une fonction de recherche qui respecte un budget de tokens.
import requests, os, tiktoken
H = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
enc = tiktoken.encoding_for_model('gpt-4')
def budgeted_search(query: str, platform: str = 'google', max_tokens: int = 300) -> str:
resp = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': platform, 'query': query}, timeout=10)
results = resp.json().get('organic', [])
output_lines = []
token_count = 0
for r in results:
line = f"{r.get('title','')}: {r.get('snippet','')}"
line_tokens = len(enc.encode(line))
if token_count + line_tokens > max_tokens:
break
output_lines.append(line)
token_count += line_tokens
return '\n'.join(output_lines)Étape 3: Créer un suivi de budget quotidien
Suivre l'utilisation totale des tokens et des crédits sur tous les appels de recherche.
from dataclasses import dataclass, field
from datetime import date
@dataclass
class SearchBudget:
daily_credit_limit: int = 100
daily_token_limit: int = 50000
credits_used: int = 0
tokens_used: int = 0
date: str = field(default_factory=lambda: date.today().isoformat())
def can_search(self) -> bool:
if self.date != date.today().isoformat():
self.reset()
return self.credits_used < self.daily_credit_limit
def record(self, tokens: int):
self.credits_used += 1
self.tokens_used += tokens
def reset(self):
self.credits_used = 0
self.tokens_used = 0
self.date = date.today().isoformat()
def remaining(self) -> dict:
return {'credits': self.daily_credit_limit - self.credits_used,
'tokens': self.daily_token_limit - self.tokens_used}
budget = SearchBudget(daily_credit_limit=50)
def search_with_budget(query: str, platform: str = 'google', max_tokens: int = 300) -> str:
if not budget.can_search():
return '[Budget exceeded - no more searches today]'
result = budgeted_search(query, platform, max_tokens)
budget.record(len(enc.encode(result)))
return resultÉtape 4: Intégrer avec le framework d'agent
Connecter la recherche budgétée au système d'outils de votre agent.
# Example with a simple agent loop:
def agent_research(question: str, budget: SearchBudget) -> str:
# Adaptive token budget based on remaining allowance
remaining = budget.remaining()
per_search_budget = min(300, remaining['tokens'] // 3) # Reserve for 3 searches
# Search with budget
google_ctx = search_with_budget(question, 'google', per_search_budget)
reddit_ctx = search_with_budget(question, 'reddit', per_search_budget)
context = f"Google:\n{google_ctx}\n\nReddit:\n{reddit_ctx}"
total_tokens = len(enc.encode(context))
print(f"Research used {budget.credits_used} credits, {total_tokens} tokens")
print(f"Remaining: {budget.remaining()}")
return contextExemple Python
import requests, os, tiktoken
H = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
enc = tiktoken.encoding_for_model('gpt-4')
def budgeted_search(query, max_tokens=300):
r = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': query}).json()
lines, tokens = [], 0
for x in r.get('organic',[]):
line = f"{x['title']}: {x.get('snippet','')}"
t = len(enc.encode(line))
if tokens + t > max_tokens: break
lines.append(line); tokens += t
return '\n'.join(lines)Exemple JavaScript
// Token counting in JS (approximate, using char/4 heuristic):
async function budgetedSearch(query, maxTokens = 300) {
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})
});
const results = (await r.json()).organic || [];
let lines = [], tokens = 0;
for (const x of results) {
const line = `${x.title}: ${x.snippet || ''}`;
const t = Math.ceil(line.length / 4);
if (tokens + t > maxTokens) break;
lines.push(line); tokens += t;
}
return lines.join('\n');
}Sortie attendue
A token budget system that controls how many tokens search results consume in your agent's context window, with daily credit tracking.