一个由 AI 大语言模型 (LLM) 驱动的命令行生产力工具。此命令行工具可简化 Shell 命令、代码片段、文档 的生成,无需借助外部资源(如 Google 搜索)。支持 Linux、macOS、Windows,并与所有主流 Shell 兼容,如 PowerShell、CMD、Bash、Zsh 等。
https://github.com/TheR1D/shell_gpt/assets/16740832/721ddb19-97e7-428f-a0ee-107d027ddd59
pip install shell-gpt
默认情况下,ShellGPT 使用 OpenAI 的 API 和 GPT-4 模型。你需要一个 API 密钥,可以在此处生成。系统会提示你输入密钥,然后将其存储在 ~/.config/shell_gpt/.sgptrc 中。OpenAI API 并非免费,请参考 OpenAI 定价 了解更多信息。
[!TIP]
或者,你可以使用本地托管的开源模型,这些模型是免费的。要使用本地模型,你需要运行自己的 LLM 后端服务器,例如 Ollama。要设置 ShellGPT 与 Ollama 配合使用,请遵循这份全面的指南。❗️请注意,ShellGPT 并未针对本地模型进行优化,可能无法按预期工作。
ShellGPT 旨在快速分析和检索信息。它适用于从技术配置到一般知识的直接请求。
sgpt "什么是斐波那契数列"
# -> 斐波那契数列是一系列数字,其中每个数字...
ShellGPT 可以从标准输入 (stdin) 和命令行参数接收提示。无论你更喜欢通过终端管道输入还是直接将其指定为参数,sgpt 都能满足你的需求。例如,你可以轻松地基于 diff 生成 git 提交信息:
git diff | sgpt "为我的更改生成 git 提交信息"
# -> 将主要功能详情添加到 README.md
你可以通过 stdin 传递来自各种来源的日志,并附带提示进行分析。例如,我们可以用它快速分析日志、识别错误并获取可能的解决方案建议:
docker logs -n 20 my_app | sgpt "检查日志,查找错误,提供可能的解决方案"
检测到错误:第 7 行连接超时。
可能解决方案:检查网络连接和防火墙设置。
检测到错误:第 12 行内存分配失败。
可能解决方案:考虑增加内存分配或优化应用程序内存使用。
你也可以使用各种重定向操作符来传递输入:
sgpt "总结" < document.txt
# -> 该文档讨论了...的影响...
sgpt << EOF
学习 Golang 的最佳方式是什么?
提供一个简单的 hello world 示例。
EOF
# -> 学习 Golang 的最佳方式是...
sgpt <<< "学习 shell 重定向的最佳方式是什么?"
# -> 学习 shell 重定向的最佳方式是通过...
你是否曾忘记常见的 shell 命令(如 find)并需要在线查找语法?使用 --shell 或快捷选项 -s,你可以快速生成并在终端中执行所需的命令。
sgpt --shell "查找当前文件夹中的所有 json 文件"
# -> find . -type f -name "*.json"
# -> [E]xecute, [D]escribe, [A]bort: e
Shell GPT 知道你使用的操作系统和 $SHELL,它将为你拥有的特定系统提供 shell 命令。例如,如果你要求 sgpt 更新你的系统,它将根据你的操作系统返回一个命令。以下是在 macOS 上使用的示例:
sgpt -s "更新我的系统"
# -> sudo softwareupdate -i -a
# -> [E]xecute, [D]escribe, [A]bort: e
相同的提示,在 Ubuntu 上使用时,将生成不同的建议:
sgpt -s "更新我的系统"
# -> sudo apt update && sudo apt upgrade -y
# -> [E]xecute, [D]escribe, [A]bort: e
让我们用 Docker 试试:
sgpt -s "启动 nginx 容器,挂载 ./index.html"
# -> docker run -d -p 80:80 -v $(pwd)/index.html:/usr/share/nginx/html/index.html nginx
# -> [E]xecute, [D]escribe, [A]bort: e
我们仍然可以使用管道将输入传递给 sgpt 并生成 shell 命令:
sgpt -s "POST localhost with" < data.json
# -> curl -X POST -H "Content-Type: application/json" -d '{"a": 1, "b": 2}' http://localhost
# -> [E]xecute, [D]escribe, [A]bort: e
在我们的提示中应用额外的 shell 技巧,在此示例中将文件名传递给 ffmpeg:
ls
# -> 1.mp4 2.mp4 3.mp4
sgpt -s "ffmpeg 将 $(ls -m) 合并成一个没有音频的视频文件。"
# -> ffmpeg -i 1.mp4 -i 2.mp4 -i 3.mp4 -filter_complex "[0:v] [1:v] [2:v] concat=n=3:v=1 [v]" -map "[v]" out.mp4
# -> [E]xecute, [D]escribe, [A]bort: e
如果你想通过管道传递生成的 shell 命令,可以使用 --no-interaction 选项。这将禁用交互模式,并将生成的命令打印到标准输出。在此示例中,我们使用 pbcopy 将生成的命令复制到剪贴板:
sgpt -s "查找当前文件夹中的所有 json 文件" --no-interaction | pbcopy
这是一个非常方便的功能,它允许你直接在终端中使用 sgpt shell 补全,而无需键入带有提示和参数的 sgpt。Shell 集成支持在终端中使用热键调用 ShellGPT,Bash 和 ZSH shell 均支持此功能。此功能将 sgpt 补全直接放入终端缓冲区(输入行),允许立即编辑建议的命令。
https://github.com/TheR1D/shell_gpt/assets/16740832/bead0dab-0dd9-436d-88b7-6abfb2c556c1
要安装 shell 集成,请运行 sgpt --install-integration 并重启终端以应用更改。这将在你的 .bashrc 或 .zshrc 文件中添加几行。之后,你可以使用 Ctrl+l(默认)来调用 ShellGPT。当你按下 Ctrl+l 时,它将用建议的命令替换你当前的输入行(缓冲区)。然后你可以编辑它,只需按 Enter 即可执行。
通过使用 --code 或 -c 参数,你可以专门请求纯代码输出,例如:
sgpt --code "使用 python 解决 fizz buzz 问题"
for i in range(1, 101):
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
由于它是有效的 Python 代码,我们可以将输出重定向到文件:
sgpt --code "使用 Python 解决经典的 fizz buzz 问题" > fizz_buzz.py
python fizz_buzz.py
# 1
# 2
# Fizz
# 4
# Buzz
# ...
我们也可以使用管道传递输入:
cat fizz_buzz.py | sgpt --code "为我的每一行代码生成注释"
# 循环遍历数字 1 到 100
for i in range(1, 101):
# 检查数字是否能被 3 和 5 整除
if i % 3 == 0 and i % 5 == 0:
# 如果数字能被 3 和 5 整除,则打印 "FizzBuzz"
print("FizzBuzz")
# 检查数字是否能被 3 整除
elif i % 3 == 0:
# 如果数字能被 3 整除,则打印 "Fizz"
print("Fizz")
# 检查数字是否能被 5 整除
elif i % 5 == 0:
# 如果数字能被 5 整除,则打印 "Buzz"
print("Buzz")
# 如果数字不能被 3 或 5 整除,则打印数字本身
else:
print(i)
通常,保存和回忆对话很重要。sgpt 为每个请求的 LLM 补全创建对话。对话可以逐个发展(聊天模式),也可以在 REPL 循环中交互式进行(REPL 模式)。两种方式都依赖于同一个底层对象,称为聊天会话。会话位于可配置的 CHAT_CACHE_PATH。
要开始对话,请使用 --chat 选项,后跟唯一的会话名称和提示。
sgpt --chat conversation_1 "请记住我最喜欢的数字:4"
# -> 我会记住你最喜欢的数字是 4。
sgpt --chat conversation_1 "我最喜欢的数字加 4 会是多少?"
# -> 你最喜欢的数字是 4,所以如果我们加上 4,结果将是 8。
你可以使用聊天会话,通过提供更多细节来迭代改进 GPT 的建议。可以使用 --code 或 --shell 选项来启动 --chat:
sgpt --chat conversation_2 --code "使用 python 向 localhost 发出请求"
import requests
response = requests.get('http://localhost')
print(response.text)
让我们要求 LLM 为我们的请求添加缓存:
sgpt --chat conversation_2 --code "添加缓存"
import requests
from cachecontrol import CacheControl
sess = requests.session()
cached_sess = CacheControl(sess)
response = cached_sess.get('http://localhost')
print(response.text)
同样适用于 shell 命令:
sgpt --chat conversation_3 --shell "当前文件夹中有什么"
# -> ls
sgpt --chat conversation_3 "按名称排序"
# -> ls | sort
sgpt --chat conversation_3 "使用 FFMPEG 连接它们"
# -> ffmpeg -i "concat:$(ls | sort | tr '\n' '|')" -codec copy output.mp4
sgpt --chat conversation_3 "将生成的文件转换为 MP3"
# -> ffmpeg -i output.mp4 -vn -acodec libmp3lame -ac 2 -ab 160k -ar 48000 final_output.mp3
要列出所有来自任一对话模式的会话,请使用 --list-chats 或 -lc 选项:
sgpt --list-chats
# .../shell_gpt/chat_cache/conversation_1
# .../shell_gpt/chat_cache/conversation_2
要显示与特定对话相关的所有消息,请使用 --show-chat 选项,后跟会话名称:
sgpt --show-chat conversation_1
# user: 请记住我最喜欢的数字:4
# assistant: 我会记住你最喜欢的数字是 4。
# user: 我最喜欢的数字加 4 会是多少?
# assistant: 你最喜欢的数字是 4,所以如果我们加上 4,结果将是 8。
有一个非常方便的 REPL(读取-求值-打印循环)模式,允许你与 GPT 模型进行交互式聊天。要在 REPL 模式下启动聊天会话,请使用 --repl 选项,后跟唯一的会话名称。你也可以使用 "temp" 作为会话名称来启动临时 REPL 会话。请注意,--chat 和 --repl 使用相同的底层对象,因此你可以使用 --chat 启动聊天会话,然后使用 --repl 继续 REPL 模式下的对话。
sgpt --repl temp
进入 REPL 模式,按 Ctrl+C 退出。
>>> 什么是 REPL?
REPL 代表 Read-Eval-Print Loop。它是一个编程环境...
>>> 我如何将 Python 与 REPL 一起使用?
要将 Python 与 REPL 一起使用,你可以简单地打开终端或命令提示符...
REPL 模式可以与 --shell 和 --code 选项一起使用,这使得它在交互式 shell 命令和代码生成方面非常方便:
sgpt --repl temp --shell
进入 shell REPL 模式,输入 [e] 执行命令或按 Ctrl+C 退出。
>>> 当前文件夹中有什么?
ls
>>> 显示文件大小
ls -lh
>>> 按文件大小排序
ls -lhS
>>> e (仅输入 e 以执行命令,或 d 以描述它们)
要提供多行提示,请使用三引号 """:
sgpt --repl temp
进入 REPL 模式,按 Ctrl+C 退出。
>>> """
... 解释以下代码:
... import random
... print(random.randint(1, 10))
... """
这是一个使用 random 模块生成并打印随机整数的 Python 脚本。
你也可以通过将初始提示作为参数或 stdin 传递,甚至两者都传递来进入 REPL 模式:
sgpt --repl temp < my_app.py
进入 REPL 模式,按 Ctrl+C 退出。
──────────────────────────────────── 输入 ────────────────────────────────────
name = input("What is your name?")
print(f"Hello {name}")
───────────────────────────────────────────────────────────────────────────────
>>> 这段代码是关于什么的?
你提供的代码片段是用 Python 编写的。它提示用户...
>>> 后续问题...
函数调用 是 OpenAI 提供的一项强大功能。它允许 LLM 在你的系统中执行函数,这可用于完成各种任务。要安装默认函数,请运行:
sgpt --install-functions
ShellGPT 有一种方便的方法来定义和使用函数。要创建自定义函数,请导航到 ~/.config/shell_gpt/functions 并创建一个以函数名命名的 .py 文件。在此文件中,你可以使用此示例定义你的函数。
类内部的文档字符串注释将作为函数描述传递给 OpenAI API,以及 title 属性和参数描述。如果 LLM 决定使用你的函数,将调用 execute 函数。在这种情况下,我们允许 LLM 在我们的系统中执行任何 Shell 命令。由于我们返回命令的输出,LLM 将能够分析它并决定它是否适合提示。以下是 LLM 可能如何执行函数的示例:
sgpt "/tmp 文件夹中有哪些文件?"
# -> @FunctionCall execute_shell_command(shell_command="ls /tmp")
# -> /tmp 文件夹包含以下文件和目录:
# -> test.txt
# -> test.json
请注意,如果由于某种原因函数 (execute_shell_command) 返回错误,LLM 可能会尝试根据输出来完成任务。假设我们的系统没有安装 jq,我们要求 LLM 解析 JSON 文件:
sgpt "使用 jq 解析 /tmp/test.json 文件并仅返回 email 值"
# -> @FunctionCall execute_shell_command(shell_command="jq -r '.email' /tmp/test.json")
# -> 看起来系统上没有安装 jq。让我尝试使用 brew 安装它。
# -> @FunctionCall execute_shell_command(shell_command="brew install jq")
# -> jq 已成功安装。让我尝试再次解析该文件。
# -> @FunctionCall execute_shell_command(shell_command="jq -r '.email' /tmp/test.json")
# -> /tmp/test.json 中的 email 值是 johndoe@example。
也可以在提示中链接多个函数调用:
sgpt "播放音乐并打开黑客新闻"
# -> @FunctionCall play_music()
# -> @FunctionCall open_url(url="https://news.ycombinator.com")
# -> 音乐正在播放,黑客新闻已在你的浏览器中打开。享受吧!
这只是一个如何使用函数调用的简单示例。它确实是一个强大的功能,可用于完成各种复杂的任务。我们在 GitHub Discussions 中有一个专门的类别用于分享和讨论函数。
LLM 可能会执行破坏性命令,因此请自行承担使用风险❗️
ShellGPT 允许你创建自定义角色,这些角色可用于生成代码、shell 命令或满足你的特定需求。要创建新角色,请使用 --create-role 选项,后跟角色名称。系统将提示你提供角色描述以及其他详细信息。这将在 ~/.config/shell_gpt/roles 中创建一个以角色名命名的 JSON 文件。在此目录中,你还可以编辑默认的 sgpt 角色,例如 shell、code 和 default。使用 --list-roles 选项列出所有可用角色,使用 --show-role 选项显示特定角色的详细信息。以下是自定义角色的示例:
sgpt --create-role json_generator
# 输入角色描述:仅提供有效的 json 作为响应。
sgpt --role json_generator "随机:用户、密码、电子邮件、地址"
{
"user": "JohnDoe",
"password": "p@ssw0rd",
"email": "johndoe@example.com",
"address": {
"street": "123 Main St",
"city": "Anytown",
"state": "CA",
"zip": "12345"
}
}
如果角色描述包含单词 "APPLY MARKDOWN"(区分大小写),那么聊天将使用 Markdown 格式显示,除非使用 --no-md 明确关闭。
使用 --cache(默认)和 --no-cache 选项控制缓存。此缓存适用于所有 sgpt 对 OpenAI API 的请求:
sgpt "彩虹有哪些颜色"
# -> 彩虹的颜色是红、橙、黄、绿、蓝、靛、紫。
下次,完全相同的查询将从本地缓存立即获取结果。请注意,sgpt "彩虹有哪些颜色" --temperature 0.5 将发出新请求,因为我们没有在之前的请求中提供 --temperature(同样适用于 --top-probability)。
这只是我们使用 OpenAI GPT 模型可以完成的一些示例,我相信你会发现它对你的特定用例很有用。
你可以在运行时配置文件 ~/.config/shell_gpt/.sgptrc 中设置一些参数:
# API 密钥,也可以定义 OPENAI_API_KEY 环境变量。
OPENAI_API_KEY=your_api_key
# 后端服务器的基本 URL。如果为 "default",URL 将根据 --model 解析。
API_BASE_URL=default
# 每个聊天会话的最大缓存消息量。
CHAT_CACHE_LENGTH=100
# 聊天缓存文件夹。
CHAT_CACHE_PATH=/tmp/shell_gpt/chat_cache
# 请求缓存长度(数量)。
CACHE_LENGTH=100
# 请求缓存文件夹。
CACHE_PATH=/tmp/shell_gpt/cache
# 请求超时时间(秒)。
REQUEST_TIMEOUT=60
# 要使用的默认 OpenAI 模型。
DEFAULT_MODEL=gpt-4o
# Shell 和代码补全的默认颜色。
DEFAULT_COLOR=magenta
# 在 --shell 模式下,无输入时默认为 "Y"。
DEFAULT_EXECUTE_SHELL_CMD=false
# 禁用响应流式传输
DISABLE_STREAMING=false
# 查看 markdown 的 pygment 主题(默认/描述角色)。
CODE_THEME=default
# 包含函数的目录路径。
OPENAI_FUNCTIONS_PATH=/Users/user/.config/shell_gpt/functions
# 当 LLM 使用函数时,打印函数的输出。
SHOW_FUNCTIONS_OUTPUT=false
# 允许 LLM 使用函数。
OPENAI_USE_FUNCTIONS=true
# 强制使用 LiteLLM(用于本地 LLM)。
USE_LITELLM=false
DEFAULT_COLOR 的可能选项:black, red, green, yellow, blue, magenta, cyan, white, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white。
CODE_THEME 的可能选项:https://pygments.org/styles/
╭─ 参数 ──────────────────────────────────────────────────────────────────────────────────────────────────╮
│ prompt [PROMPT] 用于生成补全的提示。 │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ 选项 ──────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --model TEXT 使用的大语言模型。 [默认值: gpt-4o] │
│ --temperature FLOAT RANGE [0.0<=x<=2.0] 生成输出的随机性。 [默认值: 0.0] │
│ --top-p FLOAT RANGE [0.0<=x<=1.0] 限制最高概率的标记(单词)。 [默认值: 1.0] │
│ --md --no-md 美化 markdown 输出。 [默认值: md] │
│ --editor 打开 $EDITOR 以提供提示。 [默认值: no-editor] │
│ --cache 缓存补全结果。 [默认值: cache] │
│ --version 显示版本。 │
│ --help 显示此消息并退出。 │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ 辅助选项 ──────────────────────────────────────────────────────────────────────────────────────────────╮
│ --shell -s 生成并执行 shell 命令。 │
│ --interaction --no-interaction --shell 选项的交互模式。 [默认值: interaction] │
│ --describe-shell -d 描述 shell 命令。 │
│ --code -c 仅生成代码。 │
│ --functions --no-functions 允许函数调用。 [默认值: functions] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ 聊天选项 ──────────────────────────────────────────────────────────────────────────────────────────────╮
│ --chat TEXT 使用 id 进行对话,使用 "temp" 进行快速会话。 [默认值: None] │
│ --repl TEXT 启动 REPL(读取-求值-打印循环)会话。 [默认值: None] │
│ --show-chat TEXT 显示来自提供的聊天 id 的所有消息。 [默认值: None] │
│ --list-chats -lc 列出所有现有的聊天 id。 │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ 角色选项 ──────────────────────────────────────────────────────────────────────────────────────────────╮
│ --role TEXT GPT 模型的系统角色。 [默认值: None] │
│ --create-role TEXT 创建角色。 [默认值: None] │
│ --show-role TEXT 显示角色。 [默认值: None] │
│ --list-roles -lr 列出角色。 │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯
使用 OPENAI_API_KEY 环境变量和用于存储缓存的 docker 卷运行容器。考虑根据你的偏好设置环境变量 OS_NAME 和 SHELL_NAME。
docker run --rm \
--env OPENAI_API_KEY=api_key \
--env OS_NAME=$(uname -s) \
--env SHELL_NAME=$(echo $SHELL) \
--volume gpt-cache:/tmp/shell_gpt \
ghcr.io/ther1d/shell_gpt -s "update my system"
使用别名和 OPENAI_API_KEY 环境变量的对话示例:
alias sgpt="docker run --rm --volume gpt-cache:/tmp/shell_gpt --env OPENAI_API_KEY --env OS_NAME=$(uname -s) --env SHELL_NAME=$(echo $SHELL) ghcr.io/ther1d/shell_gpt"
export OPENAI_API_KEY="your OPENAI API key"
sgpt --chat rainbow "彩虹有哪些颜色"
sgpt --chat rainbow "反转你上次回答的列表"
sgpt --chat rainbow "将你上次的回答翻译成法语"
你也可以使用提供的 Dockerfile 构建自己的镜像:
docker build -t sgpt .
如果你想将请求发送到 Ollama 实例并在 Docker 容器内运行 ShellGPT,你需要调整 Dockerfile 并自行构建容器:需要 litellm 包,并且需要正确设置环境变量。
示例 Dockerfile:
FROM python:3-slim
ENV DEFAULT_MODEL=ollama/mistral:7b-instruct-v0.2-q4_K_M
ENV API_BASE_URL=http://10.10.10.10:11434
ENV USE_LITELLM=true
ENV OPENAI_API_KEY=bad_key
ENV SHELL_INTERACTION=false
ENV PRETTIFY_MARKDOWN=false
ENV OS_NAME="Arch Linux"
ENV SHELL_NAME=auto
WORKDIR /app
COPY . /app
RUN apt-get update && apt-get install -y gcc
RUN pip install --no-cache /app[litellm] && mkdir -p /tmp/shell_gpt
VOLUME /tmp/shell_gpt
ENTRYPOINT ["sgpt"]