In the dashboard, describe the task on Home and click New session. From a terminal:
Shell
ellipsis -e cloud_agent_environment "Add an empty-body test in api-repo. Run it; do not commit."
From code:
import osfrom ellipsis import Ellipsisclient = Ellipsis(api_key=os.environ["ELLIPSIS_API_TOKEN"])handle = client.sessions.run( environment="cloud_agent_environment", budget={"session": 5}, claude_code={ "prompt": "Add an empty-body test in api-repo. Run it; do not commit." },)print(handle.id)
import { Ellipsis } from '@ellipsis-dev/sdk';const client = new Ellipsis({ apiKey: process.env.ELLIPSIS_API_TOKEN!,});const handle = await client.sessions.run({ environment: 'cloud_agent_environment', budget: { session: 5 }, claude_code: { prompt: 'Add an empty-body test in api-repo. Run it; do not commit.', },});console.log(handle.id);
Replace cloud_agent_environment and api-repo with your environment and repository; without an environment, the session uses the default environment. budget caps the session at $5. Keep the session ID to check on it later. To set up the client, see the Python or TypeScript SDK and API authentication.
The dashboard and the CLI show messages and tool calls as they happen. To reattach the CLI to a running session, run ellipsis session get <session-id> --watch. From code, wait for the turn that answers your prompt:
session = handle.wait(timeout=900)print(session.turn.status, session.turn.reason, session.turn.detail)for record in client.sessions.records(handle.id): print(record.kind, record.payload)
const session = await handle.wait({ timeoutMs: 900_000 });console.log(session.turn?.status, session.turn?.reason, session.turn?.detail);for await (const record of await client.sessions.records(handle.id)) { console.log(record.kind, record.payload);}
wait() returns when the turn reaches a final status: completed, failed, stopped, or cancelled. Check turn.status before treating the task as done; reason and detail explain a failed or cancelled turn. A timeout stops your client from waiting, not the agent. To stream messages as they happen, see the Python or TypeScript SDK; for what each status means, see Lifecycle.
In the dashboard, type in Reply to the agent... and click Send. In the CLI, type in the session view. From code:
message = handle.send("Add a test for an invalid content type too.")session = handle.wait(timeout=900)print(message.turn_id, session.turn.status)
const message = await handle.send( 'Add a test for an invalid content type too.');const session = await handle.wait({ timeoutMs: 900_000 });console.log(message.turn_id, session.turn?.status);
A follow-up continues the same conversation and workspace. The message gets its turn the moment it is received, and wait() then waits on that turn; a message sent while a turn is running is answered after it. Only the person who started a session can message it. Sessions started by a mention take replies in their GitHub, Slack, or Linear thread. A closed session can't take follow-ups; conversation.prompting says whether a message would be accepted, see Lifecycle.
Set conversation.interactive to false when you won't send follow-ups. The conversation closes when its turn ends and its environment is deleted; its messages and results stay available. To save a task and run it again or on a schedule, use Agents.
Stopping ends the running turn with stopped, not the conversation: the session can still take follow-ups. Stopping a session with no turn pending or running fails with 409. Disconnecting doesn't stop the agent.