# shape exists only at runtime
r = client.responses.create(
model="…", input=prompt,
response_format=schema
)
data = json.loads(r.output_text)
sentiment = validate(data)
ai is a
keyword,
not an import
Typed model calls, pipelines and contracts — as language primitives, not library glue. One binary. Runs offline in mock mode.
Or the same curl installer as Linux. Apple Silicon only.
Unpack and put ecko.exe on your PATH. All platforms →
$ ecko repl Ecko v0.9.0 — no API key, mock mode >> type Sentiment = Positive | Negative | Neutral >> mood = ai[Sentiment] "loved it, shipped fast" => Positive >> Sentiment # the type is the schema => Positive | Negative | Neutral >> _
One binary No runtime No SDKs Mock mode runs offline
Five short
programs.
Mock mode needs no API key — pick a tab and press run. The output shown is what the runtime returns offline.
Same model.
No SDK.
Python needs a client, a schema, a parser and a retry loop. In Ecko,
ai returns a typed value — the language does the rest.
type Sentiment = Positive | Neutral | Negative mood = ai[Sentiment] "I love this" # runtime validates → Positive
In the runtime,
not a framework.
The pieces other stacks ship as frameworks live in the runtime here — typed calls, pipelines and contracts you write as ordinary code.
01
Typed output
Your types are the schema.
Declare a type once. The runtime asks the model for that shape and checks the answer before your code sees it — no second schema to keep in sync, no parse-and-hope layer.
02
Pipelines
Compose steps, not agents.
Chain typed calls like functions. Intermediate shapes, budgets and retries stay in the language — you skip standing up an orchestration stack just to move data from one prompt to the next.
03
Contracts
Bad answers stop here.
Contracts reject invalid results on the call path, before they reach the rest of the program. Mock mode keeps the same path green offline when no API key is set.
One server.
Every editor.
Completions, diagnostics and go-to-definition come from ecko lsp
in the one binary. VS Code gets a first-party extension; Zed and JetBrains
IDEs wire the same server in a few lines.
VS Code · Cursor
First-party extension
Syntax highlighting, snippets and a full language client that launches
ecko lsp — live diagnostics, completion, hover and
go-to-definition.
diagnostics · completion · hover · go-to-definstall guide
Zed
Point Zed at the binary
No separate plugin. Register the server in settings and get the same diagnostics and completion as VS Code.
"lsp": {
"ecko": {
"binary": {
"path": "ecko",
"arguments": ["lsp"]
}
}
}
setup
IntelliJ · JetBrains
IDEA, WebStorm and friends
Any JetBrains IDE that speaks LSP can run the same server — IntelliJ IDEA, WebStorm, PyCharm and the rest.
Command ecko Arguments lspsetup
Free for
personal use.
Licensed for
business.
Personal use and education stay free. Production needs a per-developer licence — full terms on Enterprise.
Personal
Free forever
Learning, side projects, evaluation, teaching.
- The whole language
- Mock mode & offline CI
- No key, no registration
- No telemetry
Team
$189 / developer / year
Ship production and internal tools.
- Commercial use in production
- Email support, one business day
- Security advisories early
- Honour-based licence · no phone-home
Enterprise
Custom
Site licences, air-gap, and procurement paperwork.
- Everything in Team
- Named contact & onboarding
- Air-gapped / Ollama bundles
- Custom terms & invoicing
Sixty seconds
to your first
typed ai call.
Homebrew: brew install ecko-lang/tap/ecko ·
binaries and checksums →