- Design an endpoint for every action
- Write and maintain tool schemas
- Build and host the agent loop
- Map model output onto your API
- Add validation and guardrails
- Handle retries and partial failures
- Keep all of it in sync with your product
Live demoOuterEden · Agentic Native Platform
Say it.Your platform does it.
Describe your tools and declare your API. OuterEden bundles them into an agent your users talk to, by voice or chat, and makes the function calls for them. Every call is verified, every write waits for a yes, and hallucinated actions never execute.
Interactive simulation. A developer declares the API of a demo app called Acme Ops, and OuterEden bundles its14 operations into an agent users can talk to. A user asks by voice for a task; OuterEden makes the function calls, shows every write for confirmation first, and blocks hallucinated calls before they reach the app. The conversation on the right is readable text, and you can type your own request.
- 01Declare
- 02Bundle
- 03Talk
import { outerEden } from "@outereden/sdk";
outerEden(app, {
describe: "Orders, refunds, stock and billing.",
api: "./openapi.yaml",
confirm: ["write"],
voice: true,
});$ npm run dev
✓ openapi.yaml · 14 operations
✓ bundling for chat + voice…
0 typed actions
from openapi.yaml · writes need a yes
- Rorders.search(status?, minTotal?)Order[]
- Worders.refund(orderId, amount)Refund
- Worders.ship(orderId, carrier)Shipment
- Rcustomers.find(query)Customer
- Wcustomers.notify(customer, template)Delivery
- Wbilling.changePlan(customerId, plan)Subscription
- Wseats.add(customerId, count: int)Seats
- Rinventory.list(belowReorder?)Item[]
- WpurchaseOrders.create(sku, qty: int)PO
- Rreports.export(range)File
- Dorders.cancel(orderId, reason)Order
- Wcustomers.update(customerId, patch)Customer
- Winventory.adjust(sku, delta: int)Item
- Wusers.invite(email, role)Invite
02How it works
Declare once. Operate by voice.
You don't build an agent. You declare what your product can already do, and OuterEden bundles it into one your users can talk to: types, effects, and which calls need a yes.
- 01
What your users click.
Buttons, forms, menus. Every one of them is an API call underneath.
- 02
What you declare.
Your API and a plain description of your tools. Each control maps to a typed operation, with its effects and which calls need a yes.
- 03
What the agent gets.
One typed action graph, with chat and voice on top. It plans over the graph, and OuterEden verifies every call against it.
03Verification
Hallucinations never reach your platform.
Models guess. OuterEden doesn't let a guess run. Every call the agent proposes is checked against your declared API before it executes, and every write waits for your user's yes. What fails is stopped with the reason, and the agent replans.
- 01
Exists
The action is in your graph. Invented actions are refused.
orders.refundAll()✕ not in graph - 02
Types
Arguments match the schema exactly. Nothing is coerced.
seats.add(id, "five")✕ expected int - 03
References
Every ID resolves to a real record, or the call stops.
orders.refund("#1099")✕ no such order - 04
State
Preconditions hold on live data, right before it runs.
refund("#1042", 9000)✕ > refundable - 05
Consent
Writes are shown as a plan first. Nothing changes until the user says yes.
billing.changePlan(…)◷ waits for yes
04Scale
Complexity scales. Hallucinations don't.
One step or ten thousand, every step passes the same verification. In an unverified agent, hallucinated actions pile up with every step. With OuterEden, the number that reaches your platform stays at zero.
Illustrative simulation. Assumes 2% of the steps a model proposes are hallucinated: invented actions, wrong types, IDs that don't exist.
05Integrate
Describe. Declare. Paste.
One dependency and one call. OuterEden bundles your API into an agent, wires in chat and voice, and makes the calls. No tool schemas to write, no agent loop to host.
import { outerEden } from "@outereden/sdk";
outerEden(app, {
describe: "Orders, refunds, stock and billing.",
api: "./openapi.yaml",
confirm: ["write"],
voice: true,
});from outereden import OuterEden
eden = OuterEden(
app,
describe="Orders, refunds, stock and billing.",
api="openapi.yaml",
confirm=["write"],
voice=True,
)import { OuterEden } from "@outereden/sdk/react";
root.render(
<OuterEden app="acme-ops" voice>
<App />
</OuterEden>,
);<script src="https://cdn.outereden.dev/eden.js"
data-app="acme-ops" data-voice async></script>- $ npm i @outereden/sdk
- ✓ openapi.yaml · 14 operations
- ✓ typed action graph · 9 entities · 3 effect classes
- ✓ writes require confirmation
- ✓ chat + voice bundled
- live on ops.acme.example · users can talk to it
- 01
Describe your tools
In plain language: what your product does, and for whom. That's the agent's brief.
- 02
Declare your API
Point OuterEden at your OpenAPI file or typed functions. Mark which calls need a yes.
- 03
Paste the snippet
Chat and voice appear in your product. Every request becomes verified function calls.
06Versus API-first
An agent API is a project. OuterEden is a declaration.
API-first agent platforms hand you an endpoint. Everything between that endpoint and your product is still yours to build, and to keep working.
- Declare your API, paste the snippet
Agent-native
- Chat and voice for your users
- Typed actions from your declared API
- Verification before every step
- Retries without double writes
- Every write confirmed by the user
Ready
Let your users talk to it.
Bring your API. We'll bundle it with OuterEden and run your hardest workflow by voice, live.