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 }