语义内核支付集成。
不需要Semantic Kernel包。将真实的blockchain0x客户端包装在KernelFunction(Python或Java)中,或从C# KernelFunction调用REST API。无论哪种方式,代理都在Base上移动USDC。
没有语义内核包。在 Python 中,您将真实的 blockchain0x 客户端包装在一个用 @kernel_function 装饰的方法中;在 C# 中,尚未提供 .NET SDK,[KernelFunction] 直接调用 REST API。将其注册到您的内核上,将 FunctionChoiceBehavior 设置为自动,代理可以在 Base 上移动 USDC。已发布的核心 SDK 是 Node、Python、Ruby、Go 和 JVM。
唯一的企业级.NET代理框架。
如果您的技术栈是微软形状(Azure、.NET、SQL Server、Teams、Copilot Studio),那么语义内核几乎肯定是正确的代理框架。它由微软构建,集成了Azure OpenAI、AKS和Entra,并且在.NET、Python和Java中提供了其他框架无法匹敌的一流支持。而且它已经给您提供了所需的东西:KernelFunction只是一个方法,因此连接支付是您编写的方法,而不是您等待的包。
这就是为什么没有要安装的语义内核适配器。在 Python 和 Java 中,您将真实的 blockchain0x SDK 包装在 KernelFunction 中;在 C# 中,尚未提供 .NET SDK,KernelFunction 直接使用 HttpClient 调用 REST API。您保持惯用的设计 - 装饰方法、异步、基于属性的参数验证 - 并且没有适配器版本需要跟踪。当前存在的核心 SDK 是 Node、Python、Ruby、Go 和 JVM。
安装语义内核,并在Python中安装核心SDK。
没有可以添加的 blockchain0x Semantic Kernel 包。Python 安装 Semantic Kernel 以及真正的 blockchain0x SDK;C# 安装 Microsoft.SemanticKernel 并使用内置的 HttpClient 调用 REST API。Java 使用 Java 的 Semantic Kernel 以及 com.blockchain0x:sdk-jvm SDK。
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 会读取它)是你 dashboard 中的 sk_test_ testnet 或 sk_live_ mainnet key;C# REST 示例会从 BLOCKCHAIN0X_API_KEY 读取同一个值。OPENAI_API_KEY(或 Azure-hosted models 对应的 AZURE_OPENAI_*)是你的 LLM key。webhook handler 还需要 BLOCKCHAIN0X_WEBHOOK_SECRET。
一个钱包 KernelFunction,使用 Python 和 C#。
Python将真实的blockchain0x客户端包装在一个用@kernel_function装饰的方法中。C#,没有.NET SDK发布,暴露一个[KernelFunction],直接使用HttpClient调用POST /v1/payments。两者在内核中注册为Wallet.send_usdc;只有周围的仪式不同。
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.
用于接收支付事件的ASP.NET Core最小API。
当支付结算时,Blockchain0x 会将签名事件 POST 到您的 webhook URL。没有提供 .NET 验证器,因此处理程序手动根据文档中的 HMAC 进行验证 - 这正是助手所做的。下面是 .NET 示例;Python 和 Java 以相同的方式使用各自的 HMAC 库进行验证。
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();该算法是针对字符串 t.rawBody 的 HMAC-SHA256,具有 300 秒的重放窗口和常量时间比较。通过 StreamReader 读取原始主体,以保持签名完整;不要反序列化然后重新序列化。已发布的事件是 payment.received、payment.sent、wallet.deployed 和 webhook.test。在生产中,webhook 通常作为一个单独的 ASP.NET Core 服务运行,与代理共享数据库,以便两者可以协调。
SDK 和 REST 表面是开放的。阅读它们。
没有可克隆的 Semantic Kernel starter package - 上面的 recipes 就是集成方式。blockchain0x core SDKs (Node, Python, Ruby, Go) 在 GitHub 上开源,它们的方法表面以及 C# 示例调用的 REST routes 都记录在 docs 中。
docs.blockchain0x.com/docs/overviewSDK method surface 和 REST routes 已记录在 the docs 中。先使用 sk_test_ key 对接 Base Sepolia 进行测试,然后在 KernelFunction 符合预期后切换到 sk_live_。
五个需要避免的 Semantic Kernel 特定陷阱。
语义内核的插件模型很简洁,但存在跨语言和行为默认的陷阱。提前了解这些可以节省时间。
没有语义内核包,任何语言都没有
没有 NuGet、PyPI 或 Maven 适配器。已发布的核心 SDK 是 Node、Python、Ruby、Go 和 JVM - 而不是 .NET。因此,Python 内核在 @kernel_function 中包装 blockchain0x Python 客户端,Java 内核使用 com.blockchain0x:sdk-jvm SDK,而 C# 内核直接从 KernelFunction 调用 REST API(如上所示)。这三者都只有几行代码。
FunctionChoiceBehavior必须为Auto
语义内核仅在提示执行设置中将 FunctionChoiceBehavior 设置为 Auto 时调用插件功能。默认值为 None,因此无论用户如何明确请求,模型都不会调用您的钱包功能。如果代理完全忽略该功能,请先检查这一点。
金额是USDC基本单位,以字符串形式表示
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.
跨代理的插件范围
仅在应持有支出权限的代理的内核上注册钱包功能。该插件不是全局的 - 没有该功能的代理无法调用它。给审核代理一个没有钱包功能的内核,或限制每个代理允许的功能,以便资金保持在一个角色中。
根据原始主体验证 webhook
读取原始请求体并在反序列化之前进行验证 - HMAC 覆盖确切的字节,因此解析然后重新序列化的往返会破坏它。下面的 .NET 处理程序实现了文档中描述的算法:对 t.rawBody 进行 HMAC-SHA256,300 秒的窗口,以及常量时间比较。Python 和 Java 以相同的方式使用各自的 HMAC 库进行验证。