Alat produktivitas baris perintah yang ditenagai oleh AI Model Bahasa Besar (LLM). Alat baris perintah ini menawarkan generasi yang disederhanakan dari perintah shell, cuplikan kode, dokumentasi , menghilangkan kebutuhan akan sumber daya eksternal (seperti pencarian Google). Mendukung Linux, MacOS, Windows dan kompatibel dengan semua cangkang utama seperti PowerShell, CMD, Bash, Zsh, dll.
pip install shell-gpt
Secara default, Shellgpt menggunakan model API dan GPT-4 Openai. Anda akan memerlukan kunci API, Anda dapat menghasilkannya di sini. Anda akan diminta untuk kunci Anda yang kemudian akan disimpan di ~/.config/shell_gpt/.sgptrc
. API OpenAI tidak gratis, silakan merujuk ke harga Openai untuk informasi lebih lanjut.
Tip
Atau, Anda dapat menggunakan model open source yang di -host secara lokal yang tersedia secara gratis. Untuk menggunakan model lokal, Anda harus menjalankan server backend LLM Anda sendiri seperti Ollama. Untuk mengatur shellgpt dengan ollama, silakan ikuti panduan komprehensif ini.
❗️Note bahwa Shellgpt tidak dioptimalkan untuk model lokal dan mungkin tidak berfungsi seperti yang diharapkan.
Shellgpt dirancang untuk menganalisis dan mengambil informasi dengan cepat. Ini berguna untuk permintaan langsung mulai dari konfigurasi teknis hingga pengetahuan umum.
sgpt " What is the fibonacci sequence "
# -> The Fibonacci sequence is a series of numbers where each number ...
Shellgpt menerima Prompt dari Argumen Line Stdin dan Command Line. Apakah Anda lebih suka input perpipaan melalui terminal atau menentukannya secara langsung sebagai argumen, sgpt
membuat Anda tertutup. Misalnya, Anda dapat dengan mudah menghasilkan pesan Git Commit berdasarkan diff:
git diff | sgpt " Generate git commit message, for my changes "
# -> Added main feature details into README.md
Anda dapat menganalisis log dari berbagai sumber dengan melewatinya menggunakan stdin, bersama dengan prompt. Misalnya, kita dapat menggunakannya untuk menganalisis log dengan cepat, mengidentifikasi kesalahan dan mendapatkan saran untuk solusi yang mungkin:
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.
Anda juga dapat menggunakan semua jenis operator pengalihan untuk memberikan input:
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...
Pernahkah Anda menemukan diri Anda melupakan perintah shell umum, seperti find
, dan perlu mencari sintaks secara online? Dengan opsi --shell
atau pintasan -s
, Anda dapat dengan cepat menghasilkan dan menjalankan perintah yang Anda butuhkan di terminal.
sgpt --shell " find all json files in current folder "
# -> find . -type f -name "*.json"
# -> [E]xecute, [D]escribe, [A]bort: e
Shell GPT mengetahui OS dan $SHELL
yang Anda gunakan, itu akan memberikan perintah shell untuk sistem tertentu yang Anda miliki. Misalnya, jika Anda meminta sgpt
untuk memperbarui sistem Anda, itu akan mengembalikan perintah berdasarkan OS Anda. Berikut contoh menggunakan macOS:
sgpt -s " update my system "
# -> sudo softwareupdate -i -a
# -> [E]xecute, [D]escribe, [A]bort: e
Prompt yang sama, saat digunakan pada Ubuntu, akan menghasilkan saran yang berbeda:
sgpt -s " update my system "
# -> sudo apt update && sudo apt upgrade -y
# -> [E]xecute, [D]escribe, [A]bort: e
Mari kita coba dengan 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
Kami masih dapat menggunakan pipa untuk meneruskan input ke sgpt
dan menghasilkan perintah 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
Menerapkan sihir shell tambahan di prompt kami, dalam contoh ini memberikan nama file ke 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
Jika Anda ingin meneruskan perintah shell yang dihasilkan menggunakan pipa, Anda dapat menggunakan opsi --no-interaction
. Ini akan menonaktifkan mode interaktif dan akan mencetak perintah yang dihasilkan ke stdout. Dalam contoh ini kami menggunakan pbcopy
untuk menyalin perintah yang dihasilkan ke clipboard:
sgpt -s " find all json files in current folder " --no-interaction | pbcopy
Ini adalah fitur yang sangat praktis , yang memungkinkan Anda menggunakan penyelesaian shell sgpt
secara langsung di terminal Anda, tanpa perlu mengetik sgpt
dengan prompt dan argumen. Integrasi shell memungkinkan penggunaan shellgpt dengan hotkey di terminal Anda, didukung oleh cangkang bash dan zsh. Fitur ini menempatkan penyelesaian sgpt
langsung ke Buffer Terminal (baris input), memungkinkan untuk pengeditan segera perintah yang disarankan.
Untuk menginstal integrasi shell, jalankan sgpt --install-integration
dan restart terminal Anda untuk menerapkan perubahan. Ini akan menambahkan beberapa baris ke file .bashrc
atau .zshrc
Anda. Setelah itu, Anda dapat menggunakan Ctrl+l
(secara default) untuk meminta shellgpt. Saat Anda menekan Ctrl+l
itu akan menggantikan Anda baris input saat ini (buffer) dengan perintah yang disarankan. Anda kemudian dapat mengeditnya dan cukup tekan Enter
untuk mengeksekusi.
Dengan menggunakan parameter --code
atau -c
, Anda dapat secara khusus meminta output kode murni, misalnya:
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 )
Karena ini adalah kode Python yang valid, kami dapat mengarahkan ulang output ke file:
sgpt --code " solve classic fizz buzz problem using Python " > fizz_buzz.py
python fizz_buzz.py
# 1
# 2
# Fizz
# 4
# Buzz
# ...
Kami juga dapat menggunakan pipa untuk memberikan input:
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 )
Seringkali penting untuk melestarikan dan mengingat percakapan. sgpt
membuat dialog percakapan dengan setiap penyelesaian LLM yang diminta. Dialog dapat mengembangkan satu per satu (mode obrolan) atau secara interaktif, dalam loop repl (mode rept). Kedua cara mengandalkan objek yang mendasari yang sama, yang disebut sesi obrolan. Sesi ini terletak di CHAT_CACHE_PATH
yang dapat dikonfigurasi.
Untuk memulai percakapan, gunakan opsi --chat
diikuti dengan nama sesi yang unik dan prompt.
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.
Anda dapat menggunakan sesi obrolan untuk meningkatkan saran GPT secara iteratif dengan memberikan detail tambahan. Dimungkinkan untuk menggunakan --code
atau --shell
yang lebih baik untuk memulai --chat
:
sgpt --chat conversation_2 --code " make a request to localhost using python "
import requests
response = requests . get ( 'http://localhost' )
print ( response . text )
Mari kita minta LLM untuk menambahkan caching ke permintaan kami:
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 )
Sama berlaku untuk perintah 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
Untuk membuat daftar semua sesi dari salah satu mode percakapan, gunakan opsi --list-chats
atau -lc
:
sgpt --list-chats
# .../shell_gpt/chat_cache/conversation_1
# .../shell_gpt/chat_cache/conversation_2
Untuk menampilkan semua pesan yang terkait dengan percakapan tertentu, gunakan opsi --show-chat
diikuti dengan nama sesi:
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.
Ada mode repl (baca -eval -print loop) yang sangat berguna, yang memungkinkan Anda untuk mengobrol secara interaktif dengan model GPT. Untuk memulai sesi obrolan dalam mode rept, gunakan opsi --repl
diikuti dengan nama sesi yang unik. Anda juga dapat menggunakan "TEMP" sebagai nama sesi untuk memulai sesi rept sementara. Perhatikan bahwa --chat
dan --repl
menggunakan objek mendasar yang sama, sehingga Anda dapat menggunakan --chat
untuk memulai sesi obrolan dan kemudian mengambilnya dengan --repl
untuk melanjutkan percakapan dalam mode 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 ...
Mode REPL dapat bekerja dengan -opsi --shell
dan --code
, yang membuatnya sangat berguna untuk perintah shell interaktif dan pembuatan kode:
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)
Untuk memberikan multiline prompt menggunakan kutipan triple """
:
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.
Anda juga dapat memasukkan mode repl dengan prompt awal dengan meneruskannya sebagai argumen atau stdin atau bahkan keduanya:
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...
Fungsi Panggilan adalah fitur yang kuat yang disediakan OpenAI. Ini memungkinkan LLM untuk menjalankan fungsi dalam sistem Anda, yang dapat digunakan untuk menyelesaikan berbagai tugas. Untuk menginstal fungsi default, jalankan:
sgpt --install-functions
Shellgpt memiliki cara yang nyaman untuk mendefinisikan fungsi dan menggunakannya. Untuk membuat fungsi khusus Anda, navigasikan ke ~/.config/shell_gpt/functions
dan buat file .py baru dengan nama fungsi. Di dalam file ini, Anda dapat menentukan fungsi Anda menggunakan sintaks berikut:
# 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 } "
Komentar docString di dalam kelas akan diteruskan ke OpenAI API sebagai deskripsi untuk fungsi tersebut, bersama dengan deskripsi atribut dan parameter title
. Fungsi execute
akan dipanggil jika LLM memutuskan untuk menggunakan fungsi Anda. Dalam hal ini kami mengizinkan LLM untuk menjalankan perintah shell apa pun dalam sistem kami. Karena kami mengembalikan output perintah, LLM akan dapat menganalisisnya dan memutuskan apakah itu cocok untuk prompt. Berikut adalah contoh bagaimana fungsi dapat dieksekusi oleh 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
Perhatikan bahwa jika karena alasan tertentu fungsi (execute_shell_command) akan mengembalikan kesalahan, LLM mungkin mencoba untuk menyelesaikan tugas berdasarkan output. Katakanlah kami belum menginstal jq
di sistem kami, dan kami meminta LLM untuk parse JSON file:
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.
Dimungkinkan juga untuk rantai beberapa panggilan fungsi di prompt:
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!
Ini hanyalah contoh sederhana tentang bagaimana Anda dapat menggunakan panggilan fungsi. Ini benar -benar fitur yang kuat yang dapat digunakan untuk menyelesaikan berbagai tugas kompleks. Kami memiliki kategori khusus dalam diskusi GitHub untuk berbagi dan mendiskusikan fungsi. LLM mungkin menjalankan perintah destruktif, jadi silakan gunakan dengan risiko Anda sendiri❗️
Shellgpt memungkinkan Anda untuk membuat peran khusus, yang dapat digunakan untuk menghasilkan kode, perintah shell, atau untuk memenuhi kebutuhan spesifik Anda. Untuk membuat peran baru, gunakan opsi --create-role
diikuti oleh nama peran. Anda akan diminta untuk memberikan deskripsi untuk peran tersebut, bersama dengan detail lainnya. Ini akan membuat file JSON di ~/.config/shell_gpt/roles
dengan nama peran. Di dalam direktori ini, Anda juga dapat mengedit peran sgpt
default, seperti shell , kode , dan default . Gunakan opsi --list-roles
untuk mendaftar semua peran yang tersedia, dan opsi --show-role
untuk menampilkan detail peran tertentu. Berikut adalah contoh peran khusus:
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 "
}
}
Jika deskripsi peran berisi kata -kata "Terapkan Markdown" (Sensitif Kasus), maka obrolan akan ditampilkan menggunakan pemformatan Markdown.
Kontrol cache menggunakan --cache
(default) dan --no-cache
opsi. Caching ini berlaku untuk semua permintaan sgpt
ke OpenAI API:
sgpt " what are the colors of a rainbow "
# -> The colors of a rainbow are red, orange, yellow, green, blue, indigo, and violet.
Lain kali, kueri yang sama persis akan mendapatkan hasil dari cache lokal secara instan. Perhatikan bahwa sgpt "what are the colors of a rainbow" --temperature 0.5
akan membuat permintaan baru, karena kami tidak memberikan --temperature
(sama berlaku untuk --top-probability
) pada permintaan sebelumnya.
Ini hanya beberapa contoh dari apa yang dapat kami lakukan dengan menggunakan model OpenAI GPT, saya yakin Anda akan merasa berguna untuk kasus penggunaan spesifik Anda.
Anda dapat mengatur beberapa parameter dalam file konfigurasi runtime ~/.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
Opsi yang mungkin untuk DEFAULT_COLOR
: Hitam, merah, hijau, kuning, biru, magenta, cyan, putih, bright_black, bright_red, bright_green, bright_yellow, bright_blue, bright_magenta, bright_cyan, bright_white. Opsi yang mungkin untuk 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. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Jalankan wadah menggunakan variabel lingkungan OPENAI_API_KEY
, dan volume buruh pelabuhan untuk menyimpan cache. Pertimbangkan untuk mengatur variabel lingkungan OS_NAME
dan SHELL_NAME
sesuai dengan preferensi Anda.
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 "
Contoh percakapan, menggunakan alias dan variabel lingkungan 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 "
Anda juga dapat menggunakan Dockerfile
yang disediakan untuk membangun gambar Anda sendiri:
docker build -t sgpt .
Jika Anda ingin mengirim permintaan Anda ke instance ollama dan menjalankan shellgpt di dalam wadah Docker, Anda perlu menyesuaikan dockerfile dan membangun wadah sendiri: Paket Litellm diperlukan dan variabel Env perlu diatur dengan benar.
Contoh 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"]