跳转到主要内容
语义内核集成

语义内核支付集成。

不需要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。

为什么选择 SEMANTIC KERNEL

唯一的企业级.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。

安装 - PYTHON
pip install semantic-kernel blockchain0x
安装 - .NET(仅限语义内核)
dotnet add package Microsoft.SemanticKernel
环境变量
BLOCKCHAIN0X_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;只有周围的仪式不同。

PYTHON (plugin.py)
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.
.NET (WalletPlugin.cs)
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.

WEBHOOK 处理

用于接收支付事件的ASP.NET Core最小API。

当支付结算时,Blockchain0x 会将签名事件 POST 到您的 webhook URL。没有提供 .NET 验证器,因此处理程序手动根据文档中的 HMAC 进行验证 - 这正是助手所做的。下面是 .NET 示例;Python 和 Java 以相同的方式使用各自的 HMAC 库进行验证。

WEBHOOK.CS
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/overview

SDK method surface 和 REST routes 已记录在 the docs 中。先使用 sk_test_ key 对接 Base Sepolia 进行测试,然后在 KernelFunction 符合预期后切换到 sk_live_。

常见陷阱

五个需要避免的 Semantic Kernel 特定陷阱。

语义内核的插件模型很简洁,但存在跨语言和行为默认的陷阱。提前了解这些可以节省时间。

PITFALL 1

没有语义内核包,任何语言都没有

没有 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(如上所示)。这三者都只有几行代码。

PITFALL 2

FunctionChoiceBehavior必须为Auto

语义内核仅在提示执行设置中将 FunctionChoiceBehavior 设置为 Auto 时调用插件功能。默认值为 None,因此无论用户如何明确请求,模型都不会调用您的钱包功能。如果代理完全忽略该功能,请先检查这一点。

PITFALL 3

金额是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.

PITFALL 4

跨代理的插件范围

仅在应持有支出权限的代理的内核上注册钱包功能。该插件不是全局的 - 没有该功能的代理无法调用它。给审核代理一个没有钱包功能的内核,或限制每个代理允许的功能,以便资金保持在一个角色中。

PITFALL 5

根据原始主体验证 webhook

读取原始请求体并在反序列化之前进行验证 - HMAC 覆盖确切的字节,因此解析然后重新序列化的往返会破坏它。下面的 .NET 处理程序实现了文档中描述的算法:对 t.rawBody 进行 HMAC-SHA256,300 秒的窗口,以及常量时间比较。Python 和 Java 以相同的方式使用各自的 HMAC 库进行验证。

常见问题

三个Semantic Kernel特定问题。

是否有要安装的语义内核包(NuGet、PyPI或Maven)?

不。诚实的路径取决于你的语言。Python Semantic Kernel将真实的blockchain0x Python客户端包装在@kernel_function中,如上所示。Java Semantic Kernel在KernelFunction内部使用com.blockchain0x:sdk-jvm SDK。C#和其他.NET语言没有blockchain0x SDK - 发布的核心SDK是Node、Python、Ruby、Go和JVM - 因此.NET KernelFunction直接调用REST API,如上所示。唯一发布的框架包是blockchain0x-langchain和blockchain0x-crewai(均为Python)以及@blockchain0x/mcp服务器。

为什么会有 .NET SDK 差距,这有问题吗?

这只是SDK路线图今天的位置:Node、Python、Ruby、Go和JVM已发布,.NET尚未发布。这不是一个障碍。REST API是通过HTTPS使用持有者令牌身份验证的普通JSON,而调用POST /v1/payments(上述)的C# KernelFunction只需几行代码即可使用HttpClient。如果一流的.NET SDK对您很重要,请告诉我们,我们将根据需求进行权衡。

这是否可以与 Agent Framework 和 Microsoft 365 Copilot 一起使用?

是的。钱包功能是一个普通的语义内核函数,因此它在单个 ChatCompletionAgent 运行和 AgentGroupChat 编排中都能工作 - 仅在计费代理的内核上注册它,让其他代理在支付结算后进行工作。运行语义内核的 Microsoft 365 Copilot 扩展可以以相同的方式注册它;使用您自己的 UI 将支付呈现给用户。没有特定于 Copilot 的包;它是相同的配方。

为您的SK代理添加计费。

一个在真实客户端或 REST API 上的 KernelFunction,无需安装软件包。免费开始。