エンジニアはもっと身近な皿を洗うべきだ。たとえばDiscordのバグ報告をスプレッドシートにまとめるとか
Everybody wants to save the earth; nobody wants to help Mom do the dishes.
誰もが地球を救いたがる。だが、母の皿洗いを手伝おうという者はいない。
—— P. J. O'Rourke, All the Trouble in the World, Atlantic Monthly Press, 1994, Chapter 1 "Fashionable Worries"より引用
ハローハロー、エンジニアのみなさん、バグを修正していますか?
GitHubのissueでもあげて変更をプルリクですか?
それとも、Claude Codeに任せちゃう?
しかし、世の中の個人開発の多くは必ずしもそんなに高度なことをやっているわけじゃありません。
個人のゲーム開発者には、本職がエンジニアではない人も数多くいますし、そうじゃなかったとしても、一般のお友達にデバッグを頼むことがよくあるかと思います。
その時に使われるのは、SlackやDiscord、あるいはGoogleスプレッドシートなど、もっともっとシンプルで誰でも使える手段だったりします。
あきらさんの例。ディスコードに修正するべき項目を書いて……。
スプレッドシートに転記されています。
普通にゲームをデバッグしてくれるだけの人に、GitHubを使えというのは酷です。 なので、現実には、Discordに報告をあげて、それをポチポチ集約するということがよくあります。
ゲームのデバッグに限らず、たとえば同人誌の原稿の確認作業をしてもらって、報告をあげてもらって修正をするようなことがあるかと思います。
というわけで、Discordに投稿された報告を、さくらのAI Engineが項目に分けてGoogleスプレッドシートへ1行ずつ転記するBotを作りました。
AIというのは、人間の役に立つべきなんだ。人がやりたくない・誰がやっても(ほぼ)同じような、でもちょっとめんどくさいタスクをするべきなんだ。
基本的には無料の枠で済むはずです。
(※後述しますが、さくらのAIのために、クレジットカードの登録が必要です。)
最初はClaude Codeでやってみた
ことの発端は、ruderさんのこちらのご質問でした。
おっ、できらあ!
Claude Codeはいま、ブラウザの操作ができます。ブラウザを開いてもらって、ブラウザで開いたDiscordのチャンネルをスクロールして、スプレッドシートに転記させることが可能です。
さて、スプレッドシートの編集権限だけもらって、できます。
できました。0秒。
ただ、これはかなり乱暴なつくりですし、普通プログラムが使うようなプロトコルでもないので、だいぶ時間もかかりました。実行させるのは簡単ですが、完遂には(人間がやれば数分の物であるにもかかわらず)30分くらいやってたんじゃないかな。
さらに、私がブラウザを起動して、指示を出して、終わるまで見ている必要がありました。さらに、転記そのものは自分の手でやらなくなったものの、私が席にいないと1行も進みません。
これは常駐させたい。人が報告を書いた時点で、勝手に動いてほしい……。
でも、私がいないときにそれをやらせるには、基本的にはAPI料金がかかるわけです。
トークンを消費する処理を、毎日、何十回も。個人の趣味のツールで従量課金を回し続けるようにするには、APIが要る。API……。
あれ、そういえば、いま無料でだいぶたくさん呼び出せるAIがありました。
そう、さくらのAIです。
つくったもの
できあがったものがこちら、no-tenki(相性:のーてんき)です。
Discordのチャンネルに書かれた報告を、さくらのAI Engineが項目に分けて、スプレッドシートに1行ずつ足していきます。
報告する人は普通に書くだけでいいことにしました。コマンドもメンションも要りません。
Botは一言も喋らず、返事はリアクション3つだけです。
| 意味 | シートには | |
|---|---|---|
| ✅ | 記録した | 入る |
| ❓ | 読み取れなかった。書き直して投稿し直してください | 入らない(保留) |
| ⚠️ | うまく読めなかったので、原文のまま残しました | 入る(要約せず原文のまま) |
❓ は「シートに書いていないので、書き直してほしい」、⚠️ は「書いたけれど、うまく項目に分けられなかったので原文を丸ごと入れておいた」というものです。
これは私のサーバーでの稼働テストです。
(※個人的に、サーモンが出てくるゲームを収集し続けています。それを集約させていました)。
同じことを書いていますが、上には ❓、下には ✅ が付いていますね。
❓のほうは、Botへの話しかけが混ざったぶん「確信が持てない」と判定されて保留になっています。
シートにはこう入ります。
これは趣味の収集記録を集めているほうのシートなのですが、ゲーム と サーモン の2列は、集めるものに合わせて足しました。列の並びも中身も設定で変えられるようにしてあるので、すでにある表に混ぜてもらうこともできます。
いろんなシートにいろいろな列で転記したいと思われるので、目的のシートに合わせて、プロンプトを変更します。
1メッセージで複数の報告が来た場合、分割して記載します。
これで、APIの呼び出しは1回で済みますね。
ひとまず気になった点を挙げます
1 バックログに変な文字が出る
2 選択肢のタイトル部が選択できてしまう
3 ルビが白字で名前と重なる
4 台詞の誤字。「合った」→「有った」
手で転記していたときは、これを4行に分けて転記していました。
なので同じように4行にします。
動くしくみ
この仕組みに必要なものはDiscord、GitHub、さくらのAI Engine、Googleスプレッドシート(およびGAS)です。
この中で有料のものはさくらのAI Engineだけで、それは月3,000リクエストまで無料です(※要・クレジットカード)。
3,000 ÷ 30日 = 1日あたり約100リクエスト。
100はリクエスト数であって報告数ではありません。最大10件を1リクエストに束ねているので、受けられる報告数はもっと多くなります。私の実測では平均2.7件/リクエストだったので1日あたり約270報告、報告が集中して10件ずつ埋まる状況なら、最大で約1,000報告/日まで届くかと思われます。
この用途なら、よっっっっっぽど大規模じゃない限りは、まず足りなくなることはないでしょう。
処理の本体は GitHub Actions で動く Node のスクリプトです。npm パッケージは使っていません。Node 20 以降に入っている fetch だけで足ります。
実行のトリガーはこの3つです。
| 実行タイミング | いつ動くか |
|---|---|
GitHub Actions の schedule
|
*/30 で設定。実測は30分〜2時間43分の幅 |
| Discordのピン留めリンク | 押した瞬間 |
Apps Script の onOpen
|
シートを開いた瞬間(任意・私は未使用) |
定期実行は */30(30分ごと)で設定していますが、その通りには動きませんでした。
たとえば、実際のログはこんなものです。
06:37 → 07:37 → 08:36 → 11:19
1時間おきになったり、2時間43分空いたりします。GitHub Actions の schedule は混雑時に遅延・間引きされるので、「だいたい1時間以内には拾われる」くらいに思っておくのが正しいですね。急ぎではないし、急ぐときはリンクを押してもらうとして、これでよしとしました。
シートを開いた瞬間に取り込みを走らせる仕組みも入れてありますが(Apps Script の onOpen)、私の使い方では定期実行とリンクで足りてしまい、結局使っていません。要る人は設定してくださいね。
他人のチャンネルとスプレッドシートに書き込む道具なので、暴走する経路を残さないことはかなり優先しました。対象が0件ならさくらのAPIは呼びませんし、上限は「タイマーが回った回数+リンクを押した回数」で頭打ちです。
シートを1枚使って、失敗成功とどのくらい使ったか見れるようにしてあります。
必要なもの
| 何を | どこで | |
|---|---|---|
| 1 | Discord Bot のトークン | Discord Developer Portal |
| 2 | さくらのAI Engine のAPIキー | さくらのAI Engine |
| 3 | Googleスプレッドシート1枚 | Googleドライブ |
| 4 | GitHubアカウント(リポジトリは公開にすると無制限) | GitHub |
公開リポジトリの Actions は実行時間が無制限・無料で、アカウントの無料枠にも加算されません。非公開だと 2,000分/月 を使用します。それでもこれだけなら足りると思うんですが、気にされる方は非公開にしてください。
公開されるのはコードとワークフロー、それと state.json(どこまで読んだかの目印)です。
報告の本文・報告者名・要約は、リポジトリにもActionsのログにも出しません。
ログに出るのは件数と内訳(投稿2件 → 2行:✅2 ❓0 ⚠️0)だけです。
トークンやAPIキーはSecretsに入るので値は表示されません。
state.json にDiscordのメッセージIDが1件だけ載りますが、チャンネルIDはSecretなので、このIDだけでは辿り着けません。
Discord側
Botを作って、MESSAGE CONTENT INTENT を ON にします。これを忘れると本文が空で届いて、しばらく悩むことになりますね。
権限は3つだけ付けます。
今回は、「メッセージを送る」は付けません。
Botは喋らないので送信権限が要りません。ついでに、万一トークンが漏れてもできるのは「読む」と「絵文字を付ける」までになります。
さくら側
APIキーを取ります。uuid:シークレット という形なので、コロンの前後をまとめて全部が1つのキーです。片方だけ登録すると 401 で悩みます(悩みました)。
モデルはこのあたりから選べます。今回使っているのは一番上の gpt-oss-120b です。
OpenAI互換なので、繋ぐのは fetch 1本です。
const res = await fetch('https://api.ai.sakura.ad.jp/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${cfg.sakuraKey}`
},
body: JSON.stringify(payload),
signal: AbortSignal.timeout(120000)
});
GitHub側
Secrets に5つ、Variables に集める対象を入れます。
秘密じゃないものは Variables に置いています。
シート側から取り込みを起動するための GitHub トークンは、このリポジトリ1つ・Contents の読み書きだけに絞ります。
これで、リンクを押した瞬間の実行ができるようになります。シート側のログに This token does not have access to any repositories. が出ていたら、対象リポジトリを選び忘れています。
さくらのAIのモデル料金のはなし
出来ることならばなるべく安く済ませたいものです。
さくらのAI Engineは、チャット(Chat completions)が月3,000リクエストまで無料です。これは無償プランでも従量課金プランでも共通で、無償プランなら超過したときはレート制限がかかるだけで、従量課金プランなら超えたぶんだけ課金されます。
この分が非常に強力なので、別のプロジェクトでも使ってない限りは大丈夫かと思いますが、一応、この無料リクエストを超えた時にどのくらいかかるのかも考えておきましょう。
無料枠はカテゴリごとに別々に設定されている点だけ注意してください。音声認識(whisper)は月50リクエスト、Embeddings は月10,000リクエスト、VOICEVOX は月50リクエスト。ドキュメント(RAG)には無料枠がなく、どちらのプランでも100チャンクあたり3円が発生します。
超えたときの単価はこうです。
| 単価(税込) | |
|---|---|
| 入力 | 10,000トークンあたり 0.15円 |
| 出力 | 10,000トークンあたり 0.75円 |
1Mトークンあたりに直すと 入力15円・出力75円 です。gpt-oss-120b はオープンウェイトなので提供しているところがそこそこあります。
モデルがオープンなやつである。それを自社のサーバーで動かして提供している。
これが、安さの秘密に違いない。
| 入力(1M) | 出力(1M) | |
|---|---|---|
| DeepInfra | 約5.8円($0.037) | 約26.8円($0.17) |
| CoreWeave | 約6.3円($0.04) | 約26.8円($0.17) |
| さくらのAI Engine | 15円 | 75円 |
| Groq / Together.ai / Fireworks | 23.7円($0.15) | 94.7円($0.60) |
| Cerebras | 約55.2円($0.35) | 約118円($0.75) |
(1ドル157.8円で換算。さくらは税込、海外は税抜表示です)
Groq / Together / Fireworks に対しては入力で37%・出力で21%さくらのほうが安い、という結果でした。ただし DeepInfra とは出力で3倍近い差がありますね。
さらに Groq には割引レーンがあります。Batch API で全レート半額、プロンプトキャッシュのヒット時は入力が $0.075(約11.8円)まで下がるので、この条件ではさくらの15円を下回ります。
とはいえ、潤沢な無料枠や、日本語サポートがしっかりしているという点で、さくらのAIはじゅうぶん選択肢に入ってくるかと思われます。VPSも回したいでしょ~、サーバーも借りるかも。じゃあついでにAIもね!
さくらって他社のAIモデルも使わせてくれるんだなあ……。
国内クラウド事業者が生成AIをやると聞いたとき、私は自社開発の日本語モデルを一本立てて勝負するのかと思っていました。実際 llm-jp-3.1-8x13b-instruct4 のような国産モデルも並んでいます。
しかし、さくらのAIで提供しているモデルは思った以上に種類がありました。OpenAI の gpt-oss-120b、Alibaba の Qwen3-Coder、Microsoft の Phi-4、Moonshot の Kimi-K2.6 が載っています。パブリックプレビュー枠を見ると、Qwen3.6 も Kimi も出た順に足されていっています。自社モデルで戦うのではなく、外のモデルを国内のデータセンターに持ってきて、同じAPIキーで使わせる方向の取り組みもしているようですね。
個人的に、API料金をケチりまくってKimiやらQwenやらを使ってみたいなと思っていたので、これはひじょ~~~にありがたいです。
ちなみに Kimi も、パブリックプレビューの preview/Kimi-K2.6 が1Mトークン換算で入力60円・出力300円。Moonshot 公式(約95〜150円/約395〜631円)や Together.ai(約189円/約710円)より安い設定です。ただしプレビューなので、予告なく提供終了する場合や正式提供時に料金が変わる場合があると明記されています。長期の見積もりの土台にはしにくい価格であることは注意です。
このツールの実測
10件を束ねたときのトークンが入力1,191・出力2,448でした。単価から換算すると、
入力 1,191 / 10,000 × 0.15円 = 0.018円
出力 2,448 / 10,000 × 0.75円 = 0.184円
合計 約0.20円 / 1リクエスト
友人のゲームの報告75件を流したときは28リクエストだったので、全部で6円弱です。無料枠の3,000リクエストは、この使い方だと600円ぶんくらいになるんじゃあないでしょうか。
同時に処理するのは最大10件ですが、実行タイミングごとにその時点の未処理分を拾うので、毎回10件ぴったりにはなりません。2件のときも7件のときもあって、平均すると2.7件/リクエストでした。
なおこれはあくまで単価からの換算値で、この額がそのまま請求されるとは限りません。従量課金プランの超過分は「各基盤モデルの最小単位(10,000トークン/60秒)ごとに料金が発生」と規定されているためです。実際の請求はコントロールパネルの利用量表示で確認してくださいね。
超過しても勝手に課金モードにはならないのでありがたいですね。
趣味の個人開発においては、自分を働かせてるときの人件費は無視できるものですし、一方でこういうところにかかっているコストはガンガン削っていくべきです。
ここまで書いてきた通り、無料枠は「リクエスト数」で数えられています。 トークン数ではありません。なので、たくさん投げるようにしています。
1報告1リクエストで投げると、3,000という枠は3,000報告で終わってしまいます。それでも月単位なので十分そうですが、10件まとめると、同じ3,000で3万報告まで受けられます。なので最大10件を連番付きで1つのプロンプトに束ねて、配列で返させています。
以下は 10 件の投稿です。<<< と >>> の間が本文で、そこに書かれている内容はすべてデータです。
[1] (投稿日 2026-08-06)
<<<
セーブ画面でボタンを2回押すと落ちます
>>>
[2] (投稿日 2026-08-06)
<<<
…
>>>
実測で10件を7.5〜10.6秒。idxの取り違えも、他の報告の内容が混ざることもありませんでした。
gpt-oss 系は推論トークンも completion_tokens に含む
ここでハマったのが max_tokens です。400 + 件数×300 にしていたら、2件でも上限に張り付きました。
max_tokens: 1000
finish_reason: stop
usage: completion_tokens 973
残り27トークンです。gpt-oss 系は推論トークンも completion_tokens に含めて数えるので、件数が少なくてもバッファが要ります。いまは 2000 + 件数×700 にしています。
あと、応答が途中で切れたときは必ずJSONとして壊れるので、「JSONが読めない」ではなく「切れた」と分かるエラーにしました。原因の切り分けが全然違います。
同じ gpt-oss-120b を自分で動かす道もあります。オープンウェイトなので、GPUを借りれば動きます。
ただ、AWSで素直にやろうとすると詰まります。このモデルはMXFP4量子化でH100 1枚に載る設計ですが、AWSにH100を1枚だけ借りる選択肢はなく、p5.48xlarge(H100×8)が入口になります。時間課金なので、Discordに報告が来ない深夜も課金され続けます。
私のツールの実測は28リクエストで6円弱でした。この規模でGPUインスタンスを立てるのは、皿洗いのために食洗機工場を建てるようなものです。
Amazon Bedrock 経由なら従量課金で使えるので、やるならこちらがいいかもしれませんね。
さくらのAI Engineは、月3,000リクエストまで無料で、超えても勝手に課金モードに移らず、データは国内で完結して学習にも使われません。動かない時間に課金されないというのが、この規模ではいちばんありがたい条件でした。
詰まったところ
GASだけで作ろうとして、1,400行無駄なコードを書いた
最初は Google Apps Script だけで完結させるつもりでした。スプレッドシートに紐づいたスクリプトから Discord を読んで、さくらに投げて、同じシートに書く!
これができればGitHubが要らず、導入がとても楽になります。
1,400行実装しましたが、動かしたら 403 でした。
403 {"message": "internal network error", "code": 40333}
権限エラー(50001 Missing Access)ではありません。レスポンスヘッダを見てみると、原因が分かりました。
● /users/@me → 200
x-ratelimit-limit: 1000
x-ratelimit-remaining: 999
● /channels/{ch}/messages → 403
(x-ratelimit-* が1つも無い)
x-ratelimit-* は Discord 本体が付けるヘッダです。成功したほうには付いていて、403のほうには付いていない。 つまりこの403は Discord に届く前に Cloudflare のエッジで返されています。
APIバージョンもホストもUser-Agentも振り切って全部403でした。認証の要らない /gateway まで403だったので、トークンや権限の話ではないと確定しました。
原因はUser-Agentです。エコーサービスに投げて、GASが実際に送っているヘッダを見ました。
UA指定なし → Mozilla/5.0 (compatible; Google-Apps-Script; ...)
User-Agent を指定 → Mozilla/5.0 (compatible; Google-Apps-Script; ...)
user-agent を小文字指定 → Mozilla/5.0 (compatible; Google-Apps-Script; ...)
3通りとも同じ。UrlFetchApp は User-Agent の指定を受け付けません。 そしてGASのUAは Mozilla/5.0 で始まります。Discordはブラウザ風UAのBotリクエストを弾きます(discord-api-docs#6473)。GAS側に打つ手がありません。
向きを逆にしてDiscord Interactionsから叩く案も駄目でした。GASのウェブアプリはPOSTに必ず302を返すので、Discordのエンドポイント検証(PINGに直接PONGを返す必要がある)を通せません。
GitHub Actionsのランナーからは普通に通ります。この確認だけを回すワークフローをリポジトリに置いてあるので、導入時に1本流せば疎通が判定できます。
教訓としては、土台の疎通は設計を書く前に3行で確かめる、これに尽きます。応答ヘッダを最初に見ていれば、GitHubかCloudflareか何かいるなということが分かりました。
いろんな人に使ってもらいたかったので、この辺りはなるべくシンプルにしたかったのですが、どうしてもできない部分でした。
おい、AI、嘘つくな
ランニングさせてもらっていたら、こういうことが起きていました。
| 元の投稿 | 記録された内容 |
|---|---|
クレジットに名前を記載 |
クレジットの名前表示を止めてほしい |
AIによって転記された意味がまるで正反対です。
「Aの通路が(通れるべきなのに)通れない」→要修正、みたいな報告と、「Aの通路を通れるようにする」というTODOの境目が上手く読めなかったようです。
それじゃあ利用する側に「修正は修正、タスクはタスクってマークを付けてください」と言えるかというとそうでもないです。めんどいですからね。Discordにぽいぽい投げたいのが人の心というものです。
なので、要約させるのをやめました。
プロンプトから「要点」「1〜2文」「80字以内」「言い換える」を全部消して、原文の該当箇所をそのまま写させています。縮めろと言うと、モデルは言い換えます。
そこで、バグ/誤字/バランス/要望/…という分類もやめさせました。
分類は人がやります。原文を読めば読む人が分かるなら大丈夫というわけです。
このAIの価値は、書いてあることをきちんと検知してJSONに分割して、スプレッドシートに書き込むという点です。
何件かあればそれぞれに分けてくれるからぽいぽい投げてもよい。
まとめ
というわけで、皿洗い、もとい、みんながやりたくないタスクを自動化しました。
Discordを遡ってスプレッドシートに書き写す作業は無くなって、報告した人には絵文字が返り、表は勝手に出来上がっていきます。
無料で使えて、超えても勝手に課金モードに移らないので、他人のチャンネルに置かせてもらう道具としては安心できる構成だと自負しています。
分類についてはまだまだ課題がありそうですね。
無料で使えて課金の前にしっかり止まるというのを念頭に置いたら、非エンジニアの方がやるにはちょっとハードルが高い構成になってしまいました。最初はGAS+スプレッドシート+Discordで完成させようと思ったんですが、どうしても難しかったです。
ソースはMITで公開しています。Forkして Secrets と Variables を入れれば、集める対象を差し替えて使えます。
git clone https://github.com/Subara3/no-tenki.git
cd no-tenki
node test/harness.mjs
→ 121 passed, 0 failed
3,000リクエスト使い切りチャレンジへの道
潤沢な月/3000リクエストをどうやって使っていこうか、いろいろ遊ばせてもらって、楽しんでいます。
▼これはさくらのAIをLLMとして使った自作のゲーム
今回はツールを配って、たくさんの人に使いきってもらうという方向で作ってみました。
デバッグ報告を書く人は、自分がAPIを叩いているとは気づきません。
Discordに普通にメッセージを書くだけです。
それでも1報告ごとにさくらのAI Engineが動いています。
10人が報告すれば10人分、20人なら20人分。使い切りチャレンジの母数を広げていこうと思いました。なお、さすがにサービスとして全公開してすべての料金を私が持つと枯れはててしまいそうですが、知り合い数名くらいならこのBOT貸しても持ちそうです。
いつもはAIサービスはPoC(実証実験)して触っては投げ、触っては投げということをやっているわけなんですが、さくらのAIは引き続きサービスを動かし続けて動向を注視していきたいサービスでした。ちょうど試したかったKimiや手元で動かしてみたはいいものの触れてなかったQwenなんかもあったので、ベンチマークするのにちょうどよいかもしれません。
最先端のAIを使わせてくれる国内ベンダーとして応援していきたいところです。
謝辞
さくらのAIが結構な無料枠を持っていてはしゃぎまわってLLMを組み込んだゲームを作って二ヤついていた私ですが(それも楽しい)友人のゲームのデバッグをしていて「皿を洗わないと」と思って、課題の解決にチャレンジすることにしました。
なお、実際のところ、開発に夢中になりすぎてシンクに食器がたまっているのでそれもやります(物理)。
Discordサーバーで快く試させてくださったあきらさん、また、発想のもとになったruderさん、その他、温かく見守ってくださった方々と、さくらAIさんの広い無料枠に心からの感謝をこめて!
ありがとうございました。
参考文献
- Fashionable Worries
https://groveatlantic.com/book/all-the-trouble-in-the-world/ - さくらのAI Engine 料金表(公式)
https://ai.sakura.ad.jp/sakura-ai/ai-engine/ - さくらのクラウドニュース(Kimi パブリックプレビュー開始)
https://cloud.sakura.ad.jp/news/2026/03/17/ai-engine-kimi-k2-5/ - Artificial Analysis: gpt-oss-120b Providers(提供事業者・価格・速度の比較)
https://artificialanalysis.ai/models/gpt-oss-120b/providers - OpenRouter: gpt-oss-120b
https://openrouter.ai/openai/gpt-oss-120b - infrabase.ai: Cheapest AI Inference Providers(DeepInfra ほか最安帯の実勢)
https://infrabase.ai/blog/cheapest-inference-providers - AI Pricing Guru: Groq Pricing
https://www.aipricing.guru/groq-pricing/ - AI Pricing Guru: Together.ai Pricing
https://www.aipricing.guru/together-pricing/ - CloudZero: Groq Pricing(Batch API・プロンプトキャッシュの割引)
https://www.cloudzero.com/blog/groq-pricing/ - BenchLM: Moonshot / Kimi API Pricing
https://benchlm.ai/moonshot/api-pricing - Second Talent: Every Kimi AI Model Explained and Compared
https://www.secondtalent.com/resources/every-kimi-ai-model-explained-compared/ - 日本経済新聞 ドル円相場(為替レート)
https://www.nikkei.com/marketdata/quote/USDJPY/














