148 lines
4.6 KiB
Go
148 lines
4.6 KiB
Go
package app
|
||
|
||
import (
|
||
"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/app/request"
|
||
req "git.echol.cn/loser/ai_proxy/server/model/common/request"
|
||
)
|
||
|
||
type AiPresetService struct{}
|
||
|
||
// CreateAiPreset 创建AI预设
|
||
func (s *AiPresetService) CreateAiPreset(userId uint, req *request.CreateAiPresetRequest) (preset app.AiPreset, err error) {
|
||
preset = app.AiPreset{
|
||
UserID: userId,
|
||
Name: req.Name,
|
||
Description: req.Description,
|
||
Prompts: req.Prompts,
|
||
RegexScripts: req.RegexScripts,
|
||
Temperature: req.Temperature,
|
||
TopP: req.TopP,
|
||
MaxTokens: req.MaxTokens,
|
||
FrequencyPenalty: req.FrequencyPenalty,
|
||
PresencePenalty: req.PresencePenalty,
|
||
StreamEnabled: req.StreamEnabled,
|
||
IsDefault: req.IsDefault,
|
||
IsPublic: req.IsPublic,
|
||
}
|
||
err = global.GVA_DB.Create(&preset).Error
|
||
return preset, err
|
||
}
|
||
|
||
// DeleteAiPreset 删除AI预设
|
||
func (s *AiPresetService) DeleteAiPreset(id uint, userId uint) (err error) {
|
||
// 如果 userId 为 0(未登录),不允许删除
|
||
if userId == 0 {
|
||
return global.GVA_DB.Where("id = ?", id).Delete(&app.AiPreset{}).Error
|
||
}
|
||
return global.GVA_DB.Where("id = ? AND user_id = ?", id, userId).Delete(&app.AiPreset{}).Error
|
||
}
|
||
|
||
// UpdateAiPreset 更新AI预设
|
||
func (s *AiPresetService) UpdateAiPreset(userId uint, req *request.UpdateAiPresetRequest) (preset app.AiPreset, err error) {
|
||
// 如果 userId 为 0(未登录),允许更新任何预设
|
||
if userId == 0 {
|
||
err = global.GVA_DB.Where("id = ?", req.ID).First(&preset).Error
|
||
} else {
|
||
err = global.GVA_DB.Where("id = ? AND user_id = ?", req.ID, userId).First(&preset).Error
|
||
}
|
||
|
||
if err != nil {
|
||
return preset, err
|
||
}
|
||
|
||
if req.Name != "" {
|
||
preset.Name = req.Name
|
||
}
|
||
preset.Description = req.Description
|
||
if req.Prompts != nil {
|
||
preset.Prompts = req.Prompts
|
||
}
|
||
if req.RegexScripts != nil {
|
||
preset.RegexScripts = req.RegexScripts
|
||
}
|
||
preset.Temperature = req.Temperature
|
||
preset.TopP = req.TopP
|
||
preset.MaxTokens = req.MaxTokens
|
||
preset.FrequencyPenalty = req.FrequencyPenalty
|
||
preset.PresencePenalty = req.PresencePenalty
|
||
preset.StreamEnabled = req.StreamEnabled
|
||
preset.IsDefault = req.IsDefault
|
||
preset.IsPublic = req.IsPublic
|
||
|
||
err = global.GVA_DB.Save(&preset).Error
|
||
return preset, err
|
||
}
|
||
|
||
// GetAiPreset 获取AI预设详情
|
||
func (s *AiPresetService) GetAiPreset(id uint, userId uint) (preset app.AiPreset, err error) {
|
||
// 如果 userId 为 0(未登录),只能获取公开的预设
|
||
if userId == 0 {
|
||
err = global.GVA_DB.Where("id = ? AND is_public = ?", id, true).First(&preset).Error
|
||
} else {
|
||
err = global.GVA_DB.Where("id = ? AND (user_id = ? OR is_public = ?)", id, userId, true).First(&preset).Error
|
||
}
|
||
return preset, err
|
||
}
|
||
|
||
// GetAiPresetList 获取AI预设列表
|
||
func (s *AiPresetService) GetAiPresetList(userId uint, info req.PageInfo) (list []app.AiPreset, total int64, err error) {
|
||
limit := info.PageSize
|
||
offset := info.PageSize * (info.Page - 1)
|
||
db := global.GVA_DB.Model(&app.AiPreset{})
|
||
|
||
// 如果 userId 为 0(未登录),只返回公开的预设
|
||
if userId == 0 {
|
||
db = db.Where("is_public = ?", true)
|
||
} else {
|
||
db = db.Where("user_id = ? OR is_public = ?", userId, true)
|
||
}
|
||
|
||
err = db.Count(&total).Error
|
||
if err != nil {
|
||
return
|
||
}
|
||
|
||
err = db.Limit(limit).Offset(offset).Order("created_at DESC").Find(&list).Error
|
||
return list, total, err
|
||
}
|
||
|
||
// ImportAiPreset 导入AI预设(支持SillyTavern格式)
|
||
func (s *AiPresetService) ImportAiPreset(userId uint, req *request.ImportAiPresetRequest) (preset app.AiPreset, err error) {
|
||
// TODO: 解析SillyTavern JSON格式
|
||
// 这里需要实现JSON解析逻辑,将SillyTavern格式转换为我们的格式
|
||
return preset, nil
|
||
}
|
||
|
||
// ExportAiPreset 导出AI预设
|
||
func (s *AiPresetService) ExportAiPreset(id uint, userId uint) (data map[string]interface{}, err error) {
|
||
var preset app.AiPreset
|
||
|
||
// 如果 userId 为 0(未登录),只能导出公开的预设
|
||
if userId == 0 {
|
||
err = global.GVA_DB.Where("id = ? AND is_public = ?", id, true).First(&preset).Error
|
||
} else {
|
||
err = global.GVA_DB.Where("id = ? AND (user_id = ? OR is_public = ?)", id, userId, true).First(&preset).Error
|
||
}
|
||
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
data = map[string]interface{}{
|
||
"prompts": preset.Prompts,
|
||
"extensions": map[string]interface{}{
|
||
"regex_scripts": preset.RegexScripts,
|
||
},
|
||
"temperature": preset.Temperature,
|
||
"top_p": preset.TopP,
|
||
"openai_max_tokens": preset.MaxTokens,
|
||
"frequency_penalty": preset.FrequencyPenalty,
|
||
"presence_penalty": preset.PresencePenalty,
|
||
"stream_openai": preset.StreamEnabled,
|
||
}
|
||
|
||
return data, nil
|
||
}
|