画像を作る
目次
Hermes Agent は、FAL.ai を通して文章から画像を作ります。最初から11のモデルが使えて、それぞれ速さ・仕上がり・値段の釣り合いが違います。どれを使うかは hermes tools で選べて、選んだ内容は config.yaml に残ります。
使えるモデル
| モデル | 速さ | 得意なこと | 値段 |
|---|---|---|---|
fal-ai/flux-2/klein/9b *(既定)* |
<1s |
速い。文字がくっきり出る | $0.006/MP |
fal-ai/flux-2-pro |
約6秒 | スタジオ撮影のような写実 | $0.03/MP |
fal-ai/z-image/turbo |
約2秒 | 英語と中国語の両対応、60億パラメータ | $0.005/MP |
fal-ai/nano-banana-pro |
約8秒 | Gemini 3 Pro。考える深さ、文字の描き込み | $0.15/image (1K) |
fal-ai/gpt-image-1.5 |
約15秒 | 指示のとおりに描く | $0.034/image |
fal-ai/gpt-image-2 |
約20秒 | 文字と CJK の描き込みが最高水準。実世界に沿った写実 | $0.04–0.06/image |
fal-ai/ideogram/v3 |
約5秒 | 文字組みが最良 | $0.03–0.09/image |
fal-ai/recraft/v4/pro/text-to-image |
約8秒 | デザイン、ブランドの体系、そのまま使える仕上がり | $0.25/image |
fal-ai/qwen-image |
約12秒 | 言語モデル由来。込み入った文字に強い | $0.02/MP |
fal-ai/krea/v2/medium/text-to-image |
約15〜25秒 | イラスト、アニメ、絵画、表情豊かな作風 | $0.030–0.035/image |
fal-ai/krea/v2/large/text-to-image |
約25〜60秒 | 写実、ざらつきのある質感(ぶれ、粒子、フィルム調) | $0.060–0.065/image |
値段は執筆時点の FAL のものです。最新の数字は fal.ai で確かめてください。
準備
FAL の API キーを取る
- fal.ai で登録します
- ダッシュボードから API キーを作ります
設定してモデルを選ぶ
道具のコマンドを走らせます。
hermes tools🎨 Image Generation に進んで送り先(Nous Subscription か FAL.ai)を選ぶと、使えるモデルが桁のそろった表で出てきます。矢印キーで動かし、Enter で決めます。
Model Speed Strengths Price
fal-ai/flux-2/klein/9b <1s Fast, crisp text $0.006/MP ← currently in use
fal-ai/flux-2-pro ~6s Studio photorealism $0.03/MP
fal-ai/z-image/turbo ~2s Bilingual EN/CN, 6B $0.005/MP
...選んだ内容は config.yaml に残ります。
image_gen:
provider: fal # `nous` if you picked Nous Subscription
model: fal-ai/flux-2/klein/9b
max_parallel_requests: 4 # concurrent images in one tool-call batch送り先を決めるのは image_gen.provider の一箇所だけです。nous なら管理された道具のゲートウェイを通り、提供元の名前(fal、openai、xai、krea など)なら自分のキーで直につなぎます。実行時は必ずこの設定に従います。provider: nous のあいだは .env の FAL_KEY は見ませんし、provider: fal なのに FAL_KEY がなければ、黙って別の経路に回すのではなく image_gen is configured to use fal (set via hermes tools), but FAL_KEY is not set. Run 'hermes tools' to change it. と伝えて止まります。送り先を変えるときは、キーを足したり消したりするのではなく hermes tools で変えてください。(昔の use_gateway という真偽値は名残です。true なら nous として読みますが、もう書き込まれることはありません。)
max_parallel_requests の既定は 4 です。Hermes は最低でも1、上は全体の道具の同時実行数の上限までに収めます。そのため、画像の提供元へは限られた数だけ同時に頼みが飛び、まとめて画像を作るときでも全体の上限を飛び越えません。
OpenRouter を使うと画像の一覧をまるごと選べます
image_gen.provider: openrouter にすると、モデルの選択画面に OpenRouter で今使える画像モデルが全部並びます。画像専用の Image API のモデル(Seedream、FLUX.2、Recraft、Qwen Image、MAI、Krea、Riverflow、Grok Imagine など40以上)に、会話の仕組みで画像を作るモデルを合わせたものです。 一覧は GET /images/models と GET /models からその都度取ってくるので、 OpenRouter が新しいモデルを出せばそのまま選べるようになります。Hermes を更新する必要はありません。作るときは、そのモデルを扱っている側(画像専用の POST /images/generations か、会話の仕組みか)へ自動で振り分けられます。 Nous Portal が中継するのは会話の仕組みだけなので、そちらの選択画面には会話で扱えるモデルだけが出ます。
Image API のモデルには、1回ごとの細かい指定を設定の下位の節(または OPENROUTER_IMAGE_API_* という環境変数)で渡せます。
image_gen:
provider: openrouter
model: bytedance-seed/seedream-4.5
openrouter:
resolution: 2K # model-dependent: 1K / 2K / 4K
quality: high # gpt-image models
output_format: pngGPT-Image の画質
fal-ai/gpt-image-1.5 と fal-ai/gpt-image-2 に頼むときの画質は medium に固定しています(1024×1024 でおよそ $0.034〜$0.06/image)。low や high を選べるようにしていないのは、Nous Portal の請求額を誰にとっても読みやすく保つためです。段階ごとの値段の開きが3倍から22倍もあるからです。もっと安くしたいなら Klein 9B か Z-Image Turbo を、もっと良い仕上がりが欲しいなら Nano Banana Pro か Recraft V4 Pro を選んでください。
使い方
指示できる形はあえて簡素にしてあります。設定しておいた内容をそのまま使うからです。
Generate an image of a serene mountain landscape with cherry blossomsCreate a square portrait of a wise old owl — use the typography modelMake me a futuristic cityscape, landscape orientation画像から画像を作る・手を入れる
同じ image_generate は、使っているモデルが対応していればすでにある画像に手を入れることもできます。元になる画像を渡せば、送り先が自動でその編集用の口へ振り分けます(video_generate が画像から動画を作るときと同じ考え方です)。元の画像を渡さなければ、ただの文章からの画像作成になります。
Take this photo and make it a rainy Tokyo street at night → <image>Blend these two product shots into one hero image → <image1> <image2>手を入れるときの入り口は2つです。
image_url— 手を入れたい、元になる画像そのもの(公開の URL か、手元の場所)。reference_image_urls— 作風や構図の参考にする画像を足すもの(枚数の上限はモデルごとに違います)。
どの送り先が編集に対応しているか
| 送り先 | 画像から画像 | 参考画像の上限 | どうやって |
|---|---|---|---|
| FAL.ai(下に挙げた編集できるモデル) | ✓ | 9枚まで | そのモデルの /edit の口へ振り分けます |
OpenAI(gpt-image-2) |
✓ | 16枚まで | images.edit() |
| xAI(Grok Imagine) | ✓ | 1枚 | /v1/images/edits(grok-imagine-image-quality) |
Krea(Krea 2) |
✓ | 10枚まで | 参考画像に沿った作成(image_style_references) |
| OpenAI(Codex の認証) | ✓ | 16枚まで | Codex の Responses にある image_generation を、input_image の内容として使います |
| OpenRouter(Image API のモデル) | ✓ | 14〜16枚まで(モデルによる) | POST /images/generations の input_references。会話の仕組みで動くモデルは image_url の内容として渡します(3枚まで) |
FAL のモデルのうち編集の口を持つのは flux-2/klein/9b、flux-2-pro、 nano-banana-pro、gpt-image-1.5、gpt-image-2、ideogram/v3、 qwen-image です。文章からしか画像を作れない FAL のモデル(z-image/turbo、recraft、 krea/*)は、画像を渡すと、編集できるモデルを使うようはっきり伝えて断ります。
いま使っているモデルが編集に対応しているかどうかは、実行時に道具の説明として渡ります。そのため、呼ぶ前に image_url が効くかどうかが分かります。
画像の縦横比
どのモデルでも、指示する側から見た縦横比は同じ3つです。内側では、モデルごとの本来の指定に自動で置き換わります。
| 指示する言葉 | image_size(flux/z-image/qwen/recraft/ideogram) | aspect_ratio(nano-banana-pro) | image_size(gpt-image-1.5) | image_size(gpt-image-2) |
|---|---|---|---|---|
landscape |
landscape_16_9 |
16:9 |
1536x1024 |
landscape_4_3(1024×768) |
square |
square_hd |
1:1 |
1024x1024 |
square_hd(1024×1024) |
portrait |
portrait_16_9 |
9:16 |
1024x1536 |
portrait_4_3(768×1024) |
GPT Image 2 が 16:9 ではなく 4:3 の型に割り当てられているのは、画素数の下限が 655,360 だからです。landscape_16_9(1024×576 = 589,824)では断られてしまいます。
この置き換えは _build_fal_payload() の中で起きます。指示する側が、モデルごとの違いを知る必要はありません。
引き伸ばし
頼んだときだけ
どのモデルも、黙って引き伸ばすことはしません。今どきの画像モデルはそのままの大きさでいちばん良い絵を出しますし、使える引き伸ばしの道具は*描き足す*たぐいのもので、中身をわずかに描き変えてしまいます。描かれた文字や顔、細かいところが崩れる原因になります。引き伸ばしは、はっきり頼まれたときにだけ動きます。
upscale の指定(呼ぶたびに頼む)
upscale: true— 作ったあとに、大きくする処理をつなげます。
| 送り先 | 引き伸ばしに使うもの |
|---|---|
| FAL.ai | Clarity Upscaler(2倍、+$0.03/MP) |
| Krea | Krea Enhance(2倍、8K まで) |
| そのほかの送り先 | 引き伸ばしはありません。そのままの大きさで返ります |
upscale: false/書かない — そのままの大きさです(既定)
video_generate も FAL では upscale: true を受け取り、作ったあとに ByteDance の SeedVR2 という動画の引き伸ばし(2倍、出来上がった動画の $0.001/MP)をつなげます。
FAL で画像を引き伸ばすときは、次の値が使われます。
| 項目 | 値 |
|---|---|
| 拡大の倍率 | 2倍 |
| 描き足しの強さ | 0.35 |
| 元の絵への忠実さ | 0.6 |
| 誘導の強さ | 4 |
| 処理の回数 | 18 |
引き伸ばしに失敗したら(通信の不調や回数の制限など)、元の画像がそのまま返ります。返事には upscaled: true/false が入るので、どちらの大きさで返ってきたかが分かります。
内側でどう動いているか
- モデルを決める —
_resolve_fal_model()がconfig.yamlのimage_gen.modelを読み、なければ環境変数FAL_IMAGE_MODEL、それもなければfal-ai/flux-2/klein/9bを使います。 - 頼みを組み立てる —
_build_fal_payload()がaspect_ratioをモデル本来の書き方(決まった名前、縦横比の名前、GPT の文字列)に置き換え、そのモデルの既定の値を混ぜ、呼び出し側の指定で上書きし、最後にそのモデルのsupportsに載っているものだけに絞ります。対応していない項目が送られることはありません。 - 送る —
_submit_fal_request()が、残してあるimage_gen.providerの設定に従って、FAL の認証情報で直につなぐか、管理された Nous のゲートウェイを通すかを決めます。 - 引き伸ばす —
upscale: trueが渡されたときだけ動きます。一覧に載っているどのモデルも、既定では止まっています。 - 届ける — 出来上がった画像の URL が返り、
MEDIA:<url>という印が付きます。各サービスの受け口が、これをその場に合った形の画像に変えます。
不具合を調べる
詳しい記録を出します。
export IMAGE_TOOLS_DEBUG=true記録は ./logs/image_tools_debug_<session_id>.json に残り、呼び出しごとの中身(モデル、指定、かかった時間、失敗の内容)が入ります。
どこにどう届くか
| つなぎ先 | 届き方 |
|---|---|
| CLI | 画像の URL が markdown の  として出ます。押せば開きます |
| Telegram | 写真として届き、指示した文が説明文になります |
| Discord | メッセージの中に埋め込まれます |
| Slack | Slack が URL を展開して見せます |
| 画像のメッセージとして届きます | |
| そのほか | ただの文字として URL が出ます |
できないこと
- 使っている送り先の認証情報が要ります(FAL の
FAL_KEY/Nous Subscription、OPENAI_API_KEY、xAI の OAuth、KREA_API_KEY) - 編集はモデルによります — 画像から画像を作れるのは編集に対応したモデルだけです(上の表を参照)。文章からしか作れないモデルは、画像を渡すとはっきり伝えて断ります
- URL は一時的です — 送り先が返す URL は数時間から数日で切れます。Hermes は手元の置き場に写しを取るので、切れたあとも届けられます
- モデルごとの制約 —
seedやnum_inference_stepsなどに対応していないモデルもあります。supportsとedit_supportsの絞り込みが、対応していない項目を黙って落とします。これはそういうものです