close

Build production AI agents

eve is an open-source agent framework for durable, long-running work. Build, govern, and evolve enterprise-grade agents that can scale.

$npx eve@latest init my-agent
v1.0.0-rc.6Apache-2.0
Software Factory
  1. CoderAgent10:02 AM

    Picked up a P1 bug and reproduced it in a sandbox.

    Saved carts disappear after sign-inacme/storefront#412 · opened by Dana
  2. Coder

    Fixed, with tests. @Reviewer ready for review.

    fix(cart): keep guest items after sign-inacme/storefront#418 · +84 −12 · 6 checks passed
  3. ReviewerAgent10:33 AM

    The merge logic is right, but the security pass flagged one thing. @Coder

    Guest cart ID is trusted from the cookiecart/session.ts:42 · could pull another guest's cart into an account
  4. CoderAgent10:38 AM

    Good catch. The merge now checks the guest cart belongs to the signing-in session, with a test for it. Pushed.

    pnpm vitest cart/session · 4 passed
  5. ReviewerAgent10:41 AM

    Verified the fix. Security pass is clean, approving.

    fix(cart): keep guest items after sign-inacme/storefront#418 · approved by Reviewer
    • Correctness: merge handles empty and duplicate carts
    • Tests: 4 new cases cover the regression
    • Security: cart ownership verified, no secrets in logs
  6. CoderAgent10:42 AM

    Merged and closed the issue. It goes out with the next deploy.

    fix(cart): keep guest items after sign-inacme/storefront#418 · merged into main · closed #412

Agents that run your company, power your product, or are personal

Start from a working template, or build your own from scratch.

Build a Slack agent that answers your team's business questions from your documented dbt models.

  • Answers in SlackOnly for the people and channels you allow.
  • Grounded in dbtReads your model docs before it writes a query.
  • Read-only SQLQueries DuckDB or MotherDuck, and never writes to them.
  1. Dana9:41 AM

    @company-brain how are repeat orders trending this quarter?

  2. company-brainAgent9:41 AM

    • list_modelsFound customers, orders, and payments
    • get_modelRead the docs for the orders model
    • query_sqlRan 1 query, returned 3 rows

    Repeat customers placed 44% of orders in October, up from 38% in August.

    MonthOrdersRepeat
    August41238%
    September45541%
    October49844%

Dynamic where you need it

Write your agent as plain files. When it needs to behave differently for each customer, make any file dynamic.

When the support agent serves
agent/example
instructions.md

An instructions.md file is a complete agent. Describe its role in Markdown, then run eve.

Static in this example. Any file can be dynamic.

# Identity

You are a support agent.
Answer customer questions, look up
their orders, and escalate anything
you can't resolve.
instructions/sla.tsdynamic

Add instructions that depend on the customer. Enterprise customers get a one-hour SLA, and Pro customers get a reply within a business day.

Acme Org
Enterprise
1-hour SLA, escalate when stuck
import { defineDynamic, defineInstructions }
  from "eve/instructions";

export default defineDynamic((ctx) => {
  const plan =
    ctx.session.auth.current?.attributes.plan;
  return defineInstructions({
    content: plan === "enterprise"
      ? "Reply within the 1-hour SLA. Escalate anything you can't resolve."
      : "Reply within one business day.",
  });
});
agent.tsdynamic

Choose the model per customer: a larger model for enterprise conversations.

Acme Org
Enterprise
Larger model
import { defineAgent, defineDynamic } from "eve";

export default defineAgent({
  model: defineDynamic((ctx) =>
    ctx.session.auth.current?.attributes
      .plan === "enterprise"
      ? "openai/gpt-6-luna-fast"
      : "zai/glm-5.2",
  ),
});
skills/refunds.mdoptional

Skills are Markdown playbooks loaded only when relevant, so the agent gets focused guidance without carrying it in every prompt.

Static in this example. Any file can be dynamic.

---
name: refunds
description: Handle refund requests
---

Check the order date first. Refund
within 30 days. After that, offer
store credit.
tools/lookup_order.tsoptional

Drop a TypeScript file in tools/ and the model can call it. The filename becomes the tool name, no registration required.

Static in this example. Any file can be dynamic.

import { defineTool } from "eve/tools";
import z from "zod";

export default defineTool({
  description: "Look up an order by ID",
  inputSchema: z.object({ orderId: z.string() }),
  async execute(input) {
    const res = await fetch(
      `${process.env.ORDERS_API_URL}/orders/${input.orderId}`
    );
    return res.json();
  },
});
tools/page_on_call.tsdynamic

Let the agent page the on-call engineer, but only for enterprise customers.

Acme Org
Enterprise
Can page on-call
import { defineDynamic, defineTool }
  from "eve/tools";
import { z } from "zod";
import { pageOnCall } from "../lib/pager";

export default defineDynamic((ctx) =>
  ctx.session.auth.current?.attributes.plan === "enterprise"
    ? defineTool({
        description: "Page the on-call engineer.",
        inputSchema: z.object({ summary: z.string() }),
        execute: ({ summary }) => pageOnCall(summary),
      })
    : null,
);
channels/slack.tsoptional

Add channel files to answer customers in Slack, Discord, Teams, or the web with the same agent.

Static in this example. Any file can be dynamic.

import { slackChannel } from "eve/channels/slack";

export default slackChannel();
connections/linear.tsoptional

Connections handle auth for services like Linear, GitHub, and Stripe, so the agent can file a bug for a support issue without managing tokens.

Static in this example. Any file can be dynamic.

import { defineMcpClientConnection }
  from "eve/connections";

export default defineMcpClientConnection({
  url: "https://mcp.linear.app/mcp",
});
subagents/billing/agent.tsoptional

Add subagents for specialized work. The support agent hands billing questions to a billing specialist and uses its answer.

Static in this example. Any file can be dynamic.

import { defineAgent } from "eve";

export default defineAgent({
  description: "Answer billing questions",
  model: "openai/gpt-6-luna-fast",
  reasoning: "high",
});
subagents/escalation/agent.tsdynamic

Give enterprise customers second-level support: a specialist the agent hands hard cases to.

Acme Org
Enterprise
Second-level support engineer
import { defineAgent, defineDynamic } from "eve";

export default defineDynamic((ctx) =>
  ctx.session.auth.current?.attributes
    .plan === "enterprise"
    ? defineAgent({
        description: "Second-level support engineer.",
        model: ctx.model.id,
      })
    : null,
);
schedules/daily-digest.mdoptional

Schedules run agents automatically for jobs like daily digests, continuing durably without an active session.

Static in this example. Any file can be dynamic.

---
cron: "0 8 * * *"
---

Post a summary of yesterday's open
tickets to the support channel.

Own your intelligence

Customize at every layer, from the harness to the UI to every agent run.

Everything you need to ship to production

Built on open-source SDKs,
yours to self-host

Swap any backend and self-host the whole runtime with no managed infrastructure, or deploy on Vercel for fully native support.

Fully managed via Vercel. Sandboxes, durable workflows, model routing, and observability handled for you.