import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, Index, Unique, } from 'typeorm'; export type UsageType = 'chat' | 'completion' | 'embedding' | 'image'; @Entity({ name: 'usage_logs', schema: 'ai' }) export class AIUsageLog { @PrimaryGeneratedColumn('uuid') id: string; @Index() @Column({ name: 'tenant_id', type: 'uuid' }) tenantId: string; @Column({ name: 'user_id', type: 'uuid', nullable: true }) userId: string; @Index() @Column({ name: 'model_id', type: 'uuid', nullable: true }) modelId: string; @Column({ name: 'model_name', type: 'varchar', length: 100, nullable: true }) modelName: string; @Column({ name: 'provider', type: 'varchar', length: 50, nullable: true }) provider: string; @Column({ name: 'usage_type', type: 'varchar', length: 30 }) usageType: UsageType; @Column({ name: 'prompt_tokens', type: 'int', default: 0 }) promptTokens: number; @Column({ name: 'completion_tokens', type: 'int', default: 0 }) completionTokens: number; @Column({ name: 'total_tokens', type: 'int', default: 0 }) totalTokens: number; @Column({ name: 'cost', type: 'decimal', precision: 10, scale: 6, default: 0 }) cost: number; @Column({ name: 'conversation_id', type: 'uuid', nullable: true }) conversationId: string; @Column({ name: 'completion_id', type: 'uuid', nullable: true }) completionId: string; @Column({ name: 'request_id', type: 'varchar', length: 255, nullable: true }) requestId: string; @Index() @Column({ name: 'usage_date', type: 'date', default: () => 'CURRENT_DATE' }) usageDate: Date; @Index() @Column({ name: 'usage_month', type: 'varchar', length: 7, nullable: true }) usageMonth: string; @CreateDateColumn({ name: 'created_at', type: 'timestamptz' }) createdAt: Date; } @Entity({ name: 'tenant_quotas', schema: 'ai' }) @Unique(['tenantId', 'quotaMonth']) export class AITenantQuota { @PrimaryGeneratedColumn('uuid') id: string; @Index() @Column({ name: 'tenant_id', type: 'uuid' }) tenantId: string; @Column({ name: 'monthly_token_limit', type: 'int', nullable: true }) monthlyTokenLimit: number; @Column({ name: 'monthly_request_limit', type: 'int', nullable: true }) monthlyRequestLimit: number; @Column({ name: 'monthly_cost_limit', type: 'decimal', precision: 10, scale: 2, nullable: true }) monthlyCostLimit: number; @Column({ name: 'current_tokens', type: 'int', default: 0 }) currentTokens: number; @Column({ name: 'current_requests', type: 'int', default: 0 }) currentRequests: number; @Column({ name: 'current_cost', type: 'decimal', precision: 10, scale: 4, default: 0 }) currentCost: number; @Index() @Column({ name: 'quota_month', type: 'varchar', length: 7 }) quotaMonth: string; @Column({ name: 'is_exceeded', type: 'boolean', default: false }) isExceeded: boolean; @Column({ name: 'exceeded_at', type: 'timestamptz', nullable: true }) exceededAt: Date; @Column({ name: 'alert_threshold_percent', type: 'int', default: 80 }) alertThresholdPercent: number; @Column({ name: 'alert_sent_at', type: 'timestamptz', nullable: true }) alertSentAt: Date; @CreateDateColumn({ name: 'created_at', type: 'timestamptz' }) createdAt: Date; @UpdateDateColumn({ name: 'updated_at', type: 'timestamptz' }) updatedAt: Date; }