🎨 优化模型配置 && 新增apikey功能 && 完善通用接口
This commit is contained in:
107
server/service/app/ai_api_key.go
Normal file
107
server/service/app/ai_api_key.go
Normal file
@@ -0,0 +1,107 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"git.echol.cn/loser/ai_proxy/server/global"
|
||||
"git.echol.cn/loser/ai_proxy/server/model/app"
|
||||
"git.echol.cn/loser/ai_proxy/server/model/common/request"
|
||||
)
|
||||
|
||||
type AiApiKeyService struct{}
|
||||
|
||||
// GenerateApiKey 生成API密钥
|
||||
func (s *AiApiKeyService) GenerateApiKey() string {
|
||||
bytes := make([]byte, 32)
|
||||
rand.Read(bytes)
|
||||
return "sk-" + hex.EncodeToString(bytes)
|
||||
}
|
||||
|
||||
// CreateAiApiKey 创建API密钥
|
||||
func (s *AiApiKeyService) CreateAiApiKey(apiKey *app.AiApiKey) error {
|
||||
if apiKey.Key == "" {
|
||||
apiKey.Key = s.GenerateApiKey()
|
||||
}
|
||||
return global.GVA_DB.Create(apiKey).Error
|
||||
}
|
||||
|
||||
// DeleteAiApiKey 删除API密钥
|
||||
func (s *AiApiKeyService) DeleteAiApiKey(id uint, userID uint) error {
|
||||
return global.GVA_DB.Where("id = ? AND user_id = ?", id, userID).Delete(&app.AiApiKey{}).Error
|
||||
}
|
||||
|
||||
// UpdateAiApiKey 更新API密钥
|
||||
func (s *AiApiKeyService) UpdateAiApiKey(apiKey *app.AiApiKey, userID uint) error {
|
||||
return global.GVA_DB.Where("user_id = ?", userID).Updates(apiKey).Error
|
||||
}
|
||||
|
||||
// GetAiApiKey 查询API密钥
|
||||
func (s *AiApiKeyService) GetAiApiKey(id uint, userID uint) (apiKey app.AiApiKey, err error) {
|
||||
err = global.GVA_DB.Where("id = ? AND user_id = ?", id, userID).First(&apiKey).Error
|
||||
return
|
||||
}
|
||||
|
||||
// GetAiApiKeyList 获取API密钥列表
|
||||
func (s *AiApiKeyService) GetAiApiKeyList(info request.PageInfo, userID uint) (list []app.AiApiKey, total int64, err error) {
|
||||
limit := info.PageSize
|
||||
offset := info.PageSize * (info.Page - 1)
|
||||
db := global.GVA_DB.Model(&app.AiApiKey{}).Where("user_id = ?", userID)
|
||||
err = db.Count(&total).Error
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
err = db.Limit(limit).Offset(offset).Order("id desc").Find(&list).Error
|
||||
return
|
||||
}
|
||||
|
||||
// ValidateApiKey 验证API密钥
|
||||
func (s *AiApiKeyService) ValidateApiKey(key string) (*app.AiApiKey, error) {
|
||||
var apiKey app.AiApiKey
|
||||
if err := global.GVA_DB.Where("key = ? AND enabled = ?", key, true).First(&apiKey).Error; err != nil {
|
||||
return nil, fmt.Errorf("无效的API密钥")
|
||||
}
|
||||
|
||||
// 检查是否过期
|
||||
if apiKey.ExpiresAt != nil && time.Now().Unix() > *apiKey.ExpiresAt {
|
||||
return nil, fmt.Errorf("API密钥已过期")
|
||||
}
|
||||
|
||||
return &apiKey, nil
|
||||
}
|
||||
|
||||
// CheckModelPermission 检查模型权限
|
||||
func (s *AiApiKeyService) CheckModelPermission(apiKey *app.AiApiKey, model string) bool {
|
||||
// 如果没有限制,允许所有模型
|
||||
if len(apiKey.AllowedModels) == 0 {
|
||||
return true
|
||||
}
|
||||
|
||||
// 检查模型是否在允许列表中
|
||||
for _, allowedModel := range apiKey.AllowedModels {
|
||||
if allowedModel == model || allowedModel == "*" {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// CheckPresetPermission 检查预设权限
|
||||
func (s *AiApiKeyService) CheckPresetPermission(apiKey *app.AiApiKey, presetName string) bool {
|
||||
// 如果没有限制,允许所有预设
|
||||
if len(apiKey.AllowedPresets) == 0 {
|
||||
return true
|
||||
}
|
||||
|
||||
// 检查预设是否在允许列表中
|
||||
for _, allowedPreset := range apiKey.AllowedPresets {
|
||||
if allowedPreset == presetName || allowedPreset == "*" {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
Reference in New Issue
Block a user