diff --git a/apps/worker/src/processors/scans.ts b/apps/worker/src/processors/scans.ts index fba4a6b..a2c697f 100644 --- a/apps/worker/src/processors/scans.ts +++ b/apps/worker/src/processors/scans.ts @@ -82,6 +82,19 @@ export async function processScanJob(ctx: WorkerContext, scanJobId: string): Pro await recordScanCompleted(ctx, job, result); + // Logga token-telemetri för Gemini (best-effort, får aldrig faila scan-vägen). + try { + await ctx.db.insert(schema.geminiUsage).values({ + taskType: job.jobType, + promptTokens: result.inputTokens ?? null, + outputTokens: result.outputTokens ?? null, + totalTokens: result.totalTokens ?? null, + costMicrocents: result.costUsd != null ? Math.round(result.costUsd * 100_000_000) : null, + }); + } catch (err) { + console.error("[scan processor] gemini_usage logging misslyckades:", err); + } + // Shadow-capture: spara träningspar för framtida AAMOS-distillation (FAS 1). // Kör aldrig synkront på användarens kritiska väg; fel swallås. if (result.status === "ok" && result.output != null) { diff --git a/infrastructure/migrations/0027_abandoned_secret_warriors.sql b/infrastructure/migrations/0027_abandoned_secret_warriors.sql new file mode 100644 index 0000000..4554867 --- /dev/null +++ b/infrastructure/migrations/0027_abandoned_secret_warriors.sql @@ -0,0 +1,3 @@ +ALTER TABLE "gemini_usage" ALTER COLUMN "prompt_tokens" DROP NOT NULL;--> statement-breakpoint +ALTER TABLE "gemini_usage" ALTER COLUMN "output_tokens" DROP NOT NULL;--> statement-breakpoint +ALTER TABLE "gemini_usage" ALTER COLUMN "total_tokens" DROP NOT NULL; \ No newline at end of file diff --git a/packages/database/src/schema/gemini-usage.ts b/packages/database/src/schema/gemini-usage.ts index b243718..3df9f82 100644 --- a/packages/database/src/schema/gemini-usage.ts +++ b/packages/database/src/schema/gemini-usage.ts @@ -9,8 +9,8 @@ export const geminiUsage = pgTable("gemini_usage", { id: uuid("id").primaryKey().defaultRandom(), createdAt: createdAt(), taskType: text("task_type").notNull(), - promptTokens: integer("prompt_tokens").notNull(), - outputTokens: integer("output_tokens").notNull(), - totalTokens: integer("total_tokens").notNull(), + promptTokens: integer("prompt_tokens"), + outputTokens: integer("output_tokens"), + totalTokens: integer("total_tokens"), costMicrocents: bigint("cost_microcents", { mode: "number" }), });