Tích hợp thanh toán Semantic Kernel.
Không cần gói Semantic Kernel. Bọc khách hàng blockchain0x thực trong một KernelFunction (Python hoặc Java), hoặc gọi REST API từ một KernelFunction C#. Dù bằng cách nào, tác nhân cũng chuyển USDC trên Base.
Không có gói Semantic Kernel. Trong Python, bạn bọc khách hàng thực blockchain0x trong một phương thức được trang trí bằng @kernel_function; trong C#, nơi không có SDK .NET nào được gửi, một [KernelFunction] gọi REST API trực tiếp. Đăng ký nó trên kernel của bạn, đặt FunctionChoiceBehavior thành Tự động, và tác nhân có thể chuyển USDC trên Base. Các SDK cốt lõi đã được gửi là Node, Python, Ruby, Go và JVM.
Khung tác nhân .NET cấp doanh nghiệp duy nhất.
Nếu ngăn xếp của bạn có hình dạng Microsoft (Azure, .NET, SQL Server, Teams, Copilot Studio), Semantic Kernel gần như chắc chắn là khung tác nhân đúng. Nó được xây dựng bởi Microsoft, nó tích hợp với Azure OpenAI, AKS và Entra, và nó có hỗ trợ hàng đầu trên .NET, Python và Java theo cách mà không khung nào khác phù hợp. Và nó đã cung cấp cho bạn điều bạn cần: một KernelFunction chỉ là một phương thức, vì vậy việc kết nối thanh toán là một phương thức bạn viết, không phải một gói bạn chờ đợi.
Đó là lý do tại sao không có bộ chuyển đổi Semantic Kernel để cài đặt. Trong Python và Java, bạn bọc SDK blockchain0x thực trong một KernelFunction; trong C#, nơi chưa có SDK .NET nào được phát hành, KernelFunction gọi trực tiếp REST API bằng HttpClient. Bạn giữ được tính tiện dụng theo cách diễn đạt - các phương thức được trang trí, bất đồng bộ, xác thực tham số dựa trên thuộc tính - và không có phiên bản bộ chuyển đổi nào để theo dõi. Các SDK chính tồn tại ngày nay là Node, Python, Ruby, Go và JVM.
Cài đặt Semantic Kernel và, trong Python, SDK cốt lõi.
Không có gói blockchain0x Semantic Kernel nào để thêm. Python cài đặt Semantic Kernel cộng với SDK blockchain0x thực tế; C# cài đặt Microsoft.SemanticKernel và gọi REST API bằng HttpClient tích hợp sẵn. Java sử dụng Semantic Kernel cho Java cộng với SDK com.blockchain0x:sdk-jvm.
pip install semantic-kernel blockchain0xdotnet add package Microsoft.SemanticKernelBLOCKCHAIN0X_API_KEY=sk_test_... # sk_test_ = Base Sepolia, sk_live_ = Base mainnet BLOCKCHAIN0X_API_KEY=sk_test_... # same key, the name the .NET REST example reads OPENAI_API_KEY=sk-...
BLOCKCHAIN0X_API_KEY (Python client đọc giá trị này) là một khóa sk_test_ testnet hoặc sk_live_ mainnet từ dashboard của bạn; ví dụ C# REST đọc cùng giá trị từ BLOCKCHAIN0X_API_KEY. OPENAI_API_KEY (hoặc AZURE_OPENAI_* cho các model chạy trên Azure) là khóa LLM của bạn. Bộ xử lý webhook cũng cần BLOCKCHAIN0X_WEBHOOK_SECRET.
Một KernelFunction ví, trong Python và C#.
Python bọc khách hàng blockchain0x thực sự trong một phương thức được trang trí bằng @kernel_function. C#, nơi không có SDK .NET nào được cung cấp, tiết lộ một [KernelFunction] gọi trực tiếp POST /v1/payments với HttpClient. Cả hai đều đăng ký trên kernel là Wallet.send_usdc; chỉ có nghi thức xung quanh là khác nhau.
from semantic_kernel import Kernel from semantic_kernel.functions import kernel_function from blockchain0x import Client blockchain0x = Client() # reads BLOCKCHAIN0X_API_KEY from the environment class WalletPlugin: @kernel_function(description="Send a USDC payment from an agent wallet.") def send_usdc(self, agent_id: str, to: str, amount_wei: str) -> str: # amount_wei is USDC base units (6 decimals): "10000" = 0.01 USDC return str( blockchain0x.payments.create(body={"agentId": agent_id, "to": to, "amountWei": amount_wei}) ) kernel = Kernel() kernel.add_plugin(WalletPlugin(), plugin_name="Wallet") # Add your chat service, then let the model call Wallet.send_usdc.
using System.ComponentModel;
using System.Net.Http.Json;
using Microsoft.SemanticKernel;
// There is no .NET SDK, so a C# KernelFunction calls the REST API directly.
public class WalletPlugin
{
private static readonly HttpClient Http = new()
{
BaseAddress = new Uri("https://api.blockchain0x.com"),
};
[KernelFunction, Description("Send a USDC payment from an agent wallet. amountWei is USDC base units (6 decimals).")]
public async Task<string> SendUsdc(string agentId, string to, string amountWei)
{
Http.DefaultRequestHeaders.Authorization =
new("Bearer", Environment.GetEnvironmentVariable("BLOCKCHAIN0X_API_KEY"));
var res = await Http.PostAsJsonAsync("/v1/payments", new { agentId, to, amountWei });
return await res.Content.ReadAsStringAsync();
}
}
// builder.Plugins.AddFromType<WalletPlugin>("Wallet");Register the function on the kernel, set FunctionChoiceBehavior to Auto, and when the user's message implies a payment the model calls Wallet.send_usdc with the agent id, recipient, and amount. amountWei is base units, so 0.01 USDC is "10000". The Python path returns the SDK result; the C# path returns the REST response body.
API tối thiểu ASP.NET Core để nhận các sự kiện thanh toán.
Khi một khoản thanh toán được giải quyết, Blockchain0x POST một sự kiện đã ký đến URL webhook của bạn. Không có trình xác minh .NET nào được cung cấp, vì vậy trình xử lý xác minh bằng tay theo HMAC đã được tài liệu hóa - điều này là tất cả những gì một trợ giúp sẽ làm. Ví dụ .NET bên dưới; Python và Java xác minh theo cách tương tự với các thư viện HMAC của riêng họ.
using System.Security.Cryptography;
using System.Text;
using Microsoft.AspNetCore.Builder;
var app = WebApplication.CreateBuilder(args).Build();
var secret = Environment.GetEnvironmentVariable("BLOCKCHAIN0X_WEBHOOK_SECRET")!;
app.MapPost("/webhooks/payment", async (HttpRequest req) =>
{
using var reader = new StreamReader(req.Body);
var raw = await reader.ReadToEndAsync(); // RAW body - verify before parsing
var sig = req.Headers["X-Blockchain0x-Signature"].ToString();
var ts = req.Headers["X-Blockchain0x-Timestamp"].ToString();
var parts = sig.Split(',').Select(p => p.Split('=', 2))
.Where(p => p.Length == 2).ToDictionary(p => p[0], p => p[1]);
var t = parts.GetValueOrDefault("t", ts);
var v1 = parts.GetValueOrDefault("v1", sig);
var want = Convert.ToHexString(new HMACSHA256(Encoding.UTF8.GetBytes(secret))
.ComputeHash(Encoding.UTF8.GetBytes($"{t}.{raw}"))).ToLowerInvariant();
var fresh = Math.Abs(DateTimeOffset.UtcNow.ToUnixTimeSeconds() - long.Parse(t)) <= 300;
if (!fresh || !CryptographicOperations.FixedTimeEquals(
Encoding.UTF8.GetBytes(want), Encoding.UTF8.GetBytes(v1)))
return Results.Unauthorized();
if (req.Headers["X-Blockchain0x-Event-Type"] == "payment.received")
await RunFollowupAsync(); // USDC landed - do the next step
return Results.Ok();
});
app.Run();Thuật toán là HMAC-SHA256 trên chuỗi t.rawBody, một cửa sổ phát lại 300 giây, và so sánh thời gian cố định. Đọc thân thô qua StreamReader để chữ ký giữ nguyên; không giải mã rồi tái mã hóa. Các sự kiện đã gửi là payment.received, payment.sent, wallet.deployed, và webhook.test. Trong sản xuất, webhook thường chạy như một dịch vụ ASP.NET Core riêng biệt chia sẻ cơ sở dữ liệu với tác nhân để hai bên có thể phối hợp.
Các SDK và bề mặt REST là mở. Đọc chúng.
Không có starter package của Semantic Kernel để clone - các recipe ở trên chính là phần tích hợp. Các core SDK của blockchain0x (Node, Python, Ruby, Go) là mã nguồn mở trên GitHub, và bề mặt phương thức cùng các route REST mà ví dụ C# gọi đều được tài liệu hóa trong docs.
docs.blockchain0x.com/docs/overviewBề mặt phương thức của SDK và các route REST được tài liệu hóa tại the docs. Hãy bắt đầu với một key sk_test_ trên Base Sepolia, rồi chuyển sang sk_live_ khi KernelFunction hoạt động đúng như bạn mong đợi.
Năm cạm bẫy cụ thể về Semantic Kernel cần tránh.
Mô hình plugin của Semantic Kernel rất rõ ràng nhưng có những vấn đề về ngôn ngữ và hành vi mặc định. Biết trước những điều này sẽ tiết kiệm thời gian.
Không có gói Semantic Kernel, trong bất kỳ ngôn ngữ nào
Không có bộ chuyển đổi NuGet, PyPI hoặc Maven. Các SDK cốt lõi đã được gửi là Node, Python, Ruby, Go và JVM - không phải .NET. Vì vậy, một kernel Python bọc khách hàng blockchain0x Python trong một @kernel_function, một kernel Java sử dụng SDK com.blockchain0x:sdk-jvm, và một kernel C# gọi REST API trực tiếp từ một KernelFunction (được hiển thị ở trên). Tất cả ba cái đều chỉ là vài dòng.
FunctionChoiceBehavior phải là Tự động
Semantic Kernel chỉ gọi các hàm plugin khi FunctionChoiceBehavior được đặt thành Auto trong cài đặt thực thi prompt. Mặc định là None, vì vậy mô hình sẽ không bao giờ gọi hàm ví của bạn bất kể người dùng yêu cầu rõ ràng như thế nào. Nếu tác nhân hoàn toàn bỏ qua hàm, hãy kiểm tra điều này trước.
Các số lượng là đơn vị cơ sở USDC, dưới dạng chuỗi
The payments call takes amountWei: a string of USDC base units (6 decimals), so 0.01 USDC is "10000" and 5 USDC is "5000000". Type the function argument as a string in any language. payments.create also does not retry by default and can answer 503 until the chain adapter is wired for your network - return a clear message rather than letting the agent loop.
Phạm vi plugin giữa các đại lý
Đăng ký chức năng ví chỉ trên kernel của tác nhân nên nắm giữ quyền chi tiêu. Plugin không phải là toàn cầu - một tác nhân mà kernel của nó không có không thể gọi nó. Cung cấp cho một tác nhân đánh giá một kernel không có chức năng ví, hoặc hạn chế các chức năng được phép theo tác nhân, để tiền vẫn ở một vai trò.
Xác minh các webhook với thân dữ liệu thô
Đọc nội dung yêu cầu thô và xác minh trước khi giải mã - HMAC bao phủ các byte chính xác, vì vậy một chuyến đi phân tích sau đó giải mã lại sẽ phá vỡ nó. Bộ xử lý .NET bên dưới thực hiện thuật toán đã được tài liệu: HMAC-SHA256 trên t.rawBody, một khoảng thời gian 300 giây và so sánh thời gian cố định. Python và Java xác minh theo cách tương tự với các thư viện HMAC của riêng họ.