traicebox 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,28 @@
1
+ #!/bin/sh
2
+ set -eu
3
+
4
+ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<SQL
5
+ DO \$\$
6
+ BEGIN
7
+ IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = '${LITELLM_DB_USER}') THEN
8
+ CREATE ROLE ${LITELLM_DB_USER} LOGIN PASSWORD '${LITELLM_DB_PASSWORD}';
9
+ END IF;
10
+ END
11
+ \$\$;
12
+
13
+ DO \$\$
14
+ BEGIN
15
+ IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = '${LANGFUSE_DB_USER}') THEN
16
+ CREATE ROLE ${LANGFUSE_DB_USER} LOGIN PASSWORD '${LANGFUSE_DB_PASSWORD}';
17
+ END IF;
18
+ END
19
+ \$\$;
20
+
21
+ SELECT 'CREATE DATABASE ${LITELLM_DB_NAME} OWNER ${LITELLM_DB_USER}'
22
+ WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '${LITELLM_DB_NAME}')
23
+ \gexec
24
+
25
+ SELECT 'CREATE DATABASE ${LANGFUSE_DB_NAME} OWNER ${LANGFUSE_DB_USER}'
26
+ WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '${LANGFUSE_DB_NAME}')
27
+ \gexec
28
+ SQL
@@ -0,0 +1,18 @@
1
+ {
2
+ auto_https off
3
+ }
4
+
5
+ http://langfuse.localhost:{$TRAICEBOX_PORT} {
6
+ reverse_proxy langfuse-proxy:3000
7
+ }
8
+
9
+ http://litellm.localhost:{$TRAICEBOX_PORT} {
10
+ @litellm_ui path /ui /ui/*
11
+ handle @litellm_ui {
12
+ reverse_proxy litellm-ui-proxy:4000
13
+ }
14
+
15
+ handle {
16
+ reverse_proxy litellm:4000
17
+ }
18
+ }
@@ -0,0 +1,7 @@
1
+ FROM oven/bun:1
2
+
3
+ WORKDIR /app
4
+
5
+ COPY langfuse-proxy/server.ts /app/server.ts
6
+
7
+ CMD ["bun", "run", "/app/server.ts"]
@@ -0,0 +1,7 @@
1
+ FROM oven/bun:1
2
+
3
+ WORKDIR /app
4
+
5
+ COPY litellm-ui-proxy/server.ts /app/server.ts
6
+
7
+ CMD ["bun", "run", "/app/server.ts"]
@@ -0,0 +1,39 @@
1
+ #!/bin/sh
2
+ set -eu
3
+
4
+ LITELLM_URL="http://litellm:4000"
5
+ READY_URL="$LITELLM_URL/health/readiness"
6
+ KEY_INFO_URL="$LITELLM_URL/key/info?key=${LITELLM_CLIENT_KEY}"
7
+ KEY_GENERATE_URL="$LITELLM_URL/key/generate"
8
+
9
+ for _ in $(seq 1 60); do
10
+ if curl -fsS "$READY_URL" >/dev/null 2>&1; then
11
+ break
12
+ fi
13
+ sleep 2
14
+ done
15
+
16
+ if ! curl -fsS "$READY_URL" >/dev/null 2>&1; then
17
+ echo "LiteLLM did not become ready in time" >&2
18
+ exit 1
19
+ fi
20
+
21
+ if curl -fsS \
22
+ -H "Authorization: Bearer ${LITELLM_MASTER_KEY}" \
23
+ "$KEY_INFO_URL" >/dev/null 2>&1; then
24
+ echo "LiteLLM client key already exists"
25
+ exit 0
26
+ fi
27
+
28
+ curl -fsS \
29
+ -X POST \
30
+ -H "Authorization: Bearer ${LITELLM_MASTER_KEY}" \
31
+ -H "Content-Type: application/json" \
32
+ "$KEY_GENERATE_URL" \
33
+ -d "{
34
+ \"key_alias\": \"local-client\",
35
+ \"key\": \"${LITELLM_CLIENT_KEY}\",
36
+ \"models\": []
37
+ }" >/dev/null
38
+
39
+ echo "LiteLLM client key created"
@@ -0,0 +1,266 @@
1
+ services:
2
+ db:
3
+ image: pgautoupgrade/pgautoupgrade:18-alpine
4
+ environment:
5
+ - POSTGRES_DB=postgres
6
+ - POSTGRES_USER=${POSTGRES_SUPERUSER}
7
+ - POSTGRES_PASSWORD=${POSTGRES_SUPERPASS}
8
+ - PGAUTO_DEVEL=
9
+ - PGAUTO_ONESHOT=no
10
+ - LITELLM_DB_NAME=${LITELLM_DB_NAME}
11
+ - LITELLM_DB_USER=${LITELLM_DB_USER}
12
+ - LITELLM_DB_PASSWORD=${LITELLM_DB_PASSWORD}
13
+ - LANGFUSE_DB_NAME=${LANGFUSE_DB_NAME}
14
+ - LANGFUSE_DB_USER=${LANGFUSE_DB_USER}
15
+ - LANGFUSE_DB_PASSWORD=${LANGFUSE_DB_PASSWORD}
16
+ healthcheck:
17
+ test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_SUPERUSER} -d postgres && psql -U ${POSTGRES_SUPERUSER} -d postgres -tAc \"SELECT 1 FROM pg_database WHERE datname IN ('${LITELLM_DB_NAME}','${LANGFUSE_DB_NAME}')\" | grep -q 1"]
18
+ interval: 3s
19
+ timeout: 3s
20
+ retries: 20
21
+ start_period: 5s
22
+ volumes:
23
+ - postgres_data:/var/lib/postgresql
24
+ - ./postgres/init/00-app-databases.sh:/docker-entrypoint-initdb.d/00-app-databases.sh:ro
25
+ langfuse-clickhouse:
26
+ image: clickhouse/clickhouse-server
27
+ user: "101:101"
28
+ environment:
29
+ - CLICKHOUSE_DB=${CLICKHOUSE_DB}
30
+ - CLICKHOUSE_USER=${CLICKHOUSE_USER}
31
+ - CLICKHOUSE_PASSWORD=${CLICKHOUSE_PASSWORD}
32
+ - TZ=UTC
33
+ healthcheck:
34
+ test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8123/ping"]
35
+ interval: 5s
36
+ timeout: 5s
37
+ retries: 10
38
+ start_period: 1s
39
+ volumes:
40
+ - langfuse_clickhouse_data:/var/lib/clickhouse
41
+ - langfuse_clickhouse_logs:/var/log/clickhouse-server
42
+ langfuse-redis:
43
+ image: redis:latest
44
+ command:
45
+ - --requirepass
46
+ - ${LANGFUSE_REDIS_PASSWORD}
47
+ - --maxmemory-policy
48
+ - noeviction
49
+ healthcheck:
50
+ test: ["CMD", "redis-cli", "-a", "${LANGFUSE_REDIS_PASSWORD}", "ping"]
51
+ interval: 3s
52
+ timeout: 10s
53
+ retries: 10
54
+ volumes:
55
+ - langfuse_redis_data:/data
56
+ langfuse-minio:
57
+ image: cgr.dev/chainguard/minio
58
+ entrypoint: sh
59
+ command:
60
+ - -c
61
+ - mkdir -p /data/langfuse && minio server --address ":9000" --console-address ":9001" /data
62
+ environment:
63
+ - MINIO_ROOT_USER=${MINIO_ROOT_USER}
64
+ - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD}
65
+ healthcheck:
66
+ test: ["CMD", "mc", "ready", "local"]
67
+ interval: 1s
68
+ timeout: 5s
69
+ retries: 5
70
+ start_period: 1s
71
+ volumes:
72
+ - langfuse_minio_data:/data
73
+ langfuse-worker:
74
+ image: langfuse/langfuse-worker:3
75
+ depends_on:
76
+ db:
77
+ condition: service_healthy
78
+ langfuse-web:
79
+ condition: service_healthy
80
+ langfuse-minio:
81
+ condition: service_healthy
82
+ langfuse-redis:
83
+ condition: service_healthy
84
+ langfuse-clickhouse:
85
+ condition: service_healthy
86
+ environment: &langfuse-env
87
+ NEXTAUTH_URL: http://langfuse.localhost:${TRAICEBOX_PORT}
88
+ DATABASE_URL: postgresql://${LANGFUSE_DB_USER}:${LANGFUSE_DB_PASSWORD}@db:5432/${LANGFUSE_DB_NAME}
89
+ SALT: ${LANGFUSE_SALT}
90
+ ENCRYPTION_KEY: "${LANGFUSE_ENCRYPTION_KEY}"
91
+ TELEMETRY_ENABLED: "${LANGFUSE_TELEMETRY_ENABLED}"
92
+ LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: "${LANGFUSE_EXPERIMENTAL_FEATURES}"
93
+ CLICKHOUSE_MIGRATION_URL: clickhouse://langfuse-clickhouse:9000
94
+ CLICKHOUSE_URL: http://langfuse-clickhouse:8123
95
+ CLICKHOUSE_USER: ${CLICKHOUSE_USER}
96
+ CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD}
97
+ CLICKHOUSE_CLUSTER_ENABLED: "false"
98
+ LANGFUSE_S3_EVENT_UPLOAD_BUCKET: langfuse
99
+ LANGFUSE_S3_EVENT_UPLOAD_REGION: auto
100
+ LANGFUSE_S3_EVENT_UPLOAD_ACCESS_KEY_ID: ${MINIO_ROOT_USER}
101
+ LANGFUSE_S3_EVENT_UPLOAD_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD}
102
+ LANGFUSE_S3_EVENT_UPLOAD_ENDPOINT: http://langfuse-minio:9000
103
+ LANGFUSE_S3_EVENT_UPLOAD_FORCE_PATH_STYLE: "true"
104
+ LANGFUSE_S3_EVENT_UPLOAD_PREFIX: events/
105
+ LANGFUSE_S3_MEDIA_UPLOAD_BUCKET: langfuse
106
+ LANGFUSE_S3_MEDIA_UPLOAD_REGION: auto
107
+ LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID: ${MINIO_ROOT_USER}
108
+ LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD}
109
+ LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT: http://langfuse-minio:9000
110
+ LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE: "true"
111
+ LANGFUSE_S3_MEDIA_UPLOAD_PREFIX: media/
112
+ REDIS_HOST: langfuse-redis
113
+ REDIS_PORT: "6379"
114
+ REDIS_AUTH: ${LANGFUSE_REDIS_PASSWORD}
115
+ langfuse-web:
116
+ image: langfuse/langfuse:3
117
+ depends_on:
118
+ db:
119
+ condition: service_healthy
120
+ langfuse-minio:
121
+ condition: service_healthy
122
+ langfuse-redis:
123
+ condition: service_healthy
124
+ langfuse-clickhouse:
125
+ condition: service_healthy
126
+ environment:
127
+ <<: *langfuse-env
128
+ NEXTAUTH_SECRET: ${LANGFUSE_NEXTAUTH_SECRET}
129
+ AUTH_DISABLE_SIGNUP: ${LANGFUSE_AUTH_DISABLE_SIGNUP}
130
+ LANGFUSE_INIT_ORG_ID: ${LANGFUSE_INIT_ORG_ID}
131
+ LANGFUSE_INIT_ORG_NAME: ${LANGFUSE_INIT_ORG_NAME}
132
+ LANGFUSE_INIT_PROJECT_ID: ${LANGFUSE_INIT_PROJECT_ID}
133
+ LANGFUSE_INIT_PROJECT_NAME: ${LANGFUSE_INIT_PROJECT_NAME}
134
+ LANGFUSE_INIT_PROJECT_PUBLIC_KEY: ${LANGFUSE_INIT_PROJECT_PUBLIC_KEY}
135
+ LANGFUSE_INIT_PROJECT_SECRET_KEY: ${LANGFUSE_INIT_PROJECT_SECRET_KEY}
136
+ LANGFUSE_INIT_USER_EMAIL: ${LANGFUSE_INIT_USER_EMAIL}
137
+ LANGFUSE_INIT_USER_NAME: ${LANGFUSE_INIT_USER_NAME}
138
+ LANGFUSE_INIT_USER_PASSWORD: ${LANGFUSE_INIT_USER_PASSWORD}
139
+ healthcheck:
140
+ test: ["CMD", "node", "-e", "const host = process.env.HOSTNAME || 'localhost'; fetch('http://' + host + ':3000/api/auth/csrf').then(async (r) => { const ok = r.ok && (await r.text()).includes('csrfToken'); process.exit(ok ? 0 : 1); }).catch(() => process.exit(1))"]
141
+ interval: 5s
142
+ timeout: 5s
143
+ retries: 24
144
+ start_period: 20s
145
+ langfuse-proxy:
146
+ build:
147
+ context: .
148
+ dockerfile: langfuse-proxy/Dockerfile
149
+ depends_on:
150
+ langfuse-web:
151
+ condition: service_healthy
152
+ environment:
153
+ - PORT=3000
154
+ - LANGFUSE_PUBLIC_ORIGIN=http://langfuse.localhost:${TRAICEBOX_PORT}
155
+ - LANGFUSE_UPSTREAM_ORIGIN=http://langfuse-web:3000
156
+ - LANGFUSE_PROXY_AUTOLOGIN=${LANGFUSE_PROXY_AUTOLOGIN}
157
+ - LANGFUSE_INIT_USER_EMAIL=${LANGFUSE_INIT_USER_EMAIL}
158
+ - LANGFUSE_INIT_USER_PASSWORD=${LANGFUSE_INIT_USER_PASSWORD}
159
+ healthcheck:
160
+ test: ["CMD", "bun", "-e", "fetch('http://127.0.0.1:3000/readyz').then((r) => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1))"]
161
+ interval: 5s
162
+ timeout: 5s
163
+ retries: 24
164
+ start_period: 10s
165
+ litellm:
166
+ image: docker.litellm.ai/berriai/litellm:main-latest
167
+ depends_on:
168
+ db:
169
+ condition: service_healthy
170
+ langfuse-web:
171
+ condition: service_healthy
172
+ environment:
173
+ - DATABASE_URL=postgresql://${LITELLM_DB_USER}:${LITELLM_DB_PASSWORD}@db:5432/${LITELLM_DB_NAME}
174
+ - LANGFUSE_PUBLIC_KEY=${LANGFUSE_INIT_PROJECT_PUBLIC_KEY}
175
+ - LANGFUSE_SECRET_KEY=${LANGFUSE_INIT_PROJECT_SECRET_KEY}
176
+ - LANGFUSE_OTEL_HOST=http://langfuse-web:3000
177
+ - LANGFUSE_TRACING_ENVIRONMENT=${LANGFUSE_TRACING_ENVIRONMENT}
178
+ - LITELLM_MASTER_KEY=${LITELLM_MASTER_KEY}
179
+ extra_hosts:
180
+ - host.docker.internal:host-gateway
181
+ secrets:
182
+ - source: openai_compatible_api_key
183
+ target: openai_compatible_api_key
184
+ volumes:
185
+ - ./litellm:/app/litellm-config:ro
186
+ entrypoint:
187
+ - /bin/sh
188
+ - /app/litellm-config/start-litellm.sh
189
+ command:
190
+ - --config
191
+ - /app/litellm-config/config.yaml
192
+ - --log_config
193
+ - /app/litellm-config/logging.json
194
+ - --port
195
+ - "4000"
196
+ healthcheck:
197
+ test: ["CMD", "python3", "-c", "import sys, urllib.request; sys.exit(0 if urllib.request.urlopen('http://127.0.0.1:4000/health/readiness', timeout=5).getcode() == 200 else 1)"]
198
+ interval: 5s
199
+ timeout: 5s
200
+ retries: 24
201
+ start_period: 20s
202
+ litellm-ui-proxy:
203
+ build:
204
+ context: .
205
+ dockerfile: litellm-ui-proxy/Dockerfile
206
+ depends_on:
207
+ litellm:
208
+ condition: service_healthy
209
+ environment:
210
+ - PORT=4000
211
+ - LITELLM_UPSTREAM_ORIGIN=http://litellm:4000
212
+ - LITELLM_MASTER_KEY=${LITELLM_MASTER_KEY}
213
+ healthcheck:
214
+ test: ["CMD", "bun", "-e", "fetch('http://127.0.0.1:4000/readyz').then((r) => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1))"]
215
+ interval: 5s
216
+ timeout: 5s
217
+ retries: 24
218
+ start_period: 10s
219
+ litellm-bootstrap:
220
+ image: curlimages/curl:8.16.0
221
+ depends_on:
222
+ litellm:
223
+ condition: service_healthy
224
+ environment:
225
+ - LITELLM_MASTER_KEY=${LITELLM_MASTER_KEY}
226
+ - LITELLM_CLIENT_KEY=${LITELLM_CLIENT_KEY}
227
+ volumes:
228
+ - ./litellm/bootstrap-client-key.sh:/bootstrap-client-key.sh:ro
229
+ entrypoint:
230
+ - sh
231
+ - /bootstrap-client-key.sh
232
+ caddy:
233
+ image: caddy:2-alpine
234
+ depends_on:
235
+ langfuse-proxy:
236
+ condition: service_healthy
237
+ litellm:
238
+ condition: service_healthy
239
+ litellm-ui-proxy:
240
+ condition: service_healthy
241
+ ports:
242
+ - ${TRAICEBOX_HOST}:${TRAICEBOX_PORT}:${TRAICEBOX_PORT}
243
+ environment:
244
+ - TRAICEBOX_PORT=${TRAICEBOX_PORT}
245
+ volumes:
246
+ - ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro
247
+ healthcheck:
248
+ test: ["CMD-SHELL", "wget -qO- --header='Host: litellm.localhost:${TRAICEBOX_PORT}' http://127.0.0.1:${TRAICEBOX_PORT}/health/readiness >/dev/null && wget -qO- --header='Host: litellm.localhost:${TRAICEBOX_PORT}' http://127.0.0.1:${TRAICEBOX_PORT}/ui/ >/dev/null && wget -qO- --header='Host: langfuse.localhost:${TRAICEBOX_PORT}' http://127.0.0.1:${TRAICEBOX_PORT}/readyz >/dev/null"]
249
+ interval: 5s
250
+ timeout: 5s
251
+ retries: 24
252
+ start_period: 10s
253
+ volumes:
254
+ postgres_data:
255
+ driver: local
256
+ langfuse_clickhouse_data:
257
+ driver: local
258
+ langfuse_clickhouse_logs:
259
+ driver: local
260
+ langfuse_minio_data:
261
+ driver: local
262
+ langfuse_redis_data:
263
+ driver: local
264
+ secrets:
265
+ openai_compatible_api_key:
266
+ file: ${OPENAI_COMPATIBLE_API_KEY_SECRET_FILE:-/dev/null}
@@ -0,0 +1,7 @@
1
+ model_list: []
2
+
3
+ litellm_settings:
4
+ database_url: os.environ/DATABASE_URL
5
+ callbacks:
6
+ - request_session_metadata_callback.proxy_handler_instance
7
+ - langfuse_otel