Google GenAI SDK のストリーミングでマルチターン画像編集🍌が不安定になる問題と対処法

Google GenAI SDK のストリーミングでマルチターン画像編集🍌が不安定になる問題と対処法

こんにちは!

Gemini 3 Pro Image (Nano banana Pro)を使ったマルチターン画像編集機能を実装していたところ、動いたり動かなかったりするという厄介な問題に遭遇しました。

本記事では、この問題の現象、原因調査の過程、そして解決策を共有します。


問題の現象

実行環境

Google GenAI SDKライブラリ(pip): google-genai 1.56.0

期待する動作

  1. ユーザー: 「かわいい子猫の画像を生成して」
  2. Gemini: 子猫の画像を生成
  3. ユーザー: 「この子にメガネをかけて」
  4. Gemini: 同じ子猫にメガネをかけた画像を生成

実際に起きた現象

  1. ユーザー: 「かわいい子猫の画像を生成して」
  2. Gemini: 茶色の子猫の画像を生成
  3. ユーザー: 「この子にメガネをかけて」
  4. Gemini: メガネをかけた女の子の画像を生成
あれれ、メガネをかけた子猫になるはずが、メガネをかけた女の子の画像が生成されてしまった

つまり、前回生成した画像を「覚えていない」状態になっていました。

厄介だったのは「再現性のなさ」

この問題が特に厄介だったのは、動いたり動かなかったりするという点でした。

  • 同じコードなのに、タイミングによって成功したり失敗したり、と挙動が変わる
  • サーバー再起動したら、タイミングからは長時間動作しなくなる
  • 開発環境では動いたが、ステージングでは動かない

同一コードで急に動かなくなると、「いったん再起動しよう」などとりあえずやってしまうと、環境の固定が崩れてしまい、問題の切り分け難しくなり「さっきまで動いてたのに...」という状況が発生し、原因特定に時間がかかりました。


原因調査

thought_signature の仕組み

Gemini 3 Pro Image のマルチターン画像編集は、thought_signature という仕組みに依存しています。

  • 画像生成時に、モデルは thought_signature を返す
  • これは生成した画像の情報(構図、色、内容など)を保持する約2MBのデータ
  • 次のターンでこれを渡すことで、前回の画像を「覚えている」状態になる

Google の公式ドキュメントによると

If you use the official Google Gen AI SDKs and use the chat feature, thought signatures are handled automatically.

ということで、つまり、SDK のチャット機能を使えば自動管理されるはず...でした。
この thought_signature という仕組みをつかえば、テキストチャットで行う毎回それまでのすべての履歴を送信する、ということを避けることができます。

SDK のチャットセッション

私たちのアプローチでは Google GenAI SDK の client.aio.chats.create() でチャットセッションを作成し、chat.send_message_stream() でメッセージを送信していました。

# チャットセッション作成
chat = client.aio.chats.create(model="gemini-3-pro-preview", config=config)

# メッセージ送信(ストリーミング)
response_stream = await chat.send_message_stream(content_parts)
async for response in response_stream:
    # レスポンス処理
    ...

ドキュメント通りなら、これで thought_signature は自動管理されるはず。しかし実際には動作しませんでした。

GitHub Issue #1791 の発見

調査を進める中で、GitHub で関連する issue を発見しました。

[Bug] ChatSession history fragmentation when using send_message_stream with Thinking (Gemini 3 Pro)
https://github.com/googleapis/python-genai/issues/1791

当該issue

この issue によると

When using Gemini 3 Pro Preview with thinking_config enabled, the ChatSession history becomes fragmented when using send_message_stream. Instead of appending a single model turn with the complete response, the SDK appends multiple model turns corresponding to the streaming chunks.

つまり、send_message_stream() を使うと、チャット履歴が断片化されてしまうというバグが報告されていました。

期待値

[User, Model]  # 2エントリ

実際

[User, Model, Model, Model, Model, ...]  # 複数のModelエントリ

ストリーミングのチャンクごとに履歴エントリが追加されてしまい、会話構造が壊れるとのこと。

「動いたり動かなかったり」の理由

この issue を読んで、「動いたり動かなかったり」の理由が推測できました。

  1. 同じサーバーインスタンス内で連続してリクエストすると、セッションがメモリ上に残っているため動くことがある
  2. サーバー再起動新しいセッションでは、壊れた履歴から再開しようとして動かない
  3. タイミングやネットワーク状況によって、履歴の断片化の程度が変わる

これが再現性のない挙動の原因でした。


解決策

非ストリーミング版を使う

issue #1791 を参考に、send_message_stream() の代わりに send_message() を使うことにしました。

# 修正前(ストリーミング)
response_stream = await chat.send_message_stream(content_parts)
async for response in response_stream:
    # 処理
    ...

# 修正後(非ストリーミング)
response = await chat.send_message(content_parts)
# 処理
...

結果

非ストリーミング版に変更したところ、マルチターン画像編集が安定して動作するようになりました。

  • 子猫を生成 → 同じ子猫にメガネを追加
今度は、ちゃんと、元の子猫にメガネが装着されました
  • 何度試しても同じように​
  • サーバー再起動後も動作

まとめ

問題

Google GenAI SDK の send_message_stream() を使うと、チャット履歴が断片化され、thought_signature が正しく管理されない。

影響

Gemini 3 Pro Image のマルチターン画像編集が不安定になる(動いたり動かなかったりする)。

解決策

send_message_stream() の代わりに send_message() を使う。

副作用

  • リアルタイムのストリーミング表示ができなくなる(文章+SVG出力などでの逐次表示に影響)
  • 画像生成完了まで結果が返ってこない
  • ただし、進捗表示(「処理中です...」など)のサブメッセージを別途実装すれば UX への影響は最小限で済む

今後

  • SDK のバグ修正を待つ
  • issue #1791 の進捗を監視
  • 修正されたらストリーミング版に戻すことを検討

参考リンク


最後に

同一コードで「動いたり動かなかったりする」バグは、原因特定が非常に難しいですね。今回のケースでは、SDK の内部動作を疑うまでに時間がかかりました。

同じ問題で困っている方の参考になれば幸いです。

それでは、次回またお会いしましょう!

Read more

サブスクリプションビジネスの完全ガイド【第3回】サブスクリプションビジネスの成長設計

サブスクリプションビジネスの完全ガイド【第3回】サブスクリプションビジネスの成長設計

こんにちは、Qualitegコンサルティングです! サブスクリプションビジネスの完全ガイド 第3回 をお届けいたします! 今回は、 PLG・SLG、ユニットエコノミクス、データ改善の実務ポイントについて解説していきたいとおもいます! この記事でわかること  ・PLG・SLG・ランドアンドエクスパンドの違いと使い分け  ・NRR、LTV/CAC、ペイバック期間など主要指標の実務的な読み方  ・バーンレートとランウェイから資金繰りリスクを把握する方法  ・ファネル分析・コホート分析・A/Bテストによる改善の進め方  ・AIプロダクト特有の原価構造とユニットエコノミクスの注意点 サブスクビジネス完全攻略 シリーズ一覧 第1回 『アープがさぁ...』『チャーンがさぁ...』にもう困らない サブスクビジネス完全攻略 第1回~『アープがさぁ...』『チャーンがさぁ...』にもう困らない完全ガイドなぜサブスクリプションモデルが世界を変えているのか、でもAI台頭でSaaSは終わってしまうの? こんにちは! Qualitegコンサルティングです! 新規事業戦略コンサルタントとして日々

By Qualiteg コンサルティング
(株)Qualiteg、Startup JAPAN EXPO 2026 出展レポート

(株)Qualiteg、Startup JAPAN EXPO 2026 出展レポート

こんにちは! Qualitegビジ開マーケティング部です! 2026年4月15日(水)から16日(木)までの2日間、幕張メッセで開催された「Startup JAPAN EXPO 2026」(主催:Eight / Sansan株式会社)に、 株式会社Qualitegとして出展してまいりました! Startup JAPAN EXPO 2026 出展概要 項目内容会期2026年4月15日(水)〜16日(木) 各日10:00〜17:00会場幕張メッセ 展示ホール7・8ブース16-16主催Eight(Sansan株式会社) 今回の展示テーマは—— 「依頼は並列に、思考は止めず。」 主力プロダクト「Bestllam®」に新搭載されたAIエージェント機能と、AIセキュリティソリューション「LLM-Audit™」の実演デモを、2日間にわたってお届けしました。 ブース番号は 16-16。展示ホール7・8の一角に、今回も気合いを入れて陣を構えました💪 プレスリリース 株式会社Qualiteg、

By Qualiteg ビジネス開発本部 | マーケティング部
【プレスリリース】株式会社Qualiteg、「Startup JAPAN EXPO 2026」に出展-「Bestllam®」に、AIエージェント機能を搭載-

【プレスリリース】株式会社Qualiteg、「Startup JAPAN EXPO 2026」に出展-「Bestllam®」に、AIエージェント機能を搭載-

2026年4月13日 プレスリリース 株式会社Qualiteg、「Startup JAPAN EXPO 2026」に出展株式会社Qualitegのプレスリリース(2026年4月13日 10時00分)株式会社Qualiteg、「Startup JAPAN EXPO 2026」に出展PR TIMES株式会社Qualiteg 「Bestllam®」に、AIエージェント機能を搭載 ― 依頼は並列に、思考は止めず。日本企業の業務システムに溶け込む"働くAI"へ ― 生成AI導入・AIエージェント・業務自動化・コンサルティング 株式会社Qualiteg(本社:東京都千代田区、代表取締役:三澤智則)は、2026年4月15日(水)から16日(木)まで幕張メッセで開催される「Startup JAPAN EXPO 2026」(ブース番号:16-16)に出展いたします。 この度、

By Qualiteg ニュース