Skip to content
Events & plans

ai_usage

AI usage log (migration 0038): every Gemini call, for /admin/ai-usage.

Columns

ColumnTypeNullDefaultKeys
iduuid nogen_random_uuid()
PK
created_attimestamp nonow()
purposetext no—
sourcetext yes—
modeltext no—
model_versiontext yes—
statustext
okrefusederror
no—
duration_msinteger no—
input_tokensinteger no0
output_text_tokensinteger no0
output_image_tokensinteger no0
thought_tokensinteger no0
cost_usdnumeric(12, 6) yes—
event_iduuid yes—
flyer_iduuid yes—
dancer_iduuid yes—
errortext yes—

Value lists come from .$type<'a' | 'b'>() in the schema — enforced in TypeScript only, not by the database.

Keys, constraints & indexes

Unique

None besides the primary key.

Indexes

  • (created_at)
    ai_usage_created_idx
  • (purpose)
    ai_usage_purpose_idx

Foreign keys

  • event_id → events.id
    on delete set null
  • flyer_id → event_flyers.id
    on delete set null
  • dancer_id → dancers.id
    on delete set null

Used by

Code that reads or writes this table, found by static analysis of the tRPC routers and API handlers (including helpers they call).

Relations

Rendering diagram…

Diagram source
erDiagram
  ai_usage {
    uuid id PK
    uuid event_id FK
    uuid flyer_id FK
    uuid dancer_id FK
  }
  dancers {
    uuid id PK
    text email UK
    text neon_auth_id UK
    text username UK
  }
  event_flyers {
    uuid id PK
    uuid event_id FK
    uuid post_id FK
    uuid look_id FK
    uuid created_by FK
  }
  events {
    uuid id PK
    uuid host_profile_id FK
    uuid edited_by FK
  }
  events |o--o{ ai_usage : "event_id"
  event_flyers |o--o{ ai_usage : "flyer_id"
  dancers |o--o{ ai_usage : "dancer_id"
  events ||--o{ event_flyers : "event_id"
  dancers |o--o{ event_flyers : "created_by"
  dancers |o--o{ events : "edited_by"

Defined at server/database/schema.ts:1095 as aiUsage.