日曜日, 6月 29, 2025
日曜日, 6月 29, 2025
- Advertisment -
ホームニューステックニュースGemini CLIをソース解析して発見したコーギーの出現方法

Gemini CLIをソース解析して発見したコーギーの出現方法


Oikonです。外資企業でITエンジニアをしています。

ふざけたタイトルですみません(元々はこんなはずじゃなかった)。

2025年6月25日にGoogleからGemini CLIがリリースされました。

https://github.com/google-gemini/gemini-cli

Gemini CLIがせっかくOSSとして公開されているので、勉強がてらソースコードをウォークスルーしようと考えました。

当初の目的は以下の3つです。

  • 今時のCLIツールの作りを理解する
  • コンテキストをどうやってコントロールしているのか知る
  • Googleの十八番であるWeb Searchがどう組み込まれているか調べる

しかしソースコードを調べている間に/corgiという隠しコマンドを見つけてしまい、こんな記事のタイトルになってしまいました。

この記事では、ちゃんと当初の目的を中心に紹介します。

調査方法

Gemini CLIのウォークスルーにはClaude CodeとGemini CLIの力を借りました。

  • コードベース全体把握
  • 仕様のドキュメント化
  • ドキュメントの相互査読

これらのタスクを、Claude CodeとGemini CLIを交互に使って調べています。

個人的に「ドキュメントの相互査読」が結構いい感触でした。Claude Codeが書いた仕様説明をGemini CLIが正しいかレビューをして、そのレビュー結果をClaude Codeが妥当か再度検証するような流れです。

Gemini CLIはコンテキストサイズが大きいおかげか、コードの全体把握が得意だと感じました。「コードを読ませてまとめさせる」というタスクは適任かもしれないです。他のプロジェクトをウォークスルーする時は、先にGemini CLIにドキュメントの初稿を書かせてみようかなと思っています。

Claude Codeはやはり実装の理解が強い印象です。これは実際にコードを書かせても感じることが多いです。実装ロジックの詳細解説などはClaude Codeの方が得意だと感じました。

調査レポートのgistも(役に立つかは分かりませんが)貼っておきます:
https://gist.github.com/s4yuba/4165b064290b33af70c9ae9d27a9ce4b

アーキテクチャ

gemini-cli/
├── packages/
│   ├── cli/                    # ユーザーインターフェース層
│   │   ├── src/
│   │   │   ├── gemini.tsx      # メインエントリーポイント
│   │   │   ├── ui/
│   │   │   │   ├── App.tsx     # ルートUIコンポーネント
│   │   │   │   ├── components/ # React/Inkコンポーネント
│   │   │   │   ├── hooks/      # カスタムReactフック
│   │   │   │   └── themes/     # テーマ定義
│   │   │   ├── config/         # 設定管理
│   │   │   └── utils/          # ユーティリティ関数
│   │   └── package.json
│   │
│   └── core/                   # ビジネスロジック層
│       ├── src/
│       │   ├── config/         # 設定管理
│       │   │   ├── config.ts   # 中央設定クラス
│       │   ├── core/           # コアクライアント実装
│       │   │   ├── client.ts   # GeminiClient
│       │   │   ├── geminiChat.ts
│       │   │   └── turn.ts
│       │   ├── tools/          # ツール実装
│       │   │   ├── tools.ts    # 基底クラス
│       │   │   ├── edit.ts
│       │   │   ├── shell.ts
│       │   │   └── mcp-*.ts    # MCP統合
│       │   ├── services/       # 各種サービス
│       │   ├── telemetry/      # 監視機能
│       │   └── utils/          # 共通ユーティリティ
│       └── package.json

フォルダツリーは見ての通り、分かりやすいモノリポ構造です。cliコンポーネント、coreコンポーネントについて簡単に見ていきます。

cliコンポーネント

cliコンポーネントはGemini CLIのユーザーインターフェース層です。

Claude CodeやGemini CLIのリッチなCLIのインターフェースは、InkというReactのカスタムレンダラーのライブラリによるものです。

React Inkの詳細は、以下の記事で詳しく書かれているので気になる方は参照してください。

https://zenn.dev/mizchi/articles/react-ink-renderer-for-ai-age

個人的に特筆して紹介するcliコンポーネントは以下です。

cliコンポーネント:

  • gemini.tsx: CLIアプリケーションのメインエントリーポイント。設定の読み込み、サンドボックスの起動、メモリ管理など、アプリケーション全体の初期化と設定を担当。
  • ui/App.tsx: inkライブラリを使用した、インタラクティブなCLIのメインコンポーネント。ユーザー入力の処理、コマンド履歴の管理、Geminiからのストリーミングレスポンスの表示など、UIに関連する主要な機能が実装されている。
  • utils/sandbox.ts: セキュリティと分離を目的としたサンドボックス環境を管理する機能を提供。DockerやmacOSのSeatbelt(sandbox-exec)を利用して、コマンドを安全な環境で実行するためのロジックが含まれている。
  • ui/hooks/slashCommandProcessors: Slashコマンドを統括しているコンポーネント。ここを見ればどのようなSlashコマンドが存在しているか分かる。

coreコンポーネント

coreコンポーネントはいわゆるビジネスロジックを担当しています。

Gemini Client、Google検索、MCPサーバーのハンドリングなどの機能が挙げられます。ツール自体はtools/に綺麗にまとまっていました。

個人的に特筆して紹介するcoreコンポーネントは以下です。

coreコンポーネント:

  • services/gemini.ts: GoogleのGemini APIとの通信担当。ユーザーの入力やツールの実行結果をAPIに送信し、モデルからの応答(テキストやツール呼び出しのリクエスト)を受け取る。認証(OAuthやAPIキー)の複雑な処理を抽象化。
  • config/config.ts: アプリケーション全体の設定管理役。APIキー、使用するモデル、サンドボックスの有無、有効にするツールなど、CLIの動作を決定するあらゆる設定をConfigクラスとして一元管理。
  • tools/*: バックエンドのツール群。Read, WebSearch, MCP-toolなどの個別機能の実装はここに含まれている。

機能

ここでは元々調査するつもりだった2つの機能に加えて、偶然見つけた/corgiモードについて紹介します。

  1. Google Web Search
  2. コンテキスト
  3. /corgiモード

Google Web Search(WebSearchツール)は、Gemini APIのグラウンディング機能googleSearch)を活用して、ウェブ検索結果に基づいた信頼性の高い応答を生成するツールです。

このツールは、Google検索の生の結果を直接処理するのではなく、Gemini APIの内部機能を通じて検索・要約・引用付けを行います。

要は「検索をしてきてそのまま結果を使うよ」という感じです。Gemini CLIを使っていて、必要な情報の検索という観点ではまだまだ足りないと感じることがあるのはこういう理由です。

これについては実際に𝕏でも言及されていました。

検索処理のフロー


1. ユーザークエリ受信
   ↓
2. Gemini APIにgoogleSearchツールを指定してリクエスト
   const response = await geminiClient.generateContent(
     [{ role: 'user', parts: [{ text: params.query }] }],
     { tools: [{ googleSearch: {} }] },  
     signal,
   );3. Gemini APIが内部で:
   - Google検索を実行
   - 検索結果を分析・要約
   - グラウンディング情報(引用元)を生成
   ↓
4. WebSearchツールがレスポンスを処理:
   - groundingSupportsから引用位置情報を抽出
   - テキスト内の正確な位置に引用番号[1], [2]を挿入
   - groundingChunksからソースリストを生成
   ↓
5. フォーマットされた結果をユーザーに返却

2. コンテキスト

Gemini CLIで処理されるコンテキストは、以下の表のようなものに大別されます。

要素 内容 処理プログラム(ツール) トークンへの影響
基本情報 ユーザーのOS、現在日時、カレントディレクトリなどの環境情報。 (CLI内部で初期化)
ファイルシステム情報 lsやglobで取得したファイル・ディレクトリのリスト。 list_directory, glob
ファイルの内容 read_fileやsearch_file_contentで能動的に読み込んだファイルの中身。 read_file, read_many_files, search_file_content
コマンド実行結果 run_shell_commandで実行したコマンドの標準出力・エラー出力。 run_shell_command 中〜大
Web検索結果 google_web_searchがWebを検索し、要約・生成した回答。 google_web_search
会話履歴 ユーザーとGeminiの直近のやり取り。 (チャットエンジン)
システムプロンプト GEMINI.mdに記述されているような、Gemini自身の役割や行動規範を定義した指示。 (CLI内部で読み込み)

表をみるとツールを使ったアクションにトークンを消費する傾向があることが分かります。一般的に具体的な処理の指示を与えるのは、無駄なトークン消費を抑えコンテキストをクリーンにするためです。Gemini CLIでもその必要性を確認できました。

Token Limit

デフォルトのトークン上限は100万トークン(1M)であり、Claude Codeと比べても大きいです。これがGeminiを使用する大きなメリットだと思います。

一応モデルによってトークン上限にも差があることが、ソースコードから分かりました。

tokenLimits.ts

export const DEFAULT_TOKEN_LIMIT = 1_048_576;

export function tokenLimit(model: Model): TokenCount {
  
  
  switch (model) {
    case 'gemini-1.5-pro':
      return 2_097_152;
    case 'gemini-1.5-flash':
    case 'gemini-2.5-pro-preview-05-06':
    case 'gemini-2.5-pro-preview-06-05':
    case 'gemini-2.5-pro':
    case 'gemini-2.5-flash-preview-05-20':
    case 'gemini-2.5-flash':
    case 'gemini-2.0-flash':
      return 1_048_576;
    case 'gemini-2.0-flash-preview-image-generation':
      return 32_000;
    default:
      return DEFAULT_TOKEN_LIMIT;
  }
}

3. /corgiモード

Gemini CLIのコードをウォークスルーしているときに見つけました。

/corgiのスラッシュコマンドを打つと、フッターの右下にコーギーが現れます。

Claude Codeがスラッシュコマンドの表を作ってくれた時に、一番最後に謎の/corgiコマンドがあり「ん??なんだこれ??」と思いました。

Claude Codeが生成したスラッシュコマンド表:

コマンド 説明
/help または /? ヘルプを表示
/docs 完全なGemini CLIドキュメントをブラウザで開く
/clear 会話履歴をクリア(Ctrl+Lでも可)
/theme テーマ選択ダイアログ
/auth 認証方法の変更
/stats 使用統計を表示
/memory メモリ管理(add/show/refresh)
/tools 利用可能なツール一覧
/mcp MCPサーバー一覧と状態
/compress 会話を手動圧縮
/bug バグレポートの提出
/about バージョン情報とシステム詳細を表示
/chat 会話履歴管理(list/save/load/resume/delete)
/restore [tool_call_id] チェックポイントから復元(要–checkpointing)
/quit Gemini CLIを終了(exitやCtrl+Dでも可)
/editor エディタ設定ダイアログを開く
/corgi イースターエッグ(🐕)

いわゆるイースターエッグ的な隠し要素です。

実際にスラッシュコマンド部分のコードを見てみると以下のようになっています。

slashCommandProcessor.ts

  {
    name: 'corgi',
    action: (_mainCommand, _subCommand, _args) => {
      toggleCorgiMode();
    },
  },

このcorgiModeをさらに深掘りすると、以下のようにReact Ink Textで表現されています。

Footer.tsx

{corgiMode && (
  Text>
    Text color={Colors.Gray}>| /Text>
    Text color={Colors.AccentRed}>/Text>
    Text color={Colors.Foreground}>(´/Text>
    Text color={Colors.AccentRed}>/Text>
    Text color={Colors.Foreground}>`)/Text>
    Text color={Colors.AccentRed}>/Text>
  /Text>
)}

非常にシンプルな実装です。たとえば「何かに失敗したフリーレン」に差し替えることも可能です。

Footer.tsx

{corgiMode && (
    Text>
        Text color={Colors.Gray}>| /Text>
        Text color={Colors.AccentBlue}>/Text>
        Text color={Colors.Foreground}>(´/Text>
        Text color={Colors.AccentBlue}>/Text>
        Text color={Colors.Foreground}> ̫ /Text>
        Text color={Colors.AccentBlue}>/Text>
        Text color={Colors.Foreground}>`)/Text>
        Text color={Colors.AccentBlue}>/Text>
    /Text>
)}

何かに失敗したフリーレン:
何かに失敗したフリーレン

こういう遊び要素があるのは、個人的に結構好きで面白いですね。

まとめ

Gemini CLIをウォークスルーしてみました。イースターエッグ要素の/corgiモードを発見できたのはラッキーでした。

最近はAIエージェントとOSSコードを見ることができるため、全体把握が以前よりやりやすくなったのはいいなと感じました。詳しい実装はGemini CLIのリポジトリで確認できるので、気になる方はぜひ確認してみてください。

個人的にGemini CLIは無料で使えるかなり良いCLIツールだと思います。ぜひ使い倒しましょう!

𝕏フォローしてくれると嬉しいです!

𝕏でも情報発信しているので、フォローしていただけると励みになります。!!

最近のAI関係のポストは、ハイライトを見ていただければと思います。

参考文献

Gemini CLI:

https://github.com/google-gemini/gemini-cli

React Ink によるリッチ CLI (ClaudeCodeの裏側のアレ):

https://zenn.dev/mizchi/articles/react-ink-renderer-for-ai-age

Gemini CLI の簡単チュートリアル:

https://zenn.dev/schroneko/articles/gemini-cli-tutorial



Source link

Views: 0

RELATED ARTICLES

返事を書く

あなたのコメントを入力してください。
ここにあなたの名前を入力してください

- Advertisment -