Files
kandev/apps/web/components/task/chat/messages/message-debug-metadata.ts
T
2026-06-13 23:38:07 +01:00

87 lines
2.5 KiB
TypeScript

import type { Message, Turn } from "@/lib/types/http";
export type MessageDebugEntries = {
message_id: string;
turn_id: string | null;
type: string;
model: unknown;
usage_multiplier: unknown;
agent_id: unknown;
agent_type: unknown;
prompt_usage: unknown;
message_metadata: Record<string, unknown> | null;
turn_metadata: Record<string, unknown> | null;
};
export type MessageDebugContext = {
usageMultiplier?: string | null;
};
function hasOwnMetadata(metadata: Record<string, unknown> | null | undefined): boolean {
return !!metadata && Object.keys(metadata).length > 0;
}
function firstPresent(...values: unknown[]): unknown {
return values.find((value) => value != null) ?? null;
}
function metadataValue(metadata: Record<string, unknown> | null, key: string): unknown {
if (!metadata) return null;
return metadata[key] ?? null;
}
function resolveTurnID(message: Message, turn: Turn | null | undefined): string | null {
if (message.turn_id) return message.turn_id;
return turn?.id ?? null;
}
export function hasMessageDebugMetadata(
message: Message,
turn?: Turn | null,
context: MessageDebugContext = {},
): boolean {
return (
hasOwnMetadata(message.metadata) ||
hasOwnMetadata(turn?.metadata) ||
context.usageMultiplier != null
);
}
export function buildMessageDebugEntries(
message: Message,
turn?: Turn | null,
context: MessageDebugContext = {},
): MessageDebugEntries {
const messageMetadata = message.metadata ?? null;
const turnMetadata = turn?.metadata ?? null;
return {
message_id: message.id,
turn_id: resolveTurnID(message, turn),
type: message.type,
model: firstPresent(
metadataValue(messageMetadata, "model"),
metadataValue(turnMetadata, "model"),
),
usage_multiplier: firstPresent(
metadataValue(messageMetadata, "usage_multiplier"),
metadataValue(turnMetadata, "usage_multiplier"),
context.usageMultiplier,
),
agent_id: firstPresent(
metadataValue(messageMetadata, "agent_id"),
metadataValue(turnMetadata, "agent_id"),
),
agent_type: firstPresent(
metadataValue(messageMetadata, "agent_type"),
metadataValue(turnMetadata, "agent_type"),
),
// prompt_usage is written to turn metadata by persistTurnPromptMetadata, so turn wins.
prompt_usage: firstPresent(
metadataValue(turnMetadata, "prompt_usage"),
metadataValue(messageMetadata, "prompt_usage"),
),
message_metadata: messageMetadata,
turn_metadata: turnMetadata,
};
}