Skip to content

For developers

A local, OpenAI-compatible AI server on your Mac.

Point your existing OpenAI or Anthropic client at localhost. One API sends each request to the right model, runs what can run together, and costs nothing per token. Video, perception and retrieval get native routes alongside the OpenAI-compatible surface.

curl http://localhost:1337/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "auto",
    "messages": [{"role":"user","content":"Hello from my Mac"}]
  }'
from openai import OpenAI

client = OpenAI(base_url="http://localhost:1337/v1", api_key="local")

r = client.chat.completions.create(
    model="auto",
    messages=[{"role": "user", "content": "Hello from my Mac"}],
)
print(r.choices[0].message.content)
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "http://localhost:1337/v1",
  apiKey: "local",
});

const r = await client.chat.completions.create({
  model: "auto",
  messages: [{ role: "user", content: "Hello from my Mac" }],
});
console.log(r.choices[0].message.content);
curl http://localhost:1337/anthropic/v1/messages \
  -H "content-type: application/json" \
  -d '{
    "model": "auto",
    "max_tokens": 512,
    "messages": [{"role":"user","content":"Hello from my Mac"}]
  }'

One API, routed by type

Many models. One endpoint.

Each request goes to the right model; they run in parallel, with RAM budgeted across all of them.

Your apps & agents

Chat Qwen3.5 7B always-on
Image FLUX.1 schnell always-on
Voice Whisper v3 always-on
Vision Qwen2.5-VL JIT
Embeddings Nomic Embed JIT

RAM budgeted across loaded models — never OOMs your Mac

Qwen3.5 · 4.3 GBFLUX.1 · 11 GBWhisper · 3.1 GB 13.6 GB free

Endpoints

OpenAI- and Anthropic-compatible, plus native management routes.

OpenAI-compatible · /v1

GET /v1/models
List loaded & available models with metadata
POST /v1/responses
Stateful responses with SSE streaming, reasoning and tools
POST /v1/chat/completions
Chat, tools, JSON-schema structured output, multimodal
POST /v1/completions
Text completion
POST /v1/embeddings
Local embeddings (batch) for RAG / search
POST /v1/audio/transcriptions
Local speech-to-text
POST /v1/audio/speech
Local text-to-speech
POST /v1/images/generations
Local image generation

Anthropic-compatible

POST /anthropic/v1/messages
System/user/assistant + tool blocks, reasoning, media gating

Native management · /api/v1

/api/v1/video/generations
Local text-to-video and image-to-video as async jobs
/api/v1/perception/*
Core ML: OCR, classification, detection, segmentation, depth, pose
/api/v1/search · /rerank
Document and multimodal retrieval with reranking
/api/v1/models · /discover · /download
Inventory, Hugging Face search/import, resumable downloads
/api/v1/models/load · /unload · /evict
Lifecycle: load with overrides, unload, TTL evict
/api/v1/loaded-models · /memory
Per-model + aggregate live memory accounting
/api/v1/runtime/scheduler
Per-lane policy, queue, submit/finish/cancel
/api/v1/settings
Typed settings: read, patch, import/export/reset
/api/v1/diagnostics · /metrics
Redacted bundle, TTFT/tok-s/latency
/api/v1/hardware · /capabilities
SoC, unified memory, engine capability matrix

MCP

Connect MCP tools to local models through a local mcp.json with per-server permission gates. Bedrova reads that file; it does not edit servers for you, because a half-working editor would be worse than none.

Structured output

Guaranteed-shape JSON via response_format json_schema (and Responses text.format) where the model supports it.

CLI and headless

Start, stop, status, download, load, unload, benchmark and diagnostics. Scriptable, no interface required.

Auth & security

Localhost is unrestricted by default. LAN/Tailscale exposure needs a generated access key behind an explicit toggle, with configurable CORS. Streaming is Server-Sent Events with OpenAI-style [DONE] framing. See Trust & privacy.

FAQ

Do I need an API key?

Not on localhost. The server is unrestricted on 127.0.0.1 by default. Exposing it to your LAN or Tailscale needs an access key and an explicit toggle, and then you use an OpenAI Bearer or Anthropic x-api-key header.

How does routing work?

Send model: "auto" (or a specific model id) and Bedrova routes each request by endpoint and type to the right loaded model, loading it just-in-time if needed.

Is it really drop-in compatible?

Yes. Point the official OpenAI or Anthropic SDKs at the local base URL. Bedrova is validated against both SDKs, including SSE streaming and structured output.

Are there rate limits?

No per-token bills and no vendor quotas. It is your hardware. Throughput is bounded by your Mac and by per-model concurrency, and an overloaded lane returns a retryable 503 with Retry-After rather than queueing forever.

How do I generate video from code?

Video is an asynchronous job: POST to /api/v1/video/generations, then poll the returned id. Jobs survive an app restart, and cancelling frees the memory immediately. See the video docs.