From 86530931fe1dbb792887f32a572dccf716787073 Mon Sep 17 00:00:00 2001 From: euvre <93761161+euvre@users.noreply.github.com> Date: Fri, 24 Jul 2026 11:36:20 +0800 Subject: [PATCH] fix(agent): set exp_user_id and name on session creation so exploration shows session titles (#17327) --- internal/service/agent.go | 20 ++++++++++++++++++-- internal/service/agent_sessions.go | 1 + 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/internal/service/agent.go b/internal/service/agent.go index cb1536feab..3f94df99a8 100644 --- a/internal/service/agent.go +++ b/internal/service/agent.go @@ -1032,7 +1032,7 @@ func (s *AgentService) RunAgent(ctx context.Context, userID, canvasID, sessionID } } if newSession && len(dsl) > 0 { - if err = s.createAgentRunSession(ctx, sessionID, userID, canvasID, dsl, versionRow); err != nil { + if err = s.createAgentRunSession(ctx, sessionID, userID, canvasID, dsl, versionRow, userInput); err != nil { return nil, fmt.Errorf("RunAgent: create session %q: %w: %w", sessionID, err, ErrAgentStorageError) } } @@ -1528,15 +1528,19 @@ func (s *AgentService) createAgentRunSession( sessionID, userID, agentID string, runDSL map[string]any, versionRow *entity.UserCanvasVersion, + userInput any, ) error { if s == nil || s.api4ConversationDAO == nil { return errors.New("agent session storage is not configured") } source := "agent" + name := deriveAgentSessionName(userInput) session := &entity.API4Conversation{ ID: sessionID, + Name: &name, DialogID: agentID, UserID: userID, + ExpUserID: &userID, Message: json.RawMessage(`[]`), Reference: json.RawMessage(`[]`), Source: &source, @@ -1548,7 +1552,19 @@ func (s *AgentService) createAgentRunSession( return s.api4ConversationDAO.Create(ctx, dao.DB, session) } -// runIDFor builds the per-run CanvasState identifier: canvasID +// deriveAgentSessionName mirrors Python's +// `req.get("name") or (query[:250] if query else "") or ""` — the +// session name defaults to the first 250 runes of the user's input +// so the exploration sidebar shows a meaningful title. +func deriveAgentSessionName(userInput any) string { + text := stringifyAgentUserInput(userInput) + runes := []rune(text) + if len(runes) > 250 { + runes = runes[:250] + } + return string(runes) +} + // alone for first-touch runs, canvasID + sessionID for resumed runs // (so two concurrent sessions on the same canvas don't collide in // the snapshot map). diff --git a/internal/service/agent_sessions.go b/internal/service/agent_sessions.go index 289a75b309..6c113e0d96 100644 --- a/internal/service/agent_sessions.go +++ b/internal/service/agent_sessions.go @@ -747,6 +747,7 @@ func (s *AgentService) CreateAgentSession(ctx context.Context, req *CreateAgentS Name: namePtr, DialogID: req.AgentID, UserID: req.UserID, + ExpUserID: &req.UserID, Message: messages, Reference: reference, Source: sourcePtr,