Skip to main content

बजट नियंत्रण क्यों महत्वपूर्ण है

एक AI एजेंट जो लूप में पेड APIs को कॉल करता है, वह तेज़ी से लागत बढ़ा सकता है। बजट नियंत्रण आपको ये करने देता है:
  • प्रति सत्र कुल खर्च की सीमा तय करें
  • प्रति-डोमेन सीमाएं निर्धारित करें (जैसे, api.weather.com पर अधिकतम 100 sats/सत्र)
  • प्रत्येक भुगतान से पहले कॉलबैक प्राप्त करें
  • कभी भी पूरी खर्च रिपोर्ट प्राप्त करें

वैश्विक बजट

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
});
जब एक 402 रिस्पॉन्स में priceSats फ़ील्ड होती है और वह शेष बजट से अधिक होती है, तो क्लाइंट भुगतान करने से पहले BudgetExceededError थ्रो करता है — कोई satoshi खर्च नहीं होता।

प्रति-डोमेन बजट

const client = new L402Client({
  wallet,
  budgetSats: 2000,
  budgetPerDomain: {
    "api.weather.com": 100,
    "api.finance.com": 500,
  },
});
प्रति-डोमेन सीमाएं वैश्विक सीमा से स्वतंत्र रूप से जाँची जाती हैं — भुगतान आगे बढ़ने के लिए दोनों को पास होना आवश्यक है।

कॉलबैक

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 को BudgetExceededError थ्रो होने से ठीक पहले कॉल किया जाता है — लॉगिंग या अलर्ट के लिए उपयोगी।

खर्च रिपोर्ट

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() तब null / None लौटाता है जब कोई बजट कॉन्फ़िगर नहीं किया गया हो।

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.
  }
}

समवर्तिता संबंधी नोट्स

जब बजट सीमाएं महत्वपूर्ण हों तो एक L402Client इंस्टेंस को समवर्ती Promise.all कॉल्स में साझा न करें।BudgetTracker.check() और record() के बीच एक await (Lightning भुगतान) है। दो समवर्ती client.fetch() कॉल्स अलग-अलग एंडपॉइंट्स पर, दोनों बजट जाँच पास कर सकती हैं, इससे पहले कि कोई भी खर्च रिकॉर्ड करे — इसका मतलब है कि संयुक्त लागत अस्थायी रूप से आपकी बजट सीमा से एक भुगतान अधिक हो सकती है।सुरक्षित पैटर्न — क्रमिक कॉल्स:
for (const url of urls) {
  const res = await client.fetch(url); // awaited one at a time
}
जोखिम भरा पैटर्न — समानांतर कॉल्स:
// Both may pass budget.check() before either calls budget.record()
const results = await Promise.all(urls.map(url => client.fetch(url)));
समानांतर वर्कलोड के लिए समाधान: अपना budgetSats सतर्कता से निर्धारित करें (जैसे, अपनी वास्तविक सीमा का 80%) ताकि एक समवर्ती भुगतान से अतिरिक्त खर्च को अवशोषित किया जा सके। सख्त प्रवर्तन के लिए, कॉल्स को क्रमिक रूप से प्रोसेस करें।

पूर्ण विकल्प संदर्भ

विकल्पTypeScriptPythonडिफ़ॉल्टविवरण
वैश्विक बजटbudgetSatsbudget_satsअसीमितसत्र के लिए अधिकतम sats
प्रति-डोमेनbudgetPerDomainbudget_per_domain{}domain → max sats का मैप
खर्च हुकonSpendon_spendप्रत्येक भुगतान के बाद कॉल किया जाता है
अधिकता हुकonBudgetExceededon_budget_exceededथ्रो करने से पहले कॉल किया जाता है