TL;DR — Any client built for OpenAI works with jusInfer. Set base_url to https://api.jusinfer.com/v1 and api_key to a jinf_ token. Both /v1/chat/completions and /v1/responses are supported. Streaming, tool use, vision, and JSON mode all pass through.
OpenAI-compatible drop-in
If your tool can talk to api.openai.com, it can talk to jusInfer. Change two lines of config — base_url and api_key — and you're routed through jusInfer with no other code changes. We support both the Chat Completions API (/v1/chat/completions) and the Responses API (/v1/responses).
TL;DR
base_url: https://api.jusinfer.com/v1
api_key: jinf_your_key_here (mint at https://jusinfer.com/developer)
model: jusInfer-auto (or any provider/model — we'll route it)
That's the entire integration.
Per-tool quickstart
Cursor
Settings → Models → Override OpenAI Base URL: https://api.jusinfer.com/v1
Settings → Models → OpenAI API key: jinf_…
Toggle "Use custom OpenAI key for all models" → on.
Aider
export OPENAI_API_BASE="https://api.jusinfer.com/v1"
export OPENAI_API_KEY="jinf_..."
aider --model openai/jusInfer-auto
Cline (VS Code extension)
Cline Settings → API Provider: "OpenAI Compatible"
Base URL: https://api.jusinfer.com/v1
API Key: jinf_...
Model: jusInfer-auto
Continue (VS Code / JetBrains)
~/.continue/config.json:
{
"models": [{
"title": "jusInfer",
"provider": "openai",
"apiBase": "https://api.jusinfer.com/v1",
"apiKey": "jinf_...",
"model": "jusInfer-auto"
}]
}
Goose (Block)
goose configure
# Provider: OpenAI
# Host: https://api.jusinfer.com
# API key: jinf_...
# Model: jusInfer-auto
OpenAI SDK (Python)
from openai import OpenAI
client = OpenAI(
base_url="https://api.jusinfer.com/v1",
api_key="jinf_...",
)
resp = client.chat.completions.create(
model="jusInfer-auto",
messages=[{"role": "user", "content": "Refactor this function for readability."}],
)
print(resp.choices[0].message.content)
OpenAI SDK (Node)
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.jusinfer.com/v1",
apiKey: process.env.JUSINFER_API_KEY,
});
const resp = await client.chat.completions.create({
model: "jusInfer-auto",
messages: [{ role: "user", content: "Explain this stack trace." }],
});
console.log(resp.choices[0].message.content);
curl
curl https://api.jusinfer.com/v1/chat/completions \
-H "Authorization: Bearer jinf_..." \
-H "Content-Type: application/json" \
-d '{
"model": "jusInfer-auto",
"messages": [{"role":"user","content":"Hello"}],
"stream": true
}'
What we forward, normalize, or override
| Feature | Behavior |
|---|---|
model | jusInfer-auto lets us pick; a specific id (e.g. anthropic/claude-sonnet-4.5) is honored |
messages | passed through |
tools / function_call | normalized between OpenAI and Anthropic shapes automatically |
stream: true | SSE forwarded transparently; usage frame included at end |
temperature, top_p, max_tokens | passed through (clamped to model limits) |
seed, logprobs | passed if upstream supports; ignored if not |
usage.cost (response) | set by jusInfer in microdollars, even when upstream doesn't report it |
Responses API
The newer Responses endpoint (/v1/responses) is supported with the same auth and base URL. Use it if your harness prefers stateful conversations:
curl https://api.jusinfer.com/v1/responses \
-H "Authorization: Bearer jinf_..." \
-H "Content-Type: application/json" \
-d '{
"model": "jusInfer-auto",
"input": "Write a Python function to compute Fibonacci."
}'
Errors you might see
| Status | Code | What it means |
|---|---|---|
| 401 | INVALID_KEY | Wrong / revoked / expired jinf_ token |
| 402 | INSUFFICIENT_CREDITS | Wallet is empty — top up at /developer → Billing |
| 403 | SEAT_REQUIRED | >1 member, no seat sub — subscribe in Billing |
| 429 | RATE_LIMIT | Per-key or per-tenant RPM — wait or raise the cap |
| 502 | UPSTREAM_ERROR | Upstream model temporarily down; retry |
Related
Agent-readable raw markdown: /docs/openai-drop-in.md