Skip to content

Commit 55b644c

Browse files
authored
Merge pull request #94 from buerokratt/wip
Complete langfuse setup (buerokratt#182)
2 parents 301a03a + 97f0583 commit 55b644c

File tree

6 files changed

+194
-257
lines changed

6 files changed

+194
-257
lines changed

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,19 @@ The **BYK-RAG Module** is part of the Burokratt ecosystem, designed to provide *
2424
- External **Langfuse dashboard** for API usage, inference trends, cost analysis, and performance logs.
2525
- Agencies can configure cost alerts and view alerts via LLM Alerts UI.
2626
- Logs integrated with **Grafana Loki**.
27+
28+
### Storing Langfuse Secrets
29+
30+
1. **Generate API keys from Langfuse UI** (Settings → Project → API Keys)
31+
32+
2. **Copy the script to vault container:**
33+
```bash
34+
docker cp store-langfuse-secrets.sh vault:/tmp/store-langfuse-secrets.sh
35+
```
36+
37+
3. **Execute the script with your API keys:**
38+
```bash
39+
docker exec -e LANGFUSE_INIT_PROJECT_PUBLIC_KEY=<your public key> \
40+
-e LANGFUSE_INIT_PROJECT_SECRET_KEY=<your secret key> \
41+
vault sh -c "chmod +x /tmp/store-langfuse-secrets.sh && /tmp/store-langfuse-secrets.sh"
42+
```

env.example

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ S3_ENDPOINT_NAME=minio:9000
66
S3_DATA_BUCKET_PATH=resources
77
S3_DATA_BUCKET_NAME=rag-search
88
FS_DATA_DIRECTORY_PATH=/app
9-
S3_SECRET_ACCESS_KEY=changeme
10-
S3_ACCESS_KEY_ID=changeme
9+
S3_SECRET_ACCESS_KEY=minioadmin
10+
S3_ACCESS_KEY_ID=minioadmin
1111
S3_HEALTH_ENDPOINT=http://minio:9000/minio/health/live
1212
MINIO_BROWSER_REDIRECT_URL=http://localhost:9091
1313
GF_SECURITY_ADMIN_USER=admin
@@ -16,8 +16,8 @@ GF_USERS_ALLOW_SIGN_UP=false
1616
PORT=3000
1717
POSTGRES_USER=postgres
1818
POSTGRES_PASSWORD=dbadmin
19-
POSTGRES_DB=rag-search
20-
NEXTAUTH_URL=http://localhost:3000
19+
POSTGRES_DB=rag-search-langfuse
20+
NEXTAUTH_URL=http://localhost:3005
2121
DATABASE_URL=postgresql://postgres:dbadmin@rag_search_db:5432/rag-search
2222
SALT=changeme
2323
ENCRYPTION_KEY=changeme
@@ -27,7 +27,7 @@ LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES=true
2727
CLICKHOUSE_MIGRATION_URL=clickhouse://clickhouse:9000
2828
CLICKHOUSE_URL=http://clickhouse:8123
2929
CLICKHOUSE_USER=clickhouse
30-
CLICKHOUSE_PASSWORD=changeme
30+
CLICKHOUSE_PASSWORD=clickhouse
3131
CLICKHOUSE_CLUSTER_ENABLED=false
3232
LANGFUSE_USE_AZURE_BLOB=false
3333
LANGFUSE_S3_EVENT_UPLOAD_BUCKET=rag-search
@@ -41,15 +41,15 @@ LANGFUSE_S3_MEDIA_UPLOAD_BUCKET=rag-search
4141
LANGFUSE_S3_MEDIA_UPLOAD_REGION=auto
4242
LANGFUSE_S3_MEDIA_UPLOAD_ACCESS_KEY_ID=changeme
4343
LANGFUSE_S3_MEDIA_UPLOAD_SECRET_ACCESS_KEY=changeme
44-
LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT=http://localhost:9090
44+
LANGFUSE_S3_MEDIA_UPLOAD_ENDPOINT=http://minio:9000
4545
LANGFUSE_S3_MEDIA_UPLOAD_FORCE_PATH_STYLE=true
4646
LANGFUSE_S3_MEDIA_UPLOAD_PREFIX=langfuse/media/
4747
LANGFUSE_S3_BATCH_EXPORT_ENABLED=false
4848
LANGFUSE_S3_BATCH_EXPORT_BUCKET=rag-search
4949
LANGFUSE_S3_BATCH_EXPORT_PREFIX=langfuse/exports/
5050
LANGFUSE_S3_BATCH_EXPORT_REGION=auto
5151
LANGFUSE_S3_BATCH_EXPORT_ENDPOINT=http://minio:9000
52-
LANGFUSE_S3_BATCH_EXPORT_EXTERNAL_ENDPOINT=http://localhost:9090
52+
LANGFUSE_S3_BATCH_EXPORT_EXTERNAL_ENDPOINT=http://minio:9000
5353
LANGFUSE_S3_BATCH_EXPORT_ACCESS_KEY_ID=changeme
5454
LANGFUSE_S3_BATCH_EXPORT_SECRET_ACCESS_KEY=changeme
5555
LANGFUSE_S3_BATCH_EXPORT_FORCE_PATH_STYLE=true
@@ -64,9 +64,7 @@ REDIS_TLS_CERT=/certs/redis.crt
6464
REDIS_TLS_KEY=/certs/redis.key
6565
EMAIL_FROM_ADDRESS=
6666
SMTP_CONNECTION_URL=
67-
AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint_here
68-
AZURE_OPENAI_API_KEY=your_azure_openai_api_key_here
69-
AZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o-mini
70-
AWS_REGION=us-east-1
71-
AWS_ACCESS_KEY_ID=your_aws_access_key_here
72-
AWS_SECRET_ACCESS_KEY=your_aws_secret_key_here
67+
VAULT_ADDR=http://localhost:8200
68+
S3_FERRY_URL=http://rag-s3-ferry:3000/v1/files/copy
69+
DATASETS_PATH=/app/datasets
70+
METADATA_FILENAME=processed-metadata.json

src/llm_orchestration_service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1884,7 +1884,7 @@ def _refine_user_prompt(
18841884
)
18851885
output_json = validated_output.model_dump()
18861886
logger.info(
1887-
f"Prompt refinement output: {json.dumps(output_json, indent=2)}"
1887+
f"Prompt refinement output: {json_module.dumps(output_json, indent=2)}"
18881888
)
18891889

18901890
logger.info("Prompt refinement completed successfully")

src/utils/production_store.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
import requests
1313
import aiohttp
1414
from src.utils.connection_id_fetcher import get_connection_id_fetcher
15-
from ..llm_orchestrator_config.llm_ochestrator_constants import RAG_SEARCH_RUUTER_PUBLIC
15+
from src.llm_orchestrator_config.llm_ochestrator_constants import (
16+
RAG_SEARCH_RUUTER_PUBLIC,
17+
)
1618

1719

1820
class ProductionInferenceStore:

store-langfuse-secrets.sh

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
#!/bin/sh
2+
set -e
3+
4+
# ============================================================================
5+
# Langfuse Secrets Storage Script for Vault
6+
# ============================================================================
7+
# This script stores Langfuse configuration secrets in HashiCorp Vault.
8+
# Run this script AFTER vault-init.sh has completed successfully.
9+
#
10+
# Prerequisites:
11+
# 1. Vault must be initialized and unsealed
12+
# 2. Environment variables must be set (LANGFUSE_INIT_PROJECT_PUBLIC_KEY, etc.)
13+
# 3. Root token must be available in /vault/file/unseal-keys.json
14+
#
15+
# Usage:
16+
# ./store-langfuse-secrets.sh
17+
#
18+
# Or with custom values:
19+
# LANGFUSE_INIT_PROJECT_PUBLIC_KEY=pk-xxx \
20+
# LANGFUSE_INIT_PROJECT_SECRET_KEY=sk-xxx \
21+
# LANGFUSE_HOST=http://langfuse-web:3000 \
22+
# ./store-langfuse-secrets.sh
23+
# ============================================================================
24+
25+
VAULT_ADDR="${VAULT_ADDR:-http://vault:8200}"
26+
UNSEAL_KEYS_FILE="/vault/file/unseal-keys.json"
27+
28+
echo "========================================"
29+
echo "Langfuse Secrets Storage Script"
30+
echo "========================================"
31+
32+
# Check if Vault is available
33+
echo "Checking Vault availability..."
34+
if ! wget -q -O- "$VAULT_ADDR/v1/sys/health" >/dev/null 2>&1; then
35+
echo "Error: Vault is not available at $VAULT_ADDR"
36+
echo " Please ensure Vault is running and accessible."
37+
exit 1
38+
fi
39+
echo "Vault is available"
40+
41+
# Check if Vault is sealed
42+
SEALED=$(wget -q -O- "$VAULT_ADDR/v1/sys/seal-status" | grep -o '"sealed":[^,}]*' | cut -d':' -f2)
43+
if [ "$SEALED" = "true" ]; then
44+
echo "Error: Vault is sealed"
45+
echo " Please unseal Vault first using vault-init.sh or manual unseal process."
46+
exit 1
47+
fi
48+
echo "Vault is unsealed"
49+
50+
# Get root token
51+
echo "Loading Vault root token..."
52+
if [ ! -f "$UNSEAL_KEYS_FILE" ]; then
53+
echo "Error: Unseal keys file not found at $UNSEAL_KEYS_FILE"
54+
echo " Please run vault-init.sh first to initialize Vault."
55+
exit 1
56+
fi
57+
58+
ROOT_TOKEN=$(grep -o '"root_token":"[^"]*"' "$UNSEAL_KEYS_FILE" | cut -d':' -f2 | tr -d '"')
59+
if [ -z "$ROOT_TOKEN" ]; then
60+
echo "Error: Could not extract root token from $UNSEAL_KEYS_FILE"
61+
exit 1
62+
fi
63+
echo "Root token loaded"
64+
65+
# Check required environment variables
66+
echo "Checking Langfuse environment variables..."
67+
if [ -z "$LANGFUSE_INIT_PROJECT_PUBLIC_KEY" ]; then
68+
echo "Error: LANGFUSE_INIT_PROJECT_PUBLIC_KEY is not set"
69+
echo " Please set this environment variable before running the script."
70+
echo ""
71+
echo " Example:"
72+
echo " export LANGFUSE_INIT_PROJECT_PUBLIC_KEY='pk-lf-...'"
73+
exit 1
74+
fi
75+
76+
if [ -z "$LANGFUSE_INIT_PROJECT_SECRET_KEY" ]; then
77+
echo "Error: LANGFUSE_INIT_PROJECT_SECRET_KEY is not set"
78+
echo " Please set this environment variable before running the script."
79+
echo ""
80+
echo " Example:"
81+
echo " export LANGFUSE_INIT_PROJECT_SECRET_KEY='sk-lf-...'"
82+
exit 1
83+
fi
84+
85+
# Use default host if not specified
86+
LANGFUSE_HOST="${LANGFUSE_HOST:-http://langfuse-web:3000}"
87+
88+
echo "Langfuse environment variables found"
89+
echo " Public Key: ${LANGFUSE_INIT_PROJECT_PUBLIC_KEY:0:10}..."
90+
echo " Secret Key: ${LANGFUSE_INIT_PROJECT_SECRET_KEY:0:10}..."
91+
echo " Host: $LANGFUSE_HOST"
92+
93+
# Update Vault policy to include Langfuse secrets access
94+
echo ""
95+
echo "Updating llm-orchestration policy to include Langfuse secrets..."
96+
POLICY='path "secret/metadata/llm/*" { capabilities = ["list", "delete"] }
97+
path "secret/data/llm/*" { capabilities = ["create", "read", "update", "delete"] }
98+
path "secret/metadata/embeddings/*" { capabilities = ["list", "delete"] }
99+
path "secret/data/embeddings/*" { capabilities = ["create", "read", "update", "delete"] }
100+
path "secret/metadata/langfuse/*" { capabilities = ["list", "delete"] }
101+
path "secret/data/langfuse/*" { capabilities = ["create", "read", "update", "delete"] }
102+
path "auth/token/lookup-self" { capabilities = ["read"] }'
103+
104+
# Create JSON without jq (using printf for proper escaping)
105+
POLICY_ESCAPED=$(printf '%s' "$POLICY" | sed 's/\\/\\\\/g' | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g')
106+
POLICY_JSON='{"policy":"'"$POLICY_ESCAPED"'"}'
107+
108+
if wget -q -O- --post-data="$POLICY_JSON" \
109+
--header="X-Vault-Token: $ROOT_TOKEN" \
110+
--header='Content-Type: application/json' \
111+
"$VAULT_ADDR/v1/sys/policies/acl/llm-orchestration" >/dev/null 2>&1; then
112+
echo "Policy updated successfully"
113+
else
114+
echo "Warning: Policy update failed (may already be updated)"
115+
fi
116+
117+
# Store Langfuse secrets in Vault
118+
echo ""
119+
echo "Storing Langfuse secrets in Vault..."
120+
121+
# Create JSON payload
122+
LANGFUSE_SECRET='{"data":{"public_key":"'"$LANGFUSE_INIT_PROJECT_PUBLIC_KEY"'","secret_key":"'"$LANGFUSE_INIT_PROJECT_SECRET_KEY"'","host":"'"$LANGFUSE_HOST"'"}}'
123+
124+
# Store in Vault
125+
if wget -q -O- --post-data="$LANGFUSE_SECRET" \
126+
--header="X-Vault-Token: $ROOT_TOKEN" \
127+
--header='Content-Type: application/json' \
128+
"$VAULT_ADDR/v1/secret/data/langfuse/config" >/dev/null 2>&1; then
129+
echo "Langfuse secrets stored successfully"
130+
else
131+
echo "Error: Failed to store Langfuse secrets"
132+
exit 1
133+
fi
134+
135+
# Verify secrets were stored
136+
echo ""
137+
echo "Verifying stored secrets..."
138+
VERIFICATION=$(wget -q -O- \
139+
--header="X-Vault-Token: $ROOT_TOKEN" \
140+
"$VAULT_ADDR/v1/secret/data/langfuse/config" 2>/dev/null)
141+
142+
if echo "$VERIFICATION" | grep -q '"public_key"'; then
143+
echo "Secrets verified successfully"
144+
echo ""
145+
echo "========================================"
146+
echo "SUCCESS"
147+
echo "========================================"
148+
echo "Langfuse secrets have been stored in Vault at:"
149+
echo " Path: secret/data/langfuse/config"
150+
echo ""
151+
echo "The LLM Orchestration Service will now be able to:"
152+
echo " - Initialize Langfuse client automatically"
153+
echo " - Track LLM usage and costs"
154+
echo " - Monitor orchestration pipelines"
155+
echo ""
156+
echo "Next steps:"
157+
echo " 1. Restart llm-orchestration-service container (if running)"
158+
echo " 2. Check logs for 'Langfuse client initialized successfully'"
159+
echo "========================================"
160+
else
161+
echo "Warning: Secrets stored but verification failed"
162+
echo " The secrets may still be accessible, but verification could not confirm."
163+
fi

0 commit comments

Comments
 (0)