Semantic Kernel ödeme entegrasyonu.
Semantic Kernel paketi gerekmez. Gerçek blockchain0x istemcisini bir KernelFunction (Python veya Java) içine sarın veya bir C# KernelFunction'dan REST API'yi çağırın. Her durumda, ajan Base üzerinde USDC taşır.
Semantic Kernel paketi yoktur. Python'da gerçek blockchain0x istemcisini @kernel_function ile süslenmiş bir yöntem içinde sararsınız; C#'da, .NET SDK'sı gönderilmeyen yerde, bir [KernelFunction] REST API'yi doğrudan çağırır. Bunu çekirdeğinize kaydedin, FunctionChoiceBehavior'ı Auto olarak ayarlayın ve ajansınız Base üzerinde USDC taşıyabilir. Gönderilen çekirdek SDK'lar Node, Python, Ruby, Go ve JVM'dir.
Tek kurumsal düzeyde .NET ajan çerçevesi.
Eğer yığınınız Microsoft şekilli ise (Azure, .NET, SQL Server, Teams, Copilot Studio), Semantic Kernel muhtemelen doğru ajan çerçevesidir. Microsoft tarafından inşa edilmiştir, Azure OpenAI, AKS ve Entra ile entegre olur ve diğer hiçbir çerçevenin eşleşmediği şekilde .NET, Python ve Java'da birinci sınıf destek sunar. Ve zaten ihtiyacınız olan şeyi size verir: bir KernelFunction sadece bir yöntemdir, bu nedenle ödemeleri bağlamak, beklediğiniz bir paket değil, yazdığınız bir yöntemdir.
Bu nedenle, kurulum için bir Semantic Kernel adaptörü yoktur. Python ve Java'da gerçek blockchain0x SDK'sını bir KernelFunction içinde sararsınız; C#'da, henüz .NET SDK'sı yoksa, KernelFunction REST API'yi doğrudan HttpClient ile çağırır. İdiomatik ergonomiyi korursunuz - süslü yöntemler, asenkron, öznitelik tabanlı parametre doğrulaması - ve takip edilecek bir adaptör sürümü yoktur. Bugün mevcut olan temel SDK'lar Node, Python, Ruby, Go ve JVM'dir.
Semantic Kernel'i ve Python'da çekirdek SDK'yı kurun.
Ekleyecek bir blockchain0x Semantic Kernel paketi yoktur. Python, Semantic Kernel'ı ve gerçek blockchain0x SDK'sını kurar; C#, Microsoft.SemanticKernel'ı kurar ve REST API'yi yerleşik HttpClient ile çağırır. Java, Java için Semantic Kernel'ı ve com.blockchain0x:sdk-jvm SDK'sını kullanır.
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 istemcisi bunu okur) dashboard'unuzdan alınan bir sk_test_ testnet veya sk_live_ mainnet anahtarıdır; C# REST örneği aynı değeri BLOCKCHAIN0X_API_KEY'den okur. OPENAI_API_KEY (veya Azure-hosted modeller için AZURE_OPENAI_*) sizin LLM anahtarınızdır. Webhook handler ayrıca BLOCKCHAIN0X_WEBHOOK_SECRET gerektirir.
Bir cüzdan KernelFunction, Python ve C#'da.
Python, gerçek blockchain0x istemcisini @kernel_function ile süslenmiş bir yöntemle sarar. .NET SDK'sının gönderilmediği C#, doğrudan HttpClient ile POST /v1/payments çağıran bir [KernelFunction] sunar. Her ikisi de çekirdek üzerinde Wallet.send_usdc olarak kaydedilir; yalnızca çevresindeki tören farklıdır.
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.
Ödeme olaylarını almak için ASP.NET Core minimal API.
Bir ödeme yerleştiğinde, Blockchain0x imzalı bir olayı webhook URL'nize POST eder. Gönderilen bir .NET doğrulayıcı yoktur, bu nedenle işleyici belgelenmiş HMAC'a karşı elle doğrular - bu da bir yardımcı programın yapacağı tek şeydir. Aşağıdaki .NET örneği; Python ve Java kendi HMAC kütüphaneleri ile aynı şekilde doğrular.
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();Algoritma, t.rawBody dizesi üzerinde HMAC-SHA256, 300 saniyelik bir tekrar penceresi ve sabit zamanlı karşılaştırma ile çalışır. İmzanın bozulmaması için ham veriyi StreamReader aracılığıyla okuyun; serileştirmeyin ve ardından yeniden serileştirmeyin. Gönderilen olaylar payment.received, payment.sent, wallet.deployed ve webhook.test'tir. Üretimde, webhook genellikle bir veritabanını ajansla paylaşan ayrı bir ASP.NET Core hizmeti olarak çalışır, böylece ikisi koordine olabilir.
SDK'lar ve REST yüzeyi açıktır. Okuyun.
Klonlanacak bir Semantic Kernel starter package yok - yukarıdaki recipe'ler entegrasyonun kendisidir. blockchain0x core SDK'leri (Node, Python, Ruby, Go) GitHub'da open source'dur ve method surface ile C# örneğinin çağırdığı REST route'lar dokümanlarda yer alır.
docs.blockchain0x.com/docs/overviewSDK method surface ve REST route'lar the docs içinde belgelenmiştir. Base Sepolia üzerinde bir sk_test_ anahtarıyla başlayın, ardından KernelFunction beklediğiniz gibi çalıştığında sk_live_ anahtarına geçin.
Beş Semantic Kernel'a özgü kaçınılması gereken tuzak.
Semantic Kernel'in eklenti modeli temizdir ancak dil geçişleri ve davranış varsayılanları ile ilgili bazı sorunlar vardır. Bunları önceden bilmek zaman kazandırır.
Herhangi bir dilde Semantic Kernel paketi yoktur.
NuGet, PyPI veya Maven adaptörü yoktur. Gönderilen çekirdek SDK'lar Node, Python, Ruby, Go ve JVM'dir - .NET değil. Bu nedenle, bir Python çekirdeği blockchain0x Python istemcisini @kernel_function içinde sarar, bir Java çekirdeği com.blockchain0x:sdk-jvm SDK'sını kullanır ve bir C# çekirdeği REST API'yi doğrudan bir KernelFunction'dan (yukarıda gösterildiği gibi) çağırır. Üçü de birkaç satırdır.
FunctionChoiceBehavior otomatik olmalıdır
Semantic Kernel yalnızca FunctionChoiceBehavior, istem yürütme ayarlarında Auto olarak ayarlandığında eklenti işlevlerini çağırır. Varsayılan None'dır, bu nedenle model, kullanıcı ne kadar net bir şekilde isterse istesin cüzdan işlevinizi asla çağırmaz. Eğer ajan işlevi tamamen göz ardı ederse, önce bunu kontrol edin.
Tutarlar, dize olarak USDC temel birimleridir
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.
Ajanlar arasında eklenti kapsamı
Cüzdan işlevini yalnızca harcama yetkisini tutması gereken ajanın çekirdeğine kaydedin. Eklenti küresel değildir - çekirdeğinde bu işlev olmayan bir ajan onu çağıramaz. Bir gözden geçiren ajana cüzdan işlevi olmayan bir çekirdek verin veya her ajan için izin verilen işlevleri kısıtlayın, böylece para bir rolde kalır.
Webhook'ları ham gövdeye karşı doğrula
Ham istek gövdesini okuyun ve ayrıştırmadan önce doğrulayın - HMAC, tam baytları kapsar, bu nedenle bir ayrıştırma-sonra-yeniden-serialize gidiş dönüşü onu bozar. Aşağıdaki .NET işleyici, belgelenmiş algoritmayı uygular: t.rawBody üzerinde HMAC-SHA256, 300 saniyelik bir pencere ve sabit zaman karşılaştırması. Python ve Java, kendi HMAC kütüphaneleri ile aynı şekilde doğrular.