API Documentation
OpenAI互換 LLM API Gateway — 45以上のモデルを1つのAPIキーで
Quickstart
teai.ioはOpenAI互換APIを提供します。既存のOpenAI SDKコードを1行変更するだけで利用できます。
1. APIキーを取得
Dashboardでアカウント作成後、APIキーを発行してください。キーはte_で始まります。
2. base_urlを変更
3. コードを実行
from openai import OpenAI
client = OpenAI(
base_url="https://api.teai.io/v1",
api_key="te_your_api_key",
)
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Hello!"}],
)
print(response.choices[0].message.content)
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.teai.io/v1",
apiKey: "te_your_api_key",
});
const response = await client.chat.completions.create({
model: "gpt-4o",
messages: [{ role: "user", content: "Hello!" }],
});
console.log(response.choices[0].message.content);
curl https://api.teai.io/v1/chat/completions \
-H "Authorization: Bearer te_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [{"role": "user", "content": "Hello!"}]
}'
"model": "nemotron-9b-jp"を指定してください。
Authentication
全てのAPIリクエストにはAuthorizationヘッダーが必要です。
Authorization: Bearer te_your_api_key
APIキーはDashboardで発行・管理できます。キーは発行時に1回だけ表示されるので、安全に保管してください。
Base URL
全てのエンドポイントはこのBase URLからの相対パスです。OpenAI SDKのbase_urlにそのまま設定できます。
POST /v1/chat/completions
チャット補完を生成します。OpenAI Chat Completions API完全互換。
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| model | string | Yes | 使用するモデル (例: gpt-4o, claude-sonnet-4-6) |
| messages | array | Yes | メッセージ配列 (role: system/user/assistant) |
| temperature | number | No | 0.0~2.0 (default: 1.0) |
| max_tokens | integer | No | 生成する最大トークン数 |
| stream | boolean | No | SSEストリーミングを有効にする |
| tools | array | No | Function calling用のツール定義 |
| tool_choice | string | No | "auto", "none", "required" |
Response
{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"created": 1710000000,
"model": "gpt-4o",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "Hello! How can I help you?"
},
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": 12,
"completion_tokens": 8,
"total_tokens": 20
}
}
Streaming
"stream": trueを指定すると、SSE (Server-Sent Events) でトークンが逐次返されます。
stream = client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[{"role": "user", "content": "Rustの特徴を3つ教えて"}],
stream=True,
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
const stream = await client.chat.completions.create({
model: "claude-sonnet-4-6",
messages: [{ role: "user", content: "Rustの特徴を3つ教えて" }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || "");
}
curl https://api.teai.io/v1/chat/completions \
-H "Authorization: Bearer te_your_api_key" \
-H "Content-Type: application/json" \
-N \
-d '{
"model": "claude-sonnet-4-6",
"messages": [{"role": "user", "content": "Rustの特徴を3つ教えて"}],
"stream": true
}'
SSE Event Format
ストリーミング時、各チャンクは以下のフォーマットで返されます。各行は data: プレフィックスで始まり、最終行は data: [DONE] です。
# コンテンツチャンク
data: {"id":"chatcmpl-abc","object":"chat.completion.chunk","created":1710000000,"model":"gpt-4o","choices":[{"index":0,"delta":{"content":"Hello"},"finish_reason":null}]}
# 終了チャンク
data: {"id":"chatcmpl-abc","object":"chat.completion.chunk","created":1710000000,"model":"gpt-4o","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
# ストリーム終端
data: [DONE]
data: プレフィックスを除去し、[DONE] をストリーム終端として扱ってください。
Credits
teai.io はクレジット制を採用しています。1 クレジットはコスト単位であり、トークン数と直接は一致しません。モデルごとに 1K トークンあたりのクレジット消費量が異なります。
クレジット消費の目安
| モデル | Input (per 1K tokens) | Output (per 1K tokens) |
|---|---|---|
| nemotron-9b-jp | 0 credits (無料) | 0 credits (無料) |
| gemini-2.5-flash | 0.075 credits | 0.30 credits |
| deepseek-chat | 0.135 credits | 0.54 credits |
| gpt-4o | 0.375 credits | 1.50 credits |
| claude-sonnet-4-6 | 0.375 credits | 1.50 credits |
- Free プラン: サインアップ時に 100 クレジット付与 + Nemotron 9B は無制限
- 有効期限なし: クレジットは期限切れになりません
- 残高確認: レスポンスの
X-Credits-Remainingヘッダー、またはGET /api/v1/auth/meで確認できます
# 残高確認
curl https://api.teai.io/api/v1/auth/me \
-H "Authorization: Bearer te_your_api_key"
# レスポンス例
{
"user_id": "usr_abc",
"credits": 87,
"plan": "free"
}
GET /v1/models
利用可能な全モデルの一覧を返します。
curl https://api.teai.io/v1/models \
-H "Authorization: Bearer te_your_api_key"
GET /v1/models/pricing
各モデルの料金情報を含む詳細一覧を返します。
curl https://api.teai.io/v1/models/pricing \
-H "Authorization: Bearer te_your_api_key"
詳細な料金はPricingページを参照してください。
Tool Calling (Function Calling)
OpenAI互換のFunction Calling形式でツールを定義できます。
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "東京の天気は?"}],
tools=[{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get current weather",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"}
},
"required": ["city"]
}
}
}],
)
Python SDK
Installation
pip install openai
Setup
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.teai.io/v1",
api_key=os.environ["TEAI_API_KEY"],
)
# GPT-4oを使用
r = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "日本の首都は?"}],
)
print(r.choices[0].message.content)
# Claude Sonnetに切り替え(コード変更は1箇所だけ)
r = client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[{"role": "user", "content": "Pythonでクイックソートを書いて"}],
)
print(r.choices[0].message.content)
# 無料モデル(Nemotron 9B)
r = client.chat.completions.create(
model="nemotron-9b-jp",
messages=[{"role": "user", "content": "自己紹介して"}],
)
print(r.choices[0].message.content)
Node.js SDK
Installation
npm install openai
Setup
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.teai.io/v1",
apiKey: process.env.TEAI_API_KEY,
});
// モデルを自由に切り替え
const models = ["gpt-4o", "claude-sonnet-4-6", "gemini-2.5-flash"];
for (const model of models) {
const r = await client.chat.completions.create({
model,
messages: [{ role: "user", content: "1+1=" }],
});
console.log(`${model}: ${r.choices[0].message.content}`);
}
Go SDK
Installation
go get github.com/sashabaranov/go-openai
Setup
package main
import (
"context"
"fmt"
"os"
openai "github.com/sashabaranov/go-openai"
)
func main() {
config := openai.DefaultConfig(os.Getenv("TEAI_API_KEY"))
config.BaseURL = "https://api.teai.io/v1"
client := openai.NewClientWithConfig(config)
resp, err := client.CreateChatCompletion(
context.Background(),
openai.ChatCompletionRequest{
Model: "gpt-4o",
Messages: []openai.ChatCompletionMessage{
{Role: openai.ChatMessageRoleUser, Content: "Hello!"},
},
},
)
if err != nil {
panic(err)
}
fmt.Println(resp.Choices[0].Message.Content)
}
Java SDK
Maven
<dependency>
<groupId>com.openai</groupId>
<artifactId>openai-java</artifactId>
<version>0.8.0</version>
</dependency>
Setup
import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.*;
OpenAIClient client = OpenAIOkHttpClient.builder()
.baseUrl("https://api.teai.io/v1")
.apiKey(System.getenv("TEAI_API_KEY"))
.build();
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
.model("gpt-4o")
.addUserMessage("Hello!")
.build();
client.chat().completions().create(params)
.choices()
.forEach(c -> System.out.println(c.message().content()));
curl
# 環境変数にAPIキーを設定
export TEAI_API_KEY="te_your_api_key"
# Chat Completion
curl https://api.teai.io/v1/chat/completions \
-H "Authorization: Bearer $TEAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [{"role": "user", "content": "Hello!"}]
}'
# モデル一覧
curl https://api.teai.io/v1/models \
-H "Authorization: Bearer $TEAI_API_KEY"
# ストリーミング
curl https://api.teai.io/v1/chat/completions \
-H "Authorization: Bearer $TEAI_API_KEY" \
-H "Content-Type: application/json" \
-N \
-d '{
"model": "deepseek-chat",
"messages": [{"role": "user", "content": "日本の歴史を要約して"}],
"stream": true
}'
Error Handling
全てのエラーレスポンスは統一的なJSON形式で返されます。
| Status | error.type | Description | 対処法 |
|---|---|---|---|
| 400 | invalid_request | リクエスト形式が不正 | パラメータを確認 |
| 401 | authentication_error | APIキーが無効または未指定 | APIキーを確認・再発行 |
| 402 | insufficient_credits | クレジット残高不足 | クレジットを追加購入 |
| 404 | model_not_found | 指定モデルが存在しない | /v1/models で確認 |
| 429 | rate_limit_exceeded | レート制限超過 | Retry-Afterヘッダーに従う |
| 500 | internal_error | サーバー内部エラー | エクスポネンシャルバックオフでリトライ |
| 502 | upstream_error | 上流プロバイダーエラー | 別モデルを試す or リトライ |
| 503 | service_unavailable | メンテナンス中 | ステータスページを確認 |
エラーレスポンス形式
{
"error": {
"type": "rate_limit_exceeded",
"message": "Rate limit exceeded. Retry after 30 seconds.",
"code": 429,
"retry_after": 30
}
}
リトライ戦略
5xx エラーや 429 が返された場合は、エクスポネンシャルバックオフでリトライを推奨します。
# Python: エクスポネンシャルバックオフ例
import time, random
def call_with_retry(fn, max_retries=3):
for i in range(max_retries):
try:
return fn()
except Exception as e:
if i == max_retries - 1:
raise
wait = (2 ** i) + random.random()
time.sleep(wait)
Rate Limits
| Plan | Requests/hour | Requests/day |
|---|---|---|
| Free (認証済み) | 120 | 500 |
| Guest (未認証) | 30 | 30 |
| Pro | 120 | 30,000 |
| Business | カスタム | 無制限 |
レート制限に達した場合、エラーメッセージが返されます。レスポンスボディのerrorフィールドを確認し、適切な間隔をあけてリトライしてください。
Timeouts
| Parameter | Value | Description |
|---|---|---|
| 接続タイムアウト | 10秒 | TCP接続の確立まで |
| 非ストリーミング | 25秒 | レスポンス完了まで |
| ストリーミング | 25秒(各チャンク間) | 各チャンク間の最大待ち時間 |
| アイドルタイムアウト | 30秒 | SSEチャンク間の最大待ち時間 |
stream: trueの使用を推奨します。
Model Versioning
モデルIDの指定方法により、バージョン固定の有無を制御できます。
| 指定方法 | 例 | 動作 |
|---|---|---|
| エイリアス(推奨) | gpt-4o | プロバイダーの最新安定版を自動追従 |
| バージョン固定 | gpt-4o-2024-08-06 | 指定バージョンに固定。廃止予定時は30日前に通知 |
- バージョン変更通知: エイリアスが指すバージョンが変更される場合、Changelogで事前告知します
- 旧バージョン保持: 廃止されたバージョンは最低90日間サポートを継続
- 本番環境: 回帰テストの安定性が重要な場合はバージョン固定を推奨
Failover Behavior
teai.ioの自動フェイルオーバーはリクエストの指定方法により動作が異なります。
teai.ioの内部ルーティングはLoadBalancedProviderにより、サーキットブレーカー + ラウンドロビンで自動フェイルオーバーを実現しています。
- 明示的モデル指定:
"model": "gpt-4o"のように指定した場合、そのモデルを使用します。プロバイダー障害時はティア内の次のモデルにフェイルオーバーします。 - ティアベースの自動選択: economy / normal / powerful ティアに応じて最適なモデルが自動選択されます。
- 全プロバイダー障害時: Nemotron 9B(セルフホスト)が最終フォールバックとして動作します。
レスポンスの model_used フィールド
レスポンスボディのmodelフィールドに、実際に使用されたモデル名が返されます。フェイルオーバーが発生したかを確認できます。
{
"model": "claude-sonnet-4-6", // 実際に使用されたモデル
"choices": [...]
}
Models
主要モデルの一覧です。全モデルと詳細な料金はPricingページを参照してください。
| Model ID | Provider | Context | Credits/1K Input | Credits/1K Output |
|---|---|---|---|---|
| nemotron-9b-jp | NVIDIA (RunPod) | 8K | 0 (無料) | 0 (無料) |
| gpt-4o | OpenAI | 128K | 0.375 | 1.50 |
| claude-sonnet-4-6 | Anthropic | 200K | 0.375 | 1.50 |
| gemini-2.5-flash | 1M | 0.075 | 0.30 | |
| deepseek-chat | DeepSeek | 64K | 0.135 | 0.54 |
| qwen3-32b | Alibaba (RunPod) | 16K | 0.18 | 0.72 |
nemotron-9b-jp は日本語特化モデルで無制限・無料で利用できます。全モデルの詳細スペックと最新料金は /pricing を参照してください。