Every eve app speaks the same stable HTTP API to a durable session. This page is the contract you hold: the two handles you get back, the events you stream, how to send a follow-up, and how to reconnect after a dropped connection.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/vercel/eve/llms.txt
Use this file to discover all available pages before exploring further.
The two handles
Two handles do two different jobs, and mixing them up is the most common mistake.| Handle | Purpose | Owned by |
|---|---|---|
continuationToken | Resume handle — send a follow-up message to the same conversation. | Channel |
sessionId / runId | Stream-and-inspect handle — attach to the event stream and watch a run. | Runtime |
continuationToken; a stale token is rejected.
React, Vue, and Svelte apps should reach for
useEveAgent() instead of calling these routes by hand. Next.js and Nuxt apps can proxy them to the eve runtime from the same origin.Start a session
Send aPOST to /eve/v1/session with your first message:
sessionId and a continuationToken, and the x-eve-session-id header names the durable session to stream.
Stream a session
Attach to the event stream using thesessionId returned when you started the session:
Event type reference
| Event | Meaning |
|---|---|
session.started | A durable session was created. |
turn.started | A new turn began. |
message.received | An inbound user message was accepted. |
step.started | A model step began. |
actions.requested | The model requested tool calls. |
action.result | A tool call returned. |
input.requested | The run paused for human input (HITL approval or ask_question); carries requests. |
subagent.called | A subagent was delegated; carries childSessionId to attach to. |
subagent.completed | A delegated subagent finished. |
reasoning.appended | A reasoning delta — incremental, with cumulative text so far. |
reasoning.completed | The finalized reasoning block. |
message.appended | An assistant text delta — incremental, with cumulative text so far. |
message.completed | A finalized assistant text block. |
result.completed | The finalized structured result for a turn that requested an output schema; carries result. |
compaction.requested | Context-window compaction began; carries modelId, sessionId, turnId, usageInputTokens. |
compaction.completed | A compaction checkpoint was written to durable history. |
authorization.required | A connection needs OAuth; carries name, description, and an authorization challenge. |
authorization.completed | A connection’s authorization resolved; carries outcome. |
step.completed | A model step finished; carries finishReason and usage. |
step.failed | A model step failed; carries { code, message, details? }. |
turn.completed | The turn finished. |
turn.failed | The turn failed; carries { code, message, details? }. |
session.waiting | The session parked, waiting for the next input (a message or an answer). |
session.failed | The session failed. |
session.completed | The session reached a terminal end. |
Live-streaming events: reasoning.appended and message.appended
reasoning.appended and message.appended stream deltas as they arrive. Each event carries both the new delta and the cumulative text for the current block. The finalized block then appears on message.completed and reasoning.completed — these are the compatibility path for clients that don’t render incremental streaming.
Consider the privacy, confidentiality, and user-experience implications before displaying, storing, or transmitting
reasoning.appended events in your application. Reasoning content may include intermediate thoughts not intended for end-user display.message.completed can fire more than once in a turn — the agent often emits interim assistant text before a tool call. To distinguish tool-call narration from a terminal reply, check message.completed.data.finishReason. The step.completed.data.finishReason field mirrors the step outcome, and usage data lives on step.completed.
Subagent events
A delegated subagent publishes its own progress on a child-session stream. The parent session only emitssubagent.called with a childSessionId, which a client uses to attach to the child stream independently.
Error events
step.failed and turn.failed each carry { code, message, details? } for the failed fragment or turn. session.failed is the terminal session-level variant.
OAuth authorization events
authorization.required carries the sign-in challenge — data.authorization may include url, userCode, expiresAt, and instructions. authorization.completed carries data.outcome, which is one of:
Structured result events
When a turn requested an output schema, the finalized payload lands onresult.completed as data.result, before the turn boundary events.
Send a follow-up message
Wait forsession.waiting before sending a follow-up. Then POST to the session endpoint with the stored continuation token:
Start the session
POST to
/eve/v1/session with the first message. Save the continuationToken and sessionId from the response.Attach to the stream
GET
/eve/v1/session/<sessionId>/stream and process NDJSON events as they arrive.Wait for session.waiting
Only send the next message after
session.waiting fires. This ensures deterministic ordering.Reconnecting to a stream
The stream is durable. Every event is recorded before a step completes, so the entire stream is replayable. PassstartIndex to reconnect by event count and pick up from where you dropped off, or rewind to the start:
Inspect the agent
GET /eve/v1/info returns a JSON inspection snapshot for the running agent — model, instructions, authored and framework tools, skills, channels, schedules, subagents, sandbox, connections, hooks, workflow, and workspace metadata:
Event dispatch order
Every stream event triggers four steps in this order:
The order is structural, not incidental. By the time a resolver or hook reads channel metadata, the channel has already updated its state and the projection is current.
Execution Model
What makes a session durable and how parked work resumes.
Security Model
Trust boundaries, route auth, and channel verification.
Context Control
Managing what the model sees across instructions and skills.
TypeScript SDK
Call these routes from scripts and server-side code with a typed client.