Swiss AI GroupDocs
API リファレンス

SwissAI API

OpenAI 互換の chat completions API です。ポータルでキーを作成し、Bearer トークンを設定すれば開始できます — 既存の OpenAI SDK は base_url を変えるだけで動作します。

クイックスタート

最初の応答までの 3 ステップ:

1. 開発者ダッシュボードAPI Keys でキーを作成します。一度だけ表示されるので安全に保管してください。形式:sk-souheng-…

2. chat エンドポイントにリクエストを送ります:

curlcurl -N https://api.swiss-ai.one/api/v1/external/chat/completions \
  -H "Authorization: Bearer sk-souheng-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [{ "role": "user", "content": "スイスドイツ語で挨拶して。" }],
    "stream": true
  }'

3. OpenAI 互換の SSE ストリームが返ります(ストリーミングを参照)。

認証

すべてのリクエストは API キーを Authorization ヘッダーに入れて認証します:

httpAuthorization: Bearer sk-souheng-YOUR_KEY
モデルはキーに紐づきます。キーが使うモデルはポータルで設定します。リクエストボディの model フィールドは無視されます — 任意の値を送れます(未改変の OpenAI SDK に便利)。

API キーはポータルでのみ管理します(作成・一覧・失効)。1 アカウントあたり有効なキーは最大 20 個です。

ベース URL

用途URL
API ベースhttps://api.swiss-ai.one
Chat Completions/api/v1/external/chat/completions
OpenAI SDK base_urlhttps://api.swiss-ai.one/api/v1/external

POST/api/v1/external/chat/completions

chat 応答を生成します。ストリーミングはデフォルトで有効です。

リクエストボディ

フィールド既定説明
messages 必須array{ "role", "content" } のリスト。ロール:systemuserassistanttool
streambooleantrueSSE ストリーミングの オン/オフ。
temperaturenumber0.70.0–2.0.
max_tokensinteger40961–128000.
toolsarraynullOpenAI 形式のツール定義。
tool_choicestringnull例:"auto"
注意:model は受理されますが無視されます(モデルはキーで決まります)。不明なフィールドは無視されます。

ストリーミング (SSE)

"stream": true の場合、API は OpenAI チャンク形式の text/event-stream を返します。ストリームは 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]

非ストリーミング

"stream": false の場合、単一の chat.completion オブジェクトを受け取ります:

json{
  "id": "chatcmpl-1a2b3c4d",
  "object": "chat.completion",
  "created": 1750000000,
  "model": "swissai",
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "こんにちは!どうしましたか?" },
      "finish_reason": "stop"
    }
  ]
}

ツール / 関数呼び出し

ツールは OpenAI 形式で渡します。モデルがツールを呼ぶと tool_calls が返ります(ストリーミングでも非ストリーミングでも)。結果は対応する tool_call_id を持つ tool メッセージとして返します。

json{
  "messages": [{ "role": "user", "content": "チューリッヒの天気は?" }],
  "stream": false,
  "tools": [{
    "type": "function",
    "function": {
      "name": "get_weather",
      "description": "都市の現在の天気",
      "parameters": {
        "type": "object",
        "properties": { "city": { "type": "string" } },
        "required": ["city"]
      }
    }
  }],
  "tool_choice": "auto"
}

Python

requests(ストリーミング)

pythonimport json, requests

resp = requests.post(
    "https://api.swiss-ai.one/api/v1/external/chat/completions",
    headers={"Authorization": "Bearer sk-souheng-YOUR_KEY"},
    json={"messages": [{"role": "user", "content": "こんにちは"}], "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-YOUR_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      messages: [{ role: "user", content: "こんにちは" }],
      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);
  }
}

OpenAI SDK

既存の OpenAI SDK は base_urlapi_key を設定すれば動作します。model は SDK の必須フィールドですが、サーバー側では無視されます。

pythonfrom openai import OpenAI

client = OpenAI(
    api_key="sk-souheng-YOUR_KEY",
    base_url="https://api.swiss-ai.one/api/v1/external",
)

stream = client.chat.completions.create(
    model="swissai",  # 任意 — 無視されます
    messages=[{"role": "user", "content": "こんにちは"}],
    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-YOUR_KEY",
  baseURL: "https://api.swiss-ai.one/api/v1/external",
});

const stream = await client.chat.completions.create({
  model: "swissai",            // 任意 — 無視されます
  messages: [{ role: "user", content: "こんにちは" }],
  stream: true,
});
for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}

課金と制限

  • リクエストはトークン単位で残高(wallet)から課金されます。
  • 残高と使用量はダッシュボードで確認でき、そこからチャージもできます。
  • 1 アカウントあたり有効な API キーは最大 20 個です。

エラーコード

ステータス意味
401API キーが無い、無効、または非アクティブ。
402残高切れ — ダッシュボードでチャージしてください。
404不明なパス / エンドポイント。
429レート制限超過 — 後でもう一度お試しください。
5xx一時的なサーバー / アップストリームの問題。