Gemini CLI简介

Gemini CLI是Google推出的命令行界面工具,对标Claude Code,不过前者是开源的,这也让我们得以复现它的功能。

他提供一个TUI界面,可以在终端中与Gemini AI进行交互,支持代码生成、调试和文档编写等功能。

安装

1
2
npm install -g @google/gemini-cli
gemini

安装好后默认界面是这样的

这里我选择默认主题

Enter后会进入主界面,这里我选择使用Google账户登录,他就会弹出浏览器窗口来进行登录。

这时候我遇到了一个问题,提示我需要设置Google Cloud认证。

查阅了资料之后发现需要去到Google Cloud配置API

大概率是因为之前用过Google Cloud

进入后,选择启用Gemini for Google Cloud,然后点击管理

在这之后,还需要访问Google Cloud控制台来获取到项目 ID

在这里,找到项目ID,我这里是gen-lang-client-19890604

然后在终端环境中加入以下命令来设置环境变量:

1
export GOOGLE_CLOUD_PROJECT=gen-lang-client-19890604

Windows用户可以使用以下命令:

1
setx GOOGLE_CLOUD_PROJECT="gen-lang-client-19890604"

然后重启终端就可以登录了,如果还不能登录,或者是提示网络不行,可以开启Clash的TUN模式,这样终端也可以走代理。

初步使用

这里我让他根据代码生成一个README文件

他很快就生成好

选择always allow

看着效果还不错

接入MCP后如果能接入Github Issue来改文件就更好了

进阶技巧

使用 /compress可以压缩上下文,让他不会超过大模型的context限制

1
/compress

可以直接在终端中输入命令来执行操作,比如:

1
ls | gemini

或者

1
!ls 

你可以用

1
/chat save <tag>

来保存聊天记录,方便后续继续

像我这里就保存了一个’ai_review_chat’的聊天记录

我最常用的是

1
/chat load ai_review_chat

来加载之前的聊天记录

你可以用

1
/chat resume <tag>

来恢复聊天记录(有点类似git reset)

1
/chat list

来查看所有的聊天记录列表

自带谷歌搜索功能,可以直接在终端中输入

1
Googlesearch

来进行搜索

理解一点Gemini CLI

Gemini CLI的步骤可以分为以下几个部分:

1
2
3
4
5
6
7
8
9
1.您:「把config.ts里的超时时间改成30秒。」
2.CLI(构建Prompt1):将系统指令+对话历史+可用工具+您的指令发送给LLM。
3.LLM(思考):「我需要先看看config.ts现在的内容才能修改。」
4.LLM(返回工具调用):read_file(absolute_path:'/path/to/config.ts')
5.CLI(执行工具):读取了config.ts的内容,得到字符串const TIMEOUT=60;...。
6.CLI(构建Prompt2):将系统指令+...+您的指令+`config.ts`的文件内容发送给LLM。
7.LLM(思考):「好的,我看到内容了,现在我知道要怎么改了。」
8.LLM(返回工具调用):replace(file_path:'...',old_string:'const TIMEOUT=60;',new_string:'const TIMEOUT=30;')
9.CLI(执行工具):在您的文件系统上完成修改。

是否调用工具其实还是要看模型,让模型来判断是否进行工具调用。

举个例子:

一个典型的工具调用响应(以JSON格式为例):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
{
    "candidates": [
        {
            "content": {
                "parts": [
                    {
                        "functionCall": {
                            "name": "ls",
                            "args": {
                                "path": "internal/tui/"
                            }
                        }
                    }
                ],
                "role": "model"
            }
            // ...其他元数据
        }
    ]
}

我来解读这个JSON:

  1. functionCall: 这个字段的存在,本身就是一个明确的信号,告诉你的应用程序:“这不是最终答案,这是一个工具调用请求”。
  2. name: “ls”。这个字符串直接对应你在代码里定义的工具的名称。你的应用程序会用这个名字去查找要执行的函数。
  3. args: 这是一个包含所有参数的对象。
    • “path”: “internal/tui/”: 这里是参数名和参数值的键值对。模型从用户的提问“帮我看看 internal/tui 目录里有什么”中,准确地提取出了路径作为 path 参数的值。

痛点

现在的Gemini CLI还存在一些痛点,比如命令行模式没有补全,无法在CLI内使用vim等

还有如果不是谷歌这样财大气粗的,一直使用最顶级的模型可能有成本问题,如果能做到不同地方使用不同模型可能会更好。

话说既然都用chat来生成代码了,为什么不能实现个功能:输出chat呢?

参考

https://github.com/google-gemini/gemini-cli/blob/main/docs/cli/commands.md

https://xie.infoq.cn/article/915006cf3760c99ad0028d895

https://github.com/spf13/cobra-cli/blob/main/README.md

https://before80.github.io/go_docs/thirdPkg/Cobra/