Spaces:
Running
Running
| title: Decidron Network Simulator | |
| emoji: 🔗 | |
| colorFrom: blue | |
| colorTo: purple | |
| sdk: docker | |
| app_port: 7860 | |
| pinned: false | |
| # Decidron Network Simulator | |
| A deterministic, browser-based simulator for **Decidron networks** — the | |
| coupled machine-learning decision units described in US Patent | |
| [US11989636B1](https://patents.google.com/patent/US11989636B1/en) | |
| ("System and method for persuadable collaborative conversational AI", | |
| Gasper & Leeds). | |
| You define simulated **sensor inputs** and **processing commands** | |
| (IF a sensor matches THEN emit an output / drive an actuator / modify the | |
| network), run the simulation, and watch the **network diagram**, | |
| **performance statistics**, and **topology-change history** update live. | |
| > This project started from Neon.ai's private `CCAI-Vibe-Demo` app and | |
| > reuses its FastAPI + React scaffold, Docker setup, and visual branding. | |
| > The CCAI multi-LLM orchestration was intentionally removed — v1 of the | |
| > simulator is purely rule-based and needs no API keys or LLM. See | |
| > [Relationship to CCAI](#relationship-to-ccai-and-the-patent). | |
| ## Patent context (brief) | |
| A **Decidron** is a machine-learning unit (MLU) with collaborative | |
| protocols that can be **coupled/networked** with other Decidrons. The | |
| patent highlights that "a MLU network coupled with real-time sensors and | |
| actuators can operate industrial controls ... and increased reliability | |
| through parallel pathways." A Decidron records its **experience**, fires | |
| **actions**, scores **results**, and can **modify its own topology**. | |
| This simulator models those concepts deterministically: | |
| | Patent concept | Simulator | | |
| | --- | --- | | |
| | Coupled MLU node / coupling | `decidron` node / directed edge | | |
| | Sensors and actuators | `sensor` / `actuator` nodes | | |
| | Experience Chains (ECDS) | per-node experience log (sensor received → rule fired → actuator acted) | | |
| | Select & perform action, results scored | command output (+ optional actuator) + performance stats | | |
| | Dynamic/extensible topology | `network_ops` applied when a command fires | | |
| | Parallel pathways / reliability | redundant couplings in the seed network | | |
| ## Prerequisites | |
| - **Docker** (recommended), or | |
| - **Python 3.12+** and **Node 22+** for local dev. | |
| ## Start the application | |
| ### Docker (recommended) | |
| ```bash | |
| cp .env.example .env # no secrets needed; defaults are fine | |
| docker compose up --build | |
| # open http://localhost:7860 | |
| ``` | |
| The container builds the React frontend, serves it as static files from | |
| FastAPI, and listens on port 7860. Override the host port with | |
| `CCAI_HOST_PORT` in `.env` if 7860 is taken. | |
| ### Local development | |
| Backend (FastAPI on :7860): | |
| ```bash | |
| cd backend | |
| python -m venv .venv | |
| .venv/Scripts/activate # Windows; use source .venv/bin/activate on macOS/Linux | |
| pip install -r requirements.txt | |
| uvicorn app.main:app --port 7860 | |
| ``` | |
| #### Hot reload (development) | |
| Do **not** rely on `uvicorn --reload` on Windows: it detects file changes | |
| but frequently fails to actually restart the worker, so it silently keeps | |
| serving stale code. Instead use the bundled dev scripts, which wrap | |
| uvicorn in `watchfiles` for a clean full restart on every change: | |
| ```powershell | |
| cd backend | |
| .\dev.ps1 # Windows | |
| ``` | |
| ```bash | |
| cd backend | |
| ./dev.sh # macOS/Linux/Git Bash | |
| ``` | |
| Both default to `app.main:app` on `127.0.0.1:7860`, watching `./app`. | |
| `watchfiles` ships with `uvicorn[standard]`. (On non-Windows hosts plain | |
| `uvicorn --reload` works too, but the scripts behave identically.) | |
| Frontend (CRA dev server on :3000, proxying to the backend): | |
| ```bash | |
| cd frontend | |
| npm install | |
| # point the dev server at the backend: | |
| echo "REACT_APP_API_URL=http://localhost:7860" > .env.development | |
| npm start | |
| ``` | |
| ## Web UI workflow | |
| 1. **View the initial network diagram** — sensors (blue boxes) feed | |
| coupled Decidrons (purple hexagons) that drive actuators (green | |
| triangles). | |
| 2. **Enter a simulated sensor input** — pick a channel (e.g. | |
| `Temperature Sensor`), enter a value (e.g. `97`), and click **Queue**. | |
| 3. **Create processing commands** — define IF (sensor + match) THEN | |
| (output, optional actuator). The match is an `operator:value` rule. | |
| 4. **Run the simulation** — click **Run Simulation**; queued inputs are | |
| evaluated against all commands. | |
| 5. **Read the results and statistics** — matched commands, emitted | |
| outputs, and per-sensor/command/output metrics appear on the right. | |
| 6. **Review the network-change diagram** — if a command applied | |
| `network_ops`, a new version is snapshotted; select any version in the | |
| **Network Modification History** to view that topology in the diagram. | |
| ## Processing command format | |
| A command is JSON: | |
| ```json | |
| { | |
| "name": "HighTempAlert", | |
| "sensor": "temperature", | |
| "match": "gte:85", | |
| "output": "Trigger failsafe review", | |
| "actuator": "actuator-1", | |
| "network_ops": [ | |
| { "op": "add_node", "node": { "id": "D3", "label": "Decidron D3", "type": "decidron" } }, | |
| { "op": "add_edge", "from": "temperature", "to": "D3" }, | |
| { "op": "remove_edge", "from": "D1", "to": "D2" } | |
| ] | |
| } | |
| ``` | |
| - `sensor` — the sensor channel/node id this command listens to. | |
| - `match` — `operator:value`, where operator is one of `contains`, | |
| `equals`, `startswith`, `endswith`, `regex`, `gt`, `gte`, `lt`, `lte`. | |
| A bare value (no operator) is treated as `contains`. | |
| - `output` — text emitted when the rule fires. | |
| - `actuator` *(optional)* — id of an actuator node to drive. | |
| - `network_ops` *(optional)* — topology changes: `add_node`, `add_edge`, | |
| `remove_edge` (edges use `from`/`to`). | |
| ## API reference | |
| All endpoints are under `/api/decidron`. | |
| | Method | Path | Purpose | | |
| | --- | --- | --- | | |
| | GET | `/api/decidron/network` | Current network + vis-network diagram JSON | | |
| | POST | `/api/decidron/sensors/input` | Queue a simulated sensor input | | |
| | GET | `/api/decidron/commands` | List processing commands | | |
| | POST | `/api/decidron/commands` | Create a processing command | | |
| | POST | `/api/decidron/run` | Process queued (or supplied) inputs | | |
| | GET | `/api/decidron/stats` | Performance statistics | | |
| | GET | `/api/decidron/history` | Topology-change snapshots | | |
| | POST | `/api/decidron/reset` | Reset to the seed network | | |
| ### curl examples | |
| ```bash | |
| # View the initial network | |
| curl http://localhost:7860/api/decidron/network | |
| # Queue a sensor reading and run | |
| curl -X POST http://localhost:7860/api/decidron/sensors/input \ | |
| -H 'Content-Type: application/json' \ | |
| -d '{"channel":"temperature","value":"97"}' | |
| curl -X POST http://localhost:7860/api/decidron/run \ | |
| -H 'Content-Type: application/json' -d '{}' | |
| # Create a command | |
| curl -X POST http://localhost:7860/api/decidron/commands \ | |
| -H 'Content-Type: application/json' \ | |
| -d '{"name":"LowTemp","sensor":"temperature","match":"lt:0","output":"Freeze warning"}' | |
| # Run with inline inputs (bypasses the queue) | |
| curl -X POST http://localhost:7860/api/decidron/run \ | |
| -H 'Content-Type: application/json' \ | |
| -d '{"inputs":[{"channel":"temperature","value":"-5"}]}' | |
| # Stats and history | |
| curl http://localhost:7860/api/decidron/stats | |
| curl http://localhost:7860/api/decidron/history | |
| ``` | |
| ## Config & seed files | |
| - [`backend/app/config.py`](backend/app/config.py) — minimal settings | |
| (`CORS_ORIGINS`). | |
| - [`backend/app/data/decidron/default_network.json`](backend/app/data/decidron/default_network.json) | |
| — the starter network (sensor → coupled Decidrons → actuator, with a | |
| redundant coupling). | |
| - [`backend/app/data/decidron/sample_commands.json`](backend/app/data/decidron/sample_commands.json) | |
| — example commands (one drives an actuator, one reconfigures the | |
| topology). Edit these to change the simulation's starting state. | |
| ## Adding files in Cursor | |
| - **Open the repo as a workspace**: File → Open Folder → `decidron-simulator`. | |
| - **New file**: right-click a folder in the Explorer → New File. | |
| - **Drag & drop** files from your file manager into the Explorer. | |
| - **Ask Cursor in chat**: e.g. "Add `backend/app/decidron/alerts.py`". | |
| - **Terminal**: `New-Item backend/app/decidron/alerts.py` (PowerShell) or | |
| `touch backend/app/decidron/alerts.py` (bash). | |
| ## Relationship to CCAI and the patent | |
| v1 deliberately omits the patent's full pipeline: ECDS context/memory | |
| augmentation, the embedded CCAI per Decidron, Theory-of-Mind, | |
| persuadability, and action-reinforcement learning. A future version | |
| could make Decidrons LLM-driven by porting the orchestration and LLM | |
| clients from the `CCAI-Vibe-Demo` reference app. The simulator's logic is | |
| isolated under `backend/app/decidron/` and | |
| `frontend/src/components/decidron/` to keep that door open. | |
| ## Project layout | |
| ``` | |
| backend/ | |
| app/ | |
| main.py # FastAPI app: CORS, /api/health, SPA serving | |
| config.py # minimal settings | |
| api/decidron.py # REST router | |
| decidron/ # simulation engine (models, network, engine, stats, diagrams) | |
| data/decidron/ # seed network + sample commands | |
| frontend/ | |
| src/ | |
| App.js # shell | |
| components/Header.js # branded header | |
| components/decidron/ # simulator UI (diagram, forms, tables, history) | |
| utils/api.js # API client | |
| styles/ # branding + simulator CSS | |
| Dockerfile, docker-compose.yml | |
| ``` | |
| ## Hugging Face Space (BrainForge) | |
| Hosted as a Docker Space on [BrainForge/decidron-simulator](https://huggingface.co/spaces/BrainForge/decidron-simulator) (`app_port: 7860`, `cpu-basic`). No API keys or secrets are required. | |
| Deploy from the **`master`** branch (merge `dev-cursor` into `master` on GitHub first): | |
| ```bash | |
| git remote add hf https://huggingface.co/spaces/BrainForge/decidron-simulator | |
| git checkout master && git pull origin master | |
| git push hf master:main | |
| ``` | |
| The Space builds from the root `Dockerfile` (React frontend → `backend/static`, FastAPI on port 7860). | |
| ## Troubleshooting | |
| - **Port 7860 in use** — set `CCAI_HOST_PORT` in `.env`, or run uvicorn | |
| on another port. | |
| - **Frontend can't reach the API in dev** — ensure | |
| `REACT_APP_API_URL=http://localhost:7860` is set in | |
| `frontend/.env.development` and the backend is running. | |
| - **CORS errors** — add your origin to `CORS_ORIGINS` in `.env`. | |
| - **Diagram doesn't render** — vis-network needs the bundled assets from | |
| `npm install`; re-run it if you cloned without building. | |