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() }