package node import ( "ai-agent/workflow/consts/node" nodeDto "ai-agent/workflow/model/dto/node" "context" "fmt" "gitea.redpowerfuture.com/red-future/common/beans" "github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/frame/g" ) var NodeLibraryService = &nodeLibraryService{} type nodeLibraryService struct{} func (s *nodeLibraryService) GetNodeLibrary(ctx context.Context, req *nodeDto.WorkflowNodeTreeReq) (*nodeDto.WorkflowNodeTreeRes, error) { WorkflowNodeGroups := []node.NodeGroupItem{ { Group: node.NodeGroupComponent, Label: node.NodeGroupNameComponent, Items: []node.NodeItem{ { NodeCode: node.NodeTypeTextModel, NodeName: node.NodeNameTextModel, ModelType: node.ModelTypeText, SkillOption: true, FormConfig: []node.NodeFormField{}, // 技能下拉 ModelConfig: []node.ModelItem{}, }, { NodeCode: node.NodeTypeImageModel, NodeName: node.NodeNameImageModel, ModelType: node.ModelTypeImage, SkillOption: true, FormConfig: []node.NodeFormField{}, // 技能下拉 ModelConfig: []node.ModelItem{}, }, }, }, { Group: node.NodeGroupBase, Label: node.NodeGroupNameBase, Items: []node.NodeItem{ { NodeCode: node.NodeTypeMerge, NodeName: node.NodeNameMerge, SkillOption: false, FormConfig: []node.NodeFormField{}, ModelConfig: []node.ModelItem{}, }, { NodeCode: node.NodeTypeJudge, NodeName: node.NodeNameJudge, SkillOption: false, FormConfig: []node.NodeFormField{ {Field: "condition", Label: node.FormLabelCondition, Type: "input", Required: true}, }, ModelConfig: []node.ModelItem{}, }, { NodeCode: node.NodeTypeForm, NodeName: node.NodeNameForm, SkillOption: false, FormConfig: []node.NodeFormField{}, ModelConfig: []node.ModelItem{}, }, //{ // NodeCode: node.NodeTypeModel, // NodeName: node.NodeNameModel, // SkillOption: true, // FormConfig: []node.NodeFormField{}, // ModelConfig: []node.ModelItem{}, //}, }, }, { Group: node.NodeGroupCustom, Label: node.NodeGroupNameCustom, Items: []node.NodeItem{ { NodeCode: node.NodeTypeCustomNode, NodeName: node.NodeNameCustomNode, SkillOption: true, FormConfig: []node.NodeFormField{ {Field: "nodeName", Label: node.FormLabelApiKey, Type: "input", Required: true}, {Field: "nodeType", Label: node.FormLabelModel, Type: "input", Required: true}, }, ModelConfig: []node.ModelItem{}, }, }, }, } tree := &nodeDto.WorkflowNodeTreeRes{ Groups: WorkflowNodeGroups, } // 3. 遍历分组,根据 typeId=1 给【文本模型节点】追加固定表单 for gIdx := range tree.Groups { group := &tree.Groups[gIdx] // 遍历分组下的每个节点 for itemIdx := range group.Items { item := &group.Items[itemIdx] if item.NodeCode == node.NodeTypeTextModel { item.ModelConfig = append(item.ModelConfig, node.ModelItem{ ModelName: "自定义", }) } if item.NodeCode == node.NodeTypeImageModel { item.ModelConfig = append(item.ModelConfig, node.ModelItem{ ModelName: "自定义", }) } } } return tree, nil } // SetUserInfo 设置用户信息 func (s *nodeLibraryService) SetUserInfo(ctx context.Context, creator string, tenantId uint64) (headers map[string]string, err error) { // 创建完整的用户信息 userInfo := &beans.User{ UserName: creator, TenantId: tenantId, } ctx = context.WithValue(ctx, "user", *userInfo) // 提取并保存请求头(在连接升级前) headers = make(map[string]string) // 提取其他headers if r := g.RequestFromCtx(ctx); r != nil { for k, v := range r.Request.Header { if len(v) > 0 { headers[k] = v[0] } } } // 将完整用户信息序列化为JSON,放到X-User-Info请求头 userInfoJson, err := gjson.Encode(userInfo) if err != nil { return nil, fmt.Errorf("用户信息序列化失败: %w", err) } headers["X-User-Info"] = string(userInfoJson) return }