Инструмент производительности командной строки, работающий на больших языковых моделях AI (LLM). Этот инструмент командной строки предлагает оптимизированную генерацию команд оболочки, фрагменты кода, документацию , устраняя необходимость в внешних ресурсах (например, поиск Google). Поддерживает Linux, MacOS, Windows и совместимые со всеми основными оболочками, такими как PowerShell, CMD, Bash, ZSH и т. Д.
pip install shell-gpt По умолчанию ShellGPT использует модель API и GPT-4 от OpenAI. Вам понадобится ключ API, вы можете создать один здесь. Вам будет предложено для вашего ключа, который затем будет храниться в ~/.config/shell_gpt/.sgptrc . API OpenAI не является бесплатной, пожалуйста, обратитесь к ценам OpenAI для получения дополнительной информации.
Кончик
В качестве альтернативы вы можете использовать локально размещенные модели с открытым исходным кодом, которые доступны бесплатно. Чтобы использовать локальные модели, вам нужно будет запустить свой собственный сервер 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 на основе Diff:
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... Вы когда -нибудь забыли, что общие команды оболочки, такие как find , и вам нужно искать синтаксис онлайн? С опцией --shell или ortkt -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 и генерировать команды оболочки:
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 Применение дополнительной магии оболочки в нашем подсказке, в этом примере передачи имен файлов в 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 Если вы хотите пройти сгенерированную команду оболочки с помощью трубы, вы можете использовать опцию --no-interaction . Это отключит интерактивный режим и будет печатать сгенерированную команду в Stdout. В этом примере мы используем pbcopy для копирования сгенерированной команды в буфер обмена:
sgpt -s " find all json files in current folder " --no-interaction | pbcopy Это очень удобная функция , которая позволяет вам использовать завершение оболочки sgpt непосредственно в вашем терминале, без необходимости вводить sgpt с помощью приглашения и аргументов. Интеграция оболочки позволяет использовать ShellGPT с горячими классами в вашем терминале, поддерживаемой как оболочками Bash, так и ZSH. Эта функция ставит завершение sgpt непосредственно в терминальный буфер (входная линия), что позволяет немедленно редактировать предлагаемые команды.
Чтобы установить интеграцию оболочки, запустите 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 )То же самое относится и к командам оболочки:
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» в качестве имени сеанса, чтобы запустить временную сеанс реплики. Обратите внимание, что --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 ...
Режим реплики может работать с параметрами --shell и --code , что делает его очень удобным для интерактивных команд оболочки и генерации кода:
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.
Вы также можете ввести режим реплики с начальной подсказкой, передавая его как аргумент или 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 с именем функции. Внутри этого файла вы можете определить свою функцию, используя следующий синтаксис:
# execute_shell_command.py
import subprocess
from pydantic import Field
from instructor import OpenAISchema
class Function ( OpenAISchema ):
"""
Executes a shell command and returns the output (result).
"""
shell_command : str = Field (..., example = "ls -la" , descriptions = "Shell command to execute." )
class Config :
title = "execute_shell_command"
@ classmethod
def execute ( cls , shell_command : str ) -> str :
result = subprocess . run ( shell_command . split (), capture_output = True , text = True )
return f"Exit code: { result . returncode } , Output: n { result . stdout } " Комментарий Docstring внутри класса будет передаваться в API OpenAI в качестве описания для функции, а также описания атрибута title и параметров. Функция execute будет вызвана, если LLM решит использовать вашу функцию. В этом случае мы позволяем LLM выполнять любые команды оболочки в нашей системе. Поскольку мы возвращаем вывод команды, 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 для обмена и обсуждения функций. LLM может выполнить разрушительные команды, поэтому, пожалуйста, используйте их на свой риск
ShellGPT позволяет создавать пользовательские роли, которые можно использовать для создания кода, команд оболочки или для удовлетворения ваших конкретных потребностей. Чтобы создать новую роль, используйте вариант --create-role за которым следует название роли. Вам будет предложено предоставить описание для этой роли, а также другие детали. Это создаст файл json в ~/.config/shell_gpt/roles с именем роли. В этом каталоге вы также можете редактировать роли sgpt по умолчанию, такие как оболочка , код и дефолт . Используйте опцию --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" : " [email protected] " ,
"address" : {
"street" : " 123 Main St " ,
"city" : " Anytown " ,
"state" : " CA " ,
"zip" : " 12345 "
}
}Если описание роли содержит слова «Применить Markdown» (чувствительный к случаю), то чаты будут отображаться с использованием форматирования Markdown.
Кэш управления с использованием параметров --cache (default) и --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 key, also it is possible to define OPENAI_API_KEY env.
OPENAI_API_KEY=your_api_key
# Base URL of the backend server. If "default" URL will be resolved based on --model.
API_BASE_URL=default
# Max amount of cached message per chat session.
CHAT_CACHE_LENGTH=100
# Chat cache folder.
CHAT_CACHE_PATH=/tmp/shell_gpt/chat_cache
# Request cache length (amount).
CACHE_LENGTH=100
# Request cache folder.
CACHE_PATH=/tmp/shell_gpt/cache
# Request timeout in seconds.
REQUEST_TIMEOUT=60
# Default OpenAI model to use.
DEFAULT_MODEL=gpt-4o
# Default color for shell and code completions.
DEFAULT_COLOR=magenta
# When in --shell mode, default to "Y" for no input.
DEFAULT_EXECUTE_SHELL_CMD=false
# Disable streaming of responses
DISABLE_STREAMING=false
# The pygment theme to view markdown (default/describe role).
CODE_THEME=default
# Path to a directory with functions.
OPENAI_FUNCTIONS_PATH=/Users/user/.config/shell_gpt/functions
# Print output of functions when LLM uses them.
SHOW_FUNCTIONS_OUTPUT=false
# Allows LLM to use functions.
OPENAI_USE_FUNCTIONS=true
# Enforce LiteLLM usage (for local LLMs).
USE_LITELLM=false
Возможные параметры для DEFAULT_COLOR : черный, красный, зеленый, желтый, синий, пурпурный, голубой, белый, яркий_блок, 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-4o] │
│ --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 .Если вы хотите отправить свои запросы в экземпляр Ollama и запустить ShellGPT в контейнере Docker, вам необходимо настроить DockerFile и создать контейнер самостоятельно: необходим пакет Litellm, и переменные ENV должны быть установлены правильно.
Пример 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"]