IBEX / boundary Open source · MIT

The boundary between your agent and the model

Memory for agents.Control for you.

Tenant-scoped memory, bounded context, and an inspectable trace — self-hosted and OpenAI-compatible.

IBEX / harness
G0 · Provisional
Inbound requestPOST/v1/chat/completions
Forwarded
request.http
01Authorization: Bearer $IBEX_TOKEN
02X-IBEX-Agent-ID: agent_support
03Content-Type: application/json
04{
05"model": "gpt-4o",
06"messages": [
07{
08"role": "user",
09"content": "hello"
10}
11]
12}
Response 200 · text/event-stream
data: {"choices":[{"delta":{"content":"..."}}]}
auth verifiedtenant from tokenbody unchanged
Tenant comes from the token Request lifecycle
  • OpenAI-compatible
  • Tenant-scoped
  • Inspectable traces
No hosted control plane

One boundary. Six jobs.

Use IBEX when agents need customer context without crossing tenant lines, or when you need a bounded, inspectable path to any model.

01Implemented

Knows who is asking.

Validates the token and binds the agent to its organization. Tenant scope comes from the credential, never the request body.

authorization
verified
org_id
from token
permissions
enforced
Read the contract
02Implemented

Recalls only their memory.

Retrieves tenant-scoped memories from PostgreSQL and pgvector, then ranks them without letting another organization’s data into the window.

retrieval
pgvector
scope
org-filtered
cache
Redis hot path
Read the contract
03Provisional

Fits context to budget.

Calculates a token budget, packs the directive and ranked memories, and degrades to directive-only context when retrieval misses.

budget
computed
ranking
budget-aware
fallback
directive-only
Read the contract
04Implemented

Routes to the model you chose.

Keeps the OpenAI-compatible request shape while OpenAI, Anthropic, OpenAI-compatible, and mock adapters sit behind one boundary.

openai
native
anthropic
adapter
compatible
adapter
Read the contract
05Provisional

Streams without holding the client.

Forwards provider SSE, normalizes upstream errors, and keeps trace writes off the critical path. Slow-client soak evidence remains open.

stream
SSE forwarded
errors
normalized
trace
async write
Read the contract
06Provisional

Leaves evidence behind.

Records the route, token usage, and timing with a scope and date. The relay is default-off; this is local evidence, not a hosted guarantee.

outbox
local evidence
relay
default-off
claim
scoped
Read the contract

Keep the request. Change the boundary.

Point your client at IBEX instead of the provider. The request stays OpenAI-compatible; auth, tenant scope, memory, and traces move behind the boundary.

Request lifecycle
curl -s -w "\nHTTP %{http_code}\n" \  -X POST "http://localhost:8080/v1/chat/completions" \  -H "Authorization: Bearer $IBEX_TEST_PAT" \  -H "X-IBEX-Agent-ID: $IBEX_TEST_AGENT_ID" \  -H "Content-Type: application/json" \  -d '{"model":"gpt-4o","messages":[{"role":"user","content":"hello"}]}'
Tenant comes from the token. Never from the body. API reference

What works today. What we don’t claim.

IBEX is G0 and provisional. Capabilities and benchmark numbers are published with a status, a scope, and a date, so you can tell the difference between a working seam and a finished guarantee.

Local evidenceScope keptNo hosted claim
Status and benchmark ledger Every number keeps its date
Capability status Local evidence

6 of 17 capabilities implemented locally.

13 are implemented or have a running seam. Every status is public, and every claim links back to its evidence. Hosted, HA, and production readiness are not claimed.

  • Implemented6
  • Provisional7
  • Proposed2
  • Deferred2
See the full status ledger
Local benchmark All runs
Local proxy p99
1.78 ms
k6 fast profile · mean gate, not a p99 SLOOct 7, 2026
HNSW recall@10
100.0%
local corpus · p95 8.2 msOct 6, 2026
Write pipeline p95
32.9 ms
40 local iterationsOct 6, 2026

Not claimed: production readiness, high availability, a hosted p99 SLO, or restore drills. Local numbers keep their scope and date.

IMPLEMENTED · PROVISIONAL · PROPOSED · DEFERRED · UNKNOWN Read the full ledger
04 / Run itLocal stack · MIT

Start with mock mode

Run the boundary locally.

Start Postgres, Redis, and the services with Docker Compose. Mock mode returns a response without a provider key, so you can inspect a request before connecting a model.

  1. 01
    Prepare

    Clone the repository and copy the example environment.

  2. 02
    Start the stack

    Postgres, Redis, and the local services come up together.

  3. 03
    Verify the seam

    Migrate, seed, and run the smoke path in mock mode.

The full quickstart covers separate service terminals and real provider keys.

quickstart.sh
git clone https://github.com/Rick1330/ibex-harness.gitcd ibex-harnesscp .env.example .envmake compose-dev-upmake db-migratemake db-seedmake dev-smoke
Mock mode returns 200 without a provider key. /docs/getting-started/quickstart
MIT licensed · self-hosted · no hosted control plane