Skip to main content

لماذا يهم التحكم في الميزانية

وكيل الذكاء الاصطناعي الذي يستدعي واجهات برمجية مدفوعة في حلقة متكررة يمكن أن يتراكم عليه تكاليف بسرعة. يتيح لك التحكم في الميزانية:
  • تحديد سقف إجمالي للإنفاق لكل جلسة
  • تعيين حدود لكل نطاق (مثلاً، بحد أقصى 100 sats/جلسة على api.weather.com)
  • استقبال رد نداء قبل كل دفعة
  • الحصول على تقرير إنفاق كامل في أي وقت

الميزانية الإجمالية

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يُستدعى قبل الإطلاق