JA ▾

OpenAI 互換の無検閲 LLM APIuncensoredapis.com

ホームAPI リファレンス

Uncensored API 参照:フィールド別解説

このページでは、Uncensored API に送信または受信するすべてのフィールドを文書化しています:chat completions リクエストボディ、レスポンスオブジェクト、finish_reason の値、usage ブロック、ストリーミングチャンク、モデルリスト。各セクションには、ターミナルに貼り付けて実行できる注釈付きの例と短い仕様をペアにしています。

更新日:

主要ポイント

  1. 2 つのエンドポイントがあります:POST /v1/chat/completions と GET /v1/models。どちらも Bearer キーで認証します。
  2. レスポンスは一般的なチャット完了の形式に従います:id、choices[].message、finish_reason、usage です。
  3. ストリーミングはサーバー送信イベントを使用します。最終チャンクには自動的に使用量が含まれ、stream は data: [DONE] で終了します。
  4. リクエストに影響する制限:100,000 トークンのコンテキストウィンドウ、デフォルト 2048、max_tokens の最大 32,000、8 MB のボディ。

規約とトランスポート

ベース URL は https://api.uncensoredapis.com/v1 です。すべてのボディは JSON と UTF-8 です。すべてのリクエストには Authorization: Bearer <key> が付きます。キーがないか間違っていると 401 が返ります。ルートは 2 つだけで、それ以外のパスは 404 を返します。

メソッドパス目的
POST/v1/chat/completionsアシスタントメッセージを生成(ストリーミング可能)
GET/v1/modelsリクエスト可能なモデル ID を一覧表示

APIはテキストのみです。埋め込み、画像、音声、動画のルートはなく、ファインチューニングもありません。扱えるモデルはuncensoredとしてアクセスできる1つだけです。ワイヤーフォーマットはチャット補完の規約と互換性があるため、base_urlを上書きすれば公式のPythonおよびNode SDKが動作します。docsには初回セットアップの手順が記載されています。このページはそのフィールドレベルの補足資料です。

リクエストボディのフィールド

表はエンドポイントが理解するフィールドをリストします。サンプリングフィールドは生成処理にそのまま渡されるため、選択した値は他のチャット完了系 API と同じように動作します。

フィールド型注釈
model文字列常に "uncensored" です。
messages配列role(system、user、assistant、tool)とcontentを持つ順序付けられたオブジェクトのリスト。
max_tokens整数完了の上限。デフォルト 2048、最大 32,000。
temperature数値ランダム性。低いほど決定論的になります。
top_p数値ニュークリアス・サンプリングの cutoff。
stop文字列または配列生成を終了するシーケンス。
streambooleantrueに設定すると、レスポンスがサーバー送信イベントになります。
tools配列標準的なJSONスキーマ形式の関数定義。

注釈付きのリクエストの完全な例を示します。システムメッセージは動作を指定し、ユーザーメッセージはタスクを運び、stopは最初の空行で生成を終了します。

curl https://api.uncensoredapis.com/v1/chat/completions \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "uncensored",
    "messages": [
      {"role": "system", "content": "You are a terse release-notes writer."},
      {"role": "user", "content": "Summarize: fixed login bug, added dark mode."}
    ],
    "max_tokens": 120,
    "temperature": 0.4,
    "stop": ["\n\n"]
  }'

2つの予算ルールが重要です。まず、プロンプトと生成テキストの合計が100,000トークン以内に収まる必要があります。そのため、プロンプトトークン数にmax_tokensを加えた値がその制限を超えるリクエストは、ステータス400で拒否されます。2つ目に、シリアライズされたボディのサイズは8 MBを超えてはいけません。長い履歴を送信する場合は、いずれかの制限に近づいた時点で、クライアント側で古い会話を削除してください。

レスポンスオブジェクト

ストリーミングではない呼び出しは1つのJSONオブジェクトを返します。以下のように上から下まで読み取ってください。

{
  "id": "chatcmpl-example123",
  "object": "chat.completion",
  "created": 1767225600,
  "model": "uncensored",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "v1.4: Login bug fixed. Dark mode added."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 38,
    "completion_tokens": 14,
    "total_tokens": 52
  }
}
  • id: 補完の一意の識別子。イベントを関連付ける必要がある場合は、独自のリクエストIDの横にこれをログに記録してください。
  • object: 定数であるchat.completion。
  • created: 秒単位のUnixタイムスタンプ。
  • model: uncensoredをエコーします。
  • choices: 配列です。1つのエントリが返されるため、choices[0]が回答となります。indexはその位置を示します。
  • choices[].message: roleはassistantです。contentにはテキストが含まれますが、モデルが関数呼び出しを返した場合はnullになります。
  • choices[].finish_reason: 生成が停止した理由。次のセクションを参照してください。
  • usage: 請求のためのトークン集計。以下で説明します。

finish_reason の値

コンテンツを信頼する前にfinish_reasonで分岐してください。切り捨てられた回答と完全な回答は、確認するまで外見上は同じです。

値意味コードで取るべきアクション
stopモデルが自然な終了に達したか、または指定したstopシーケンスのいずれかに到達しました。コンテンツをそのまま使用します。
lengthmax_tokensの上限(またはコンテキストウィンドウ)に回答の途中で到達しました。max_tokensを増やすか、プロンプトを短くするか、モデルに継続を依頼してください。
tool_callsモデルは1つ以上の関数の実行を要求しています。それらを実行し、結果をtoolメッセージとして送信します。

値がtool_callsの場合、メッセージは以下のようになります。引数は自分で解析する必要があるJSON stringとして渡されます。

{
  "choices": [{
    "index": 0,
    "message": {
      "role": "assistant",
      "content": null,
      "tool_calls": [{
        "id": "call_abc1",
        "type": "function",
        "function": {"name": "get_order", "arguments": "{\"order_id\": 8841}"}
      }]
    },
    "finish_reason": "tool_calls"
  }]
}

生成されたJSONが時折不正な形式になる可能性があるため、json.loadsやJSON.parseをargumentsに対してエラーハンドリングでラップしてください。

usageブロックとコスト

usageにはprompt_tokens、completion_tokens、total_tokensが報告されます。これらは残高から差し引かれる(課金される)数値です。入力は100万トークンあたり$0.25、出力は100万トークンあたり$1.00です。前払い残高はリクエストごとに差し引かれ、サブスクリプションはありません。

指定された仮定に基づく計算例:あるリクエストが2,000トークンのプロンプトと500トークンの補完を使用すると仮定します。入力コストは2,000 / 1,000,000 x $0.25 = $0.0005です。出力コストは500 / 1,000,000 x $1.00 = $0.0005です。このリクエストの合計は$0.0010です。これらのトークン数は算術計算のための仮定であり、実際のワークロードの測定値ではありません。料率は料金ページで確認できます。

出力トークンは入力トークンの4倍のコストがかかるため、厳格なmax_tokens設定がコストを制御する最も直接的な方法です。

ストリーミングチャンクの形式

"stream": trueを設定すると、レスポンスはtext/event-stream形式になります。各イベントはdata: で始まり、JSONに続く行で構成され、空白行で区切られます。オブジェクトのタイプはchat.completion.chunkに変更され、messageはdeltaに置き換えられます。

data: {"id":"chatcmpl-example123","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}

data: {"id":"chatcmpl-example123","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"v1.4: "},"finish_reason":null}]}

data: {"id":"chatcmpl-example123","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Login bug fixed."},"finish_reason":null}]}

data: {"id":"chatcmpl-example123","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}

data: {"id":"chatcmpl-example123","object":"chat.completion.chunk","choices":[],"usage":{"prompt_tokens":38,"completion_tokens":14,"total_tokens":52}}

data: [DONE]
  1. 最初のチャンクでは通常、delta.roleが空のコンテンツとともにassistantに設定されます。
  2. コンテンツチャンクはdelta.contentに断片を含みます。到着順に連結してください。
  3. 最後のコンテンツチャンクは空のdeltaと、nullではないfinish_reasonを持ちます。
  4. 空のchoices配列を持つ最終チャンクにはusageが含まれます。これは要求するものではなく、自動的に追加されます。
  5. リテラルのdata: [DONE]がストリームを終了します。

空のchoices配列をガードしてください:単純なループでusageチャンクにchoices[0]をインデックス付けするとエラーが発生します。以下のSDK例ではこれを処理しています。

import os
from openai import OpenAI

client = OpenAI(base_url="https://api.uncensoredapis.com/v1", api_key=os.environ["API_KEY"])

reason, usage = None, None
for chunk in client.chat.completions.create(
    model="uncensored",
    messages=[{"role": "user", "content": "Name three uses of a rubber duck in debugging."}],
    stream=True,
):
    if chunk.choices:
        piece = chunk.choices[0].delta.content
        if piece:
            print(piece, end="", flush=True)
        if chunk.choices[0].finish_reason:
            reason = chunk.choices[0].finish_reason
    if getattr(chunk, "usage", None):
        usage = chunk.usage

print("\nfinish:", reason, "| tokens:", usage.total_tokens if usage else "n/a")

ストリーミングされた関数呼び出しの場合、delta.tool_callsは断片化して配信されます。各呼び出しインデックスに対してarguments文字列を累積し、finish_reasonがtool_callsになった時点で1回だけ解析してください。

modelsエンドポイント

GET /v1/modelsにはBearerヘッダーのみが必要で、リストオブジェクトを返します。モデルが1つだけのため、dataには1つのエントリ、つまりuncensoredが含まれます。このルートからモデルドロップダウンを埋めるクライアントは、単一の選択肢のみを表示します。

curl https://api.uncensoredapis.com/v1/models -H "Authorization: Bearer $API_KEY"

{
  "object": "list",
  "data": [
    {"id": "uncensored", "object": "model"}
  ]
}

また、これはキーを検証する最も安価な方法でもあります。200はキーが有効であることを、401はキーが間違っているか再生成されたことを意味します。このルートへの呼び出しはトークンを生成しません。ステータス処理とリトライルールについては、エラーとレート制限のプレイブックを参照してください。

クライアント作者向けのリファレンスチェックリスト

クライアントライブラリを作成している場合や、エンドポイントをゲートウェイでラップしている場合は、出荷前に上記の仕様に基づき、これらの動作のすべてを確認してください。

  1. ヘッダーの整理。 キーはAuthorizationヘッダーのみで送信し、クエリ文字列では送信せず、ヘッダー値をログに記録しないでください。
  2. 防御的な解析。 レスポンス内の未知の余分なフィールドは無視可能として扱ってください。パーサーはJSONのキー順序ではなく、ここで文書化されたフィールドに固定してください。
  3. すべてのレスポンスでfinish_reasonを確認してください。 finish_reasonがlengthの場合、目に見えるインジケーターを表示してください。そうしないと、ユーザーは切り捨てられたテキストを完全な回答として読み取ってしまいます。
  4. 送信前に予算を確認してください。 プロンプトトークンを推定し、max_tokensを加算し、合計を100,000と比較してください。ローカルで拒否する方が、ステータス400を待つのよりも高速です。
  5. ストリームの末尾を処理する。 空のchoicesリストとusageオブジェクトを持つチャンク、そして[DONE]を期待してください。センチネルの後に接続を閉じます。
  6. 使用量を記録してください。 リクエストごとのtotal_tokensを保存し、後で自前のメータリングと前払い残高を照合できるようにしてください。
  7. 上限を尊重する。 アカウントはキーごとに1分あたり300リクエストを許可するため、複数のユーザーにファンアウトするゲートウェイには独自のキューが必要です。

これらの手順はベンダーのSDKに依存しません。Bearer ヘッダーを設定しJSONをデコードする単純なHTTPクライアントだけで十分です。このページにあるSDKの例は利便性のためのもので、必須ではありません。このチェックリストをplaybookのエラー表と組み合わせれば、ビルド、送信、ストリーミング、解析、請求、回復のすべてのリクエストライフサイクルをカバーできます。

質問と回答

1つのリクエストで複数の選択肢を取得できますか?

choicesには単一のエントリが返されるため、choices[0]を読み取ってください。代替案が欲しい場合は、個別のリクエストを発行してください。

なぜmessage.contentがnullなのですか?

モデルはテキストではなくtool_callsを返しました。finish_reasonを確認し、関数を実行して結果を送信してください。

プロンプトとmax_tokensの合計が100,000を超えた場合どうなりますか?

リクエストは400 bad requestエラーで拒否されます。プロンプトを短くするか、max_tokensを下げてください。

ストリーミングは価格に影響しますか?

いいえ。請求は同じプロンプトおよび完了トークン数を使用し、最終的な使用量チャンクでそれらが報告されます。

キーはフォーム 1 つで手に入ります

アカウントを作成し、キーをコピーし、ベースURLを変更します。これだけですべての設定が完了します。