しんたろーのITアカデミー
開発日記

Claude Codeで1人開発。画像生成のチカチカ地獄を35回のコミットで脱出した話

Claude Codeで1人開発。画像生成のチカチカ地獄を35回のコミットで脱出した話
しんたろーしんたろー
7分で読めます
この記事の内容(目次)

※この記事は、Claude Codeで1人開発しているSNS運用SaaS「ThreadPost」の開発日記です。

SNS運用を自動化しませんか?

ThreadPostなら、投稿作成・画像生成・スケジュール管理までAIがサポート。

無料で始める

投稿ボタンを押した瞬間の崩壊

投稿ボタンを押す。画面が激しく点滅し始めた。生成された画像が次々と増殖し、UIが崩壊していく。AIなら一瞬で終わるはずだったペルソナ別画像自動生成機能。35回のコミットを経て、僕は画面のチカチカと戦い続けることになった。

35回の試行錯誤の末に辿り着いた、安定したUI生成の軌跡。
35回の試行錯誤の末に辿り着いた、安定したUI生成の軌跡。

1週間の総決算

今週はペルソナ別の画像自動生成を実装した。投稿が生成されるタイミングで、画像も自動で揃う仕組みだ。結果は35コミット。新機能3件、バグ修正1件。数字だけ見れば順調だ。実際は、動かすまでの泥臭い調整で1週間が溶けた。自動化は動くより、ちゃんと動く状態にするのが本番だ。

今週の開発成果:35コミットの泥臭い積み重ね。
今週の開発成果:35コミットの泥臭い積み重ね。

ペルソナ別画像自動生成の地獄

最初はシンプルなアイデアだった。ペルソナごとに画像スタイルを持たせる。投稿生成時に画像も自動生成する仕組みだ。「feat: ペルソナ別画像自動生成機能を追加」をコミットした。これでユーザー体験は爆上がりするはずだった。

実際に動かしてみた。画像が表示されるたびにUIがチカチカする。403エラーが出る。画像が重複して生成される。順番がバラバラになる。全部やり直しだ。

しんたろーしんたろー:
バグ1個直したら別のバグが顔を出す。モグラ叩きだ。UIのチカチカを直すだけで半日消えた。

「fix: 自動生成画像のリアルタイム表示をポーリング方式に変更」

Supabase RealtimeからDBポーリングに変更した。WebSocketは標準装備だが、画像生成のような短時間の大量INSERTと相性が悪い。だから、あえて泥臭いポーリング方式に戻した。3秒間隔でDBに問い合わせる。特定のイベントだけを確実に拾うには、ポーリングの方が冪等性を担保しやすい。

ネットワークが瞬断しても、次のサイクルで正しい状態を取得できる。バグの追跡も、HTTPリクエストのログを追うだけで済む。それでもチカチカは止まらなかった。画像が生成される順番がランダムだったからだ。

「fix: 画像自動生成の順序とUIチカチカを修正」

生成順をUI表示順に固定した。sliceで最新3件を取得し、reverseで表示順に並べ替える。Reactの再レンダリングを制御し、バッチ処理で一気に状態を更新する。これでようやく、画面の点滅は収まった。

429エラーとImagen 4の罠

APIのレート制限(429 Too Many Requests)はAI開発者の宿敵だ。これを回避するため、APIキーを3つ用意してラウンドロビンで回す仕組みを作った。これで429エラーの恐怖から解放されるはずだった。だが、現実は甘くなかった。

Imagen 4が参照画像(Image-to-Image)に対応していなかった。APIの仕様書を隅々まで読んでいなかった僕のミスだ。キーを切り替えても、リクエストのペイロード自体が不正ならエラーになる。400 Bad Requestの嵐だ。

しんたろーしんたろー:
429エラーを回避しようとして、400エラーを量産した。キーを3つに増やした分、エラーの数も3倍になった。

「fix: 画像生成の最低スコア設定を追加 & Imagen 4参照画像非対応を修正」

モデルごとの機能フラグを導入した。参照画像が使えないモデルでは、機能を無効化する条件分岐を追加した。UI側でも、非対応モデルが選ばれた場合は設定項目を隠すようにした。エラーハンドリングも強化した。429エラー時は次のキーを試行する。全キー失敗時はVertex AIにフォールバックする仕組みを入れた。

ここまで読んだあなたに

今なら無料で全機能をお試しいただけます。設定後はAIが投稿案を毎日生成。確認して選ぶだけ。

無料で始める

落とし穴

「画像生成が速すぎる」という贅沢な悩みにハマった。Nano Banana Proの一部モデルは生成が異常に速い。僕が設定した3秒間隔のポーリングが走る前に、生成が完了してしまうのだ。pending状態のレコードを探し続けるシステムは、永遠に待ち続けることになった。

しんたろーしんたろー:
遅いと怒られ、速いとバグる。AI開発はまるで思春期の子供を育てるような気分だ。

「fix: ポーリングのバグを修正(pending状態チェックを削除)」

pending状態の画像の有無に関わらず、completed画像を取得するように修正した。処理Aが終わる前に処理Bが走るという前提が崩れた時に起きる、典型的な競合状態だった。

今日の数字

| 項目 | 数字 | 比較対象 |

| --- | --- | --- |

| 総コミット数 | 35件 | 通常の機能追加は5〜10件 |

| 新機能 | 3件 | 先週は1件 |

| バグ修正 | 1件 | 1つの機能に対する修正としては異常 |

| 実装期間 | 1週間 | 企業開発なら仕様策定からQAまで1.5ヶ月 |

よくある質問

Q. APIコストの最適化はどうやっているの?

最低スコアの閾値を60点に設定し、無駄な生成を弾いている。60点未満の投稿候補は画像生成をスキップする仕組みだ。これで無駄なAPIコールを減らしている。

Q. デバッグ時の再現手順はどうやって確立した?

デバッグログにtextAmountやアスペクト比などの設定値を出力するようにした。これでエラー発生時の状態を正確に再現できる。

Q. モデルごとの機能差分にはどう対応した?

モデルごとの機能フラグをハードコードして管理している。Imagen 4のように参照画像に非対応なモデルは、UI側で選択できないようにした。

泥臭い調整の果てに

動いた。壊れた。直した。ひたすらその繰り返しだった。

👉 ThreadPostでSNS運用を自動化する

ThreadPost — SNS投稿をAIが自動化

この記事が参考になったら、ThreadPostを試してみませんか?投稿作成・画像生成・スケジュール管理まで、AIがサポートします。

無料で始める

この記事をシェア

XはてブLINE
しんたろー

ThreadPost開発者・個人開発エンジニア

AI × SaaS個人開発者。Cursor / Claude Code を使った効率的開発、SNS自動化について実体験から発信。

人気の記事