Swiss AI GroupDocs
Référence API

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
Le modèle est lié à la clé. Le modèle utilisé par une clé se définit dans le portail. Le champ 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

ObjetURL
Base de l’APIhttps://api.swiss-ai.one
Chat Completions/api/v1/external/chat/completions
SDK OpenAI base_urlhttps://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

ChampTypeDéfautDescription
messages requisarrayListe de { "role", "content" }. Rôles : system, user, assistant, tool.
streambooleantrueStreaming SSE on/off.
temperaturenumber0.70.0–2.0.
max_tokensinteger40961–128000.
toolsarraynullDéfinitions d’outils au format OpenAI.
tool_choicestringnullp. ex. "auto".
Remarque : 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

StatutSignification
401Clé API manquante, invalide ou inactive.
402Solde épuisé — rechargez dans le dashboard.
404Chemin / endpoint inconnu.
429Limite de débit dépassée — réessayez plus tard.
5xxProblème serveur / amont temporaire.