セマンティックカーネルの支払い統合。
Semantic Kernelパッケージは必要ありません。実際のblockchain0xクライアントをKernelFunction(PythonまたはJava)でラップするか、C# KernelFunctionからREST APIを呼び出します。いずれにせよ、エージェントはBase上でUSDCを移動させます。
Semantic Kernelパッケージはありません。Pythonでは、実際のblockchain0xクライアントを@kernel_functionで装飾されたメソッドでラップします。C#では、.NET SDKが出荷されないため、[KernelFunction]がREST APIを直接呼び出します。それをカーネルに登録し、FunctionChoiceBehaviorをAutoに設定すれば、エージェントはBase上でUSDCを移動できます。出荷されたコアSDKはNode、Python、Ruby、Go、JVMです。
唯一のエンタープライズグレードの.NETエージェントフレームワーク。
もしあなたのスタックがMicrosoft型(Azure、.NET、SQL Server、Teams、Copilot Studio)であれば、Semantic Kernelはほぼ確実に正しいエージェントフレームワークです。これはMicrosoftによって構築されており、Azure OpenAI、AKS、Entraと統合されており、他のフレームワークがマッチしない方法で.NET、Python、Java全体で一流のサポートを提供しています。そして、あなたが必要とするものをすでに提供しています: KernelFunctionは単なるメソッドですので、支払いを接続するのはあなたが書くメソッドであり、待つパッケージではありません。
それが、インストールするSemantic Kernelアダプタがない理由です。PythonとJavaでは、実際のblockchain0x SDKをKernelFunctionでラップします; C#では、まだ.NET SDKが出荷されていないため、KernelFunctionはHttpClientを使用してREST APIを直接呼び出します。あなたは慣用的なエルゴノミクスを維持します - 装飾されたメソッド、非同期、属性ベースのパラメータ検証 - そして追跡するアダプタバージョンはありません。今日存在するコアSDKはNode、Python、Ruby、Go、JVMです。
Semantic Kernelをインストールし、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 キーです。C# REST の例でも同じ値を BLOCKCHAIN0X_API_KEY から読み込みます。OPENAI_API_KEY (または Azure-hosted models 用の AZURE_OPENAI_*) は LLM キーです。webhook handler には追加で BLOCKCHAIN0X_WEBHOOK_SECRET が必要です。
ウォレットKernelFunction、PythonおよびC#で。
Pythonは、@kernel_functionで装飾されたメソッド内で実際のblockchain0xクライアントをラップします。C#では、.NET SDKが出荷されていないため、HttpClientを使用してPOST /v1/paymentsを直接呼び出す[KernelFunction]を公開します。両方とも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はあなたのWebhook URLに署名されたイベントをPOSTします。出荷された.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 はありません - 上の recipe がそのまま integration です。blockchain0x の core SDK (Node, Python, Ruby, Go) は GitHub で open source であり、メソッド一覧と C# example が呼び出す REST routes は docs に記載されています。
docs.blockchain0x.com/docs/overviewSDK のメソッド一覧と REST ルートは the docs に記載されています。まずは Base Sepolia で sk_test_ key を使い、KernelFunction が想定どおり動いたら sk_live_ に切り替えてください。
Semantic Kernelに特有の避けるべき5つの罠。
セマンティックカーネルのプラグインモデルはクリーンですが、クロスランゲージや動作デフォルトの落とし穴があります。事前に知っておくことで時間を節約できます。
どの言語でもSemantic Kernelパッケージはありません。
NuGet、PyPI、またはMavenアダプターはありません。出荷されたコアSDKはNode、Python、Ruby、Go、JVMであり、.NETではありません。したがって、Pythonカーネルはblockchain0x Pythonクライアントを@kernel_functionでラップし、Javaカーネルはcom.blockchain0x:sdk-jvm SDKを使用し、C#カーネルはKernelFunctionからREST APIを直接呼び出します(上記参照)。すべて3つは数行です。
FunctionChoiceBehaviorはAutoでなければなりません
Semantic Kernelは、プロンプト実行設定で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ライブラリで同様に検証します。