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を変更

https://api.teai.io/v1

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!"}]
  }'
Tip: Nemotron 9B (日本語特化) は無料で無制限利用可能。"model": "nemotron-9b-jp"を指定してください。

Authentication

全てのAPIリクエストにはAuthorizationヘッダーが必要です。

Authorization: Bearer te_your_api_key

APIキーはDashboardで発行・管理できます。キーは発行時に1回だけ表示されるので、安全に保管してください。

Security: APIキーをクライアントサイドのコードやGitリポジトリに含めないでください。環境変数で管理することを推奨します。

Base URL

https://api.teai.io/v1

全てのエンドポイントはこのBase URLからの相対パスです。OpenAI SDKのbase_urlにそのまま設定できます。

POST /v1/chat/completions

チャット補完を生成します。OpenAI Chat Completions API完全互換。

Request Body

ParameterTypeRequiredDescription
modelstringYes使用するモデル (例: gpt-4o, claude-sonnet-4-6)
messagesarrayYesメッセージ配列 (role: system/user/assistant)
temperaturenumberNo0.0~2.0 (default: 1.0)
max_tokensintegerNo生成する最大トークン数
streambooleanNoSSEストリーミングを有効にする
toolsarrayNoFunction calling用のツール定義
tool_choicestringNo"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]
Note: OpenAI SDK を使う場合、このフォーマット解析は SDK が自動で処理します。直接 SSE を消費する場合は data: プレフィックスを除去し、[DONE] をストリーム終端として扱ってください。

Credits

teai.io はクレジット制を採用しています。1 クレジットはコスト単位であり、トークン数と直接は一致しません。モデルごとに 1K トークンあたりのクレジット消費量が異なります。

クレジット消費の目安

モデルInput (per 1K tokens)Output (per 1K tokens)
nemotron-9b-jp0 credits (無料)0 credits (無料)
gemini-2.5-flash0.075 credits0.30 credits
deepseek-chat0.135 credits0.54 credits
gpt-4o0.375 credits1.50 credits
claude-sonnet-4-60.375 credits1.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形式で返されます。

Statuserror.typeDescription対処法
400invalid_requestリクエスト形式が不正パラメータを確認
401authentication_errorAPIキーが無効または未指定APIキーを確認・再発行
402insufficient_creditsクレジット残高不足クレジットを追加購入
404model_not_found指定モデルが存在しない/v1/models で確認
429rate_limit_exceededレート制限超過Retry-Afterヘッダーに従う
500internal_errorサーバー内部エラーエクスポネンシャルバックオフでリトライ
502upstream_error上流プロバイダーエラー別モデルを試す or リトライ
503service_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

PlanRequests/hourRequests/day
Free (認証済み)120500
Guest (未認証)3030
Pro12030,000
Businessカスタム無制限

レート制限に達した場合、エラーメッセージが返されます。レスポンスボディのerrorフィールドを確認し、適切な間隔をあけてリトライしてください。

Tip: 未認証(Guest)は30リクエスト/日の制限があります。APIキーを使用することで制限が大幅に緩和されます。

Timeouts

ParameterValueDescription
接続タイムアウト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 IDProviderContextCredits/1K InputCredits/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 Google 1M 0.075 0.30
deepseek-chat DeepSeek 64K 0.135 0.54
qwen3-32b Alibaba (RunPod) 16K 0.18 0.72
Note: nemotron-9b-jp は日本語特化モデルで無制限・無料で利用できます。全モデルの詳細スペックと最新料金は /pricing を参照してください。