SwissAI API
Une API chat completions compatible OpenAI. Créez une clé dans le portail, définissez le jeton Bearer, c’est parti — les SDK OpenAI existants fonctionnent en changeant base_url.
Démarrage rapide
Trois étapes jusqu’à votre première réponse :
1. Dans le dashboard développeur, créez une clé sous API Keys. Elle n’est affichée qu’une seule fois — conservez-la en lieu sûr. Format : sk-souheng-…
2. Envoyez une requête à l’endpoint de chat :
curlcurl -N https://api.swiss-ai.one/api/v1/external/chat/completions \
-H "Authorization: Bearer sk-souheng-VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{
"messages": [{ "role": "user", "content": "Dis bonjour en suisse allemand." }],
"stream": true
}'
3. Vous recevez un flux SSE compatible OpenAI (voir Streaming).
Authentification
Authentifiez chaque requête avec votre clé API dans l’en-tête Authorization :
httpAuthorization: Bearer sk-souheng-VOTRE_CLE
model du corps de requête est ignoré — vous pouvez envoyer n’importe quelle valeur (pratique pour des SDK OpenAI non modifiés).Les clés API se gèrent exclusivement dans le portail (créer, lister, révoquer). Jusqu’à 20 clés actives par compte.
URL de base
| Objet | URL |
|---|---|
| Base de l’API | https://api.swiss-ai.one |
| Chat Completions | /api/v1/external/chat/completions |
SDK OpenAI base_url | https://api.swiss-ai.one/api/v1/external |
POST/api/v1/external/chat/completions
Génère une réponse de chat. Le streaming est activé par défaut.
Corps de la requête
| Champ | Type | Défaut | Description |
|---|---|---|---|
messages requis | array | — | Liste de { "role", "content" }. Rôles : system, user, assistant, tool. |
stream | boolean | true | Streaming SSE on/off. |
temperature | number | 0.7 | 0.0–2.0. |
max_tokens | integer | 4096 | 1–128000. |
tools | array | null | Définitions d’outils au format OpenAI. |
tool_choice | string | null | p. ex. "auto". |
model est accepté mais ignoré (le modèle découle de la clé). Les champs inconnus sont ignorés.Streaming (SSE)
Avec "stream": true, l’API renvoie text/event-stream au format chunk OpenAI. Le flux se termine par data: [DONE].
ssedata: {"id":"chatcmpl-1a2b3c4d","object":"chat.completion.chunk","created":1750000000,"model":"swissai","choices":[{"index":0,"delta":{"content":"Hallo"},"finish_reason":null}]}
data: {"id":"chatcmpl-1a2b3c4d","object":"chat.completion.chunk","created":1750000000,"model":"swissai","choices":[{"index":0,"delta":{"content":"!"},"finish_reason":null}]}
data: {"id":"chatcmpl-1a2b3c4d","object":"chat.completion.chunk","created":1750000000,"model":"swissai","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: [DONE]
Sans streaming
Avec "stream": false, vous recevez un seul objet chat.completion :
json{
"id": "chatcmpl-1a2b3c4d",
"object": "chat.completion",
"created": 1750000000,
"model": "swissai",
"choices": [
{
"index": 0,
"message": { "role": "assistant", "content": "Bonjour ! Comment puis-je aider ?" },
"finish_reason": "stop"
}
]
}
Outils / function calling
Passez les outils au format OpenAI. Quand le modèle appelle un outil, des tool_calls sont renvoyés (streaming ou non). Renvoyez le résultat dans un message tool avec le tool_call_id correspondant.
json{
"messages": [{ "role": "user", "content": "Quel temps fait-il à Zurich ?" }],
"stream": false,
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Météo actuelle d’une ville",
"parameters": {
"type": "object",
"properties": { "city": { "type": "string" } },
"required": ["city"]
}
}
}],
"tool_choice": "auto"
}
Python
requests (streaming)
pythonimport json, requests
resp = requests.post(
"https://api.swiss-ai.one/api/v1/external/chat/completions",
headers={"Authorization": "Bearer sk-souheng-VOTRE_CLE"},
json={"messages": [{"role": "user", "content": "Bonjour"}], "stream": True},
stream=True,
)
for line in resp.iter_lines():
if not line:
continue
line = line.decode()
if line.startswith("data: "):
data = line[6:]
if data == "[DONE]":
break
delta = json.loads(data)["choices"][0]["delta"]
print(delta.get("content", ""), end="", flush=True)
JavaScript / Node
javascriptconst res = await fetch(
"https://api.swiss-ai.one/api/v1/external/chat/completions",
{
method: "POST",
headers: {
"Authorization": "Bearer sk-souheng-VOTRE_CLE",
"Content-Type": "application/json",
},
body: JSON.stringify({
messages: [{ role: "user", content: "Bonjour" }],
stream: true,
}),
}
);
const reader = res.body.getReader();
const decoder = new TextDecoder();
let buffer = "";
for (;;) {
const { done, value } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
const lines = buffer.split("\n");
buffer = lines.pop();
for (const line of lines) {
if (!line.startsWith("data: ")) continue;
const data = line.slice(6);
if (data === "[DONE]") { reader.cancel(); break; }
const delta = JSON.parse(data).choices[0].delta;
if (delta.content) process.stdout.write(delta.content);
}
}
SDK OpenAI
Les SDK OpenAI existants fonctionnent en définissant base_url et api_key. model est un champ obligatoire du SDK mais ignoré côté serveur.
pythonfrom openai import OpenAI
client = OpenAI(
api_key="sk-souheng-VOTRE_CLE",
base_url="https://api.swiss-ai.one/api/v1/external",
)
stream = client.chat.completions.create(
model="swissai", # au choix — ignoré
messages=[{"role": "user", "content": "Bonjour"}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="")
javascriptimport OpenAI from "openai";
const client = new OpenAI({
apiKey: "sk-souheng-VOTRE_CLE",
baseURL: "https://api.swiss-ai.one/api/v1/external",
});
const stream = await client.chat.completions.create({
model: "swissai", // au choix — ignoré
messages: [{ role: "user", content: "Bonjour" }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
Facturation et limites
- Les requêtes sont facturées au token sur votre solde (wallet).
- Vous voyez le solde et l’usage dans le dashboard, où vous pouvez aussi recharger.
- Jusqu’à 20 clés API actives par compte.
Codes d’erreur
| Statut | Signification |
|---|---|
401 | Clé API manquante, invalide ou inactive. |
402 | Solde épuisé — rechargez dans le dashboard. |
404 | Chemin / endpoint inconnu. |
429 | Limite de débit dépassée — réessayez plus tard. |
5xx | Problème serveur / amont temporaire. |