AI 関連の論文とニュースを日次で収集し、日本語のレポートへまとめる ai-digest を、「さくらの AI Engine」でも動かせるようにしました。
さくらの AI Engine は OpenAI 互換 API と Anthropic 互換 Messages API を提供しています。基盤モデル無償プランでは、チャット生成を月 3,000 リクエストまで利用できます。今回参加する Qiita の記事投稿企画も、この無償枠を使ったアプリケーション開発や検証を主題としています[1]。
本稿では、さくらの AI Engine の利用開始、アカウントトークンの発行、ai-digest の設定、日次バッチの実行、成果物による完走確認までを扱います。リクエスト数やトークン数の実測、SDK の再試行を含む計測条件、無料枠に対する運用量の見積もりは、別の記事で検証します。
さくらの AI Engine 全体は OpenAI 互換と Anthropic 互換の両方を提供していますが、今回の ai-digest が利用するのは Anthropic 互換 Messages API です。2026 年 7 月 31 日時点で、この API から利用できるモデルは preview/Kimi-K2.6 です[2]。
先に結論
ai-digest をさくらの AI Engine へ接続するために必要な設定は、次の 5 項目です。
ANTHROPIC_API_KEY=
ANTHROPIC_AUTH_TOKEN=<UUID>:<シークレット>
ANTHROPIC_BASE_URL=https://api.ai.sakura.ad.jp
ANTHROPIC_MODEL=preview/Kimi-K2.6
SUMMARIZER_BACKEND=claude
既存の Anthropic Python SDK を維持したまま、認証情報、基底 URL、モデル名を差し替えます。OpenAI 互換 API 用のクライアントを追加する必要はありません。
接続確認は、API が HTTP 200 を返しただけでは完了しません。ai-digest では、強制したツール呼び出しから出典付きの話題を取得し、report.json、HTML、PNG まで生成できた時点を完走とします。
ai-digest が生成 AI を使う範囲
ai-digest の処理経路は次のとおりです[3]。
arXiv・ニュースフィードから収集
↓
URL と題名の類似度による重複排除
↓
Messages API による話題統合・翻訳・分類
↓
話題ごとの画像を取得またはローカル生成
↓
report.json・HTML・PNG を保存
生成 AI が担当するのは、重複排除後の候補を話題単位へまとめ、日本語の見出し、カテゴリー、箇条書き、出典番号を構成する工程です。収集、重複排除、画像生成、HTML の描画はローカル処理です。
モデルへ渡す候補は最大 60 件で、各項目の概要は最大 700 文字に切り詰めます。出力上限は 4,000 トークンで、既定では最大 6 件の話題を生成します。
応答を自由文として解析するのではなく、build_report というツールを呼び出すように tool_choice を固定します。返された tool_use の入力を検証し、出典と箇条書きを持つ話題だけを採用します[4]。
現在の実装では、収集結果が存在する場合、1 回の run で client.messages.create() を 1 箇所から呼び出します。ただし、実際に計上されるリクエスト数は SDK の再試行やサービス側の計上条件にも左右されます。この差は別記事で実測します。
さくらの AI Engine を利用可能にする
利用開始には、さくらインターネットの会員 ID、さくらのクラウドのプロジェクト、電話認証、クレジットカード登録が必要です。コントロールパネルで利用規約へ同意し、基盤モデル無償プラン を選択します。
基盤モデル無償プランでは、チャット生成を毎月 3,000 リクエストまで無償で利用できます。上限を超えるとレートリミットが適用され、自動的に従量課金プランへ移行することはありません[5]。
アカウントトークンを発行する
コントロールパネルで次の順に操作します。
- 左メニューの
アカウントトークンを開きます。 -
アカウントトークンを作成を選択します。 - 用途を識別できる名前を入力します。
-
作成するを選択します。 - 表示されたトークンを安全な場所へ保存します。
発行される値は次の形式です。
<UUID>:<シークレット>
この文字列全体を Bearer トークンとして使います。シークレットは作成後に再表示できないため、紛失した場合は新しいトークンを発行し、古いトークンを削除します[5]。
実際のトークンをシェル履歴、ログ、スクリーンショット、Git のコミットへ残さないようにします。
利用可能なモデルを確認する
コントロールパネルの左メニューから 利用可能なモデル を開きます。利用可能なモデルは追加や変更があり得るため、固定値だけを前提にせず、実行前にコントロールパネルで確認します[6]。
今回の Anthropic 互換 Messages API では、次を指定します。
preview/Kimi-K2.6
ai-digest をインストールする
リポジトリを取得し、仮想環境へ依存パッケージをインストールします。
git clone https://github.com/id774/ai-digest.git
cd ai-digest
python3 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
動作条件を確認します。
python --version
python cli.py --version
python -m pip show anthropic | grep '^Version:'
git rev-parse HEAD
ai-digest は Python 3.9 以降を対象とし、Anthropic Python SDK、Flask、feedparser、Pillow などを利用します。
.env で接続先を切り替える
設定例をコピーします。
cp .env.example .env
chmod 600 .env
.env の認証とモデルの部分を次のように変更します。
ANTHROPIC_API_KEY=
ANTHROPIC_AUTH_TOKEN=<UUID>:<シークレット>
ANTHROPIC_BASE_URL=https://api.ai.sakura.ad.jp
ANTHROPIC_MODEL=preview/Kimi-K2.6
SUMMARIZER_BACKEND=claude
各項目の役割は次のとおりです。
| 設定 | 役割 |
|---|---|
ANTHROPIC_API_KEY |
Anthropic 本家の API キーです。今回は空にします |
ANTHROPIC_AUTH_TOKEN |
さくらの AI Engine で発行した Bearer トークンです |
ANTHROPIC_BASE_URL |
Anthropic SDK の接続先をさくらの AI Engine へ変更します |
ANTHROPIC_MODEL |
Anthropic 互換 Messages API で使うモデルを指定します |
SUMMARIZER_BACKEND |
claude で生成 API を使用し、plain で使用しません |
ANTHROPIC_API_KEY と ANTHROPIC_AUTH_TOKEN は同時に設定できません。.env.example に入っている sk-ant-... の例を残したままトークンを追加すると、次のエラーで停止します。
Set only one of ANTHROPIC_API_KEY and ANTHROPIC_AUTH_TOKEN.
.env はリポジトリの .gitignore に含まれていますが、無視設定だけに依存せず、状態を確認します。
git status --ignored --short .env
期待する表示は次です。
!! .env
実際に読み込まれる設定を確認する
python-dotenv は、既にシェルへ設定されている環境変数を .env より優先します。以前に Anthropic 本家を使っていた端末では、古い設定が残っていないか確認します。
env \
| grep '^ANTHROPIC_' \
| cut -d= -f1 \
|| true
不要な値がある場合は、このシェルから削除します。
unset ANTHROPIC_API_KEY
unset ANTHROPIC_AUTH_TOKEN
unset ANTHROPIC_BASE_URL
unset ANTHROPIC_MODEL
秘密値を表示せず、ai-digest が読み込む設定を確認します。
.venv/bin/python - <<'PY'
from config import load_config
config = load_config()
config.validate_anthropic_auth()
print("backend:", config.summarizer_backend)
print("base_url:", config.anthropic_base_url)
print("model:", config.anthropic_model)
print("auth_token configured:", bool(config.anthropic_auth_token))
print("api_key configured:", bool(config.anthropic_api_key))
PY
期待する結果は次です。
backend: claude
base_url: https://api.ai.sakura.ad.jp
model: preview/Kimi-K2.6
auth_token configured: True
api_key configured: False
ここで失敗する場合は、API へ到達する前の設定不備です。トークンの形式、二重設定、シェル環境変数の上書きを確認します。
トークンだけを単体確認する
さくらの AI Engine の公式利用手順には、OpenAI 互換 Chat Completions API を使ったトークン確認例があります[5]。これはアカウントトークンが有効かを切り分けるための確認であり、ai-digest が利用する Messages API やツール呼び出しの互換性までは確認しません。
curl --location 'https://api.ai.sakura.ad.jp/v1/chat/completions' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer <UUID>:<シークレット>' \
--header 'Content-Type: application/json' \
--data '{
"model": "gpt-oss-120b",
"messages": [
{
"role": "user",
"content": "接続確認です。OK とだけ返してください。"
}
],
"max_tokens": 20,
"stream": false
}'
この確認を省略して、直接 ai-digest を実行しても構いません。認証エラーをアプリケーションの不具合と分けて調べたい場合に使います。
コマンドへトークンを直接書くとシェル履歴へ残る場合があります。実際の実行では一時的な環境変数や履歴を残さないシェルを使い、実値を記事へ掲載しません。
ai-digest を実行する
最初は外部サイトからの画像取得を止め、収集、要約、保存、ローカル画像生成の経路を確認します。
report_date=$(date -u +%F)
python cli.py run \
--date "$report_date" \
--no-images \
--verbose
--no-images は、ニュースサイトや arXiv から画像を取得する処理だけを無効にします。話題カードとサマリー PNG は Pillow でローカル生成されます。Messages API による要約は通常どおり実行されます。
レポートの日付は、指定しなければ UTC で決まります。日本時間の 0 時から 8 時 59 分に実行すると前日のディレクトリーへ保存されるため、確認時は --date を明示すると扱いやすくなります[7]。
成功時のログでは、次のような行を確認します。
summarized ... entries into ... topics
report for ... written to ...
ai-digest は、強制した build_report の tool_use を見つけられない場合、次のエラーで停止します。
Claude did not return a build_report tool call.
API 応答に出典または箇条書きを持たない話題が含まれる場合、その話題は破棄されます。最終的に利用可能な話題が 0 件なら、次のエラーになります。
the model returned no usable topic
HTTP 200 が返っても、構造化応答をレポートへ変換できなければ完走ではありません。
収集件数が 0 件だった場合
次のエラーは、Messages API を呼ぶ前に発生します。
no entry collected; check ARXIV_CATEGORIES and NEWS_FEED_URLS, or the network connection
arXiv の新着がない週末や、設定したニュースフィードに 24 時間以内の記事がない場合にも起こります。接続確認を続けるには、対象期間を一時的に広げます。
LOOKBACK_HOURS=72 \
python cli.py run \
--date "$(date -u +%F)" \
--no-images \
--verbose
通常運用では LOOKBACK_HOURS=24 に戻します。対象期間を広げた実行結果を、通常の日次レポートと同じ条件として扱わないようにします。
成果物まで生成されたことを確認する
保存された日付を確認します。
python cli.py list
report.json の統計情報を表示します。
jq '.stats' "data/reports/${report_date}/report.json"
次の値を確認できます。
-
collected: 収集件数 -
deduplicated: 重複排除後の件数 -
topics: 生成した話題数 -
model: 使用したモデル -
generated_at: 生成日時
生成されたファイルを確認します。
find "data/reports/${report_date}" \
-maxdepth 1 \
-type f \
-print \
| sort
正常終了した場合は、少なくとも次が存在します。
index.html
report.json
style.css
summary.png
topic-1.png
話題数に応じて topic-2.png 以降も生成されます。
完走の判定条件は次の 6 点です。
- Messages API が成功した。
-
build_reportのtool_useを取得できた。 - 出典付きの話題へ変換できた。
-
report.jsonを保存できた。 -
index.htmlを生成できた。 -
summary.pngと話題画像を生成できた。
API を使わない経路も残している
さくらの AI Engine を設定していても、次のコマンドは生成 API を呼びません。
python cli.py demo
python cli.py render "$report_date"
python cli.py list
API キーやトークンを使わずに日次処理を動かす場合は、次を指定します。
SUMMARIZER_BACKEND=plain \
python cli.py run \
--date "$(date -u +%F)" \
--no-images \
--verbose
plain は、収集した各項目を機械的に話題へ変換します。翻訳と意味的な統合は行いませんが、API が利用できない環境でも、収集、保存、HTML、PNG の生成経路を確認できます。
ai-digest で使うのは Anthropic 互換経路である
さくらの AI Engine は、OpenAI 互換の Chat Completions API と Responses API、Anthropic 互換の Messages API を提供しています。Messages API は tools と tool_choice を受け付けます[8]。
今回の ai-digest 対応は、既存の Anthropic Python SDK を維持し、認証方式、基底 URL、モデル名を切り替える実装です。
- さくらの AI Engine というサービスは OpenAI・Anthropic 互換 API を提供します。
-
ai-digestは、そのうち Anthropic 互換 Messages API を利用します。 - OpenAI 互換 API 用のクライアントを
ai-digestに追加したわけではありません。
この境界を明記すると、サービス全体の機能と今回確認した実装範囲を混同せずに済みます。
利用量の実測は次回扱う
本稿で確認するのは、さくらの AI Engine を利用可能にし、ai-digest が成果物を生成するところまでです。次の記事では、同じ実装を対象として次を検証します。
- 実行前後のコントロールパネル値の記録方法
- 1 回の
runに対するリクエスト増分 - Anthropic Python SDK の自動再試行が計上値へ与える影響
- API 応答から取得する入力・出力トークン数
-
LOOKBACK_HOURS、ARXIV_MAX_RESULTS、MAX_TOPICSを変えた比較 - 基盤モデル無償プランで実行できる回数の見積もり
- 従量課金プランへ移行した場合の費用換算
設定記事と実測記事を分けることで、接続できない原因の切り分けと、利用量の評価条件を混在させずに済みます。前者は再現可能な導入手順、後者は計測設計と結果に集中できます。
まとめ
ai-digest は、Anthropic Python SDK の接続先を差し替えることで、さくらの AI Engine の Anthropic 互換 Messages API を利用できます。必要な設定は ANTHROPIC_AUTH_TOKEN、ANTHROPIC_BASE_URL、ANTHROPIC_MODEL が中心で、Anthropic 本家用の ANTHROPIC_API_KEY は空にします。
互換性の判定は、最小メッセージへ応答が返ることだけでは終わりません。ai-digest では、強制したツール呼び出しから出典付きの話題を取得し、report.json、HTML、PNG まで生成できた時点で完走と判断します。
本稿では導入と完走確認までを整理しました。リクエスト数、トークン数、再試行、無料枠に対する運用量は、条件を固定した別記事で実測します。
ai-digest の収集、重複排除、話題整理、出典保持、生成処理と閲覧処理の分離については、原典の記事で設計意図を説明しています[9]。
参考文献
- Qiita, OpenAI・Anthropic 互換 API を無料で使おう!「さくらの AI Engine」3,000 リクエスト使い切りチャレンジ. https://qiita.com/official-events/bd14d28b53326d318fec
- さくらインターネット, さくらの AI Engine. https://ai.sakura.ad.jp/sakura-ai/ai-engine/
- id774, ai-digest. https://github.com/id774/ai-digest
- id774, ai_digest/analyzer/summarizer.py. https://github.com/id774/ai-digest/blob/master/ai_digest/analyzer/summarizer.py
- さくらインターネット, さくらの AI Engine 利用手順. https://manual.sakura.ad.jp/cloud/ai-engine/02-howto.html
- さくらインターネット, さくらの AI Engine 操作ガイド. https://manual.sakura.ad.jp/cloud/ai-engine/03-operation-guide.html
- id774, cli.py. https://github.com/id774/ai-digest/blob/master/cli.py
- さくらインターネット, AI Engine Inference API. https://manual.sakura.ad.jp/api/cloud/ai-engine/inference.html
- id774, AI 論文とニュースを日次でまとめる ai-digest を作った. https://blog.id774.net/entry/2026/07/31/5164/
