Grok Imagine の動画を CLI から作る:入れた覚えのない Hermes Agent と認証情報の置き場
紙飛行機が日の当たる机の上を滑る5秒の動画が24.1秒で出てきた。
きっかけは思いつきだった。 Grok Imagine は CLI から生成できないのだろうか。 画像も動画も、これまではブラウザの画面で作っていた。 コマンドで叩けるなら、他の処理とつなげられる。
調べさせたら、API キーも従量課金も要らないという答えが返ってきた。 X の投稿検索で使っている経路が、そのまま動画生成にも通じているという。 そしてその経路を通しているのは、自分が入れた覚えのないソフトだった。
定額枠から動画を作る経路
xAI は 2026年5月に、SuperGrok のサブスクリプションを Hermes Agent の中から直接使えると告知していた。 デバイスコードの OAuth でログインすると、テキストのモデルも音声も Grok Imagine も呼べる。 自分の環境は5月の時点でそのログインを通してあった。 動画を作る関数を呼ぶ口も、同じパッケージに入っていた。 その口の存在に今日まで気づいていなかっただけだった。
設定を2つ書き足させてから試した。
uvx --from hermes-agent hermes config set video_gen.provider xai --force
uvx --from hermes-agent hermes config set video_gen.xai.storage.enabled false --force
2つめは xAI 側でのファイル保存を切る設定だ。 有効にすると恒久的な公開 URL が返ってくる代わりに、保存とホスティングに課金される場合があると注意書きにあった。 定額枠の中だけで回したいので、保存はしない。
指定は5秒、16:9、480p。 24.1秒で MP4 の URL が返り、落とすと 756,154 バイトあった。 H.264 の 848×480、24fps、5.04秒で、AAC の音声トラックも入っていた。 返却 JSON に載っていた名目コストは 0.25 USD 相当で、API 定価の 0.05 USD/秒に5秒を掛けた数字とそろっていた。 名目、という但し書きが付いているのが気になった。
動画は apps/web/content/_local-unpublished/2026-09/2026-09-04/ に置かせた。
このディレクトリはビルド時の画像コピー対象から外れるので、公開物には混ざらない。
Hermes Agent とは何だったのか
引っかかったのは、その名前だった。 Hermes とは何だったか。 インストールした記憶がない。
辿らせたら、記憶のほうが正しかった。
このマシンに hermes コマンドは無く、GUI 版も入れていない。
スキルを実行するたびに uvx がパッケージをキャッシュから引き、一回きり動かして終わっている。
作っているのは Nous Research で、複数のモデル提供元を裏で切り替えられる Python 製のオープンソースのエージェントだった。
経緯も記録から出てきた。
- 5月20日: X の投稿検索スキルを作った日が起点。その日に SuperGrok のログインを通している
- 5月21日: 決算のスキャンも同じ経路に乗せた
- 6月3日: デスクトップ版についての記事を書いたが、こちらはインストールしていない
- 6月8日: 認証が切れて入れ直した
- 9月4日: 同じ経路で動画生成を試した
投稿検索と決算スキャンの裏で3か月半動かし続けていた。 正体を確かめたのは、今日が初めてだった。
今の使い方で漏れないか
正体が分かると、この使い方で認証情報が漏れないかどうかが次に気になった。 断言の根拠になる3点だけ確かめさせた。 サーバー系のプロセスが動いていないか、接続先を差し替える環境変数が無いか、バックアップのスクリプトが認証ファイルを拾っていないか。 3つとも該当が無く、預けているものが外へ出る口は見当たらなかった。
Hermes には 2026年前半に CVE が積み上がっている。 7月22日の時点で27件。 ただし CVSS が9台に乗ったものは、いずれも WebUI やゲートウェイを立てて外に開いていることが前提だった。 自分はサーバーを立てていないし、エージェントとの会話も使っていない。 関数を1回呼んで JSON を受け取るだけで、その JSON に認証情報は入らない。
残ったのは、生成物の URL を Hermes に取りに行かせると内部宛の URL を踏みうるという報告だった。
これは動画を自分で curl して落とすことで避けた。
認証の解決順も見せてもらった。
Hermes は OAuth のトークンを先に見て、無ければ環境変数 XAI_API_KEY の API キーへ落ちる。
このマシンに落ちる先が存在しないので、リクエストは必ず OAuth のトークンで飛ぶ。
1Password に寄せられるか
トークンをファイルに置いたままなのが気になって、1Password に入れればもっとマシになるのではないかと聞いた。 ほとんど良くならない、という答えだった。
Hermes は OAuth トークンをユーザー領域の JSON からしか読まず、更新のたびに同じファイルへ書き戻す。 環境変数から注入する口が無いので、1Password から流し込む形にできない。 しかも、失っても再ログインで1分あれば取り直せる。 正本は xAI のアカウント側にあって、手元にあるのは写しにすぎない。 写しを 1Password にしまっても、正本の管理が良くなるわけではなかった。
認証ファイルを読まないためのルール
代わりに決めたのは、自分の側から開かないことだった。
.env の中身を読ませない禁止ルールがすでにあるので、その並びに認証ファイルを足させた。
- Read の禁止を2本(Windows と Mac の置き場に合わせたパターン)
cattypeheadtailgrepでの読み取り禁止を5本
update-config スキルで設定に反映させ、その場で効いていることまで確認した。 存在確認と、ログイン済みかどうかの一覧までは見てよい。 中身は開かない。
守ることは手順書のほうにも書いた。
ゲートウェイと WebUI は起動しない。
接続先を差し替える環境変数は書かない。
uvx はキャッシュを使い回してバージョンが勝手に上がらないので、月に一度は最新に追従する。
手順書は _local-unpublished に置いた。
Hermes とは何かから、生成コマンド、パラメータの範囲、事故の一覧までを1本にまとめてある。
強調の lint は通り、SSR も 200 で返ってきた。
ただし Chrome DevTools MCP がこのセッションで接続に失敗していて、画面を目で見るところまでは届いていない。
定額枠をどれだけ使ったか
一つだけ、確かめきれなかったことがある。 定額枠をどれだけ消費したのかが、CLI からは分からない。 Hermes 側はログイン済みかどうかを返すだけで、残量を持たない。 xAI 側にも枠の残りを返す公開のエンドポイントは見つからなかった。 JSON に載る名目コストは API 定価での計算値で、サブスク枠で使った分に請求が立つかどうかまではこの数字から判定できない。 分かるのは、どの認証経路で飛んだかまでだ。
第三者の記事には、サブスクの範囲で全部まかなえると書いてあるものもあった。 だが xAI 公式の文言はサブスクリプションを Hermes の中で使えるというところまでで、追加課金が無いと明言した一次資料には行き着いていない。 残りは、コンソールの請求欄とアプリ側の生成回数を一度目で見て埋めるしかない。
画像生成は同じ経路のはずだが、まだ試していない。 コマンドをスキルに固めるのも、「動画を作って」で呼びたくなった日でいい。
参考: