Intégration de paiement du Semantic Kernel.
Aucun package Semantic Kernel nécessaire. Enveloppez le véritable client blockchain0x dans une KernelFunction (Python ou Java), ou appelez l'API REST depuis une KernelFunction C#. Dans tous les cas, l'agent déplace USDC sur Base.
Il n'y a pas de package Semantic Kernel. En Python, vous encapsulez le vrai client blockchain0x dans une méthode décorée avec @kernel_function ; en C#, où aucun SDK .NET n'est expédié, un [KernelFunction] appelle directement l'API REST. Enregistrez-le sur votre noyau, définissez FunctionChoiceBehavior sur Auto, et l'agent peut déplacer USDC sur Base. Les SDK de base expédiés sont Node, Python, Ruby, Go et JVM.
Le seul framework d'agent .NET de niveau entreprise.
Si votre stack est de type Microsoft (Azure, .NET, SQL Server, Teams, Copilot Studio), Semantic Kernel est presque certainement le bon framework d'agent. Il est construit par Microsoft, il s'intègre avec Azure OpenAI, AKS et Entra, et il a un support de première classe à travers .NET, Python et Java d'une manière qu'aucun autre framework ne correspond. Et il vous donne déjà ce dont vous avez besoin : une KernelFunction est juste une méthode, donc intégrer les paiements est une méthode que vous écrivez, pas un package que vous attendez.
C'est pourquoi il n'y a pas d'adaptateur Semantic Kernel à installer. En Python et Java, vous enveloppez le véritable SDK blockchain0x dans une KernelFunction ; en C#, où aucun SDK .NET n'est encore expédié, la KernelFunction appelle directement l'API REST avec HttpClient. Vous conservez une ergonomie idiomatique - méthodes décorées, async, validation des paramètres basée sur des attributs - et il n'y a pas de version d'adaptateur à suivre. Les SDK principaux qui existent aujourd'hui sont Node, Python, Ruby, Go et JVM.
Installez Semantic Kernel et, en Python, le SDK de base.
Il n'y a pas de package blockchain0x Semantic Kernel à ajouter. Python installe Semantic Kernel plus le vrai SDK blockchain0x ; C# installe Microsoft.SemanticKernel et appelle l'API REST avec le HttpClient intégré. Java utilise Semantic Kernel pour Java plus le 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 (le client Python le lit) est une clé sk_test_ testnet ou sk_live_ mainnet de votre tableau de bord ; l'exemple REST C# lit la même valeur de BLOCKCHAIN0X_API_KEY. OPENAI_API_KEY (ou AZURE_OPENAI_* pour les modèles hébergés sur Azure) est votre clé LLM. Le gestionnaire de webhook a également besoin de BLOCKCHAIN0X_WEBHOOK_SECRET.
Une KernelFunction de portefeuille, en Python et C#.
Python enveloppe le véritable client blockchain0x dans une méthode décorée avec @kernel_function. C#, où aucun SDK .NET n'est fourni, expose un [KernelFunction] qui appelle POST /v1/payments directement avec HttpClient. Les deux s'enregistrent sur le noyau comme Wallet.send_usdc ; seule la cérémonie environnante diffère.
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 minimale ASP.NET Core pour recevoir des événements de paiement.
Lorsque qu'un paiement est réglé, Blockchain0x envoie un événement signé à votre URL de webhook. Il n'y a pas de vérificateur .NET expédié, donc le gestionnaire vérifie manuellement contre le HMAC documenté - ce que ferait un outil. Exemple .NET ci-dessous ; Python et Java vérifient de la même manière avec leurs propres bibliothèques 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();L'algorithme est HMAC-SHA256 sur la chaîne t.rawBody, une fenêtre de répétition de 300 secondes, et une comparaison en temps constant. Lisez le corps brut via StreamReader afin que la signature reste intacte ; ne désérialisez pas puis ne re-sérialisez pas. Les événements expédiés sont payment.received, payment.sent, wallet.deployed, et webhook.test. En production, le webhook fonctionne souvent comme un service ASP.NET Core séparé partageant une base de données avec l'agent afin que les deux puissent se coordonner.
Les SDK et la surface REST sont ouverts. Lisez-les.
Il n'y a pas de package de démarrage Semantic Kernel à cloner - les recettes ci-dessus sont l'intégration. Les SDK de base blockchain0x (Node, Python, Ruby, Go) sont open source sur GitHub, et leur surface de méthode ainsi que les routes REST appelées par l'exemple C# sont documentées dans la documentation.
docs.blockchain0x.com/docs/overviewLa surface des méthodes SDK et les routes REST sont documentées à la documentation. Commencez avec une clé sk_test_ contre Base Sepolia, puis passez à sk_live_ lorsque la KernelFunction fait ce que vous attendez.
Cinq pièges spécifiques à Semantic Kernel à éviter.
Le modèle de plugin du Semantic Kernel est propre mais présente des pièges liés aux langues et aux comportements par défaut. Les connaître à l'avance fait gagner du temps.
Il n'y a pas de package Semantic Kernel, dans aucune langue
Il n'y a pas d'adaptateur NuGet, PyPI ou Maven. Les SDK de base expédiés sont Node, Python, Ruby, Go et JVM - pas .NET. Donc, un noyau Python encapsule le client Python blockchain0x dans un @kernel_function, un noyau Java utilise le SDK com.blockchain0x:sdk-jvm, et un noyau C# appelle directement l'API REST à partir d'un KernelFunction (montré ci-dessus). Les trois ne font que quelques lignes.
FunctionChoiceBehavior doit être Auto
Le Semantic Kernel n'invoque les fonctions de plugin que lorsque FunctionChoiceBehavior est défini sur Auto dans les paramètres d'exécution de l'invite. La valeur par défaut est None, donc le modèle n'appelle jamais votre fonction de portefeuille peu importe à quel point l'utilisateur demande clairement. Si l'agent ignore complètement la fonction, vérifiez cela en premier.
Les montants sont des unités de base USDC, sous forme de chaînes
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.
Portée du plugin à travers les agents
Enregistrez la fonction de portefeuille uniquement sur le noyau de l'agent qui doit détenir l'autorité de dépense. Le plugin n'est pas global - un agent dont le noyau ne l'a pas ne peut pas l'appeler. Donnez à un agent réviseur un noyau sans la fonction de portefeuille, ou restreignez les fonctions autorisées par agent, afin que l'argent reste avec un seul rôle.
Vérifiez les webhooks par rapport au corps brut
Lisez le corps de la requête brut et vérifiez avant de désérialiser - le HMAC couvre les octets exacts, donc un aller-retour de parse puis de résérialisation le casse. Le gestionnaire .NET ci-dessous implémente l'algorithme documenté : HMAC-SHA256 sur t.rawBody, une fenêtre de 300 secondes, et une comparaison en temps constant. Python et Java vérifient de la même manière avec leurs propres bibliothèques HMAC.