Resumen
Este pipeline serves as el search layer for un agents-as-a-service plataforma, handling multi-tenant search solicitudes con per-tenant credit seguimiento y limitacion de tasa. Cada tenant's agent submits search solicitudes a traves de este pipeline, cual routes them to Scavio, rastrea credit usage per tenant, y enforces per-tenant quotas. Plataforma operators usar este to offer search-grounded agents to their clientes sin exposing raw claves API.
Desencadenador
On-demand per incoming search solicitud
Programación
On-demand per incoming search solicitud
Pasos del flujo de trabajo
Recibir search solicitud con tenant ID
Accept el incoming search solicitud y extraer el tenant identifier y consulta parametros.
Verificar tenant credit balance
Verify el tenant tiene sufficient credits remaining in their allocation antes de executing el search.
Ejecutar search via Scavio
Forward el search solicitud to el appropriate Scavio endpoint (Google, Reddit, etc.).
Debit tenant credits
Deduct el appropriate numero of credits de el tenant's balance y registro el transaction.
Return resultados to agent
Enviar el structured resultados de busqueda back to el requesting agent con usage metadata.
Implementacion en Python
import requests
import json
from pathlib import Path
from datetime import datetime
API_KEY = "your_scavio_api_key"
# Simulated tenant credit ledger
CREDIT_LEDGER_PATH = Path("tenant_credits.json")
def load_ledger() -> dict:
if CREDIT_LEDGER_PATH.exists():
return json.loads(CREDIT_LEDGER_PATH.read_text())
return {}
def save_ledger(ledger: dict):
CREDIT_LEDGER_PATH.write_text(json.dumps(ledger, indent=2))
def execute_search(tenant_id: str, platform: str, query: str) -> dict:
ledger = load_ledger()
tenant = ledger.get(tenant_id, {"credits": 100, "used": 0})
if tenant["credits"] - tenant["used"] <= 0:
return {"error": "insufficient_credits", "tenant_id": tenant_id}
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": platform, "query": query},
timeout=15,
)
res.raise_for_status()
data = res.json()
# Debit credits
tenant["used"] += 1
tenant["last_query"] = datetime.utcnow().isoformat()
ledger[tenant_id] = tenant
save_ledger(ledger)
return {
"tenant_id": tenant_id,
"credits_remaining": tenant["credits"] - tenant["used"],
"results": data.get("organic", [])[:5],
"query": query,
"platform": platform,
}
def run():
# Simulate multi-tenant requests
requests_batch = [
{"tenant_id": "tenant_001", "platform": "google", "query": "best CRM software 2026"},
{"tenant_id": "tenant_002", "platform": "reddit", "query": "search API recommendation"},
{"tenant_id": "tenant_001", "platform": "google", "query": "AI agent frameworks comparison"},
]
for req in requests_batch:
result = execute_search(req["tenant_id"], req["platform"], req["query"])
if "error" in result:
print(f" DENIED {req['tenant_id']}: {result['error']}")
else:
print(f" OK {req['tenant_id']}: {len(result['results'])} results, {result['credits_remaining']} credits left")
if __name__ == "__main__":
run()Implementacion en JavaScript
const API_KEY = "your_scavio_api_key";
// In-memory tenant ledger (use a database in production)
const ledger = {
tenant_001: { credits: 100, used: 0 },
tenant_002: { credits: 50, used: 0 },
};
async function executeSearch(tenantId, platform, query) {
const tenant = ledger[tenantId];
if (!tenant || tenant.credits - tenant.used <= 0) return { error: "insufficient_credits" };
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ platform, query }),
});
if (!res.ok) throw new Error(`scavio ${res.status}`);
tenant.used += 1;
const data = await res.json();
return { tenantId, remaining: tenant.credits - tenant.used, results: (data.organic ?? []).length };
}
const batch = [
{ tenant: "tenant_001", platform: "google", query: "best CRM 2026" },
{ tenant: "tenant_002", platform: "reddit", query: "search API recommendation" },
];
for (const req of batch) {
const result = await executeSearch(req.tenant, req.platform, req.query);
if (result.error) console.log(`DENIED ${req.tenant}: ${result.error}`);
else console.log(`OK ${req.tenant}: ${result.results} results, ${result.remaining} credits left`);
}Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA
Comunidad, publicaciones y comentarios en hilos de cualquier subreddit