mirror of
https://github.com/eolinker/apinto
synced 2025-09-26 21:01:19 +08:00
278 lines
5.8 KiB
Go
278 lines
5.8 KiB
Go
package ai_convert
|
|
|
|
import (
|
|
"sort"
|
|
"time"
|
|
|
|
"github.com/eolinker/eosc"
|
|
"github.com/eolinker/eosc/common/bean"
|
|
)
|
|
|
|
var _ IManager = (*Manager)(nil)
|
|
|
|
var (
|
|
manager = NewManager()
|
|
)
|
|
|
|
func init() {
|
|
bean.Injection(&manager)
|
|
bean.Injection(&modelAcManager)
|
|
}
|
|
|
|
type IManager interface {
|
|
Get(id string) (IConverterCreateFunc, bool)
|
|
Set(id string, driver IConverterCreateFunc)
|
|
Del(id string)
|
|
}
|
|
|
|
type Manager struct {
|
|
createFns eosc.Untyped[string, IConverterCreateFunc]
|
|
}
|
|
|
|
func (m *Manager) Del(id string) {
|
|
m.createFns.Del(id)
|
|
}
|
|
|
|
func (m *Manager) Get(id string) (IConverterCreateFunc, bool) {
|
|
return m.createFns.Get(id)
|
|
}
|
|
|
|
func (m *Manager) Set(id string, driver IConverterCreateFunc) {
|
|
m.createFns.Set(id, driver)
|
|
}
|
|
|
|
func NewManager() IManager {
|
|
return &Manager{createFns: eosc.BuildUntyped[string, IConverterCreateFunc]()}
|
|
}
|
|
|
|
func RegisterConverterCreateFunc(id string, fn IConverterCreateFunc) {
|
|
manager.Set(id, fn)
|
|
}
|
|
|
|
func GetConverterCreateFunc(id string) (IConverterCreateFunc, bool) {
|
|
return manager.Get(id)
|
|
}
|
|
|
|
var (
|
|
keyPoolManager = NewKeyPoolManager()
|
|
)
|
|
|
|
type KeyPoolManager struct {
|
|
keys eosc.Untyped[string, KeyPool]
|
|
keySorts eosc.Untyped[string, []IKeyResource]
|
|
}
|
|
|
|
func NewKeyPoolManager() *KeyPoolManager {
|
|
return &KeyPoolManager{
|
|
keys: eosc.BuildUntyped[string, KeyPool](),
|
|
keySorts: eosc.BuildUntyped[string, []IKeyResource](),
|
|
}
|
|
}
|
|
|
|
type KeyPool eosc.Untyped[string, IKeyResource]
|
|
|
|
func (m *KeyPoolManager) KeyResources(id string) ([]IKeyResource, bool) {
|
|
return m.keySorts.Get(id)
|
|
}
|
|
|
|
func (m *KeyPoolManager) Set(id string, resource IKeyResource) {
|
|
keyPools, has := m.keys.Get(id)
|
|
if !has {
|
|
keyPools = eosc.BuildUntyped[string, IKeyResource]()
|
|
m.keys.Set(id, keyPools)
|
|
}
|
|
keyPools.Set(resource.ID(), resource)
|
|
keys := keyPools.List()
|
|
sort.Slice(keys, func(i, j int) bool {
|
|
return keys[i].Priority() < keys[j].Priority()
|
|
})
|
|
|
|
m.keySorts.Set(id, keys)
|
|
}
|
|
|
|
func (m *KeyPoolManager) DelKeySource(id, resourceId string) {
|
|
keyPool, has := m.keys.Get(id)
|
|
if !has {
|
|
return
|
|
}
|
|
keyPool.Del(resourceId)
|
|
keys := keyPool.List()
|
|
sort.Slice(keys, func(i, j int) bool {
|
|
return keys[i].Priority() > keys[j].Priority()
|
|
})
|
|
m.keySorts.Set(id, keys)
|
|
}
|
|
|
|
func (m *KeyPoolManager) Del(id string) {
|
|
m.keys.Del(id)
|
|
m.keySorts.Del(id)
|
|
}
|
|
|
|
func (m *KeyPoolManager) doLoop() {
|
|
ticket := time.NewTicker(20 * time.Second)
|
|
defer ticket.Stop()
|
|
for {
|
|
select {
|
|
case <-ticket.C:
|
|
for _, keyPool := range m.keys.List() {
|
|
for _, key := range keyPool.List() {
|
|
if key.IsBreaker() {
|
|
key.Up()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func SetKeyResource(provider string, resource IKeyResource) {
|
|
keyPoolManager.Set(provider, resource)
|
|
}
|
|
|
|
func KeyResources(provider string) ([]IKeyResource, bool) {
|
|
return keyPoolManager.KeyResources(provider)
|
|
}
|
|
|
|
func DelKeyResource(provider string, resourceId string) {
|
|
keyPoolManager.DelKeySource(provider, resourceId)
|
|
}
|
|
|
|
func DelProvider(id string) {
|
|
provider := balanceManager.Del(id)
|
|
if provider != "" {
|
|
keyPoolManager.Del(provider)
|
|
}
|
|
|
|
}
|
|
|
|
var (
|
|
balanceManager = NewBalanceManager()
|
|
)
|
|
|
|
type BalanceManager struct {
|
|
providers eosc.Untyped[string, IProvider]
|
|
ids eosc.Untyped[string, eosc.Untyped[string, IProvider]]
|
|
balances eosc.Untyped[string, IProvider]
|
|
balanceSort []IProvider
|
|
}
|
|
|
|
func NewBalanceManager() *BalanceManager {
|
|
return &BalanceManager{
|
|
providers: eosc.BuildUntyped[string, IProvider](),
|
|
balances: eosc.BuildUntyped[string, IProvider](),
|
|
ids: eosc.BuildUntyped[string, eosc.Untyped[string, IProvider]](),
|
|
}
|
|
}
|
|
|
|
func (m *BalanceManager) SetProvider(id string, p IProvider) {
|
|
if p.Priority() < 1 {
|
|
m.providers.Set(p.Provider(), p)
|
|
}
|
|
|
|
m.balances.Set(id, p)
|
|
tmp, has := m.ids.Get(p.Provider())
|
|
if !has {
|
|
tmp = eosc.BuildUntyped[string, IProvider]()
|
|
}
|
|
tmp.Set(id, p)
|
|
m.ids.Set(p.Provider(), tmp)
|
|
m.sortBalances()
|
|
}
|
|
|
|
func (m *BalanceManager) Get(provider string) (IProvider, bool) {
|
|
return m.providers.Get(provider)
|
|
}
|
|
|
|
func (m *BalanceManager) sortBalances() {
|
|
balances := m.balances.List()
|
|
tmpBalances := make([]IProvider, 0, len(balances))
|
|
for _, b := range balances {
|
|
if b.Priority() == 0 {
|
|
continue
|
|
}
|
|
tmpBalances = append(tmpBalances, b)
|
|
}
|
|
sort.Slice(tmpBalances, func(i, j int) bool {
|
|
return tmpBalances[i].Priority() < tmpBalances[j].Priority()
|
|
})
|
|
m.balanceSort = tmpBalances
|
|
}
|
|
|
|
func (m *BalanceManager) Del(id string) string {
|
|
p, ok := m.balances.Del(id)
|
|
if !ok {
|
|
return ""
|
|
}
|
|
if p.Priority() == 0 {
|
|
// 供应商本身
|
|
m.providers.Del(p.Provider())
|
|
m.ids.Del(p.Provider())
|
|
m.sortBalances()
|
|
return p.Provider()
|
|
}
|
|
tmp, has := m.ids.Get(p.Provider())
|
|
if !has {
|
|
return ""
|
|
}
|
|
tmp.Del(id)
|
|
m.sortBalances()
|
|
if tmp.Count() < 1 {
|
|
m.providers.Del(p.Provider())
|
|
return p.Provider()
|
|
}
|
|
|
|
return ""
|
|
}
|
|
|
|
func (m *BalanceManager) Balances() []IProvider {
|
|
return m.balanceSort
|
|
}
|
|
|
|
func Balances() []IProvider {
|
|
return balanceManager.Balances()
|
|
}
|
|
|
|
func SetProvider(id string, p IProvider) {
|
|
balanceManager.SetProvider(id, p)
|
|
}
|
|
|
|
func GetProvider(provider string) (IProvider, bool) {
|
|
return balanceManager.Get(provider)
|
|
}
|
|
|
|
type IModelAccessConfigManager interface {
|
|
Get(id string) (IModelAccessConfig, bool)
|
|
Set(id string, config IModelAccessConfig)
|
|
Del(id string)
|
|
}
|
|
|
|
type IModelAccessConfig interface {
|
|
Provider() string
|
|
Model() string
|
|
Config() map[string]string
|
|
}
|
|
|
|
type modelAccessConfigManager struct {
|
|
configs eosc.Untyped[string, IModelAccessConfig]
|
|
}
|
|
|
|
func (m *modelAccessConfigManager) Get(id string) (IModelAccessConfig, bool) {
|
|
return m.configs.Get(id)
|
|
}
|
|
|
|
func (m *modelAccessConfigManager) Set(id string, config IModelAccessConfig) {
|
|
m.configs.Set(id, config)
|
|
}
|
|
|
|
func (m *modelAccessConfigManager) Del(id string) {
|
|
m.configs.Del(id)
|
|
}
|
|
|
|
func NewModelAccessConfigManager() IModelAccessConfigManager {
|
|
return &modelAccessConfigManager{
|
|
configs: eosc.BuildUntyped[string, IModelAccessConfig](),
|
|
}
|
|
}
|
|
|
|
var modelAcManager = NewModelAccessConfigManager()
|