🎉 初始化项目

This commit is contained in:
2026-03-03 06:05:51 +08:00
commit e1c70fe218
241 changed files with 148285 additions and 0 deletions

View File

@@ -0,0 +1,147 @@
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
}