AI assistant
Connect any OpenAI-compatible model to your instance. Free, open source, and nothing hosted by us.
Apikee's assistant ships no model, no API key and no hosted inference service. You point your instance at an endpoint you control and the assistant works for everyone on it.
There is nothing to buy, no plan to upgrade, and no traffic leaving your infrastructure unless you pick a provider that lives outside it.
What "any AI" means
Apikee speaks the OpenAI chat-completions API, so one integration reaches almost everything:
| Runs on your hardware | Hosted |
|---|---|
| Ollama · vLLM · llama.cpp · LM Studio | OpenAI · Anthropic · Groq · Together · OpenRouter · Mistral · Azure OpenAI |
Anything else exposing POST /v1/chat/completions works too — choose Custom
endpoint and paste the URL. A gateway such as LiteLLM in front of a provider
Apikee does not list will also work.
Quickstart: a local model
The recommended setup. No API key, no bill, and nothing leaves the machine.
ollama pull llama3.1Then in Admin → Settings → AI:
- Pick Ollama.
- Leave the endpoint as
http://localhost:11434/v1. - Set the model to
llama3.1. - Press Test connection, switch the assistant on, and save.
Running Apikee in Docker? localhost inside the container is not your host. Use
http://host.docker.internal:11434/v1, or put both containers on one network and
use the service name.
Connecting a hosted provider
Same panel, three fields: provider, API key, model. The key is stored encrypted and never returned to the browser — the form shows a mask once it is set.
Or configure it before first boot:
AI_ENABLED=true
AI_PROVIDER=openai
AI_BASE_URL=https://api.openai.com/v1
AI_MODEL=gpt-4o-mini
AI_API_KEY=sk-...Values saved in the settings UI take precedence over the environment, so an operator can change providers without a redeploy. Full list in Configuration.
What the model is allowed to see
The assistant is grounded in the page you are looking at — your endpoints, clients, scopes and traffic — so it answers about your API instead of guessing. All of that passes through a redaction step first.
Credentials are always stripped, at every level: fields named like secrets
(apiKey, keyHash, token, password, …) and anything credential-shaped in free
text (sk-…, ghp_…, JWTs, URLs with inline passwords) become [redacted]. That
cannot be switched off.
On top of that, choose how much business data travels:
| Level | Removes | Use when |
|---|---|---|
| Strict | Credentials, plus names, emails and IPs | You use a hosted provider |
| Standard (default) | Credentials only | Most instances |
| Minimal | Credentials only, everything else sent | The model runs on your own hardware |
Two further guarantees:
- Page data is treated as data, never instruction. Endpoint paths and client
names are written by your API consumers, so they are fenced in the prompt and the
model is told not to obey anything inside that fence. A client named
"ignore your instructions"is reported as a string, not followed. - The assistant cannot change anything. When it offers to import endpoints or open a create dialog, that arrives as a button you press. Nothing mutates state on its own.
What it is useful for
- "Which endpoints have no scopes declared?"
- "Which endpoints errored in the last 24 hours?" — reads the same request logs you can browse by hand.
- "Import these routes" — paste an OpenAPI document or describe them informally, and it stages them for confirmation.
- "What should this endpoint's description say?"
Operational notes
- Rate limiting. Assistant calls are capped per user per minute, so a stuck client cannot run up a bill or saturate a GPU. Your provider's quota still applies.
- Timeouts. Requests abort after
AI_TIMEOUT_MS(default 60s). Raise it for large local models on CPU. - Model list. Endpoints implementing
GET /v1/modelsget a picker in the UI. Those that do not simply use the configured model — that is not an error. - Endpoint safety. Apikee refuses link-local cloud metadata addresses as an AI endpoint. Private and loopback addresses are allowed, because self-hosting is the point.
Helping it understand your API
Auto-registration teaches Apikee only the method and the path. The SDKs can send richer context, which is what makes the assistant and your generated docs accurate:
apikee.describeEndpoint('GET', '/v1/users', {
description: "List users in the caller's tenant.",
scopes: ['read:users'],
tags: ['users'],
})The SDKs never talk to a model themselves and take on no AI dependency — they only describe your API to your own instance, which is the thing holding the connection. See Endpoints.
Troubleshooting
| Symptom | Cause |
|---|---|
| "No AI endpoint connected" | The assistant is off, or the endpoint/model is blank. |
| 404 from the endpoint | The base URL is missing its API path — it usually ends in /v1. |
| "rejected the credential" | Wrong or expired API key. Local runtimes need none. |
| "did not respond in time" | Model too large for the host, or AI_TIMEOUT_MS too low. |
| Connection refused from Docker | Use host.docker.internal rather than localhost. |

