仕上げは AI との協働でやっています。事実と表現は著者本人が確認しています。
さくらのAI Engineは、OpenAI互換・Anthropic互換のAPIを無料枠内で使えるサービスだ。モデルにはOpenAIのオープンウェイトモデルgpt-oss-120bなどが選べる。
Qiitaの3,000リクエスト使い切りチャレンジ(2026年7月14日〜8月25日)を機に、会員登録から実際にAPIを呼び出すところまで試した。
つまずいたのは3箇所。無料プランのはずなのにクレジットカード登録を求められる点、Anthropic SDKでapi_key=を指定しても動かずauth_token=が必要な点、そしてauth_token=を直してもレスポンスのcontent[0]が本文とは限らない点だ。
結論: クレカ登録は課金の起点ではない。基盤モデル無償プランを選べば、3,000回を使い切っても課金されない。超過するとレート制限がかかるだけで、従量課金プランへ自動的に切り替わることはない。
本記事では、会員登録からアカウントトークン発行、gpt-oss-120bを使ったHello World実行までの手順と、実際に踏んだつまずきを説明する。
さくらのAI Engineとは
OpenAI互換・Anthropic互換のAPIを無料で利用できるサービス。
Qiitaの企画は「さくらのAI」タグをつけて記事を投稿するキャンペーンで、期間は2026年7月14日から8月25日まで。無料枠はチャット補完が月3,000回、音声関連が月50回。最優秀賞はNintendo Switch 2、使い倒したで賞はHHKB Studio。
Hello Worldまでの5ステップ
会員登録はメールアドレスとパスワードの入力のみで完了する。
登録後、以下の5ステップが必要になる。
会員ID発行 → プロジェクト作成 → 電話番号認証 → クレジットカード登録 → アカウントトークン発行
注意点として、「プロジェクト」は組織ではない。個人でも複数作成できる、さくらのクラウドの管理単位だ。プロジェクトは請求とリソースの管理単位であり、法人利用では部門ごとに分けて請求を管理する用途がある。個人利用の場合は1つ作成すれば十分。
電話番号認証はSMSで届くコードを入力するのみで完了する。
「クレカ登録したら課金される?」の答え
クレジットカード登録は、基盤モデル無償プランを含む全プランで必須の手続きだ。無料プランなのに支払い方法を求められる点が、「クレカ登録=即課金」ではないかという疑問を生む。
公式マニュアルで確認した結果は以下の通り。
さくらのAI Engineには2種類のプランがある。「基盤モデル無償プラン」と「従量課金プラン」だ。無償プランを選んだ場合、無料枠(チャット月3,000回)を超えるとレートリミットがかかる。課金は発生しない。従量課金プランを選んだ場合のみ、超過分がトークン数に応じて課金される。
2つのプランは別物であり、無償プランのまま自動的に従量課金プランへ切り替わることはない。クレカ登録は本人確認・不正利用対策のための必須手続きであり、課金の起点ではない。
プラン選択画面で「基盤モデル無償プラン」を選択すれば、無料枠超過時の課金は発生しない。
アカウントトークン発行
コントロールパネルの「アカウントトークン」から発行する。発行ボタンを押すと、<UUID>:<シークレット> という形式の文字列が表示される。
このトークンは再表示されない仕様のため、画面を閉じる前にコピーして保存する。
Hello World: gpt-oss-120bを呼び出す
トークン発行後、実際にAPIを呼び出す。さくらのAI Engineは、OpenAI互換とAnthropic互換の2つのエンドポイントを提供している。両方で動作確認した。
gpt-oss-120bはOpenAIが2025年8月に公開したオープンウェイトモデルで、MoE(Mixture of Experts)構成を採る。さくらのAI Engineでは、このモデルをホスティングされた状態で無料枠内から呼び出せる。
OpenAI互換エンドポイントの呼び出し:
from openai import OpenAI
client = OpenAI(
api_key="<UUID>:<シークレット>",
base_url="https://api.ai.sakura.ad.jp/v1",
)
resp = client.chat.completions.create(
model="gpt-oss-120b",
messages=[{"role": "user", "content": "こんにちは、あなたは誰ですか?一言で自己紹介して"}],
)
print(resp.choices[0].message.content)
出力: ChatGPT
さくらのAI Engineに問い合わせているにもかかわらず、返ってきた自己紹介は「ChatGPT」だった。gpt-oss-120b はOpenAIが公開したオープンウェイトモデルであり、学習データにChatGPTの応答が含まれているため、この応答が返ると考えられる。
Anthropic SDKはauth_token=必須の罠
Anthropic互換エンドポイントの呼び出し:
from anthropic import Anthropic
client = Anthropic(
auth_token="<UUID>:<シークレット>", # api_key= ではなく auth_token=
base_url="https://api.ai.sakura.ad.jp",
)
resp = client.messages.create(
model="gpt-oss-120b",
max_tokens=500,
messages=[{"role": "user", "content": "こんにちは、あなたは誰ですか?一言で自己紹介して"}],
)
print(resp.content[0].text)
Anthropic SDKは既定で api_key= を使うが、さくらのAI EngineはBearer認証を要求するため、auth_token= を指定する必要がある。実際にapi_key=のまま呼び出すと以下のエラーになる。
anthropic.AuthenticationError: Error code: 401 - {'error': {'message': 'Unauthorized'}}
これはさくらのAI Engine固有の癖ではない。Claude CodeをANTHROPIC_AUTH_TOKEN環境変数で連携させる場合と同じ認証方式で、OpenAI互換のAPIキー形式をそのままAnthropic SDKに渡そうとすると詰まりやすいポイントだ。
content[0].textも罠 ─ gpt-oss-120bはthinkingブロックを返す
auth_token=を直しても、もうひとつ落とし穴がある。gpt-oss-120bはreasoningモデルで、レスポンスのcontent配列の先頭が本文(text)ではなく思考過程(thinking)になることがある。
print(resp.content)
# [ThinkingBlock(thinking='...', type='thinking'), TextBlock(text='ChatGPT', type='text')]
resp.content[0].textと決め打ちすると、thinkingブロックには.text属性が無いためAttributeErrorになる。安全に取り出すには、typeでフィルタする。
text_blocks = [b.text for b in resp.content if b.type == "text"]
print(text_blocks[0] if text_blocks else "(no text block)")
結果は同様に「ChatGPT」だった。
まとめ
さくらのAI Engineの無料枠でgpt-oss-120bを使うまでの流れは、会員登録→プロジェクト作成→電話番号認証→クレジットカード登録→アカウントトークン発行→API呼び出し、の6段階。詰まりやすいのは「クレカ登録=課金の誤解」「Anthropic SDKのauth_token=」「content[0]がthinkingブロックになる」の3箇所で、いずれも仕組みを知っていれば数分で解決する。
クレジットカード登録は全プラン共通の必須手続きであり、基盤モデル無償プランを選択すれば無料枠超過時も課金は発生しない。