[软件服务] shell-gpt 在终端里使用ChatGPT
Summary安装过程使用shell 集成REPL 模式角色 roleconfig ~/.config/shell_gpt/.sgptrcDockerDocker + OllamaDockerfile截图
Summary
- 命令行工具提供了对 shell 命令、代码片段、文档 的简化生成,消除了对外部资源(如 Google 搜索)的需求。支持 Linux、macOS、Windows,并与 PowerShell、CMD、Bash、Zsh 等主要 Shell 兼容
- ‣
安装过程
# (optional) 如果在虚拟环境中
cd ~/qhd/__qh_tmp/data/shell-gpt
python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
# exit virt env
deactivate
pip install shell-gpt
# verify
sgpt --help
# 您需要一个 API 密钥,您可以在这里 生成一个。您将被要求输入您的密钥,然后它将被存储在
# ~/.config/shell_gpt/.sgptrc
使用
# 正常
sgpt "什么是斐波那契数列"
git diff | sgpt "为我的更改生成 git 提交消息"
# -> 将主要功能详细信息添加到 README.md 中
# 可以通过使用 tdin 传递来自各种来源的日志,以及一个提示来分析日志。例如,我们可以使用它快速分析日志,识别错误并获得可能的解决方案建议:
docker logs -n 20 my_app | sgpt "检查日志,查找错误,提供可能的解决方案"
# 使用各种重定向运算符传递输入
sgpt "总结" < document.txt
# -> 该文档讨论了影响...
sgpt << EOF
什么是学习 Golang 的最佳方法?
提供一个简单的 hello world 示例。
EOF
# -> 学习 Golang 的最佳方法是...
sgpt <<< "什么是学习 shell 重定向的最佳方式?"
# -> 学习 shell 重定向的最佳方式是通过...
# 可以快速生成常见的 shell 命令。只需使用--shell或-s选项,即可在终端中生成和执行所需的命令
sgpt --shell "在当前文件夹中查找所有 json 文件"
# -> find . -type f -name "*.json"
# -> [E]xecute, [D]escribe, [A]bort: e
sgpt -s "更新我的系统"
# -> sudo softwareupdate -i -a
# -> [E]xecute, [D]escribe, [A]bort: e
# 可以使用管道将输入传递给sgpt并生成 shell 命令
sgpt -s "使用以下数据在 localhost 上进行 POST 请求" < 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 "使用 $(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选项。这将禁用交互模式,并将生成的命令打印到 tdout。在此示例中,我们使用pbcopy将生成的命令复制到剪贴板
sgpt -s "在当前文件夹中查找所有 json 文件" --no-interaction | pbcopy
# 生成代码 -c 或者 --code
sgpt --code "使用 Python 解决 Fizz Buzz 问题"
cat fizz_buzz.py | sgpt --code "为我的代码的每一行生成注释"
### 聊天模式
sgpt --list-chats
sgpt --show-chat conversation_1
# user: 请记住我的最喜欢的数字:4
# assistant: 我将记住你最喜欢的数字是 4。
# user: 我的最喜欢的数字加上 4 会是多少?
# assistant: 你最喜欢的数字是 4,所以如果我们加上 4,结果将是 8。
# .../shell_gpt/chat_cache/conversation_1
# .../shell_gpt/chat_cache/conversation_2
sgpt --chat conversation_1 "请记住我的最喜欢的数字:4"
# -> 我将记住你最喜欢的数字是 4。
sgpt --chat conversation_1 "我的最喜欢的数字加上 4 会是多少?"
# -> 你最喜欢的数字是 4,所以如果我们加上 4,结果将是 8。
sgpt --chat conversation_2 --code "使用 Python 向 localhost 发送请求"
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
shell 集成
# 要安装 Shell 集成,运行
sgpt --install-integration
# 并重新启动终端以应用更改。这将在您的 .bashrc 或 .zshrc 文件中添加几行代码。之后,您可以使用
# Ctrl+l
#(默认情况下)来调用 ShellGPT。按下 Ctrl+l 后,
# 它将用建议的命令替换当前的输入行(缓冲区)。您可以编辑它,然后按下 Enter 来执行命令。
REPL 模式
# REPL(读取 - 求值 - 打印循环)模式,它允许您与 GPT 模型进行交互式聊天
sgpt --repl temp
进入 REPL 模式,按 Ctrl+C 退出。
>>> 什么是 REPL?
REPL 代表读取 - 求值 - 打印循环。它是一个编程环境...
>>> 如何在 REPL 中使用 Python?
要在 REPL 中使用 Python,您可以简单地打开终端或命令提示符...
# REPL 模式可以与 --shell 和 --code 选项一起使用,非常方便进行交互式的 shell 命令和代码生成:
sgpt --repl temp --shell
进入 shell REPL 模式,输入 [e] 执行命令,或按 Ctrl+C 退出。
>>> 当前文件夹中有什么?
ls
>>> 显示文件大小
ls -lh
>>> 按文件大小排序它们
ls -lhS
>>> e(仅输入 e 执行命令,或输入 d 进行描述)
角色 role
# ShellGPT 允许你创建自定义角色,用于生成代码、shell 命令或满足你的特定需求。要创建新角色,使用--create-role选项后跟角色名称。你将被要求提供角色的描述以及其他细节。这将在~/.config/shell_gpt/roles目录下创建一个以角色名称命名的 JSON 文件。在这个目录中,你还可以编辑默认的sgpt角色,如 shell、code 和 default。使用--list-roles选项列出所有可用角色,使用--show-role选项显示特定角色的详细信息。下面是一个自定义角色的示例
sgpt --create-role jap
sgpt --show-role
sgpt --list-roles
sgpt --role jap "晚上去哪里吃"
config ~/.config/shell_gpt/.sgptrc
# API 密钥,也可以使用 OPENAI_API_KEY 环境变量定义。
OPENAI_API_KEY=your_api_key
# 后端服务器的基本 URL。如果为"default",将根据 --model 解析 URL。
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-3.5-turbo
# shell 和 code 完成的默认颜色。
DEFAULT_COLOR=magenta
# 当处于 --shell 模式时,默认为不输入。
DEFAULT_EXECUTE_SHELL_CMD=false
# 禁用响应的流式传输
DISABLE_STREAMING=false
# 用于查看 Markdown 的 pygment 主题(默认 / 描述角色)。
CODE_THEME=default
# 包含函数的目录路径。
OPENAI_FUNCTIONS_PATH=/Users/user/.config/shell_gpt/functions
# 使用函数时打印函数的输出。
SHOW_FUNCTIONS_OUTPUT=false
# 允许 LLM 使用函数。
OPENAI_USE_FUNCTIONS=true
# 强制使用 LiteLLM(用于本地 LLM)。
USE_LITELLM=false
Docker
docker run --rm \
--env OPENAI_API_KEY="你的 OPENAI API 密钥" \
--volume gpt-cache:/tmp/shell_gpt \
ghcr.io/ther1d/shell_gpt --chat rainbow "what are the colors of a rainbow"
alias sgpt="docker run --rm --env OPENAI_API_KEY --volume gpt-cache:/tmp/shell_gpt ghcr.io/ther1d/shell_gpt"
export OPENAI_API_KEY="你的 OPENAI API 密钥"
sgpt --chat rainbow "what are the colors of a rainbow"
sgpt --chat rainbow "inverse the list of your last answer"
sgpt --chat rainbow "translate your last answer in french"
Docker + Ollama
git clone https://github.com/TheR1D/shell_gpt
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"]