| package model | |
| import ( | |
| "gorm.io/gorm" | |
| "one-api/common" | |
| ) | |
| type Log struct { | |
| Id int `json:"id"` | |
| UserId int `json:"user_id"` | |
| CreatedAt int64 `json:"created_at" gorm:"bigint;index"` | |
| Type int `json:"type" gorm:"index"` | |
| Content string `json:"content"` | |
| Username string `json:"username" gorm:"index;default:''"` | |
| TokenName string `json:"token_name" gorm:"index;default:''"` | |
| ModelName string `json:"model_name" gorm:"index;default:''"` | |
| Quota int `json:"quota" gorm:"default:0"` | |
| PromptTokens int `json:"prompt_tokens" gorm:"default:0"` | |
| CompletionTokens int `json:"completion_tokens" gorm:"default:0"` | |
| } | |
| const ( | |
| LogTypeUnknown = iota | |
| LogTypeTopup | |
| LogTypeConsume | |
| LogTypeManage | |
| LogTypeSystem | |
| ) | |
| func RecordLog(userId int, logType int, content string) { | |
| if logType == LogTypeConsume && !common.LogConsumeEnabled { | |
| return | |
| } | |
| log := &Log{ | |
| UserId: userId, | |
| Username: GetUsernameById(userId), | |
| CreatedAt: common.GetTimestamp(), | |
| Type: logType, | |
| Content: content, | |
| } | |
| err := DB.Create(log).Error | |
| if err != nil { | |
| common.SysError("failed to record log: " + err.Error()) | |
| } | |
| } | |
| func RecordConsumeLog(userId int, promptTokens int, completionTokens int, modelName string, tokenName string, quota int, content string) { | |
| if !common.LogConsumeEnabled { | |
| return | |
| } | |
| log := &Log{ | |
| UserId: userId, | |
| Username: GetUsernameById(userId), | |
| CreatedAt: common.GetTimestamp(), | |
| Type: LogTypeConsume, | |
| Content: content, | |
| PromptTokens: promptTokens, | |
| CompletionTokens: completionTokens, | |
| TokenName: tokenName, | |
| ModelName: modelName, | |
| Quota: quota, | |
| } | |
| err := DB.Create(log).Error | |
| if err != nil { | |
| common.SysError("failed to record log: " + err.Error()) | |
| } | |
| } | |
| func GetAllLogs(logType int, startTimestamp int64, endTimestamp int64, modelName string, username string, tokenName string, startIdx int, num int) (logs []*Log, err error) { | |
| var tx *gorm.DB | |
| if logType == LogTypeUnknown { | |
| tx = DB | |
| } else { | |
| tx = DB.Where("type = ?", logType) | |
| } | |
| if modelName != "" { | |
| tx = tx.Where("model_name = ?", modelName) | |
| } | |
| if username != "" { | |
| tx = tx.Where("username = ?", username) | |
| } | |
| if tokenName != "" { | |
| tx = tx.Where("token_name = ?", tokenName) | |
| } | |
| if startTimestamp != 0 { | |
| tx = tx.Where("created_at >= ?", startTimestamp) | |
| } | |
| if endTimestamp != 0 { | |
| tx = tx.Where("created_at <= ?", endTimestamp) | |
| } | |
| err = tx.Order("id desc").Limit(num).Offset(startIdx).Find(&logs).Error | |
| return logs, err | |
| } | |
| func GetUserLogs(userId int, logType int, startTimestamp int64, endTimestamp int64, modelName string, tokenName string, startIdx int, num int) (logs []*Log, err error) { | |
| var tx *gorm.DB | |
| if logType == LogTypeUnknown { | |
| tx = DB.Where("user_id = ?", userId) | |
| } else { | |
| tx = DB.Where("user_id = ? and type = ?", userId, logType) | |
| } | |
| if modelName != "" { | |
| tx = tx.Where("model_name = ?", modelName) | |
| } | |
| if tokenName != "" { | |
| tx = tx.Where("token_name = ?", tokenName) | |
| } | |
| if startTimestamp != 0 { | |
| tx = tx.Where("created_at >= ?", startTimestamp) | |
| } | |
| if endTimestamp != 0 { | |
| tx = tx.Where("created_at <= ?", endTimestamp) | |
| } | |
| err = tx.Order("id desc").Limit(num).Offset(startIdx).Omit("id").Find(&logs).Error | |
| return logs, err | |
| } | |
| func SearchAllLogs(keyword string) (logs []*Log, err error) { | |
| err = DB.Where("type = ? or content LIKE ?", keyword, keyword+"%").Order("id desc").Limit(common.MaxRecentItems).Find(&logs).Error | |
| return logs, err | |
| } | |
| func SearchUserLogs(userId int, keyword string) (logs []*Log, err error) { | |
| err = DB.Where("user_id = ? and type = ?", userId, keyword).Order("id desc").Limit(common.MaxRecentItems).Omit("id").Find(&logs).Error | |
| return logs, err | |
| } | |
| func SumUsedQuota(logType int, startTimestamp int64, endTimestamp int64, modelName string, username string, tokenName string) (quota int) { | |
| tx := DB.Table("logs").Select("sum(quota)") | |
| if username != "" { | |
| tx = tx.Where("username = ?", username) | |
| } | |
| if tokenName != "" { | |
| tx = tx.Where("token_name = ?", tokenName) | |
| } | |
| if startTimestamp != 0 { | |
| tx = tx.Where("created_at >= ?", startTimestamp) | |
| } | |
| if endTimestamp != 0 { | |
| tx = tx.Where("created_at <= ?", endTimestamp) | |
| } | |
| if modelName != "" { | |
| tx = tx.Where("model_name = ?", modelName) | |
| } | |
| tx.Where("type = ?", LogTypeConsume).Scan("a) | |
| return quota | |
| } | |
| func SumUsedToken(logType int, startTimestamp int64, endTimestamp int64, modelName string, username string, tokenName string) (token int) { | |
| tx := DB.Table("logs").Select("sum(prompt_tokens) + sum(completion_tokens)") | |
| if username != "" { | |
| tx = tx.Where("username = ?", username) | |
| } | |
| if tokenName != "" { | |
| tx = tx.Where("token_name = ?", tokenName) | |
| } | |
| if startTimestamp != 0 { | |
| tx = tx.Where("created_at >= ?", startTimestamp) | |
| } | |
| if endTimestamp != 0 { | |
| tx = tx.Where("created_at <= ?", endTimestamp) | |
| } | |
| if modelName != "" { | |
| tx = tx.Where("model_name = ?", modelName) | |
| } | |
| tx.Where("type = ?", LogTypeConsume).Scan(&token) | |
| return token | |
| } | |