Command Center
The command center is the voice command orchestrator. It receives transcribed text (or raw audio) from nodes, routes it through the LLM for intent parsing and tool selection, executes the appropriate command, and returns the response. It also manages node registration, user memories, and speaker identification.
Quick Reference
|
|
| Port |
7703 |
| Health endpoint |
GET /api/v0/health |
| Source |
jarvis-command-center/ |
| Framework |
FastAPI + Uvicorn |
| Database |
PostgreSQL (pgvector required — see Dependencies) |
| Tier |
2 - Command Processing |
API Endpoints
| Method |
Path |
Description |
GET |
/api/v0/health |
Health check |
POST |
/api/v0/command |
Process a voice command (text or audio) |
POST |
/api/v0/nodes/register |
Register a new node (admin) |
GET |
/api/v0/nodes |
List registered nodes |
GET |
/api/v0/memories |
List user memories |
POST |
/api/v0/memories |
Create a user memory |
DELETE |
/api/v0/memories/{id} |
Delete a user memory |
Key Components
- Prompt Engine (
app/core/prompt_engine.py) -- builds system prompts with speaker context and memories
- Tool Parser (
app/core/tool_parser.py) -- extracts tool calls from LLM responses
- Tool Executor (
app/core/tool_executor.py) -- dispatches tool calls to the appropriate service
- Speaker Resolver (
app/core/utils/speaker_resolver.py) -- maps speaker IDs to display names
- Memory Service (
app/services/memory_service.py) -- persistent user memory CRUD
not_for_me Detection
The command center uses a <not_for_me/> sentinel in LLM responses to reject transcripts that were not directed at Jarvis. Since jarvis-command-center#11, the classification behavior is conditional on the direction hint the node ships with each transcript.
Direction Hints
The node's pre-wake VAD window (~5 s) generates a [direction hint:] line included with each transcript. Values:
| Hint |
Meaning |
| (absent) |
Room state unknown |
| quiet / directed |
Speech was the first sound after silence — likely a deliberate address |
| ambient / overheard |
Continuous room conversation was already underway when the wake word fired |
Borderline Case Policy
NOT_FOR_ME_INSTRUCTION in app/core/prompt_providers/shared/core_rules.py branches on the hint:
| Direction hint |
Borderline policy |
| None or quiet |
Answer. Vague phrasing, unusual word choice, a short "thanks" or "never mind" all count as addressed to Jarvis. <not_for_me/> is reserved for clear ambient capture, not for ambiguous requests. |
| Ambient / overheard |
Silence. Without explicit addressing ("Jarvis …", "hey assistant …") or a clear imperative or question, emit <not_for_me/>. The node has already done the acoustic work; the prompt defers to that signal on borderline transcripts. |
Paired Node Behavior
When the command center responds with <not_for_me/>, the node holds its wake gate closed for a configurable cool-down (default 20 s, controlled by not_for_me_quiet_seconds in the node's config.json). This prevents the next sentence of the same side conversation from re-triggering wake. See the node-setup Wake Behavior section for details.
Environment Variables
Core
| Variable |
Description |
DB_URL |
PostgreSQL connection string (must point to a pgvector-enabled instance) |
MIGRATIONS_DATABASE_URL |
PostgreSQL connection string for Alembic migrations |
PORT |
API port (default 7703) |
ADMIN_API_KEY |
API key for admin endpoints |
Authentication
| Variable |
Description |
JARVIS_AUTH_APP_ID |
App identity for service-to-service auth (default command-center) |
JARVIS_AUTH_APP_KEY |
App key for service-to-service auth |
JARVIS_AUTH_SECRET_KEY |
JWT secret key — must match AUTH_SECRET_KEY in jarvis-auth. Required for mobile app JWT validation. |
NODE_AUTH_CACHE_TTL |
Auth validation cache TTL in seconds (default 60) |
Service Discovery
| Variable |
Description |
JARVIS_CONFIG_URL |
Config service URL (default http://localhost:7700) |
LLM Proxy
| Variable |
Description |
JARVIS_LLM_PROXY_API_VERSION |
LLM proxy API version (default 1) |
JARVIS_MODEL_INTERFACE |
Model interface class: JarvisAdapterModel or JarvisModel |
JARVIS_SMALL_MODEL_MODE |
Use smaller/faster model for real-time responses (True) |
Tool Classifier (fastText router)
The command center uses a fastText model to pre-route commands to the right tool before hitting the LLM, reducing latency.
| Variable |
Description |
JARVIS_TOOL_CLASSIFIER_ENABLED |
Enable the fastText tool classifier (True) |
JARVIS_TOOL_CLASSIFIER_MODEL_PATH |
Path to the compiled .bin classifier model |
JARVIS_TOOL_CLASSIFIER_EXTRA_TRAINING_PATH |
Path to additional JSONL training data |
JARVIS_TOOL_CLASSIFIER_MIN_CONFIDENCE |
Minimum confidence to use classifier result (default 0.6) |
JARVIS_TOOL_ROUTER_FILTER_MIN_CONFIDENCE |
Minimum confidence to include a tool in the candidate list (default 0.85) |
Prompt Configuration
| Variable |
Description |
JARVIS_SYSTEM_PROMPT_PROVIDER |
Override the default system prompt provider class |
JARVIS_PARAMETER_INFERENCE_PROMPT_PROVIDER |
Override the parameter inference prompt provider class |
JARVIS_TRANSCRIPTION_CLEANUP_ENABLED |
Apply LLM-based cleanup to raw transcription before routing (False) |
JARVIS_PROMPT_INCLUDE_ANTIPATTERNS |
Include anti-pattern examples in the system prompt (True) |
JARVIS_PROMPT_INCLUDE_PARAM_DESCRIPTIONS |
Include parameter descriptions in the system prompt (True) |
OAuth
| Variable |
Description |
JARVIS_EXTERNAL_URL |
External URL used as the OAuth callback base (e.g. https://jarvis.yourdomain.com). Falls back to request headers if unset. |
JARVIS_TOKEN_ENCRYPTION_KEY |
32-byte hex key for AES-256-GCM encryption of stored OAuth tokens. Falls back to SHA-256(SECRET_KEY) if unset. |
Logging
| Variable |
Description |
JARVIS_APP_ID |
App identity for centralized logging (default command-center) |
JARVIS_APP_KEY |
App key for centralized logging |
JARVIS_LOG_CONSOLE_LEVEL |
Console log level (default INFO) |
JARVIS_LOG_REMOTE_LEVEL |
Remote log level sent to jarvis-logs (default DEBUG) |
Dependencies
- PostgreSQL (
pgvector/pgvector:pg15 required) -- nodes, memories, command history. Alembic migration e9f0a1b2c3d4 runs CREATE EXTENSION IF NOT EXISTS vector and adds a vector(384) embedding column with an HNSW index on user_memories. Stock postgres:15 does not ship the vector extension and will abort on fresh install with extension "vector" does not exist. Use pgvector/pgvector:pg15 (drop-in for postgres:15). The installer and generated docker-compose.prod.yaml both use this image automatically.
- jarvis-auth -- node auth and app-to-app auth
- jarvis-config-service -- service discovery
- jarvis-llm-proxy-api -- LLM inference for intent parsing
- jarvis-logs -- structured logging
- jarvis-whisper-api -- speech-to-text (optional, for audio input)
- jarvis-notifications -- push notifications for deep research results (optional)
- jarvis-tts -- text-to-speech (optional)
- jarvis-web-scraper -- web content extraction for deep research (optional)
Dependents
- jarvis-node-setup -- Pi Zero voice nodes send commands here
- jarvis-node-mobile -- mobile app sends commands here
Impact if Down
No voice commands are processed. Nodes cannot submit audio or text for processing. All command routing, memory, and speaker identification is unavailable.