Skip to content

Custom channel: a per-message outputSchema prevents durable-session resumption (0/23 vs 10/10 without) #1230

Description

@luxons-techsaviness

Summary

In a custom channel on eve@0.27.0 (deployed on Vercel), a turn sent with a per-message outputSchema never resumes its durable session on follow-up: every follow-up with the returned continuation token silently opens a brand-new session. The identical call without outputSchema resumes perfectly.

Measurements (deployed agent, Vercel, custom channel)

call shape follow-ups resumed
send({message, outputSchema}, {auth, continuationToken, mode: "conversation"}) 0 / 23 (10 conversations back-to-back, 3 with 12s pacing between turns)
send(message, {auth, continuationToken}) — plain string, no schema, no mode 10 / 10 (5 conversations, session id identical across all turns)

Sessions DO park in both shapes — session.waiting fires with a continuation token every turn (observed arriving ~120ms after turn.completed). With the schema, presenting that token back opens a new session (session.started every turn); without it, the same token resumes the same session id.

Expected

The docs indicate a per-message outputSchema on a conversation turn is supported, so we expected the returned/parked continuation token to resume the session as it does for plain sends.

Notes that may help

  • RunMode docs say task runs "must finish within the current invocation and cannot wait for another message" — the observed behaviour is consistent with an outputSchema turn being keyed or treated as task-shaped regardless of mode: "conversation".
  • send() treating an unknown continuation as a new conversation (rather than an error) made this invisible for a while — a resumed: boolean (or an error on unknown token, opt-in) on the send/session result would have surfaced it immediately.
  • Separately, on the same deployment we see ~8–9% of turns fail with a 502 below the application layer (no application error logged; the durable workflow's steps then complete with 200s). Happy to open that separately with details if useful.

Workaround we shipped

Moved the structured contract from the per-message outputSchema into a tool (defineTool input schema), captured from actions.requested in the channel; plain-string sends now resume.

Environment

eve@0.27.0, Node 24, deployed on Vercel (Fluid Compute), custom channel via defineChannel, model via AI Gateway (anthropic/claude-sonnet-5).

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions