This document explains the core components of Silhouette, how they interact, and how to extend the system.
Silhouette is a Hybrid Cognitive Architecture that combines:
- Node.js Supervisor ("Janus"): Manages the lifecycle, auto-updates, and crash recovery.
- Orchestrator (Core): The brain that manages agents, memory, and tools.
- Microservices: Specialized Python services for heavy lifting (Reasoning, Voice, Vision).
- Docker Infrastructure: Persistence layer (Neo4j, Redis, Qdrant).
"The Two-Faced Guardian"
- Role: Process Supervisor.
- Responsibility: It launches
npm run server, watches for crashes, and handles auto-restarts. - Persistence: Janus itself is stateless. It does not hold memory. Restarting Janus does not lose agent memories (which are in DBs/Files).
- Why it's here: To allow the AGI to update its own code and restart itself without killing the parent process.
"The Conductor"
- Role: Central Logic Hub.
- Responsibility: Routes messages, manages the "Cognitive Loop" (Introspection), and coordinates specialist agents.
- Integration: This is where new capabilities are wired in.
"The Intuition"
- Role: Graph Analysis Microservice (Python/FastAPI).
- Responsibility: Connects to connected Neo4j to find "hidden links" between concepts.
- Status: Stateless logic. Data lives in Neo4j.
User Question: "Where do I integrate a new API? Do I lose persistence?"
Answer: It depends on what the API does.
Location: services/llm/multiLLMProvider.ts
- Add the provider to
LLMProvidertype. - Implement the call logic in
generateResponse. - Add API Key to
.env. Persistence: No effect. The LLM is just a processor. Memories are stored indata/anddb/.
Location: services/tools/
- Create a new tool file (e.g.,
marketTool.ts). - Register it in
services/tools/toolRegistry.ts. - Add it to the agent's
TOOLS.mdallowlist. Persistence: Tools are stateless. Results are saved to Memory by the agent if needed.
Location: reasoning_engine/ (or a new Python service)
- If it needs GPU/Python, run it as a microservice (like the Reasoning Engine).
- Expose a local HTTP endpoint (e.g.,
http://localhost:8100/generate). - Call it from Node.js using
fetch. Persistence: If the model needs to save state, map a volume in Docker (e.g.,-v ./data/models:/app/data).
To run Silhouette in Docker but give it "Root-like" powers:
- Filesystem: We bind-mount the project directory so code/data persist on the host. origin
- Network: We use
network_mode: "host"(Linux) or map sensitive ports to allow it to see local services. - GPU: We pass GPU access to the container.
See docker-compose.prod.yml for the production configuration.