Un agent care lucrează la trei noaptea fără să-l urmărească nimeni valorează exact cât capacitatea ta de a reconstitui ulterior ce a făcut. „A ars tokeni de 38 $ peste noapte” e o dimineață proastă. „A ars 38 $ pentru că o unealtă de căutare a întors o pagină goală, iar planificatorul a reîncercat de 400 de ori” e un bug pe care îl repari înainte de prânz. Pentru a doua propoziție ai nevoie de trace-uri.
Langfuse înregistrează fiecare apel LLM, fiecare prompt, pas de unealtă, număr de tokeni și latență ca pe un arbore prin care poți naviga cu clicuri. Găzduit de tine, toate aceste prompturi și răspunsuri — care conțin adesea date de clienți, rezultate de API și câte un secret rătăcit — rămân pe un server pe care îl controlezi, nu în panoul altcuiva.
Cât costă să-l ții pornit
Langfuse v4 nu e un binar mic, ci șase containere: aplicația web, un worker în fundal, Postgres, ClickHouse pentru evenimente, Redis și MinIO pentru fișiere. L-am instalat pe un server de test și am măsurat circa 3,5 GB RAM folosiți cu un proiect gol. Ce crește este ClickHouse, pentru că acolo ajunge fiecare span trimis.
| Încărcare | Plan |
|---|---|
| Câțiva agenți, trace-uri pe săptămâni | Medium-IP — 6 vCPU, 6 GB, 45 GB ($20/lună) |
| O flotă de agenți, istoric pe luni | Planuri Pro, de la 32 GB RAM în sus — la cerere |
Pe planurile mai mici se instalează, dar apoi se sufocă de îndată ce ClickHouse și workerul vor memorie în același timp. N-aș coborî sub 6 GB.
Unde stau agenții? Dacă rulează pe alte mașini, alege un plan cu IPv4 propriu: au nevoie de un endpoint HTTPS, iar pe un plan NAT adresa de ieșire nu este a ta și din exterior se ajunge doar la portul SSH. Dacă agenții rulează chiar pe acest server, Langfuse nu trebuie să iasă deloc pe internet: pentru o probă ajunge Medium cu NAT ($12/lună). Există două locații din UE (disponibilitatea se vede la comandă). Alege-o pe cea mai apropiată de agenți, nu de tine. Serverele se plătesc în cripto, fără KYC.
Instalare
Pe un server proaspăt cu Ubuntu 24.04 sau Debian 12, ca root. Întâi Docker:
curl -fsSL https://get.docker.com | sh
Apoi Langfuse, cu secrete reale în locul valorilor implicite din fișierul compose:
git clone --depth 1 https://github.com/langfuse/langfuse.git
cd langfuse
PG=$(openssl rand -hex 16); MINIO=$(openssl rand -hex 16)
cat > .env <<EOF
NEXTAUTH_URL=https://langfuse.example.com
NEXTAUTH_SECRET=$(openssl rand -hex 32)
SALT=$(openssl rand -hex 32)
ENCRYPTION_KEY=$(openssl rand -hex 32)
POSTGRES_PASSWORD=$PG
DATABASE_URL=postgresql://postgres:$PG@postgres:5432/postgres
CLICKHOUSE_PASSWORD=$(openssl rand -hex 16)
MINIO_ROOT_PASSWORD=$MINIO
LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY=$MINIO
LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY=$MINIO
LANGFUSE_S3_BATCH_EXPORT_SECRET_ACCESS_KEY=$MINIO
REDIS_AUTH=$(openssl rand -hex 16)
TELEMETRY_ENABLED=false
EOF
chmod 600 .env
Două dintre parole merg în pereche: parola Postgres stă și în DATABASE_URL, iar parola MinIO trebuie să coincidă cu cele trei rânduri S3_..._SECRET_ACCESS_KEY. De aceea fiecare vine dintr-o singură variabilă.
Acum capcana. Fișierul compose publică aplicația web pe portul 3000 și MinIO pe 9090 pe toate interfețele, iar porturile publicate de Docker ocolesc ufw. Leagă-le pe amândouă de localhost, ca singura intrare să rămână reverse proxy-ul:
sed -i 's/- 3000:3000/- 127.0.0.1:3000:3000/; s/- 9090:9000/- 127.0.0.1:9090:9000/' docker-compose.yml
docker compose up -d
curl -s http://127.0.0.1:3000/api/public/health
Ultima comandă ar trebui să afișeze {"status":"OK", ...}. Prima pornire rulează migrările bazei de date; în testul nostru, verificarea de sănătate a trecut la circa 15 secunde după ce au pornit containerele.
HTTPS în față
Îndreaptă langfuse.example.com spre IP-ul serverului, apoi:
apt install -y caddy
cat > /etc/caddy/Caddyfile <<'EOF'
langfuse.example.com {
reverse_proxy 127.0.0.1:3000
}
EOF
systemctl reload caddy
ufw allow 22/tcp && ufw allow 80/tcp && ufw allow 443/tcp && ufw enable
Caddy obține singur certificatul. Deschide site-ul, creează-ți contul (devine prima organizație), adaugă un proiect și copiază-i cheile publică și secretă.
Apoi închide ușa în urma ta. Langfuse înțelege AUTH_DISABLE_SIGNUP, dar fișierul compose standard nu o transmite containerului web, așa că e nevoie de încă un rând sub langfuse-web:
sed -i 's|^ NEXTAUTH_SECRET: \(.*\)$| NEXTAUTH_SECRET: \1\n AUTH_DISABLE_SIGNUP: ${AUTH_DISABLE_SIGNUP:-false}|' docker-compose.yml
echo "AUTH_DISABLE_SIGNUP=true" >> .env
docker compose up -d
De acum, o încercare de înregistrare primește «Sign up is disabled». Colegii îi adaugi din interiorul proiectului.
Trimiterea trace-urilor dintr-un agent
SDK-ul Python îți învelește funcțiile, iar apelurile imbricate devin span-uri imbricate:
python3 -m venv venv && . venv/bin/activate
pip install langfuse
export LANGFUSE_PUBLIC_KEY=pk-lf-...
export LANGFUSE_SECRET_KEY=sk-lf-...
export LANGFUSE_BASE_URL=https://langfuse.example.com
from langfuse import get_client, observe
langfuse = get_client() # citește variabilele LANGFUSE_*
@observe(name="fetch-prices")
def fetch_prices(pair: str) -> dict:
return {"pair": pair, "bid": 64210.5}
@observe(name="nightly-agent-run")
def run() -> str:
data = fetch_prices("BTC/USDT")
return f"done: {data['pair']}"
print(run())
langfuse.flush() # scripturile scurte se încheie înainte ca trimiterea din fundal să termine
Nu sări peste LANGFUSE_BASE_URL. Fără ea, SDK-ul trimite totul în tăcere în cloudul Langfuse, cheile tale nu există acolo și te uiți la un panou gol.
Ca să verifici din consolă că span-urile au ajuns:
curl -s -u "$LANGFUSE_PUBLIC_KEY:$LANGFUSE_SECRET_KEY" \
"$LANGFUSE_BASE_URL/api/public/v2/observations?limit=5"
În v4, vechiul endpoint /api/public/traces răspunde cu o eroare despre modul events-only. Este de așteptat, nu e o instalare stricată. Într-un agent real înveleşti la fel apelul LLM și fiecare unealtă; în plus, Langfuse are integrări pentru SDK-urile LLM și framework-urile de agenți populare, așa că de multe ori ajunge să schimbi un import în loc să presari decoratori peste tot.
La ce să fii atent
- Disc. ClickHouse și MinIO păstrează tot ce trimiți.
docker system df -varată unde s-a dus spațiul. Dacă urmărești prompturi și răspunsuri lungi, cei 45 GB de pe Medium-IP se umplu în săptămâni, nu în ani. Verifică o dată pe lună; când devine strâmt, un plan Pro cu 400 GB sau mai mult este la cerere. - Actualizări. Fișierul compose fixează versiunea majoră (
:4).docker compose pull && docker compose up -daduce corecturile din cadrul ei. Citește changelog-ul înainte să schimbi versiunea majoră: exact în v4 a dispărut endpointul de trace-uri. - Backupuri. Ce contează stă în volume Docker: Postgres ține utilizatorii, proiectele și cheile; ClickHouse și MinIO, trace-urile propriu-zise. Copiază-le în afara serverului după un program.
Merită $20 pe lună? Dacă agenții tăi cheltuie mai mult de atât pe tokeni — și majoritatea agenților nesupravegheați cheltuie —, să știi unde s-au dus tokenii se amortizează prima dată când o buclă o ia razna. Un agent mic care rulează o dată pe zi nu are nevoie de nimic din toate acestea: ajung un fișier de log și un contor de tokeni.
Articole conexe
- VPS pentru agenți AI — unde rulează agenții înșiși
- VPS pentru sisteme multi-agent — dimensionarea unei flote întregi
- VPS pentru un proxy LiteLLM — un singur gateway pentru toate cheile de modele, cu limite de cheltuieli
- Planuri Pro la cerere — de la 32 la 80 GB RAM pentru o flotă de agenți
- Cum configurezi un firewall ufw
Comentarii
Încă nu există comentarii. Fii primul.