Skip to main content

Warum Budgetkontrolle wichtig ist

Ein KI-Agent, der bezahlte APIs in einer Schleife aufruft, kann schnell hohe Kosten verursachen. Budgetkontrolle ermöglicht Ihnen:
  • Gesamtausgaben pro Sitzung begrenzen
  • Domain-spezifische Limits festlegen (z. B. max. 100 sats/Sitzung auf api.weather.com)
  • Einen Callback vor jeder Zahlung erhalten
  • Jederzeit einen vollständigen Ausgabenbericht abrufen

Globales Budget

import { L402Client, BlinkWallet } from "l402-kit";

const client = new L402Client({
  wallet: new BlinkWallet(process.env.BLINK_API_KEY!, process.env.BLINK_WALLET_ID!),
  budgetSats: 500, // max 500 sats total this session
});
Wenn eine 402-Antwort ein priceSats-Feld enthält und dieses das verbleibende Budget überschreiten würde, wirft der Client BudgetExceededError vor der Zahlung — es werden keine satoshis ausgegeben.

Budget pro Domain

const client = new L402Client({
  wallet,
  budgetSats: 2000,
  budgetPerDomain: {
    "api.weather.com": 100,
    "api.finance.com": 500,
  },
});
Domain-spezifische Limits werden unabhängig vom globalen Limit geprüft — beide müssen eingehalten werden, damit die Zahlung fortgesetzt werden kann.

Callbacks

const client = new L402Client({
  wallet,
  budgetSats: 1000,
  onSpend: (sats, url) => {
    console.log(`✓ Paid ${sats} sats → ${url}`);
    // log to your telemetry, update a dashboard, etc.
  },
  onBudgetExceeded: (url, sats) => {
    console.warn(`✗ Blocked: ${sats} sats requested by ${url} — budget exhausted`);
    // alert, notify Slack, etc.
  },
});
onBudgetExceeded / on_budget_exceeded wird unmittelbar vor dem Werfen von BudgetExceededError aufgerufen — nützlich für Protokollierung oder Benachrichtigungen.

Ausgabenbericht

const report = client.spendingReport();

if (report) {
  console.log(`Total spent: ${report.total} sats`);
  console.log(`Remaining:   ${report.remaining} sats`);
  console.log("By domain:", report.byDomain);
  // { "api.weather.com": 42, "api.finance.com": 105 }

  for (const tx of report.transactions) {
    console.log(`  ${tx.ts}  ${tx.sats} sats  ${tx.url}`);
  }
}
spendingReport() gibt null / None zurück, wenn kein Budget konfiguriert ist.

Umgang mit BudgetExceededError

import { BudgetExceededError } from "l402-kit";

try {
  const res = await client.fetch("https://api.example.com/premium");
} catch (err) {
  if (err instanceof BudgetExceededError) {
    console.log(`Need ${err.required} sats, only ${err.remaining} remaining`);
    // gracefully degrade — return cached data, skip this step, etc.
  }
}

Hinweise zur Nebenläufigkeit

Teilen Sie eine L402Client-Instanz nicht auf mehrere gleichzeitige Promise.all-Aufrufe auf, wenn Budgetlimits eine Rolle spielen.BudgetTracker.check() und record() sind durch ein await (die Lightning-Zahlung) voneinander getrennt. Zwei gleichzeitige client.fetch()-Aufrufe an verschiedene Endpunkte können beide die Budgetprüfung bestehen, bevor einer der beiden die Ausgabe erfasst — das bedeutet, dass die kombinierten Kosten Ihr Budgetlimit vorübergehend um eine Zahlung überschreiten können.Sicheres Muster — sequenzielle Aufrufe:
for (const url of urls) {
  const res = await client.fetch(url); // awaited one at a time
}
Riskantes Muster — parallele Aufrufe:
// Both may pass budget.check() before either calls budget.record()
const results = await Promise.all(urls.map(url => client.fetch(url)));
Abhilfemaßnahme für parallele Workloads: Setzen Sie budgetSats konservativ (z. B. 80 % Ihres tatsächlichen Limits), um die Mehrausgaben durch eine gleichzeitige Zahlung aufzufangen. Für eine strikte Durchsetzung verarbeiten Sie Aufrufe sequenziell.

Vollständige Optionsreferenz

OptionTypeScriptPythonStandardBeschreibung
Globales BudgetbudgetSatsbudget_satsunbegrenztMaximale sats für die Sitzung
Pro DomainbudgetPerDomainbudget_per_domain{}Zuordnung von Domain → max. sats
Ausgaben-HookonSpendon_spendWird nach jeder Zahlung aufgerufen
Überschreitungs-HookonBudgetExceededon_budget_exceededWird vor dem Werfen aufgerufen