This README is intentionally trimmed to be a quick-start entry.
Detailed documentation has been moved to:
- Full architecture and capability schema:
doc/Schema.md - Change log and evolution history:
doc/LOG.md - Layered research index:
doc/Research-Index.md - Enhancement roadmap (A/B/C/D/E):
doc/Enhancement-Roadmap.md - Layer 1 research:
doc/Research-L1-Serving-and-Dynamic-Loading.md - Layer 2 research:
doc/Research-L2-Scheduling-ColdStart-and-GPU-Pooling.md - Layer 3 research:
doc/Research-L3-Routing-Cascade-and-MultiModel-Orchestration.md
Architecture design details, system-shape sections, capability tiers, feature deep-dives, and troubleshooting guidance are now consolidated in doc/Schema.md, organized as:
- Front chapters: current architecture design
- Later chapters: implemented/planned capabilities, feature details, and troubleshooting
Local LLM Control Plane is a local multi-node LLM control plane based on controller + agent + managed node, providing unified model/node/runtime/task management.
- Built for local/LAN multi-node model operations
- Short-term position: a model resource scheduling system; long-term evolution: a multi-model orchestration runtime for complex tasks
- Controller owns unified API, state, scheduling, and orchestration
- Agent executes node-local actions and reports facts back
- Supports Docker/Portainer/LM Studio runtime integrations
- Provides Web console + REST API + SQLite persistence
Target directory example: /tank/docker_data/model_control_plane
sudo mkdir -p /tank/docker_data/model_control_plane
sudo chown -R $USER:$USER /tank/docker_data/model_control_plane
rsync -a --delete /home/whoami/Dev/model-control-plane/ /tank/docker_data/model_control_plane/
cd /tank/docker_data/model_control_planeInitialize:
cp resources/docker/compose.example.env .env
mkdir -p resources/config resources/models testsystem/logs
touch resources/config/controller.db
chmod 777 resources/config testsystem/logs
chmod 666 resources/config/controller.dbStart:
# Core (recommended, local-agent on controller node is enabled by default)
./scripts/one-click-up.sh
# Explicitly enable local-agent (same as default behavior)
./scripts/one-click-up.sh --local-agent
# Disable local-agent (compatibility/troubleshooting only; falls back to controller direct/self-check)
./scripts/one-click-up.sh --no-local-agent
# Core + addons
./scripts/one-click-up.sh --addons
# Core + download containers
./scripts/one-click-up.sh --download
# Core + vLLM runtime template container
./scripts/one-click-up.sh --vllmVerify:
curl -sS http://127.0.0.1:59081/healthz
curl -sS http://127.0.0.1:59081/api/v1/models
curl -sS http://127.0.0.1:59081/api/v1/nodesStop:
./scripts/one-click-down.sh- Orchestration:
docker-compose.yml - Build:
Dockerfile - Control-plane config:
resources/config/config.example.yaml - Compose env template:
resources/docker/compose.example.env - Gateway config:
resources/nginx/nginx.example.conf - Frontend:
resources/web/index.html/resources/web/app.css/resources/web/app.js - One-click scripts:
scripts/one-click-up.sh/scripts/one-click-down.sh - Architecture schema:
doc/Schema.md - Change log:
doc/LOG.md - Research index:
doc/Research-Index.md - Enhancement roadmap:
doc/Enhancement-Roadmap.md
MCP_EXTERNAL_PORT: external gateway port (default59081)MCP_SQLITE_PATH: SQLite file pathMCP_MODEL_DIR_HOST: host model directory (default./resources/models)MCP_MODEL_ROOT_DIR: in-container model directory (default/opt/controller/models)MCP_TEST_LOG_ROOT_HOST: host test log directory (default./testsystem/logs)MCP_TEST_LOG_ROOT_DIR: in-container test log directory (default/opt/controller/test-logs)MCP_LMSTUDIO_ENDPOINT: LM Studio endpointMCP_DOCKER_ENDPOINT: Docker endpointMCP_CONTAINER_HOST_ALIAS: in-container host alias (defaulthost.docker.internal)MCP_VLLM_EXTERNAL_PORT: vLLM external portMCP_VLLM_MODEL: default vLLM modelHUGGING_FACE_HUB_TOKEN: optional token for private/gated models
Base:
GET /healthzGET /api/v1/version
Nodes and models:
GET /api/v1/nodesGET /api/v1/modelsGET /api/v1/models/{id}POST /api/v1/models/{id}/loadPOST /api/v1/models/{id}/unloadPOST /api/v1/models/{id}/startPOST /api/v1/models/{id}/stop
Runtime templates:
GET /api/v1/runtime-templatesPOST /api/v1/runtime-templates/validatePOST /api/v1/runtime-templates
Runtime objects (instance-first):
GET /api/v1/runtime-bindingsGET /api/v1/runtime-instancesGET /api/v1/runtime-instances/{id}GET /api/v1/runtime-instances/{id}/tasksGET /api/v1/runtime-instances/{id}/summaryGET /api/v1/runtime-instances/{id}/reconcile-summary
Agents and tasks:
GET /api/v1/agentsPOST /api/v1/agents/registerPOST /api/v1/agents/{id}/heartbeatPOST /api/v1/agents/{id}/capabilitiesGET /api/v1/agents/{id}/tasks/nextPOST /api/v1/agents/{id}/tasks/{taskID}/reportGET /api/v1/tasksGET /api/v1/tasks/{id}POST /api/v1/tasks/runtime/startPOST /api/v1/tasks/runtime/stopPOST /api/v1/tasks/runtime/restartPOST /api/v1/tasks/runtime/refreshPOST /api/v1/tasks/agent/runtime-readinessPOST /api/v1/tasks/agent/node-local
Node execution task types (submitted via POST /api/v1/tasks/agent/node-local):
agent.runtime_precheckagent.resource_snapshotagent.docker_inspectagent.docker_start_containeragent.docker_stop_container
Test runs:
GET /api/v1/test-runs/scenariosGET /api/v1/test-runsGET /api/v1/test-runs/{id}POST /api/v1/test-runs
Scripted smoke checks (local-agent path):
scripts/controller_api_smoke.sh <base_url> [token] [agent_id] [model_id]testsystem/scenarios/stage0_to_b_full_smoke.shtestsystem/scenarios/stage0_runtime_object_smoke.shtestsystem/scenarios/local_agent_execution_smoke.shtestsystem/scenarios/e5_embedding_smoke.shtestsystem/scenarios/e5_gating_blocked_smoke.sh
Stage A closure (current):
agent.runtime_precheckis now manifest-driven preflight (mount/env/script/port/compatibility/policy/custom_bundle-min checks).- Agent check/execution task details now use a unified structured envelope (
overall_status + structured_result + manifest_summary). - Agent outcomes now land on
RuntimeInstancefirst (precheck/readiness/drift/resolved state + latest task summary). Nodekeeps node-level resource/agent liveness facts;Modelprimarily consumes instance projection.testsystem/scenarios/local_agent_execution_smoke.shnow covers the Stage A closure chain on the default E5 sample model.- Stage B kickoff is now in place: a controller-side
instance-first reconcileloop continuously updatesdesired/observed/readiness/health/driftandlast_reconciled_at. precheck_*is now a formal reconcile input, andagent_offline/observation_staleare surfaced in instance-level reconcile conclusions.- Stage B deepening is now active:
RuntimeInstancenow carries structuredconflict/gating/last_plan_*state, and reconcile emits minimalload/unload/deferred/blockedlifecycle plans. runtime.start/restartnow uses gating fail-fast (blocked requests are rejected before enqueue), and planner metadata is attached to runtime task payload/detail.- Added
testsystem/scenarios/e5_gating_blocked_smoke.shto validate the chain: binding/script conflict -> gating blocked -> runtime.start fail-fast. - Added
stage0_runtime_object_smokeandstage0_to_b_full_smoketo cover Stage 0 through Stage B in one test matrix. - The web console now supports manual scenario triggering via a scenario selector, including a quick "Stage 0~B" run entry.
- See
doc/Schema.md(Stage B semantics) anddoc/LOG.md(this round changes).