2023-04-22 20:39:27 +08:00
package model
import (
2023-06-16 16:02:00 +08:00
"gorm.io/gorm"
2023-04-23 18:24:11 +08:00
"one-api/common"
2023-04-22 20:39:27 +08:00
)
2023-04-22 21:41:16 +08:00
type Channel struct {
2023-05-21 16:09:54 +08:00
Id int ` json:"id" `
Type int ` json:"type" gorm:"default:0" `
2023-06-22 21:19:43 +08:00
Key string ` json:"key" gorm:"not null;index" `
2023-09-15 17:59:01 +08:00
OpenAIOrganization * string ` json:"openai_organization" `
2023-05-21 16:09:54 +08:00
Status int ` json:"status" gorm:"default:1" `
Name string ` json:"name" gorm:"index" `
2023-09-29 18:13:57 +08:00
Weight * uint ` json:"weight" gorm:"default:0" `
2023-05-21 16:09:54 +08:00
CreatedTime int64 ` json:"created_time" gorm:"bigint" `
TestTime int64 ` json:"test_time" gorm:"bigint" `
ResponseTime int ` json:"response_time" ` // in milliseconds
2023-09-18 22:49:05 +08:00
BaseURL * string ` json:"base_url" gorm:"column:base_url;default:''" `
2023-05-21 16:09:54 +08:00
Other string ` json:"other" `
Balance float64 ` json:"balance" ` // in USD
BalanceUpdatedTime int64 ` json:"balance_updated_time" gorm:"bigint" `
2023-06-07 23:26:00 +08:00
Models string ` json:"models" `
Group string ` json:"group" gorm:"type:varchar(32);default:'default'" `
2023-06-16 16:02:00 +08:00
UsedQuota int64 ` json:"used_quota" gorm:"bigint;default:0" `
2023-09-18 22:07:17 +08:00
ModelMapping * string ` json:"model_mapping" gorm:"type:varchar(1024);default:''" `
2023-09-18 21:43:45 +08:00
Priority * int64 ` json:"priority" gorm:"bigint;default:0" `
2023-09-25 18:44:10 +08:00
AutoBan * int ` json:"auto_ban" gorm:"default:1" `
2023-04-22 20:39:27 +08:00
}
2023-12-05 18:15:40 +08:00
func GetAllChannels ( startIdx int , num int , selectAll bool , idSort bool ) ( [ ] * Channel , error ) {
2023-04-22 22:02:59 +08:00
var channels [ ] * Channel
2023-04-22 20:39:27 +08:00
var err error
2023-12-05 18:15:40 +08:00
order := "priority desc"
if idSort {
order = "id desc"
}
2023-05-15 12:36:55 +08:00
if selectAll {
2023-12-05 18:15:40 +08:00
err = DB . Order ( order ) . Find ( & channels ) . Error
2023-05-15 12:36:55 +08:00
} else {
2023-12-05 18:15:40 +08:00
err = DB . Order ( order ) . Limit ( num ) . Offset ( startIdx ) . Omit ( "key" ) . Find ( & channels ) . Error
2023-05-15 12:36:55 +08:00
}
2023-04-22 22:02:59 +08:00
return channels , err
2023-04-22 20:39:27 +08:00
}
2023-12-05 18:15:40 +08:00
func SearchChannels ( keyword string , group string ) ( channels [ ] * Channel , err error ) {
2023-10-22 18:38:29 +08:00
keyCol := "`key`"
if common . UsingPostgreSQL {
keyCol = ` "key" `
}
2023-12-05 18:15:40 +08:00
if group != "" {
groupCol := "`group`"
if common . UsingPostgreSQL {
groupCol = ` "group" `
}
err = DB . Omit ( "key" ) . Where ( "(id = ? or name LIKE ? or " + keyCol + " = ?) and " + groupCol + " LIKE ?" , common . String2Int ( keyword ) , keyword + "%" , keyword , "%" + group + "%" ) . Find ( & channels ) . Error
} else {
err = DB . Omit ( "key" ) . Where ( "id = ? or name LIKE ? or " + keyCol + " = ?" , common . String2Int ( keyword ) , keyword + "%" , keyword ) . Find ( & channels ) . Error
}
2023-04-22 22:02:59 +08:00
return channels , err
2023-04-22 20:39:27 +08:00
}
2023-04-23 18:24:11 +08:00
func GetChannelById ( id int , selectAll bool ) ( * Channel , error ) {
2023-04-22 22:02:59 +08:00
channel := Channel { Id : id }
var err error = nil
2023-04-23 18:24:11 +08:00
if selectAll {
err = DB . First ( & channel , "id = ?" , id ) . Error
} else {
err = DB . Omit ( "key" ) . First ( & channel , "id = ?" , id ) . Error
}
return & channel , err
2023-04-22 22:02:59 +08:00
}
2023-05-13 17:08:13 +08:00
func BatchInsertChannels ( channels [ ] Channel ) error {
var err error
err = DB . Create ( & channels ) . Error
2023-06-07 23:26:00 +08:00
if err != nil {
return err
}
for _ , channel_ := range channels {
err = channel_ . AddAbilities ( )
if err != nil {
return err
}
}
return nil
2023-05-13 17:08:13 +08:00
}
2023-12-14 16:35:03 +08:00
func BatchDeleteChannels ( ids [ ] int ) error {
//使用事务 删除channel表和channel_ability表
tx := DB . Begin ( )
err := tx . Where ( "id in (?)" , ids ) . Delete ( & Channel { } ) . Error
if err != nil {
// 回滚事务
tx . Rollback ( )
return err
}
err = tx . Where ( "channel_id in (?)" , ids ) . Delete ( & Ability { } ) . Error
if err != nil {
// 回滚事务
tx . Rollback ( )
}
// 提交事务
tx . Commit ( )
return err
}
2023-09-18 21:43:45 +08:00
func ( channel * Channel ) GetPriority ( ) int64 {
2023-09-18 22:07:17 +08:00
if channel . Priority == nil {
2023-09-18 21:43:45 +08:00
return 0
}
return * channel . Priority
}
2023-09-18 22:07:17 +08:00
func ( channel * Channel ) GetBaseURL ( ) string {
if channel . BaseURL == nil {
return ""
}
return * channel . BaseURL
}
func ( channel * Channel ) GetModelMapping ( ) string {
if channel . ModelMapping == nil {
return ""
}
return * channel . ModelMapping
}
2023-04-22 22:02:59 +08:00
func ( channel * Channel ) Insert ( ) error {
2023-04-22 20:39:27 +08:00
var err error
2023-04-22 22:02:59 +08:00
err = DB . Create ( channel ) . Error
2023-06-07 23:26:00 +08:00
if err != nil {
return err
}
err = channel . AddAbilities ( )
2023-04-22 20:39:27 +08:00
return err
}
2023-04-22 22:02:59 +08:00
func ( channel * Channel ) Update ( ) error {
2023-04-22 20:39:27 +08:00
var err error
2023-04-22 22:02:59 +08:00
err = DB . Model ( channel ) . Updates ( channel ) . Error
2023-06-07 23:26:00 +08:00
if err != nil {
return err
}
2023-06-08 09:26:54 +08:00
DB . Model ( channel ) . First ( channel , "id = ?" , channel . Id )
2023-06-07 23:26:00 +08:00
err = channel . UpdateAbilities ( )
2023-04-22 20:39:27 +08:00
return err
}
2023-05-15 11:35:38 +08:00
func ( channel * Channel ) UpdateResponseTime ( responseTime int64 ) {
err := DB . Model ( channel ) . Select ( "response_time" , "test_time" ) . Updates ( Channel {
TestTime : common . GetTimestamp ( ) ,
ResponseTime : int ( responseTime ) ,
} ) . Error
if err != nil {
common . SysError ( "failed to update response time: " + err . Error ( ) )
}
}
2023-05-21 16:09:54 +08:00
func ( channel * Channel ) UpdateBalance ( balance float64 ) {
err := DB . Model ( channel ) . Select ( "balance_updated_time" , "balance" ) . Updates ( Channel {
BalanceUpdatedTime : common . GetTimestamp ( ) ,
Balance : balance ,
} ) . Error
if err != nil {
common . SysError ( "failed to update balance: " + err . Error ( ) )
}
}
2023-04-22 22:02:59 +08:00
func ( channel * Channel ) Delete ( ) error {
var err error
err = DB . Delete ( channel ) . Error
2023-06-07 23:26:00 +08:00
if err != nil {
return err
}
err = channel . DeleteAbilities ( )
2023-04-22 22:02:59 +08:00
return err
2023-04-22 20:39:27 +08:00
}
2023-05-15 17:34:09 +08:00
func UpdateChannelStatusById ( id int , status int ) {
2023-06-07 23:26:00 +08:00
err := UpdateAbilityStatus ( id , status == common . ChannelStatusEnabled )
if err != nil {
common . SysError ( "failed to update ability status: " + err . Error ( ) )
}
err = DB . Model ( & Channel { } ) . Where ( "id = ?" , id ) . Update ( "status" , status ) . Error
2023-05-15 17:34:09 +08:00
if err != nil {
common . SysError ( "failed to update channel status: " + err . Error ( ) )
}
}
2023-06-16 16:02:00 +08:00
func UpdateChannelUsedQuota ( id int , quota int ) {
2023-09-03 14:58:20 +08:00
if common . BatchUpdateEnabled {
addNewRecord ( BatchUpdateTypeChannelUsedQuota , id , quota )
return
}
updateChannelUsedQuota ( id , quota )
}
func updateChannelUsedQuota ( id int , quota int ) {
2023-08-13 00:51:48 +08:00
err := DB . Model ( & Channel { } ) . Where ( "id = ?" , id ) . Update ( "used_quota" , gorm . Expr ( "used_quota + ?" , quota ) ) . Error
2023-06-16 16:02:00 +08:00
if err != nil {
common . SysError ( "failed to update channel used quota: " + err . Error ( ) )
}
}
2023-10-02 13:06:27 +08:00
func DeleteChannelByStatus ( status int64 ) ( int64 , error ) {
result := DB . Where ( "status = ?" , status ) . Delete ( & Channel { } )
return result . RowsAffected , result . Error
}
2023-10-14 17:25:48 +08:00
func DeleteDisabledChannel ( ) ( int64 , error ) {
result := DB . Where ( "status = ? or status = ?" , common . ChannelStatusAutoDisabled , common . ChannelStatusManuallyDisabled ) . Delete ( & Channel { } )
return result . RowsAffected , result . Error
}