Le SDK C# (sdk/csharp/Ledger.Sdk) couvre l'API manuelle Record. Les applications .NET instrumentées avec OTel devraient plutôt faire pointer leur exportateur existant vers le récepteur OTLP du registre (/v1/otlp/v1/traces) plutôt que de recourir à un processeur de spans ici.
Pas encore publié sur NuGet. Référencez le projet directement pour l'instant :
dotnet add reference <path-to-repo>/sdk/csharp/Ledger.Sdk/Ledger.Sdk.csproj
using Ledger.Sdk;
var ledger = new LedgerClient(
apiUrl: "http://127.0.0.1:4010",
ingestKey: ingestKey,
agentId: "urn:agent:research-assistant"
);
ledger.SetTrigger("human", "person@example.com");
var started = DateTimeOffset.UtcNow.AddSeconds(-1);
var ended = DateTimeOffset.UtcNow;
var spanId = ledger.Record(new RecordInput
{
ActionType = "llm_call",
Provider = "anthropic",
Model = "claude-fable-5",
StartedAt = started,
EndedAt = ended,
Status = "success",
Usage = new Usage(TokensIn: 420, TokensOut: 180),
Payloads = new[] { new Payload("response", Content: "The policy provides that…") },
});
ledger.Flush();
Record ne lève jamais d'exception dans l'application hôte — les échecs sont dirigés vers ledger.OnError à la place. Trigger, Payload, Retrieval, ContextRef, et Usage sont tous des records C#, donc ils sont immuables et prennent en charge les expressions with.
Définissez RecordInput.ParentRef (et HasParentRef = true) pour citer le span à l'origine de cet événement — omettez les deux pour vous rabattre sur l'attribution ambiante/par défaut.
Flush() livre les événements en tampon et peut être appelé sans risque sur une minuterie ou avant l'arrêt. La livraison se fait au moins une fois (at-least-once) — le serveur déduplique par identifiant de span.