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_url | https://api.swiss-ai.one/api/v1/external |
POST/api/v1/external/chat/completions
chat 응답을 생성합니다. 스트리밍이 기본으로 켜져 있습니다.
요청 본문
| 필드 | 타입 | 기본값 | 설명 |
|---|---|---|---|
messages 필수 | array | — | { "role", "content" } 목록. 역할: system, user, assistant, tool. |
stream | boolean | true | SSE 스트리밍 켜기/끄기. |
temperature | number | 0.7 | 0.0–2.0. |
max_tokens | integer | 4096 | 1–128000. |
tools | array | null | OpenAI 형식의 도구 정의. |
tool_choice | string | null | 예: "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_url과 api_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개.
오류 코드
| 상태 | 의미 |
|---|---|
401 | API 키가 없거나 잘못됐거나 비활성 상태. |
402 | 잔액 소진 — 대시보드에서 충전하세요. |
404 | 알 수 없는 경로 / 엔드포인트. |
429 | 요청 한도 초과 — 나중에 다시 시도하세요. |
5xx | 일시적인 서버 / 업스트림 문제. |