bobcat is an inference engine optimized for Apple silicon. Run local models on your Mac at unbelievably fast speeds.
bobcat chat -m lfm2.5:2.6b
> What is the capital of Japan? One sentence.
The capital of Japan is Tokyo.Install bobcat on a Mac with Apple silicon and macOS 26 or newer:
curl -fsSL https://raw.githubusercontent.com/jadidbourbaki/bobcat/main/install.sh | shDownload a model:
bobcat pull lfm2.5:2.6bChat with it:
bobcat chat -m lfm2.5:2.6bOr answer one prompt, for scripts and pipes:
bobcat respond -m lfm2.5:2.6b "Name three primes."LFM2.5-2.6B on an M4 Pro, with a 512-token prompt and 128 generated tokens. The details are here.
Start the server, then point your agent at it:
bobcat serve -m lfm2.5:2.6b -c 65536ANTHROPIC_BASE_URL=http://127.0.0.1:8080 \
ANTHROPIC_AUTH_TOKEN=bobcat \
ANTHROPIC_API_KEY="" \
CLAUDE_CODE_MAX_CONTEXT_TOKENS=65536 \
claude --model lfm2.5:2.6bopencode, in opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"bobcat": {
"npm": "@ai-sdk/openai-compatible",
"name": "bobcat",
"options": { "baseURL": "http://127.0.0.1:8080/v1" },
"models": { "lfm2.5:2.6b": { "name": "LFM2.5-2.6B" } }
}
}
}OPENAI_API_BASE=http://127.0.0.1:8080/v1 \
OPENAI_API_KEY=bobcat \
aider --model openai/lfm2.5:2.6bStart the server, then ask it typed questions about any input:
bobcat serve -m qwen3.5:4bcurl http://127.0.0.1:8080/v1/systemone -d '{
"model": "qwen3.5:4b",
"state": "Checkout returns 500 errors and orders are blocked.",
"questions": {
"team": {"type": "choice", "criteria": {"billing": "Payments", "technical": "Bugs"}},
"urgency": {"type": "score", "criteria": ["Can wait", "This week", "Today"]},
"outage": {"type": "noul", "instructions": "Is a service down?"}
}
}'from typesafe_sdk import Choice, TypeSafeClient
client = TypeSafeClient(base_url="http://127.0.0.1:8080", api_key="bobcat")
result = client.system_one(
"Checkout returns 500 errors.",
{"team": Choice(criteria={"billing": "Payments", "technical": "Bugs"})},
)curl http://127.0.0.1:8080/v1/decisions -d '{
"input": "Checkout returns 500 errors.",
"questions": [{"id": "outage", "type": "yes_no", "question": "A service is down."}]
}'One decision without a server
bobcat decide -m qwen3.5:4b '{"model": "qwen3.5:4b", "state": "Checkout is down.",
"questions": {"outage": {"type": "noul", "instructions": "Is a service down?"}}}'bobcat pull lfm2.5:350mbobcat pull lfm2.5:1.2bbobcat pull lfm2.5:2.6bbobcat pull lfm2.5:8bbobcat pull qwen3.5:0.8bbobcat pull qwen3.5:2bbobcat pull qwen3.5:4bbobcat pull qwen3.5:9bEvery language model above answers decisions, except LFM2.5-2.6B, whose chat template always opens a reasoning block before the answer.
bobcat pull clef:flashbobcat is still in alpha. We are rapidly adding support for more models and model families. Please stay tuned!