|
@@ -2,6 +2,11 @@ package fastgpt
|
|
|
|
|
|
import (
|
|
|
"context"
|
|
|
+ "github.com/suyuan32/simple-admin-common/msg/errormsg"
|
|
|
+ "github.com/zeromicro/go-zero/core/errorx"
|
|
|
+ "strconv"
|
|
|
+ "time"
|
|
|
+ apps "wechat-api/mongo_model/apps"
|
|
|
|
|
|
"wechat-api/internal/svc"
|
|
|
"wechat-api/internal/types"
|
|
@@ -23,7 +28,383 @@ func NewCreateAppLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateA
|
|
|
}
|
|
|
|
|
|
func (l *CreateAppLogic) CreateApp(req *types.CreateAppsReq) (resp *types.BaseMsgResp, err error) {
|
|
|
- // todo: add your logic here and delete this line
|
|
|
+ organizationId := l.ctx.Value("organizationId").(uint64)
|
|
|
|
|
|
- return
|
|
|
+ organizationIdStr := strconv.FormatUint(organizationId, 10)
|
|
|
+
|
|
|
+ user, err := l.svcCtx.MongoModel.UsersModel.FindOneByUsername(context.TODO(), organizationIdStr)
|
|
|
+ if err != nil {
|
|
|
+ return nil, errorx.NewInvalidArgumentError("fastgpt get list failed " + err.Error())
|
|
|
+ }
|
|
|
+
|
|
|
+ teamMember, err := l.svcCtx.MongoModel.TeamMembersModel.FindOneByUserId(context.TODO(), user.ID)
|
|
|
+ if err != nil {
|
|
|
+ return nil, errorx.NewInvalidArgumentError("fastgpt get list failed " + err.Error())
|
|
|
+ }
|
|
|
+
|
|
|
+ intro := ""
|
|
|
+ if req.Intro != nil {
|
|
|
+ intro = *req.Intro
|
|
|
+ }
|
|
|
+ var apps_info *apps.Apps
|
|
|
+ if req.Type == "simple" {
|
|
|
+ // 创建默认智能体
|
|
|
+ apps_info = &apps.Apps{
|
|
|
+ ParentID: nil,
|
|
|
+ TeamID: teamMember.TeamID,
|
|
|
+ TmbID: teamMember.ID,
|
|
|
+ Name: req.Name,
|
|
|
+ Type: "simple",
|
|
|
+ Version: "v2",
|
|
|
+ Avatar: "/imgs/app/avatar/simple.svg",
|
|
|
+ Intro: intro,
|
|
|
+ TeamTags: []string{},
|
|
|
+ Modules: []apps.AppModule{
|
|
|
+ {
|
|
|
+ NodeID: "userGuide",
|
|
|
+ Name: "系统配置",
|
|
|
+ Intro: "",
|
|
|
+ FlowNodeType: "userGuide",
|
|
|
+ Position: apps.Position{
|
|
|
+ X: 531.242273606555,
|
|
|
+ Y: -486.761172954975,
|
|
|
+ },
|
|
|
+ Version: "481",
|
|
|
+ Inputs: []apps.AppInput{},
|
|
|
+ Outputs: []apps.AppOutput{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ NodeID: "workflowStartNodeId",
|
|
|
+ Name: "流程开始",
|
|
|
+ Intro: "",
|
|
|
+ Avatar: "core/workflow/template/workflowStart",
|
|
|
+ FlowNodeType: "workflowStart",
|
|
|
+ Position: apps.Position{
|
|
|
+ X: 558.40823764155,
|
|
|
+ Y: 123.723874291941,
|
|
|
+ },
|
|
|
+ Version: "481",
|
|
|
+ Inputs: []apps.AppInput{
|
|
|
+ {
|
|
|
+ Key: "userChatInput",
|
|
|
+ RenderTypeList: []string{"reference", "textarea"},
|
|
|
+ ValueType: "string",
|
|
|
+ Label: "workflow:user_question",
|
|
|
+ ToolDescription: "workflow:user_question",
|
|
|
+ Required: true,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ Outputs: []apps.AppOutput{
|
|
|
+ {
|
|
|
+ ID: "userChatInput",
|
|
|
+ Key: "userChatInput",
|
|
|
+ Label: "common:core.module.input.label.user question",
|
|
|
+ Type: "static",
|
|
|
+ ValueType: "string",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ ID: "userFiles",
|
|
|
+ Key: "userFiles",
|
|
|
+ Label: "app:workflow.user_file_input",
|
|
|
+ Description: "app:workflow.user_file_input_desc",
|
|
|
+ Type: "static",
|
|
|
+ ValueType: "arrayString",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ NodeID: "7BdojPlukIQw",
|
|
|
+ Name: "AI 对话",
|
|
|
+ Intro: "AI 大模型对话",
|
|
|
+ Avatar: "core/workflow/template/aiChat",
|
|
|
+ FlowNodeType: "chatNode",
|
|
|
+ ShowStatus: true,
|
|
|
+ Position: apps.Position{
|
|
|
+ X: 1106.32383879608,
|
|
|
+ Y: -350.603067468347,
|
|
|
+ },
|
|
|
+ Version: "4813",
|
|
|
+ Inputs: []apps.AppInput{
|
|
|
+ {
|
|
|
+ Key: "model",
|
|
|
+ RenderTypeList: []string{"settingLLMModel", "reference"},
|
|
|
+ ValueType: "string",
|
|
|
+ Value: "DeepSeek-V3",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Key: "temperature",
|
|
|
+ RenderTypeList: []string{"hidden"},
|
|
|
+ ValueType: "number",
|
|
|
+ Value: int32(0),
|
|
|
+ Min: getInt32(0),
|
|
|
+ Max: getInt32(10),
|
|
|
+ Step: getInt32(1),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Key: "maxToken",
|
|
|
+ RenderTypeList: []string{"hidden"},
|
|
|
+ ValueType: "number",
|
|
|
+ Value: int32(2000),
|
|
|
+ Min: getInt32(100),
|
|
|
+ Max: getInt32(4000),
|
|
|
+ Step: getInt32(50),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Key: "isResponseAnswerText",
|
|
|
+ RenderTypeList: []string{"hidden"},
|
|
|
+ ValueType: "boolean",
|
|
|
+ Value: true,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Key: "aiChatQuoteRole",
|
|
|
+ RenderTypeList: []string{"hidden"},
|
|
|
+ ValueType: "string",
|
|
|
+ Value: "system",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Key: "quoteTemplate",
|
|
|
+ RenderTypeList: []string{"hidden"},
|
|
|
+ ValueType: "string",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Key: "quotePrompt",
|
|
|
+ RenderTypeList: []string{"hidden"},
|
|
|
+ ValueType: "string",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Key: "systemPrompt",
|
|
|
+ RenderTypeList: []string{"textarea", "reference"},
|
|
|
+ Max: getInt32(3000),
|
|
|
+ ValueType: "string",
|
|
|
+ Label: "core.ai.Prompt",
|
|
|
+ Description: "core.app.tip.systemPromptTip",
|
|
|
+ Placeholder: "core.app.tip.chatNodeSystemPromptTip",
|
|
|
+ Value: "",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Key: "history",
|
|
|
+ RenderTypeList: []string{"numberInput", "reference"},
|
|
|
+ ValueType: "chatHistory",
|
|
|
+ Label: "core.module.input.label.chat history",
|
|
|
+ Required: true,
|
|
|
+ Min: getInt32(0),
|
|
|
+ Max: getInt32(30),
|
|
|
+ Value: int32(6),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Key: "userChatInput",
|
|
|
+ RenderTypeList: []string{"reference", "textarea"},
|
|
|
+ ValueType: "string",
|
|
|
+ Label: "common:core.module.input.label.user question",
|
|
|
+ Required: true,
|
|
|
+ ToolDescription: "common:core.module.input.label.user question",
|
|
|
+ Value: []interface{}{"workflowStartNodeId", "userChatInput"},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Key: "quoteQA",
|
|
|
+ RenderTypeList: []string{"settingDatasetQuotePrompt"},
|
|
|
+ Label: "",
|
|
|
+ DebugLabel: "common:core.module.Dataset quote.label",
|
|
|
+ Description: "",
|
|
|
+ ValueType: "datasetQuote",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Key: "fileUrlList",
|
|
|
+ RenderTypeList: []string{"reference", "input"},
|
|
|
+ Label: "app:file_quote_link",
|
|
|
+ DebugLabel: "app:file_quote_link",
|
|
|
+ ValueType: "arrayString",
|
|
|
+ Value: [][]interface{}{{"workflowStartNodeId", "userFiles"}},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Key: "aiChatVision",
|
|
|
+ RenderTypeList: []string{"hidden"},
|
|
|
+ ValueType: "boolean",
|
|
|
+ Value: true,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ Outputs: []apps.AppOutput{
|
|
|
+ {
|
|
|
+ ID: "history",
|
|
|
+ Key: "history",
|
|
|
+ Required: true,
|
|
|
+ Label: "common:core.module.output.label.New context",
|
|
|
+ Description: "common:core.module.output.description.New context",
|
|
|
+ ValueType: "chatHistory",
|
|
|
+ ValueDesc: "{\n obj: System | Human | AI;\n value: string;\n}[]",
|
|
|
+ Type: "static",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ ID: "answerText",
|
|
|
+ Key: "answerText",
|
|
|
+ Required: true,
|
|
|
+ Label: "common:core.module.output.label.Ai response content",
|
|
|
+ Description: "common:core.module.output.description.Ai response content",
|
|
|
+ ValueType: "string",
|
|
|
+ Type: "static",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ Edges: []apps.Edge{
|
|
|
+ {
|
|
|
+ Source: "workflowStartNodeId",
|
|
|
+ Target: "7BdojPlukIQw",
|
|
|
+ SourceHandle: "workflowStartNodeId-source-right",
|
|
|
+ TargetHandle: "7BdojPlukIQw-target-left",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ PluginData: apps.PluginData{
|
|
|
+ ID: mustParseObjectID("67da46b29667c5bf21203554"),
|
|
|
+ NodeVersion: "67da46d29667c5bf2120361a",
|
|
|
+ },
|
|
|
+ InheritPermission: true,
|
|
|
+ VersionNumber: int32(0),
|
|
|
+ ChatConfig: apps.ChatConfig{
|
|
|
+ WelcomeText: "",
|
|
|
+ Variables: []interface{}{},
|
|
|
+ QuestionGuide: false,
|
|
|
+ TTSConfig: apps.TTSConfig{
|
|
|
+ Type: "web",
|
|
|
+ },
|
|
|
+ WhisperConfig: apps.WhisperConfig{
|
|
|
+ Open: false,
|
|
|
+ AutoSend: false,
|
|
|
+ AutoTTSResponse: false,
|
|
|
+ },
|
|
|
+ ScheduledTriggerConfig: nil,
|
|
|
+ ChatInputGuide: apps.ChatInputGuide{
|
|
|
+ Open: false,
|
|
|
+ TextList: []string{},
|
|
|
+ CustomUrl: "",
|
|
|
+ },
|
|
|
+ Instruction: "",
|
|
|
+ ID: mustParseObjectID("67da46d29667c5bf2120361d"),
|
|
|
+ },
|
|
|
+ UpdateTime: time.Date(2025, 3, 19, 4, 24, 4, 394000000, time.UTC),
|
|
|
+ ScheduledTriggerConfig: nil,
|
|
|
+ ScheduledTriggerNextTime: nil,
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ apps_info = &apps.Apps{
|
|
|
+ ParentID: nil,
|
|
|
+ TeamID: teamMember.TeamID,
|
|
|
+ TmbID: teamMember.ID,
|
|
|
+ Name: req.Name,
|
|
|
+ Type: "advanced",
|
|
|
+ Version: "v2",
|
|
|
+ Avatar: "/imgs/app/avatar/workflow.svg",
|
|
|
+ Intro: intro,
|
|
|
+ TeamTags: []string{},
|
|
|
+ Modules: []apps.AppModule{
|
|
|
+ {
|
|
|
+ NodeID: "userGuide",
|
|
|
+ Name: "common:core.module.template.system_config",
|
|
|
+ Intro: "common:core.module.template.system_config_info",
|
|
|
+ Avatar: "core/workflow/template/systemConfig",
|
|
|
+ FlowNodeType: "userGuide",
|
|
|
+ Position: apps.Position{
|
|
|
+ X: 262.273233881709,
|
|
|
+ Y: -476.002411365981,
|
|
|
+ },
|
|
|
+ Version: "481",
|
|
|
+ Inputs: []apps.AppInput{
|
|
|
+ {
|
|
|
+ Key: "welcomeText",
|
|
|
+ RenderTypeList: []string{"hidden"},
|
|
|
+ ValueType: "string",
|
|
|
+ Label: "core.app.Welcome Text",
|
|
|
+ Value: "",
|
|
|
+ }, {
|
|
|
+ Key: "variables",
|
|
|
+ RenderTypeList: []string{"hidden"},
|
|
|
+ ValueType: "any",
|
|
|
+ Label: "core.app.Chat Variable",
|
|
|
+ Value: []string{},
|
|
|
+ }, {
|
|
|
+ Key: "questionGuide",
|
|
|
+ RenderTypeList: []string{"hidden"},
|
|
|
+ ValueType: "boolean",
|
|
|
+ Label: "core.app.Question Guide",
|
|
|
+ Value: false,
|
|
|
+ }, {
|
|
|
+ Key: "tts",
|
|
|
+ RenderTypeList: []string{"hidden"},
|
|
|
+ ValueType: "any",
|
|
|
+ Label: "",
|
|
|
+ Value: apps.AppInputValue{
|
|
|
+ Type: "web",
|
|
|
+ },
|
|
|
+ }, {
|
|
|
+ Key: "whisper",
|
|
|
+ RenderTypeList: []string{"hidden"},
|
|
|
+ ValueType: "any",
|
|
|
+ Label: "",
|
|
|
+ Value: apps.AppInputValue{
|
|
|
+ Open: false,
|
|
|
+ AutoSend: false,
|
|
|
+ AutoTTSResponse: false,
|
|
|
+ },
|
|
|
+ }, {
|
|
|
+ Key: "scheduleTrigger",
|
|
|
+ RenderTypeList: []string{"hidden"},
|
|
|
+ ValueType: "any",
|
|
|
+ Label: "",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ Outputs: []apps.AppOutput{},
|
|
|
+ },
|
|
|
+ {
|
|
|
+ NodeID: "448745",
|
|
|
+ Name: "common:core.module.template.work_start",
|
|
|
+ Intro: "",
|
|
|
+ Avatar: "core/workflow/template/workflowStart",
|
|
|
+ FlowNodeType: "workflowStart",
|
|
|
+ Position: apps.Position{
|
|
|
+ X: 632.368838596004,
|
|
|
+ Y: -347.744649294401,
|
|
|
+ },
|
|
|
+ Version: "481",
|
|
|
+ Inputs: []apps.AppInput{
|
|
|
+ {
|
|
|
+ Key: "userChatInput",
|
|
|
+ RenderTypeList: []string{"reference", "textarea"},
|
|
|
+ ValueType: "string",
|
|
|
+ Label: "common:core.module.input.label.user question",
|
|
|
+ ToolDescription: "common:core.module.input.label.user question",
|
|
|
+ Required: true,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ Outputs: []apps.AppOutput{
|
|
|
+ {
|
|
|
+ ID: "userChatInput",
|
|
|
+ Key: "userChatInput",
|
|
|
+ Label: "common:core.module.input.label.user question",
|
|
|
+ Type: "static",
|
|
|
+ ValueType: "string",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ Edges: []apps.Edge{},
|
|
|
+ PluginData: apps.PluginData{
|
|
|
+ ID: mustParseObjectID("67dce247bd93cb6e085a6bda"),
|
|
|
+ NodeVersion: "481",
|
|
|
+ },
|
|
|
+ InheritPermission: true,
|
|
|
+ VersionNumber: int32(0),
|
|
|
+ UpdateTime: time.Date(2025, 3, 19, 4, 24, 4, 394000000, time.UTC),
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if apps_info != nil {
|
|
|
+ err = l.svcCtx.MongoModel.AppsModel.Insert(context.TODO(), apps_info)
|
|
|
+ if err != nil {
|
|
|
+ return nil, errorx.NewInvalidArgumentError("fastgpt create failed " + err.Error())
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return nil, errorx.NewInvalidArgumentError("fastgpt create failed ")
|
|
|
+ }
|
|
|
+
|
|
|
+ return &types.BaseMsgResp{Msg: errormsg.Success}, nil
|
|
|
}
|