El problema
Un agente de IA que ejecuta un ciclo de investigación autónomo realiza más de 50 llamadas a la API de búsqueda en una sola sesión, consumiendo un mes de presupuesto de búsqueda en minutos. No hay límite nativo en LangChain, CrewAI o marcos similares.
La solucion de Scavio
Envuelva la función de búsqueda en un contador de crédito que genera una excepción y devuelve resultados parciales cuando se alcanza el límite de la sesión. Un decorador, no se requieren cambios en el marco.
Antes
El agente inicia una tarea de investigación. Cada subtarea genera más búsquedas. Después de 80 llamadas, la asignación de crédito mensual desaparece. El agente completa pero la factura es 4 veces la esperada. No se emitió ninguna advertencia.
Después
El agente se inicializa con un límite de 20 créditos. Después de 20 búsquedas, se genera BudgetExceeded. El agente lo atrapa, devuelve la investigación recopilada hasta el momento y se detiene. Costo total de la sesión: $0.10.
Para quien es
Desarrolladores que crean agentes autónomos con LangChain, CrewAI o bucles personalizados donde la búsqueda se realiza en bucles ilimitados sin visibilidad de costos.
Beneficios clave
- El límite estricto evita el gasto descontrolado independientemente de la profundidad del bucle del agente
- Los resultados parciales se devuelven con gracia en lugar de fallar silenciosamente
- Funciona con cualquier proveedor de búsqueda que cobre por llamada
- Presupuesto por sesión o por ejecución, configurable en el momento de la llamada
Ejemplo en Python
import functools
import requests
class BudgetExceeded(Exception): pass
class SearchBudget:
def __init__(self, cap): self.cap = cap; self.used = 0
def charge(self):
self.used += 1
if self.used > self.cap: raise BudgetExceeded(f"{self.used}/{self.cap} credits used")
def make_capped_search(cap_credits):
budget = SearchBudget(cap_credits)
def search(query, **kwargs):
budget.charge()
r = requests.post("https://api.scavio.dev/api/v1/search",
json={"query": query, "num_results": kwargs.get("n", 5)},
headers={"x-api-key": "your-scavio-api-key"}, timeout=15)
r.raise_for_status()
return r.json().get("organic_results", [])
search.budget = budget
return search
# Usage
search = make_capped_search(cap_credits=20)
try:
results = search("best python frameworks 2026")
except BudgetExceeded as e:
print(f"Stopped: {e}")Ejemplo en JavaScript
function makeCappedSearch(cap, apiKey) {
let used = 0;
return async function search(query, n = 5) {
used++;
if (used > cap) throw new Error(`Budget exceeded: ${used}/${cap}`);
const res = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'x-api-key': apiKey },
body: JSON.stringify({ query, num_results: n })
});
return (await res.json()).organic_results ?? [];
};
}