一键导入
backend-architecture
Python backend modules, chat request lifecycle, SSE format, and API endpoints
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Python backend modules, chat request lifecycle, SSE format, and API endpoints
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Install ComfyUI Assistant as a ComfyUI custom node. Use when performing or troubleshooting installation (clone, Python deps, frontend build, restart).
For complex user requests — evaluate, investigate, ask questions, propose a plan, accept modifications, then execute. Use when the request is multi-step, ambiguous, or high-impact.
Workflow execution and complete workflow generation tools (executeWorkflow, applyWorkflowJson). Use when the user wants to run a workflow or build a complete workflow from a description.
System prompt assembly from system_context, user_context, and environment sources
Generate a Product Requirements Document (PRD) for a new feature. Use when planning a feature, starting a new project, or when asked to create a PRD. Triggers on: create a prd, write prd for, plan this feature, requirements for, spec out.
When the user asks to create or design a skill, follow a clear process: clarify intent, draft name/description/instructions, then call createSkill. Optionally offer to create a skill when you automate a procedure they might want to reuse.
| name | backend-architecture |
| description | Python backend modules, chat request lifecycle, SSE format, and API endpoints |
| version | 0.0.1 |
| license | MIT |
The Python backend lives at the project root. ComfyUI loads __init__.py as a custom node extension and registers aiohttp routes.
| File | Purpose |
|---|---|
__init__.py | Entry point + orchestrator: route registration and composition of specialized backend modules |
message_transforms.py | Core layer: pure message transformations across UI/OpenAI/Anthropic/CLI formats |
context_management.py | Core layer: context trimming, truncation, token estimation, and compaction |
chat_utilities.py | Core/API helper layer: shared chat helpers and context-too-large detection |
provider_streaming.py | Provider layer: provider-specific streaming generators (OpenAI/Anthropic/CLI adapters) |
cli_providers.py | Provider layer: CLI binary discovery for claude/codex/gemini providers |
sse_streaming.py | API layer: AI SDK SSE headers and event serialization helpers |
slash_commands.py | Features layer: slash command handling (/provider, /skill, /persona list, /persona <name> switch, /persona create conversational flow, /persona del <name> delete) |
api_handlers.py | Environment, docs, and skills API handlers (factory pattern via create_handlers) |
agent_prompts.py | get_system_message() -- assembles system_context + environment + user_context |
tools_definitions.py | TOOLS list in OpenAI function calling format; get_tools(), get_tool_names() |
user_context_loader.py | load_system_context(), load_user_context(), load_environment_summary(), load_skills() |
user_context_store.py | SQLite store (context.db): rules, preferences, onboarding state |
provider_store.py | SQLite store (providers.db): provider CRUD, validation, active provider |
provider_manager.py | Runtime provider selection, DB/env fallback, provider connection tests |
environment_scanner.py | scan_environment(), node/package/model scanning, search, cache management |
skill_manager.py | Create/list/delete/update user skills in user_context/skills/ |
documentation_resolver.py | Resolve documentation for node types and topics |
Core Layer
├── message_transforms.py
├── context_management.py
└── chat_utilities.py
Provider Layer
├── provider_streaming.py
└── cli_providers.py
Features Layer
├── slash_commands.py
└── sse_streaming.py
Orchestrator
└── __init__.py (wires modules, registers routes, selects provider path)
__init__.py
├── message_transforms.py
├── context_management.py
├── chat_utilities.py
├── provider_streaming.py
│ ├── message_transforms.py
│ ├── context_management.py
│ └── sse_streaming.py
├── cli_providers.py
├── sse_streaming.py
└── slash_commands.py
chat_api_handler LifecycleThe main handler in __init__.py for POST /api/chat:
messages array from JSON body_ui_messages_to_openai(messages) transforms AI SDK UIMessage format to OpenAI chat completions format (handles tool invocations, states, legacy format)importlib.reload(agent_prompts) for hot-reload during developmentload_system_context(), load_environment_summary(), load_user_context()get_system_message(system_context, user_context, env_summary)LLM_REQUEST_DELAY_SECONDS (default 1.0s) rate limitingRequired headers:
Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive
X-Vercel-AI-UI-Message-Stream: v1
Event sequence for a typical response:
data: {"type":"start","messageId":"msg_..."}
data: {"type":"reasoning-start","id":"reasoning_..."} # if <think> tags
data: {"type":"reasoning-delta","id":"...","delta":"..."}
data: {"type":"reasoning-end","id":"reasoning_..."}
data: {"type":"text-start","id":"text_..."}
data: {"type":"text-delta","id":"text_...","delta":"I'll add a KSampler..."}
data: {"type":"text-end","id":"text_..."}
data: {"type":"tool-input-available","toolCallId":"call_...","toolName":"addNode","input":{...}}
data: {"type":"finish","finishReason":"tool-calls"}
data: [DONE]
Finish reasons: stop, tool-calls, length, content-filter.
| Endpoint | Method | Handler | Purpose |
|---|---|---|---|
/api/chat | POST | chat_api_handler | Main chat (SSE stream) |
/api/user-context/status | GET | user_context_status_handler | Onboarding status check |
/api/user-context/onboarding | POST | user_context_onboarding_handler | Save onboarding data |
/api/environment/scan | POST | environment_scan_handler | Trigger full environment scan |
/api/environment/summary | GET | environment_summary_handler | Brief text for prompt injection |
/api/environment/nodes | GET | environment_nodes_handler | Search nodes (?q=&category=&limit=) |
/api/environment/models | GET | environment_models_handler | List models (?category=) |
/api/environment/packages | GET | environment_packages_handler | List custom node packages |
/api/environment/docs | GET | environment_docs_handler | Fetch docs (?topic=&source=) |
/api/user-context/skills | POST | skills_handler | Create user skill |
/api/user-context/skills | GET | skills_handler | List user skills |
/api/user-context/skills/{slug} | DELETE | skill_delete_handler | Delete skill |
/api/user-context/skills/{slug} | PATCH | skill_update_handler | Update skill |
/api/providers/status | GET | provider handlers | Wizard status / first-time check |
/api/providers | GET/POST | provider handlers | List/create providers |
/api/providers/{name} | PATCH/DELETE | provider handlers | Update/delete provider |
/api/providers/{name}/activate | POST | provider handlers | Set active provider |
/api/providers/{name}/test | POST | provider handlers | Test saved provider |
/api/providers/test-config | POST | provider handlers | Test unsaved config payload |
/api/providers/cli-status | GET | provider handlers | Detect CLI availability/path |
| Variable | Default | Purpose |
|---|---|---|
LLM_PROVIDER | auto-detect | Optional provider selector: openai, anthropic, claude_code, codex, or gemini_cli |
OPENAI_API_KEY | (optional) | OpenAI-compatible provider API key |
OPENAI_MODEL | gpt-4o-mini | OpenAI-compatible model name |
OPENAI_API_BASE_URL | https://api.openai.com/v1 | Any OpenAI-compatible provider URL |
ANTHROPIC_API_KEY | (optional) | Anthropic API key for direct Messages API calls |
ANTHROPIC_MODEL | claude-sonnet-4-5 | Anthropic model name |
ANTHROPIC_BASE_URL | https://api.anthropic.com | Anthropic API URL |
ANTHROPIC_MAX_TOKENS | 4096 | Anthropic max output tokens |
CLAUDE_CODE_COMMAND | claude | Claude Code CLI executable |
CLAUDE_CODE_MODEL | (empty) | Optional Claude Code model alias |
CODEX_COMMAND | codex | Codex CLI executable |
CODEX_MODEL | (empty) | Optional Codex model alias |
GEMINI_CLI_COMMAND | gemini | Gemini CLI executable |
GEMINI_CLI_MODEL | (empty) | Optional Gemini model name |
CLI_PROVIDER_TIMEOUT_SECONDS | 180 | Timeout for CLI provider subprocess calls |
LLM_REQUEST_DELAY_SECONDS | 1.0 | Rate-limit delay before each LLM call |
COMFY_ASSISTANT_LOG_LEVEL | INFO | Logging level |
api_handlers.py (signature: async def handler(request: web.Request) -> web.Response)create_handlers()register_routes() (maps path + method to handler)See "chat_api_handler Lifecycle" above. Messages arrive as AI SDK UIMessages, get converted to OpenAI format, context is assembled, LLM is called with streaming, and SSE events flow back.
Two ways: (1) LLM_REQUEST_DELAY_SECONDS adds a delay before each LLM call; (2) if OpenAI-compatible provider returns HTTP 429, the handler catches it and streams a friendly "Rate limited" text message instead of an error.
Primary path: configure providers in the wizard (/provider-settings) and switch with:
/provider list/provider set <name>Persona creation path (local, no LLM/provider call required):
/persona <name> switches preferences.active_persona and activates the persona's configured provider/persona lists available personas and marks the active one/persona create (or plain message create persona)<!-- local:persona-create {...} -->) so the next user turn can continue deterministically/persona del <name> removes user_context/personas/<slug>/; if deleted persona was active, backend clears preferences.active_persona and falls back to default SOUL behaviorFallback path: set LLM_PROVIDER in .env:
openai: use OPENAI_API_KEY (+ optional OPENAI_API_BASE_URL, OPENAI_MODEL)anthropic: use ANTHROPIC_API_KEY (+ optional ANTHROPIC_MODEL)claude_code: use local claude CLI (authenticated)codex: use local codex CLI (authenticated)gemini_cli: use local gemini CLI (authenticated)If no active DB provider exists, backend falls back to .env auto-selection.
architecture-overview -- high-level system map and flow diagramsbackend-tools-declaration -- how tools are declared and syncedsystem-and-user-context -- system prompt assembly detailsenvironment-and-models -- environment scanning and caching