LLM APIの始め方

今の開発環境から、複数のAIモデルを1つのAPIキーで。

Quickstart

まず接続し、実際の作業を1件試します。OpenAI SDKを使う場合は、接続先とAPIキーを設定してください。

⚡ Sente(先手)— ターミナルで動くコーディングエージェント

Sente(先手)は、プロジェクトのコードを読み、調査・修正・確認を進めるCLIエージェントです。コマンドはte。インストール後にセットアップし、自分のプロジェクトで使います。

  • 用意するもの:macOS / Linux(arm64・x64)のターミナル、curl・tar・Python 3、インターネット接続、作業するプロジェクト。Windowsではこの手順をWSL内で実行します。プロジェクト自体の実行環境はREADMEで確認してください。
  • 認証:登録後、DashboardでAPIキーを発行して手元に用意します。

1. ターミナル:インストール

curl -fsSL https://teai.io/te | sh

入力欄に te_ で始まるAPIキーを貼ります(既存キーがあれば省略)。Enterでスキップした場合は、次の te login でキーを入力。te login 成功時の Saved to … が保存の目印です。独立した te setup コマンドはありません。

2. ターミナル:キーを確認・設定

te login

3. ターミナル:対象フォルダで起動

次の /path/to/project は引用符を残して実際のプロジェクトのパスに置き換えます。空白を含むパスにも対応し、移動に成功したときだけSenteを起動します。

cd "/path/to/project" && te

Senteの入力画面が開いたら、次の文章をSente内に貼ります。te で始まる端末コマンドと、Senteへの依頼文は入力先が違います。

このプロジェクトの起動手順を調べて、必要なコマンドを教えてください。設定が足りなければ、その項目を示してください。

案内された手順でプロジェクトが起動するか確認します。既存の開発ツールへの接続は接続ガイドへ。

最初の1件を、調査 → 実装・検証 → 引継ぎ

自分のプロジェクトでSenteを初めて使う方向け。起動を妨げる問題を1件調べ、必要なら修正し、検証結果と再開用メモを残します。未導入ならインストール・認証から。

導入済みならターミナルで te update を実行し、Senteを終了・再起動します。既存の個人コマンドは保持されるため、同名の定義がある場合は動作を確認してください。

用語:MCPは外部のサービスやツールにつなぐ仕組み。個人コマンドは自分で定義した /名前 の依頼テンプレートです。以下のコマンドは配布済みのテンプレートで、実際の操作はモデル・設定・権限に依存します。

料金・データ:モデルへの依頼は選択モデル・接続先の料金に従います(teai料金・残高)。会話、読み込んだコードの一部、ツール出力などは選択モデルの接続先へ送られ、MCP利用時はその接続先とも通信します。APIキーは認証欄で扱い、依頼文やGitには含めません。詳細は te privacy とデータの扱いへ。

準備:プロジェクトのディレクトリで設定確認

te doctor --workflow

LLMを呼ばずに有効な設定を確認します。Sente内では /workflow で設定の説明を頼めます。どちらも、MCPやAPIの接続・認証成功を証明するものではありません。

Sente内で、結果を確認しながら1つずつ依頼

/investigate 対象は今開いているプロジェクトです。起動手順と、起動を妨げる問題を1件調べてください。ファイルは変更せず、根拠のファイルと未確認の前提を示してください。コマンド実行が必要なら、その内容と目的を先に示してください。

結果で分岐:問題を再現できたら次の修正へ。問題なしなら修正を飛ばして引継ぎへ。未再現なら、試した手順・期待した結果・実際のエラーを補足して再調査します。

次の依頼は、この問題に必要なファイル変更と検証コマンドの実行までが対象です。公開・デプロイ、削除、課金が必要になったら追加確認するよう依頼します。

/implement 調査した問題を、このプロジェクト内の必要な変更で修正してください。プロジェクトの規約に従い、必要な検証を実行して、差分・実行したテストと結果・未確認事項を示してください。公開・デプロイ、削除、課金が必要なら先に確認してください。
/handoff 目的、制約、変更したファイル、実行した検証と未実行の検証、次の一手を1つまとめてください。編集権限があれば引継ぎを保存し、保存先を示してください。

/handoff は workflow_checkpoint の観測に目的や次の一手を添えます。checkpoint自体は読取専用で、自動保存や作業完了を保証しません。編集できなければ返答のテキストを保存し、再開時は作業ツリーと検証結果を確認し直してください。

再開:同じプロジェクトで新しいSenteを開く

次の docs/handoff.md は実際に保存されたパスへ置き換えます。保存していない場合は、引継ぎの返答をこの依頼と一緒に貼ってください。

docs/handoff.md の引継ぎを読んでください。現在の差分と検証結果を確認し直し、残っている次の一手から再開してください。完了済みと未確認を分けてください。

つまずいたら

  • command not found:端末で export PATH="$HOME/.local/bin:$PATH" を実行して再試行。まだ見つからなければインストールのエラーを確認します(独自のインストール先を指定した場合はそのパスを使用)。
  • 認証エラー:接続とDashboardのキーを確認し、端末で te login をやり直します。環境変数 TEAI_API_KEY は保存キーより優先されます。保存キーを使うなら同じ端末で unset TEAI_API_KEY を実行してから再起動。環境変数で管理するなら、その値を正しいキーへ更新して再起動します。残高不足なら同じ画面で確認します。
  • /コマンドが見つからない:端末で te update → Senteを再起動 → / で候補を確認。個人定義がある場合は ~/.config/sente/command/・commands/・sente.json の同名定義を確認します。通常文で依頼する場合も、調査だけか変更までかを明記してください。

マルチエージェントへの依頼例

複数エージェントの利用を明示して頼む例です。利用できるツール・権限によって実行可否が変わり、並列化や品質を保証するものではありません。

/implement この問題をマルチエージェントで調査・修正してください。独立した調査は並列に進め、根拠を統合してから実装してください。実装後は別のエージェントに差分をレビューしてもらい、指摘に対応してください。最後に実行したテストと結果、未確認事項、次の一手を示してください。

1. 登録してAPIキーを取得

無料登録 → DashboardでAPIキーを発行。キーはte_で始まります。登録で100クレジット。生成時に残高を消費します。

2. 接続先と環境変数を設定

https://api.teai.io/v1

macOS / Linuxのターミナル例です。発行したキーを環境変数 TEAI_API_KEY に設定します。

export TEAI_API_KEY="te_your_api_key"

3. コードを実行

python3 -m pip install openai
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.teai.io/v1",
    api_key=os.environ["TEAI_API_KEY"],
)

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Hello!"}],
)
print(response.choices[0].message.content)

コードを quickstart.py に保存し、python3 quickstart.py で実行します。

npm install openai
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.teai.io/v1",
  apiKey: process.env.TEAI_API_KEY,
});

const response = await client.chat.completions.create({
  model: "gpt-4o",
  messages: [{ role: "user", content: "Hello!" }],
});
console.log(response.choices[0].message.content);

コードを quickstart.mjs に保存し、node quickstart.mjs で実行します。

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!"}]
  }'
確認ポイント: 空でない回答が表示されれば、最初の生成を確認できました。エラーが出たらステータス別の対処法へ。次は自分の作業の入力に変え、結果が使えるか確認してください。最新のモデルと料金は料金ページで確認できます。

API接続で困ったとき

まずAPIキーの読み込みとモデル一覧を確認します。次のコマンドはモデル一覧を取得するだけで、文章を生成しません。

curl --fail-with-body --max-time 30 https://api.teai.io/v1/models \
  -H "Authorization: Bearer $TEAI_API_KEY"

モデル一覧の取得だけでは、認証や残高、生成の成功までは確認できません。生成リクエストのステータスと本文も確認してください。

401:APIキーを確認

実行するターミナルでTEAI_API_KEYを設定し、SDKのキー指定を確認します。必要ならDashboardで再発行します。同じ無効なキーで再試行しても解消しません。

402:残高とエラー本文を確認

エラー本文が残高不足を示している場合は、Dashboardで残高とチャージ反映を確認してください。残高を確認できるまで生成の自動再試行を止めます。

429:指定された時間を待つ

Retry-Afterがあればその指示に従います。短時間に連打せず、同時実行数を減らしてください。

空の回答・タイムアウト

空の回答を成功として扱わず、モデル・出力上限・エラー本文を確認します。タイムアウトはサーバー側の処理完了が不明なため、再送で重複処理や追加消費が起き得ます。稼働状況と利用履歴を確認してから判断してください。

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)
qwen/qwen3.7-flash1 credit1 credit
gemini-2.5-flash1 credit3 credits
deepseek-chat1 credit1 credit
gpt-4o5 credits15 credits
claude-sonnet-4-66 credits18 credits
  • Free プラン: 登録だけで 100 クレジット付与(カード不要)+ Qwen3.7 Flash は激安(入力$0.03/100万token)
  • 有効期限なし: クレジットは期限切れになりません
  • 残高確認: レスポンスの 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)

# 激安モデル(Qwen3.7 Flash)
r = client.chat.completions.create(
    model="qwen/qwen3.7-flash",
    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
  }
}

リトライ戦略

最初の接続確認ではSDKの自動再試行を無効にし、エラーを1回ずつ確認します。401・402は設定や残高の確認が先です。429はRetry-After、5xxは稼働状況を確認してから再試行を判断してください。

import os
from openai import OpenAI, APIStatusError, APIConnectionError

client = OpenAI(
    base_url="https://api.teai.io/v1",
    api_key=os.environ["TEAI_API_KEY"],
    max_retries=0,
    timeout=60.0,
)

try:
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": "Hello!"}],
        max_tokens=256,
    )
except APIStatusError as error:
    print("HTTP", error.status_code)
    print("Retry-After:", error.response.headers.get("retry-after", "not provided"))
    raise
except APIConnectionError:
    print("Connection failed; server-side completion is unknown. No automatic retry.")
    raise
else:
    content = response.choices[0].message.content if response.choices else None
    if not content or not content.strip():
        raise RuntimeError("Empty answer; check the model and output limit before retrying.")
    print(content)

Rate Limits

PlanRequests/hourRequests/day
Free (認証済み)120500
Guest (未認証)3030
Pro7,200なし
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 ティアに応じて最適なモデルが自動選択されます。
  • 全プロバイダー障害時: セルフホストモデルが最終フォールバックとして動作します。

レスポンスの model_used フィールド

レスポンスボディのmodelフィールドに、実際に使用されたモデル名が返されます。フェイルオーバーが発生したかを確認できます。

{
  "model": "claude-sonnet-4-6",  // 実際に使用されたモデル
  "choices": [...]
}

Models

主要モデルの一覧です。全モデルと詳細な料金はPricingページを参照してください。

Model IDProviderContextCredits/1K InputCredits/1K Output
qwen/qwen3.7-flash Alibaba (OpenRouter) 1M 1 1
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
Note: qwen/qwen3.7-flash は入力$0.03/100万tokenの激安モデルです。全モデルの詳細スペックと最新料金は /pricing を参照してください。