Hébergez et interagissez avec vos LLMs open source via une API compatible OpenAI.
Prêt en 5 minutes. Créez un compte → déployez une instance → appelez l'API. Aucune infrastructure à gérer.
Heberking AI déploie un serveur Ollama dédié dans un conteneur Docker en France. Vous obtenez une instance avec un port Ollama isolé, accessible via notre API REST.
Votre app
│ Authorization: Bearer hk_live_...
▼
https://heberking.ai/api/instances/{id}/ollama/v1/chat/completions
│
▼
Backend Heberking AI (auth + proxy)
│
▼
Ollama (Docker, France) → LLM (Gemma/LLaMA/Mistral...)
| Fonctionnalité | Disponible |
|---|---|
| Chat completions (compatible OpenAI) | ✅ |
| Streaming SSE | ✅ |
| Completions (legacy) | ✅ |
| List models | ✅ |
| Embeddings | ✅ (si le modèle le supporte) |
| Vision / multimodal | ✅ Gemma 4 Vision |
| Function calling | ✅ Via Ollama |
| Fine-tuning | ✅ Sur votre instance |
De zéro à votre premier appel API.
Rendez-vous sur heberking.ai/register. Aucune CB requise pour l'essai gratuit.
gemma3:4b (recommandé pour débuter)hk_live_... — elle n'est affichée qu'une foiscurl https://heberking.ai/api/instances/123/ollama/v1/chat/completions \
-H "Authorization: Bearer hk_live_..." \
-H "Content-Type: application/json" \
-d '{
"model": "gemma3:4b",
"messages": [{"role": "user", "content": "Bonjour !"}]
}'
from openai import OpenAI
client = OpenAI(
base_url="https://heberking.ai/api/instances/123/ollama/v1",
api_key="hk_live_..."
)
response = client.chat.completions.create(
model="gemma3:4b",
messages=[{"role": "user", "content": "Bonjour !"}]
)
print(response.choices[0].message.content)
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'https://heberking.ai/api/instances/123/ollama/v1',
apiKey: 'hk_live_...',
});
const response = await client.chat.completions.create({
model: 'gemma3:4b',
messages: [{ role: 'user', content: 'Bonjour !' }],
});
console.log(response.choices[0].message.content);
Remplacez 123 par l'ID de votre instance et hk_live_... par votre clé API.
Heberking AI accepte deux méthodes d'authentification pour l'API :
Authorization: Bearer hk_live_<votre_clé>
Les clés API commencent toujours par hk_live_. Elles sont générées dans Paramètres → Clés API et stockées sous forme de hash SHA-256 côté serveur (non récupérables).
# .env
HEBERKING_API_KEY=hk_live_...
HEBERKING_INSTANCE_ID=123
import os
from openai import OpenAI
client = OpenAI(
base_url=f"https://heberking.ai/api/instances/{os.environ['HEBERKING_INSTANCE_ID']}/ollama/v1",
api_key=os.environ["HEBERKING_API_KEY"]
)
Pour le dashboard et le chat intégré, un JWT est utilisé. Il est obtenu via POST /api/auth/login et a une durée de vie de 7 jours. Non recommandé pour l'intégration API.
| Méthode | Cas d'usage | Durée |
|---|---|---|
hk_live_... | Intégrations, scripts, serveurs | Jusqu'à révocation |
| JWT Bearer | Dashboard web, chat UI | 7 jours |
Une instance est un conteneur Docker avec Ollama, dédié à votre compte. Chaque instance a son propre port Ollama et son modèle configuré.
| État | Description |
|---|---|
stopped | Instance créée mais Ollama non démarré — facturation suspendue |
creating | Déploiement en cours (~30s) |
running | Ollama actif, API disponible |
error | Erreur — contactez le support |
Une fois l'instance en état running, son endpoint est :
https://heberking.ai/api/instances/{instance_id}/ollama/v1/
C'est un proxy compatible OpenAI qui supporte tous les endpoints Ollama :
| Path | Équivalent OpenAI |
|---|---|
v1/chat/completions | /v1/chat/completions |
v1/completions | /v1/completions |
v1/models | /v1/models |
v1/embeddings | /v1/embeddings |
api/chat | Format natif Ollama |
api/generate | Format natif Ollama |
Instance arrêtée : Les appels API retourneront 503 Service Unavailable si l'instance n'est pas en état running. Démarrez-la depuis le dashboard.
Heberking AI supporte tous les modèles du catalogue Ollama. Voici les modèles recommandés :
| Modèle | Tag Ollama | Taille | Points forts |
|---|---|---|---|
| Gemma 4 | gemma3:4b | 4B | Rapide, polyvalent, vision |
| Gemma 4 27B | gemma3:27b | 27B | Haute qualité, proche GPT-4 |
| LLaMA 3.3 | llama3.3:70b | 70B | Meilleur open source, multilingual |
| Mistral 7B | mistral:7b | 7B | Équilibre vitesse/qualité |
| Phi-4 | phi4:14b | 14B | Raisonnement, code |
| Qwen 2.5 | qwen2.5:14b | 14B | Multilingue, code |
| DeepSeek R1 | deepseek-r1:7b | 7B | Raisonnement avancé |
| Code LLaMA | codellama:7b | 7B | Génération de code |
| Nomic Embed | nomic-embed-text | — | Embeddings / RAG |
curl https://heberking.ai/api/instances/123/ollama/v1/models \
-H "Authorization: Bearer hk_live_..."
Installer un modèle : Dans le dashboard, allez sur votre instance → Modèles → Télécharger. Le téléchargement depuis Ollama Hub prend 1-5 minutes selon la taille.
L'endpoint principal, 100% compatible avec l'API OpenAI /v1/chat/completions.
POST /api/instances/{instance_id}/ollama/v1/chat/completions
| Paramètre | Type | Requis | Description |
|---|---|---|---|
model | string | ✅ | Nom du modèle Ollama, ex: gemma3:4b |
messages | array | ✅ | Liste de messages {role, content} |
stream | boolean | — | true pour SSE streaming |
temperature | float | — | 0.0–2.0, défaut 0.8 |
top_p | float | — | Nucleus sampling |
max_tokens | int | — | Tokens max en réponse |
system | string | — | System prompt (alternative à messages) |
curl https://heberking.ai/api/instances/123/ollama/v1/chat/completions \
-H "Authorization: Bearer hk_live_..." \
-H "Content-Type: application/json" \
-d '{
"model": "gemma3:4b",
"temperature": 0.7,
"messages": [
{"role": "system", "content": "Tu es un assistant expert en droit français."},
{"role": "user", "content": "Qu'\''est-ce qu'\''un KBIS ?"}
]
}'
{
"id": "chatcmpl-...",
"object": "chat.completion",
"model": "gemma3:4b",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "Le KBIS est un document officiel..."
},
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": 42,
"completion_tokens": 128,
"total_tokens": 170
}
}
messages = [
{"role": "system", "content": "Tu es un assistant utile."},
{"role": "user", "content": "Qu'est-ce que Python ?"},
{"role": "assistant", "content": "Python est un langage de programmation..."},
{"role": "user", "content": "Et ses principaux avantages ?"}
]
Activez le streaming pour recevoir les tokens au fur et à mesure, réduisant la latence perçue.
Ajoutez "stream": true à votre requête. La réponse sera un flux SSE (Server-Sent Events).
from openai import OpenAI
client = OpenAI(
base_url="https://heberking.ai/api/instances/123/ollama/v1",
api_key="hk_live_..."
)
stream = client.chat.completions.create(
model="gemma3:4b",
messages=[{"role": "user", "content": "Raconte-moi une blague."}],
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'https://heberking.ai/api/instances/123/ollama/v1',
apiKey: 'hk_live_...',
});
const stream = await client.chat.completions.create({
model: 'gemma3:4b',
messages: [{ role: 'user', content: 'Raconte-moi une blague.' }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || '');
}
curl https://heberking.ai/api/instances/123/ollama/v1/chat/completions \
-H "Authorization: Bearer hk_live_..." \
-H "Content-Type: application/json" \
--no-buffer \
-d '{
"model": "gemma3:4b",
"stream": true,
"messages": [{"role": "user", "content": "Raconte-moi une blague."}]
}'
data: {"id":"chatcmpl-...","choices":[{"delta":{"content":"La"},"index":0}]}
data: {"id":"chatcmpl-...","choices":[{"delta":{"content":" blague"},"index":0}]}
data: {"id":"chatcmpl-...","choices":[{"delta":{"content":"..."},"index":0}]}
data: [DONE]
L'API Heberking AI est un drop-in replacement pour l'API OpenAI. Dans la plupart des cas, 2 lignes suffisent.
# Avant
from openai import OpenAI
client = OpenAI(api_key="sk-...")
# Après
from openai import OpenAI
client = OpenAI(
base_url="https://heberking.ai/api/instances/123/ollama/v1",
api_key="hk_live_..."
)
// Avant
const client = new OpenAI({ apiKey: 'sk-...' });
// Après
const client = new OpenAI({
baseURL: 'https://heberking.ai/api/instances/123/ollama/v1',
apiKey: 'hk_live_...',
});
# .env
OPENAI_API_BASE=https://heberking.ai/api/instances/123/ollama/v1
OPENAI_API_KEY=hk_live_...
from openai import OpenAI
import os
# Lit OPENAI_API_BASE et OPENAI_API_KEY automatiquement
client = OpenAI(
base_url=os.environ.get("OPENAI_API_BASE"),
api_key=os.environ.get("OPENAI_API_KEY")
)
| OpenAI | Heberking AI (Ollama) | Notes |
|---|---|---|
gpt-4o | gemma3:27b ou llama3.3:70b | Performances proches sur la plupart des tâches |
gpt-4o-mini | gemma3:4b | Rapide et efficace |
gpt-3.5-turbo | mistral:7b | Bon compromis vitesse/qualité |
text-embedding-3-small | nomic-embed-text | Embeddings locaux |
pip install openai
from openai import OpenAI
import os
client = OpenAI(
base_url=f"https://heberking.ai/api/instances/{os.environ['HK_INSTANCE_ID']}/ollama/v1",
api_key=os.environ["HK_API_KEY"]
)
response = client.chat.completions.create(
model="gemma3:4b",
messages=[{"role": "user", "content": "Explique la récursivité en 3 phrases."}]
)
print(response.choices[0].message.content)
with client.chat.completions.create(
model="gemma3:4b",
messages=[{"role": "user", "content": "Génère un poème sur la mer."}],
stream=True
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
def ask_assistant(question: str, system: str = "Tu es un assistant utile.") -> str:
response = client.chat.completions.create(
model="gemma3:4b",
messages=[
{"role": "system", "content": system},
{"role": "user", "content": question}
],
temperature=0.7,
max_tokens=1000
)
return response.choices[0].message.content
# Usage
answer = ask_assistant(
"Rédige un email professionnel pour reporter une réunion.",
system="Tu es un assistant en communication professionnelle."
)
print(answer)
# Assurez-vous que nomic-embed-text est installé sur l'instance
embedding = client.embeddings.create(
model="nomic-embed-text",
input="Texte à vectoriser"
)
vector = embedding.data[0].embedding # Liste de floats
import asyncio
from openai import AsyncOpenAI
async_client = AsyncOpenAI(
base_url="https://heberking.ai/api/instances/123/ollama/v1",
api_key="hk_live_..."
)
async def main():
response = await async_client.chat.completions.create(
model="gemma3:4b",
messages=[{"role": "user", "content": "Bonjour async !"}]
)
print(response.choices[0].message.content)
asyncio.run(main())
npm install openai
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: `https://heberking.ai/api/instances/${process.env.HK_INSTANCE_ID}/ollama/v1`,
apiKey: process.env.HK_API_KEY,
});
const response = await client.chat.completions.create({
model: 'gemma3:4b',
messages: [{ role: 'user', content: 'Explique les closures JavaScript.' }],
});
console.log(response.choices[0].message.content);
const stream = client.chat.completions.stream({
model: 'gemma3:4b',
messages: [{ role: 'user', content: 'Génère 5 idées de startup.' }],
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? '');
}
const finalMessage = await stream.finalMessage();
console.log('\nTokens utilisés:', finalMessage.usage?.total_tokens);
import OpenAI from 'openai';
import { ChatCompletionMessageParam } from 'openai/resources/chat';
const client = new OpenAI({
baseURL: 'https://heberking.ai/api/instances/123/ollama/v1',
apiKey: process.env.HK_API_KEY!,
});
async function chat(messages: ChatCompletionMessageParam[]): Promise<string> {
const response = await client.chat.completions.create({
model: 'gemma3:4b',
messages,
temperature: 0.7,
});
return response.choices[0].message.content ?? '';
}
// app/api/chat/route.ts
import { NextRequest } from 'next/server';
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: `https://heberking.ai/api/instances/${process.env.HK_INSTANCE_ID}/ollama/v1`,
apiKey: process.env.HK_API_KEY,
});
export async function POST(req: NextRequest) {
const { messages } = await req.json();
const stream = await client.chat.completions.create({
model: 'gemma3:4b',
messages,
stream: true,
});
const encoder = new TextEncoder();
const readable = new ReadableStream({
async start(controller) {
for await (const chunk of stream) {
const text = chunk.choices[0]?.delta?.content ?? '';
if (text) controller.enqueue(encoder.encode(text));
}
controller.close();
},
});
return new Response(readable, {
headers: { 'Content-Type': 'text/plain; charset=utf-8' },
});
}
curl https://heberking.ai/api/instances/123/ollama/v1/chat/completions \
-H "Authorization: Bearer hk_live_..." \
-H "Content-Type: application/json" \
-d '{
"model": "gemma3:4b",
"messages": [
{"role": "system", "content": "Réponds toujours en français."},
{"role": "user", "content": "Quelle est la capitale de la France ?"}
],
"temperature": 0.3
}'
curl https://heberking.ai/api/instances/123/ollama/v1/chat/completions \
-H "Authorization: Bearer hk_live_..." \
-H "Content-Type: application/json" \
--no-buffer \
-d '{"model":"gemma3:4b","stream":true,"messages":[{"role":"user","content":"Compte jusqu'\''à 10 lentement."}]}'
curl https://heberking.ai/api/instances/123/ollama/v1/models \
-H "Authorization: Bearer hk_live_..."
curl https://heberking.ai/api/instances/123/ollama/v1/embeddings \
-H "Authorization: Bearer hk_live_..." \
-H "Content-Type: application/json" \
-d '{"model":"nomic-embed-text","input":"Texte à vectoriser"}'
curl https://heberking.ai/api/instances/123/ollama/v1/completions \
-H "Authorization: Bearer hk_live_..." \
-H "Content-Type: application/json" \
-d '{"model":"gemma3:4b","prompt":"La photosynthèse est","max_tokens":200}'
pip install langchain-openai
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="gemma3:4b",
openai_api_base="https://heberking.ai/api/instances/123/ollama/v1",
openai_api_key="hk_live_...",
temperature=0.7
)
# Utilisation directe
from langchain.schema import HumanMessage
response = llm([HumanMessage(content="Explique le RAG en 3 phrases.")])
print(response.content)
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
# LLM
llm = ChatOpenAI(
model="gemma3:27b",
openai_api_base="https://heberking.ai/api/instances/123/ollama/v1",
openai_api_key="hk_live_..."
)
# Embeddings locaux
embeddings = OpenAIEmbeddings(
model="nomic-embed-text",
openai_api_base="https://heberking.ai/api/instances/123/ollama/v1",
openai_api_key="hk_live_..."
)
# Vectorstore
texts = ["Document 1 sur le RGPD...", "Document 2 sur la conformité..."]
vectorstore = FAISS.from_texts(texts, embeddings)
# Chain RAG
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
result = qa.run("Qu'est-ce que le RGPD impose aux entreprises ?")
print(result)
pip install llama-index-llms-openai
from llama_index.llms.openai import OpenAI
from llama_index.core import Settings
Settings.llm = OpenAI(
model="gemma3:4b",
api_base="https://heberking.ai/api/instances/123/ollama/v1",
api_key="hk_live_..."
)
hk_live_ et n'est affichée qu'une seule foisImportant : La clé complète n'est affichée qu'à la création. Côté serveur, seul un hash SHA-256 est stocké. Si vous la perdez, créez-en une nouvelle et révoquez l'ancienne.
Bonne pratique : effectuez une rotation des clés tous les 90 jours.
Maximum 10 clés API actives par compte. Vous pouvez en créer autant que nécessaire en révoquant les anciennes.
Recevez des notifications HTTP lors d'événements sur vos instances.
| Événement | Déclencheur |
|---|---|
instance.started | L'instance passe en état running |
instance.stopped | L'instance est arrêtée |
instance.error | Erreur sur l'instance |
instance.deleted | L'instance est supprimée |
POST https://votre-serveur.com/webhook
Content-Type: application/json
X-HK-Signature: sha256=<hmac_hex>
{
"event": "instance.started",
"instance_id": 42,
"instance_name": "mon-llm-prod",
"timestamp": "2026-05-08T14:30:00Z"
}
import hmac
import hashlib
def verify_webhook(payload: bytes, signature: str, secret: str) -> bool:
expected = "sha256=" + hmac.new(
secret.encode(), payload, hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)
Allez dans Paramètres → Webhooks pour créer et gérer vos webhooks.
| Code HTTP | Signification | Solution |
|---|---|---|
400 | Bad Request — body invalide | Vérifiez le format JSON et les paramètres requis |
401 | Unauthorized — auth manquante ou invalide | Vérifiez votre clé API ou token JWT |
403 | Forbidden — vous n'avez pas accès à cette instance | Vérifiez l'ID de l'instance |
404 | Instance introuvable | Vérifiez l'ID de l'instance |
429 | Too Many Requests | Réduisez la fréquence des requêtes |
503 | Instance non démarrée | Démarrez l'instance depuis le dashboard |
503 | Ollama inaccessible | Attendez que l'instance soit complètement démarrée (~30s) |
{
"detail": "Instance non démarrée"
}
from openai import OpenAI, APIStatusError
try:
response = client.chat.completions.create(...)
except APIStatusError as e:
if e.status_code == 503:
print("Instance arrêtée — démarrez-la depuis le dashboard")
elif e.status_code == 401:
print("Clé API invalide")
else:
print(f"Erreur {e.status_code}: {e.message}")
| Plan | Instances | Tokens/mois | Clés API |
|---|---|---|---|
| Starter | Instance partagée | 2 000 | 1 |
| Pro | 1 instance dédiée | Illimités | 10 |
| Enterprise | Illimité | Illimités | Illimité |
| Paramètre | Valeur |
|---|---|
| Timeout requête | 300 secondes |
| Timeout démarrage instance | 120 secondes |
Chaque instance dédiée peut traiter plusieurs requêtes en parallèle — Ollama gère la file d'attente en interne. Sur les plans Pro et Enterprise, il n'y a pas de limite de concurrence côté Heberking AI.
Besoin de plus ? Contactez-nous pour un plan Enterprise personnalisé avec SLA, support dédié et instances GPU.