Relay-E
Reference

Roadmap

What's coming, ordered by ROI. Pre-1.0; subject to change.

This is a living document. The state of master is the source of truth — this page captures the priority order.

Recently shipped

Per-tenant API keys ✓

POST /v1/api-keys, GET /v1/api-keys, DELETE /v1/api-keys/{id} — first-class key issuance and revocation, scoped per tenant. Keys are SHA-256 hashed at rest; the raw value is shown once on creation. DEV_API_KEY remains as a local-dev fallback.

Message + usage persistence ✓

Every agent turn now writes user message, assistant message, run record, and usage_events row to Postgres — fire-and-forget after the HTTP response is sent. Sessions are created on first use (deterministic UUID derived from tenant + session key).

Per-tenant token quota middleware ✓

token_quota_monthly on the tenants table enforced before every agent run. Usage is cached in-process (5 min TTL) and invalidated after each turn is persisted. Quota 0 = unlimited.

Unified skills endpoint ✓

/v1/skills now handles CRUD (GET, POST, DELETE) and the response includes id, source ("global" or "tenant"), systemPrompt, toolNames, and connectorIds. /v1/tenant-skills is retired.

SqlConnectorBase abstract class ✓

PostgresConnector and MySQLConnector now share schema introspection, SQL safety layer, prompt context formatting, and tool generation through an abstract base class. Adding a new SQL connector type (SQLite, MSSQL, BigQuery) is now ~80 lines.

Near-term (next minor releases)

Memory compaction

Long sessions exceed any context window. The plan: keep last N turns verbatim, summarise older turns into a running memory document, embed individual old turns and retrieve when relevant.

Queued runs (/v1/runs)

Long agentic runs (search, summarise 100 docs) move to BullMQ. Sync chat stays in the request handler. The queue scaffolding is already in @relay-e/queue; the API surface is the missing piece.

HITL approval flow (/v1/runs/:id/approve)

For tools flagged requiresApproval, the queued path pauses, the API exposes approve/reject endpoints, the run resumes. The lock primitive exists; the HTTP routes don't yet.

MCP connector adapter

Today, tools are TypeScript. With MCP support, customers point Relay-E at an MCP server (their own or a standard one — Stripe, Plaid, etc.) and get tools + resources for free. This is the unlock for "real domain integrations without forking."

Skill-as-config

Skills are DB-storable (via POST /v1/skills) but the JSON config loader is not yet wired — relay-e.config.json can't define skills inline today. Lands when the bundle loader reads skills from both the JSON file and the DB.

Medium-term

TypeScript SDK (@relay-e/sdk-ts)

A first-class typed client published to public npm. Replaces the current "generate from OpenAPI" path with something with hand-written ergonomics — streaming helpers, retry logic, error types.

Python SDK (@relay-e/sdk-py)

Same story for Python.

Multi-modal input pipeline

Audio → transcript (Whisper / Deepgram), files → chunked text + embeddings, images → vision-capable models. Pipeline is scaffolded; the tools aren't wired.

Eval harness (npm run eval)

A fixed dataset of representative prompts run on every PR. LLM-as-judge or rule-based scoring. Tracks quality / cost / latency over time. Without this, optimization changes ship blindly.

Observability integrations

First-class Langfuse / Helicone / OpenTelemetry hooks. Today the data shape is structured but the integrations are bring-your-own.

Longer-term

Hosted version (relay-e.com)

Managed Relay-E with a dashboard, billing, and zero ops. The OSS engine remains the same code — the hosted version adds the management plane.

Web dashboard

Skill / tool / connector management UI. Live request inspector. Usage analytics.

Bull Board for queues

Real-time view of job state, retries, failures.

Multi-arch Docker builds

arm64 alongside amd64. Currently amd64-only because arm64 under QEMU on free GitHub runners is too slow. Lands when we move to native arm64 runners (Depot.dev or paid runners).

RLS enforcement

Postgres Row-Level Security policies enforced by default in production. Belt-and-braces multi-tenant isolation.

Sharding by tenant

When one Postgres can't hold all tenants. Years away — most teams won't get there.

What we're explicitly not building

IdeaWhy not
Custom prompt-template DSLThe model is the template engine. System prompts as plain strings are simpler.
Fine-tuning infrastructureFrontier models + good RAG covers 95%. Use OpenAI/Anthropic API-based fine-tuning when you need the last 5%.
Our own vector databasepgvector is fine for millions of vectors. Switch only if we genuinely outgrow it.
LangChain compatibility layerLangChain's abstractions don't match ours. Migrating from LangChain means rewriting your skills/tools — that's intentional.
In-house model servingUse OpenRouter / Ollama / your provider of choice. Hosting models isn't our value-add.

How to influence priorities

  • Open an issue on GitHub with a use case.
  • PRs welcome — start with a small one to align on style; we'll iterate.
  • Discussions for "should we…" questions before code.

This roadmap reflects what's most valuable for the most users. If your specific need isn't here, that's a signal it's worth surfacing.

On this page