Anthropic API 的 cache_creation 对象区分了 ephemeral_5m 和 ephemeral_1h 两种缓存创建 token,1h 单价远高于 5m(如 claude-3-5-haiku: 5m=$1/MTok, 1h=$6/MTok)。此前系统统一按 5m 单价计费,导致计费偏低。 后端: - pricing_service: 加载 LiteLLM 的 cache_creation_input_token_cost_above_1hr - billing_service: GetModelPricing 启用分类计费(安全守卫 1h>5m), CalculateCost 按 5m/1h 分别计费,无明细时回退到 5m 单价 - gateway_service: parseSSEUsage/handleNonStreamingResponse 用 gjson 提取嵌套 cache_creation 对象的 ephemeral_5m/1h_input_tokens - antigravity_gateway_service: extractSSEUsage/extractClaudeUsage 同步提取 - usage_log: 修复 GORM column tag 确保写入正确的数据库列 - 新增迁移 054: 删除 GORM 自动生成的重复列 前端: - 使用记录 tooltip 展示 5m/1h 缓存创建明细(带彩色 badge 区分) - 表格单元格缓存写入数值旁显示 1h 标识
65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
package service
|
||
|
||
import "time"
|
||
|
||
const (
|
||
BillingTypeBalance int8 = 0 // 钱包余额
|
||
BillingTypeSubscription int8 = 1 // 订阅套餐
|
||
)
|
||
|
||
type UsageLog struct {
|
||
ID int64
|
||
UserID int64
|
||
APIKeyID int64
|
||
AccountID int64
|
||
RequestID string
|
||
Model string
|
||
// ReasoningEffort is the request's reasoning effort level (OpenAI Responses API),
|
||
// e.g. "low" / "medium" / "high" / "xhigh". Nil means not provided / not applicable.
|
||
ReasoningEffort *string
|
||
|
||
GroupID *int64
|
||
SubscriptionID *int64
|
||
|
||
InputTokens int
|
||
OutputTokens int
|
||
CacheCreationTokens int
|
||
CacheReadTokens int
|
||
|
||
CacheCreation5mTokens int `gorm:"column:cache_creation_5m_tokens"`
|
||
CacheCreation1hTokens int `gorm:"column:cache_creation_1h_tokens"`
|
||
|
||
InputCost float64
|
||
OutputCost float64
|
||
CacheCreationCost float64
|
||
CacheReadCost float64
|
||
TotalCost float64
|
||
ActualCost float64
|
||
RateMultiplier float64
|
||
// AccountRateMultiplier 账号计费倍率快照(nil 表示历史数据,按 1.0 处理)
|
||
AccountRateMultiplier *float64
|
||
|
||
BillingType int8
|
||
Stream bool
|
||
DurationMs *int
|
||
FirstTokenMs *int
|
||
UserAgent *string
|
||
IPAddress *string
|
||
|
||
// 图片生成字段
|
||
ImageCount int
|
||
ImageSize *string
|
||
|
||
CreatedAt time.Time
|
||
|
||
User *User
|
||
APIKey *APIKey
|
||
Account *Account
|
||
Group *Group
|
||
Subscription *UserSubscription
|
||
}
|
||
|
||
func (u *UsageLog) TotalTokens() int {
|
||
return u.InputTokens + u.OutputTokens + u.CacheCreationTokens + u.CacheReadTokens
|
||
}
|