言語日本語

AI ゲートウェイ

個人アプリケーションから自分の AirCode Ø インスタンスに接続された AI アカウントを使用します。 インスタンスの ベース URL、別々の アプリケーション トークン、および正確な モデル IDを提供します。 インスタンスは、接続されたプロバイダー CLI を呼び出し、テキストの Chat Completions サブセットと画像の Images サブセットを介して回答を返します。

Your application's backend
  → your instance URL + application token
    → a connected native provider account
      → validated answer + available usage counters

サイトは文書のみをホストします。 API リクエストはインスタンスに直接行き、 aircodezero.com はインスタンスのアドレス、トークン、またはプロンプトを受け取らない。 このサービスは、独自のアプリケーションやアカウントにのみ使用します。 プロバイダの条件、サブスクリプションアクセス、および配分は依然として適用されます。

インスタンスの設定

  1. AI Usageで互換性のあるネイティブプロバイダーアカウントを接続します。 ゲートウェイ The Gateway インストールされたインスタンスによってサポートされているアカウントモデルをリストします。 APIキー& 管理クレジット接続は除外されます。
  2. デスクトップやWebでは 設定 → AI gateway、モバイルでは その他 → AI gateway を開きます。アクセスを作成 で プライベート接続を許可 を有効にします。
  3. Base URLをコピーします。 /api/ai-gateway/v1で終了します。
  4. トークンを作成 で アプリ を選び、アプリ名を入力して トークンを作成 を選択します。一度だけ表示されるトークンをコピーしてください。この選択ではAI APIのテキストと画像を利用できますが、インスタンス間のセッションは利用できません。
  5. アプリケーションで以下のサーバー側環境変数を設定する:
変数 値
AIRCODE_AI_BASE_URL インスタンスからコピーされた完全なベース URL は、追加の /v1 なしで
AIRCODE_AI_TOKEN あなたがちょうど作成したアプリケーショントークン
AIRCODE_AI_MODEL id 互換性のあるモデル or GET /models

トークンをバックエンドの秘密の構成に保管し、ブラウザコード、モバイルアプリバンドル、レポジトリ、 URL 、または共有会話に含まない。 例では、環境変数を読み込む代わりに、認証を埋め込む。 API-key フィールドでインスタンスパスワードまたは所有者のログイントークンを使用しないでください。

インスタンスは、アプリケーションのバックエンドから実行され、アクセス可能なままにしておく必要があります。 localhost は、そのバックエンドを実行しているコンピュータを意味します。 インスタンスの HTTPS アドレスを使用して、リモート アクセスまたは信頼できるローカル/プライベート ネットワーク接続を使用します。 ゲートウェイは、公共の起源を作成しません。 /models でリストされていないプロバイダーは、 IDを発明することによって選択できません。

認証とモデル発見

Authorization: Bearer YOUR_APPLICATION_TOKEN を各通話で送信します。 JSON を Content-Type: application/jsonで送信します。 クエリパラメータやCookie認証はサポートされていません。 クロスオリジンのブラウザ呼び出しはサポートされていません; あなたのバックエンドを使用してください。

GET {BASE_URL}/models は object: "list" と data を含むオブジェクトを返します。 それぞれのモデルは、A id展覧会 label, engine, engineLabel, provider, connectionLabel, efforts そして capabilities: chat.completions テキストモデルとして、 images.generations そして images.edits イメージモデルについて 返された id を変更しないまま送信し、すでにパーセントの暗号化が含まれている可能性があります。 リストは、アカウント、プロバイダアクセス、またはインストールされたモデルが変更されたときに変更される場合があります。

ゆえに、A OpenAI互換性のあるアプリケーションの構成、選択 チャット完成完全なベースを利用する URL, put the application token in its アプリケーショントークン in its API キー フィールド、および返されたモデル ID の 1 つをコピーします。 Images では、下に説明されている Images サブセットを使用します。 応答、ツール、またはサポートされていないサンプリングパラメータを必要とするアプリケーションは、現在のゲートウェイと互換性がない。

返信を生成する

POST {BASE_URL}/chat/completions は、次のフィールドを受け入れます。 未知のフィールドは、黙々と無視されるよりも、拒否されます。

フィールド サポートされた値
model 必要な正確なモデル ID /models によって返された
messages 1~100 メッセージの必須マレージ; 少なくとも 1 つの非空のユーザーメッセージ
messages[].role system, developer, user または assistant
messages[].content A string, or an array of { "type": "text", "text": "..." } blocks.
reasoning_effort 選択型の effortsの任意値; omit it for the default
stream オプションボウリング; default to false
stream_options { "include_usage": true } または false for that flag, with stream: true only
n 使用するか、使用するか 1
store 使用するか、使用するか false

メッセージには role と contentのみが含まれています。 テキストブロックはニュースラインと結びつく。 ゼロキャラクターは拒否されます。 標準化されたメッセージマレージは、 UTF-8 JSONの 64 KiB 以内に適合しなければなりません; 完全な HTTP 体は 80 KiB に制限されます。 検証された回答は、JavaScript ストレージコードの単位が 49,152 に制限されます。 これらはゲートウェイの限界であり、プロバイダのコンテキストウィンドウや出力容量に関する約束ではありません。

各通話で完全に関連する会話を提供します。 会話を続けるには、前のアシスタントの回答と次のユーザーのメッセージを添付します。 ゲートウェイは、会話、セッション、または完了履歴を作成または保存しません。 トークンは、インスタンス プロジェクト、ファイル、端末、セッション、または所有者の設定にアクセスすることはできません。

正常な答えは object: "chat.completion"で、 choices[0].message.contentからのテキストを読み取ります。 id、 created、リクエストされた model、および finish_reason: "stop"を含む。 ネイティブカウントは、報告するのに十分な完了時に usage に表示されます。 aircode_usage 拡張子は、会計の詳細と不完全な推定を保存します。 欠けているカウンターや価格は不明で、決してゼロではありません。 API同等の推定は、追加のサブスクリプション料金ではありません。

ストリーミング

stream: true を Content-Type: text/event-streamに設定します。 現在の実装では バッファーストリーミングを使用します : プロバイダーが実行している間に最初の待機コメントと keepaliveコメントを送信し、検証後に完全な回答を送信します。 **** は、生成されたときに単語やトークンをストリーミングしません。

成功したストリームには、以下が含まれます。

  1. SSE コメントは、 : で始まります。
  2. A data: JSON chat.completion.chunk with the assistant role and complete テキストを choices[0].delta.contentで表示します。
  3. 空のデルタと finish_reason: "stop"を含むブック。
  4. choices: []、 usage (可能 null) を含むオプションのシュンク aircode_usage が stream_options.include_usage である場合。
  5. data: [DONE].

ストリームが始まると、失敗は、 SSE data: イベント内容 error■ 治療しないこと HTTP 200個だけの成功 失敗したストリームは、成功マークなしで終了します。 SSE フレームは、輸送ブロックに分割することができる; SDK または SSE パッサーを使用して、ネットワークブロックを JSONとしてパッサーする代わりに。

接続を終了すると、アクティブなリクエストがキャンセルされます。 トークンを取り消すこと、ゲートウェイを無効にしたり、インスタンスを停止したりすることも、一致した作業をキャンセルします。 自動再生や再生はありません。 長期間のリクエストには、適切なクライアントと逆プロキシタイムアウトが必要です; keepalives は、ネットワークの絶対的なリクエスト期間制限を超えることはできません。

画像生成

画像モデルはリストに記載され、インスタンスのネイティブ Codex アカウントは独自の画像ツールを使用することができ、画像生成を含む ChatGPT プランが必要です。 その id は codex/image-generationです。 Codex は、どの画像モデルを使用するかを決定しますが、ゲートウェイはそれを選択しません。

  • POST {BASE_URL}/images/generations JSON model``prompt (最大) 32,000 文字) とオプション size, n: 1 と response_format: "b64_json".
  • POST {BASE_URL}/images/edits は、同じフィールドで multipart/form-data を取ります と image または image[]の 1 〜 4 つの参照画像。 どちらも PNG である必要があります。 JPEG の最大 4 MiB です。 maskなどの他のファイルフィールドは拒否されます。

size は 64 ~ 4096 ピクセル間の auto または WIDTHxHEIGHT です。 それはガイドラインとしてモデルに渡され、応答は実際のサイズを報告します。 他のすべてのフィールドは無視されるのではなく、拒否されます。

curl -sS "$AIRCODE_AI_BASE_URL/images/edits" \
  -H "Authorization: Bearer $AIRCODE_AI_TOKEN" \
  -F model=codex/image-generation \
  -F "prompt=Place this product in a premium studio shot on a stone pedestal." \
  -F size=1024x1536 \
  -F image=@product.png

答えは created, data[0].b64_json, output_format (png, jpeg または webp) , 実際の size と aircode_usageを持ちます。 会計は、画像ツールを駆動したエージェントをカバーします; プロバイダーは、画像ツールの自己コストを報告しません, so costComplete is always false. 世代は通常1〜3分かかりますが、テキスト通話で下の限界を共有し、クライアントが切断したときにキャンセルされます。 モデルが画像なしで回答すると、 422 AI_GATEWAY_NO_IMAGE とモデルの文で呼び出しが失敗します。

保存された AirCode Ø アプリを自動的に接続する

Apps に保存されたアプリは、独自のサーバーを実行している場合、トークンをコピーすることなくこのアクセスを取得できます。 アプリのページで Settings → Access → AI アカウント を開いて、それをオンにします。 AirCode Ø は以下の通りです。

  1. AI プライベートゲートウェイがオフになった場合にオンにします。
  2. アプリを再起動し、各スタート時にサーバーに新しいトークンを提供します。 自身で、前回のスタートのトークンを取り消し、
  3. AIRCODE_AI_BASE_URL (インスタンスが聴くアドレスのゲートウェイ) AIRCODE_AI_TOKEN, and, when available, AIRCODE_AI_MODEL (a text model) と AIRCODE_AI_IMAGE_MODEL (画像モデル)

アプリの公開バージョンは、同様の方法で独自のトークンを取得します。 AI アカウントをオフにすると、アプリのトークンがすぐに取り消されます。 アプリのサーバーからゲートウェイを呼び出し、トークンをそこに保つ:アプリを開くことができる人は誰でもあなたのアカウントを使用することができ、それらの使用はあなたの計画に向かって数えられます。

割引、トークンライフサイクルおよびエラー

ゲートウェイは、インスタンス全体で2回のアクティブな呼び出し、トークンあたり1回のアクティブな呼び出し、トークンあたり30回の承認された生成リクエストを可能にします。 呼び出しは続かない。 これらの地元の限界は、供給者割当を置き換えるものではありません。 トークンは90日後に有効期限が切れ、代替を作成し、アプリケーションを更新し、以前のトークンを取り消します。 ゲートウェイを無効にすると、トークンを保持しますが、その使用を停止します。 インスタンス状態を復元するとゲートウェイを無効にし、トークン権限をクリアし、新鮮なトークンを作成します。

エラーは error.message, error.type, error.code , error.paramを使用します。 コードと HTTP ステータスを読んでください。 未知の結果を持つ世代を自動的に再生しないでください:それはすでにプロバイダーの割合を消費しているかもしれません。 例では SDK リターンを無効にします。

ステータス/コード 何をすべきか
401, AI_GATEWAY_AUTH_REQUIRED トークン、期限、取り消し、ターゲットインスタンスをチェック
403, AI_GATEWAY_DISABLED ターゲットインスタンスでゲートウェイを有効にする
403, AI_GATEWAY_ORIGIN_FORBIDDEN あなたのバックエンドから呼び出し、外国のブラウザの起源ではない
AI_GATEWAY_ACCESS_REFUSED インスタンスのアクセス/サブスクリプション要件を確認する
400, サポートされていないパラメータまたは努力 サポートされていないフィールドを削除し、選択したモデルの広告を活用する
404/409, AI_GATEWAY_MODEL_UNAVAILABLE /models をリフレッシュし、利用可能な ID を明示的に選択します。
413, AI_GATEWAY_INPUT_TOO_LARGE 提供された履歴、プロンプト、または参照画像を減らす; HTTP 超大体も拒否されます。
415 on /images/edits 送信 multipart/form-data
422, AI_GATEWAY_NO_IMAGE モデルは画像なしで回答しました; 文を読み、要求を変更しました。
429, AI_GATEWAY_BUSY 再度試行する前に、アクティブな通話が終了するのを待つ
429, AI_GATEWAY_RATE_LIMIT 即時リリースを停止し、現地のマイナスウィンドウを待つ
SAFE_STRUCTURED_AI_QUOTA_EXHAUSTED Provider Quota Recovery Wait; error.resets_at may be null
409, キャンセル 通話をキャンセルしたものとして扱う; 自動的に再開しない
502/503, provider/unavailable error 明示的なリサーチの前に、アカウント接続とインスタンスの状態を確認します。

未知のプロバイダーのリセットタイムは未知のままです。 モデル名または無関係のプロバイダの割引スケジュールから1つを引き出さないでください。

アプリケーションから別のインスタンスを使用する

外部アプリは、そのインスタンスの Base URL とそこで発行したトークンを使って、所有する別のインスタンスにアクセスできます。トークンは発行元のインスタンスに属します。B のエージェントに A のプロジェクトを使わせる場合は、B でトークンを作るときに 別のインスタンス を選び、リモートセッションの手順に従います。既定ではファイルとコマンドは A に残ります。A で接続を保存し、新しいセッション → 実行先 で B を選び、プロジェクトの場所 → このインスタンス のままにします。B のプロジェクトを使う場合は、B でトークンを作るときに このインスタンス とプロジェクトを選び、A で開始するときに プロジェクトの場所 → リモートインスタンス を選びます。どちらもイベントをリアルタイムで配信します。通常のトークンはテキストと画像に対応しますが、リモート側の所有者としてログインする権限はありません。Responses、Anthropic Messages、Chat Completions のツール呼び出しは、テキスト API の対応範囲外です。

AI-assisted integration, see Documentation for AI, the raw Markdown guide, the OpenAPI scheme, and the integration skill.

コード例

例を実行する前に上記の 3 つの環境変数を設定します。 これらのスニッピットは、Settings や Raw Markdown ガイドでも利用できます。

cURL

Bash, curl and jq. List models first, then use the exact model ID you selected.

set -euo pipefail
# The token is read from standard input, not a command-line argument.
curl --fail-with-body --silent --show-error --location --max-redirs 0 \
  "$AIRCODE_AI_BASE_URL/models" --header @- <<EOF
Authorization: Bearer $AIRCODE_AI_TOKEN
EOF

body=$(jq -n --arg model "$AIRCODE_AI_MODEL" \
  '{model: $model, messages: [{role: "user", content: "Hello!"}]}')
curl --fail-with-body --silent --show-error --location --max-redirs 0 \
  "$AIRCODE_AI_BASE_URL/chat/completions" \
  --header 'Content-Type: application/json' \
  --header @- --data "$body" <<EOF
Authorization: Bearer $AIRCODE_AI_TOKEN
EOF

Python

Install the OpenAI Python SDK 3 with python -m pip install "openai>=3,<4".

import os
from openai import OpenAI, DefaultHttpx2Client

client = OpenAI(
    base_url=os.environ["AIRCODE_AI_BASE_URL"],
    api_key=os.environ["AIRCODE_AI_TOKEN"],
    max_retries=0,
    http_client=DefaultHttpx2Client(follow_redirects=False),
)

for model in client.models.list():
    print(model.id)

response = client.chat.completions.create(
    model=os.environ["AIRCODE_AI_MODEL"],
    messages=[{"role": "user", "content": "Hello!"}],
)
print(response.choices[0].message.content)

JavaScript streaming

Node.js and the OpenAI SDK: npm install openai. This is buffered SSE: the complete validated answer arrives at the end.

import OpenAI from "openai";

function required(name) {
  if (!process.env[name]) throw new Error("Set " + name + " first.");
  return process.env[name];
}

const client = new OpenAI({
  baseURL: required("AIRCODE_AI_BASE_URL"),
  apiKey: required("AIRCODE_AI_TOKEN"),
  maxRetries: 0,
  fetchOptions: { redirect: "error" },
});

const stream = await client.chat.completions.create({
  model: required("AIRCODE_AI_MODEL"),
  messages: [{ role: "user", content: "Hello!" }],
  stream: true,
  stream_options: { include_usage: true },
});

try {
  for await (const chunk of stream) {
    process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
    if (chunk.usage) console.error("Tokens:", chunk.usage.total_tokens);
  }
  process.stdout.write("\n");
} finally {
  stream.controller.abort();
}

SDK コンフィギュレーション:OpenAI Python SDK シングルそして OpenAI JavaScript SDK. このゲートウェイは、上記のドキュメンタリーのサブセットをサポートします。