Swiss AI GroupDocs
API 레퍼런스

SwissAI API

OpenAI 호환 chat completions API입니다. 포털에서 키를 만들고 Bearer 토큰을 설정하면 시작 — 기존 OpenAI SDK는 base_url만 바꾸면 동작합니다.

빠른 시작

첫 응답까지 세 단계:

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 스트림이 반환됩니다 (스트리밍 참조).

인증

모든 요청은 Authorization 헤더에 API 키를 넣어 인증합니다:

httpAuthorization: Bearer sk-souheng-YOUR_KEY
모델은 키에 묶입니다. 키가 어떤 모델을 쓰는지는 포털에서 설정합니다. 요청 본문의 model 필드는 무시됩니다 — 아무 값이나 보낼 수 있습니다(수정하지 않은 OpenAI SDK에 편리).

API 키는 포털에서만 관리합니다(생성, 목록, 폐기). 계정당 활성 키 최대 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" } 목록. 역할: system, user, assistant, tool.
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)에서 청구됩니다.
  • 잔액과 사용량은 대시보드에서 확인하고 충전할 수 있습니다.
  • 계정당 활성 API 키 최대 20개.

오류 코드

상태의미
401API 키가 없거나 잘못됐거나 비활성 상태.
402잔액 소진 — 대시보드에서 충전하세요.
404알 수 없는 경로 / 엔드포인트.
429요청 한도 초과 — 나중에 다시 시도하세요.
5xx일시적인 서버 / 업스트림 문제.