Das C#-SDK (sdk/csharp/Ledger.Sdk) deckt die manuelle Record-API ab. OTel-instrumentierte .NET-Apps sollten stattdessen ihren bestehenden Exporter auf den OTLP-Receiver des Ledgers richten (/v1/otlp/v1/traces), statt hier nach einem Span-Prozessor zu suchen.
Noch nicht auf NuGet veröffentlicht. Referenzieren Sie das Projekt vorerst direkt:
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 wirft nie eine Exception in die Host-Anwendung — Fehler gehen stattdessen an ledger.OnError. Trigger, Payload, Retrieval, ContextRef und Usage sind alle C#-Records, also unveränderlich und unterstützen with-Ausdrücke.
Setzen Sie RecordInput.ParentRef (und HasParentRef = true), um auf die Span zu verweisen, die dieses Event verursacht hat — lassen Sie beides weg, um auf die ambiente/Standard-Zuordnung zurückzufallen.
Flush() liefert gepufferte Events aus und kann gefahrlos per Timer oder vor dem Herunterfahren aufgerufen werden. Die Zustellung erfolgt at-least-once — der Server dedupliziert nach Span-ID.