Ir para o conteúdo principal
INTEGRAÇÃO DO KERNEL SEMÂNTICO

Integração de pagamento do Semantic Kernel.

Nenhum pacote Semantic Kernel necessário. Envolva o cliente blockchain0x real em uma KernelFunction (Python ou Java), ou chame a API REST de uma KernelFunction C#. De qualquer forma, o agente move USDC na Base.

RESPOSTA CURTA

Não há pacote Semantic Kernel. Em Python, você envolve o cliente real blockchain0x em um método decorado com @kernel_function; em C#, onde nenhum SDK .NET é enviado, um [KernelFunction] chama a API REST diretamente. Registre-o em seu kernel, defina FunctionChoiceBehavior como Auto, e o agente pode mover USDC na Base. Os SDKs principais enviados são Node, Python, Ruby, Go e JVM.

POR QUE O SEMANTIC KERNEL

O único framework de agente .NET de nível empresarial.

Se sua pilha é moldada pela Microsoft (Azure, .NET, SQL Server, Teams, Copilot Studio), o Semantic Kernel é quase certamente o framework de agente certo. É construído pela Microsoft, integra-se com Azure OpenAI, AKS e Entra, e tem suporte de primeira classe em .NET, Python e Java de uma maneira que nenhum outro framework iguala. E já te dá a coisa que você precisa: uma KernelFunction é apenas um método, então conectar pagamentos é um método que você escreve, não um pacote que você espera.

É por isso que não há adaptador do Semantic Kernel para instalar. Em Python e Java, você envolve o SDK real do blockchain0x em uma KernelFunction; em C#, onde nenhum SDK .NET é enviado ainda, a KernelFunction chama a API REST diretamente com HttpClient. Você mantém ergonomia idiomática - métodos decorados, assíncronos, validação de parâmetros baseada em atributos - e não há versão de adaptador para rastrear. Os SDKs principais que existem hoje são Node, Python, Ruby, Go e JVM.

INSTALAÇÃO

Instale Semantic Kernel e, em Python, o SDK principal.

Não há pacote blockchain0x Semantic Kernel para adicionar. Python instala Semantic Kernel mais o SDK real blockchain0x; C# instala Microsoft.SemanticKernel e chama a API REST com o HttpClient embutido. Java usa Semantic Kernel para Java mais o com.blockchain0x:sdk-jvm SDK.

INSTALAR - PYTHON
pip install semantic-kernel blockchain0x
INSTALAR - .NET (Apenas Semantic Kernel)
dotnet add package Microsoft.SemanticKernel
VARIÁVEIS DE AMBIENTE
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 (o cliente Python lê isto) é uma chave sk_test_ de testnet ou sk_live_ de mainnet do seu painel; o exemplo REST em C# lê o mesmo valor de BLOCKCHAIN0X_API_KEY. OPENAI_API_KEY (ou AZURE_OPENAI_* para modelos hospedados na Azure) é a sua chave do LLM. O handler de webhook também precisa de BLOCKCHAIN0X_WEBHOOK_SECRET.

EXEMPLOS COMPLETOS DE AGENTES

Uma KernelFunction de carteira, em Python e C#.

Python envolve o verdadeiro cliente blockchain0x em um método decorado com @kernel_function. C#, onde nenhum SDK .NET é enviado, expõe um [KernelFunction] que chama POST /v1/payments diretamente com HttpClient. Ambos se registram no kernel como Wallet.send_usdc; apenas a cerimônia ao redor difere.

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.

MANUSEIO DE WEBHOOK

API mínima do ASP.NET Core para receber eventos de pagamento.

Quando um pagamento é liquidado, Blockchain0x POSTa um evento assinado para sua URL de webhook. Não há verificador .NET enviado, então o manipulador verifica manualmente contra o HMAC documentado - que é tudo o que um helper faria. Exemplo de .NET abaixo; Python e Java verificam da mesma forma com suas próprias bibliotecas 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();

O algoritmo é HMAC-SHA256 sobre a string t.rawBody, uma janela de replay de 300 segundos e uma comparação em tempo constante. Leia o corpo bruto via StreamReader para que a assinatura permaneça intacta; não desserialize e depois re-serialize. Os eventos enviados são payment.received, payment.sent, wallet.deployed e webhook.test. Em produção, o webhook geralmente é executado como um serviço ASP.NET Core separado compartilhando um banco de dados com o agente para que os dois possam coordenar.

FONTE E DOCUMENTOS

Os SDKs e a superfície REST são abertos. Leia-os.

Não existe um starter package do Semantic Kernel para clonar - as receitas acima são a integração. Os SDKs centrais da blockchain0x (Node, Python, Ruby, Go) são open source no GitHub, e sua superfície de métodos, além das rotas REST que o exemplo em C# chama, estão documentadas na documentação.

docs.blockchain0x.com/docs/overview

A superfície de métodos do SDK e as rotas REST estão documentadas em the docs. Comece com uma chave sk_test_ na Base Sepolia e depois mude para sk_live_ quando a KernelFunction fizer o que você espera.

ARMADILHAS COMUNS

Cinco armadilhas específicas do Semantic Kernel a evitar.

O modelo de plugin do Semantic Kernel é limpo, mas tem armadilhas de comportamento e entre linguagens. Conhecê-las antecipadamente economiza tempo.

PITFALL 1

Não há pacote Semantic Kernel, em nenhuma linguagem

Não há adaptador NuGet, PyPI ou Maven. Os SDKs principais enviados são Node, Python, Ruby, Go e JVM - não .NET. Portanto, um kernel Python envolve o cliente blockchain0x Python em um @kernel_function, um kernel Java usa o SDK com.blockchain0x:sdk-jvm, e um kernel C# chama a API REST diretamente de um KernelFunction (mostrado acima). Todos os três são algumas linhas.

PITFALL 2

FunctionChoiceBehavior deve ser Auto

O Semantic Kernel só invoca funções de plugin quando FunctionChoiceBehavior está definido como Auto nas configurações de execução do prompt. O padrão é Nenhum, então o modelo nunca chama sua função de carteira, não importa o quão claramente o usuário peça. Se o agente ignorar a função completamente, verifique isso primeiro.

PITFALL 3

Os valores são unidades base de USDC, como strings

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

Escopo do plugin entre agentes

Registre a função da carteira apenas no kernel do agente que deve ter a autoridade de gasto. O plugin não é global - um agente cujo kernel não o possui não pode chamá-lo. Dê a um agente revisor um kernel sem a função da carteira, ou restrinja as funções permitidas por agente, para que o dinheiro permaneça com um único papel.

PITFALL 5

Verifique webhooks contra o corpo bruto

Leia o corpo da solicitação bruta e verifique antes de desserializar - o HMAC cobre os bytes exatos, então uma viagem de ida e volta de parse-then-reserialize quebra isso. O manipulador .NET abaixo implementa o algoritmo documentado: HMAC-SHA256 sobre t.rawBody, uma janela de 300 segundos e uma comparação em tempo constante. Python e Java verificam da mesma forma com suas próprias bibliotecas HMAC.

PERGUNTAS FREQUENTES

Três perguntas específicas sobre Semantic Kernel.

Há um pacote Semantic Kernel para instalar (NuGet, PyPI ou Maven)?

Não. O caminho honesto depende da sua linguagem. O Semantic Kernel Python envolve o cliente blockchain0x Python real em uma @kernel_function, como mostrado acima. O Semantic Kernel Java usa o SDK com.blockchain0x:sdk-jvm dentro de uma KernelFunction. C# e as outras linguagens .NET não têm SDK blockchain0x - os SDKs principais enviados são Node, Python, Ruby, Go e JVM - então uma KernelFunction .NET chama a API REST diretamente, também mostrado acima. Os únicos pacotes de framework enviados são blockchain0x-langchain e blockchain0x-crewai (Python) além do servidor @blockchain0x/mcp.

Por que há uma lacuna no SDK .NET, e isso é um problema?

É apenas onde o roteiro do SDK está hoje: Node, Python, Ruby, Go e JVM são lançados, .NET ainda não. Não é um bloqueador. A API REST é JSON simples sobre HTTPS com autenticação de token portador, e uma KernelFunction C# que chama POST /v1/payments (acima) é uma mão cheia de linhas com HttpClient. Se um SDK .NET de primeira classe é importante para você, nos avise e pesaremos isso contra a demanda.

Isso funciona com o Framework de Agentes e o Microsoft 365 Copilot?

Sim. A função de carteira é uma função comum do Semantic Kernel, então funciona em execuções únicas de ChatCompletionAgent e em orquestrações de AgentGroupChat - registre-a apenas no kernel do agente de cobrança e deixe os outros realizarem o trabalho após a liquidação do pagamento. Extensões do Microsoft 365 Copilot que executam o Semantic Kernel por trás dos panos podem registrá-la da mesma forma; apresente o pagamento ao usuário com sua própria interface. Não há pacote específico do Copilot; é a mesma receita.

Adicione cobrança ao seu agente SK.

Uma KernelFunction sobre o cliente real ou a API REST, sem pacote para instalar. Gratuito para começar.