前回、「第二の脳(about_me)の管理形式をGoogle DocsからMarkdown(.md)へ一本化する」という方針を決め、過去ドキュメント130件超の一括変換まで完了させた。
だが、実際にAIエージェント(Gemini Spark)へ「この内容を第二の脳に追記して(++)」と指示し、実運用を開始した瞬間に、新たな技術的トラップが口を開けて待っていたのだ。
1. 発生した問題:指定しているのに「勝手にGoogle Docsになる」怪奇現象
エージェントに第二の脳のノート作成や追記を頼んだあと、Google Driveのフォルダを開いて確認したとき、思わず首を傾げてしまった。
作成されたファイルが、拡張子 .md のテキストファイルではなく、見慣れた青いアイコンの「Google Docs(.gdoc)」として鎮座していたのだ。
プロンプトやスキル定義には「Markdown(.md)で保存すること」「Google Docs形式は禁止」と口を酸っぱくして明記してある。エージェント自身も「Markdownで保存しました」と報告してくる。それなのに、Google Driveの実体はGoogle Docsに化けてしまっている。これではローカルのObsidian保管庫や自作スクリプトから直接プレーンテキストとして読み書きできず、元の木阿弥になってしまうのだ。
一時的なバグなのかと思い何度か試行を繰り返してみたが、結果は同じだった。ドライブ内には削除候補の不要なGoogle Docsファイルが増えていく。これはプロンプトの書き方の問題ではなく、ツールの下位レイヤーに根本的な原因があると直感した。
2. 原因の調査:Google Drive APIの内部変換仕様
Gemini SparkがGoogle Driveへファイルを保存する際に呼び出しているツール仕様を詳しく追跡した結果、決定的な原因が判明した。
ファイル作成ツール(drive:create_file)において、テキスト本文を直接渡すパラメータ(text_content)を使用すると、MIMEタイプに text/markdown を指定していようが何だろうが、Google Drive API側の挙動によって「テキスト本文が渡された=編集可能なGoogle Docsへ変換する」という自動変換処理が強制的に発動してしまう仕様になっていたのだ。
つまり、エージェント側がどれほど強い意志で「Markdown形式にする」とプロンプトで自己暗示をかけていても、テキスト直接送信のAPIを叩いている限り、Drive側で強制的にDocsに変換されてしまう構造だったわけだ。
3. 解決策:バイナリアップロードによる2段階保存手順の確立
この強制Docs化インターセプターを回避するにはどうすればいいのか。答えは「Drive側にテキストファイルだと認識させず、バイナリストリームとして無加工で送り込む」ことだった。
試行錯誤の末に確立したワークフローは以下の2段階手順である。
-
ローカルVM環境でのMarkdown一時ファイル生成
エージェントの作業環境ローカル上に、完全なMarkdown構文で.mdファイルを一度書き出す。 -
バイナリモードでのアップロード
drive:create_fileを呼び出す際、text_contentは空文字にし、mime_typeにapplication/octet-stream(汎用バイナリ)、base64_contentにローカルファイルのパスを指定してアップロードする。これにより、Drive側のDocs自動変換機構を完全に素通りさせることができる。 -
親フォルダの移動・配置
アップロード直後はマイドライブ直下に配置されるため、即座にdrive:update_fileを呼び出して目的のPARAフォルダ(01_Projectsや02_Areas)へ親IDを付け替える。
この手順を実行したところ、Google Drive上に自動変換されることなく、正真正銘のプレーンテキストな .md ファイル(MIMEタイプ: text/markdown または application/x-yaml)が綺麗に保存された。
4. スキルへの恒久的な落とし込みと運用改善
手法が確立できたので、これを場当たり的な対話で終わらせず、エージェントのスキル定義へ完全に組み込んだ。
| 改修項目 | 旧来の仕様(append-to-second-brain) | 刷新後の仕様(add-to-second-brain) |
|---|---|---|
| 編集・作成ツール | docs_agent(Google Docs専用編集)を併用 | docs_agent全面禁止。バイナリアップロードによる.md保存のみ |
| ファイル形式 | .gdoc と .md が混在しがちだった | 純粋なMarkdown(.md)保存の完全徹底 |
| 版管理・更新手順 | ドキュメント内への追記(ファイルは単一) | 旧版DL ➔ 追記マージ ➔ バージョン採番(v1.5 ➔ v1.6)➔ 新規.md保存 ➔ 旧版は04_Archivesへ自動退避 |
| ユーザー確認UI | 自由文での聞き返し(回答の手間大) | 新規スキル「inline-question-format」導入(ワンクリックコピー&インライン回答) |
特に、既存ファイルを更新する際に「旧ファイルを読み込み、追記セクションをマージしてバージョンを1つ進め、古いバージョンを自動的に 04_Archives フォルダへ隔離する」というライフサイクルを定義したことで、フォルダ内に同一タイトルのゴミが散らからず、常に最新版が先頭に保たれるようになった。
5. 今回の試行錯誤から得た教訓
プロンプトエンジニアリングやシステムプロンプトの調整だけでAIエージェントをコントロールしようとしても、裏で動いているAPIやクラウドサービスの内部仕様(今回で言えばGoogle Drive APIの自動変換トラップ)に阻まれることがある。
「なぜ指示通りのフォーマットにならないのか」をツールの入出力レベルまで潜って検証し、バイパス経路(バイナリアップロード)を見つけ出してスキルの手順として型化する。この「下位レイヤーの制約を上位レイヤーのプロトコルで飼いならす」感覚こそが、自律AIエージェントと実用的な作業環境を構築する上での一番の面白さであり、手応えだと感じている。
これでようやく、Google Driveとローカル(Obsidian / ローカルLLM)が一切の変換歪みなく、完全にプレーンなMarkdownで呼吸し合える環境が整った。第二の脳の自動化は、また一歩、堅牢になったと言えそうだ。
コメント
コメントを投稿