import type { AssistantMessage, StopReason, Usage } from "@mariozechner/pi-ai"; export type StreamModelDescriptor = { api: string; provider: string; id: string; }; export function buildZeroUsage(): Usage { return { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }, }; } export function buildUsageWithNoCost(params: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number; totalTokens?: number; }): Usage { const input = params.input ?? 0; const output = params.output ?? 0; const cacheRead = params.cacheRead ?? 0; const cacheWrite = params.cacheWrite ?? 0; return { input, output, cacheRead, cacheWrite, totalTokens: params.totalTokens ?? input + output, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }, }; } export function buildAssistantMessage(params: { model: StreamModelDescriptor; content: AssistantMessage["content"]; stopReason: StopReason; usage: Usage; timestamp?: number; }): AssistantMessage { return { role: "assistant", content: params.content, stopReason: params.stopReason, api: params.model.api, provider: params.model.provider, model: params.model.id, usage: params.usage, timestamp: params.timestamp ?? Date.now(), }; } export function buildAssistantMessageWithZeroUsage(params: { model: StreamModelDescriptor; content: AssistantMessage["content"]; stopReason: StopReason; timestamp?: number; }): AssistantMessage { return buildAssistantMessage({ model: params.model, content: params.content, stopReason: params.stopReason, usage: buildZeroUsage(), timestamp: params.timestamp, }); } export function buildStreamErrorAssistantMessage(params: { model: StreamModelDescriptor; errorMessage: string; timestamp?: number; }): AssistantMessage & { stopReason: "error"; errorMessage: string } { return { ...buildAssistantMessageWithZeroUsage({ model: params.model, content: [], stopReason: "error", timestamp: params.timestamp, }), stopReason: "error", errorMessage: params.errorMessage, }; }