API LLM feralbus
EnglishModèles de langage et d'embeddings hébergés sur notre serveur (une RTX 3090), servis par Ollama.
Dernière mise à jour : 4 octobre 2026.
Accès
- Adresse :
https://llm.feralbus.net - Clé obligatoire, dans l'en-tête
Authorization: Bearer <clé>. Sans clé, toute requête reçoit une erreur401. La clé est fournie sur demande, elle ne doit pas être publiée. - Deux formats au choix :
- compatible OpenAI sous
/v1/…(/v1/chat/completions,/v1/embeddings,/v1/models) : fonctionne avec les SDK OpenAI en changeant seulementbase_url; - Ollama natif sous
/api/…(/api/chat,/api/embed,/api/tags) : documentation Ollama.
- compatible OpenAI sous
Modèles
| Nom à appeler | Usage | Détails |
|---|---|---|
default |
Texte (chat, génération) | Alias vers le meilleur modèle du serveur, actuellement qwen3.8:27b. À utiliser dans vos applications : on change de modèle côté serveur sans toucher à votre code. Accepte les images et les outils (tool calling), raisonne avant de répondre. |
gemma4:26b |
Texte | Environ 2,5 fois plus rapide que default, pas encore validé sur nos tâches. À appeler par son nom pour des essais. |
bge-m3 |
Embeddings | 1024 dimensions, multilingue, jusqu'à 8 192 tokens par texte. |
qwen3-embedding:4b |
Embeddings | 2560 dimensions, multilingue, jusqu'à 16 384 tokens par texte. |
La liste à jour est aussi disponible par l'API : GET /v1/models ou GET /api/tags.
Texte
curl (format OpenAI)
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": "Bonjour"}]}'
Python (SDK openai)
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": "Bonjour"}],
)
print(r.choices[0].message.content)
Désactiver le raisonnement (format natif)
Le modèle default réfléchit avant de répondre, ce qui allonge les réponses. Pour une tâche simple, le format natif permet de couper ce raisonnement :
curl https://llm.feralbus.net/api/chat \
-H "Authorization: Bearer $LLM_API_KEY" \
-d '{"model": "default", "think": false, "stream": false,
"messages": [{"role": "user", "content": "Bonjour"}]}'
Embeddings
curl (format OpenAI)
curl https://llm.feralbus.net/v1/embeddings \
-H "Authorization: Bearer $LLM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "bge-m3", "input": ["texte de la page 1", "texte de la page 2"]}'
Réponse : {"data": [{"embedding": [...]}, ...]}, dans l'ordre des textes envoyés.
Python (SDK openai)
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=["texte 1", "texte 2"])
vecteurs = [d.embedding for d in r.data]
curl (format natif)
curl https://llm.feralbus.net/api/embed \
-H "Authorization: Bearer $LLM_API_KEY" \
-d '{"model": "bge-m3", "input": ["texte 1", "texte 2"]}'
Réponse : {"embeddings": [[...], [...]]}.
Bonnes pratiques
- Un modèle par index. Les vecteurs de
bge-m3et deqwen3-embedding:4bn'ont ni la même taille ni le même espace : on ne les compare jamais entre eux. Pour changer de modèle, il faut recalculer tout l'index. - Envoyer par lots : une liste de textes dans
inputplutôt qu'une requête par texte. - Découper les textes longs. Au-delà de la limite du modèle (voir le tableau), le texte est tronqué sans erreur : la fin est ignorée.
- Recherche avec
qwen3-embedding:4b: préfixer les requêtes (pas les documents) par une consigne, par exempleInstruct: Trouver les pages qui répondent à la requête\nQuery: <requête>. Les documents s'envoient tels quels.
Limites
- Une seule carte graphique, une file d'attente. Toutes les requêtes qui font travailler un modèle (texte, embeddings, images) passent chacune leur tour, dans l'ordre d'arrivée. Une requête peut donc attendre plusieurs minutes derrière d'autres : prévoir un délai d'attente large (30 minutes) côté client.
- Changement de modèle : un seul modèle de texte tient en mémoire à la fois. Passer de l'un à l'autre coûte environ 30 secondes de chargement. Un modèle inutilisé est déchargé après 30 minutes.
- Contexte : 16 384 tokens par défaut pour le texte (prompt et réponse compris).
- Vitesse : environ 70 tokens par seconde pour
defaultune fois chargé. - Routes ouvertes : seules les routes d'usage répondent (chat, génération, embeddings, liste et détail des modèles). Les autres (téléchargement, copie, suppression de modèles…) renvoient une erreur
403. - Comptage : chaque requête est comptée par clé (tokens en entrée et en sortie). En streaming au format OpenAI, ajoutez
"stream_options": {"include_usage": true}pour que les tokens soient comptés. - Usage interne uniquement : pas de traitement en masse sans prévenir, la carte sert aussi nos outils en production.