Skip to content
File

Blob: src/worker/lib/ai/logging.ts

typescript53 lines
1import { AiErrorCode, type AiUsage } from "@/shared/ai";
2import type { EntitlementSurface, PageAccessLevel } from "@/shared/entitlements";
3import { createLogger, type Logger } from "@/worker/lib/logger";
4 
5export type AiAction = "rewrite" | "generate" | "summarize" | "ask";
6 
7export interface AiLogContext {
8 action: AiAction;
9 userId?: string;
10 workspaceId: string;
11 pageId: string;
12 surface: EntitlementSurface;
13 pageAccess: PageAccessLevel;
14}
15 
16export interface AiDenialContext {
17 action: AiAction;
18 userId?: string;
19 workspaceId: string;
20 pageId: string;
21 surface: EntitlementSurface;
22 pageAccess: PageAccessLevel;
23}
24 
25const log: Logger = createLogger("ai");
26 
27export function aiLogger(): Logger {
28 return log;
29}
30 
31export function logAiRequest(ctx: AiLogContext): void {
32 log.info("ai_request", { ...ctx });
33}
34 
35export function logAiResponse(
36 ctx: AiLogContext,
37 startedAt: number,
38 outcome: "ok" | "error",
39 extra?: { usage?: AiUsage; errorCode?: AiErrorCode },
40): void {
41 log.info("ai_response", {
42 ...ctx,
43 durationMs: Date.now() - startedAt,
44 outcome,
45 ...(extra?.usage ? { usage: extra.usage } : {}),
46 ...(extra?.errorCode ? { errorCode: extra.errorCode } : {}),
47 });
48}
49 
50export function logAiDenied(ctx: AiDenialContext): void {
51 log.warn("ai_denied", { ...ctx });
52}