File size: 2,235 Bytes
e249c6d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | import { getRuntimeConfig } from "../../config/io.js";
import { isDiagnosticsEnabled, emitTrustedDiagnosticEvent } from "../../infra/diagnostic-events.js";
import { estimateAggregateUsageCost } from "../../utils/usage-format.js";
import { hasBillableUsage, toDiagnosticUsage, type NormalizedUsage } from "../usage.js";
import type { AgentCommandIngressOpts } from "./types.js";
type AgentCommandResult = {
meta?: {
agentMeta?: {
provider?: string;
model?: string;
sessionId?: string;
usage?: NormalizedUsage;
diagnosticUsage?: NormalizedUsage;
lastCallUsage?: NormalizedUsage;
contextTokens?: number;
promptTokens?: number;
};
durationMs?: number;
};
};
/** Resolve the channel label for model.usage diagnostics from ingress run options. */
function ingressDiagnosticChannel(opts: AgentCommandIngressOpts): string {
return opts.runContext?.messageChannel ?? opts.messageChannel ?? opts.channel ?? "http";
}
/** Emit the ingress-only model usage diagnostic after a completed agent run. */
export function emitIngressModelUsageDiagnostic(
result: AgentCommandResult,
opts: AgentCommandIngressOpts,
agentDir: string,
): void {
const cfg = getRuntimeConfig();
if (!isDiagnosticsEnabled(cfg)) {
return;
}
const agentMeta = result.meta?.agentMeta;
const usage = agentMeta?.diagnosticUsage ?? agentMeta?.usage;
if (!agentMeta || !hasBillableUsage(usage)) {
return;
}
const providerUsed = agentMeta.provider ?? "";
const modelUsed = agentMeta.model ?? "";
const costUsd = estimateAggregateUsageCost({
usage,
provider: providerUsed,
model: modelUsed,
config: cfg,
agentDir,
});
emitTrustedDiagnosticEvent({
type: "model.usage",
sessionKey: opts.sessionKey,
sessionId: agentMeta.sessionId,
channel: ingressDiagnosticChannel(opts),
agentId: opts.agentId,
provider: providerUsed,
model: modelUsed,
usage: toDiagnosticUsage(usage),
lastCallUsage: agentMeta.lastCallUsage,
context: {
limit: agentMeta.contextTokens,
...(agentMeta.promptTokens !== undefined ? { used: agentMeta.promptTokens } : {}),
},
costUsd,
durationMs: result.meta?.durationMs,
});
}
|