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
RAM budgeted across loaded models — never OOMs your Mac
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.