From 8c2d00f1665c53a804c184447f0e2c492a4a139b Mon Sep 17 00:00:00 2001 From: junwen-lee Date: Tue, 2 Sep 2025 17:40:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(singleagent):=20create=20conversaion=20supp?= =?UTF-8?q?ort=20add=20meta=20data=20field=20&=20ui=E2=80=A6=20(#1949)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/handler/coze/conversation_service.go | 2 +- .../application/conversation/conversation.go | 37 ++++++++++++++++++- .../conversation/openapi_agent_run.go | 2 + .../agentrun/entity/run_record.go | 1 + .../conversation/agentrun/internal/dal/dao.go | 8 +--- .../conversation/entity/conversation.go | 1 + .../conversation/internal/dal/dao.go | 25 ++++++++----- .../conversation/repository/repository.go | 2 +- .../conversation/service/conversation_impl.go | 2 +- 9 files changed, 60 insertions(+), 20 deletions(-) diff --git a/backend/api/handler/coze/conversation_service.go b/backend/api/handler/coze/conversation_service.go index 7d1709eb..456a2fe4 100644 --- a/backend/api/handler/coze/conversation_service.go +++ b/backend/api/handler/coze/conversation_service.go @@ -116,7 +116,7 @@ func CreateConversation(ctx context.Context, c *app.RequestContext) { return } - resp, err := application.ConversationSVC.CreateConversation(ctx, req.GetBotId(), req.GetConnectorId()) + resp, err := application.ConversationSVC.CreateConversation(ctx, &req) if err != nil { internalServerErrorResponse(ctx, c, err) return diff --git a/backend/application/conversation/conversation.go b/backend/application/conversation/conversation.go index 8674eefc..fba0bdc3 100644 --- a/backend/application/conversation/conversation.go +++ b/backend/application/conversation/conversation.go @@ -18,6 +18,8 @@ package conversation import ( "context" + "encoding/json" + "strings" "github.com/coze-dev/coze-studio/backend/api/model/conversation/common" "github.com/coze-dev/coze-studio/backend/api/model/conversation/conversation" @@ -121,10 +123,12 @@ func (c *ConversationApplicationService) CreateSection(ctx context.Context, conv return convRes.SectionID, nil } -func (c *ConversationApplicationService) CreateConversation(ctx context.Context, agentID int64, connectorID int64) (*conversation.CreateConversationResponse, error) { +func (c *ConversationApplicationService) CreateConversation(ctx context.Context, req *conversation.CreateConversationRequest) (*conversation.CreateConversationResponse, error) { resp := new(conversation.CreateConversationResponse) apiKeyInfo := ctxutil.GetApiAuthFromCtx(ctx) userID := apiKeyInfo.UserID + connectorID := req.GetConnectorId() + agentID := req.GetBotId() if connectorID != consts.WebSDKConnectorID { connectorID = apiKeyInfo.ConnectorID } @@ -134,6 +138,7 @@ func (c *ConversationApplicationService) CreateConversation(ctx context.Context, UserID: userID, ConnectorID: connectorID, Scene: common.Scene_SceneOpenApi, + Ext: parseMetaData(req.MetaData), }) if err != nil { return nil, err @@ -143,10 +148,33 @@ func (c *ConversationApplicationService) CreateConversation(ctx context.Context, LastSectionID: &conversationData.SectionID, ConnectorID: &conversationData.ConnectorID, CreatedAt: conversationData.CreatedAt / 1000, + MetaData: parseExt(conversationData.Ext), } return resp, nil } +func parseMetaData(metaData map[string]string) string { + if metaData == nil { + return "" + } + j, err := json.Marshal(metaData) + if err != nil { + return "" + } + return string(j) +} + +func parseExt(ext string) map[string]string { + if ext == "" { + return nil + } + var metaData map[string]string + err := json.Unmarshal([]byte(ext), &metaData) + if err != nil { + return nil + } + return metaData +} func (c *ConversationApplicationService) ListConversation(ctx context.Context, req *conversation.ListConversationsApiRequest) (*conversation.ListConversationsApiResponse, error) { resp := new(conversation.ListConversationsApiResponse) @@ -169,6 +197,12 @@ func (c *ConversationApplicationService) ListConversation(ctx context.Context, r Scene: common.Scene_SceneOpenApi, Page: int(req.GetPageNum()), Limit: int(req.GetPageSize()), + OrderBy: func() *string { + if strings.ToLower(req.GetSortOrder()) == "asc" { + return ptr.Of("asc") + } + return nil + }(), }) if err != nil { return resp, err @@ -180,6 +214,7 @@ func (c *ConversationApplicationService) ListConversation(ctx context.Context, r ConnectorID: &conv.ConnectorID, CreatedAt: conv.CreatedAt / 1000, Name: ptr.Of(conv.Name), + MetaData: parseExt(conv.Ext), } }) diff --git a/backend/application/conversation/openapi_agent_run.go b/backend/application/conversation/openapi_agent_run.go index b0525594..b7c7145e 100644 --- a/backend/application/conversation/openapi_agent_run.go +++ b/backend/application/conversation/openapi_agent_run.go @@ -156,6 +156,8 @@ func (a *OpenapiAgentRunApplication) buildAgentRunRequest(ctx context.Context, a ConnectorID: connectorID, ContentType: contentType, Ext: ar.ExtraParams, + CustomVariables: ar.CustomVariables, + CozeUID: conversationData.CreatorID, } return arm, nil } diff --git a/backend/domain/conversation/agentrun/entity/run_record.go b/backend/domain/conversation/agentrun/entity/run_record.go index d0872c23..445dfb95 100644 --- a/backend/domain/conversation/agentrun/entity/run_record.go +++ b/backend/domain/conversation/agentrun/entity/run_record.go @@ -113,6 +113,7 @@ type AgentRunMeta struct { SectionID int64 `json:"section_id"` Name string `json:"name"` UserID string `json:"user_id"` + CozeUID int64 `json:"coze_uid"` AgentID int64 `json:"agent_id"` ContentType message.ContentType `json:"content_type"` Content []*message.InputMetaData `json:"content"` diff --git a/backend/domain/conversation/agentrun/internal/dal/dao.go b/backend/domain/conversation/agentrun/internal/dal/dao.go index 1e553568..361668c8 100644 --- a/backend/domain/conversation/agentrun/internal/dal/dao.go +++ b/backend/domain/conversation/agentrun/internal/dal/dao.go @@ -19,7 +19,6 @@ package dal import ( "context" "encoding/json" - "strconv" "strings" "time" @@ -162,10 +161,7 @@ func (dao *RunRecordDAO) buildCreatePO(ctx context.Context, runMeta *entity.Agen } timeNow := time.Now().UnixMilli() - creatorID, err := strconv.ParseInt(runMeta.UserID, 10, 64) - if err != nil { - return nil, err - } + return &model.RunRecord{ ID: runID, ConversationID: runMeta.ConversationID, @@ -175,7 +171,7 @@ func (dao *RunRecordDAO) buildCreatePO(ctx context.Context, runMeta *entity.Agen ChatRequest: string(reqOrigin), UserID: runMeta.UserID, CreatedAt: timeNow, - CreatorID: creatorID, + CreatorID: runMeta.CozeUID, }, nil } diff --git a/backend/domain/conversation/conversation/entity/conversation.go b/backend/domain/conversation/conversation/entity/conversation.go index ba20e789..90d8471a 100644 --- a/backend/domain/conversation/conversation/entity/conversation.go +++ b/backend/domain/conversation/conversation/entity/conversation.go @@ -50,6 +50,7 @@ type ListMeta struct { AgentID int64 `json:"agent_id"` Limit int `json:"limit"` Page int `json:"page"` + OrderBy *string `json:"order_by"` } type UpdateMeta struct { diff --git a/backend/domain/conversation/conversation/internal/dal/dao.go b/backend/domain/conversation/conversation/internal/dal/dao.go index eb8ff84e..ffa963a8 100644 --- a/backend/domain/conversation/conversation/internal/dal/dao.go +++ b/backend/domain/conversation/conversation/internal/dal/dao.go @@ -29,6 +29,7 @@ import ( "github.com/coze-dev/coze-studio/backend/domain/conversation/conversation/internal/dal/model" "github.com/coze-dev/coze-studio/backend/domain/conversation/conversation/internal/dal/query" "github.com/coze-dev/coze-studio/backend/infra/contract/idgen" + "github.com/coze-dev/coze-studio/backend/pkg/lang/ptr" "github.com/coze-dev/coze-studio/backend/pkg/lang/slices" ) @@ -140,22 +141,26 @@ func (dao *ConversationDAO) Get(ctx context.Context, userID int64, agentID int64 return dao.conversationPO2DO(ctx, po), nil } -func (dao *ConversationDAO) List(ctx context.Context, userID int64, agentID int64, connectorID int64, scene int32, limit int, page int) ([]*entity.Conversation, bool, error) { +func (dao *ConversationDAO) List(ctx context.Context, listMeta *entity.ListMeta) ([]*entity.Conversation, bool, error) { var hasMore bool do := dao.query.Conversation.WithContext(ctx).Debug() - do = do.Where(dao.query.Conversation.CreatorID.Eq(userID)). - Where(dao.query.Conversation.AgentID.Eq(agentID)). - Where(dao.query.Conversation.Scene.Eq(scene)). - Where(dao.query.Conversation.ConnectorID.Eq(connectorID)). + do = do.Where(dao.query.Conversation.CreatorID.Eq(listMeta.UserID)). + Where(dao.query.Conversation.AgentID.Eq(listMeta.AgentID)). + Where(dao.query.Conversation.Scene.Eq(int32(listMeta.Scene))). + Where(dao.query.Conversation.ConnectorID.Eq(listMeta.ConnectorID)). Where(dao.query.Conversation.Status.Eq(int32(conversation.ConversationStatusNormal))) - do = do.Offset((page - 1) * limit) + do = do.Offset((listMeta.Page - 1) * listMeta.Limit) - if limit > 0 { - do = do.Limit(int(limit) + 1) + if listMeta.Limit > 0 { + do = do.Limit(int(listMeta.Limit) + 1) + } + if listMeta.OrderBy != nil && ptr.From(listMeta.OrderBy) == "asc" { + do = do.Order(dao.query.Conversation.CreatedAt.Asc()) + } else { + do = do.Order(dao.query.Conversation.CreatedAt.Desc()) } - do = do.Order(dao.query.Conversation.CreatedAt.Desc()) poList, err := do.Find() @@ -169,7 +174,7 @@ func (dao *ConversationDAO) List(ctx context.Context, userID int64, agentID int6 if len(poList) == 0 { return nil, hasMore, nil } - if len(poList) > limit { + if len(poList) > listMeta.Limit { hasMore = true return dao.conversationBatchPO2DO(ctx, poList[:(len(poList)-1)]), hasMore, nil diff --git a/backend/domain/conversation/conversation/repository/repository.go b/backend/domain/conversation/conversation/repository/repository.go index f21a1481..be66992a 100644 --- a/backend/domain/conversation/conversation/repository/repository.go +++ b/backend/domain/conversation/conversation/repository/repository.go @@ -37,5 +37,5 @@ type ConversationRepo interface { Get(ctx context.Context, userID int64, agentID int64, scene int32, connectorID int64) (*entity.Conversation, error) Update(ctx context.Context, req *entity.UpdateMeta) (*entity.Conversation, error) Delete(ctx context.Context, id int64) (int64, error) - List(ctx context.Context, userID int64, agentID int64, connectorID int64, scene int32, limit int, page int) ([]*entity.Conversation, bool, error) + List(ctx context.Context, req *entity.ListMeta) ([]*entity.Conversation, bool, error) } diff --git a/backend/domain/conversation/conversation/service/conversation_impl.go b/backend/domain/conversation/conversation/service/conversation_impl.go index 61f914f2..1b6f9449 100644 --- a/backend/domain/conversation/conversation/service/conversation_impl.go +++ b/backend/domain/conversation/conversation/service/conversation_impl.go @@ -107,7 +107,7 @@ func (c *conversationImpl) Update(ctx context.Context, req *entity.UpdateMeta) ( } func (c *conversationImpl) List(ctx context.Context, req *entity.ListMeta) ([]*entity.Conversation, bool, error) { - conversationList, hasMore, err := c.ConversationRepo.List(ctx, req.UserID, req.AgentID, req.ConnectorID, int32(req.Scene), req.Limit, req.Page) + conversationList, hasMore, err := c.ConversationRepo.List(ctx, req) if err != nil { return nil, hasMore, err