feralbus LLM API
FrançaisLanguage and embedding models hosted on our own server (one RTX 3090), served by Ollama.
Last updated: October 4, 2026.
Access
- Address:
https://llm.feralbus.net - A key is required, in the
Authorization: Bearer <key>header. Without a key, every request gets a401error. The key is provided on request and must not be published. - Two formats to choose from:
- OpenAI-compatible under
/v1/…(/v1/chat/completions,/v1/embeddings,/v1/models): works with the OpenAI SDKs by changing onlybase_url; - native Ollama under
/api/…(/api/chat,/api/embed,/api/tags): Ollama documentation.
- OpenAI-compatible under
Models
| Name to call | Use | Details |
|---|---|---|
default |
Text (chat, generation) | Alias to the best model on the server, currently qwen3.8:27b. Use it in your applications: we switch models on the server without touching your code. Accepts images and tools (tool calling), reasons before answering. |
gemma4:26b |
Text | About 2.5 times faster than default, not yet validated on our tasks. Call it by name for experiments. |
bge-m3 |
Embeddings | 1024 dimensions, multilingual, up to 8,192 tokens per text. |
qwen3-embedding:4b |
Embeddings | 2560 dimensions, multilingual, up to 16,384 tokens per text. |
The current list is also available from the API: GET /v1/models or GET /api/tags.
Text
curl (OpenAI format)
curl https://llm.feralbus.net/v1/chat/completions \
-H "Authorization: Bearer $LLM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "default", "messages": [{"role": "user", "content": "Hello"}]}'
Python (openai SDK)
from openai import OpenAI
client = OpenAI(base_url="https://llm.feralbus.net/v1", api_key=LLM_API_KEY, timeout=1800)
r = client.chat.completions.create(
model="default",
messages=[{"role": "user", "content": "Hello"}],
)
print(r.choices[0].message.content)
Turning reasoning off (native format)
The default model thinks before answering, which makes responses slower. For a simple task, the native format lets you turn that reasoning off:
curl https://llm.feralbus.net/api/chat \
-H "Authorization: Bearer $LLM_API_KEY" \
-d '{"model": "default", "think": false, "stream": false,
"messages": [{"role": "user", "content": "Hello"}]}'
Embeddings
curl (OpenAI format)
curl https://llm.feralbus.net/v1/embeddings \
-H "Authorization: Bearer $LLM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "bge-m3", "input": ["text of page 1", "text of page 2"]}'
Response: {"data": [{"embedding": [...]}, ...]}, in the order the texts were sent.
Python (openai SDK)
from openai import OpenAI
client = OpenAI(base_url="https://llm.feralbus.net/v1", api_key=LLM_API_KEY, timeout=1800)
r = client.embeddings.create(model="qwen3-embedding:4b", input=["text 1", "text 2"])
vectors = [d.embedding for d in r.data]
curl (native format)
curl https://llm.feralbus.net/api/embed \
-H "Authorization: Bearer $LLM_API_KEY" \
-d '{"model": "bge-m3", "input": ["text 1", "text 2"]}'
Response: {"embeddings": [[...], [...]]}.
Good practices
- One model per index. Vectors from
bge-m3andqwen3-embedding:4bhave neither the same size nor the same space: never compare them with each other. Switching models means recomputing the whole index. - Send in batches: a list of texts in
inputrather than one request per text. - Split long texts. Beyond the model's limit (see the table), the text is truncated without any error: the end is ignored.
- Search with
qwen3-embedding:4b: prefix queries (not documents) with an instruction, for exampleInstruct: Find the pages that answer the query\nQuery: <query>. Documents are sent as they are.
Limits
- One graphics card, one queue. Every request that makes a model work (text, embeddings, images) takes its turn, in order of arrival. A request can therefore wait several minutes behind others: set a generous client timeout (30 minutes).
- Switching models: only one text model fits in memory at a time. Going from one to the other costs about 30 seconds of loading. An unused model is unloaded after 30 minutes.
- Context: 16,384 tokens by default for text (prompt and answer included).
- Speed: about 70 tokens per second for
defaultonce loaded. - Open routes: only usage routes answer (chat, generation, embeddings, model list and details). The others (pulling, copying, deleting models…) return a
403error. - Usage counting: every request is counted per key (input and output tokens). When streaming in the OpenAI format, add
"stream_options": {"include_usage": true}so tokens get counted. - Internal use only: no bulk processing without warning us first, the card also serves our production tools.