( data: CreateMessageRequestData )
| 205 | * 创建消息请求记录 |
| 206 | */ |
| 207 | export async function createMessageRequest( |
| 208 | data: CreateMessageRequestData |
| 209 | ): Promise<MessageRequest> { |
| 210 | const formattedCost = formatCostForStorage(data.cost_usd); |
| 211 | const dbData = { |
| 212 | providerId: data.provider_id, |
| 213 | userId: data.user_id, |
| 214 | key: data.key, |
| 215 | model: data.model, |
| 216 | originalModel: data.original_model, // 原始模型(重定向前,用于计费和前端显示) |
| 217 | durationMs: data.duration_ms, |
| 218 | costUsd: formattedCost ?? undefined, |
| 219 | costMultiplier: data.cost_multiplier?.toString() ?? undefined, // 供应商倍率(转为字符串) |
| 220 | groupCostMultiplier: data.group_cost_multiplier?.toString() ?? undefined, // 分组倍率(转为字符串) |
| 221 | sessionId: data.session_id, // Session ID |
| 222 | requestSequence: data.request_sequence, // Request Sequence(Session 内请求序号) |
| 223 | userAgent: data.user_agent, // User-Agent |
| 224 | clientIp: data.client_ip, // 客户端 IP(IPv4/IPv6) |
| 225 | endpoint: data.endpoint, // 请求端点(可为空) |
| 226 | messagesCount: data.messages_count, // Messages 数量 |
| 227 | specialSettings: data.special_settings ?? undefined, // 特殊设置(审计/展示) |
| 228 | cacheTtlApplied: data.cache_ttl_applied, |
| 229 | cacheCreationInputTokens: data.cache_creation_input_tokens, |
| 230 | cacheCreation5mInputTokens: data.cache_creation_5m_input_tokens, |
| 231 | cacheCreation1hInputTokens: data.cache_creation_1h_input_tokens, |
| 232 | cacheReadInputTokens: data.cache_read_input_tokens, |
| 233 | }; |
| 234 | |
| 235 | const [result] = await db.insert(messageRequest).values(dbData).returning({ |
| 236 | id: messageRequest.id, |
| 237 | providerId: messageRequest.providerId, |
| 238 | userId: messageRequest.userId, |
| 239 | key: messageRequest.key, |
| 240 | model: messageRequest.model, |
| 241 | originalModel: messageRequest.originalModel, // 原始模型(重定向前) |
| 242 | durationMs: messageRequest.durationMs, |
| 243 | costUsd: messageRequest.costUsd, |
| 244 | costMultiplier: messageRequest.costMultiplier, // 新增 |
| 245 | sessionId: messageRequest.sessionId, // 新增 |
| 246 | requestSequence: messageRequest.requestSequence, // Request Sequence |
| 247 | userAgent: messageRequest.userAgent, // 新增 |
| 248 | clientIp: messageRequest.clientIp, // 客户端 IP |
| 249 | endpoint: messageRequest.endpoint, // 新增:返回端点 |
| 250 | messagesCount: messageRequest.messagesCount, // 新增 |
| 251 | cacheTtlApplied: messageRequest.cacheTtlApplied, |
| 252 | cacheCreationInputTokens: messageRequest.cacheCreationInputTokens, |
| 253 | cacheCreation5mInputTokens: messageRequest.cacheCreation5mInputTokens, |
| 254 | cacheCreation1hInputTokens: messageRequest.cacheCreation1hInputTokens, |
| 255 | cacheReadInputTokens: messageRequest.cacheReadInputTokens, |
| 256 | specialSettings: messageRequest.specialSettings, |
| 257 | createdAt: messageRequest.createdAt, |
| 258 | updatedAt: messageRequest.updatedAt, |
| 259 | deletedAt: messageRequest.deletedAt, |
| 260 | }); |
| 261 | |
| 262 | rememberPublicStatusRequestSeed(result.id, { |
| 263 | createdAt: result.createdAt!, |
| 264 | model: result.model, |
no test coverage detected