v2.11.0 — Agentic chat · Claude/ChatGPT for your lights
Highlights
The Chat tab is now the default landing on the web UI. Replaces the v2.2-era one-shot interpreter with a proper Claude/ChatGPT-style conversation where the LLM has access to 39 lighting tools and plans multi-step operations autonomously.
Every web-UI user now gets the same agentic power MCP clients have had since v2.2.
What the user sees
You: Set up three-point lighting with tungsten key, daylight fill,
magenta back, and save it as photoshoot.
Agent: [list_groups] → 3 groups: key-lights, fill-lights, back-lights ✓
[palette] → key:3200 fill:5600 back:magenta · 8 fixtures ✓
[snapshot_scene] → Scene 14 saved · workspace updated ✓
Done. Three-point setup applied and saved as 'photoshoot' —
tungsten key, daylight fill, magenta back. Recall it any time
with activate_scene.
Tool calls render inline as collapsible cards (mono code, tungsten amber for tool name, error styling for failures). Conversation persists across page reloads in localStorage.
Backend — POST /api/chat
- 39-tool curated registry mirroring the MCP catalog. Schemas declared once, consumed by both Anthropic and OpenAI loops.
- Tools dispatch internally via Flask's
test_clientinto our own endpoints — so behavior matches MCP exactly with no code duplication. - Anthropic loop: native
tool_useblocks, boundedmax_iters=10. System prompt teaches the agent which abstractions to prefer (palette / color_temperature / apply_template over set_channel). - OpenAI loop: translates between Anthropic-shaped messages and OpenAI's function-calling shape, keeps history in Anthropic-style for the client.
- Ollama not supported — tool-calling varies too much by model.
- Stateless: client owns the conversation history.
Frontend — new Chat tab
- Default tab is now Chat. Old AI Control tab renamed to Quick Commands and preserved for users who like the one-shot pattern.
- Message bubbles (user right, assistant left), tool calls as collapsible inline cards
- Composer: textarea with Enter-to-send / Shift-Enter-for-newline, Clear button
- Welcome screen with 4 suggestion chips: Show me my rig / Three-point lighting / Sunset cue list / Diagnose the rig
- "Thinking…" pending indicator
- Auto-refreshes the relevant list tabs when the agent's tools mutate them (creates a group → drawer updates, saves a scene → grid updates)
Tool surface (39 curated, vs MCP's 48)
| Category | Tools |
|---|---|
| Discovery (9) | list_fixtures, list_groups, list_scenes, list_templates, list_chases, list_cue_lists, get_active_cue_lists, get_channel_values, get_status |
| Quick actions (10) | activate_scene, apply_template, adjust_brightness, adjust_color, color_temperature, palette, strobe, fade, blackout, generate_scene, snapshot_scene |
| Scene mgmt (4) | describe_scene, delete_scene, rename_scene, duplicate_scene |
| Group mgmt (5) | create_group, delete_group, update_group, add_fixtures_to_group, remove_fixtures_from_group |
| Chases (5) | describe_chase, create_chase, delete_chase, start_chase, stop_chase |
| Cue lists (5) | describe_cue_list, create_cue_list, delete_cue_list, go_cue_list, stop_cue_list |
| Diagnostics (3) | get_system_info, test_dmx, get_logs |
| Setup (1) | identify_fixture |
Omitted intentionally:
set_channel— power-user escape hatch, agent shouldn't need itbatch_action— the agent's tool-use loop is the batching mechanismupdate_cue_list— agent can delete + create; smaller surfacesave_scenewith raw scene_xml —snapshot_sceneis friendlier
Configuration
Add to .env:
AI_PROVIDER=anthropic # or openai
AI_API_KEY=sk-...
AI_MODEL=claude-3-5-sonnet-20241022 # or gpt-4.1, etc.No new package dependencies. Reuses the existing requests library.
Upgrade
git pull
./lightsctl.sh control-restart # picks up /api/chat + new UI templateCompatibility
- No breaking changes. Every existing endpoint, MCP tool, and UI feature behaves identically.
- New route
/api/chatis additive — previously unused path. - The old AI Control tab (one-shot
/api/command) is renamed to Quick Commands but functionally unchanged. Power users who prefer the simple shape can keep using it. - Chat history is in localStorage (
lp_chat_history_v1), client-side. Survives page reloads; doesn't sync across devices.
Documentation
README.md— new "Agentic Chat (v2.11+)" sectiondocs/CONTROL_SERVER_ARCHITECTURE.md—/api/chatendpoint documented with shape + provider matrix + tool dispatch model- Wiki
Control-Serverupdated with the new Chat tab + endpoint - Marketing FAQ — new "Is there a chat interface like Claude or ChatGPT but for my lights?" entry
What's intentionally NOT in this release
- Streaming responses — server returns the full final state after the loop completes. Streaming would require SSE / chunked transfer, which composes naturally with #10 (SSE event stream) when that ships.
- Mid-conversation tool approval — agent acts immediately on tool calls. A "this is a destructive action, confirm?" gate would be the obvious next step for production deployments.
- Server-side session storage — purely client-side via localStorage. Server-side sessions would enable cross-device continuity but add state management. Easy follow-up.
Roadmap status
Tier 3 remaining: