iconsulting/packages/services/conversation-service/src/domain/entities/token-usage.entity.ts

77 lines
1.9 KiB
TypeScript

import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
Index,
} from 'typeorm';
/**
* Token 使用统计实体
* 记录每次 Claude API 调用的 token 消耗
*/
@Entity('token_usages')
@Index('idx_token_usages_user', ['userId'])
@Index('idx_token_usages_conversation', ['conversationId'])
@Index('idx_token_usages_created', ['createdAt'])
@Index('idx_token_usages_model', ['model'])
export class TokenUsageEntity {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column({ name: 'user_id', type: 'uuid', nullable: true })
userId: string | null;
@Column({ name: 'conversation_id', type: 'uuid' })
conversationId: string;
@Column({ name: 'message_id', type: 'uuid', nullable: true })
messageId: string | null;
@Column({ length: 50 })
model: string;
// 输入 tokens
@Column({ name: 'input_tokens', default: 0 })
inputTokens: number;
// 输出 tokens
@Column({ name: 'output_tokens', default: 0 })
outputTokens: number;
// 缓存创建的 tokens (Prompt Caching)
@Column({ name: 'cache_creation_tokens', default: 0 })
cacheCreationTokens: number;
// 缓存命中的 tokens (Prompt Caching)
@Column({ name: 'cache_read_tokens', default: 0 })
cacheReadTokens: number;
// 总 tokens (input + output)
@Column({ name: 'total_tokens', default: 0 })
totalTokens: number;
// 估算成本 (美元)
@Column({ name: 'estimated_cost', type: 'decimal', precision: 10, scale: 6, default: 0 })
estimatedCost: number;
// 意图类型
@Column({ name: 'intent_type', type: 'varchar', length: 30, nullable: true })
intentType: string | null;
// 工具调用次数
@Column({ name: 'tool_calls', default: 0 })
toolCalls: number;
// 响应长度(字符数)
@Column({ name: 'response_length', default: 0 })
responseLength: number;
// 请求耗时(毫秒)
@Column({ name: 'latency_ms', default: 0 })
latencyMs: number;
@CreateDateColumn({ name: 'created_at' })
createdAt: Date;
}