コンテンツにスキップ

Reporting & Audit

Velaは実行前の認可だけでなく、実行後の監査も前提にしています。Vela-managed relay endpointを呼ぶ場合、relayが completed / failed、usage、Vela Creditsのpost-charge settlementを記録します。アプリは同じrelay execution sessionを二重reportしません。

recordExecutionResult() と report helpers は、アプリがVela-managed relayを使わず、自前の実行backendを呼ぶ app-owned execution path のためのものです。

declare const client: import("@vel4ai/sdk").VelaClient;
declare const usage: {
inputTokens: number;
outputTokens: number;
totalTokens: number;
estimatedCostUsd: number;
};
export async function reportCompleted() {
await client.recordExecutionResult({
appId: "app_1",
customerTenantId: "customer_1",
delegationId: "delegation_1",
requestedModel: "openai/gpt-4o-mini",
resolvedExecutionTarget: "openai/gpt-4o-mini",
status: "completed",
usageSummary: usage,
});
}
import { createOpenAiCompatibleUsageReportInput } from "@vel4ai/sdk";
declare const appOwnedExecution: import("@vel4ai/sdk").PreparedExecutionAllowed;
declare const providerBody: { usage?: unknown };
export async function reportOpenAiCompatibleResult() {
await appOwnedExecution.reportCompletedWithUsage(
createOpenAiCompatibleUsageReportInput(providerBody.usage),
);
}
declare const client: import("@vel4ai/sdk").VelaClient;
export async function reportFailure(error: unknown) {
await client.recordExecutionResult({
appId: "app_1",
customerTenantId: "customer_1",
delegationId: "delegation_1",
requestedModel: "openai/gpt-4o-mini",
resolvedExecutionTarget: "openai/gpt-4o-mini",
status: "failed",
errorMessage: error instanceof Error ? error.message : "Model execution failed.",
});
}

streaming route ではreporterを共有する

Section titled “streaming route ではreporterを共有する”

成功callbackと失敗callbackの両方が同じapp-owned実行に対して発火し得る場合、boolean flagを手書きせず createResultReporter() を使います。tryReport...() はreport APIの失敗をthrowせず、成功したmodel responseや元のprovider errorを上書きしません。

declare const appOwnedExecution: import("@vel4ai/sdk").PreparedExecutionAllowed;
export const reporter = appOwnedExecution.createResultReporter({
onReportError(error) {
console.error("Vela audit report failed", error);
},
});
export async function onFinish() {
await reporter.tryReportCompletedWithUsage({
inputTokens: 10,
outputTokens: 20,
});
}
export async function onError(error: unknown) {
await reporter.tryReportFailedWithError(error);
}