Using ALLSmartLLM
OpenAI-compatible inference API on our own hardware in Austria. If your code talks to the OpenAI API, it talks to us. Swap the base URL and the key, nothing else.
Three steps
- Create an account at allsmartllm.com/en/login. After you confirm your e-mail we activate the account and let you know. Every new account starts with 10 million free tokens.
- Create an API key in the control centre under Keys. Keys start with
sk-allsmartllm-and are shown only once. - Send your first request:
curl https://allsmartllm.com/v1/chat/completions \ -H "Authorization: Bearer sk-allsmartllm-…" \ -H "Content-Type: application/json" \ -d '{ "model": "mid", "messages": [{"role": "user", "content": "Hallo!"}] }'
Base URL and authentication
| Base URL | https://allsmartllm.com/v1 |
|---|---|
| Authentication | Authorization: Bearer sk-allsmartllm-… |
| Format | JSON, as with OpenAI |
The key belongs in the header, never in a URL. Treat it like a password: don't commit it, don't ship it in client applications. Delete a compromised key in the control centre and create a new one.
OpenAI-compatible: your existing setup
You don't need a separate library. Any OpenAI SDK works with two changed values.
Python
from openai import OpenAI
client = OpenAI(
base_url="https://allsmartllm.com/v1",
api_key="sk-allsmartllm-…",
)
antwort = client.chat.completions.create(
model="mid",
messages=[{"role": "user", "content": "…"}],
)
print(antwort.choices[0].message.content)
JavaScript / TypeScript
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://allsmartllm.com/v1",
apiKey: "sk-allsmartllm-…",
});
const antwort = await client.chat.completions.create({
model: "mid",
messages: [{ role: "user", content: "…" }],
});
console.log(antwort.choices[0].message.content);
Other tools (LangChain, LlamaIndex, Continue, Open WebUI, Cursor, …): wherever you can enter an OpenAI base URL, enter https://allsmartllm.com/v1.
Models and aliases
In model you can pass a concrete model ID or an alias. An alias is a stable role name such as mid or coder. We resolve it server-side to whichever model currently fills that role best. When we swap a model or change hardware, nothing changes in your code.
Our recommendation: use aliases. Concrete model IDs are for when you need to pin one specific model reproducibly.
Which alias for what
| Alias | Use it for | Reasons? |
|---|---|---|
frontier | The hardest tasks: multi-step reasoning, long documents, image analysis. Our strongest model. | yes |
mid | The everyday all-rounder. Text, tools, images. Permanently loaded, answers immediately. | yes |
worker | The same model as mid but without reasoning: for pipelines, batch processing, anything where throughput matters and the task is clear. | no |
coder | Write, refactor, explain code. Specialised in agentic programming. | – |
vision | Image and video input with reasoning. | yes |
fast | Classification, routing, yes/no and A/B/C decisions. Very fast, no reasoning. | no |
swift | The same fast model as fast but with reasoning, for decisions that need a moment's thought. | yes |
judge | Grade, score, compare: judge other models' answers, apply rubrics. | yes |
embed | Embedding vectors for search and similarity (/v1/embeddings only). | – |
clef-flash | Fast decisions instead of text: a state plus typed questions, answered as probabilities. /v1/systemone only. | – |
clef | Like clef-flash, a larger model for more accurate decisions. /v1/systemone only. | – |
"Reasons?" is the default; you can override it per request (see below).
Fetch the current list live at any time:
curl https://allsmartllm.com/v1/aliases -H "Authorization: Bearer sk-allsmartllm-…"
curl https://allsmartllm.com/v1/models -H "Authorization: Bearer sk-allsmartllm-…"
In /v1/models aliases appear alongside the real models, recognisable by "owned_by": "smartllm-alias". /v1/aliases is our extension and not part of the OpenAI specification.
Which models sit behind the aliases, with licence, quantisation, context length and an independent quality index, is shown in the model table.
Decision models (not chat)
Two models in the table work fundamentally differently from all the others: clef-flash and clef. They produce no text. You don't send them a prompt and you don't get sentences back.
Instead you give a state and up to 64 typed questions. The model reads both in a single pass and returns a probability for every answer option. That is fast (a decision with three questions takes about a second), and the result is machine-readable without parsing it out of a sentence.
Separate endpoint: POST /v1/systemone. On /v1/chat/completions these models answer with 400, and conversely /v1/systemone rejects ordinary chat models.
Three question types
noul: true or false. The answer is a probability for “true”.choice: named options. The answer names the most likely one and gives the distribution over all.score: ordered levels. The answer is a value between the levels plus the distribution.
instructions is required on every question. Images are supported (base64, PNG/JPEG/WebP), not URLs.
curl https://allsmartllm.com/v1/systemone \
-H "Authorization: Bearer sk-allsmartllm-…" \
-H "Content-Type: application/json" \
-d '{
"model": "clef-flash",
"state": "Kunde will Rechnung storniert haben",
"questions": {
"intent": {"type": "choice", "instructions": "Was will der Kunde?",
"criteria": {"storno": "Stornierung", "frage": "Allgemeine Frage"}},
"dringlichkeit": {"type": "score", "instructions": "Wie dringend?",
"criteria": ["kann warten", "diese Woche", "heute"]},
"rechnung": {"type": "noul", "instructions": "Geht es um eine Rechnung?"}
}
}'
{
"model": "clef-flash",
"answers": {
"intent": {"type": "choice", "choice": "storno",
"probabilities": {"storno": 0.9898, "frage": 0.0102},
"confidence": 0.9179},
"dringlichkeit": {"type": "score", "score": 1.23,
"legend": {"0": "kann warten", "1": "diese Woche", "2": "heute"},
"probabilities": {"0": 0.2777, "1": 0.2180, "2": 0.5043},
"confidence": 0.0597},
"rechnung": {"type": "noul", "noul": 0.9702}
},
"usage": {"input_tokens": 305, "output_tokens": 0}
}
About confidence: it is not the highest probability but a separate measure of how sharply the distribution concentrates on one option. In the example below the most likely level has 0.50 while confidence is only 0.06. The answer is barely settled, even though one option leads.
Only the input is billed: output_tokens is 0 in every answer.
Controlling reasoning ("thinking")
Many of our models can think before answering. That improves hard tasks and, on easy ones, only costs time and tokens. Every alias has a sensible default (table above); per request you override it like this:
{
"model": "mid",
"messages": [{"role": "user", "content": "…"}],
"chat_template_kwargs": {"enable_thinking": false}
}
We accept three spellings as equivalent: chat_template_kwargs.enable_thinking (vLLM), top-level enable_thinking, and think (Ollama style). Your signal always wins over the alias default.
Two things worth knowing:
max_tokensincludes the thinking. A model that thinks for 1500 tokens and should then answer in 500 needsmax_tokensof at least 2000. Set too low, you get emptycontentbecause the budget was spent on reasoning.- The reasoning block is returned in the
reasoningfield, separate fromcontent. When streaming, likewise indelta.reasoning.
For tasks that don't need thinking, pick the matching alias right away (worker, fast); then there's nothing to set.
Streaming
As with OpenAI: "stream": true returns server-sent events, each data: event is a JSON chunk with delta. The last event before [DONE] carries usage.
stream = client.chat.completions.create(
model="mid",
messages=[{"role": "user", "content": "…"}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="", flush=True)
Images, tools, structured output
Images go in as an image_url content block, as a URL or a base64 data URL. Suitable: frontier, mid, vision.
{
"model": "vision",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "…"},
{"type": "image_url", "image_url": {"url": "data:image/png;base64,…"}}
]
}],
"max_tokens": 1000
}
Tool calling (function calling) works with the OpenAI schema (tools, tool_choice, replies with tool_calls). Supported by frontier, mid, worker, coder, vision, fast, swift, judge. A model's capabilities are listed in /v1/models under capabilities.
Structured output via response_format, either json_object or json_schema with a schema. For decisions with fixed options, fast + a JSON schema with enum is the intended combination: fast, and the answer is guaranteed to be one of the allowed values.
{
"model": "fast",
"messages": [{"role": "user", "content": "…"}],
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "kategorie",
"schema": {
"type": "object",
"properties": {
"kategorie": {"type": "string", "enum": ["a", "b", "c"]}
},
"required": ["kategorie"]
}
}
}
}
Embeddings
curl https://allsmartllm.com/v1/embeddings \
-H "Authorization: Bearer sk-allsmartllm-…" \
-H "Content-Type: application/json" \
-d '{"model": "embed", "input": ["…", "…"]}'
input takes a string or a list. Chat models on this endpoint respond with 400.
Priority and queueing
Our models run on finite hardware; under load we queue requests briefly rather than reject them. With the X-Priority header you tell us what's urgent:
| Header | Meaning |
|---|---|
X-Priority: high | Interactive, a human is waiting. Served first. |
| (none) | Normal. |
X-Priority: low | Batch, can wait. Moves to the back of the queue. |
If you mark your background load as low, your interactive requests get noticeably better response times. It's the same hardware.
Errors
| Status | Meaning | What to do |
|---|---|---|
401 | Key missing or invalid. | Check the header; verify the key in the control centre. |
400 | Request doesn't fit the model (e.g. an image to a text model, a chat model on /v1/embeddings). | Check capabilities in /v1/models. |
404 | Model or alias unknown. | Query /v1/models or /v1/aliases. |
429 | Your quota or rate limit is reached, or the queue is full. Retry-After says when to try again. | Wait and retry; for sustained demand, get in touch. |
503 | The model is currently unreachable (restart, maintenance). | Try again shortly. For frontier a fallback model usually steps in automatically. |
Whether something is currently wrong you can see without logging in on the status page, including availability over the last 30 days, measured rather than claimed.
Every response carries an X-Request-ID header. When you report a problem, include it; that's how we find the request.
What we store and what we don't
Via the API no content is stored: neither your prompts nor the answers. We log timestamp, model, token counts, duration and status code, which is what has to appear on an invoice. The full list is on the home page; it comes from the log schema, not from marketing copy.
Everything runs on our own hardware in Austria. There is no third party your data is passed on to.
To go one step further: with "privacy": {"mode": "pseudonymize"} in the request we detect personal data (names, addresses, IBANs, …) and replace it with placeholders before the model sees the text; in the response we restore the originals. "mode": "mask" masks permanently, without restoration. Costs a small surcharge on input tokens.
Pricing
Billed per million tokens, input and output separately, by model category:
| Category | Input | Output | Typical aliases |
|---|---|---|---|
| Reasoning | 0,75 € | 3,00 € | |
| Multimodal | 0,75 € | 3,00 € | judge |
| Code | 0,50 € | 2,00 € | coder |
| Standard | 0,50 € | 2,00 € | frontier, mid, worker, vision, embed |
| Schnell | 0,25 € | 1,00 € | fast, swift |
| Entscheidung | 0,25 € | 1,00 € |
The 10 million free tokens of every new account are used up first. You can see your balance in the control centre under "Usage", and manage your billing address there too.
Reasoning tokens count as output. One more reason to use worker or fast for simple tasks.
Try it without code
The control centre has a Workbench: run prompts against several models at once, compare answers and cost. Nothing is stored there.
Help
Questions, problems, a model you're missing: Support. You reach the person who built the system, not a queue.