thread-master/apps/backend/internal/logic/settings/save_ai_logic.go

76 lines
1.8 KiB
Go

package settings
import (
"context"
"apps/backend/internal/middleware"
"apps/backend/internal/module/member/domain"
"apps/backend/internal/svc"
"apps/backend/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
var modelsByProvider = map[string][]string{
"xai": {"grok-3", "grok-3-mini", "grok-2"},
"opencode-go": {"default", "fast"},
}
type SaveAiLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewSaveAiLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SaveAiLogic {
return &SaveAiLogic{Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx}
}
func (l *SaveAiLogic) SaveAi(req *types.SaveAiReq) (resp *types.AiSettingsData, err error) {
uid, _ := middleware.UIDFrom(l.ctx)
st, _ := l.svcCtx.Members.GetSettings(l.ctx, uid)
if st == nil {
st = domain.DefaultSettings(uid)
}
if req.Provider != "" {
st.Provider = req.Provider
} else if req.ResearchProvider != "" {
st.Provider = req.ResearchProvider
}
if req.Model != "" {
st.Model = req.Model
} else if req.ResearchModel != "" {
st.Model = req.ResearchModel
}
if list, ok := modelsByProvider[st.Provider]; ok {
found := false
for _, m := range list {
if m == st.Model {
found = true
break
}
}
if !found && len(list) > 0 {
st.Model = list[0]
}
}
if req.ApiKey != "" {
st.APIKey = req.ApiKey
st.APIKeyConfigured = true
st.ResearchAPIKeyConfigured = true
}
if req.ResearchApiKey != "" {
st.APIKey = req.ResearchApiKey
st.APIKeyConfigured = true
st.ResearchAPIKeyConfigured = true
}
if req.ApiKeyConfigured != nil {
st.APIKeyConfigured = *req.ApiKeyConfigured
if !*req.ApiKeyConfigured {
st.APIKey = ""
}
}
_ = l.svcCtx.Members.SaveSettings(l.ctx, uid, st)
return NewGetAiLogic(l.ctx, l.svcCtx).GetAi()
}