3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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]

report-desktop.png

先に結論

ai-digest をさくらの AI Engine へ接続するために必要な設定は、次の 5 項目です。

.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 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 回の runclient.messages.create() を 1 箇所から呼び出します。ただし、実際に計上されるリクエスト数は SDK の再試行やサービス側の計上条件にも左右されます。この差は別記事で実測します。

さくらの AI Engine を利用可能にする

利用開始には、さくらインターネットの会員 ID、さくらのクラウドのプロジェクト、電話認証、クレジットカード登録が必要です。コントロールパネルで利用規約へ同意し、基盤モデル無償プラン を選択します。

基盤モデル無償プランでは、チャット生成を毎月 3,000 リクエストまで無償で利用できます。上限を超えるとレートリミットが適用され、自動的に従量課金プランへ移行することはありません[5]

アカウントトークンを発行する

コントロールパネルで次の順に操作します。

  1. 左メニューの アカウントトークン を開きます。
  2. アカウントトークンを作成 を選択します。
  3. 用途を識別できる名前を入力します。
  4. 作成する を選択します。
  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 の認証とモデルの部分を次のように変更します。

.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_KEYANTHROPIC_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_reporttool_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 点です。

  1. Messages API が成功した。
  2. build_reporttool_use を取得できた。
  3. 出典付きの話題へ変換できた。
  4. report.json を保存できた。
  5. index.html を生成できた。
  6. 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 は toolstool_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_HOURSARXIV_MAX_RESULTSMAX_TOPICS を変えた比較
  • 基盤モデル無償プランで実行できる回数の見積もり
  • 従量課金プランへ移行した場合の費用換算

設定記事と実測記事を分けることで、接続できない原因の切り分けと、利用量の評価条件を混在させずに済みます。前者は再現可能な導入手順、後者は計測設計と結果に集中できます。

まとめ

ai-digest は、Anthropic Python SDK の接続先を差し替えることで、さくらの AI Engine の Anthropic 互換 Messages API を利用できます。必要な設定は ANTHROPIC_AUTH_TOKENANTHROPIC_BASE_URLANTHROPIC_MODEL が中心で、Anthropic 本家用の ANTHROPIC_API_KEY は空にします。

互換性の判定は、最小メッセージへ応答が返ることだけでは終わりません。ai-digest では、強制したツール呼び出しから出典付きの話題を取得し、report.json、HTML、PNG まで生成できた時点で完走と判断します。

本稿では導入と完走確認までを整理しました。リクエスト数、トークン数、再試行、無料枠に対する運用量は、条件を固定した別記事で実測します。

ai-digest の収集、重複排除、話題整理、出典保持、生成処理と閲覧処理の分離については、原典の記事で設計意図を説明しています[9]

参考文献

  1. Qiita, OpenAI・Anthropic 互換 API を無料で使おう!「さくらの AI Engine」3,000 リクエスト使い切りチャレンジ. https://qiita.com/official-events/bd14d28b53326d318fec
  2. さくらインターネット, さくらの AI Engine. https://ai.sakura.ad.jp/sakura-ai/ai-engine/
  3. id774, ai-digest. https://github.com/id774/ai-digest
  4. id774, ai_digest/analyzer/summarizer.py. https://github.com/id774/ai-digest/blob/master/ai_digest/analyzer/summarizer.py
  5. さくらインターネット, さくらの AI Engine 利用手順. https://manual.sakura.ad.jp/cloud/ai-engine/02-howto.html
  6. さくらインターネット, さくらの AI Engine 操作ガイド. https://manual.sakura.ad.jp/cloud/ai-engine/03-operation-guide.html
  7. id774, cli.py. https://github.com/id774/ai-digest/blob/master/cli.py
  8. さくらインターネット, AI Engine Inference API. https://manual.sakura.ad.jp/api/cloud/ai-engine/inference.html
  9. id774, AI 論文とニュースを日次でまとめる ai-digest を作った. https://blog.id774.net/entry/2026/07/31/5164/
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?