import type { ObjectManager } from "./object-manager.js"; export type LlmCallRow = Record; export interface LlmRecorder { record(call: LlmCallRow): Promise; } export declare class NullRecorder implements LlmRecorder { record(_call: LlmCallRow): Promise; } export interface LlmCallDbRecorderOpts { /** Called when om.create throws. Default: swallow. Telemetry never breaks the app. */ onError?: (error: unknown) => void; } export declare class LlmCallDbRecorder implements LlmRecorder { private readonly om; private readonly entityName; private readonly onError; constructor(om: ObjectManager, entityName: string, opts?: LlmCallDbRecorderOpts); record(call: LlmCallRow): Promise; } export interface LlmCallInput { spanId: string; traceId: string; /** Parent span id; null/absent → this is a root span. */ parentSpanId?: string; /** Logical session/conversation id (gen_ai session grouping). */ sessionId?: string; callType: string; /** gen_ai.system — provider name, caller-supplied. */ system?: string; /** ISO 8601 timestamp, supplied by the caller before the LLM call was made. */ startedAt: string; llmRequest: unknown; /** Raw response text/body — stored as the raw `llmResponse` column. */ llmResponseText: string; requestModel?: string; /** gen_ai.response.model — the model the provider actually used. */ responseModel?: string; inputTokens?: number; outputTokens?: number; costMinor?: number; latencyMs?: number; finishReason?: string; /** Call outcome, caller-supplied (provider/parse failure → "error"). */ status: "ok" | "error"; /** Failure detail (null on success). */ errorDetail: string | null; } export interface RecordLlmCallOptions { recorder: LlmRecorder; /** Optional scrub/cap applied immediately before persist (PII/secrets). */ redact?: (row: LlmCallRow) => LlmCallRow; } export interface RecordLlmCallResult { status: "ok" | "error"; errorDetail: string | null; } /** Build the base trace row (envelope + raw llmRequest/llmResponse) — key set * is exactly LlmCallBase's fields. Typed voRequest/voResponse are added by the * generated typed helper, never here. */ export declare function buildLlmCallRow(input: LlmCallInput): LlmCallRow; /** Shared persist step: redact then record. Used by recordLlmCall AND (later) the * generated typed helper, so redaction applies on both paths. */ export declare function persistLlmCallRow(recorder: LlmRecorder, row: LlmCallRow, opts?: { redact?: (row: LlmCallRow) => LlmCallRow; }): Promise; /** Cap the raw `llmRequest`/`llmResponse` string columns to `maxChars`. * Adopters compose this into a `redact` to bound trace-row size. Only the two * raw string columns are touched; all other fields pass through unchanged. */ export declare function truncateRow(row: LlmCallRow, maxChars: number): LlmCallRow; /** Persist one base trace row (envelope + raw I/O). Generic — does not extract. */ export declare function recordLlmCall(input: LlmCallInput, opts: RecordLlmCallOptions): Promise; //# sourceMappingURL=llm-recorder.d.ts.map