OpenAI-compatible chat & embeddings plus a DINOv3 image-embedding route, on self-hosted GPUs.
Same schema as api.webanto.com — no Vercel, no billing. Authenticate with a bearer key.
https://llm.webanto.com/api/v1
Send your key (format wba_local_…) as a bearer token or x-api-key. Server-side only.
Authorization: Bearer $WEBANTO_API_KEY # or x-api-key: $WEBANTO_API_KEY
| Model | Endpoint | Kind |
|---|---|---|
| qwen | /chat | Chat (reasoning; keep max_tokens ≥ ~1024) |
| nomic-embed-text | /embeddings | Text embeddings (768-d) |
| clip | /embeddings | CLIP text embeddings (512-d, L2-normalized) |
| dinov3 | /image-embeddings | Image embeddings (1280-d, L2-normalized) |
curl https://llm.webanto.com/api/v1/chat \
-H "Authorization: Bearer $WEBANTO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen",
"messages": [{ "role": "user", "content": "Explain embeddings in one sentence." }],
"max_tokens": 1024, "temperature": 0.7
}'
Response is a standard chat.completion (choices/message/usage) plus a credits field. Add "stream": true for SSE token streaming.
curl https://llm.webanto.com/api/v1/embeddings \
-H "Authorization: Bearer $WEBANTO_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "model": "nomic-embed-text", "input": ["hello world"] }'
Custom (non-OpenAI) contract. Send urls or images (base64), not both.
curl https://llm.webanto.com/api/v1/image-embeddings \
-H "Authorization: Bearer $WEBANTO_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "urls": ["https://cdn.example.com/card.jpg"] }'
| GET /api/v1/status | no auth — liveness → {"status":"ok"} |
| GET /api/v1/health | auth — verifies your key → {"ok":true,"scopes":[…]} |
A pure OpenAI-compatible surface is also live at https://llm.webanto.com/v1 (model local-llm) — point any OpenAI SDK at it directly.
Bodies are { "error": … }. Check the HTTP status: 400 invalid, 401 bad/missing key, 403 wrong scope, 502 backend unavailable (safe to retry).