Sebelum kenal LiteLLM, saya sempat pakai 9Router. Buat yang belum tahu, 9Router itu router AI gratis yang nyambungin berbagai tool CLI dan IDE, kayak Cursor, Claude Code, Codex, sampai Copilot, ke puluhan penyedia AI lewat satu endpoint yang kompatibel dengan OpenAI. Fiturnya lumayan, ada fallback otomatis bertingkat biar nggak gampang kena limit, dan masangnya gampang, tinggal npm install -g 9router.
Cuma, makin ke sini saya ngerasa kurang leluasa. Ada beberapa hal yang pengen saya atur dan kontrol sendiri, eh malah mentok. Dari situlah saya mulai nyari yang lebih bebas dan bisa saya self host sepenuhnya. Ketemulah LiteLLM.
Kebutuhannya simpel: saya pengen satu pintu buat manggil berbagai model AI. Bayangin aja, ada OpenAI, ada Anthropic, ada model lokal, dan tiap penyedia punya format API sendiri. Ribet kalau tiap ganti model harus ganti kode. Nah, di sinilah LiteLLM masuk, dan kali ini terasa jauh lebih leluasa.
Apa itu LiteLLM?
Singkatnya, LiteLLM itu gateway atau proxy yang bikin kalian bisa manggil ratusan model AI dari banyak penyedia cuma lewat satu format API, yaitu format yang kompatibel dengan OpenAI. Jadi kode kalian cukup nembak ke satu alamat, dan LiteLLM yang ngurusin nerusin ke penyedia aslinya. Bedanya sama 9Router, LiteLLM ini kalian jalanin dan kelola sendiri, jadi kontrolnya penuh di tangan kalian. Bonusnya, dia punya dashboard buat ngatur model, bikin virtual key, sampai mantau pemakaian dan biaya.
Di tulisan ini saya mau berbagi pengalaman masangnya. Spoiler: ada beberapa jebakan di jalan, tapi ujungnya mulus. Saya bakal fokus ke cara pakai Docker, karena ini yang paling enak dan paling bersih.
Percobaan pertama: lewat pip, dan langsung mentok
Awalnya saya coba cara paling umum, install pakai pip:
pip install 'litellm[proxy]'
Hasilnya? Gagal. Ternyata laptop saya pakai Python 3.14 yang masih kelewat baru. Salah satu dependency LiteLLM, yaitu orjson, butuh dikompilasi dari source pakai Rust, dan komponen Rust itu cuma mendukung sampai Python 3.13. Belum ada paket jadi buat Python 3.14, jadi proses build-nya ambruk di tengah jalan.
Pelajaran pertama: kalau kalian pakai Python yang terlalu baru, bersiap ketemu masalah kompatibilitas dependency. Saya sempat akalin dengan bikin virtualenv pakai Python 3.13, dan itu berhasil. Tapi jujur, ngurusin versi Python, virtualenv, dan dependency native itu repot. Jadi saya putuskan pindah ke cara yang lebih waras.
Pindah ke Docker, jauh lebih enak
Dengan Docker, saya nggak perlu mikirin versi Python di laptop sama sekali. Semua dependency udah dibungkus rapi di dalam image resmi LiteLLM. Cukup satu perintah:
docker run -d -p 4000:4000 --name litellm ghcr.io/berriai/litellm:main-latest
Image resmi itu selesai diunduh, container jalan, dan server langsung nyala di port 4000. Saya cek dan semua endpoint hidup. Buka http://localhost:4000/ui di browser, dashboard muncul. Sampai sini kelihatan gampang banget, tapi tunggu dulu.
Tembok pertama: master key belum diset
Begitu saya coba masuk ke dashboard, muncul pesan ini:
Master Key not set for Proxy. Please set Master Key to use Admin UI.
Wajar sih. Admin UI butuh master key buat ngamanin akses. Tanpa itu, dia nolak. Jadi saya matiin container tadi, lalu jalanin ulang sambil ngasih beberapa environment variable: master key, plus username dan password buat login dashboard.
docker rm -f litellm
docker run -d -p 4000:4000 --name litellm
-e LITELLM_MASTER_KEY="sk-1234"
-e UI_USERNAME="admin"
-e UI_PASSWORD="admin"
ghcr.io/berriai/litellm:main-latest
Pesan master key hilang. Tapi pas saya login pakai admin dan admin, muncul tembok berikutnya.
Tembok kedua: belum nyambung ke database
Pesannya begini:
Authentication Error, Not connected to DB!
Nah, ini akar masalahnya. Login Admin UI butuh database buat nyimpen sesi, user, dan virtual key. Tanpa database, dia nggak bisa kerja. Container yang cuma jalan sendirian tadi memang belum punya database sama sekali.
Solusinya: jalanin LiteLLM bareng Postgres. Cara paling rapi buat ini adalah pakai Docker Compose, biar dua container itu hidup berdampingan dan saling kenal otomatis.
Solusi final: Docker Compose plus Postgres
Saya bikin satu file bernama docker-compose.yml seperti ini:
services:
litellm-db:
image: postgres:16
container_name: litellm-db
restart: unless-stopped
environment:
POSTGRES_DB: litellm
POSTGRES_USER: litellm
POSTGRES_PASSWORD: litellm
volumes:
- litellm_pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U litellm"]
interval: 5s
timeout: 5s
retries: 10
litellm:
image: ghcr.io/berriai/litellm:main-latest
container_name: litellm
restart: unless-stopped
ports:
- "4000:4000"
environment:
LITELLM_MASTER_KEY: "sk-1234"
UI_USERNAME: "admin"
UI_PASSWORD: "admin"
DATABASE_URL: "postgresql://litellm:litellm@litellm-db:5432/litellm"
STORE_MODEL_IN_DB: "True"
depends_on:
litellm-db:
condition: service_healthy
volumes:
litellm_pgdata:
Perhatiin beberapa hal penting di sini. Postgres punya healthcheck, jadi LiteLLM baru ikut nyala setelah database betul betul siap. Lalu ada DATABASE_URL yang nunjuk ke nama service database, bukan ke localhost. Ada juga STORE_MODEL_IN_DB yang nanti saya ceritain di bawah. Dan data Postgres disimpan di volume, jadi aman walaupun container dimatiin.
Tinggal nyalain:
docker compose up -d
LiteLLM langsung jalanin migrasi tabel ke Postgres, dan di log muncul tulisan migrasi sukses plus startup complete. Saya buka lagi dashboard, login pakai admin dan admin, dan kali ini masuk tanpa drama. Pesan soal database udah hilang total.
Tembok ketiga: gagal nambah model dari dashboard
Pas saya coba nambah model langsung dari dashboard, muncul lagi error baru:
Failed to add model: Set ‘STORE_MODEL_IN_DB=True’ in your env to enable this feature.
Ternyata, secara default LiteLLM nggak ngebolehin nyimpen model ke database lewat UI, ini demi keamanan. Biar fiturnya nyala, tinggal tambahin satu environment variable lagi di service litellm, yaitu STORE_MODEL_IN_DB diset jadi True. Makanya di file compose di atas baris itu udah saya sertakan. Habis nambahin, apply ulang:
docker compose up -d
Setelah itu, model yang kalian tambahin dari dashboard bakal kesimpen permanen di Postgres, dan errornya hilang.
Ngecek semuanya beneran jalan
Buat mastiin, saya lirik statusnya:
docker compose ps
docker compose logs -f litellm
Postgres berstatus healthy, LiteLLM nyambung ke database, dan endpoint login balikin kode redirect yang artinya login berhasil. Dashboard hidup penuh. Di dalamnya kalian bisa nambah model, bikin virtual key buat tiap tim atau user lengkap sama batas budget, dan mantau pemakaian secara permanen karena semuanya kesimpen di Postgres. Dan jujur, di sinilah saya ngerasa jauh lebih leluasa dibanding waktu pakai 9Router dulu, karena semuanya saya yang pegang.
Perintah harian yang berguna
Beberapa perintah yang sering saya pakai buat ngontrol stack ini:
docker compose ps # lihat status
docker compose logs -f litellm # pantau log
docker compose down # matiin, data Postgres tetap aman di volume
docker compose up -d # nyalain lagi
Penutup
Jadi kesimpulannya, kalau kalian mau pasang LiteLLM, lewati aja drama virtualenv dan versi Python. Langsung pakai Docker Compose plus Postgres dari awal, dan kalian bakal hemat banyak waktu. Empat tembok yang saya temuin tadi, yaitu versi Python kebaru, master key belum diset, belum nyambung database, dan model belum boleh disimpen ke DB, sebenarnya gampang dilewatin asal tahu polanya.
Buat saya pribadi, 9Router tetap pilihan oke kalau pengen yang instan dan gratis. Tapi kalau kalian butuh kontrol penuh dan keleluasaan, LiteLLM yang di-self host kayak gini jauh lebih pas. Satu catatan keamanan: master key dan password yang saya pakai di sini cuma contoh. Kalau mau dipakai beneran, ganti dengan nilai yang kuat dan jangan pernah dipajang di repo publik. Selamat ngoprek!