การรวมระบบการชำระเงิน LlamaIndex.
ไม่มีแพ็คเกจ LlamaIndex และคุณไม่ต้องการมัน ห่อหุ้มไคลเอนต์ blockchain0x จริงใน FunctionTool และตัวแทนของคุณสามารถย้าย USDC และเข้าถึงการสอบถาม RAG ที่ชำระเงินบน Base.
ไม่มีแพ็กเกจเฉพาะของ LlamaIndex และคุณก็ไม่จำเป็นต้องมี LlamaIndex แปลงฟังก์ชันธรรมดาให้เป็น tool ด้วย ดังนั้นคุณจึงห่อ Python client ของจริงไว้ในฟังก์ชัน แล้วเพิ่มเข้าไปใน หรือ agent สามารถส่ง USDC, ชำระใบแจ้งหนี้ และอ่าน wallets ได้ หากต้องการคิดค่าบริการต่อ RAG query ให้ gate QueryEngineTool ของคุณด้วยวิธีเดียวกัน การชำระเงินจะ settle บน Base
การสอบถาม RAG มีค่าใช้จ่ายสูง การเรียกเก็บค่าธรรมเนียมต่อการสอบถามทำให้เศรษฐศาสตร์ทำงานได้.
จุดแข็งของ LlamaIndex คือการสร้างที่เพิ่มการดึงข้อมูล: คุณมีดัชนีเวกเตอร์เหนือเอกสารที่เป็นกรรมสิทธิ์ (เอกสารของบริษัทคุณ, ชุดข้อมูลการวิจัย, คลังข้อมูลทางกฎหมาย) และตัวแทนตอบโดยการดึงและสรุปส่วนที่เกี่ยวข้อง คำถามแต่ละคำถามมีค่าใช้จ่ายจริงใน embeddings, โทเค็น LLM, และมักจะมีการเรียก API ของบุคคลที่สาม การเข้าถึงฟรีไม่จำกัดจะใช้งบประมาณ; การเรียกเก็บเงินต่อคำถามเหมาะกับรูปแบบค่าใช้จ่าย
ไม่มีผู้ช่วยที่จัดส่งสำหรับสิ่งนี้ และคุณไม่ต้องการมัน คุณควบคุมมันเอง: ภายในฟังก์ชันของ QueryEngineTool ของคุณ ตรวจสอบว่าผู้โทรได้ชำระเงินหรือไม่ (ธงของคุณเองที่พลิกโดย webhook การชำระเงิน) และทำการดึงข้อมูลหรือส่งคืนราคา ฟังก์ชันกระเป๋าเงินและการควบคุมทั้งสองเป็นไม่กี่บรรทัดเหนือไคลเอนต์ blockchain0x จริง ซึ่งเก็บนโยบาย - ต่อการสอบถาม ต่อเซสชัน ระดับฟรีแล้วจ่าย - ไว้ในมือของคุณทั้งหมด.
ติดตั้ง LlamaIndex และ SDK หลัก โดยมีตัวแปรสภาพแวดล้อมหนึ่งตัว
ไม่มีแพ็คเกจ LlamaIndex ของ blockchain0x ที่จะเพิ่ม คุณติดตั้ง LlamaIndex (Python 3.10+, APIs ของ FunctionAgent / ReActAgent / Workflows สมัยใหม่) และ SDK หลัก blockchain0x จริง จากนั้นเขียนฟังก์ชันด้านล่าง ทำงานร่วมกับที่เก็บเวกเตอร์ใดๆ - Pinecone, Qdrant, Chroma, Weaviate, LlamaIndex Cloud.
pip install llama-index blockchain0xexport BLOCKCHAIN0X_API_KEY=sk_test_... # sk_test_ = Base Sepolia, sk_live_ = Base mainnet
BLOCKCHAIN0X_API_KEY คือคีย์ sk_test_ สำหรับ testnet หรือ sk_live_ สำหรับ mainnet จากแดชบอร์ดของคุณ โดย client จะอ่านค่าจาก environment หากคุณกำหนดการเข้าถึง paid queries webhook handler ยังต้องใช้ BLOCKCHAIN0X_WEBHOOK_SECRET เพิ่มเติม ซึ่งแดชบอร์ดจะแสดงให้เห็นเพียงครั้งเดียวเมื่อคุณสร้างหรือหมุนเวียน webhook
ฟังก์ชันที่จ่ายเงิน ห่อหุ้มเป็น FunctionTool.
ด้านล่างคือการรวมทั้งหมด send_usdc เรียกไคลเอนต์ blockchain0x จริง; FunctionTool.from_defaults ห่อหุ้มมัน และ FunctionAgent จะหยิบมันขึ้นมาเป็นเครื่องมือที่สามารถเรียกได้ LlamaIndex อ่านการชี้แนะประเภทและ docstring เพื่อสร้างสคีมา เพิ่ม QueryEngineTool ของคุณลงในรายการและเอเจนต์เดียวกันสามารถตอบคำถาม RAG ได้ด้วย
from llama_index.core.tools import FunctionTool from llama_index.core.agent.workflow import FunctionAgent from llama_index.llms.openai import OpenAI from blockchain0x import Client blockchain0x = Client() # reads BLOCKCHAIN0X_API_KEY from the environment def send_usdc(agent_id: str, to: str, amount_wei: str) -> str: """Send a USDC payment from an agent wallet. amount_wei is USDC base units (6 decimals), so "10000" is 0.01 USDC. """ return str( blockchain0x.payments.create(body={"agentId": agent_id, "to": to, "amountWei": amount_wei}) ) # Wrap the plain function as a LlamaIndex tool. No dedicated package needed. pay_tool = FunctionTool.from_defaults(fn=send_usdc) agent = FunctionAgent( tools=[pay_tool], # plus your own QueryEngineTool over a RAG index llm=OpenAI(model="gpt-4o"), system_prompt="You pay vendor invoices in USDC within owner-set limits.", ) response = await agent.run( "Pay 0.01 USDC from agent agt_123 to 0xVendor for the dataset." )
When the agent decides to pay, it calls send_usdc, the SDK submits the transfer, and you get a transaction hash back. amount_wei is base units, so 0.01 USDC is "10000". A sk_test_ key keeps it on Base Sepolia until you switch to sk_live_. To charge for a query instead, put the same paid check at the top of your QueryEngineTool's function.
เปลี่ยนธงการชำระเงินเมื่อ webhook มาถึง.
เมื่อการชำระเงินถูกชำระ Blockchain0x POST เหตุการณ์ payment.received ที่ลงนามไปยัง URL webhook ของคุณ ตัวช่วยการตรวจสอบจะถูกส่งใน Node SDK; ในบริการ Python คุณตรวจสอบด้วยมือกับ HMAC ที่บันทึกไว้ ทำเครื่องหมายว่าผู้โทรได้ชำระเงินในร้านค้าของคุณเอง และเครื่องมือการค้นหาที่ถูกจำกัดของคุณจะให้การโทรถัดไปผ่านไป ตัวอย่าง FastAPI ด้านล่าง
import hmac, hashlib, os, time from fastapi import FastAPI, Request, HTTPException app = FastAPI() SECRET = os.environ["BLOCKCHAIN0X_WEBHOOK_SECRET"].encode() @app.post("/webhooks/payment") async def receive(request: Request): raw = await request.body() # RAW bytes - do not parse first sig = request.headers.get("X-Blockchain0x-Signature", "") ts = request.headers.get("X-Blockchain0x-Timestamp", "") parts = dict(p.split("=", 1) for p in sig.split(",") if "=" in p) t, v1 = parts.get("t", ts), parts.get("v1", sig) want = hmac.new(SECRET, t.encode() + b"." + raw, hashlib.sha256).hexdigest() if not hmac.compare_digest(want, v1) or abs(time.time() - int(t)) > 300: raise HTTPException(status_code=401) if request.headers.get("X-Blockchain0x-Event-Type") == "payment.received": await trigger_followup() # USDC landed - serve the paid query return {"ok": True}
อัลกอริธึมคือ HMAC-SHA256 บนสตริง t.rawBody การเปรียบเทียบในเวลาคงที่ และหน้าต่างการเล่นซ้ำ 300 วินาที อ่านร่างดิบผ่าน await request.body() ไม่เคย request.json() ที่ถูกถอดรหัสใหม่ เพราะจะเปลี่ยนไบต์ที่ลายเซ็นครอบคลุม เหตุการณ์ที่ส่งคือ payment.received, payment.sent, wallet.deployed และ webhook.test สำหรับงานติดตามที่หนัก ให้เพิ่มงานในคิว (Celery, arq) และตอบกลับ 200 ทันทีแทนที่จะบล็อกตัวจัดการ
ไคลเอนต์ที่คุณกำลังห่อหุ้มอยู่เปิดอยู่ อ่านมัน.
ไม่มี starter package ของ LlamaIndex ให้ clone - สูตรด้านบนคือการเชื่อมต่อจริง SDK ของ blockchain0x เป็น open source บน GitHub; สูตรนี้ห่อหุ้ม Python SDK (blockchain0x-python) โดยมี surface ของเมธอดทั้งหมดอยู่ใน docs อ่านไว้เป็นตัวอย่างอ้างอิงสำหรับ body ของฟังก์ชัน
github.com/tosh-labs/blockchain0x-pythonsurface ของเมธอดใน SDK และ scopes ทั้งหมดถูกอธิบายไว้ที่ the docs. เริ่มด้วยคีย์ sk_test_ บน Base Sepolia ก่อน แล้วค่อยสลับเป็น sk_live_ เมื่อฟังก์ชันทำงานได้ตามที่คุณคาดไว้
ห้าหมายที่เฉพาะเจาะจงเกี่ยวกับ LlamaIndex ที่ควรหลีกเลี่ยง
สิ่งเหล่านี้มาจากกล่องจดหมายสนับสนุนของเรา แต่ละรายการช่วยประหยัดเวลาในการดีบักได้อย่างน้อยหนึ่งชั่วโมงเมื่อคุณทราบเกี่ยวกับมัน
ไม่มีแพ็คเกจ LlamaIndex - คุณห่อหุ้ม SDK
Blockchain0x ส่งอะแดปเตอร์สำหรับ LangChain และ CrewAI พร้อมกับเซิร์ฟเวอร์ MCP; ไม่มีแพ็คเกจ LlamaIndex ที่เฉพาะเจาะจง สูตรข้างต้นคือเส้นทาง: ฟังก์ชันที่มีประเภทธรรมดาเรียกใช้ไคลเอนต์ blockchain0x ที่แท้จริง ห่อด้วย FunctionTool.from_defaults LlamaIndex อ่านลายเซ็นและ docstring เพื่อสร้างสคีมา ดังนั้นให้เก็บ docstring ให้ถูกต้อง.
จัดการ QueryEngineTool ด้วยตัวเอง - ไม่มีผู้ช่วยทำได้
รูปแบบ paid-RAG เป็นจริงและดี แต่ไม่มีผู้ช่วย paid_query_engine_tool คุณสร้างมัน: ในฟังก์ชันของเครื่องมือค้นหาของคุณ ตรวจสอบว่าผู้โทรได้ชำระเงินหรือไม่ (ร้านค้าของคุณเองที่อัปเดตโดย webhook ด้านล่าง) และทำการดึงข้อมูลเฉพาะเมื่อพวกเขาชำระเงิน มิฉะนั้นให้ส่งคืนราคา มันเป็นไม่กี่บรรทัด และคุณควบคุมนโยบายการเข้าถึง.
จำนวนเงินเป็นหน่วยพื้นฐานของ USDC, ในรูปแบบสตริง
payments.create takes amountWei: a string of USDC base units, not a float. USDC has 6 decimals, so 0.01 USDC is "10000" and 5 USDC is "5000000". Type the tool argument as str. LlamaIndex passes tool args through pydantic, which will happily coerce a float and lose precision, so keep it a string end to end.
FunctionAgent.run เป็น async; การเรียก SDK เป็น sync
ตัวแทน LlamaIndex เป็นแบบ async-first - รอ agent.run(...) การเรียกใช้ลูกค้า blockchain0x ภายในเครื่องมือของคุณเป็นแบบ synchronous ซึ่งเหมาะสำหรับการชำระเงินที่รวดเร็วเพียงครั้งเดียว แต่จะบล็อกลูปภายใต้ภาระ หากคุณให้บริการคำถามหลายคำถามพร้อมกัน ให้ห่อการเรียก SDK ด้วย asyncio.to_thread เพื่อให้ลูปเหตุการณ์ยังคงตอบสนอง
send_payment สามารถตอบ 503 ได้ในระยะเริ่มต้น
payments.create จะไม่ลองใหม่โดยค่าเริ่มต้นและสามารถส่งคืน 503 จนกว่าตัวแปลงเครือข่ายจะถูกเชื่อมต่อ Catch ข้อผิดพลาดภายในฟังก์ชันเครื่องมือของคุณและส่งคืนข้อความที่ชัดเจนที่โมเดลสามารถดำเนินการได้ แทนที่จะให้เอเจนต์ทำงานวนซ้ำ คีย์ idempotency ที่สร้างโดยอัตโนมัติหมายความว่าการลองใหม่ด้วยตนเองจะไม่จ่ายสองครั้ง