JA ▾
アカウントを開く

無検閲チャットボットAPI:5分で最初のリクエスト

Pythonがすでに手元にある場合、無検閲チャットボットAPIを試すには5分かかります。キー、OpenAI SDKの2つの設定変更、および1つのリクエストが必要です。その後、システムプロンプトとストリーミングを追加することでチャットボットになります。

最終更新日

キー型の発射台からライトハウスに向かってチャットバブルを運ぶガラスの紙飛行機

主なポイント

1分〜2分:キーの取得

APIキーページにアクセスし、Googleまたはメールアドレスとパスワードで登録してください。登録後、キーページには無料トライアルクレジットを受け取るボタンが表示されます:$0.50、1人1回限り、7日間有効、クレジットカード不要。

キーをコピーして環境変数に設定します。誤ってコミットされるファイル内のキーは、クレジットを失う最も一般的な方法です。

# model ID for later requests: uncensored
export UF_API_KEY="paste-your-key-here"
pip install openai

トライアルキーでは同時リクエストが2件、1分あたりのリクエストが60件まで許可されます。このチュートリアルにはこれらの制限で十分です。

3分目:最初のリクエスト

サービスはOpenAI互換なので、base_urlとキーを変更するだけで公式SDKが機能します。モデルIDは uncensored です。

import os
from openai import OpenAI

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

resp = client.chat.completions.create(
    model="uncensored",
    messages=[{"role": "user", "content": "Give me three names for a cyberpunk bar."}],
)

print(resp.choices[0].message.content)
print("tokens in/out:", resp.usage.prompt_tokens, resp.usage.completion_tokens)

python first.py で実行します。名前とトークン数のリストが表示されればすべて正常です。認証エラーが表示される場合は変数を確認し、接続が失敗する場合は base URL が /v1 で終わっていることを確認してください。

レスポンスは OpenAI チャット形式に従います:メッセージを含む choices リスト、トークン数を含む usage ブロック、および生成が停止した理由を示す finish reason が含まれます。回答が途中で切れている場合は、通常 max_tokens が低いためです。コストについて、500 入力トークンと 300 出力トークンのリクエストは $0.000075 + $0.00015 = $0.000225 かかります。このチュートリアルの 5 つのリクエストの合計コストは約 0.1 セントなので、トライアルクレジットはほとんど消費されません。

4分目:システムプロンプトと設定の追加

単なるリクエストではデフォルトのアシスタントの口調が得られます。チャットボットには、キャラクターを定義するシステムメッセージと、それに適したサンプリング設定を追加してください。

import os
from openai import OpenAI

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

raw = client.chat.completions.with_raw_response.create(
    model="uncensored",
    messages=[
        {"role": "system", "content": "You are Rook, a smuggler with a dry sense of humor. Stay in character. Keep replies under 80 words."},
        {"role": "user", "content": "Can you get me across the border tonight?"},
    ],
    temperature=0.9,
    top_p=0.95,
    max_tokens=200,
    seed=7,
)

resp = raw.parse()
print(resp.choices[0].message.content)
print("balance:", raw.headers.get("x-balance-usd"))
print("request id:", raw.headers.get("x-request-id"))
  • temperature と top_p は多様性を制御します。高い値はより生き生きとした、予測不可能なテキストを生成します。
  • seed はテストの再現性を高めます。これはモデルに渡されるため、プロンプトの編集を比較する際に使用してください。
  • max_tokensはオプションです。指定しない場合、補完は100,000トークンのウィンドウの残りを活用できます。
  • 残高ヘッダーは、各呼び出し後の残高クレジットを示します。

ここでプロンプトが製品です。短く、具体的にしてください。キャラクターが誰で、どのように話し、物語が何で、長さをどのくらいにすべきかを記述します。これらはすべてシステムメッセージに一度だけ記述し、APIは呼び出し間で何も記憶しないため、すべてのリクエストで再送信する必要があります。

5分目:ストリーミング

ストリーミングは生成されるテキストを逐次出力します。リクエストには1語の変更と、チャンクを読み取るループが必要です。

import os
from openai import OpenAI

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

stream = client.chat.completions.create(
    model="uncensored",
    stream=True,
    messages=[
        {"role": "system", "content": "You are Rook, a smuggler with a dry sense of humor."},
        {"role": "user", "content": "Tell me about the worst job you ever took."},
    ],
)

for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)
print()

ストリーミングリクエストは、ストリームが終了するまで同時実行数のスロットを 1 つ占有します。トライアルキーでは、オープンなストリームが 2 つあるだけですべてのスロットが使用され、3 番目のリクエストは HTTP 429 を返し、コードは concurrency となります。待機して再試行してください。

ストリーム後に使用状況を確認したい場合は、最終チャンクに usage ブロックが含まれます。

計画を持ってサンプリング値を選択する

サンプリング設定は、多くの人が予想する以上にボットの雰囲気に影響を与えます。以下の値から始めて、1回に1つずつ変更してください。

目標設定理由
生き生きとしたストーリーテリングtemperature 0.9〜1.0、top_p 0.95実行ごとの多様性を増やす
一貫したキャラクターtemperature 0.6〜0.7予期せぬ事象を減らす
再現可能なテストseed 固定、temperature 0同じプロンプトは同じ種類の回答を生成する
反復を減らす頻度または存在ペナルティは約0.3ループを抑制する
マーカーで応答をカットするstop 文字列を使用出力が現れた時点で出力を終了します

temperatureとtop_pは多様性を変化させ、ペナルティはモデルに渡されます。1つの値を変更し、同じプロンプトを5回実行して、次の値を変更する前に5つの回答を読んでください。

会話形式にします

APIは履歴を保持しません。Rookに記憶させるには、リストを保持し、会話のやり取りのたびに両方の側を付加してください。

import os
from openai import OpenAI

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

messages = [{"role": "system", "content": "You are Rook, a smuggler with a dry sense of humor."}]

def talk(text):
    messages.append({"role": "user", "content": text})
    r = client.chat.completions.create(model="uncensored", messages=messages)
    answer = r.choices[0].message.content
    messages.append({"role": "assistant", "content": answer})
    return answer

print(talk("Where are we headed?"))
print(talk("And what did I just ask you?"))

2番目の質問が機能するのは、最初の会話交換がリストに含まれているためです。これがチャットのコストが長さとともに増加する理由でもあります:各ターンで全ての情報が再送信されるためです。コストとトレードオフの分析がこの影響を詳しく解説しており、料金ページでは1Mトークンあたり$0.15と$0.50のレートが示されています。

リストが長くなるにつれて2つの注意が必要です。1つ目はコストで、長い履歴は各ターンの価格を上げます。2つ目はウィンドウで、プロンプトと返信を合わせて100,000トークンは余裕がありますが、数週間続くロールプレイではそれに到達します。リストが長くなったら、システムメッセージを保持したまま古いターンを削除するか、短い要約に置き換えてください。

一般的な問題と次のステップ

問題考えられる原因修正方法
認証エラー間違った、または空のキー変数の長さを出力し、スペースを削除します
見つかりませんベースURLに/v1が含まれていないこのページに記載の正確なBase URLを使用してください
429 rate_limited1 分あたり 60 件を超えるリクエスト(トライアル)速度を落とすか、フルキーを使用してください(1分あたり300件)
429 と Retry-After: 5一時的な過負荷5秒待機して再試行
奇妙または平坦な応答弱いシステムプロンプト口調、設定、長さの制限を追加

失敗または拒否されたリクエストには課金されません。次のステップとして、ツールと JSON モードに関する API ドキュメント をお読みください。モデルはテキストのみ対応のため、画像、音声、埋め込みはありません。チャージは暗号資産(TRC20 上の USDT または Base 上の USDC)で $20〜$500 の範囲で可能で、クレジットは期限切れになりません。それを用いて構築するすべてのコンテンツについて、成人のみへのアクセスとモデレーションの責任を負います。

表にない問題がある場合は、リクエストを最小の動作ケースに減らしてください:ユーザーメッセージ 1 つ、システムプロンプトなし、追加パラメータなし。その後、壊れるまで要素を戻していきます。最初の統合におけるほぼすべての問題は、URL のタイプミス、末尾にスペースが含まれてコピーされたキー、または間違った形状の messages リストに起因します。

コードでエラーを処理

1回だけ動作するスクリプトはボットではありません。APIに待機を指示された場合にリトライを追加してください。

import os, time
from openai import OpenAI, RateLimitError

client = OpenAI(
    base_url="https://api.chatbotunfiltered.com/v1",
    api_key=os.environ["UF_API_KEY"],
    max_retries=0,
)

def ask(messages, tries=4):
    for i in range(tries):
        try:
            r = client.chat.completions.create(model="uncensored", messages=messages)
            return r.choices[0].message.content
        except RateLimitError:
            time.sleep(5 * (i + 1))
    raise RuntimeError("still rate limited after retries")

SDK は HTTP 429 で RateLimitError を発生させます。一時的な過負荷の場合、API は Retry-After: 5 を送信するため、5 秒待つことが最初の適切なステップです。繰り返し発生する concurrency エラーの場合、より高速にリトライするのではなく、クライアント側でリクエストをキューに追加してください。

よくある質問

フィルターなしのチャットボット API は OpenAI API と同じですか?

プロトコルは同じであるため、OpenAI SDK が機能します。モデルは異なります:独立したプロバイダによるオープンウェイトモデルで、法的な成人利用に対してコンテンツ拒否なしで回答するように最適化されています。

Base URLとモデルはどれを使用すべきですか?

Base URL https://api.chatbotunfiltered.com/v1とモデルIDはuncensoredです。

試すために支払いが必要ですか?

いいえ。$0.50 のトライアルクレジットには支払い情報の登録は不要です。有料のチャージは暗号資産のみです。

レスポンスのストリーミングは可能ですか?

はい。stream を true に設定してください。ストリーミングリクエストはストリームが終了するまで同時実行数のスロットを占有します。

残高はどのように確認しますか?

任意のレスポンスのX-Balance-USDヘッダーを読み取るか、GET /v1/balanceを呼び出してください。

APIキーを即座に取得

登録し、キーをコピーし、base URLを更新してください。セットアップは完了です。