AUTO / CONTINUOUS EVALUATION

使うたびに、
選び方が育つ。

モデル名を追いかける手間を減らすために。teai Autoは、新しい候補を比較し、条件を満たした用途から少しずつ選択先を更新します。

2026-09-21 · teai Engineering

まず使ってみる:APIキー → curl / Python → 結果の確認 ↓

最新の評価と選択先

確認中 / Loading

ここには公開APIの状態を表示します。APIの表示だけでは定期ジョブや実際のモデル応答の成功を保証しません。

Jevが用途を判断。評価結果が選択先を決める。

これまでのAutoは、主力・軽量といった固定の選択先を中心に動いていました。今回追加するのは、候補の発見から比較、段階導入、復帰までを繰り返す仕組みです。新しさだけで切り替えず、品質条件を満たしたうえで費用または待ち時間の改善を確認します。

01

候補を見つける

公開カタログから新規・変更・未評価の候補を優先。費用上限内に収まる候補を日次で比較します。

02

同じ課題で比較する

日本語・英語の合成課題で現行と候補を交互に実行。選抜12件・別の値を使う検証12件の全件正答と、費用・速度の条件を求めます。

03

少しずつ採用する

適用割合は10%→50%→100%。次の段階へ進む前に追加比較し、条件未達なら復帰。7日以内に再評価されない設定も期限切れになります。

最初は、測れる用途から。

初期の更新対象は、JSONだけで回答する情報抽出・明示された事務規則の適用・基本的な計算です。Jevが対象用途だと高い確信で判定した、300〜4,000文字の単発テキストに限定します。会話履歴・システム指示・ツール・画像がある場合や、分類できない場合は従来のAuto経路を使います。

24件は小規模で、課題同士にも相関があります。文章の美しさ、翻訳品質、コード修正能力、あらゆる質問での優劣を示す結果ではありません。費用は公開単価による推計で、請求書の実支払額ではありません。

費用を決めてから、評価する。

運営側の追加評価予算は月3,000円。呼び出す前に費用枠を永続保存し、通信が途切れた場合も予約を取り消さず、同じ呼び出しを再実行しません。1日300円まで、UTC月単位で管理します。通常のお客様のAPI利用料金とは別の運営予算です。

選択が変わった理由も、公開する。

採用・段階拡大・復帰の履歴はこのページに反映されます。Xの自動告知は公開状態を確認したあと、承認済みの定型で送信。投稿の成否が不明な場合は再送せず、確認待ちにします。変更がなければ告知しません。

読み込み中 / Loading

QUICK START

5つの手順で使う。

Jevの契約や専用SDKは不要です。teaiの通常のチャットAPIに、モデル名 teai/auto を指定します。既存のOpenAI互換アプリでも、接続先・APIキー・モデル名の3点を設定できます。

1. APIキーを準備する

teaiに登録し、ダッシュボードでAPIキーを発行します。生成に使える残高も確認してください。キーは手元の環境変数に保存し、共有するコードやブラウザの公開JavaScriptには書き込みません。

Register with teai, issue an API key in the dashboard, and check your available balance. Store the key in a local environment variable, not shared source code or public browser JavaScript.

export TEAI_API_KEY="te_your_api_key"
設定項目
Base URLhttps://teai.io/v1
API keyTEAI_API_KEY
Modelteai/auto

2. まずcurlで1回呼ぶ

次は、架空の受付案内から確定した予約情報を取り出す例です。本文は1つのuserメッセージにまとめ、出力をJSONだけに指定しています。実行すると通常のAPI利用料が発生します。

curl --fail-with-body --max-time 120 \
  -D auto-headers.txt \
  https://teai.io/v1/chat/completions \
  -H "Authorization: Bearer $TEAI_API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @- <<'JSON'
{
  "model": "teai/auto",
  "messages": [{
    "role": "user",
    "content": "Extract the confirmed reservation from this fictional reception notice. Return ONLY a JSON object with exactly these keys: id, date, time, people, venue. Copy the supplied values; do not infer unstated information. The old booking has been cancelled and must not be returned. Old booking: R42, 2026-10-01, 09:00, 2 people. Confirmed booking: R42, 2026-10-03, 14:30, 3 people, venue Pine Room. Do not add explanations, markdown or extra fields."
  }],
  "temperature": 0,
  "max_tokens": 1024,
  "stream": false
}
JSON

期待する回答内容(成功を保証するものではありません):

{"id":"R42","date":"2026-10-03","time":"14:30","people":3,"venue":"Pine Room"}

3. PythonならOpenAI SDKを使う

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

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

prompt = (
    "Extract the confirmed reservation from this fictional reception notice. "
    "Return ONLY a JSON object with exactly these keys: id, date, time, people, venue. "
    "Copy the supplied values; do not infer unstated information. "
    "The old booking has been cancelled and must not be returned. "
    "Old booking: R42, 2026-10-01, 09:00, 2 people. "
    "Confirmed booking: R42, 2026-10-03, 14:30, 3 people, venue Pine Room. "
    "Do not add explanations, markdown or extra fields."
)
raw = client.chat.completions.with_raw_response.create(
    model="teai/auto",
    messages=[{"role": "user", "content": prompt}],
    temperature=0,
    max_tokens=1024,
    stream=False,
)
response = raw.parse()
print("Selected model:", response.model)
print("Route reason:", raw.headers.get("x-teai-auto-reason", "unavailable"))
print("Usage:", response.usage)

choice = response.choices[0]
if choice.finish_reason != "stop":
    raise RuntimeError(f"Incomplete answer: {choice.finish_reason}")
data = json.loads(choice.message.content or "")
required = {"id", "date", "time", "people", "venue"}
if not isinstance(data, dict) or set(data) != required:
    raise ValueError("Unexpected fields")
if type(data["people"]) is not int or data["people"] < 1:
    raise ValueError("Invalid people count")
if any(not isinstance(data[k], str) for k in required - {"people"}):
    raise ValueError("Invalid field type")
print(json.dumps(data, ensure_ascii=False, indent=2))

まずは表示・下書き・確認画面への受け渡しに使えます。業務データへ反映する前には、JSONの形式だけでなく、元の文書との一致も確認します。

4. 選ばれたモデルと理由を確認する

採用候補がまだない場合や、段階導入の対象に入らない場合、Jevの制限・タイムアウト・分類の不確実性がある場合は、更新後のモデルにならないことがあります。最新の評価と採用状況は、このページ上部で確認できます。

5. 自分の用途へ置き換える

初期の自動更新対象は、単発・300〜4,000文字・JSONだけの回答です。必要なsystem指示や会話履歴を、更新対象に入るためだけに削除する必要はありません。それらを含むアプリもAutoを利用できますが、今回の進化する選択先ではなく従来の経路が使われます。

うまく動かないとき

状態確認すること
401実行環境のAPIキーとAuthorizationヘッダーを確認。無効なキーのまま繰り返さず、必要ならダッシュボードで再発行します。
402エラー本文が残高不足ならダッシュボードで残高を確認。運営の月3,000円評価予算は、お客様の無料利用枠ではありません。
429 / 5xx混雑・上限・一時的障害の可能性があります。エラー本文を確認し、短時間の連打を避けます。成否不明な業務処理を二重に実行しないでください。
JSONとして読めないJSONのみの指定はモデルへの依頼であり、形式の保証ではありません。finish_reason、JSONの構文、キー・型を確認し、不正な結果は業務処理に渡しません。

APIリファレンス → · Jevを使ったAutoの設計 →

上の例は構文・設定とモック応答での処理を確認しています。この具体例の有料API実行結果や、更新先への実際の振り分け成功を示すものではありません。