-
-
Notifications
You must be signed in to change notification settings - Fork 6.8k
Expand file tree
/
Copy pathinstall.sh
More file actions
executable file
·201 lines (181 loc) · 9.35 KB
/
install.sh
File metadata and controls
executable file
·201 lines (181 loc) · 9.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#!/usr/bin/env bash
# LiteLLM Installer
# Usage: curl -fsSL https://raw.githubusercontent.com/BerriAI/litellm/main/scripts/install.sh | sh
#
# NOTE: set -e without pipefail for POSIX sh compatibility (dash on Ubuntu/Debian
# ignores the shebang when invoked as `sh` and does not support `pipefail`).
set -eu
MIN_PYTHON_MAJOR=3
MIN_PYTHON_MINOR=9
# NOTE: before merging, this must stay as "litellm[proxy]" to install from PyPI.
LITELLM_PACKAGE="litellm[proxy]"
# ── colours ────────────────────────────────────────────────────────────────
if [ -t 1 ]; then
BOLD='\033[1m'
GREEN='\033[38;2;78;186;101m'
GREY='\033[38;2;153;153;153m'
YELLOW='\033[33m'
RESET='\033[0m'
else
BOLD='' GREEN='' GREY='' YELLOW='' RESET=''
fi
info() { printf "${GREY} %s${RESET}\n" "$*"; }
warn() { printf "${YELLOW} Warning: %s${RESET}\n" "$*" >&2; }
success() { printf "${GREEN} ✔ %s${RESET}\n" "$*"; }
header() { printf "${BOLD} %s${RESET}\n" "$*"; }
die() { printf "\n Error: %s\n\n" "$*" >&2; exit 1; }
# ── banner ─────────────────────────────────────────────────────────────────
echo ""
cat << 'EOF'
██╗ ██╗████████╗███████╗██╗ ██╗ ███╗ ███╗
██║ ██║╚══██╔══╝██╔════╝██║ ██║ ████╗ ████║
██║ ██║ ██║ █████╗ ██║ ██║ ██╔████╔██║
██║ ██║ ██║ ██╔══╝ ██║ ██║ ██║╚██╔╝██║
███████╗██║ ██║ ███████╗███████╗███████╗██║ ╚═╝ ██║
╚══════╝╚═╝ ╚═╝ ╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝
EOF
printf " ${BOLD}LiteLLM Installer${RESET} ${GREY}— unified gateway for 100+ LLM providers${RESET}\n\n"
# ── OS detection ───────────────────────────────────────────────────────────
OS="$(uname -s)"
ARCH="$(uname -m)"
case "$OS" in
Darwin) PLATFORM="macOS ($ARCH)" ;;
Linux) PLATFORM="Linux ($ARCH)" ;;
*) die "Unsupported OS: $OS. LiteLLM supports macOS and Linux." ;;
esac
info "Platform: $PLATFORM"
# ── Python detection ───────────────────────────────────────────────────────
PYTHON_BIN=""
for candidate in python3 python; do
if command -v "$candidate" >/dev/null 2>&1; then
major="$("$candidate" -c 'import sys; print(sys.version_info.major)' 2>/dev/null || true)"
minor="$("$candidate" -c 'import sys; print(sys.version_info.minor)' 2>/dev/null || true)"
if [ "${major:-0}" -ge "$MIN_PYTHON_MAJOR" ] && [ "${minor:-0}" -ge "$MIN_PYTHON_MINOR" ]; then
PYTHON_BIN="$(command -v "$candidate")"
info "Python: $("$candidate" --version 2>&1)"
break
fi
fi
done
if [ -z "$PYTHON_BIN" ]; then
die "Python ${MIN_PYTHON_MAJOR}.${MIN_PYTHON_MINOR}+ is required but not found.
Install it from https://python.org/downloads or via your package manager:
macOS: brew install python@3
Ubuntu: sudo apt install python3 python3-pip"
fi
# ── install ────────────────────────────────────────────────────────────────
# Prefer pipx or venv to avoid PEP 668 "externally-managed-environment" on
# Homebrew/ system Python. Neither strategy requires system pip — pipx
# manages its own venvs and the venv strategy uses Python's built-in
# ensurepip, so there is no unconditional pip gate here.
echo ""
header "Installing litellm[proxy]…"
echo ""
LITELLM_BIN=""
# Strategy 1: pipx (best for CLI apps, per PEP 668)
# Try upgrade first to preserve existing flags (e.g. --include-deps); fall
# back to a fresh install if the package is not yet managed by pipx.
if command -v pipx >/dev/null 2>&1; then
info "Using pipx (isolated install)"
if pipx upgrade litellm 2>/dev/null; then
# Ensure proxy extras are present (may be absent if originally installed
# as bare "litellm" without [proxy]). `pipx inject` has been available
# since pipx 0.12.3 (~2019) and records injected deps in pipx metadata so
# upgrades stay consistent; the `runpip` subcommand is newer (0.15.x) and would fail
# on older pipx.
if ! _inject_err="$(pipx inject litellm "${LITELLM_PACKAGE}" 2>&1)"; then
warn "could not inject proxy extras (proxy features may fail until manually fixed)."
printf '%s\n' "$_inject_err" >&2
fi
unset _inject_err 2>/dev/null || true
_pipx_upgraded=1
elif pipx install "${LITELLM_PACKAGE}"; then
_pipx_upgraded=1
fi
if [ "${_pipx_upgraded:-0}" = "1" ]; then
_pipx_bin_dir="${PIPX_BIN_DIR:-${HOME}/.local/bin}"
_pipx_home="${PIPX_HOME:-${HOME}/.local/share/pipx}"
for try in \
"${_pipx_bin_dir}/litellm" \
"${_pipx_home}/venvs/litellm/bin/litellm"; do
if [ -n "$try" ] && [ -x "$try" ]; then
LITELLM_BIN="$try"
break
fi
done
if [ -z "$LITELLM_BIN" ] && command -v litellm >/dev/null 2>&1; then
LITELLM_BIN="$(command -v litellm)"
fi
if [ -z "$LITELLM_BIN" ]; then
warn "pipx install/upgrade succeeded but the litellm binary was not found at expected locations (PIPX_BIN_DIR=${_pipx_bin_dir}, PIPX_HOME=${_pipx_home}) and not on PATH."
warn "Falling back to a dedicated venv — you may still have a pipx-managed copy elsewhere; check: pipx list"
fi
else
warn "pipx install failed (see above), falling back to venv"
fi
fi
# Strategy 2: venv in ~/.litellm (avoids PEP 668 externally-managed-environment)
if [ -z "$LITELLM_BIN" ]; then
LITELLM_VENV="${LITELLM_VENV:-${HOME}/.litellm/venv}"
info "Using isolated venv: $LITELLM_VENV"
mkdir -p "$(dirname "$LITELLM_VENV")"
# Preserve an existing venv on repeat runs; use LITELLM_FORCE_VENV_RECREATE=1 to wipe it.
if [ "${LITELLM_FORCE_VENV_RECREATE:-0}" = "1" ]; then
"$PYTHON_BIN" -m venv --clear "$LITELLM_VENV" \
|| die "Failed to recreate venv. Try: $PYTHON_BIN -m venv --clear $LITELLM_VENV
On Ubuntu/Debian you may first need: sudo apt install python3-venv"
elif [ ! -d "$LITELLM_VENV" ]; then
"$PYTHON_BIN" -m venv "$LITELLM_VENV" \
|| die "Failed to create venv. Try: $PYTHON_BIN -m venv $LITELLM_VENV
On Ubuntu/Debian you may first need: sudo apt install python3-venv"
elif [ ! -x "${LITELLM_VENV}/bin/python" ]; then
info "Existing venv at ${LITELLM_VENV} is incomplete; recreating"
"$PYTHON_BIN" -m venv --clear "$LITELLM_VENV" \
|| die "Failed to recreate venv. Try: $PYTHON_BIN -m venv --clear $LITELLM_VENV
On Ubuntu/Debian you may first need: sudo apt install python3-venv"
fi
"${LITELLM_VENV}/bin/pip" install -q --upgrade pip \
|| die "Failed to upgrade pip in venv. Try: ${LITELLM_VENV}/bin/pip install --upgrade pip"
"${LITELLM_VENV}/bin/pip" install --upgrade "${LITELLM_PACKAGE}" \
|| die "pip install failed. Try manually: ${LITELLM_VENV}/bin/pip install '${LITELLM_PACKAGE}'"
LITELLM_BIN="${LITELLM_VENV}/bin/litellm"
fi
if [ ! -x "$LITELLM_BIN" ]; then
die "litellm binary not found. Try: pipx install '${LITELLM_PACKAGE}' or use a venv."
fi
# ── success banner ─────────────────────────────────────────────────────────
echo ""
success "LiteLLM installed"
installed_ver="$("$LITELLM_BIN" --version 2>&1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1 || true)"
[ -n "$installed_ver" ] && info "Version: $installed_ver"
# ── PATH hint ──────────────────────────────────────────────────────────────
if ! command -v litellm >/dev/null 2>&1; then
LITELLM_DIR="$(dirname "$LITELLM_BIN")"
info "Note: add litellm to your PATH: export PATH=\"\$PATH:${LITELLM_DIR}\""
fi
# ── launch setup wizard ────────────────────────────────────────────────────
echo ""
printf " ${BOLD}Run the interactive setup wizard?${RESET} ${GREY}(Y/n)${RESET}: "
# /dev/tty may be unavailable in Docker/CI — default to yes if it can't be read
answer=""
if [ -r /dev/tty ]; then
read -r answer </dev/tty || answer=""
fi
if [ -z "$answer" ] || [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
echo ""
# Use /dev/tty for interactive input when available (stdin is a pipe from curl)
if [ -r /dev/tty ]; then
exec "$LITELLM_BIN" --setup </dev/tty
else
exec "$LITELLM_BIN" --setup
fi
else
echo ""
header "Quick start:"
echo ""
info " litellm --setup # interactive wizard"
info " litellm --model gpt-4o # single-model quickstart"
echo ""
info "Docs: https://docs.litellm.ai"
echo ""
fi