model

package
v0.1.7 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 11, 2025 License: MIT Imports: 38 Imported by: 0

Documentation

Index

Constants

View Source
const (
	SyncFrequency    = time.Minute * 3
	TokenCacheKey    = "token:%s"
	GroupCacheKey    = "group:%s"
	GroupModelTPMKey = "group:%s:model_tpm"
)
View Source
const (
	ChannelStatusUnknown  = 0
	ChannelStatusEnabled  = 1
	ChannelStatusDisabled = 2
)
View Source
const (
	GroupStatusEnabled  = 1
	GroupStatusDisabled = 2
	GroupStatusInternal = 3
)
View Source
const (
	TokenStatusEnabled  = 1
	TokenStatusDisabled = 2
)
View Source
const (
	ChannelDefaultSet = "default"
)
View Source
const (
	DefaultPriority = 10
)
View Source
const (
	ErrChannelNotFound = "channel"
)
View Source
const (
	ErrGroupNotFound = "group"
)
View Source
const ErrModelConfigNotFound = "model config"
View Source
const (
	ErrTokenNotFound = "token"
)
View Source
const (
	GroupModelConfigCacheKey = "group_model_config"
)
View Source
const (
	// /1K tokens
	PriceUnit = 1000
)

Variables

View Source
var (
	DB    *gorm.DB
	LogDB *gorm.DB
)
View Source
var ErrUnknownOptionKey = errors.New("unknown option key")

Functions

func BatchInsertChannels

func BatchInsertChannels(channels []*Channel) (err error)

func BatchRecordConsume

func BatchRecordConsume(
	requestID string,
	requestAt time.Time,
	retryAt time.Time,
	firstByteAt time.Time,
	group string,
	code int,
	channelID int,
	modelName string,
	tokenID int,
	tokenName string,
	endpoint string,
	content string,
	mode int,
	ip string,
	retryTimes int,
	requestDetail *RequestDetail,
	downstreamResult bool,
	usage Usage,
	modelPrice Price,
	amount float64,
) error

func CacheDeleteGroup

func CacheDeleteGroup(id string) error

func CacheDeleteToken

func CacheDeleteToken(key string) error

func CacheGetGroupModelTPM

func CacheGetGroupModelTPM(group string, model string) (int64, error)

func CacheSetGroup

func CacheSetGroup(group *GroupCache) error

func CacheSetToken

func CacheSetToken(token *TokenCache) error

func CacheUpdateGroupRPMRatio

func CacheUpdateGroupRPMRatio(id string, rpmRatio float64) error

func CacheUpdateGroupStatus

func CacheUpdateGroupStatus(id string, status int) error

func CacheUpdateGroupTPMRatio

func CacheUpdateGroupTPMRatio(id string, tpmRatio float64) error

func CacheUpdateGroupUsedAmountOnlyIncrease

func CacheUpdateGroupUsedAmountOnlyIncrease(id string, amount float64) error

func CacheUpdateTokenName

func CacheUpdateTokenName(key string, name string) error

func CacheUpdateTokenStatus

func CacheUpdateTokenStatus(key string, status int) error

func CacheUpdateTokenUsedAmountOnlyIncrease

func CacheUpdateTokenUsedAmountOnlyIncrease(key string, amount float64) error

func CheckModelConfigExist

func CheckModelConfigExist(models []string) error

func CleanLog

func CleanLog(batchSize int, optimize bool) error

func ClearLastTestErrorAt

func ClearLastTestErrorAt(id int) error

func CloseDB

func CloseDB() error

func CreateConsumeError

func CreateConsumeError(requestID string, requestAt time.Time, group string, tokenName string, model string, content string, usedAmount float64, tokenID int) error

func CreateGroup

func CreateGroup(group *Group) error

func CreateGroupSummaryIndexs added in v0.1.6

func CreateGroupSummaryIndexs(db *gorm.DB) error

func CreateLogIndexes

func CreateLogIndexes(db *gorm.DB) error

func CreateSummaryIndexs added in v0.1.6

func CreateSummaryIndexs(db *gorm.DB) error

func DeleteChannelByID

func DeleteChannelByID(id int) (err error)

func DeleteChannelsByIDs

func DeleteChannelsByIDs(ids []int) (err error)

func DeleteGroupByID

func DeleteGroupByID(id string) (err error)

func DeleteGroupLogs

func DeleteGroupLogs(groupID string) (int64, error)

func DeleteGroupModelConfig added in v0.1.5

func DeleteGroupModelConfig(groupID, model string) error

func DeleteGroupModelConfigs added in v0.1.5

func DeleteGroupModelConfigs(groupID string, models []string) error

func DeleteGroupTokenByID

func DeleteGroupTokenByID(groupID string, id int) (err error)

func DeleteGroupTokensByIDs

func DeleteGroupTokensByIDs(group string, ids []int) (err error)

func DeleteGroupsByIDs

func DeleteGroupsByIDs(ids []string) (err error)

func DeleteModelConfig

func DeleteModelConfig(model string) error

func DeleteModelConfigsByModels

func DeleteModelConfigsByModels(models []string) error

func DeleteOldLog

func DeleteOldLog(timestamp time.Time) (int64, error)

func DeleteTokenByID

func DeleteTokenByID(id int) (err error)

func DeleteTokensByIDs

func DeleteTokensByIDs(ids []int) (err error)

func GetGroupLastRequestTime

func GetGroupLastRequestTime(group string) (time.Time, error)

func GetGroupModelTPM

func GetGroupModelTPM(group string, model string) (int64, error)

func GetGroupTokenLastRequestTime added in v0.1.6

func GetGroupTokenLastRequestTime(group string, token string) (time.Time, error)

func GetIPGroups added in v0.1.5

func GetIPGroups(threshold int, start, end time.Time) (map[string][]string, error)

func GetModelConfigBool

func GetModelConfigBool(config map[ModelConfigKey]any, key ModelConfigKey) (bool, bool)

func GetModelConfigFloat

func GetModelConfigFloat(config map[ModelConfigKey]any, key ModelConfigKey) (float64, bool)

func GetModelConfigInt

func GetModelConfigInt(config map[ModelConfigKey]any, key ModelConfigKey) (int, bool)

func GetModelConfigStringSlice

func GetModelConfigStringSlice(config map[ModelConfigKey]any, key ModelConfigKey) ([]string, bool)

func GetModelConfigUint

func GetModelConfigUint(config map[ModelConfigKey]any, key ModelConfigKey) (uint64, bool)

func GetModelConfigWithModels

func GetModelConfigWithModels(models []string) ([]string, []string, error)

func GetRPM added in v0.1.6

func GetRPM(group string, end time.Time, tokenName, modelName string, channelID int) (int64, error)

func GetTPM added in v0.1.6

func GetTPM(group string, end time.Time, tokenName, modelName string, channelID int) (int64, error)

func GetUsedChannels added in v0.1.5

func GetUsedChannels(group string, start, end time.Time) ([]int, error)

func GetUsedChannelsFromLog added in v0.1.6

func GetUsedChannelsFromLog(group string, start, end time.Time) ([]int, error)

func GetUsedModels

func GetUsedModels(group string, start, end time.Time) ([]string, error)

func GetUsedModelsFromLog added in v0.1.6

func GetUsedModelsFromLog(group string, start, end time.Time) ([]string, error)

func GetUsedTokenNames

func GetUsedTokenNames(group string, start, end time.Time) ([]string, error)

func GetUsedTokenNamesFromLog added in v0.1.6

func GetUsedTokenNamesFromLog(group string, start, end time.Time) ([]string, error)

func HandleNotFound

func HandleNotFound(err error, errMsg ...string) error

func HandleUpdateResult

func HandleUpdateResult(result *gorm.DB, entityName string) error

Helper function to handle update results

func IgnoreNotFound

func IgnoreNotFound(err error) error

func InitDB

func InitDB()

func InitLogDB

func InitLogDB()

func InitModelConfigAndChannelCache

func InitModelConfigAndChannelCache() error

InitModelConfigAndChannelCache initializes the channel cache from database

func InitOption2DB

func InitOption2DB() error

func InsertToken

func InsertToken(token *Token, autoCreateGroup bool) error

func NewModelConfig

func NewModelConfig(opts ...ModelConfigOption) map[ModelConfigKey]any

func NotFoundError

func NotFoundError(errMsg ...string) error

func OnConflictDoNothing

func OnConflictDoNothing() *gorm.DB

func OpenMySQL

func OpenMySQL(dsn string) (*gorm.DB, error)

func OpenPostgreSQL

func OpenPostgreSQL(dsn string) (*gorm.DB, error)

func OpenSQLite

func OpenSQLite(sqlitePath string) (*gorm.DB, error)

func ProcessBatchUpdatesSummary added in v0.1.6

func ProcessBatchUpdatesSummary()

func RecordConsumeLog

func RecordConsumeLog(
	requestID string,
	requestAt time.Time,
	retryAt time.Time,
	firstByteAt time.Time,
	group string,
	code int,
	channelID int,
	modelName string,
	tokenID int,
	tokenName string,
	endpoint string,
	content string,
	mode int,
	ip string,
	retryTimes int,
	requestDetail *RequestDetail,
	downstreamResult bool,
	usage Usage,
	modelPrice Price,
	amount float64,
) error

func SaveGroupModelConfig added in v0.1.5

func SaveGroupModelConfig(groupModelConfig GroupModelConfig) (err error)

func SaveGroupModelConfigs added in v0.1.5

func SaveGroupModelConfigs(groupID string, groupModelConfigs []GroupModelConfig) (err error)

func SaveModelConfig

func SaveModelConfig(config *ModelConfig) (err error)

func SaveModelConfigs

func SaveModelConfigs(configs []*ModelConfig) (err error)

func SortModelConfigsFunc

func SortModelConfigsFunc(i, j *ModelConfig) int

func StartBatchProcessorSummary added in v0.1.6

func StartBatchProcessorSummary(ctx context.Context, wg *sync.WaitGroup)

func String2Int

func String2Int(keyword string) int

func SyncModelConfigAndChannelCache

func SyncModelConfigAndChannelCache(ctx context.Context, wg *sync.WaitGroup, frequency time.Duration)

func SyncOptions

func SyncOptions(ctx context.Context, wg *sync.WaitGroup, frequency time.Duration)

func UpdateChannel

func UpdateChannel(channel *Channel) (err error)

func UpdateChannelStatusByID

func UpdateChannelStatusByID(id int, status int) error

func UpdateChannelUsedAmount

func UpdateChannelUsedAmount(id int, amount float64, requestCount int) error

func UpdateGroup

func UpdateGroup(id string, group *Group) (err error)

func UpdateGroupModelConfig added in v0.1.5

func UpdateGroupModelConfig(groupModelConfig GroupModelConfig) (err error)

func UpdateGroupModelConfigs added in v0.1.5

func UpdateGroupModelConfigs(groupID string, groupModelConfigs []GroupModelConfig) (err error)

func UpdateGroupRPMRatio

func UpdateGroupRPMRatio(id string, rpmRatio float64) (err error)

func UpdateGroupStatus

func UpdateGroupStatus(id string, status int) (err error)

func UpdateGroupTPMRatio

func UpdateGroupTPMRatio(id string, tpmRatio float64) (err error)

func UpdateGroupToken

func UpdateGroupToken(id int, group string, token *Token) (err error)

func UpdateGroupTokenName

func UpdateGroupTokenName(group string, id int, name string) (err error)

func UpdateGroupTokenStatus

func UpdateGroupTokenStatus(group string, id int, status int) (err error)

func UpdateGroupUsedAmountAndRequestCount

func UpdateGroupUsedAmountAndRequestCount(id string, amount float64, count int) (err error)

func UpdateGroupsStatus added in v0.1.5

func UpdateGroupsStatus(ids []string, status int) (rowsAffected int64, err error)

func UpdateOption

func UpdateOption(key string, value string) error

func UpdateOptions

func UpdateOptions(options map[string]string) error

func UpdateToken

func UpdateToken(id int, token *Token) (err error)

func UpdateTokenName

func UpdateTokenName(id int, name string) (err error)

func UpdateTokenStatus

func UpdateTokenStatus(id int, status int) (err error)

func UpdateTokenUsedAmount

func UpdateTokenUsedAmount(id int, amount float64, requestCount int) (err error)

func UpsertGroupSummary added in v0.1.6

func UpsertGroupSummary(unique GroupSummaryUnique, data SummaryData) error

func UpsertSummary added in v0.1.6

func UpsertSummary(unique SummaryUnique, data SummaryData) error

Types

type BatchUpdateData

type BatchUpdateData struct {
	Groups         map[string]*GroupUpdate
	Tokens         map[int]*TokenUpdate
	Channels       map[int]*ChannelUpdate
	Summaries      map[string]*SummaryUpdate
	GroupSummaries map[string]*GroupSummaryUpdate
	sync.Mutex
}

type Channel

type Channel struct {
	DeletedAt               gorm.DeletedAt    `gorm:"index"`
	CreatedAt               time.Time         `gorm:"index"                              json:"created_at"`
	LastTestErrorAt         time.Time         `json:"last_test_error_at"`
	ChannelTests            []*ChannelTest    `gorm:"foreignKey:ChannelID;references:ID" json:"channel_tests,omitempty"`
	BalanceUpdatedAt        time.Time         `json:"balance_updated_at"`
	ModelMapping            map[string]string `gorm:"serializer:fastjson;type:text"      json:"model_mapping"`
	Key                     string            `gorm:"type:text;index"                    json:"key"`
	Name                    string            `gorm:"index"                              json:"name"`
	BaseURL                 string            `gorm:"index"                              json:"base_url"`
	Models                  []string          `gorm:"serializer:fastjson;type:text"      json:"models"`
	Balance                 float64           `json:"balance"`
	ID                      int               `gorm:"primaryKey"                         json:"id"`
	UsedAmount              float64           `gorm:"index"                              json:"used_amount"`
	RequestCount            int               `gorm:"index"                              json:"request_count"`
	Status                  int               `gorm:"default:1;index"                    json:"status"`
	Type                    int               `gorm:"default:0;index"                    json:"type"`
	Priority                int32             `json:"priority"`
	EnabledAutoBalanceCheck bool              `json:"enabled_auto_balance_check"`
	BalanceThreshold        float64           `json:"balance_threshold"`
	Config                  *ChannelConfig    `gorm:"serializer:fastjson;type:text"      json:"config,omitempty"`
	Sets                    []string          `gorm:"serializer:fastjson;type:text"      json:"sets,omitempty"`
}

func GetAllChannels

func GetAllChannels() (channels []*Channel, err error)

func GetChannelByID

func GetChannelByID(id int) (*Channel, error)

func GetChannels

func GetChannels(page int, perPage int, id int, name string, key string, channelType int, baseURL string, order string) (channels []*Channel, total int64, err error)

func LoadChannelByID

func LoadChannelByID(id int) (*Channel, error)

func LoadChannels

func LoadChannels() ([]*Channel, error)

func LoadDisabledChannels added in v0.1.1

func LoadDisabledChannels() ([]*Channel, error)

func LoadEnabledChannels

func LoadEnabledChannels() ([]*Channel, error)

func SearchChannels

func SearchChannels(keyword string, page int, perPage int, id int, name string, key string, channelType int, baseURL string, order string) (channels []*Channel, total int64, err error)

func (*Channel) BeforeDelete

func (c *Channel) BeforeDelete(tx *gorm.DB) (err error)

func (*Channel) GetBalanceThreshold

func (c *Channel) GetBalanceThreshold() float64

func (*Channel) GetPriority

func (c *Channel) GetPriority() int32

func (*Channel) GetSets added in v0.1.5

func (c *Channel) GetSets() []string

func (*Channel) MarshalJSON

func (c *Channel) MarshalJSON() ([]byte, error)

func (*Channel) UpdateBalance

func (c *Channel) UpdateBalance(balance float64) error

func (*Channel) UpdateModelTest

func (c *Channel) UpdateModelTest(testAt time.Time, model, actualModel string, mode mode.Mode, took float64, success bool, response string, code int) (*ChannelTest, error)

type ChannelConfig

type ChannelConfig struct {
	SplitThink bool `json:"split_think"`
}

type ChannelTest

type ChannelTest struct {
	TestAt      time.Time `json:"test_at"`
	Model       string    `gorm:"primaryKey"   json:"model"`
	ActualModel string    `json:"actual_model"`
	Response    string    `gorm:"type:text"    json:"response"`
	ChannelName string    `json:"channel_name"`
	ChannelType int       `json:"channel_type"`
	ChannelID   int       `gorm:"primaryKey"   json:"channel_id"`
	Took        float64   `json:"took"`
	Success     bool      `json:"success"`
	Mode        mode.Mode `json:"mode"`
	Code        int       `json:"code"`
}

func (*ChannelTest) MarshalJSON

func (ct *ChannelTest) MarshalJSON() ([]byte, error)

type ChannelUpdate

type ChannelUpdate struct {
	Amount decimal.Decimal
	Count  int
}

type ChartData

type ChartData struct {
	Timestamp           int64   `json:"timestamp"`
	RequestCount        int64   `json:"request_count"`
	UsedAmount          float64 `json:"used_amount"`
	InputTokens         int64   `json:"input_tokens,omitempty"`
	OutputTokens        int64   `json:"output_tokens,omitempty"`
	CachedTokens        int64   `json:"cached_tokens,omitempty"`
	CacheCreationTokens int64   `json:"cache_creation_tokens,omitempty"`
	TotalTokens         int64   `json:"total_tokens,omitempty"`
	ExceptionCount      int64   `json:"exception_count"`
	WebSearchCount      int64   `json:"web_search_count,omitempty"`
}

type CodeType

type CodeType string
const (
	CodeTypeAll     CodeType = "all"
	CodeTypeSuccess CodeType = "success"
	CodeTypeError   CodeType = "error"
)

type ConsumeError

type ConsumeError struct {
	RequestAt  time.Time       `gorm:"index;index:idx_consume_error_group_reqat,priority:2" json:"request_at"`
	CreatedAt  time.Time       `json:"created_at"`
	GroupID    string          `gorm:"index;index:idx_consume_error_group_reqat,priority:1" json:"group_id"`
	RequestID  string          `gorm:"index"                                                json:"request_id"`
	TokenName  EmptyNullString `gorm:"not null"                                             json:"token_name"`
	Model      string          `json:"model"`
	Content    string          `gorm:"type:text"                                            json:"content"`
	ID         int             `gorm:"primaryKey"                                           json:"id"`
	UsedAmount float64         `json:"used_amount"`
	TokenID    int             `json:"token_id"`
}

func SearchConsumeError

func SearchConsumeError(keyword string, requestID string, group string, tokenName string, model string, tokenID int, page int, perPage int, order string) ([]*ConsumeError, int64, error)

func (*ConsumeError) MarshalJSON

func (c *ConsumeError) MarshalJSON() ([]byte, error)

type DashboardResponse

type DashboardResponse struct {
	ChartData      []*ChartData `json:"chart_data"`
	TotalCount     int64        `json:"total_count"`
	ExceptionCount int64        `json:"exception_count"`

	RPM int64 `json:"rpm"`
	TPM int64 `json:"tpm"`

	UsedAmount          float64 `json:"used_amount"`
	InputTokens         int64   `json:"input_tokens,omitempty"`
	OutputTokens        int64   `json:"output_tokens,omitempty"`
	TotalTokens         int64   `json:"total_tokens,omitempty"`
	CachedTokens        int64   `json:"cached_tokens,omitempty"`
	CacheCreationTokens int64   `json:"cache_creation_tokens,omitempty"`
	WebSearchCount      int64   `json:"web_search_count,omitempty"`

	Channels []int `json:"channels,omitempty"`
}

func GetDashboardData

func GetDashboardData(
	group string,
	start,
	end time.Time,
	modelName string,
	channelID int,
	timeSpan TimeSpanType,
	resultOnly bool,
	needRPM bool,
	tokenUsage bool,
	fromLog bool,
	timezone *time.Location,
) (*DashboardResponse, error)

type EmptyNullString

type EmptyNullString string

func (*EmptyNullString) Scan

func (ns *EmptyNullString) Scan(value any) error

Scan implements the [Scanner] interface.

func (EmptyNullString) String

func (ns EmptyNullString) String() string

func (EmptyNullString) Value

func (ns EmptyNullString) Value() (driver.Value, error)

Value implements the driver.Valuer interface.

type GetGroupLogsResult

type GetGroupLogsResult struct {
	GetLogsResult
	Models     []string `json:"models"`
	TokenNames []string `json:"token_names"`
}

func GetGroupLogs

func GetGroupLogs(
	group string,
	startTimestamp time.Time,
	endTimestamp time.Time,
	modelName string,
	requestID string,
	tokenID int,
	tokenName string,
	channelID int,
	order string,
	codeType CodeType,
	withBody bool,
	ip string,
	page int,
	perPage int,
	resultOnly bool,
) (*GetGroupLogsResult, error)

func SearchGroupLogs

func SearchGroupLogs(
	group string,
	keyword string,
	requestID string,
	tokenID int,
	tokenName string,
	modelName string,
	startTimestamp time.Time,
	endTimestamp time.Time,
	channelID int,
	order string,
	codeType CodeType,
	withBody bool,
	ip string,
	page int,
	perPage int,
	resultOnly bool,
) (*GetGroupLogsResult, error)

type GetLogsResult

type GetLogsResult struct {
	Logs     []*Log `json:"logs"`
	Total    int64  `json:"total"`
	Channels []int  `json:"channels,omitempty"`
}

func GetLogs

func GetLogs(
	group string,
	startTimestamp time.Time,
	endTimestamp time.Time,
	modelName string,
	requestID string,
	tokenID int,
	tokenName string,
	channelID int,
	order string,
	codeType CodeType,
	withBody bool,
	ip string,
	page int,
	perPage int,
	resultOnly bool,
) (*GetLogsResult, error)

func SearchLogs

func SearchLogs(
	group string,
	keyword string,
	requestID string,
	tokenID int,
	tokenName string,
	modelName string,
	startTimestamp time.Time,
	endTimestamp time.Time,
	channelID int,
	order string,
	codeType CodeType,
	withBody bool,
	ip string,
	page int,
	perPage int,
	resultOnly bool,
) (*GetLogsResult, error)

type Group

type Group struct {
	CreatedAt         time.Time          `json:"created_at"`
	ID                string             `gorm:"primaryKey"                    json:"id"`
	Tokens            []Token            `gorm:"foreignKey:GroupID"            json:"-"`
	GroupModelConfigs []GroupModelConfig `gorm:"foreignKey:GroupID"            json:"-"`
	Status            int                `gorm:"default:1;index"               json:"status"`
	RPMRatio          float64            `gorm:"index"                         json:"rpm_ratio,omitempty"`
	TPMRatio          float64            `gorm:"index"                         json:"tpm_ratio,omitempty"`
	UsedAmount        float64            `gorm:"index"                         json:"used_amount"`
	RequestCount      int                `gorm:"index"                         json:"request_count"`
	AvailableSets     []string           `gorm:"serializer:fastjson;type:text" json:"available_sets,omitempty"`

	BalanceAlertEnabled   bool    `gorm:"default:false" json:"balance_alert_enabled"`
	BalanceAlertThreshold float64 `gorm:"default:0"     json:"balance_alert_threshold"`
}

func GetGroupByID

func GetGroupByID(id string, preloadGroupModelConfigs bool) (*Group, error)

func GetGroups

func GetGroups(page int, perPage int, order string, onlyDisabled bool) (groups []*Group, total int64, err error)

func SearchGroup

func SearchGroup(keyword string, page int, perPage int, order string, status int) (groups []*Group, total int64, err error)

func (*Group) BeforeDelete

func (g *Group) BeforeDelete(tx *gorm.DB) (err error)

func (*Group) ToGroupCache

func (g *Group) ToGroupCache() *GroupCache

type GroupCache

type GroupCache struct {
	ID            string                   `json:"-"              redis:"-"`
	Status        int                      `json:"status"         redis:"st"`
	UsedAmount    float64                  `json:"used_amount"    redis:"ua"`
	RPMRatio      float64                  `json:"rpm_ratio"      redis:"rpm_r"`
	TPMRatio      float64                  `json:"tpm_ratio"      redis:"tpm_r"`
	AvailableSets redisStringSlice         `json:"available_sets" redis:"ass"`
	ModelConfigs  redisGroupModelConfigMap `json:"model_configs"  redis:"mc"`

	BalanceAlertEnabled   bool    `json:"balance_alert_enabled"   redis:"bae"`
	BalanceAlertThreshold float64 `json:"balance_alert_threshold" redis:"bat"`
}

func CacheGetGroup

func CacheGetGroup(id string) (*GroupCache, error)

func (*GroupCache) GetAvailableSets added in v0.1.5

func (g *GroupCache) GetAvailableSets() []string

type GroupDashboardResponse

type GroupDashboardResponse struct {
	DashboardResponse
	Models     []string `json:"models"`
	TokenNames []string `json:"token_names"`
}

func GetGroupDashboardData

func GetGroupDashboardData(
	group string,
	start, end time.Time,
	tokenName string,
	modelName string,
	timeSpan TimeSpanType,
	resultOnly bool,
	needRPM bool,
	tokenUsage bool,
	fromLog bool,
	timezone *time.Location,
) (*GroupDashboardResponse, error)

type GroupModelConfig added in v0.1.5

type GroupModelConfig struct {
	GroupID string `gorm:"primaryKey"         json:"group_id"`
	Group   *Group `gorm:"foreignKey:GroupID" json:"-"`
	Model   string `gorm:"primaryKey"         json:"model"`

	OverrideLimit bool  `json:"override_limit"`
	RPM           int64 `json:"rpm"`
	TPM           int64 `json:"tpm"`

	OverridePrice bool               `json:"override_price"`
	ImagePrices   map[string]float64 `gorm:"serializer:fastjson;type:text" json:"image_prices,omitempty"`
	Price         Price              `gorm:"embedded"                      json:"price,omitempty"`
}

func GetGroupModelConfig added in v0.1.5

func GetGroupModelConfig(groupID, model string) (*GroupModelConfig, error)

func GetGroupModelConfigs added in v0.1.5

func GetGroupModelConfigs(groupID string) ([]GroupModelConfig, error)

type GroupSummary added in v0.1.6

type GroupSummary struct {
	ID     int                `gorm:"primaryKey"`
	Unique GroupSummaryUnique `gorm:"embedded"`
	Data   SummaryData        `gorm:"embedded"`
}

only summary result only requests

func (*GroupSummary) BeforeCreate added in v0.1.6

func (l *GroupSummary) BeforeCreate(_ *gorm.DB) (err error)

type GroupSummaryUnique added in v0.1.6

type GroupSummaryUnique struct {
	GroupID       string `gorm:"not null;uniqueIndex:idx_groupsummary_unique,priority:1"`
	TokenName     string `gorm:"not null;uniqueIndex:idx_groupsummary_unique,priority:2"`
	Model         string `gorm:"not null;uniqueIndex:idx_groupsummary_unique,priority:3"`
	HourTimestamp int64  `gorm:"not null;uniqueIndex:idx_groupsummary_unique,priority:4,sort:desc"`
}

type GroupSummaryUpdate added in v0.1.6

type GroupSummaryUpdate struct {
	GroupSummaryUnique
	SummaryData
}

type GroupUpdate

type GroupUpdate struct {
	Amount decimal.Decimal
	Count  int
}

type Log

type Log struct {
	RequestDetail        *RequestDetail  `gorm:"foreignKey:LogID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;" json:"request_detail,omitempty"`
	RequestAt            time.Time       `json:"request_at"`
	RetryAt              time.Time       `json:"retry_at,omitempty"`
	TTFBMilliseconds     ZeroNullInt64   `json:"ttfb_milliseconds,omitempty"`
	TimestampTruncByHour int64           `json:"timestamp_trunc_by_hour"`
	CreatedAt            time.Time       `gorm:"autoCreateTime;index"                                           json:"created_at"`
	TokenName            string          `json:"token_name,omitempty"`
	Endpoint             EmptyNullString `json:"endpoint,omitempty"`
	Content              EmptyNullString `gorm:"type:text"                                                      json:"content,omitempty"`
	GroupID              string          `json:"group,omitempty"`
	Model                string          `json:"model"`
	RequestID            EmptyNullString `gorm:"index:,where:request_id is not null"                            json:"request_id"`
	ID                   int             `gorm:"primaryKey"                                                     json:"id"`
	TokenID              int             `gorm:"index"                                                          json:"token_id,omitempty"`
	ChannelID            int             `json:"channel,omitempty"`
	Code                 int             `gorm:"index"                                                          json:"code,omitempty"`
	Mode                 int             `json:"mode,omitempty"`
	IP                   EmptyNullString `gorm:"index:,where:ip is not null"                                    json:"ip,omitempty"`
	RetryTimes           ZeroNullInt64   `json:"retry_times,omitempty"`
	DownstreamResult     bool            `json:"downstream_result,omitempty"`
	Price                Price           `gorm:"embedded"                                                       json:"price,omitempty"`
	Usage                Usage           `gorm:"embedded"                                                       json:"usage,omitempty"`
	UsedAmount           float64         `json:"used_amount,omitempty"`
}

func (*Log) BeforeCreate added in v0.1.5

func (l *Log) BeforeCreate(_ *gorm.DB) (err error)

func (*Log) MarshalJSON

func (l *Log) MarshalJSON() ([]byte, error)

type ModelCaches

type ModelCaches struct {
	ModelConfig ModelConfigCache

	EnabledModelsBySet       map[string][]string
	EnabledModelConfigsBySet map[string][]*ModelConfig
	EnabledModelConfigsMap   map[string]*ModelConfig

	EnabledModel2ChannelsBySet  map[string]map[string][]*Channel
	DisabledModel2ChannelsBySet map[string]map[string][]*Channel
}

read-only cache

func LoadModelCaches

func LoadModelCaches() *ModelCaches

type ModelConfig

type ModelConfig struct {
	CreatedAt        time.Time              `gorm:"index;autoCreateTime"          json:"created_at"`
	UpdatedAt        time.Time              `gorm:"index;autoUpdateTime"          json:"updated_at"`
	Config           map[ModelConfigKey]any `gorm:"serializer:fastjson;type:text" json:"config,omitempty"`
	Model            string                 `gorm:"primaryKey"                    json:"model"`
	Owner            ModelOwner             `gorm:"type:varchar(255);index"       json:"owner"`
	Type             mode.Mode              `json:"type"`
	ExcludeFromTests bool                   `json:"exclude_from_tests,omitempty"`
	RPM              int64                  `json:"rpm,omitempty"`
	TPM              int64                  `json:"tpm,omitempty"`
	ImagePrices      map[string]float64     `gorm:"serializer:fastjson;type:text" json:"image_prices,omitempty"`
	Price            Price                  `gorm:"embedded"                      json:"price,omitempty"`
}

func GetAllModelConfigs

func GetAllModelConfigs() (configs []*ModelConfig, err error)

func GetModelConfig

func GetModelConfig(model string) (*ModelConfig, error)

func GetModelConfigs

func GetModelConfigs(page int, perPage int, model string) (configs []*ModelConfig, total int64, err error)

func GetModelConfigsByModels

func GetModelConfigsByModels(models []string) (configs []*ModelConfig, err error)

func NewDefaultModelConfig

func NewDefaultModelConfig(model string) *ModelConfig

func SearchModelConfigs

func SearchModelConfigs(keyword string, page int, perPage int, model string, owner ModelOwner) (configs []*ModelConfig, total int64, err error)

func (*ModelConfig) LoadFromGroupModelConfig added in v0.1.5

func (c *ModelConfig) LoadFromGroupModelConfig(groupModelConfig GroupModelConfig) ModelConfig

func (*ModelConfig) MarshalJSON

func (c *ModelConfig) MarshalJSON() ([]byte, error)

func (*ModelConfig) MaxContextTokens

func (c *ModelConfig) MaxContextTokens() (int, bool)

func (*ModelConfig) MaxInputTokens

func (c *ModelConfig) MaxInputTokens() (int, bool)

func (*ModelConfig) MaxOutputTokens

func (c *ModelConfig) MaxOutputTokens() (int, bool)

func (*ModelConfig) SupportFormats

func (c *ModelConfig) SupportFormats() ([]string, bool)

func (*ModelConfig) SupportToolChoice

func (c *ModelConfig) SupportToolChoice() (bool, bool)

func (*ModelConfig) SupportVision

func (c *ModelConfig) SupportVision() (bool, bool)

func (*ModelConfig) SupportVoices

func (c *ModelConfig) SupportVoices() ([]string, bool)

type ModelConfigCache

type ModelConfigCache interface {
	GetModelConfig(model string) (*ModelConfig, bool)
}

type ModelConfigKey

type ModelConfigKey string
const (
	ModelConfigMaxContextTokensKey ModelConfigKey = "max_context_tokens"
	ModelConfigMaxInputTokensKey   ModelConfigKey = "max_input_tokens"
	ModelConfigMaxOutputTokensKey  ModelConfigKey = "max_output_tokens"
	ModelConfigVisionKey           ModelConfigKey = "vision"
	ModelConfigToolChoiceKey       ModelConfigKey = "tool_choice"
	ModelConfigSupportFormatsKey   ModelConfigKey = "support_formats"
	ModelConfigSupportVoicesKey    ModelConfigKey = "support_voices"
)

type ModelConfigOption

type ModelConfigOption func(config map[ModelConfigKey]any)

func WithModelConfigMaxContextTokens

func WithModelConfigMaxContextTokens(maxContextTokens int) ModelConfigOption

func WithModelConfigMaxInputTokens

func WithModelConfigMaxInputTokens(maxInputTokens int) ModelConfigOption

func WithModelConfigMaxOutputTokens

func WithModelConfigMaxOutputTokens(maxOutputTokens int) ModelConfigOption

func WithModelConfigSupportFormats

func WithModelConfigSupportFormats(supportFormats []string) ModelConfigOption

func WithModelConfigSupportVoices

func WithModelConfigSupportVoices(supportVoices []string) ModelConfigOption

func WithModelConfigToolChoice

func WithModelConfigToolChoice(toolChoice bool) ModelConfigOption

func WithModelConfigVision

func WithModelConfigVision(vision bool) ModelConfigOption

type ModelCostRank

type ModelCostRank struct {
	Model               string  `json:"model"`
	UsedAmount          float64 `json:"used_amount"`
	InputTokens         int64   `json:"input_tokens"`
	OutputTokens        int64   `json:"output_tokens"`
	CachedTokens        int64   `json:"cached_tokens"`
	CacheCreationTokens int64   `json:"cache_creation_tokens"`
	TotalTokens         int64   `json:"total_tokens"`
	RequestCount        int64   `json:"request_count"`
	WebSearchCount      int64   `json:"web_search_count"`
}

func GetModelCostRank

func GetModelCostRank(group string, channelID int, start, end time.Time, tokenUsage bool, fromLog bool) ([]*ModelCostRank, error)

type ModelOwner

type ModelOwner string
const (
	ModelOwnerOpenAI      ModelOwner = "openai"
	ModelOwnerAlibaba     ModelOwner = "alibaba"
	ModelOwnerTencent     ModelOwner = "tencent"
	ModelOwnerXunfei      ModelOwner = "xunfei"
	ModelOwnerDeepSeek    ModelOwner = "deepseek"
	ModelOwnerMoonshot    ModelOwner = "moonshot"
	ModelOwnerMiniMax     ModelOwner = "minimax"
	ModelOwnerBaidu       ModelOwner = "baidu"
	ModelOwnerGoogle      ModelOwner = "google"
	ModelOwnerBAAI        ModelOwner = "baai"
	ModelOwnerFunAudioLLM ModelOwner = "funaudiollm"
	ModelOwnerDoubao      ModelOwner = "doubao"
	ModelOwnerFishAudio   ModelOwner = "fishaudio"
	ModelOwnerChatGLM     ModelOwner = "chatglm"
	ModelOwnerStabilityAI ModelOwner = "stabilityai"
	ModelOwnerNetease     ModelOwner = "netease"
	ModelOwnerAI360       ModelOwner = "ai360"
	ModelOwnerAnthropic   ModelOwner = "anthropic"
	ModelOwnerMeta        ModelOwner = "meta"
	ModelOwnerBaichuan    ModelOwner = "baichuan"
	ModelOwnerMistral     ModelOwner = "mistral"
	ModelOwnerOpenChat    ModelOwner = "openchat"
	ModelOwnerMicrosoft   ModelOwner = "microsoft"
	ModelOwnerDefog       ModelOwner = "defog"
	ModelOwnerNexusFlow   ModelOwner = "nexusflow"
	ModelOwnerCohere      ModelOwner = "cohere"
	ModelOwnerHuggingFace ModelOwner = "huggingface"
	ModelOwnerLingyiWanwu ModelOwner = "lingyiwanwu"
	ModelOwnerStepFun     ModelOwner = "stepfun"
	ModelOwnerXAI         ModelOwner = "xai"
	ModelOwnerDoc2x       ModelOwner = "doc2x"
)

type Option

type Option struct {
	Key   string `gorm:"primaryKey" json:"key"`
	Value string `json:"value"`
}

func GetAllOption

func GetAllOption() ([]*Option, error)

func GetOption

func GetOption(key string) (*Option, error)

type Price added in v0.1.5

type Price struct {
	InputPrice     float64 `json:"input_price,omitempty"`
	InputPriceUnit int64   `json:"input_price_unit,omitempty"`

	OutputPrice     float64 `json:"output_price,omitempty"`
	OutputPriceUnit int64   `json:"output_price_unit,omitempty"`

	CachedPrice     float64 `json:"cached_price,omitempty"`
	CachedPriceUnit int64   `json:"cached_price_unit,omitempty"`

	CacheCreationPrice     float64 `json:"cache_creation_price,omitempty"`
	CacheCreationPriceUnit int64   `json:"cache_creation_price_unit,omitempty"`

	WebSearchPrice     float64 `json:"web_search_price,omitempty"`
	WebSearchPriceUnit int64   `json:"web_search_price_unit,omitempty"`
}

func (*Price) GetCacheCreationPriceUnit added in v0.1.7

func (p *Price) GetCacheCreationPriceUnit() int64

func (*Price) GetCachedPriceUnit added in v0.1.7

func (p *Price) GetCachedPriceUnit() int64

func (*Price) GetInputPriceUnit added in v0.1.7

func (p *Price) GetInputPriceUnit() int64

func (*Price) GetOutputPriceUnit added in v0.1.7

func (p *Price) GetOutputPriceUnit() int64

func (*Price) GetWebSearchPriceUnit added in v0.1.7

func (p *Price) GetWebSearchPriceUnit() int64

type RequestDetail

type RequestDetail struct {
	CreatedAt             time.Time `gorm:"autoCreateTime;index"              json:"-"`
	RequestBody           string    `gorm:"type:text"                         json:"request_body,omitempty"`
	ResponseBody          string    `gorm:"type:text"                         json:"response_body,omitempty"`
	RequestBodyTruncated  bool      `json:"request_body_truncated,omitempty"`
	ResponseBodyTruncated bool      `json:"response_body_truncated,omitempty"`
	ID                    int       `gorm:"primaryKey"                        json:"id"`
	LogID                 int       `gorm:"index"                             json:"log_id"`
}

func GetGroupLogDetail

func GetGroupLogDetail(logID int, group string) (*RequestDetail, error)

func GetLogDetail

func GetLogDetail(logID int) (*RequestDetail, error)

func (*RequestDetail) BeforeSave

func (d *RequestDetail) BeforeSave(_ *gorm.DB) (err error)

type Summary added in v0.1.6

type Summary struct {
	ID     int           `gorm:"primaryKey"`
	Unique SummaryUnique `gorm:"embedded"`
	Data   SummaryData   `gorm:"embedded"`
}

only summary result only requests

func (*Summary) BeforeCreate added in v0.1.6

func (l *Summary) BeforeCreate(_ *gorm.DB) (err error)

type SummaryData added in v0.1.6

type SummaryData struct {
	RequestCount   int64   `json:"request_count"`
	UsedAmount     float64 `json:"used_amount"`
	ExceptionCount int64   `json:"exception_count"`
	Usage          Usage   `gorm:"embedded"        json:"usage,omitempty"`
}

type SummaryUnique added in v0.1.6

type SummaryUnique struct {
	ChannelID     int    `gorm:"not null;uniqueIndex:idx_summary_unique,priority:1"`
	Model         string `gorm:"not null;uniqueIndex:idx_summary_unique,priority:2"`
	HourTimestamp int64  `gorm:"not null;uniqueIndex:idx_summary_unique,priority:3,sort:desc"`
}

type SummaryUpdate added in v0.1.6

type SummaryUpdate struct {
	SummaryUnique
	SummaryData
}

type TimeSpanType

type TimeSpanType string
const (
	TimeSpanDay  TimeSpanType = "day"
	TimeSpanHour TimeSpanType = "hour"
)

type Token

type Token struct {
	CreatedAt    time.Time       `json:"created_at"`
	ExpiredAt    time.Time       `json:"expired_at"`
	Group        *Group          `gorm:"foreignKey:GroupID"                        json:"-"`
	Key          string          `gorm:"type:char(48);uniqueIndex"                 json:"key"`
	Name         EmptyNullString `gorm:"index;uniqueIndex:idx_group_name;not null" json:"name"`
	GroupID      string          `gorm:"index;uniqueIndex:idx_group_name"          json:"group"`
	Subnets      []string        `gorm:"serializer:fastjson;type:text"             json:"subnets"`
	Models       []string        `gorm:"serializer:fastjson;type:text"             json:"models"`
	Status       int             `gorm:"default:1;index"                           json:"status"`
	ID           int             `gorm:"primaryKey"                                json:"id"`
	Quota        float64         `json:"quota"`
	UsedAmount   float64         `gorm:"index"                                     json:"used_amount"`
	RequestCount int             `gorm:"index"                                     json:"request_count"`
}

func GetGroupTokenByID

func GetGroupTokenByID(group string, id int) (*Token, error)

func GetTokenByID

func GetTokenByID(id int) (*Token, error)

func GetTokenByKey

func GetTokenByKey(key string) (*Token, error)

func GetTokens

func GetTokens(group string, page int, perPage int, order string, status int) (tokens []*Token, total int64, err error)

func SearchGroupTokens added in v0.1.5

func SearchGroupTokens(group string, keyword string, page int, perPage int, order string, status int, name string, key string) (tokens []*Token, total int64, err error)

func SearchTokens

func SearchTokens(group string, keyword string, page int, perPage int, order string, status int, name string, key string) (tokens []*Token, total int64, err error)

func (*Token) BeforeCreate added in v0.1.4

func (t *Token) BeforeCreate(_ *gorm.DB) (err error)

func (*Token) ToTokenCache

func (t *Token) ToTokenCache() *TokenCache

type TokenCache

type TokenCache struct {
	ExpiredAt  redisTime        `json:"expired_at"  redis:"e"`
	Group      string           `json:"group"       redis:"g"`
	Key        string           `json:"-"           redis:"-"`
	Name       string           `json:"name"        redis:"n"`
	Subnets    redisStringSlice `json:"subnets"     redis:"s"`
	Models     redisStringSlice `json:"models"      redis:"m"`
	ID         int              `json:"id"          redis:"i"`
	Status     int              `json:"status"      redis:"st"`
	Quota      float64          `json:"quota"       redis:"q"`
	UsedAmount float64          `json:"used_amount" redis:"u"`
	// contains filtered or unexported fields
}

func CacheGetTokenByKey

func CacheGetTokenByKey(key string) (*TokenCache, error)

func ValidateAndGetToken

func ValidateAndGetToken(key string) (token *TokenCache, err error)

func (*TokenCache) ContainsModel added in v0.1.5

func (t *TokenCache) ContainsModel(model string) bool

func (*TokenCache) Range added in v0.1.5

func (t *TokenCache) Range(fn func(model string) bool)

func (*TokenCache) SetAvailableSets added in v0.1.5

func (t *TokenCache) SetAvailableSets(availableSets []string)

func (*TokenCache) SetModelsBySet added in v0.1.5

func (t *TokenCache) SetModelsBySet(modelsBySet map[string][]string)

type TokenUpdate

type TokenUpdate struct {
	Amount decimal.Decimal
	Count  int
}

type Usage added in v0.1.5

type Usage struct {
	InputTokens         int64 `json:"input_tokens,omitempty"`
	OutputTokens        int64 `json:"output_tokens,omitempty"`
	CachedTokens        int64 `json:"cached_tokens,omitempty"`
	CacheCreationTokens int64 `json:"cache_creation_tokens,omitempty"`
	TotalTokens         int64 `json:"total_tokens,omitempty"`
	WebSearchCount      int64 `json:"web_search_count,omitempty"`
}

func (*Usage) Add added in v0.1.6

func (u *Usage) Add(other *Usage)

type ZeroNullInt64 added in v0.1.5

type ZeroNullInt64 int64

func (*ZeroNullInt64) Scan added in v0.1.5

func (zni *ZeroNullInt64) Scan(value any) error

func (ZeroNullInt64) Value added in v0.1.5

func (zni ZeroNullInt64) Value() (driver.Value, error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL