Skip to main content

التثبيت

pip install l402kit langchain langchain-community

الاستخدام الأساسي

import os
from l402kit.langchain import L402Tool
from l402kit.wallets import BlinkWallet
from langchain.agents import AgentExecutor, create_react_agent
from langchain_openai import ChatOpenAI
from langchain import hub

# 1. Create the tool
tools = [
    L402Tool(
        wallet=BlinkWallet(
            os.environ["BLINK_API_KEY"],
            os.environ["BLINK_WALLET_ID"],
        ),
        budget_sats=1000,
    )
]

# 2. Wire it into a LangChain agent
llm = ChatOpenAI(model="gpt-4o")
prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 3. Run — the agent pays automatically when needed
result = agent_executor.invoke({
    "input": "What is the BTC price from https://api.example.com/btc-price?"
})
print(result["output"])

مع Alby

from l402kit.wallets import AlbyWallet

tools = [
    L402Tool(
        wallet=AlbyWallet(os.environ["ALBY_TOKEN"]),
        budget_sats=500,
    )
]

مرجع الأداة

المنشئ

L402Tool(
    wallet: L402Wallet,
    budget_sats: int | None = None,
    budget_per_domain: dict[str, int] | None = None,
    on_spend: Callable[[int, str], None] | None = None,
)
المعاملالنوعالوصف
walletL402Walletالمحفظة المستخدمة لدفع الفواتير
budget_satsintالحد الأقصى من sats للإنفاق في هذه الجلسة
budget_per_domaindictحدود الإنفاق لكل نطاق
on_spendcallableيُستدعى بعد كل عملية دفع

مخطط الأداة (كما يراه النموذج اللغوي)

name: "l402_fetch"
description: "Fetch data from an L402-protected API that requires a Lightning micropayment.
              Handles the payment automatically.
              Input: a URL (and optionally method/body).
              Output: the API response as text."

inputs:
  url:    string  — The URL to fetch
  method: string  — HTTP method: GET, POST, PUT, DELETE (default: GET)
  body:   string  — Request body as JSON string (for POST/PUT)

الوظائف

tool._run(url, method="GET", body=None)     # sync
await tool._arun(url, method="GET", body=None)  # async

tool.spending_report()  # → SpendingReport | None

صيغة الاستجابة

تُعيد الأداة نصًّا يمكن للنموذج اللغوي قراءته مباشرةً:
# Free endpoint
HTTP 200
{"price": 97500, "currency": "USD"}

# Paid endpoint (priceSats was in the 402 response)
[Paid 10 sats] HTTP 200
{"price": 97500, "currency": "USD"}

# Budget exceeded
[BLOCKED] Budget exceeded: need 50 sats but only 10 remaining (https://...)

# Network / wallet error
[ERROR] Connection refused

مثال POST

result = agent_executor.invoke({
    "input": "Submit this query to https://api.example.com/search: {\"q\": \"bitcoin\"}"
})
# The agent calls l402_fetch with method=POST and body='{"q":"bitcoin"}'

تقرير الإنفاق

tool = L402Tool(wallet=wallet, budget_sats=1000)
# ... agent runs ...

report = tool.spending_report()
if report:
    print(f"Spent {report.total} sats across {len(report.transactions)} calls")
    for tx in report.transactions:
        print(f"  {tx['sats']} sats → {tx['url']}")

أطر عمل الوكلاء المخصصة

L402Tool هو صنف فرعي من langchain.tools.BaseTool — ويعمل مع أي إطار عمل يقبل أدوات LangChain: LangGraph وCrewAI وAutoGen (عبر محوّل) وغيرها.
# LangGraph example
from langgraph.prebuilt import create_react_agent

app = create_react_agent(llm, tools=[L402Tool(wallet=wallet, budget_sats=500)])
result = app.invoke({"messages": [("user", "fetch https://api.example.com/data")]})

معالجة الأخطاء

يتم اعتراض BudgetExceededError داخليًّا — تُعيد الأداة نصًّا بصيغة [BLOCKED] بدلًا من إطلاق الاستثناء، حتى يتمكن الوكيل من التعامل معه بسلاسة في حلقة استدلاله. تُعاد جميع الاستثناءات الأخرى (أخطاء الشبكة، وأعطال المحفظة) على شكل [ERROR] <message>. إذا كنت بحاجة إلى وصول برمجي:
from l402kit import BudgetExceededError

class MyL402Tool(L402Tool):
    def _run(self, url, method="GET", body=None, run_manager=None):
        result = super()._run(url, method, body, run_manager)
        if result.startswith("[BLOCKED]"):
            raise BudgetExceededError(url, 0, 0)  # re-raise for outer handler
        return result

بدون تثبيت LangChain

إذا لم يكن langchain مثبَّتًا، فإن استيراد L402Tool ينجح على مستوى الوحدة (تراجع سلس)، لكن إنشاء نسخة منه يُطلق:
ImportError: langchain is required to use L402Tool.
Install it with: pip install langchain langchain-community