File size: 9,758 Bytes
eb60b6b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6663ad4
 
 
 
eb60b6b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
# BrainAPI deploy profile: light
# Pair with deploy/docker-compose.light.yaml
# Stack: Postgres/pgvector + NetworkX + Redis; LLMs: DeepSeek; embeddings: OpenAI

# LLM Implementation envs
LLM_SMALL_PROVIDER="deepseek"
LLM_LARGE_PROVIDER="deepseek"
EMBEDDINGS_PROVIDER="openai"
AZURE_SMALL_LLM_MODEL="gpt-4o-mini"
AZURE_LARGE_LLM_MODEL="gpt-4o"
AZURE_LLM_API_VERSION="2024-12-01-preview"
AZURE_LLM_ENDPOINT="https://yourproject.openai.azure.com"
AZURE_LLM_SUBSCRIPTION_KEY="xyz"
GCP_EXTRA_SMALL_LLM_MODEL="gemini-3-flash-preview"
GCP_SMALL_LLM_MODEL="gemini-3-flash-preview"
GCP_LARGE_LLM_MODEL="gemini-3-flash-preview"
GCP_EMBEDDING_MODEL="text-embedding-005"
GCP_PROJECT_ID="your-project-id"
GCP_CREDENTIALS_PATH=".path-to-credentials-file.json"
BEDROCK_REGION="us-east-1"
BEDROCK_ACCESS_KEY_ID="your-access-key-id"
BEDROCK_SECRET_ACCESS_KEY="your-secret-access-key"
BEDROCK_SESSION_TOKEN=""
BEDROCK_SMALL_LLM_MODEL="us.anthropic.claude-3-5-haiku-20241022-v1:0"
BEDROCK_LARGE_LLM_MODEL="us.anthropic.claude-3-7-sonnet-20250219-v1:0"
BEDROCK_EMBEDDING_MODEL="amazon.titan-embed-text-v2:0"
OPENAI_API_KEY="sk-..."
OPENAI_BASE_URL=""
OPENAI_SMALL_LLM_MODEL="gpt-4o-mini"
OPENAI_LARGE_LLM_MODEL="gpt-4o"
OPENAI_EMBEDDING_MODEL="text-embedding-3-large"
# DeepSeek chat (OpenAI-compatible). Embeddings stay on OpenAI above.
DEEPSEEK_API_KEY="sk-..."
DEEPSEEK_SMALL_LLM_MODEL="deepseek-v4-flash"
DEEPSEEK_LARGE_LLM_MODEL="deepseek-v4-pro"

# Embedding envs
# The following are just examples of the adapter implementation, you can have completely different envs
AZURE_EMBEDDING_FULL_ENDPOINT="https://yourproject.openai.azure.com/openai/deployments/text-embedding-3-large/embeddings?api-version=2023-05-15"
AZURE_EMBEDDING_KEY="xyz"
AZURE_EMBEDDING_MODEL="text-embedding-3-large"
EMBEDDINGS_SMALL_MODEL="paraphrase-multilingual-MiniLM-L12-v2"
EMBEDDINGS_LOCAL_MODEL="intfloat/e5-small"
EMBEDDING_NODES_DIMENSION=3072
EMBEDDING_TRIPLETS_DIMENSION=3072
EMBEDDING_OBSERVATIONS_DIMENSION=3072
EMBEDDING_DATA_DIMENSION=3072
EMBEDDING_RELATIONSHIPS_DIMENSION=3072

# Cache envs
# The following are just examples of the adapter implementation, you can have completely different envs
REDIS_HOST="redis"
REDIS_PORT=6379
REDIS_PASSWORD="replace-with-a-long-random-secret"

# Worker envs
# Can be whatever you prefer
# CELERY_BACKEND="rabbitmq"
# CELERY_UNBLOCKED_WINDOW_SECONDS is the window in seconds during which the number of unblocked events is counted
# CELERY_UNBLOCKED_MAX_RETRIES is the maximum number of unblocked events that can occur during the window
# CELERY_QUEUE_HEALTH_THRESHOLD is the maximum number of tasks that can be in the queue before the worker is considered unhealthy
CELERY_BACKEND="redis"
CELERY_UNBLOCKED_WINDOW_SECONDS=60
CELERY_UNBLOCKED_MAX_RETRIES=20
CELERY_QUEUE_HEALTH_THRESHOLD=50

# GraphDB envs
# The following are just examples of the adapter implementation, you can have completely different envs
NEO4J_HOST="localhost"
NEO4J_PORT=7687
NEO4J_USERNAME="neo4j"
NEO4J_PASSWORD="your_password"

# VectorDB envs
# The following are just examples of the adapter implementation, you can have completely different envs
MILVUS_HOST="localhost"
MILVUS_PORT=19530

# PostgreSQL envs
# Used for data / vector / graph storage when DATA_DB, VECTOR_DB, or GRAPH_DB
# point at postgresql / pgvector / networkx.
# Each brain owns its own Postgres database (brain_<sanitized_id>).
# POSTGRES_SYSTEM_DATABASE holds the brains registry (data_brains table).
# POSTGRES_MAINTENANCE_DATABASE is used only for CREATE DATABASE statements.
POSTGRES_HOST="postgres"
POSTGRES_PORT=5432
POSTGRES_USERNAME="postgres"
POSTGRES_PASSWORD="replace-with-a-long-random-secret"
POSTGRES_SYSTEM_DATABASE="brainapi"
POSTGRES_MAINTENANCE_DATABASE="postgres"

# DataDB envs (Mongo alternative to PostgreSQL data layer)
# The following are just examples of the adapter implementation, you can have completely different envs
MONGO_HOST="localhost"
MONGO_PORT=27017
MONGO_USERNAME="root"
MONGO_PASSWORD="password"
MONGO_SYSTEM_DATABASE="system"

# Auth
# Used to handle authentication
BRAINPAT_TOKEN="your_token"

# MultiBrain
# Legacy flag; API requests never provision brains implicitly.
# Create explicitly through POST /system/brains or POST /system/workspaces.
BRAIN_CREATION_ALLOWED="false"
# Resolve a missing scope to an already-registered default brain; never creates it
DEFAULT_BRAIN_FALLBACK="true"

# Optional anonymous, read-only documentation search demo (disabled by default)
PUBLIC_DEMO_ENABLED="false"
PUBLIC_DEMO_BRAIN_ID="agentdemo"
PUBLIC_DEMO_MAX_K=10

# GCP
# Used on the oss project for the small LLM but can be changed to any other model
GCP_EXTRA_SMALL_LLM_MODEL="gemini-3-flash-preview"
GCP_SMALL_LLM_MODEL="gemini-3-flash-preview"
GCP_PROJECT_ID="your-project-id"
GCP_CREDENTIALS_PATH=".path-to-credentials-file.json"

# Celery
# Used to run the worker tasks
CELERY_WORKER_CONCURRENCY=1

# DocParser
# Used to parse the documents into markdown text
# and by forwarding the webhook (our app host) and the task identifier,
# we can be called back from the DocParser API to start the ingestion process
# with the created markdown text.
DOCPARSER_ENDPOINT="https://docparser.lumen-labs.ai"
APP_HOST="https://your-app-host.com/ingest"
DOCPARSER_TOKEN="your-docparser-token"

# Spacy
# Used to keep the spacy models in memory or reinitialize them on each request
SPACY_KEEP_MODELS_IN_MEMORY="true"

# Pipeline
# Used to configure the pipeline
# PIPELINE_MODE => lightweight = faster but less accurate, accurate = slower but more accurate
# MODELS_MODE => local = uses local models for llm and embeddings, remote = uses remote models for llm and embeddings
# OCR_MODE => docling = uses local docling ocr engine, docparser = uses remote docparser ocr pipeline engine
# AGENTIC_ARCHITECTURE => custom = uses the custom agentic architecture (faster and token efficient), langchain = uses the langchain agentic architecture
# RUN_GRAPH_CONSOLIDATOR => true = consolidates after ingest (LLM mutations; keep false until audited)
# RUN_OBSERVATIONS => true = ObservationsAgent LLM notes (does not write the graph)
# JANITOR_BATCH_SIZE => relationships per Janitor LLM call when batching (default 20)
# INGEST_JANITOR_MAX_LLM_CALLS => hard cap on Janitor LLM batches/session (default 2); remainder dropped with audit
# INGEST_ARCHITECT_PER_UNIT => true = Architect sees Scout chunks (+ prior window); false = full text (legacy)
# INGEST_DEFER_JANITOR => true = batched post-Architect Janitor; false = per-create Janitor (legacy)
# INGEST_ARCHITECT_MODE => batch (default; pure tools=[] extract; escalate to tooler on fail) | schema | tooler (ReAct rollback)
# INGEST_ARCHITECT_MAX_SCHEMA_CALLS => max LLM calls/unit in schema|batch before escalate (default 3)
# INGEST_ARCHITECT_ESCALATE => true (default) allow tooler escalate on empty schema; false = partial/empty unit
# INGEST_ARCHITECT_ESCALATE_MAX_TURNS => max tool turns on escalate tooler path (default 3)
# INGEST_ARCHITECT_DENSE_ENTITY_THRESHOLD => rechunk architect unit when Scout entities >= N (default 12)
# INGEST_ARCHITECT_DENSE_MAX_CHARS => max chars per dense rechunk part (default 1200)
# INGEST_ARCHITECT_PRIOR_CONTEXT => auto (default; scratchpad for batch/schema, raw for tooler) | scratchpad | raw
# INGEST_ARCHITECT_SCRATCHPAD_TOKEN_CAP => max reference tokens for prior scratchpad (default 500)
PIPELINE_MODE="accurate"
MODELS_MODE="remote"
OCR_MODE="docparser"
AGENTIC_ARCHITECTURE="custom"
RUN_GRAPH_CONSOLIDATOR="false"
RUN_OBSERVATIONS="false"
JANITOR_BATCH_SIZE="20"
INGEST_JANITOR_MAX_LLM_CALLS="2"
INGEST_ARCHITECT_PER_UNIT="true"
INGEST_DEFER_JANITOR="true"
INGEST_ARCHITECT_MODE="batch"
INGEST_ARCHITECT_MAX_SCHEMA_CALLS="3"
INGEST_ARCHITECT_ESCALATE="true"
INGEST_ARCHITECT_ESCALATE_MAX_TURNS="3"
INGEST_ARCHITECT_DENSE_ENTITY_THRESHOLD="12"
INGEST_ARCHITECT_DENSE_MAX_CHARS="1200"
INGEST_ARCHITECT_PRIOR_CONTEXT="auto"
INGEST_ARCHITECT_SCRATCHPAD_TOKEN_CAP="500"
# Search (off by default). p50 SLO < 200 ms excluding embed.query. Requires DATA_DB=postgresql.
SEARCH_ENABLED="false"
SEARCH_USE_DENSE="true"
SEARCH_USE_BM25="true"
SEARCH_FUSION="rrf"
SEARCH_FUSION_ALPHA="0.5"
SEARCH_BM25_K1="1.2"
SEARCH_BM25_B="0.75"
CONTEXT_PASSAGE_MODE="hybrid"
GRAPH_DB="networkx"
DATA_DB="postgresql"
VECTOR_DB="postgresql"

# Ollama
# Used to configure the ollama models
# Tests with models using OpenAI's function tool calling are not currently compatible with BrainAPI
OLLAMA_HOST="localhost"
OLLAMA_PORT=11434
# OLLAMA_LLM_SMALL_MODEL="hf.co/unsloth/gpt-oss-20b-GGUF:Q4_K_M"
# OLLAMA_LLM_LARGE_MODEL="hf.co/unsloth/gpt-oss-20b-GGUF:Q4_K_M"
# OLLAMA_LLM_LARGE_MODEL="hf.co/MaziyarPanahi/Qwen3-8B-GGUF:Q4_K_M"
# OLLAMA_LLM_SMALL_MODEL="hf.co/MaziyarPanahi/Qwen3-8B-GGUF:Q4_K_M"
OLLAMA_LLM_SMALL_MODEL="hf.co/unsloth/Qwen3-14B-GGUF:Q4_K_M"
OLLAMA_LLM_LARGE_MODEL="hf.co/unsloth/Qwen3-14B-GGUF:Q4_K_M"

# Plugins
PLUGINS_DIR="plugins"
PLUGIN_REGISTRY_URL="https://registry.brain-api.dev"
PLUGIN_PUBLISHER_API_KEY="your-publisher-api-key"
PLUGIN_PUBLISHER_ID="your-publisher-id"

# MCP
MCP_OAUTH_ISSUER_URL="https://your-mcp-oauth-issuer-url.com"
MCP_RESOURCE_SERVER_URL="https://your-mcp-resource-server-url.com"

# Tracing
TRACE_TRACKER_ENABLED=false
TRACE_QUEUE_MAX_SIZE=10000
TRACE_SLOW_REQUEST_MS=1000
TRACE_AGENT_SLOW_OPERATION_MS=30000
TRACE_HEARTBEAT_INTERVAL_SECONDS=30
TRACE_HEALTH_INTERVAL_SECONDS=30
TRACE_RESOURCE_INTERVAL_SECONDS=30
TRACE_HEALTH_TIMEOUT_SECONDS=1
TRACE_AGENT_LOOP_ITERATIONS=20
TRACE_AGENT_TOOL_LOOP_ITERATIONS=20
# Compose inputs (pass this file with `docker compose --env-file`).
BRAINAPI_IMAGE="ghcr.io/lumen-labs/brainapi:v2.19.0-dev"
BRAINAPI_ENV_FILE="env.light.example"
BACKUP_DIR="/srv/brainapi/backups"
PLUGIN_FAILURE_POLICY="fail"
CORS_ALLOWED_ORIGINS=""