diff --git a/.gitignore b/.gitignore index c6b6ab2b6..1483f32a0 100644 --- a/.gitignore +++ b/.gitignore @@ -59,4 +59,5 @@ backend/script/errorx/.env .cursor/ .specify/ specs/ -.puml \ No newline at end of file +.puml +.trae \ No newline at end of file diff --git a/backend/go.sum b/backend/go.sum index 8459bd31b..a7d0e542b 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -473,6 +473,7 @@ github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5/go.mod h1:vavhavw2zAx github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= +github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= diff --git a/backend/kitex_gen/coze/loop/prompt/domain/prompt/k-prompt.go b/backend/kitex_gen/coze/loop/prompt/domain/prompt/k-prompt.go index 2c8ea22bc..c7df0e584 100644 --- a/backend/kitex_gen/coze/loop/prompt/domain/prompt/k-prompt.go +++ b/backend/kitex_gen/coze/loop/prompt/domain/prompt/k-prompt.go @@ -555,6 +555,20 @@ func (p *PromptBasic) FastRead(buf []byte) (int, error) { goto SkipFieldError } } + case 10: + if fieldTypeId == thrift.STRING { + l, err = p.FastReadField10(buf[offset:]) + offset += l + if err != nil { + goto ReadFieldError + } + } else { + l, err = thrift.Binary.Skip(buf[offset:], fieldTypeId) + offset += l + if err != nil { + goto SkipFieldError + } + } default: l, err = thrift.Binary.Skip(buf[offset:], fieldTypeId) offset += l @@ -699,6 +713,20 @@ func (p *PromptBasic) FastReadField9(buf []byte) (int, error) { return offset, nil } +func (p *PromptBasic) FastReadField10(buf []byte) (int, error) { + offset := 0 + + var _field *SecurityLevel + if v, l, err := thrift.Binary.ReadString(buf[offset:]); err != nil { + return offset, err + } else { + offset += l + _field = &v + } + p.SecurityLevel = _field + return offset, nil +} + func (p *PromptBasic) FastWrite(buf []byte) int { return p.FastWriteNocopy(buf, nil) } @@ -715,6 +743,7 @@ func (p *PromptBasic) FastWriteNocopy(buf []byte, w thrift.NocopyWriter) int { offset += p.fastWriteField4(buf[offset:], w) offset += p.fastWriteField5(buf[offset:], w) offset += p.fastWriteField9(buf[offset:], w) + offset += p.fastWriteField10(buf[offset:], w) } offset += thrift.Binary.WriteFieldStop(buf[offset:]) return offset @@ -732,6 +761,7 @@ func (p *PromptBasic) BLength() int { l += p.field7Length() l += p.field8Length() l += p.field9Length() + l += p.field10Length() } l += thrift.Binary.FieldStopLength() return l @@ -818,6 +848,15 @@ func (p *PromptBasic) fastWriteField9(buf []byte, w thrift.NocopyWriter) int { return offset } +func (p *PromptBasic) fastWriteField10(buf []byte, w thrift.NocopyWriter) int { + offset := 0 + if p.IsSetSecurityLevel() { + offset += thrift.Binary.WriteFieldBegin(buf[offset:], thrift.STRING, 10) + offset += thrift.Binary.WriteStringNocopy(buf[offset:], w, *p.SecurityLevel) + } + return offset +} + func (p *PromptBasic) field1Length() int { l := 0 if p.IsSetDisplayName() { @@ -899,6 +938,15 @@ func (p *PromptBasic) field9Length() int { return l } +func (p *PromptBasic) field10Length() int { + l := 0 + if p.IsSetSecurityLevel() { + l += thrift.Binary.FieldBeginLength() + l += thrift.Binary.StringLengthNocopy(*p.SecurityLevel) + } + return l +} + func (p *PromptBasic) DeepCopy(s interface{}) error { src, ok := s.(*PromptBasic) if !ok { @@ -965,6 +1013,11 @@ func (p *PromptBasic) DeepCopy(s interface{}) error { p.PromptType = &tmp } + if src.SecurityLevel != nil { + tmp := *src.SecurityLevel + p.SecurityLevel = &tmp + } + return nil } diff --git a/backend/kitex_gen/coze/loop/prompt/domain/prompt/prompt.go b/backend/kitex_gen/coze/loop/prompt/domain/prompt/prompt.go index 403002cfd..9edfd5483 100644 --- a/backend/kitex_gen/coze/loop/prompt/domain/prompt/prompt.go +++ b/backend/kitex_gen/coze/loop/prompt/domain/prompt/prompt.go @@ -15,6 +15,14 @@ const ( PromptTypeSnippet = "snippet" + SecurityLevelL1 = "L1" + + SecurityLevelL2 = "L2" + + SecurityLevelL3 = "L3" + + SecurityLevelL4 = "L4" + TemplateTypeNormal = "normal" TemplateTypeJinja2 = "jinja2" @@ -181,6 +189,8 @@ func (p *ThinkingOption) Value() (driver.Value, error) { type PromptType = string +type SecurityLevel = string + type TemplateType = string type ToolType = string @@ -738,15 +748,16 @@ func (p *Prompt) Field6DeepEqual(src *PromptCommit) bool { } type PromptBasic struct { - DisplayName *string `thrift:"display_name,1,optional" frugal:"1,optional,string" form:"display_name" json:"display_name,omitempty" query:"display_name"` - Description *string `thrift:"description,2,optional" frugal:"2,optional,string" form:"description" json:"description,omitempty" query:"description"` - LatestVersion *string `thrift:"latest_version,3,optional" frugal:"3,optional,string" form:"latest_version" json:"latest_version,omitempty" query:"latest_version"` - CreatedBy *string `thrift:"created_by,4,optional" frugal:"4,optional,string" form:"created_by" json:"created_by,omitempty" query:"created_by"` - UpdatedBy *string `thrift:"updated_by,5,optional" frugal:"5,optional,string" form:"updated_by" json:"updated_by,omitempty" query:"updated_by"` - CreatedAt *int64 `thrift:"created_at,6,optional" frugal:"6,optional,i64" json:"created_at" form:"created_at" query:"created_at"` - UpdatedAt *int64 `thrift:"updated_at,7,optional" frugal:"7,optional,i64" json:"updated_at" form:"updated_at" query:"updated_at"` - LatestCommittedAt *int64 `thrift:"latest_committed_at,8,optional" frugal:"8,optional,i64" json:"latest_committed_at" form:"latest_committed_at" query:"latest_committed_at"` - PromptType *PromptType `thrift:"prompt_type,9,optional" frugal:"9,optional,string" form:"prompt_type" json:"prompt_type,omitempty" query:"prompt_type"` + DisplayName *string `thrift:"display_name,1,optional" frugal:"1,optional,string" form:"display_name" json:"display_name,omitempty" query:"display_name"` + Description *string `thrift:"description,2,optional" frugal:"2,optional,string" form:"description" json:"description,omitempty" query:"description"` + LatestVersion *string `thrift:"latest_version,3,optional" frugal:"3,optional,string" form:"latest_version" json:"latest_version,omitempty" query:"latest_version"` + CreatedBy *string `thrift:"created_by,4,optional" frugal:"4,optional,string" form:"created_by" json:"created_by,omitempty" query:"created_by"` + UpdatedBy *string `thrift:"updated_by,5,optional" frugal:"5,optional,string" form:"updated_by" json:"updated_by,omitempty" query:"updated_by"` + CreatedAt *int64 `thrift:"created_at,6,optional" frugal:"6,optional,i64" json:"created_at" form:"created_at" query:"created_at"` + UpdatedAt *int64 `thrift:"updated_at,7,optional" frugal:"7,optional,i64" json:"updated_at" form:"updated_at" query:"updated_at"` + LatestCommittedAt *int64 `thrift:"latest_committed_at,8,optional" frugal:"8,optional,i64" json:"latest_committed_at" form:"latest_committed_at" query:"latest_committed_at"` + PromptType *PromptType `thrift:"prompt_type,9,optional" frugal:"9,optional,string" form:"prompt_type" json:"prompt_type,omitempty" query:"prompt_type"` + SecurityLevel *SecurityLevel `thrift:"security_level,10,optional" frugal:"10,optional,string" form:"security_level" json:"security_level,omitempty" query:"security_level"` } func NewPromptBasic() *PromptBasic { @@ -863,6 +874,18 @@ func (p *PromptBasic) GetPromptType() (v PromptType) { } return *p.PromptType } + +var PromptBasic_SecurityLevel_DEFAULT SecurityLevel + +func (p *PromptBasic) GetSecurityLevel() (v SecurityLevel) { + if p == nil { + return + } + if !p.IsSetSecurityLevel() { + return PromptBasic_SecurityLevel_DEFAULT + } + return *p.SecurityLevel +} func (p *PromptBasic) SetDisplayName(val *string) { p.DisplayName = val } @@ -890,17 +913,21 @@ func (p *PromptBasic) SetLatestCommittedAt(val *int64) { func (p *PromptBasic) SetPromptType(val *PromptType) { p.PromptType = val } +func (p *PromptBasic) SetSecurityLevel(val *SecurityLevel) { + p.SecurityLevel = val +} var fieldIDToName_PromptBasic = map[int16]string{ - 1: "display_name", - 2: "description", - 3: "latest_version", - 4: "created_by", - 5: "updated_by", - 6: "created_at", - 7: "updated_at", - 8: "latest_committed_at", - 9: "prompt_type", + 1: "display_name", + 2: "description", + 3: "latest_version", + 4: "created_by", + 5: "updated_by", + 6: "created_at", + 7: "updated_at", + 8: "latest_committed_at", + 9: "prompt_type", + 10: "security_level", } func (p *PromptBasic) IsSetDisplayName() bool { @@ -939,6 +966,10 @@ func (p *PromptBasic) IsSetPromptType() bool { return p.PromptType != nil } +func (p *PromptBasic) IsSetSecurityLevel() bool { + return p.SecurityLevel != nil +} + func (p *PromptBasic) Read(iprot thrift.TProtocol) (err error) { var fieldTypeId thrift.TType var fieldId int16 @@ -1029,6 +1060,14 @@ func (p *PromptBasic) Read(iprot thrift.TProtocol) (err error) { } else if err = iprot.Skip(fieldTypeId); err != nil { goto SkipFieldError } + case 10: + if fieldTypeId == thrift.STRING { + if err = p.ReadField10(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } default: if err = iprot.Skip(fieldTypeId); err != nil { goto SkipFieldError @@ -1157,6 +1196,17 @@ func (p *PromptBasic) ReadField9(iprot thrift.TProtocol) error { p.PromptType = _field return nil } +func (p *PromptBasic) ReadField10(iprot thrift.TProtocol) error { + + var _field *SecurityLevel + if v, err := iprot.ReadString(); err != nil { + return err + } else { + _field = &v + } + p.SecurityLevel = _field + return nil +} func (p *PromptBasic) Write(oprot thrift.TProtocol) (err error) { var fieldId int16 @@ -1200,6 +1250,10 @@ func (p *PromptBasic) Write(oprot thrift.TProtocol) (err error) { fieldId = 9 goto WriteFieldError } + if err = p.writeField10(oprot); err != nil { + fieldId = 10 + goto WriteFieldError + } } if err = oprot.WriteFieldStop(); err != nil { goto WriteFieldStopError @@ -1380,6 +1434,24 @@ WriteFieldBeginError: WriteFieldEndError: return thrift.PrependError(fmt.Sprintf("%T write field 9 end error: ", p), err) } +func (p *PromptBasic) writeField10(oprot thrift.TProtocol) (err error) { + if p.IsSetSecurityLevel() { + if err = oprot.WriteFieldBegin("security_level", thrift.STRING, 10); err != nil { + goto WriteFieldBeginError + } + if err := oprot.WriteString(*p.SecurityLevel); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 10 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 10 end error: ", p), err) +} func (p *PromptBasic) String() string { if p == nil { @@ -1422,6 +1494,9 @@ func (p *PromptBasic) DeepEqual(ano *PromptBasic) bool { if !p.Field9DeepEqual(ano.PromptType) { return false } + if !p.Field10DeepEqual(ano.SecurityLevel) { + return false + } return true } @@ -1533,6 +1608,18 @@ func (p *PromptBasic) Field9DeepEqual(src *PromptType) bool { } return true } +func (p *PromptBasic) Field10DeepEqual(src *SecurityLevel) bool { + + if p.SecurityLevel == src { + return true + } else if p.SecurityLevel == nil || src == nil { + return false + } + if strings.Compare(*p.SecurityLevel, *src) != 0 { + return false + } + return true +} type PromptCommit struct { Detail *PromptDetail `thrift:"detail,1,optional" frugal:"1,optional,PromptDetail" form:"detail" json:"detail,omitempty" query:"detail"` diff --git a/backend/kitex_gen/coze/loop/prompt/manage/coze.loop.prompt.manage.go b/backend/kitex_gen/coze/loop/prompt/manage/coze.loop.prompt.manage.go index 5ac6b1591..9786a80c2 100644 --- a/backend/kitex_gen/coze/loop/prompt/manage/coze.loop.prompt.manage.go +++ b/backend/kitex_gen/coze/loop/prompt/manage/coze.loop.prompt.manage.go @@ -22,13 +22,14 @@ type ListPromptOrderBy = string // --------------- Prompt管理 --------------- // type CreatePromptRequest struct { - WorkspaceID *int64 `thrift:"workspace_id,1,optional" frugal:"1,optional,i64" json:"workspace_id" form:"workspace_id" query:"workspace_id"` - PromptName *string `thrift:"prompt_name,11,optional" frugal:"11,optional,string" form:"prompt_name" json:"prompt_name,omitempty" query:"prompt_name"` - PromptKey *string `thrift:"prompt_key,12,optional" frugal:"12,optional,string" form:"prompt_key" json:"prompt_key,omitempty" query:"prompt_key"` - PromptDescription *string `thrift:"prompt_description,13,optional" frugal:"13,optional,string" form:"prompt_description" json:"prompt_description,omitempty" query:"prompt_description"` - PromptType *prompt.PromptType `thrift:"prompt_type,14,optional" frugal:"14,optional,string" form:"prompt_type" json:"prompt_type,omitempty" query:"prompt_type"` - DraftDetail *prompt.PromptDetail `thrift:"draft_detail,21,optional" frugal:"21,optional,prompt.PromptDetail" form:"draft_detail" json:"draft_detail,omitempty" query:"draft_detail"` - Base *base.Base `thrift:"Base,255,optional" frugal:"255,optional,base.Base" form:"Base" json:"Base,omitempty" query:"Base"` + WorkspaceID *int64 `thrift:"workspace_id,1,optional" frugal:"1,optional,i64" json:"workspace_id" form:"workspace_id" query:"workspace_id"` + PromptName *string `thrift:"prompt_name,11,optional" frugal:"11,optional,string" form:"prompt_name" json:"prompt_name,omitempty" query:"prompt_name"` + PromptKey *string `thrift:"prompt_key,12,optional" frugal:"12,optional,string" form:"prompt_key" json:"prompt_key,omitempty" query:"prompt_key"` + PromptDescription *string `thrift:"prompt_description,13,optional" frugal:"13,optional,string" form:"prompt_description" json:"prompt_description,omitempty" query:"prompt_description"` + PromptType *prompt.PromptType `thrift:"prompt_type,14,optional" frugal:"14,optional,string" form:"prompt_type" json:"prompt_type,omitempty" query:"prompt_type"` + SecurityLevel *prompt.SecurityLevel `thrift:"security_level,15,optional" frugal:"15,optional,string" form:"security_level" json:"security_level,omitempty" query:"security_level"` + DraftDetail *prompt.PromptDetail `thrift:"draft_detail,21,optional" frugal:"21,optional,prompt.PromptDetail" form:"draft_detail" json:"draft_detail,omitempty" query:"draft_detail"` + Base *base.Base `thrift:"Base,255,optional" frugal:"255,optional,base.Base" form:"Base" json:"Base,omitempty" query:"Base"` } func NewCreatePromptRequest() *CreatePromptRequest { @@ -98,6 +99,18 @@ func (p *CreatePromptRequest) GetPromptType() (v prompt.PromptType) { return *p.PromptType } +var CreatePromptRequest_SecurityLevel_DEFAULT prompt.SecurityLevel + +func (p *CreatePromptRequest) GetSecurityLevel() (v prompt.SecurityLevel) { + if p == nil { + return + } + if !p.IsSetSecurityLevel() { + return CreatePromptRequest_SecurityLevel_DEFAULT + } + return *p.SecurityLevel +} + var CreatePromptRequest_DraftDetail_DEFAULT *prompt.PromptDetail func (p *CreatePromptRequest) GetDraftDetail() (v *prompt.PromptDetail) { @@ -136,6 +149,9 @@ func (p *CreatePromptRequest) SetPromptDescription(val *string) { func (p *CreatePromptRequest) SetPromptType(val *prompt.PromptType) { p.PromptType = val } +func (p *CreatePromptRequest) SetSecurityLevel(val *prompt.SecurityLevel) { + p.SecurityLevel = val +} func (p *CreatePromptRequest) SetDraftDetail(val *prompt.PromptDetail) { p.DraftDetail = val } @@ -149,6 +165,7 @@ var fieldIDToName_CreatePromptRequest = map[int16]string{ 12: "prompt_key", 13: "prompt_description", 14: "prompt_type", + 15: "security_level", 21: "draft_detail", 255: "Base", } @@ -173,6 +190,10 @@ func (p *CreatePromptRequest) IsSetPromptType() bool { return p.PromptType != nil } +func (p *CreatePromptRequest) IsSetSecurityLevel() bool { + return p.SecurityLevel != nil +} + func (p *CreatePromptRequest) IsSetDraftDetail() bool { return p.DraftDetail != nil } @@ -239,6 +260,14 @@ func (p *CreatePromptRequest) Read(iprot thrift.TProtocol) (err error) { } else if err = iprot.Skip(fieldTypeId); err != nil { goto SkipFieldError } + case 15: + if fieldTypeId == thrift.STRING { + if err = p.ReadField15(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } case 21: if fieldTypeId == thrift.STRUCT { if err = p.ReadField21(iprot); err != nil { @@ -339,6 +368,17 @@ func (p *CreatePromptRequest) ReadField14(iprot thrift.TProtocol) error { p.PromptType = _field return nil } +func (p *CreatePromptRequest) ReadField15(iprot thrift.TProtocol) error { + + var _field *prompt.SecurityLevel + if v, err := iprot.ReadString(); err != nil { + return err + } else { + _field = &v + } + p.SecurityLevel = _field + return nil +} func (p *CreatePromptRequest) ReadField21(iprot thrift.TProtocol) error { _field := prompt.NewPromptDetail() if err := _field.Read(iprot); err != nil { @@ -382,6 +422,10 @@ func (p *CreatePromptRequest) Write(oprot thrift.TProtocol) (err error) { fieldId = 14 goto WriteFieldError } + if err = p.writeField15(oprot); err != nil { + fieldId = 15 + goto WriteFieldError + } if err = p.writeField21(oprot); err != nil { fieldId = 21 goto WriteFieldError @@ -498,6 +542,24 @@ WriteFieldBeginError: WriteFieldEndError: return thrift.PrependError(fmt.Sprintf("%T write field 14 end error: ", p), err) } +func (p *CreatePromptRequest) writeField15(oprot thrift.TProtocol) (err error) { + if p.IsSetSecurityLevel() { + if err = oprot.WriteFieldBegin("security_level", thrift.STRING, 15); err != nil { + goto WriteFieldBeginError + } + if err := oprot.WriteString(*p.SecurityLevel); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 15 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 15 end error: ", p), err) +} func (p *CreatePromptRequest) writeField21(oprot thrift.TProtocol) (err error) { if p.IsSetDraftDetail() { if err = oprot.WriteFieldBegin("draft_detail", thrift.STRUCT, 21); err != nil { @@ -564,6 +626,9 @@ func (p *CreatePromptRequest) DeepEqual(ano *CreatePromptRequest) bool { if !p.Field14DeepEqual(ano.PromptType) { return false } + if !p.Field15DeepEqual(ano.SecurityLevel) { + return false + } if !p.Field21DeepEqual(ano.DraftDetail) { return false } @@ -633,6 +698,18 @@ func (p *CreatePromptRequest) Field14DeepEqual(src *prompt.PromptType) bool { } return true } +func (p *CreatePromptRequest) Field15DeepEqual(src *prompt.SecurityLevel) bool { + + if p.SecurityLevel == src { + return true + } else if p.SecurityLevel == nil || src == nil { + return false + } + if strings.Compare(*p.SecurityLevel, *src) != 0 { + return false + } + return true +} func (p *CreatePromptRequest) Field21DeepEqual(src *prompt.PromptDetail) bool { if !p.DraftDetail.DeepEqual(src) { @@ -5706,10 +5783,12 @@ func (p *ListPromptResponse) Field255DeepEqual(src *base.BaseResp) bool { } type UpdatePromptRequest struct { - PromptID *int64 `thrift:"prompt_id,1,optional" frugal:"1,optional,i64" json:"prompt_id" path:"prompt_id" ` - PromptName *string `thrift:"prompt_name,11,optional" frugal:"11,optional,string" form:"prompt_name" json:"prompt_name,omitempty" query:"prompt_name"` - PromptDescription *string `thrift:"prompt_description,12,optional" frugal:"12,optional,string" form:"prompt_description" json:"prompt_description,omitempty" query:"prompt_description"` - Base *base.Base `thrift:"Base,255,optional" frugal:"255,optional,base.Base" form:"Base" json:"Base,omitempty" query:"Base"` + PromptID *int64 `thrift:"prompt_id,1,optional" frugal:"1,optional,i64" json:"prompt_id" path:"prompt_id" ` + PromptName *string `thrift:"prompt_name,11,optional" frugal:"11,optional,string" form:"prompt_name" json:"prompt_name,omitempty" query:"prompt_name"` + PromptDescription *string `thrift:"prompt_description,12,optional" frugal:"12,optional,string" form:"prompt_description" json:"prompt_description,omitempty" query:"prompt_description"` + SecurityLevel *prompt.SecurityLevel `thrift:"security_level,13,optional" frugal:"13,optional,string" form:"security_level" json:"security_level,omitempty" query:"security_level"` + DowngradeReason *string `thrift:"downgrade_reason,14,optional" frugal:"14,optional,string" form:"downgrade_reason" json:"downgrade_reason,omitempty" query:"downgrade_reason"` + Base *base.Base `thrift:"Base,255,optional" frugal:"255,optional,base.Base" form:"Base" json:"Base,omitempty" query:"Base"` } func NewUpdatePromptRequest() *UpdatePromptRequest { @@ -5755,6 +5834,30 @@ func (p *UpdatePromptRequest) GetPromptDescription() (v string) { return *p.PromptDescription } +var UpdatePromptRequest_SecurityLevel_DEFAULT prompt.SecurityLevel + +func (p *UpdatePromptRequest) GetSecurityLevel() (v prompt.SecurityLevel) { + if p == nil { + return + } + if !p.IsSetSecurityLevel() { + return UpdatePromptRequest_SecurityLevel_DEFAULT + } + return *p.SecurityLevel +} + +var UpdatePromptRequest_DowngradeReason_DEFAULT string + +func (p *UpdatePromptRequest) GetDowngradeReason() (v string) { + if p == nil { + return + } + if !p.IsSetDowngradeReason() { + return UpdatePromptRequest_DowngradeReason_DEFAULT + } + return *p.DowngradeReason +} + var UpdatePromptRequest_Base_DEFAULT *base.Base func (p *UpdatePromptRequest) GetBase() (v *base.Base) { @@ -5775,6 +5878,12 @@ func (p *UpdatePromptRequest) SetPromptName(val *string) { func (p *UpdatePromptRequest) SetPromptDescription(val *string) { p.PromptDescription = val } +func (p *UpdatePromptRequest) SetSecurityLevel(val *prompt.SecurityLevel) { + p.SecurityLevel = val +} +func (p *UpdatePromptRequest) SetDowngradeReason(val *string) { + p.DowngradeReason = val +} func (p *UpdatePromptRequest) SetBase(val *base.Base) { p.Base = val } @@ -5783,6 +5892,8 @@ var fieldIDToName_UpdatePromptRequest = map[int16]string{ 1: "prompt_id", 11: "prompt_name", 12: "prompt_description", + 13: "security_level", + 14: "downgrade_reason", 255: "Base", } @@ -5798,6 +5909,14 @@ func (p *UpdatePromptRequest) IsSetPromptDescription() bool { return p.PromptDescription != nil } +func (p *UpdatePromptRequest) IsSetSecurityLevel() bool { + return p.SecurityLevel != nil +} + +func (p *UpdatePromptRequest) IsSetDowngradeReason() bool { + return p.DowngradeReason != nil +} + func (p *UpdatePromptRequest) IsSetBase() bool { return p.Base != nil } @@ -5844,6 +5963,22 @@ func (p *UpdatePromptRequest) Read(iprot thrift.TProtocol) (err error) { } else if err = iprot.Skip(fieldTypeId); err != nil { goto SkipFieldError } + case 13: + if fieldTypeId == thrift.STRING { + if err = p.ReadField13(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } + case 14: + if fieldTypeId == thrift.STRING { + if err = p.ReadField14(iprot); err != nil { + goto ReadFieldError + } + } else if err = iprot.Skip(fieldTypeId); err != nil { + goto SkipFieldError + } case 255: if fieldTypeId == thrift.STRUCT { if err = p.ReadField255(iprot); err != nil { @@ -5914,6 +6049,28 @@ func (p *UpdatePromptRequest) ReadField12(iprot thrift.TProtocol) error { p.PromptDescription = _field return nil } +func (p *UpdatePromptRequest) ReadField13(iprot thrift.TProtocol) error { + + var _field *prompt.SecurityLevel + if v, err := iprot.ReadString(); err != nil { + return err + } else { + _field = &v + } + p.SecurityLevel = _field + return nil +} +func (p *UpdatePromptRequest) ReadField14(iprot thrift.TProtocol) error { + + var _field *string + if v, err := iprot.ReadString(); err != nil { + return err + } else { + _field = &v + } + p.DowngradeReason = _field + return nil +} func (p *UpdatePromptRequest) ReadField255(iprot thrift.TProtocol) error { _field := base.NewBase() if err := _field.Read(iprot); err != nil { @@ -5941,6 +6098,14 @@ func (p *UpdatePromptRequest) Write(oprot thrift.TProtocol) (err error) { fieldId = 12 goto WriteFieldError } + if err = p.writeField13(oprot); err != nil { + fieldId = 13 + goto WriteFieldError + } + if err = p.writeField14(oprot); err != nil { + fieldId = 14 + goto WriteFieldError + } if err = p.writeField255(oprot); err != nil { fieldId = 255 goto WriteFieldError @@ -6017,6 +6182,42 @@ WriteFieldBeginError: WriteFieldEndError: return thrift.PrependError(fmt.Sprintf("%T write field 12 end error: ", p), err) } +func (p *UpdatePromptRequest) writeField13(oprot thrift.TProtocol) (err error) { + if p.IsSetSecurityLevel() { + if err = oprot.WriteFieldBegin("security_level", thrift.STRING, 13); err != nil { + goto WriteFieldBeginError + } + if err := oprot.WriteString(*p.SecurityLevel); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 13 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 13 end error: ", p), err) +} +func (p *UpdatePromptRequest) writeField14(oprot thrift.TProtocol) (err error) { + if p.IsSetDowngradeReason() { + if err = oprot.WriteFieldBegin("downgrade_reason", thrift.STRING, 14); err != nil { + goto WriteFieldBeginError + } + if err := oprot.WriteString(*p.DowngradeReason); err != nil { + return err + } + if err = oprot.WriteFieldEnd(); err != nil { + goto WriteFieldEndError + } + } + return nil +WriteFieldBeginError: + return thrift.PrependError(fmt.Sprintf("%T write field 14 begin error: ", p), err) +WriteFieldEndError: + return thrift.PrependError(fmt.Sprintf("%T write field 14 end error: ", p), err) +} func (p *UpdatePromptRequest) writeField255(oprot thrift.TProtocol) (err error) { if p.IsSetBase() { if err = oprot.WriteFieldBegin("Base", thrift.STRUCT, 255); err != nil { @@ -6059,6 +6260,12 @@ func (p *UpdatePromptRequest) DeepEqual(ano *UpdatePromptRequest) bool { if !p.Field12DeepEqual(ano.PromptDescription) { return false } + if !p.Field13DeepEqual(ano.SecurityLevel) { + return false + } + if !p.Field14DeepEqual(ano.DowngradeReason) { + return false + } if !p.Field255DeepEqual(ano.Base) { return false } @@ -6101,6 +6308,30 @@ func (p *UpdatePromptRequest) Field12DeepEqual(src *string) bool { } return true } +func (p *UpdatePromptRequest) Field13DeepEqual(src *prompt.SecurityLevel) bool { + + if p.SecurityLevel == src { + return true + } else if p.SecurityLevel == nil || src == nil { + return false + } + if strings.Compare(*p.SecurityLevel, *src) != 0 { + return false + } + return true +} +func (p *UpdatePromptRequest) Field14DeepEqual(src *string) bool { + + if p.DowngradeReason == src { + return true + } else if p.DowngradeReason == nil || src == nil { + return false + } + if strings.Compare(*p.DowngradeReason, *src) != 0 { + return false + } + return true +} func (p *UpdatePromptRequest) Field255DeepEqual(src *base.Base) bool { if !p.Base.DeepEqual(src) { diff --git a/backend/kitex_gen/coze/loop/prompt/manage/k-coze.loop.prompt.manage.go b/backend/kitex_gen/coze/loop/prompt/manage/k-coze.loop.prompt.manage.go index 87d0af839..5a5309b35 100644 --- a/backend/kitex_gen/coze/loop/prompt/manage/k-coze.loop.prompt.manage.go +++ b/backend/kitex_gen/coze/loop/prompt/manage/k-coze.loop.prompt.manage.go @@ -118,6 +118,20 @@ func (p *CreatePromptRequest) FastRead(buf []byte) (int, error) { goto SkipFieldError } } + case 15: + if fieldTypeId == thrift.STRING { + l, err = p.FastReadField15(buf[offset:]) + offset += l + if err != nil { + goto ReadFieldError + } + } else { + l, err = thrift.Binary.Skip(buf[offset:], fieldTypeId) + offset += l + if err != nil { + goto SkipFieldError + } + } case 21: if fieldTypeId == thrift.STRUCT { l, err = p.FastReadField21(buf[offset:]) @@ -234,6 +248,20 @@ func (p *CreatePromptRequest) FastReadField14(buf []byte) (int, error) { return offset, nil } +func (p *CreatePromptRequest) FastReadField15(buf []byte) (int, error) { + offset := 0 + + var _field *prompt.SecurityLevel + if v, l, err := thrift.Binary.ReadString(buf[offset:]); err != nil { + return offset, err + } else { + offset += l + _field = &v + } + p.SecurityLevel = _field + return offset, nil +} + func (p *CreatePromptRequest) FastReadField21(buf []byte) (int, error) { offset := 0 _field := prompt.NewPromptDetail() @@ -270,6 +298,7 @@ func (p *CreatePromptRequest) FastWriteNocopy(buf []byte, w thrift.NocopyWriter) offset += p.fastWriteField12(buf[offset:], w) offset += p.fastWriteField13(buf[offset:], w) offset += p.fastWriteField14(buf[offset:], w) + offset += p.fastWriteField15(buf[offset:], w) offset += p.fastWriteField21(buf[offset:], w) offset += p.fastWriteField255(buf[offset:], w) } @@ -285,6 +314,7 @@ func (p *CreatePromptRequest) BLength() int { l += p.field12Length() l += p.field13Length() l += p.field14Length() + l += p.field15Length() l += p.field21Length() l += p.field255Length() } @@ -337,6 +367,15 @@ func (p *CreatePromptRequest) fastWriteField14(buf []byte, w thrift.NocopyWriter return offset } +func (p *CreatePromptRequest) fastWriteField15(buf []byte, w thrift.NocopyWriter) int { + offset := 0 + if p.IsSetSecurityLevel() { + offset += thrift.Binary.WriteFieldBegin(buf[offset:], thrift.STRING, 15) + offset += thrift.Binary.WriteStringNocopy(buf[offset:], w, *p.SecurityLevel) + } + return offset +} + func (p *CreatePromptRequest) fastWriteField21(buf []byte, w thrift.NocopyWriter) int { offset := 0 if p.IsSetDraftDetail() { @@ -400,6 +439,15 @@ func (p *CreatePromptRequest) field14Length() int { return l } +func (p *CreatePromptRequest) field15Length() int { + l := 0 + if p.IsSetSecurityLevel() { + l += thrift.Binary.FieldBeginLength() + l += thrift.Binary.StringLengthNocopy(*p.SecurityLevel) + } + return l +} + func (p *CreatePromptRequest) field21Length() int { l := 0 if p.IsSetDraftDetail() { @@ -458,6 +506,11 @@ func (p *CreatePromptRequest) DeepCopy(s interface{}) error { p.PromptType = &tmp } + if src.SecurityLevel != nil { + tmp := *src.SecurityLevel + p.SecurityLevel = &tmp + } + var _draftDetail *prompt.PromptDetail if src.DraftDetail != nil { _draftDetail = &prompt.PromptDetail{} @@ -4145,6 +4198,34 @@ func (p *UpdatePromptRequest) FastRead(buf []byte) (int, error) { goto SkipFieldError } } + case 13: + if fieldTypeId == thrift.STRING { + l, err = p.FastReadField13(buf[offset:]) + offset += l + if err != nil { + goto ReadFieldError + } + } else { + l, err = thrift.Binary.Skip(buf[offset:], fieldTypeId) + offset += l + if err != nil { + goto SkipFieldError + } + } + case 14: + if fieldTypeId == thrift.STRING { + l, err = p.FastReadField14(buf[offset:]) + offset += l + if err != nil { + goto ReadFieldError + } + } else { + l, err = thrift.Binary.Skip(buf[offset:], fieldTypeId) + offset += l + if err != nil { + goto SkipFieldError + } + } case 255: if fieldTypeId == thrift.STRUCT { l, err = p.FastReadField255(buf[offset:]) @@ -4219,6 +4300,34 @@ func (p *UpdatePromptRequest) FastReadField12(buf []byte) (int, error) { return offset, nil } +func (p *UpdatePromptRequest) FastReadField13(buf []byte) (int, error) { + offset := 0 + + var _field *prompt.SecurityLevel + if v, l, err := thrift.Binary.ReadString(buf[offset:]); err != nil { + return offset, err + } else { + offset += l + _field = &v + } + p.SecurityLevel = _field + return offset, nil +} + +func (p *UpdatePromptRequest) FastReadField14(buf []byte) (int, error) { + offset := 0 + + var _field *string + if v, l, err := thrift.Binary.ReadString(buf[offset:]); err != nil { + return offset, err + } else { + offset += l + _field = &v + } + p.DowngradeReason = _field + return offset, nil +} + func (p *UpdatePromptRequest) FastReadField255(buf []byte) (int, error) { offset := 0 _field := base.NewBase() @@ -4241,6 +4350,8 @@ func (p *UpdatePromptRequest) FastWriteNocopy(buf []byte, w thrift.NocopyWriter) offset += p.fastWriteField1(buf[offset:], w) offset += p.fastWriteField11(buf[offset:], w) offset += p.fastWriteField12(buf[offset:], w) + offset += p.fastWriteField13(buf[offset:], w) + offset += p.fastWriteField14(buf[offset:], w) offset += p.fastWriteField255(buf[offset:], w) } offset += thrift.Binary.WriteFieldStop(buf[offset:]) @@ -4253,6 +4364,8 @@ func (p *UpdatePromptRequest) BLength() int { l += p.field1Length() l += p.field11Length() l += p.field12Length() + l += p.field13Length() + l += p.field14Length() l += p.field255Length() } l += thrift.Binary.FieldStopLength() @@ -4286,6 +4399,24 @@ func (p *UpdatePromptRequest) fastWriteField12(buf []byte, w thrift.NocopyWriter return offset } +func (p *UpdatePromptRequest) fastWriteField13(buf []byte, w thrift.NocopyWriter) int { + offset := 0 + if p.IsSetSecurityLevel() { + offset += thrift.Binary.WriteFieldBegin(buf[offset:], thrift.STRING, 13) + offset += thrift.Binary.WriteStringNocopy(buf[offset:], w, *p.SecurityLevel) + } + return offset +} + +func (p *UpdatePromptRequest) fastWriteField14(buf []byte, w thrift.NocopyWriter) int { + offset := 0 + if p.IsSetDowngradeReason() { + offset += thrift.Binary.WriteFieldBegin(buf[offset:], thrift.STRING, 14) + offset += thrift.Binary.WriteStringNocopy(buf[offset:], w, *p.DowngradeReason) + } + return offset +} + func (p *UpdatePromptRequest) fastWriteField255(buf []byte, w thrift.NocopyWriter) int { offset := 0 if p.IsSetBase() { @@ -4322,6 +4453,24 @@ func (p *UpdatePromptRequest) field12Length() int { return l } +func (p *UpdatePromptRequest) field13Length() int { + l := 0 + if p.IsSetSecurityLevel() { + l += thrift.Binary.FieldBeginLength() + l += thrift.Binary.StringLengthNocopy(*p.SecurityLevel) + } + return l +} + +func (p *UpdatePromptRequest) field14Length() int { + l := 0 + if p.IsSetDowngradeReason() { + l += thrift.Binary.FieldBeginLength() + l += thrift.Binary.StringLengthNocopy(*p.DowngradeReason) + } + return l +} + func (p *UpdatePromptRequest) field255Length() int { l := 0 if p.IsSetBase() { @@ -4358,6 +4507,19 @@ func (p *UpdatePromptRequest) DeepCopy(s interface{}) error { p.PromptDescription = &tmp } + if src.SecurityLevel != nil { + tmp := *src.SecurityLevel + p.SecurityLevel = &tmp + } + + if src.DowngradeReason != nil { + var tmp string + if *src.DowngradeReason != "" { + tmp = kutils.StringDeepCopy(*src.DowngradeReason) + } + p.DowngradeReason = &tmp + } + var _base *base.Base if src.Base != nil { _base = &base.Base{} diff --git a/backend/modules/prompt/application/convertor/prompt.go b/backend/modules/prompt/application/convertor/prompt.go index babcd757b..e67f6d78e 100644 --- a/backend/modules/prompt/application/convertor/prompt.go +++ b/backend/modules/prompt/application/convertor/prompt.go @@ -101,6 +101,7 @@ func PromptBasicDTO2DO(dto *prompt.PromptBasic) *entity.PromptBasic { UpdatedBy: dto.GetUpdatedBy(), CreatedAt: time.UnixMilli(dto.GetCreatedAt()), UpdatedAt: time.UnixMilli(dto.GetUpdatedAt()), + SecurityLevel: SecurityLevelDTO2DO(dto.GetSecurityLevel()), } } @@ -197,6 +198,21 @@ func PromptTypeDTO2DO(dto prompt.PromptType) entity.PromptType { } } +func SecurityLevelDTO2DO(dto prompt.SecurityLevel) entity.SecurityLevel { + switch dto { + case prompt.SecurityLevelL1: + return entity.SecurityLevelL1 + case prompt.SecurityLevelL2: + return entity.SecurityLevelL2 + case prompt.SecurityLevelL3: + return entity.SecurityLevelL3 + case prompt.SecurityLevelL4: + return entity.SecurityLevelL4 + default: + return entity.SecurityLevelL3 + } +} + func BatchMessageDTO2DO(dtos []*prompt.Message) []*entity.Message { if dtos == nil { return nil @@ -923,7 +939,8 @@ func PromptBasicDO2DTO(do *entity.PromptBasic) *prompt.PromptBasic { } return ptr.Of(do.LatestCommittedAt.UnixMilli()) }(), - PromptType: ptr.Of(PromptTypeDO2DTO(do.PromptType)), + PromptType: ptr.Of(PromptTypeDO2DTO(do.PromptType)), + SecurityLevel: SecurityLevelDO2DTO(do.SecurityLevel), } } @@ -938,6 +955,21 @@ func PromptTypeDO2DTO(do entity.PromptType) prompt.PromptType { } } +func SecurityLevelDO2DTO(level entity.SecurityLevel) *prompt.SecurityLevel { + switch level { + case entity.SecurityLevelL1: + return ptr.Of(prompt.SecurityLevelL1) + case entity.SecurityLevelL2: + return ptr.Of(prompt.SecurityLevelL2) + case entity.SecurityLevelL3: + return ptr.Of(prompt.SecurityLevelL3) + case entity.SecurityLevelL4: + return ptr.Of(prompt.SecurityLevelL4) + default: + return ptr.Of(prompt.SecurityLevelL3) + } +} + func BatchPromptCommitDO2DTO(dos []*entity.PromptCommit) []*prompt.PromptCommit { if len(dos) == 0 { return nil diff --git a/backend/modules/prompt/application/manage.go b/backend/modules/prompt/application/manage.go index 981bb8f5f..67b47f38f 100644 --- a/backend/modules/prompt/application/manage.go +++ b/backend/modules/prompt/application/manage.go @@ -67,17 +67,17 @@ func (app *PromptManageApplicationImpl) ListParentPrompt(ctx context.Context, re return r, errorx.NewByCode(prompterr.CommonInvalidParamCode, errorx.WithExtraMsg("User not found")) } - // 权限检查 - err = app.authRPCProvider.CheckSpacePermission(ctx, request.GetWorkspaceID(), consts.ActionLoopPromptRead) - if err != nil { - return r, err - } - // 参数验证 if request.GetPromptID() <= 0 { return r, errorx.NewByCode(prompterr.CommonInvalidParamCode, errorx.WithExtraMsg("Prompt ID is required")) } + // 权限检查 + err = app.authRPCProvider.MCheckPromptPermission(ctx, request.GetWorkspaceID(), []int64{request.GetPromptID()}, consts.ActionLoopPromptRead) + if err != nil { + return r, err + } + // 调用repository层查询父prompt result, err := app.manageRepo.ListParentPrompt(ctx, repo.ListParentPromptParam{ SubPromptID: request.GetPromptID(), @@ -126,16 +126,20 @@ func (app *PromptManageApplicationImpl) CreatePrompt(ctx context.Context, reques if request.PromptType == nil { request.PromptType = ptr.Of(prompt.PromptTypeNormal) } + if request.SecurityLevel == nil { + request.SecurityLevel = ptr.Of(prompt.SecurityLevelL3) + } // create prompt promptDTO := &prompt.Prompt{ WorkspaceID: request.WorkspaceID, PromptKey: request.PromptKey, PromptBasic: &prompt.PromptBasic{ - PromptType: request.PromptType, - DisplayName: request.PromptName, - Description: request.PromptDescription, - CreatedBy: ptr.Of(userID), - UpdatedBy: ptr.Of(userID), + PromptType: request.PromptType, + DisplayName: request.PromptName, + Description: request.PromptDescription, + CreatedBy: ptr.Of(userID), + UpdatedBy: ptr.Of(userID), + SecurityLevel: request.SecurityLevel, }, PromptDraft: func() *prompt.PromptDraft { if request.DraftDetail == nil { @@ -203,15 +207,18 @@ func (app *PromptManageApplicationImpl) ClonePrompt(ctx context.Context, request clonedPromptDO.PromptKey = request.GetClonedPromptKey() promptType := entity.PromptTypeNormal + securityLevel := entity.SecurityLevelL3 if promptDO.PromptBasic != nil && promptDO.PromptBasic.PromptType != "" { promptType = promptDO.PromptBasic.PromptType + securityLevel = promptDO.PromptBasic.SecurityLevel } clonedPromptDO.PromptBasic = &entity.PromptBasic{ - DisplayName: request.GetClonedPromptName(), - Description: request.GetClonedPromptDescription(), - CreatedBy: userID, - PromptType: promptType, + DisplayName: request.GetClonedPromptName(), + Description: request.GetClonedPromptDescription(), + CreatedBy: userID, + PromptType: promptType, + SecurityLevel: securityLevel, } clonedPromptDO.PromptDraft = &entity.PromptDraft{ DraftInfo: &entity.DraftInfo{ @@ -474,6 +481,13 @@ func (app *PromptManageApplicationImpl) UpdatePrompt(ctx context.Context, reques if err != nil { return r, err } + securityLevel := convertor.SecurityLevelDTO2DO(request.GetSecurityLevel()) + if promptDO.PromptBasic != nil && promptDO.PromptBasic.SecurityLevel != securityLevel { + err = app.authRPCProvider.MCheckPromptPermission(ctx, promptDO.SpaceID, []int64{request.GetPromptID()}, consts.ActionLoopPromptEditSecLevel) + if err != nil { + return r, err + } + } // 审核 err = app.auditRPCProvider.AuditPrompt(ctx, &entity.Prompt{ @@ -494,6 +508,7 @@ func (app *PromptManageApplicationImpl) UpdatePrompt(ctx context.Context, reques PromptName: request.GetPromptName(), PromptDescription: request.GetPromptDescription(), + SecurityLevel: securityLevel, } return r, app.manageRepo.UpdatePrompt(ctx, updatePromptParam) } diff --git a/backend/modules/prompt/application/wire.go b/backend/modules/prompt/application/wire.go index d05a990c3..b275cb5a3 100644 --- a/backend/modules/prompt/application/wire.go +++ b/backend/modules/prompt/application/wire.go @@ -29,6 +29,7 @@ import ( promptconf "github.com/coze-dev/coze-loop/backend/modules/prompt/infra/conf" "github.com/coze-dev/coze-loop/backend/modules/prompt/infra/repo" "github.com/coze-dev/coze-loop/backend/modules/prompt/infra/repo/mysql" + "github.com/coze-dev/coze-loop/backend/modules/prompt/infra/repo/mysql/hooks" rediscache "github.com/coze-dev/coze-loop/backend/modules/prompt/infra/repo/redis" "github.com/coze-dev/coze-loop/backend/modules/prompt/infra/rpc" "github.com/coze-dev/coze-loop/backend/pkg/conf" @@ -44,6 +45,8 @@ var ( repo.NewLabelRepo, repo.NewDebugLogRepo, repo.NewDebugContextRepo, + hooks.NewEmptyPromptCommitHook, + hooks.NewEmptyPromptUserDraftHook, mysql.NewPromptBasicDAO, mysql.NewPromptCommitDAO, mysql.NewPromptUserDraftDAO, diff --git a/backend/modules/prompt/application/wire_gen.go b/backend/modules/prompt/application/wire_gen.go index 06d11e9be..c5c88ae26 100644 --- a/backend/modules/prompt/application/wire_gen.go +++ b/backend/modules/prompt/application/wire_gen.go @@ -27,6 +27,7 @@ import ( conf2 "github.com/coze-dev/coze-loop/backend/modules/prompt/infra/conf" "github.com/coze-dev/coze-loop/backend/modules/prompt/infra/repo" "github.com/coze-dev/coze-loop/backend/modules/prompt/infra/repo/mysql" + "github.com/coze-dev/coze-loop/backend/modules/prompt/infra/repo/mysql/hooks" redis2 "github.com/coze-dev/coze-loop/backend/modules/prompt/infra/repo/redis" "github.com/coze-dev/coze-loop/backend/modules/prompt/infra/rpc" "github.com/coze-dev/coze-loop/backend/pkg/conf" @@ -37,8 +38,10 @@ import ( func InitPromptManageApplication(idgen2 idgen.IIDGenerator, db2 db.Provider, redisCli redis.Cmdable, meter metrics.Meter, configFactory conf.IConfigLoaderFactory, llmClient llmruntimeservice.Client, authClient authservice.Client, fileClient fileservice.Client, userClient userservice.Client, auditClient audit.IAuditService) (manage.PromptManageService, error) { iPromptBasicDAO := mysql.NewPromptBasicDAO(db2, redisCli) - iPromptCommitDAO := mysql.NewPromptCommitDAO(db2, redisCli) - iPromptUserDraftDAO := mysql.NewPromptUserDraftDAO(db2, redisCli) + iPromptCommitHook := hooks.NewEmptyPromptCommitHook() + iPromptCommitDAO := mysql.NewPromptCommitDAO(db2, redisCli, iPromptCommitHook) + iPromptUserDraftHook := hooks.NewEmptyPromptUserDraftHook() + iPromptUserDraftDAO := mysql.NewPromptUserDraftDAO(db2, redisCli, iPromptUserDraftHook) iCommitLabelMappingDAO := mysql.NewCommitLabelMappingDAO(db2, redisCli) iPromptRelationDAO := mysql.NewPromptRelationDAO(db2, redisCli) redisIPromptBasicDAO := redis2.NewPromptBasicDAO() @@ -78,8 +81,10 @@ func InitPromptDebugApplication(idgen2 idgen.IIDGenerator, db2 db.Provider, redi iToolConfigProvider := service.NewToolConfigProvider() iToolResultsCollector := service.NewToolResultsCollector() iPromptBasicDAO := mysql.NewPromptBasicDAO(db2, redisCli) - iPromptCommitDAO := mysql.NewPromptCommitDAO(db2, redisCli) - iPromptUserDraftDAO := mysql.NewPromptUserDraftDAO(db2, redisCli) + iPromptCommitHook := hooks.NewEmptyPromptCommitHook() + iPromptCommitDAO := mysql.NewPromptCommitDAO(db2, redisCli, iPromptCommitHook) + iPromptUserDraftHook := hooks.NewEmptyPromptUserDraftHook() + iPromptUserDraftDAO := mysql.NewPromptUserDraftDAO(db2, redisCli, iPromptUserDraftHook) iCommitLabelMappingDAO := mysql.NewCommitLabelMappingDAO(db2, redisCli) iPromptRelationDAO := mysql.NewPromptRelationDAO(db2, redisCli) redisIPromptBasicDAO := redis2.NewPromptBasicDAO() @@ -110,8 +115,10 @@ func InitPromptExecuteApplication(idgen2 idgen.IIDGenerator, db2 db.Provider, re iDebugContextDAO := mysql.NewDebugContextDAO(db2) iDebugContextRepo := repo.NewDebugContextRepo(idgen2, iDebugContextDAO) iPromptBasicDAO := mysql.NewPromptBasicDAO(db2, redisCli) - iPromptCommitDAO := mysql.NewPromptCommitDAO(db2, redisCli) - iPromptUserDraftDAO := mysql.NewPromptUserDraftDAO(db2, redisCli) + iPromptCommitHook := hooks.NewEmptyPromptCommitHook() + iPromptCommitDAO := mysql.NewPromptCommitDAO(db2, redisCli, iPromptCommitHook) + iPromptUserDraftHook := hooks.NewEmptyPromptUserDraftHook() + iPromptUserDraftDAO := mysql.NewPromptUserDraftDAO(db2, redisCli, iPromptUserDraftHook) iCommitLabelMappingDAO := mysql.NewCommitLabelMappingDAO(db2, redisCli) iPromptRelationDAO := mysql.NewPromptRelationDAO(db2, redisCli) redisIPromptBasicDAO := redis2.NewPromptBasicDAO() @@ -141,8 +148,10 @@ func InitPromptOpenAPIApplication(idgen2 idgen.IIDGenerator, db2 db.Provider, re iDebugContextDAO := mysql.NewDebugContextDAO(db2) iDebugContextRepo := repo.NewDebugContextRepo(idgen2, iDebugContextDAO) iPromptBasicDAO := mysql.NewPromptBasicDAO(db2, redisCli) - iPromptCommitDAO := mysql.NewPromptCommitDAO(db2, redisCli) - iPromptUserDraftDAO := mysql.NewPromptUserDraftDAO(db2, redisCli) + iPromptCommitHook := hooks.NewEmptyPromptCommitHook() + iPromptCommitDAO := mysql.NewPromptCommitDAO(db2, redisCli, iPromptCommitHook) + iPromptUserDraftHook := hooks.NewEmptyPromptUserDraftHook() + iPromptUserDraftDAO := mysql.NewPromptUserDraftDAO(db2, redisCli, iPromptUserDraftHook) iCommitLabelMappingDAO := mysql.NewCommitLabelMappingDAO(db2, redisCli) iPromptRelationDAO := mysql.NewPromptRelationDAO(db2, redisCli) redisIPromptBasicDAO := redis2.NewPromptBasicDAO() @@ -172,7 +181,7 @@ func InitPromptOpenAPIApplication(idgen2 idgen.IIDGenerator, db2 db.Provider, re // wire.go: var ( - promptDomainSet = wire.NewSet(service.NewPromptFormatter, service.NewToolConfigProvider, service.NewToolResultsCollector, service.NewPromptService, repo.NewManageRepo, repo.NewLabelRepo, repo.NewDebugLogRepo, repo.NewDebugContextRepo, mysql.NewPromptBasicDAO, mysql.NewPromptCommitDAO, mysql.NewPromptUserDraftDAO, mysql.NewPromptRelationDAO, mysql.NewLabelDAO, mysql.NewCommitLabelMappingDAO, mysql.NewDebugLogDAO, mysql.NewDebugContextDAO, redis2.NewPromptBasicDAO, redis2.NewPromptDAO, redis2.NewPromptLabelVersionDAO, conf2.NewPromptConfigProvider, rpc.NewLLMRPCProvider, rpc.NewAuthRPCProvider, rpc.NewFileRPCProvider, rpc.NewUserRPCProvider, rpc.NewAuditRPCProvider, collector.NewEventCollectorProvider, service.NewCozeLoopSnippetParser) + promptDomainSet = wire.NewSet(service.NewPromptFormatter, service.NewToolConfigProvider, service.NewToolResultsCollector, service.NewPromptService, repo.NewManageRepo, repo.NewLabelRepo, repo.NewDebugLogRepo, repo.NewDebugContextRepo, hooks.NewEmptyPromptCommitHook, hooks.NewEmptyPromptUserDraftHook, mysql.NewPromptBasicDAO, mysql.NewPromptCommitDAO, mysql.NewPromptUserDraftDAO, mysql.NewPromptRelationDAO, mysql.NewLabelDAO, mysql.NewCommitLabelMappingDAO, mysql.NewDebugLogDAO, mysql.NewDebugContextDAO, redis2.NewPromptBasicDAO, redis2.NewPromptDAO, redis2.NewPromptLabelVersionDAO, conf2.NewPromptConfigProvider, rpc.NewLLMRPCProvider, rpc.NewAuthRPCProvider, rpc.NewFileRPCProvider, rpc.NewUserRPCProvider, rpc.NewAuditRPCProvider, collector.NewEventCollectorProvider, service.NewCozeLoopSnippetParser) manageSet = wire.NewSet( NewPromptManageApplication, promptDomainSet, diff --git a/backend/modules/prompt/domain/entity/prompt_basic.go b/backend/modules/prompt/domain/entity/prompt_basic.go index 6c2bf277a..2f6225f30 100644 --- a/backend/modules/prompt/domain/entity/prompt_basic.go +++ b/backend/modules/prompt/domain/entity/prompt_basic.go @@ -6,15 +6,16 @@ package entity import "time" type PromptBasic struct { - PromptType PromptType `json:"prompt_type"` - DisplayName string `json:"display_name"` - Description string `json:"description"` - LatestVersion string `json:"latest_version"` - CreatedBy string `json:"created_by"` - UpdatedBy string `json:"updated_by"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` - LatestCommittedAt *time.Time `json:"latest_committed_at"` + PromptType PromptType `json:"prompt_type"` + SecurityLevel SecurityLevel `json:"security_level"` + DisplayName string `json:"display_name"` + Description string `json:"description"` + LatestVersion string `json:"latest_version"` + CreatedBy string `json:"created_by"` + UpdatedBy string `json:"updated_by"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + LatestCommittedAt *time.Time `json:"latest_committed_at"` } type PromptType string @@ -23,3 +24,12 @@ const ( PromptTypeNormal PromptType = "normal" PromptTypeSnippet PromptType = "snippet" ) + +type SecurityLevel string + +const ( + SecurityLevelL1 SecurityLevel = "L1" + SecurityLevelL2 SecurityLevel = "L2" + SecurityLevelL3 SecurityLevel = "L3" + SecurityLevelL4 SecurityLevel = "L4" +) diff --git a/backend/modules/prompt/domain/repo/manage.go b/backend/modules/prompt/domain/repo/manage.go index 6454e96b8..a91f078c9 100644 --- a/backend/modules/prompt/domain/repo/manage.go +++ b/backend/modules/prompt/domain/repo/manage.go @@ -63,6 +63,7 @@ type UpdatePromptParam struct { PromptName string PromptDescription string + SecurityLevel entity.SecurityLevel } type CommitDraftParam struct { diff --git a/backend/modules/prompt/infra/repo/manage.go b/backend/modules/prompt/infra/repo/manage.go index d741724ec..aba9802c7 100644 --- a/backend/modules/prompt/infra/repo/manage.go +++ b/backend/modules/prompt/infra/repo/manage.go @@ -513,8 +513,9 @@ func (d *ManageRepoImpl) UpdatePrompt(ctx context.Context, param repo.UpdateProm updateFields := map[string]interface{}{ q.PromptBasic.UpdatedBy.ColumnName().String(): param.UpdatedBy, - q.PromptBasic.Name.ColumnName().String(): param.PromptName, - q.PromptBasic.Description.ColumnName().String(): param.PromptDescription, + q.PromptBasic.Name.ColumnName().String(): param.PromptName, + q.PromptBasic.Description.ColumnName().String(): param.PromptDescription, + q.PromptBasic.SecurityLevel.ColumnName().String(): param.SecurityLevel, } err = d.promptBasicDAO.Update(ctx, param.PromptID, updateFields) if err != nil { diff --git a/backend/modules/prompt/infra/repo/mysql/convertor/manage.go b/backend/modules/prompt/infra/repo/mysql/convertor/manage.go index 9882eee56..266f55f07 100644 --- a/backend/modules/prompt/infra/repo/mysql/convertor/manage.go +++ b/backend/modules/prompt/infra/repo/mysql/convertor/manage.go @@ -80,6 +80,7 @@ func BasicPO2DO(promptPO *model.PromptBasic) *entity.PromptBasic { CreatedAt: promptPO.CreatedAt, UpdatedAt: promptPO.UpdatedAt, LatestCommittedAt: promptPO.LatestCommitTime, + SecurityLevel: entity.SecurityLevel(promptPO.SecurityLevel), } } @@ -149,6 +150,7 @@ func PromptDO2BasicPO(do *entity.Prompt) *model.PromptBasic { CreatedAt: do.PromptBasic.CreatedAt, UpdatedAt: do.PromptBasic.UpdatedAt, PromptType: PromptTypeDO2PO(do.PromptBasic.PromptType), + SecurityLevel: string(do.PromptBasic.SecurityLevel), } } diff --git a/backend/modules/prompt/infra/repo/mysql/gorm_gen/model/prompt_basic.gen.go b/backend/modules/prompt/infra/repo/mysql/gorm_gen/model/prompt_basic.gen.go index 3845b063f..4a1018e6d 100644 --- a/backend/modules/prompt/infra/repo/mysql/gorm_gen/model/prompt_basic.gen.go +++ b/backend/modules/prompt/infra/repo/mysql/gorm_gen/model/prompt_basic.gen.go @@ -27,6 +27,7 @@ type PromptBasic struct { UpdatedAt time.Time `gorm:"column:updated_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 DeletedAt soft_delete.DeletedAt `gorm:"column:deleted_at;type:bigint(20);not null;uniqueIndex:uniq_space_id_prompt_key_deleted_at,priority:3;index:idx_pid_ptype_delat,priority:3;column:deleted_at;not null;default:0;softDelete:milli;comment:删除时间" json:"deleted_at"` // 删除时间 PromptType string `gorm:"column:prompt_type;type:varchar(64);not null;index:idx_pid_ptype_delat,priority:2;default:normal;comment:Prompt类型" json:"prompt_type"` // Prompt类型 + SecurityLevel string `gorm:"column:security_level;type:varchar(64);not null;default:L3;comment:security level" json:"security_level"` // security level } // TableName PromptBasic's table name diff --git a/backend/modules/prompt/infra/repo/mysql/gorm_gen/model/prompt_commit.gen.go b/backend/modules/prompt/infra/repo/mysql/gorm_gen/model/prompt_commit.gen.go index 518af502c..b92ad1727 100644 --- a/backend/modules/prompt/infra/repo/mysql/gorm_gen/model/prompt_commit.gen.go +++ b/backend/modules/prompt/infra/repo/mysql/gorm_gen/model/prompt_commit.gen.go @@ -12,26 +12,27 @@ const TableNamePromptCommit = "prompt_commit" // PromptCommit Commit表 type PromptCommit struct { - ID int64 `gorm:"column:id;type:bigint(20) unsigned;primaryKey;autoIncrement:true;comment:主键ID" json:"id"` // 主键ID - SpaceID int64 `gorm:"column:space_id;type:bigint(20) unsigned;not null;comment:空间ID" json:"space_id"` // 空间ID - PromptID int64 `gorm:"column:prompt_id;type:bigint(20) unsigned;not null;uniqueIndex:uniq_prompt_id_version,priority:1;comment:Prompt ID" json:"prompt_id"` // Prompt ID - PromptKey string `gorm:"column:prompt_key;type:varchar(128);not null;index:idx_prompt_key_version,priority:1;comment:Prompt key" json:"prompt_key"` // Prompt key - TemplateType *string `gorm:"column:template_type;type:varchar(64);default:normal;comment:模版类型" json:"template_type"` // 模版类型 - Messages *string `gorm:"column:messages;type:longtext;comment:托管消息列表" json:"messages"` // 托管消息列表 - ModelConfig *string `gorm:"column:model_config;type:text;comment:模型配置" json:"model_config"` // 模型配置 - VariableDefs *string `gorm:"column:variable_defs;type:text;comment:变量定义" json:"variable_defs"` // 变量定义 - Tools *string `gorm:"column:tools;type:longtext;comment:tools" json:"tools"` // tools - ToolCallConfig *string `gorm:"column:tool_call_config;type:text;comment:tool调用配置" json:"tool_call_config"` // tool调用配置 - Metadata *string `gorm:"column:metadata;type:text;comment:模板元信息" json:"metadata"` // 模板元信息 - McpConfig *string `gorm:"column:mcp_config;type:text;comment:mcp config info" json:"mcp_config"` // mcp config info - Version string `gorm:"column:version;type:varchar(128);not null;uniqueIndex:uniq_prompt_id_version,priority:2;index:idx_prompt_key_version,priority:2;comment:版本" json:"version"` // 版本 - BaseVersion string `gorm:"column:base_version;type:varchar(128);not null;comment:来源版本" json:"base_version"` // 来源版本 - CommittedBy string `gorm:"column:committed_by;type:varchar(128);not null;comment:提交人" json:"committed_by"` // 提交人 - Description *string `gorm:"column:description;type:text;comment:提交版本描述" json:"description"` // 提交版本描述 - ExtInfo *string `gorm:"column:ext_info;type:text;comment:扩展字段" json:"ext_info"` // 扩展字段 - CreatedAt time.Time `gorm:"column:created_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt time.Time `gorm:"column:updated_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - HasSnippets bool `gorm:"column:has_snippets;type:tinyint(1);not null;comment:是否包含prompt片段" json:"has_snippets"` // 是否包含prompt片段 + ID int64 `gorm:"column:id;type:bigint(20) unsigned;primaryKey;autoIncrement:true;comment:主键ID" json:"id"` // 主键ID + SpaceID int64 `gorm:"column:space_id;type:bigint(20) unsigned;not null;comment:空间ID" json:"space_id"` // 空间ID + PromptID int64 `gorm:"column:prompt_id;type:bigint(20) unsigned;not null;uniqueIndex:uniq_prompt_id_version,priority:1;comment:Prompt ID" json:"prompt_id"` // Prompt ID + PromptKey string `gorm:"column:prompt_key;type:varchar(128);not null;index:idx_prompt_key_version,priority:1;comment:Prompt key" json:"prompt_key"` // Prompt key + TemplateType *string `gorm:"column:template_type;type:varchar(64);default:normal;comment:模版类型" json:"template_type"` // 模版类型 + Messages *string `gorm:"column:messages;type:longtext;comment:托管消息列表" json:"messages"` // 托管消息列表 + ModelConfig *string `gorm:"column:model_config;type:text;comment:模型配置" json:"model_config"` // 模型配置 + VariableDefs *string `gorm:"column:variable_defs;type:text;comment:变量定义" json:"variable_defs"` // 变量定义 + Tools *string `gorm:"column:tools;type:longtext;comment:tools" json:"tools"` // tools + ToolCallConfig *string `gorm:"column:tool_call_config;type:text;comment:tool调用配置" json:"tool_call_config"` // tool调用配置 + Metadata *string `gorm:"column:metadata;type:text;comment:模板元信息" json:"metadata"` // 模板元信息 + McpConfig *string `gorm:"column:mcp_config;type:text;comment:mcp config info" json:"mcp_config"` // mcp config info + Version string `gorm:"column:version;type:varchar(128);not null;uniqueIndex:uniq_prompt_id_version,priority:2;index:idx_prompt_key_version,priority:2;comment:版本" json:"version"` // 版本 + BaseVersion string `gorm:"column:base_version;type:varchar(128);not null;comment:来源版本" json:"base_version"` // 来源版本 + CommittedBy string `gorm:"column:committed_by;type:varchar(128);not null;comment:提交人" json:"committed_by"` // 提交人 + Description *string `gorm:"column:description;type:text;comment:提交版本描述" json:"description"` // 提交版本描述 + ExtInfo *string `gorm:"column:ext_info;type:text;comment:扩展字段" json:"ext_info"` // 扩展字段 + CreatedAt time.Time `gorm:"column:created_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 + UpdatedAt time.Time `gorm:"column:updated_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 + HasSnippets bool `gorm:"column:has_snippets;type:tinyint(1);not null;comment:是否包含prompt片段" json:"has_snippets"` // 是否包含prompt片段 + EncryptMessages *string `gorm:"column:encrypt_messages;type:longtext;comment:encrypt message list" json:"encrypt_messages"` // encrypt message list } // TableName PromptCommit's table name diff --git a/backend/modules/prompt/infra/repo/mysql/gorm_gen/model/prompt_user_draft.gen.go b/backend/modules/prompt/infra/repo/mysql/gorm_gen/model/prompt_user_draft.gen.go index 5da4d102e..fcc4f1144 100644 --- a/backend/modules/prompt/infra/repo/mysql/gorm_gen/model/prompt_user_draft.gen.go +++ b/backend/modules/prompt/infra/repo/mysql/gorm_gen/model/prompt_user_draft.gen.go @@ -14,25 +14,26 @@ const TableNamePromptUserDraft = "prompt_user_draft" // PromptUserDraft Draft表 type PromptUserDraft struct { - ID int64 `gorm:"column:id;type:bigint(20) unsigned;primaryKey;comment:主键ID" json:"id"` // 主键ID - SpaceID int64 `gorm:"column:space_id;type:bigint(20) unsigned;not null;comment:空间ID" json:"space_id"` // 空间ID - PromptID int64 `gorm:"column:prompt_id;type:bigint(20) unsigned;not null;uniqueIndex:uniq_prompt_id_user_id_deleted_at,priority:1;index:idx_prompt_id_user_id,priority:1;comment:Prompt ID" json:"prompt_id"` // Prompt ID - UserID string `gorm:"column:user_id;type:varchar(128);not null;uniqueIndex:uniq_prompt_id_user_id_deleted_at,priority:2;index:idx_prompt_id_user_id,priority:2;comment:用户ID" json:"user_id"` // 用户ID - TemplateType *string `gorm:"column:template_type;type:varchar(64);default:Normal;comment:模版类型" json:"template_type"` // 模版类型 - Messages *string `gorm:"column:messages;type:longtext;comment:托管消息列表" json:"messages"` // 托管消息列表 - ModelConfig *string `gorm:"column:model_config;type:text;comment:模型配置" json:"model_config"` // 模型配置 - VariableDefs *string `gorm:"column:variable_defs;type:text;comment:变量定义" json:"variable_defs"` // 变量定义 - Tools *string `gorm:"column:tools;type:longtext;comment:tools" json:"tools"` // tools - ToolCallConfig *string `gorm:"column:tool_call_config;type:text;comment:tool调用配置" json:"tool_call_config"` // tool调用配置 - Metadata *string `gorm:"column:metadata;type:text;comment:模板元信息" json:"metadata"` // 模板元信息 - McpConfig *string `gorm:"column:mcp_config;type:text;comment:mcp config info" json:"mcp_config"` // mcp config info - BaseVersion string `gorm:"column:base_version;type:varchar(128);not null;comment:草稿关联版本" json:"base_version"` // 草稿关联版本 - IsDraftEdited int32 `gorm:"column:is_draft_edited;type:tinyint(4);not null;comment:草稿内容是否基于BaseVersion有变更" json:"is_draft_edited"` // 草稿内容是否基于BaseVersion有变更 - ExtInfo *string `gorm:"column:ext_info;type:text;comment:扩展字段" json:"ext_info"` // 扩展字段 - CreatedAt time.Time `gorm:"column:created_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt time.Time `gorm:"column:updated_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt soft_delete.DeletedAt `gorm:"column:deleted_at;type:bigint(20);not null;uniqueIndex:uniq_prompt_id_user_id_deleted_at,priority:3;column:deleted_at;not null;default:0;softDelete:milli;comment:删除时间" json:"deleted_at"` // 删除时间 - HasSnippets bool `gorm:"column:has_snippets;type:tinyint(1);not null;comment:是否包含prompt片段" json:"has_snippets"` // 是否包含prompt片段 + ID int64 `gorm:"column:id;type:bigint(20) unsigned;primaryKey;comment:主键ID" json:"id"` // 主键ID + SpaceID int64 `gorm:"column:space_id;type:bigint(20) unsigned;not null;comment:空间ID" json:"space_id"` // 空间ID + PromptID int64 `gorm:"column:prompt_id;type:bigint(20) unsigned;not null;uniqueIndex:uniq_prompt_id_user_id_deleted_at,priority:1;index:idx_prompt_id_user_id,priority:1;comment:Prompt ID" json:"prompt_id"` // Prompt ID + UserID string `gorm:"column:user_id;type:varchar(128);not null;uniqueIndex:uniq_prompt_id_user_id_deleted_at,priority:2;index:idx_prompt_id_user_id,priority:2;comment:用户ID" json:"user_id"` // 用户ID + TemplateType *string `gorm:"column:template_type;type:varchar(64);default:Normal;comment:模版类型" json:"template_type"` // 模版类型 + Messages *string `gorm:"column:messages;type:longtext;comment:托管消息列表" json:"messages"` // 托管消息列表 + ModelConfig *string `gorm:"column:model_config;type:text;comment:模型配置" json:"model_config"` // 模型配置 + VariableDefs *string `gorm:"column:variable_defs;type:text;comment:变量定义" json:"variable_defs"` // 变量定义 + Tools *string `gorm:"column:tools;type:longtext;comment:tools" json:"tools"` // tools + ToolCallConfig *string `gorm:"column:tool_call_config;type:text;comment:tool调用配置" json:"tool_call_config"` // tool调用配置 + Metadata *string `gorm:"column:metadata;type:text;comment:模板元信息" json:"metadata"` // 模板元信息 + McpConfig *string `gorm:"column:mcp_config;type:text;comment:mcp config info" json:"mcp_config"` // mcp config info + BaseVersion string `gorm:"column:base_version;type:varchar(128);not null;comment:草稿关联版本" json:"base_version"` // 草稿关联版本 + IsDraftEdited int32 `gorm:"column:is_draft_edited;type:tinyint(4);not null;comment:草稿内容是否基于BaseVersion有变更" json:"is_draft_edited"` // 草稿内容是否基于BaseVersion有变更 + ExtInfo *string `gorm:"column:ext_info;type:text;comment:扩展字段" json:"ext_info"` // 扩展字段 + CreatedAt time.Time `gorm:"column:created_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 + UpdatedAt time.Time `gorm:"column:updated_at;type:datetime;not null;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 + DeletedAt soft_delete.DeletedAt `gorm:"column:deleted_at;type:bigint(20);not null;uniqueIndex:uniq_prompt_id_user_id_deleted_at,priority:3;column:deleted_at;not null;default:0;softDelete:milli;comment:删除时间" json:"deleted_at"` // 删除时间 + HasSnippets bool `gorm:"column:has_snippets;type:tinyint(1);not null;comment:是否包含prompt片段" json:"has_snippets"` // 是否包含prompt片段 + EncryptMessages *string `gorm:"column:encrypt_messages;type:longtext;comment:encrypt message list" json:"encrypt_messages"` // encrypt message list } // TableName PromptUserDraft's table name diff --git a/backend/modules/prompt/infra/repo/mysql/gorm_gen/query/prompt_basic.gen.go b/backend/modules/prompt/infra/repo/mysql/gorm_gen/query/prompt_basic.gen.go index c9a43121c..28f306402 100644 --- a/backend/modules/prompt/infra/repo/mysql/gorm_gen/query/prompt_basic.gen.go +++ b/backend/modules/prompt/infra/repo/mysql/gorm_gen/query/prompt_basic.gen.go @@ -40,6 +40,7 @@ func newPromptBasic(db *gorm.DB, opts ...gen.DOOption) promptBasic { _promptBasic.UpdatedAt = field.NewTime(tableName, "updated_at") _promptBasic.DeletedAt = field.NewField(tableName, "deleted_at") _promptBasic.PromptType = field.NewString(tableName, "prompt_type") + _promptBasic.SecurityLevel = field.NewString(tableName, "security_level") _promptBasic.fillFieldMap() @@ -64,6 +65,7 @@ type promptBasic struct { UpdatedAt field.Time // 更新时间 DeletedAt field.Field // 删除时间 PromptType field.String // Prompt类型 + SecurityLevel field.String // security level fieldMap map[string]field.Expr } @@ -93,6 +95,7 @@ func (p *promptBasic) updateTableName(table string) *promptBasic { p.UpdatedAt = field.NewTime(table, "updated_at") p.DeletedAt = field.NewField(table, "deleted_at") p.PromptType = field.NewString(table, "prompt_type") + p.SecurityLevel = field.NewString(table, "security_level") p.fillFieldMap() @@ -119,7 +122,7 @@ func (p *promptBasic) GetFieldByName(fieldName string) (field.OrderExpr, bool) { } func (p *promptBasic) fillFieldMap() { - p.fieldMap = make(map[string]field.Expr, 13) + p.fieldMap = make(map[string]field.Expr, 14) p.fieldMap["id"] = p.ID p.fieldMap["space_id"] = p.SpaceID p.fieldMap["prompt_key"] = p.PromptKey @@ -133,6 +136,7 @@ func (p *promptBasic) fillFieldMap() { p.fieldMap["updated_at"] = p.UpdatedAt p.fieldMap["deleted_at"] = p.DeletedAt p.fieldMap["prompt_type"] = p.PromptType + p.fieldMap["security_level"] = p.SecurityLevel } func (p promptBasic) clone(db *gorm.DB) promptBasic { diff --git a/backend/modules/prompt/infra/repo/mysql/gorm_gen/query/prompt_commit.gen.go b/backend/modules/prompt/infra/repo/mysql/gorm_gen/query/prompt_commit.gen.go index 33de37829..7db1b07c6 100644 --- a/backend/modules/prompt/infra/repo/mysql/gorm_gen/query/prompt_commit.gen.go +++ b/backend/modules/prompt/infra/repo/mysql/gorm_gen/query/prompt_commit.gen.go @@ -47,6 +47,7 @@ func newPromptCommit(db *gorm.DB, opts ...gen.DOOption) promptCommit { _promptCommit.CreatedAt = field.NewTime(tableName, "created_at") _promptCommit.UpdatedAt = field.NewTime(tableName, "updated_at") _promptCommit.HasSnippets = field.NewBool(tableName, "has_snippets") + _promptCommit.EncryptMessages = field.NewString(tableName, "encrypt_messages") _promptCommit.fillFieldMap() @@ -57,27 +58,28 @@ func newPromptCommit(db *gorm.DB, opts ...gen.DOOption) promptCommit { type promptCommit struct { promptCommitDo promptCommitDo - ALL field.Asterisk - ID field.Int64 // 主键ID - SpaceID field.Int64 // 空间ID - PromptID field.Int64 // Prompt ID - PromptKey field.String // Prompt key - TemplateType field.String // 模版类型 - Messages field.String // 托管消息列表 - ModelConfig field.String // 模型配置 - VariableDefs field.String // 变量定义 - Tools field.String // tools - ToolCallConfig field.String // tool调用配置 - Metadata field.String // 模板元信息 - McpConfig field.String // mcp config info - Version field.String // 版本 - BaseVersion field.String // 来源版本 - CommittedBy field.String // 提交人 - Description field.String // 提交版本描述 - ExtInfo field.String // 扩展字段 - CreatedAt field.Time // 创建时间 - UpdatedAt field.Time // 更新时间 - HasSnippets field.Bool // 是否包含prompt片段 + ALL field.Asterisk + ID field.Int64 // 主键ID + SpaceID field.Int64 // 空间ID + PromptID field.Int64 // Prompt ID + PromptKey field.String // Prompt key + TemplateType field.String // 模版类型 + Messages field.String // 托管消息列表 + ModelConfig field.String // 模型配置 + VariableDefs field.String // 变量定义 + Tools field.String // tools + ToolCallConfig field.String // tool调用配置 + Metadata field.String // 模板元信息 + McpConfig field.String // mcp config info + Version field.String // 版本 + BaseVersion field.String // 来源版本 + CommittedBy field.String // 提交人 + Description field.String // 提交版本描述 + ExtInfo field.String // 扩展字段 + CreatedAt field.Time // 创建时间 + UpdatedAt field.Time // 更新时间 + HasSnippets field.Bool // 是否包含prompt片段 + EncryptMessages field.String // encrypt message list fieldMap map[string]field.Expr } @@ -114,6 +116,7 @@ func (p *promptCommit) updateTableName(table string) *promptCommit { p.CreatedAt = field.NewTime(table, "created_at") p.UpdatedAt = field.NewTime(table, "updated_at") p.HasSnippets = field.NewBool(table, "has_snippets") + p.EncryptMessages = field.NewString(table, "encrypt_messages") p.fillFieldMap() @@ -142,7 +145,7 @@ func (p *promptCommit) GetFieldByName(fieldName string) (field.OrderExpr, bool) } func (p *promptCommit) fillFieldMap() { - p.fieldMap = make(map[string]field.Expr, 20) + p.fieldMap = make(map[string]field.Expr, 21) p.fieldMap["id"] = p.ID p.fieldMap["space_id"] = p.SpaceID p.fieldMap["prompt_id"] = p.PromptID @@ -163,6 +166,7 @@ func (p *promptCommit) fillFieldMap() { p.fieldMap["created_at"] = p.CreatedAt p.fieldMap["updated_at"] = p.UpdatedAt p.fieldMap["has_snippets"] = p.HasSnippets + p.fieldMap["encrypt_messages"] = p.EncryptMessages } func (p promptCommit) clone(db *gorm.DB) promptCommit { diff --git a/backend/modules/prompt/infra/repo/mysql/gorm_gen/query/prompt_user_draft.gen.go b/backend/modules/prompt/infra/repo/mysql/gorm_gen/query/prompt_user_draft.gen.go index ddc543753..15d9fcfb4 100644 --- a/backend/modules/prompt/infra/repo/mysql/gorm_gen/query/prompt_user_draft.gen.go +++ b/backend/modules/prompt/infra/repo/mysql/gorm_gen/query/prompt_user_draft.gen.go @@ -46,6 +46,7 @@ func newPromptUserDraft(db *gorm.DB, opts ...gen.DOOption) promptUserDraft { _promptUserDraft.UpdatedAt = field.NewTime(tableName, "updated_at") _promptUserDraft.DeletedAt = field.NewField(tableName, "deleted_at") _promptUserDraft.HasSnippets = field.NewBool(tableName, "has_snippets") + _promptUserDraft.EncryptMessages = field.NewString(tableName, "encrypt_messages") _promptUserDraft.fillFieldMap() @@ -56,26 +57,27 @@ func newPromptUserDraft(db *gorm.DB, opts ...gen.DOOption) promptUserDraft { type promptUserDraft struct { promptUserDraftDo promptUserDraftDo - ALL field.Asterisk - ID field.Int64 // 主键ID - SpaceID field.Int64 // 空间ID - PromptID field.Int64 // Prompt ID - UserID field.String // 用户ID - TemplateType field.String // 模版类型 - Messages field.String // 托管消息列表 - ModelConfig field.String // 模型配置 - VariableDefs field.String // 变量定义 - Tools field.String // tools - ToolCallConfig field.String // tool调用配置 - Metadata field.String // 模板元信息 - McpConfig field.String // mcp config info - BaseVersion field.String // 草稿关联版本 - IsDraftEdited field.Int32 // 草稿内容是否基于BaseVersion有变更 - ExtInfo field.String // 扩展字段 - CreatedAt field.Time // 创建时间 - UpdatedAt field.Time // 更新时间 - DeletedAt field.Field // 删除时间 - HasSnippets field.Bool // 是否包含prompt片段 + ALL field.Asterisk + ID field.Int64 // 主键ID + SpaceID field.Int64 // 空间ID + PromptID field.Int64 // Prompt ID + UserID field.String // 用户ID + TemplateType field.String // 模版类型 + Messages field.String // 托管消息列表 + ModelConfig field.String // 模型配置 + VariableDefs field.String // 变量定义 + Tools field.String // tools + ToolCallConfig field.String // tool调用配置 + Metadata field.String // 模板元信息 + McpConfig field.String // mcp config info + BaseVersion field.String // 草稿关联版本 + IsDraftEdited field.Int32 // 草稿内容是否基于BaseVersion有变更 + ExtInfo field.String // 扩展字段 + CreatedAt field.Time // 创建时间 + UpdatedAt field.Time // 更新时间 + DeletedAt field.Field // 删除时间 + HasSnippets field.Bool // 是否包含prompt片段 + EncryptMessages field.String // encrypt message list fieldMap map[string]field.Expr } @@ -111,6 +113,7 @@ func (p *promptUserDraft) updateTableName(table string) *promptUserDraft { p.UpdatedAt = field.NewTime(table, "updated_at") p.DeletedAt = field.NewField(table, "deleted_at") p.HasSnippets = field.NewBool(table, "has_snippets") + p.EncryptMessages = field.NewString(table, "encrypt_messages") p.fillFieldMap() @@ -139,7 +142,7 @@ func (p *promptUserDraft) GetFieldByName(fieldName string) (field.OrderExpr, boo } func (p *promptUserDraft) fillFieldMap() { - p.fieldMap = make(map[string]field.Expr, 19) + p.fieldMap = make(map[string]field.Expr, 20) p.fieldMap["id"] = p.ID p.fieldMap["space_id"] = p.SpaceID p.fieldMap["prompt_id"] = p.PromptID @@ -159,6 +162,7 @@ func (p *promptUserDraft) fillFieldMap() { p.fieldMap["updated_at"] = p.UpdatedAt p.fieldMap["deleted_at"] = p.DeletedAt p.fieldMap["has_snippets"] = p.HasSnippets + p.fieldMap["encrypt_messages"] = p.EncryptMessages } func (p promptUserDraft) clone(db *gorm.DB) promptUserDraft { diff --git a/backend/modules/prompt/infra/repo/mysql/hooks/prompt_commit_hook.go b/backend/modules/prompt/infra/repo/mysql/hooks/prompt_commit_hook.go new file mode 100644 index 000000000..31038b93e --- /dev/null +++ b/backend/modules/prompt/infra/repo/mysql/hooks/prompt_commit_hook.go @@ -0,0 +1,26 @@ +package hooks + +import ( + "context" + + "github.com/coze-dev/coze-loop/backend/modules/prompt/infra/repo/mysql/gorm_gen/model" +) + +type IPromptCommitHook interface { + BeforeSave(context.Context, *model.PromptCommit) error + AfterFind(context.Context, []*model.PromptCommit) error +} + +type EmptyPromptCommitHook struct{} + +func NewEmptyPromptCommitHook() IPromptCommitHook { + return &EmptyPromptCommitHook{} +} + +func (h *EmptyPromptCommitHook) BeforeSave(_ context.Context, _ *model.PromptCommit) error { + return nil +} + +func (h *EmptyPromptCommitHook) AfterFind(_ context.Context, _ []*model.PromptCommit) error { + return nil +} diff --git a/backend/modules/prompt/infra/repo/mysql/hooks/prompt_user_draft_hook.go b/backend/modules/prompt/infra/repo/mysql/hooks/prompt_user_draft_hook.go new file mode 100644 index 000000000..cba896698 --- /dev/null +++ b/backend/modules/prompt/infra/repo/mysql/hooks/prompt_user_draft_hook.go @@ -0,0 +1,26 @@ +package hooks + +import ( + "context" + + "github.com/coze-dev/coze-loop/backend/modules/prompt/infra/repo/mysql/gorm_gen/model" +) + +type IPromptUserDraftHook interface { + BeforeSave(context.Context, *model.PromptUserDraft) error + AfterFind(context.Context, []*model.PromptUserDraft) error +} + +type EmptyPromptUserDraftHook struct{} + +func NewEmptyPromptUserDraftHook() IPromptUserDraftHook { + return &EmptyPromptUserDraftHook{} +} + +func (h *EmptyPromptUserDraftHook) BeforeSave(_ context.Context, _ *model.PromptUserDraft) error { + return nil +} + +func (h *EmptyPromptUserDraftHook) AfterFind(_ context.Context, _ []*model.PromptUserDraft) error { + return nil +} diff --git a/backend/modules/prompt/infra/repo/mysql/prompt_commit.go b/backend/modules/prompt/infra/repo/mysql/prompt_commit.go index de0ba3b61..cd27de9eb 100644 --- a/backend/modules/prompt/infra/repo/mysql/prompt_commit.go +++ b/backend/modules/prompt/infra/repo/mysql/prompt_commit.go @@ -9,6 +9,7 @@ import ( "fmt" "time" + "github.com/coze-dev/coze-loop/backend/modules/prompt/infra/repo/mysql/hooks" "gorm.io/gorm" "github.com/coze-dev/coze-loop/backend/infra/db" @@ -41,12 +42,14 @@ type ListCommitParam struct { type PromptCommitDAOImpl struct { db db.Provider writeTracker platestwrite.ILatestWriteTracker + hook hooks.IPromptCommitHook } -func NewPromptCommitDAO(db db.Provider, redisCli redis.Cmdable) IPromptCommitDAO { +func NewPromptCommitDAO(db db.Provider, redisCli redis.Cmdable, hook hooks.IPromptCommitHook) IPromptCommitDAO { return &PromptCommitDAOImpl{ db: db, writeTracker: platestwrite.NewLatestWriteTracker(redisCli), + hook: hook, } } @@ -62,6 +65,9 @@ func (d *PromptCommitDAOImpl) Create(ctx context.Context, promptCommitPO *model. q := query.Use(d.db.NewSession(ctx, opts...)).WithContext(ctx) promptCommitPO.CreatedAt = timeNow promptCommitPO.UpdatedAt = timeNow + if err := d.hook.BeforeSave(ctx, promptCommitPO); err != nil { + return errorx.WrapByCode(err, prompterr.CommonMySqlErrorCode) + } err = q.PromptCommit.Create(promptCommitPO) if err != nil { if errors.Is(err, gorm.ErrDuplicatedKey) { @@ -90,6 +96,9 @@ func (d *PromptCommitDAOImpl) Get(ctx context.Context, promptID int64, commitVer if len(promptCommitPOs) <= 0 { return nil, nil } + if err := d.hook.AfterFind(ctx, promptCommitPOs); err != nil { + return nil, errorx.WrapByCode(err, prompterr.CommonMySqlErrorCode) + } return promptCommitPOs[0], nil } @@ -111,6 +120,9 @@ func (d *PromptCommitDAOImpl) MGet(ctx context.Context, pairs []PromptIDCommitVe if len(promptCommitPOs) <= 0 { return nil, nil } + if err := d.hook.AfterFind(ctx, promptCommitPOs); err != nil { + return nil, errorx.WrapByCode(err, prompterr.CommonMySqlErrorCode) + } pairCommitPOMap = make(map[PromptIDCommitVersionPair]*model.PromptCommit) for _, po := range promptCommitPOs { pairCommitPOMap[PromptIDCommitVersionPair{ @@ -153,6 +165,9 @@ func (d *PromptCommitDAOImpl) List(ctx context.Context, param ListCommitParam, o if len(commitPOs) <= 0 { return nil, nil } + if err := d.hook.AfterFind(ctx, commitPOs); err != nil { + return nil, errorx.WrapByCode(err, prompterr.CommonMySqlErrorCode) + } return commitPOs, nil } @@ -175,6 +190,9 @@ func (d *PromptCommitDAOImpl) MGetVersionsByPromptID(ctx context.Context, prompt if len(commitPOs) == 0 { return nil, nil } + if err := d.hook.AfterFind(ctx, commitPOs); err != nil { + return nil, errorx.WrapByCode(err, prompterr.CommonMySqlErrorCode) + } versions = make([]string, 0, len(commitPOs)) for _, po := range commitPOs { if po == nil || po.Version == "" { diff --git a/backend/modules/prompt/infra/repo/mysql/prompt_user_draft.go b/backend/modules/prompt/infra/repo/mysql/prompt_user_draft.go index 9243a9e8f..7fb45049c 100644 --- a/backend/modules/prompt/infra/repo/mysql/prompt_user_draft.go +++ b/backend/modules/prompt/infra/repo/mysql/prompt_user_draft.go @@ -8,6 +8,7 @@ import ( "fmt" "time" + "github.com/coze-dev/coze-loop/backend/modules/prompt/infra/repo/mysql/hooks" "github.com/samber/lo" "github.com/coze-dev/coze-loop/backend/infra/db" @@ -32,12 +33,14 @@ type IPromptUserDraftDAO interface { type PromptUserDraftDAOImpl struct { db db.Provider writeTracker platestwrite.ILatestWriteTracker + hook hooks.IPromptUserDraftHook } -func NewPromptUserDraftDAO(db db.Provider, redisCli redis.Cmdable) IPromptUserDraftDAO { +func NewPromptUserDraftDAO(db db.Provider, redisCli redis.Cmdable, hook hooks.IPromptUserDraftHook) IPromptUserDraftDAO { return &PromptUserDraftDAOImpl{ db: db, writeTracker: platestwrite.NewLatestWriteTracker(redisCli), + hook: hook, } } @@ -55,6 +58,11 @@ func (d *PromptUserDraftDAOImpl) Create(ctx context.Context, promptDraftPO *mode q := query.Use(d.db.NewSession(ctx, opts...)).WithContext(ctx) promptDraftPO.CreatedAt = time.Time{} promptDraftPO.UpdatedAt = time.Time{} + err = d.hook.BeforeSave(ctx, promptDraftPO) + if err != nil { + return errorx.WrapByCode(err, prompterr.CommonMySqlErrorCode) + } + err = q.PromptUserDraft.Create(promptDraftPO) if err != nil { return errorx.WrapByCode(err, prompterr.CommonMySqlErrorCode) @@ -80,6 +88,10 @@ func (d *PromptUserDraftDAOImpl) Get(ctx context.Context, promptID int64, userID if len(promptDraftPOs) <= 0 { return nil, nil } + err = d.hook.AfterFind(ctx, promptDraftPOs) + if err != nil { + return nil, errorx.WrapByCode(err, prompterr.CommonMySqlErrorCode) + } return promptDraftPOs[0], nil } @@ -97,6 +109,10 @@ func (d *PromptUserDraftDAOImpl) GetByID(ctx context.Context, draftID int64, opt if len(promptDraftPOs) <= 0 { return nil, nil } + err = d.hook.AfterFind(ctx, promptDraftPOs) + if err != nil { + return nil, errorx.WrapByCode(err, prompterr.CommonMySqlErrorCode) + } return promptDraftPOs[0], nil } @@ -120,6 +136,10 @@ func (d *PromptUserDraftDAOImpl) MGet(ctx context.Context, pairs []PromptIDUserI if len(promptDraftPOs) <= 0 { return nil, nil } + err = d.hook.AfterFind(ctx, promptDraftPOs) + if err != nil { + return nil, errorx.WrapByCode(err, prompterr.CommonMySqlErrorCode) + } pairDraftPOMap = make(map[PromptIDUserIDPair]*model.PromptUserDraft, len(promptDraftPOs)) for _, promptDraftPO := range promptDraftPOs { if promptDraftPO == nil { @@ -140,21 +160,26 @@ func (d *PromptUserDraftDAOImpl) Update(ctx context.Context, promptDraftPO *mode if promptDraftPO == nil { return errorx.New("promptDraftPO is empty") } + err = d.hook.BeforeSave(ctx, promptDraftPO) + if err != nil { + return errorx.WrapByCode(err, prompterr.CommonMySqlErrorCode) + } q := query.Use(d.db.NewSession(ctx, opts...)) _, err = q.PromptUserDraft.WithContext(ctx).Where(q.PromptUserDraft.ID.Eq(promptDraftPO.ID)). Updates(map[string]interface{}{ - q.PromptUserDraft.Messages.ColumnName().String(): promptDraftPO.Messages, - q.PromptUserDraft.ModelConfig.ColumnName().String(): promptDraftPO.ModelConfig, - q.PromptUserDraft.BaseVersion.ColumnName().String(): promptDraftPO.BaseVersion, - q.PromptUserDraft.Tools.ColumnName().String(): promptDraftPO.Tools, - q.PromptUserDraft.ToolCallConfig.ColumnName().String(): promptDraftPO.ToolCallConfig, - q.PromptUserDraft.TemplateType.ColumnName().String(): promptDraftPO.TemplateType, - q.PromptUserDraft.VariableDefs.ColumnName().String(): promptDraftPO.VariableDefs, - q.PromptUserDraft.Metadata.ColumnName().String(): promptDraftPO.Metadata, - q.PromptUserDraft.McpConfig.ColumnName().String(): promptDraftPO.McpConfig, - q.PromptUserDraft.IsDraftEdited.ColumnName().String(): promptDraftPO.IsDraftEdited, - q.PromptUserDraft.HasSnippets.ColumnName().String(): promptDraftPO.HasSnippets, + q.PromptUserDraft.Messages.ColumnName().String(): promptDraftPO.Messages, + q.PromptUserDraft.ModelConfig.ColumnName().String(): promptDraftPO.ModelConfig, + q.PromptUserDraft.BaseVersion.ColumnName().String(): promptDraftPO.BaseVersion, + q.PromptUserDraft.Tools.ColumnName().String(): promptDraftPO.Tools, + q.PromptUserDraft.ToolCallConfig.ColumnName().String(): promptDraftPO.ToolCallConfig, + q.PromptUserDraft.TemplateType.ColumnName().String(): promptDraftPO.TemplateType, + q.PromptUserDraft.VariableDefs.ColumnName().String(): promptDraftPO.VariableDefs, + q.PromptUserDraft.Metadata.ColumnName().String(): promptDraftPO.Metadata, + q.PromptUserDraft.McpConfig.ColumnName().String(): promptDraftPO.McpConfig, + q.PromptUserDraft.IsDraftEdited.ColumnName().String(): promptDraftPO.IsDraftEdited, + q.PromptUserDraft.HasSnippets.ColumnName().String(): promptDraftPO.HasSnippets, + q.PromptUserDraft.EncryptMessages.ColumnName().String(): promptDraftPO.EncryptMessages, }) if err != nil { return errorx.WrapByCode(err, prompterr.CommonMySqlErrorCode) diff --git a/backend/modules/prompt/pkg/consts/auth.go b/backend/modules/prompt/pkg/consts/auth.go index 27a845a31..8dab10862 100644 --- a/backend/modules/prompt/pkg/consts/auth.go +++ b/backend/modules/prompt/pkg/consts/auth.go @@ -8,6 +8,7 @@ const ( ActionLoopPromptEdit = "edit" ActionLoopPromptDebug = "debug" ActionLoopPromptExecute = "execute" + ActionLoopPromptEditSecLevel = "editSecLevel" ActionWorkspaceListLoopPrompt = "listLoopPrompt" ActionWorkspaceCreateLoopPrompt = "createLoopPrompt" ) diff --git a/idl/thrift/coze/loop/prompt/coze.loop.prompt.manage.thrift b/idl/thrift/coze/loop/prompt/coze.loop.prompt.manage.thrift index b19e453db..5a326f1a3 100644 --- a/idl/thrift/coze/loop/prompt/coze.loop.prompt.manage.thrift +++ b/idl/thrift/coze/loop/prompt/coze.loop.prompt.manage.thrift @@ -53,6 +53,7 @@ struct CreatePromptRequest { 12: optional string prompt_key (vt.not_nil="true", vt.min_size="1") 13: optional string prompt_description 14: optional prompt.PromptType prompt_type + 15: optional prompt.SecurityLevel security_level 21: optional prompt.PromptDetail draft_detail @@ -169,6 +170,8 @@ struct UpdatePromptRequest { 11: optional string prompt_name (vt.not_nil="true", vt.min_size="1") 12: optional string prompt_description + 13: optional prompt.SecurityLevel security_level + 14: optional string downgrade_reason 255: optional base.Base Base } diff --git a/idl/thrift/coze/loop/prompt/domain/prompt.thrift b/idl/thrift/coze/loop/prompt/domain/prompt.thrift index e349906a8..d74d3b426 100644 --- a/idl/thrift/coze/loop/prompt/domain/prompt.thrift +++ b/idl/thrift/coze/loop/prompt/domain/prompt.thrift @@ -19,6 +19,7 @@ struct PromptBasic { 7: optional i64 updated_at (api.js_conv="true", go.tag='json:"updated_at"') 8: optional i64 latest_committed_at (api.js_conv="true", go.tag='json:"latest_committed_at"') 9: optional PromptType prompt_type + 10: optional SecurityLevel security_level } @@ -26,6 +27,12 @@ typedef string PromptType (ts.enum="true") const PromptType PromptType_Normal = "normal" const PromptType PromptType_Snippet = "snippet" +typedef string SecurityLevel (ts.enum="true") +const SecurityLevel SecurityLevel_L1 = "L1" +const SecurityLevel SecurityLevel_L2 = "L2" +const SecurityLevel SecurityLevel_L3 = "L3" +const SecurityLevel SecurityLevel_L4 = "L4" + struct PromptCommit { 1: optional PromptDetail detail 2: optional CommitInfo commit_info diff --git a/release/deployment/docker-compose/bootstrap/mysql-init/init-sql/prompt_basic.sql b/release/deployment/docker-compose/bootstrap/mysql-init/init-sql/prompt_basic.sql index 55a27c93d..fe6e650d3 100644 --- a/release/deployment/docker-compose/bootstrap/mysql-init/init-sql/prompt_basic.sql +++ b/release/deployment/docker-compose/bootstrap/mysql-init/init-sql/prompt_basic.sql @@ -14,6 +14,7 @@ CREATE TABLE IF NOT EXISTS `prompt_basic` `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted_at` bigint NOT NULL DEFAULT '0' COMMENT '删除时间', `prompt_type` varchar(64) NOT NULL DEFAULT 'normal' COMMENT 'Prompt类型', + `security_level` varchar(64) NOT NULL DEFAULT 'L3' COMMENT 'security level', PRIMARY KEY (`id`), UNIQUE KEY `uniq_space_id_prompt_key_deleted_at` (`space_id`, `prompt_key`, `deleted_at`), KEY `idx_created_at` (`created_at`) USING BTREE, diff --git a/release/deployment/docker-compose/bootstrap/mysql-init/init-sql/prompt_commit.sql b/release/deployment/docker-compose/bootstrap/mysql-init/init-sql/prompt_commit.sql index 0ef0feeed..2c0150311 100644 --- a/release/deployment/docker-compose/bootstrap/mysql-init/init-sql/prompt_commit.sql +++ b/release/deployment/docker-compose/bootstrap/mysql-init/init-sql/prompt_commit.sql @@ -20,6 +20,7 @@ CREATE TABLE IF NOT EXISTS `prompt_commit` `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `has_snippets` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否包含prompt片段', + `encrypt_messages` longtext COLLATE utf8mb4_general_ci COMMENT 'encrypt message list', PRIMARY KEY (`id`), UNIQUE KEY `uniq_prompt_id_version` (`prompt_id`, `version`), KEY `idx_prompt_key_version` (`prompt_key`, `version`) USING BTREE diff --git a/release/deployment/docker-compose/bootstrap/mysql-init/init-sql/prompt_user_draft.sql b/release/deployment/docker-compose/bootstrap/mysql-init/init-sql/prompt_user_draft.sql index a85aeff79..8270ad65f 100644 --- a/release/deployment/docker-compose/bootstrap/mysql-init/init-sql/prompt_user_draft.sql +++ b/release/deployment/docker-compose/bootstrap/mysql-init/init-sql/prompt_user_draft.sql @@ -19,6 +19,7 @@ CREATE TABLE IF NOT EXISTS `prompt_user_draft` `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted_at` bigint NOT NULL DEFAULT '0' COMMENT '删除时间', `has_snippets` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否包含prompt片段', + `encrypt_messages` longtext COLLATE utf8mb4_general_ci COMMENT 'encrypt message list', PRIMARY KEY (`id`), UNIQUE KEY `uniq_prompt_id_user_id_deleted_at` (`prompt_id`, `user_id`, `deleted_at`), KEY `idx_prompt_id_user_id` (`prompt_id`, `user_id`) diff --git a/release/deployment/docker-compose/bootstrap/mysql-init/patch-sql/prompt_basic_alter.sql b/release/deployment/docker-compose/bootstrap/mysql-init/patch-sql/prompt_basic_alter.sql index a51a2becf..937fa9c76 100644 --- a/release/deployment/docker-compose/bootstrap/mysql-init/patch-sql/prompt_basic_alter.sql +++ b/release/deployment/docker-compose/bootstrap/mysql-init/patch-sql/prompt_basic_alter.sql @@ -1,2 +1,3 @@ ALTER TABLE `prompt_basic` ADD COLUMN `prompt_type` varchar(64) NOT NULL DEFAULT 'normal' COMMENT 'Prompt类型'; -ALTER TABLE `prompt_basic` ADD KEY `idx_pid_ptype_delat` (`space_id`, `prompt_type`, `deleted_at`) USING BTREE; \ No newline at end of file +ALTER TABLE `prompt_basic` ADD KEY `idx_pid_ptype_delat` (`space_id`, `prompt_type`, `deleted_at`) USING BTREE; +ALTER TABLE `prompt_basic` ADD COLUMN `security_level` varchar(64) NOT NULL DEFAULT 'L3' COMMENT 'security level'; \ No newline at end of file diff --git a/release/deployment/docker-compose/bootstrap/mysql-init/patch-sql/prompt_commit_alter.sql b/release/deployment/docker-compose/bootstrap/mysql-init/patch-sql/prompt_commit_alter.sql index 924cec27e..d1128d188 100644 --- a/release/deployment/docker-compose/bootstrap/mysql-init/patch-sql/prompt_commit_alter.sql +++ b/release/deployment/docker-compose/bootstrap/mysql-init/patch-sql/prompt_commit_alter.sql @@ -1,4 +1,5 @@ ALTER TABLE `prompt_commit` ADD COLUMN `ext_info` text COLLATE utf8mb4_general_ci COMMENT 'Extended information field'; ALTER TABLE `prompt_commit` ADD COLUMN `metadata` text COLLATE utf8mb4_general_ci COMMENT 'Template metadata field'; ALTER TABLE `prompt_commit` ADD COLUMN `has_snippets` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否包含prompt片段'; -ALTER TABLE `prompt_commit` ADD COLUMN `mcp_config` text COLLATE utf8mb4_general_ci COMMENT 'mcp config info'; \ No newline at end of file +ALTER TABLE `prompt_commit` ADD COLUMN `mcp_config` text COLLATE utf8mb4_general_ci COMMENT 'mcp config info'; +ALTER TABLE `prompt_commit` ADD COLUMN `encrypt_messages` longtext COLLATE utf8mb4_general_ci COMMENT 'encrypt message list'; diff --git a/release/deployment/docker-compose/bootstrap/mysql-init/patch-sql/prompt_user_draft_alter.sql b/release/deployment/docker-compose/bootstrap/mysql-init/patch-sql/prompt_user_draft_alter.sql index bd897e3c7..969c35bbf 100644 --- a/release/deployment/docker-compose/bootstrap/mysql-init/patch-sql/prompt_user_draft_alter.sql +++ b/release/deployment/docker-compose/bootstrap/mysql-init/patch-sql/prompt_user_draft_alter.sql @@ -1,4 +1,5 @@ ALTER TABLE `prompt_user_draft` ADD COLUMN `ext_info` text COLLATE utf8mb4_general_ci COMMENT 'Extended information field'; ALTER TABLE `prompt_user_draft` ADD COLUMN `metadata` text COLLATE utf8mb4_general_ci COMMENT 'Template metadata field'; ALTER TABLE `prompt_user_draft` ADD COLUMN `has_snippets` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否包含prompt片段'; -ALTER TABLE `prompt_user_draft` ADD COLUMN `mcp_config` text COLLATE utf8mb4_general_ci COMMENT 'mcp config info'; \ No newline at end of file +ALTER TABLE `prompt_user_draft` ADD COLUMN `mcp_config` text COLLATE utf8mb4_general_ci COMMENT 'mcp config info'; +ALTER TABLE `prompt_user_draft` ADD COLUMN `encrypt_messages` longtext COLLATE utf8mb4_general_ci COMMENT 'encrypt message list'; diff --git a/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_basic.sql b/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_basic.sql index d461043f5..da310fb51 100644 --- a/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_basic.sql +++ b/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_basic.sql @@ -14,6 +14,7 @@ CREATE TABLE IF NOT EXISTS `prompt_basic` `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted_at` bigint NOT NULL DEFAULT '0' COMMENT '删除时间', `prompt_type` varchar(64) NOT NULL DEFAULT 'normal' COMMENT 'Prompt类型', + `security_level` varchar(64) NOT NULL DEFAULT 'L3' COMMENT 'security level', PRIMARY KEY (`id`), UNIQUE KEY `uniq_space_id_prompt_key_deleted_at` (`space_id`, `prompt_key`, `deleted_at`), KEY `idx_created_at` (`created_at`) USING BTREE, diff --git a/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_basic_alter.sql b/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_basic_alter.sql index a51a2becf..937fa9c76 100644 --- a/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_basic_alter.sql +++ b/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_basic_alter.sql @@ -1,2 +1,3 @@ ALTER TABLE `prompt_basic` ADD COLUMN `prompt_type` varchar(64) NOT NULL DEFAULT 'normal' COMMENT 'Prompt类型'; -ALTER TABLE `prompt_basic` ADD KEY `idx_pid_ptype_delat` (`space_id`, `prompt_type`, `deleted_at`) USING BTREE; \ No newline at end of file +ALTER TABLE `prompt_basic` ADD KEY `idx_pid_ptype_delat` (`space_id`, `prompt_type`, `deleted_at`) USING BTREE; +ALTER TABLE `prompt_basic` ADD COLUMN `security_level` varchar(64) NOT NULL DEFAULT 'L3' COMMENT 'security level'; \ No newline at end of file diff --git a/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_commit.sql b/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_commit.sql index bbe022bad..492efbedb 100644 --- a/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_commit.sql +++ b/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_commit.sql @@ -19,6 +19,7 @@ CREATE TABLE IF NOT EXISTS `prompt_commit` `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `has_snippets` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否包含prompt片段', + `encrypt_messages` longtext COLLATE utf8mb4_general_ci COMMENT 'encrypt message list', PRIMARY KEY (`id`), UNIQUE KEY `uniq_prompt_id_version` (`prompt_id`, `version`), KEY `idx_prompt_key_version` (`prompt_key`, `version`) USING BTREE diff --git a/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_commit_alter.sql b/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_commit_alter.sql index d4919bfee..a39593938 100644 --- a/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_commit_alter.sql +++ b/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_commit_alter.sql @@ -1,3 +1,4 @@ ALTER TABLE `prompt_commit` ADD COLUMN `ext_info` text COLLATE utf8mb4_general_ci COMMENT 'Extended information field'; ALTER TABLE `prompt_commit` ADD COLUMN `metadata` text COLLATE utf8mb4_general_ci COMMENT 'Template metadata field'; -ALTER TABLE `prompt_commit` ADD COLUMN `has_snippets` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否包含prompt片段'; \ No newline at end of file +ALTER TABLE `prompt_commit` ADD COLUMN `has_snippets` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否包含prompt片段'; +ALTER TABLE `prompt_commit` ADD COLUMN `encrypt_messages` longtext COLLATE utf8mb4_general_ci COMMENT 'encrypt message list'; \ No newline at end of file diff --git a/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_user_draft.sql b/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_user_draft.sql index be460369f..fd642119b 100644 --- a/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_user_draft.sql +++ b/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_user_draft.sql @@ -18,6 +18,7 @@ CREATE TABLE IF NOT EXISTS `prompt_user_draft` `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted_at` bigint NOT NULL DEFAULT '0' COMMENT '删除时间', `has_snippets` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否包含prompt片段', + `encrypt_messages` longtext COLLATE utf8mb4_general_ci COMMENT 'encrypt message list', PRIMARY KEY (`id`), UNIQUE KEY `uniq_prompt_id_user_id_deleted_at` (`prompt_id`, `user_id`, `deleted_at`), KEY `idx_prompt_id_user_id` (`prompt_id`, `user_id`) diff --git a/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_user_draft_alter.sql b/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_user_draft_alter.sql index 8ecb3d12e..9a5ea9e21 100644 --- a/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_user_draft_alter.sql +++ b/release/deployment/helm-chart/charts/app/bootstrap/init/mysql/init-sql/prompt_user_draft_alter.sql @@ -1,3 +1,4 @@ ALTER TABLE `prompt_user_draft` ADD COLUMN `ext_info` text COLLATE utf8mb4_general_ci COMMENT 'Extended information field'; ALTER TABLE `prompt_user_draft` ADD COLUMN `metadata` text COLLATE utf8mb4_general_ci COMMENT 'Template metadata field'; -ALTER TABLE `prompt_user_draft` ADD COLUMN `has_snippets` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否包含prompt片段'; \ No newline at end of file +ALTER TABLE `prompt_user_draft` ADD COLUMN `has_snippets` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否包含prompt片段'; +ALTER TABLE `prompt_user_draft` ADD COLUMN `encrypt_messages` longtext COLLATE utf8mb4_general_ci COMMENT 'encrypt message list'; \ No newline at end of file