by TheR1D (community) Windows, macOS, Linux — bash, zsh, fish
CLI-инструмент для повышения продуктивности в терминале с помощью AI. Умеет объяснять, генерировать и выполнять shell-команды прямо в текущей оболочке. Возможности: - --shell (-s): генерация и выполнение shell-команд - --code (-c): генерация кода - --execute (-e): выполнить предложенную команду после подтверждения - Роли: --role (создать и использовать кастомные роли) - REPL-режим: --repl - Поддержка OpenAI, Anthropic, Ollama - Интеграция с bash/zsh: Ctrl+L для быстрого вызова
# pip: pip install shell-gpt # Настройка ключа: sgpt --install-integration # добавит Ctrl+L в .bashrc/.zshrc # Использование: sgpt "найди все файлы больше 1GB в /home" sgpt --shell "перезапустить nginx" sgpt --code "парсер CSV на Python" # Ollama (без API ключа): sgpt --model ollama/llama3 "привет"
Инструмент для повышения продуктивности в командной строке, основанный на больших языковых моделях (LLM). Этот инструмент командной строки предлагает упрощённую генерацию команд shell, фрагментов кода, документации, устраняя необходимость во внешних ресурсах (таких как поиск в Google). Поддерживает Linux, macOS, Windows и совместим со всеми основными оболочками, такими как PowerShell, CMD, Bash, Zsh и др.
https://github.com/TheR1D/shell_gpt/assets/16740832/721ddb19-97e7-428f-a0ee-107d027ddd59
pip install shell-gpt
По умолчанию ShellGPT использует API OpenAI и модель GPT-4. Вам понадобится API-ключ, его можно сгенерировать здесь. Вам будет предложено ввести ключ, который затем будет сохранён в ~/.config/shell_gpt/.sgptrc. API OpenAI не является бесплатным, пожалуйста, обратитесь к тарифам OpenAI для получения дополнительной информации.
[!TIP] Альтернативно, вы можете запускать открытые модели локально бесплатно. Для этого потребуется настроить собственный бэкенд LLM, такой как Ollama. Чтобы заставить ShellGPT работать с Ollama, следуйте этому подробному руководству
❗️Обратите внимание, что ShellGPT не оптимизирован для локальных моделей и может работать не так, как ожидалось.
ShellGPT предназначен для быстрого анализа и извлечения информации. Он полезен для прямых запросов, начиная от технических конфигураций и заканчивая общими знаниями.
sgpt "What is the fibonacci sequence"
# -> The Fibonacci sequence is a series of numbers where each number ...
ShellGPT принимает запрос как из stdin, так и через аргументы командной строки. Независимо от того, предпочитаете ли вы передавать ввод через терминал или указывать его непосредственно в качестве аргументов, sgpt вас поддержит. Например, вы можете легко сгенерировать сообщение коммита git на основе диффов:
git diff | sgpt "Generate git commit message, for my changes"
# -> Added main feature details into README.md
Вы можете анализировать журналы из различных источников, передавая их через stdin вместе с запросом. Например, мы можем использовать его для быстрого анализа журналов, выявления ошибок и получения предложений по возможным решениям:
docker logs -n 20 my_app | sgpt "check logs, find errors, provide possible solutions"
Error Detected: Connection timeout at line 7.
Possible Solution: Check network connectivity and firewall settings.
Error Detected: Memory allocation failed at line 12.
Possible Solution: Consider increasing memory allocation or optimizing application memory usage.
Вы также можете использовать все виды операторов перенаправления для передачи ввода:
sgpt "summarise" < document.txt
# -> The document discusses the impact...
sgpt << EOF
What is the best way to lear Golang?
Provide simple hello world example.
EOF
# -> The best way to learn Golang...
sgpt <<< "What is the best way to learn shell redirects?"
# -> The best way to learn shell redirects is through...
Вы когда-нибудь забывали распространённые команды shell, такие как find, и искали синтаксис в интернете? С опцией --shell или сокращением -s вы можете быстро сгенерировать и выполнить нужные вам команды прямо в терминале.
sgpt --shell "find all json files in current folder"
# -> find . -type f -name "*.json"
# -> [E]xecute, [D]escribe, [A]bort: e
Shell GPT знает об ОС и $SHELL, которые вы используете, и предоставит команду shell для конкретной вашей системы. Например, если вы попросите sgpt обновить вашу систему, он вернёт команду на основе вашей ОС. Вот пример для macOS:
sgpt -s "update my system"
# -> sudo softwareupdate -i -a
# -> [E]xecute, [D]escribe, [A]bort: e
Тот же самый запрос, использованный в Ubuntu, сгенерирует другое предложение:
sgpt -s "update my system"
# -> sudo apt update && sudo apt upgrade -y
# -> [E]xecute, [D]escribe, [A]bort: e
Попробуем это с Docker:
sgpt -s "start nginx container, mount ./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 combine $(ls -m) into one video file without audio."
# -> 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. Это отключит интерактивный режим и выведет сгенерированную команду в stdout. В этом примере мы используем pbcopy, чтобы скопировать сгенерированную команду в буфер обмена:
sgpt -s "find all json files in current folder" --no-interaction | pbcopy
Это очень удобная функция, которая позволяет использовать дополнения sgpt для оболочки прямо в вашем терминале, без необходимости вводить sgpt с запросом и аргументами. Интеграция с оболочкой позволяет использовать ShellGPT с горячими клавишами в вашем терминале, поддерживается как оболочками Bash, так и ZSH. Эта функция вставляет дополнения sgpt непосредственно в буфер терминала (строку ввода), что позволяет немедленно редактировать предложенные команды.
https://github.com/TheR1D/shell_gpt/assets/16740832/bead0dab-0dd9-436d-88b7-6abfb2c556c1
Чтобы установить интеграцию с оболочкой, выполните sgpt --install-integration и перезапустите терминал для применения изменений. Это добавит несколько строк в ваш файл .bashrc или .zshrc. После этого вы можете использовать Ctrl+l (по умолчанию) для вызова ShellGPT. Когда вы нажимаете Ctrl+l, он заменит вашу текущую строку ввода (буфер) предложенной командой. Вы можете затем отредактировать её и просто нажать Enter для выполнения.
Используя параметр --code или -c, вы можете запросить только чистый код, например:
sgpt --code "solve fizz buzz problem using python"
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 "solve classic fizz buzz problem using Python" > fizz_buzz.py
python fizz_buzz.py
# 1
# 2
# Fizz
# 4
# Buzz
# ...
Мы также можем использовать конвейеры для передачи ввода:
cat fizz_buzz.py | sgpt --code "Generate comments for each line of my code"
# Loop through numbers 1 to 100
for i in range(1, 101):
# Check if number is divisible by both 3 and 5
if i % 3 == 0 and i % 5 == 0:
# Print "FizzBuzz" if number is divisible by both 3 and 5
print("FizzBuzz")
# Check if number is divisible by 3
elif i % 3 == 0:
# Print "Fizz" if number is divisible by 3
print("Fizz")
# Check if number is divisible by 5
elif i % 5 == 0:
# Print "Buzz" if number is divisible by 5
print("Buzz")
# If number is not divisible by 3 or 5, print the number itself
else:
print(i)
Часто важно сохранять и вспоминать разговор. sgpt создает диалог при каждом запрошенном дополнении LLM. Диалог может развиваться поочередно (режим чата) или интерактивно, в цикле REPL (режим REPL). Оба способа основаны на одном и том же базовом объекте, называемом сессией чата. Сессия находится по настраиваемому CHAT_CACHE_PATH.
Чтобы начать разговор, используйте опцию --chat с уникальным именем сессии и запросом.
sgpt --chat conversation_1 "please remember my favorite number: 4"
# -> I will remember that your favorite number is 4.
sgpt --chat conversation_1 "what would be my favorite number + 4?"
# -> Your favorite number is 4, so if we add 4 to it, the result would be 8.
Вы можете использовать сессии чата для итеративного улучшения предложений GPT, предоставляя дополнительные детали. Можно использовать опции --code или --shell для инициализации --chat:
sgpt --chat conversation_2 --code "make a request to localhost using python"
import requests
response = requests.get('http://localhost')
print(response.text)
Давайте попросим LLM добавить кэширование в наш запрос:
sgpt --chat conversation_2 --code "add caching"
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 "what is in current folder"
# -> ls
sgpt --chat conversation_3 "Sort by name"
# -> ls | sort
sgpt --chat conversation_3 "Concatenate them using FFMPEG"
# -> ffmpeg -i "concat:$(ls | sort | tr '\n' '|')" -codec copy output.mp4
sgpt --chat conversation_3 "Convert the resulting file into an 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: please remember my favorite number: 4
# assistant: I will remember that your favorite number is 4.
# user: what would be my favorite number + 4?
# assistant: Your favorite number is 4, so if we add 4 to it, the result would be 8.
Существует очень удобный режим REPL (read–eval–print loop, цикл "чтение-вычисление-печать"), который позволяет интерактивно общаться с моделями GPT. Чтобы начать сессию чата в режиме REPL, используйте опцию --repl с уникальным именем сессии. Вы также можете использовать "temp" в качестве имени сессии для запуска временной сессии REPL. Обратите внимание, что --chat и --repl используют один и тот же базовый объект, поэтому вы можете начать сессию чата с помощью --chat, а затем продолжить разговор в режиме REPL с помощью --repl.

sgpt --repl temp
Entering REPL mode, press Ctrl+C to exit.
>>> What is REPL?
REPL stands for Read-Eval-Print Loop. It is a programming environment ...
>>> How can I use Python with REPL?
To use Python with REPL, you can simply open a terminal or command prompt ...
Режим REPL может работать с опциями --shell и --code, что делает его очень удобным для интерактивных команд shell и генерации кода:
sgpt --repl temp --shell
Entering shell REPL mode, type [e] to execute commands or press Ctrl+C to exit.
>>> What is in current folder?
ls
>>> Show file sizes
ls -lh
>>> Sort them by file sizes
ls -lhS
>>> e (enter just e to execute commands, or d to describe them)
Чтобы ввести многострочный запрос, используйте тройные кавычки """:
sgpt --repl temp
Entering REPL mode, press Ctrl+C to exit.
>>> """
... Explain following code:
... import random
... print(random.randint(1, 10))
... """
It is a Python script that uses the random module to generate and print a random integer.
Вы также можете войти в режим REPL с начальным запросом, передав его как аргумент или через stdin, или даже и то, и другое:
sgpt --repl temp < my_app.py
Entering REPL mode, press Ctrl+C to exit.
──────────────────────────────────── Input ────────────────────────────────────
name = input("What is your name?")
print(f"Hello {name}")
───────────────────────────────────────────────────────────────────────────────
>>> What is this code about?
The snippet of code you've provided is written in Python. It prompts the user...
>>> Follow up questions...
Вызовы функций — это мощная функция, которую предоставляет OpenAI. Она позволяет LLM выполнять функции в вашей системе, которые могут использоваться для решения различных задач. Чтобы установить функции по умолчанию, выполните:
sgpt --install-functions
ShellGPT предлагает удобный способ определения и использования функций. Чтобы создать свою пользовательскую функцию, перейдите в ~/.config/shell_gpt/functions и создайте новый .py файл с именем функции. Внутри этого файла вы можете определить свою функцию, используя этот пример.
Документирующий комментарий внутри класса будет передан в API OpenAI как описание функции, вместе с атрибутом title и описаниями параметров. Функция execute будет вызвана, если LLM решит использовать вашу функцию. В этом случае мы разрешаем LLM выполнять любые команды Shell в нашей системе. Поскольку мы возвращаем вывод команды, LLM сможет проанализировать его и решить, хорошо ли он подходит для запроса. Вот пример того, как функция может быть выполнена LLM:
sgpt "What are the files in /tmp folder?"
# -> @FunctionCall execute_shell_command(shell_command="ls /tmp")
# -> The /tmp folder contains the following files and directories:
# -> test.txt
# -> test.json
Обратите внимание, что если по какой-либо причине функция (execute_shell_command) вернёт ошибку, LLM может попытаться выполнить задачу на основе вывода. Допустим, у нас не установлен jq в системе, и мы просим LLM распарсить JSON-файл:
sgpt "parse /tmp/test.json file using jq and return only email value"
# -> @FunctionCall execute_shell_command(shell_command="jq -r '.email' /tmp/test.json")
# -> It appears that jq is not installed on the system. Let me try to install it using brew.
# -> @FunctionCall execute_shell_command(shell_command="brew install jq")
# -> jq has been successfully installed. Let me try to parse the file again.
# -> @FunctionCall execute_shell_command(shell_command="jq -r '.email' /tmp/test.json")
# -> The email value in /tmp/test.json is johndoe@example.
Также возможно объединить несколько вызовов функций в одном запросе:
sgpt "Play music and open hacker news"
# -> @FunctionCall play_music()
# -> @FunctionCall open_url(url="https://news.ycombinator.com")
# -> Music is now playing, and Hacker News has been opened in your browser. Enjoy!
Это лишь простой пример того, как вы можете использовать вызовы функций. Это действительно мощная функция, которая может использоваться для выполнения различных сложных задач. У нас есть специальная категория в GitHub Discussions для обсуждения и обмена функциями. LLM может выполнять деструктивные команды, поэтому пожалуйста, используйте её на свой страх и риск❗️
ShellGPT позволяет создавать пользовательские роли, которые могут использоваться для генерации кода, команд shell или для выполнения ваших конкретных задач. Чтобы создать новую роль, используйте опцию --create-role с именем роли. Вам будет предложено ввести описание для роли и другие детали. Это создаст JSON-файл в ~/.config/shell_gpt/roles с именем роли. В этом каталоге вы также можете редактировать роли sgpt по умолчанию, такие как shell, code и default. Используйте опцию --list-roles для вывода списка всех доступных ролей и опцию --show-role для отображения деталей конкретной роли. Вот пример пользовательской роли:
sgpt --create-role json_generator
# Enter role description: Provide only valid json as response.
sgpt --role json_generator "random: user, password, email, address"
{
"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 к API OpenAI:
sgpt "what are the colors of a rainbow"
# -> The colors of a rainbow are red, orange, yellow, green, blue, indigo, and violet.
В следующий раз тот же самый запрос получит результаты из локального кэша мгновенно. Обратите внимание, что sgpt "what are the colors of a rainbow" --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-5.4-mini
# Цвет по умолчанию для дополнений shell и кода.
DEFAULT_COLOR=magenta
# В режиме --shell по умолчанию "Y" для отсутствия ввода.
DEFAULT_EXECUTE_SHELL_CMD=false
# Отключить потоковую передачу ответов
DISABLE_STREAMING=false
# Тема pygment для просмотра markdown (роль по умолчанию/описание).
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/
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────╮
│ prompt [PROMPT] The prompt to generate completions for. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --model TEXT Large language model to use. [default: gpt-5.4-mini] │
│ --temperature FLOAT RANGE [0.0<=x<=2.0] Randomness of generated output. [default: 0.0] │
│ --top-p FLOAT RANGE [0.0<=x<=1.0] Limits highest probable tokens (words). [default: 1.0] │
│ --md --no-md Prettify markdown output. [default: md] │
│ --editor Open $EDITOR to provide a prompt. [default: no-editor] │
│ --cache Cache completion results. [default: cache] │
│ --version Show version. │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Assistance Options ─────────────────────────────────────────────────────────────────────────────────────╮
│ --shell -s Generate and execute shell commands. │
│ --interaction --no-interaction Interactive mode for --shell option. [default: interaction] │
│ --describe-shell -d Describe a shell command. │
│ --code -c Generate only code. │
│ --functions --no-functions Allow function calls. [default: functions] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Chat Options ───────────────────────────────────────────────────────────────────────────────────────────╮
│ --chat TEXT Follow conversation with id, use "temp" for quick session. [default: None] │
│ --repl TEXT Start a REPL (Read–eval–print loop) session. [default: None] │
│ --show-chat TEXT Show all messages from provided chat id. [default: None] │
│ --list-chats -lc List all existing chat ids. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Role Options ───────────────────────────────────────────────────────────────────────────────────────────╮
│ --role TEXT System role for GPT model. [default: None] │
│ --create-role TEXT Create role. [default: None] │
│ --show-role TEXT Show role. [default: None] │
│ --list-roles -lr List roles. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Запустите контейнер, используя переменную окружения 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 "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"
Вы также можете использовать предоставленный Dockerfile для сборки собственного образа:
docker build -t sgpt .