Skip to content

[Question] Recommended way to pass server-side userId when using AG-UI starter with HarnessAgent? #2014

Description

@likebean

Context

We are building a multi-user platform with:

  • Backend: Spring Boot + Spring Security (session/cookie auth)
  • Agent: HarnessAgent (singleton, stateless engine with AgentStateStore)
  • Frontend: CopilotKit → AG-UI protocol
  • Integration: agentscope-agui-spring-boot-starter (AguiRestController / AguiAgentAdapter)

Per the Context & AgentState docs, (userId, sessionId) should be passed via RuntimeContext on each call. The Quickstart also shows userId / sessionId being set in the HTTP handler.

However, the AG-UI integration path seems different from the HarnessGateway / builder example (ChatControllerMsgContext.userIdRuntimeContext).

What we observed

  1. RC4 (AguiAgentAdapter): calls agent.stream(msgs, options) without RuntimeContext, so threadId is not mapped to sessionId.
  2. main (after fix(agui): propagate run input and frontend tools #1895): buildRuntimeContext() sets sessionId = threadId and puts RunAgentInput into context — but still no userId.
  3. Without userId, ReActAgent falls back to __anon__/{sessionId} slot keys, which breaks multi-user isolation when multiple logged-in users share the same AG-UI threadId namespace.

We understand userId should come from the integration layer (server auth), not from the frontend forwardedProps (untrusted).

Questions

  1. Is there an official recommended pattern for passing server-side authenticated userId into RuntimeContext when using the AG-UI Spring Boot starter with HarnessAgent?
  2. Should we wait for / contribute to the hook mechanism proposed in Feature Request: Support Custom Agent Hooks via forwardedProps #901 (AguiRequestHook + forwardedProps), or is there a better extension point (e.g. custom AguiRequestProcessor, RuntimeContextCustomizer)?
  3. For production multi-tenant chat, do you recommend staying on AG-UI + starter, or switching to the builder-style HarnessGateway path (custom SSE, not AG-UI)?

Related issues / PRs

Our current workaround

Wrapping the registered Agent to inject SecurityContextRuntimeContext.userId before delegating to HarnessAgent.stream(..., ctx). This works but feels like integration-layer logic placed at the wrong abstraction level.

Any guidance or planned API for this scenario would be appreciated. Happy to contribute a PR if there is a preferred design.


Environment: agentscope-java 2.0.0-RC4, Spring Boot 3.4, Java 17

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions