{
  "markdown": "# SlotFlow\n\nEnglish | [Chinese](./README_zh.md)\n\n[![Python](https://img.shields.io/badge/Python-3.12--3.13-3776AB?logo=python&logoColor=white)](./backend/pyproject.toml)\n[![Node.js](https://img.shields.io/badge/Node.js-22%2B-339933?logo=node.js&logoColor=white)](./frontend/package.json)\n[![FastAPI](https://img.shields.io/badge/FastAPI-009688?logo=fastapi&logoColor=white)](./backend)\n[![Next.js](https://img.shields.io/badge/Next.js-000000?logo=next.js&logoColor=white)](./frontend)\n[![LangGraph](https://img.shields.io/badge/LangGraph-1C3C3C)](./backend/app/harness)\n\nSlotFlow is a local-first, extensible AI agent workspace. A FastAPI + LangGraph\nbackend drives a Next.js chat interface with runtime model selection, visible reasoning\nstreams, Skills, MCP tools, local memory, artifacts, Docker-backed code execution, and\nfocused sub-agents.\n\nIt is designed for research, coding, analysis, and report-generation workflows where\nthe agent should not only answer, but also read files, call tools, remember useful\ncontext, ask for clarification, and produce durable outputs that can be previewed in the\nworkspace panel.\n\n### Live transcript (read-only demo)\n\n**[▶ Open the live demo](https://slotflow-demo.pages.dev)** — no signup, nothing to install.\n\nA static, backend-free site rendered by **the product's own frontend** — not a mockup, not\na screen recording. It replays one real SlotFlow run: *\"build a high-visual marketing page\nusing the `frontend-design` + `ui-ux-pro-max` skills\"*, which the agent answered by loading\nboth skills, planning with a todo list, asking a clarifying question, dispatching **three\nsub-agents in parallel**, executing code in the Docker sandbox, and shipping a Vite + React 19\n+ TypeScript build you can preview inline in the artifact panel.\n\nEverything on the page is recorded output: ~284k characters of reasoning, 29 tool\ninvocations, the todo panel, the clarification card, and 52 artifacts. It is read-only —\nyou can browse, but not chat. See [`demo/`](./demo) to regenerate or self-host it.\n\n---\n\n## Contents\n\n- [Live transcript](#live-transcript-read-only-demo)\n- [What You Get](#what-you-get)\n- [Requirements](#requirements)\n- [Quick Start](#quick-start)\n- [bootstrap.sh](#bootstrapsh)\n- [Makefile Commands](#makefile-commands)\n- [Manual Setup](#manual-setup)\n- [Configuration](#configuration)\n- [Running SlotFlow](#running-slotflow)\n- [Core Features](#core-features)\n- [Architecture](#architecture)\n- [Project Layout](#project-layout)\n- [Verification](#verification)\n- [Troubleshooting](#troubleshooting)\n- [Security Notes](#security-notes)\n- [Contributing](#contributing)\n- [License](#license)\n\n## What You Get\n\n- Streaming chat with separate visible reasoning output.\n- Runtime model discovery from configured providers instead of hard-coded model lists.\n- DeepSeek, OpenAI, Anthropic, and custom OpenAI-compatible relay support.\n- Skills, MCP servers, web tools, workspace tools, uploads, and artifact preview.\n- Docker-backed `sandbox_exec` for untrusted code execution.\n- `sandbox_artifact_copy` for publishing files generated inside Docker to the UI.\n- Long-term memory and local SQLite persistence.\n- Layered sub-agent delegation for larger tasks.\n- A repo-root `bootstrap.sh` and `Makefile` so new clones can get running quickly.\n\n## Requirements\n\nRecommended platform:\n\n- Linux or WSL2\n- Python 3.12 or 3.13\n- Node.js 20+; Node 22 is the default target used by `bootstrap.sh`\n- pnpm 10.26.2, read from `frontend/package.json`\n- `make`, `curl`, `git`\n- Docker Engine for code execution tools and Docker sandbox artifacts\n- `ffmpeg` and ExifTool for complete MarkItDown audio/metadata conversion (`bootstrap.sh` installs them where supported)\n\n`./bootstrap.sh` can install or validate most of these on common Linux families:\n`apt`, `dnf`, `yum`, `pacman`, `apk`, and `zypper`. It also has a Homebrew path for\nbasic tools, but Docker setup is primarily Linux/WSL-oriented.\n\n## Quick Start\n\n```bash\ngit clone <your-repository-url>\ncd SlotFlow\n./bootstrap.sh\n```\n\nThen edit `backend/.env` and add at least one model provider API key:\n\n```bash\nnano backend/.env\n```\n\nStart both servers:\n\n```bash\nmake dev\n```\n\nOpen:\n\n```text\nhttp://localhost:3000\n```\n\nThe backend runs on `http://127.0.0.1:8000`. In local browser development the frontend\ncalls that backend by default.\n\n## bootstrap.sh\n\n`./bootstrap.sh` is the recommended first-run setup path for a fresh clone.\n\nIt does the following:\n\n1. Installs or validates system prerequisites used by the repo and `Makefile`.\n2. Installs `uv` if it is missing.\n3. Installs Node and pnpm, using the pnpm version declared in `frontend/package.json`.\n4. Installs or refreshes Agent Reach with `uv tool`, then prepares its core host-side channels.\n5. Installs MarkItDown's ffmpeg/ExifTool helpers where supported, then runs `uv sync` with all-format and Vision OCR dependencies.\n6. Runs `pnpm install --frozen-lockfile` in `frontend/`, installs Playwright's Chromium shared libraries on apt hosts, and downloads the locked Chromium runtime.\n7. Copies `backend/.env_example` to `backend/.env` only if `backend/.env` does not exist.\n8. Installs, starts, and prepares Docker when possible.\n9. Pre-pulls the sandbox image when possible.\n\nThe script never overwrites an existing `backend/.env`. Playwright's official dependency\ninstaller currently handles Debian/Ubuntu (`apt`) automatically; on other distributions bootstrap\nkeeps going with a warning and Chromium runtime libraries may need to be installed manually.\n\nUseful bootstrap knobs:\n\n```bash\n# Skip OS package installation. Use this when packages are already installed\n# or when you do not want bootstrap to use sudo/root package-manager commands.\nSLOTFLOW_SKIP_SYSTEM_PACKAGES=1 ./bootstrap.sh\n\n# Skip all Docker setup. The app can still run, but sandbox_exec will not work\n# until Docker is installed and reachable.\nSLOTFLOW_SKIP_DOCKER=1 ./bootstrap.sh\n\n# Skip Agent Reach host setup or the Playwright Chromium download independently.\nSLOTFLOW_SKIP_AGENT_REACH=1 ./bootstrap.sh\nSLOTFLOW_SKIP_PLAYWRIGHT_BROWSER=1 ./bootstrap.sh\n\n# Override the Agent Reach Git source used by uv tool. Rerunning bootstrap is the update path.\nSLOTFLOW_AGENT_REACH_SOURCE=git+https://github.com/Panniantong/Agent-Reach.git ./bootstrap.sh\n\n# Override runtime tool versions used by bootstrap.\nSLOTFLOW_NODE_VERSION=22 ./bootstrap.sh\nSLOTFLOW_PNPM_VERSION=10.26.2 ./bootstrap.sh\n\n# Override the Docker sandbox image pre-pulled by bootstrap.\nSLOTFLOW_DOCKER_IMAGE=python:3.12 ./bootstrap.sh\n\n# Override registry mirrors used only after a direct Docker Hub pull fails.\nSLOTFLOW_DOCKER_REGISTRY_MIRRORS=\"https://docker.1ms.run https://docker.m.daocloud.io\" ./bootstrap.sh\n\n# Tune how long bootstrap waits for Docker daemon startup.\nSLOTFLOW_DOCKER_DAEMON_WAIT_SECONDS=30 ./bootstrap.sh\n```\n\nDocker notes:\n\n- If bootstrap adds your user to the `docker` group, log out and back in before\n  expecting non-sudo Docker access.\n- On WSL hosts without systemd, bootstrap can write `systemd=true` to `/etc/wsl.conf`.\n  Run `wsl --shutdown` once from Windows for that setting to fully take effect.\n- If Docker cannot be started or the image cannot be pulled, bootstrap completes with a\n  warning. SlotFlow will retry Docker startup/pull on first sandbox use.\n\n## Makefile Commands\n\nThe root `Makefile` is the normal day-to-day entrypoint after bootstrap.\n\n```bash\nmake dev\n```\n\nStarts both local development servers:\n\n- frontend: `cd frontend && pnpm dev`\n- backend: `cd backend && uv run uvicorn app.main:app --env-file ./.env --reload`\n\nStop the servers with `Ctrl+C`.\n\n```bash\nmake verify\n```\n\nRuns the full local verification set:\n\n- backend tests: `cd backend && uv run pytest -q`\n- frontend typecheck: `cd frontend && pnpm typecheck`\n- frontend production build: `cd frontend && pnpm build`\n\nIndividual targets are also available:\n\n```bash\nmake test-backend\nmake typecheck-frontend\nmake build-frontend\n```\n\nKill local dev servers by port:\n\n```bash\nmake kill\n```\n\n`make kill` uses `fuser` for ports `3000` and `8000`; on most Linux distributions\n`fuser` comes from the `psmisc` package.\n\n## Manual Setup\n\nUse this path if you do not want `bootstrap.sh` to install packages.\n\nInstall prerequisites yourself:\n\n- Python 3.12 or 3.13\n- `uv`\n- Node.js 20+\n- pnpm 10.26.2\n- Docker Engine if you want `sandbox_exec`\n- `make`, `curl`, `git`, and optionally `fuser`\n\nInstall dependencies:\n\n```bash\ncd backend\nuv sync\n\ncd ../frontend\npnpm install --frozen-lockfile\n\ncd ..\n```\n\nCreate a local backend environment file:\n\n```bash\ncp backend/.env_example backend/.env\n```\n\nThen fill in at least one provider API key in `backend/.env`.\n\n## Configuration\n\nThe full configuration template lives in:\n\n```text\nbackend/.env_example\n```\n\nCopy it to:\n\n```text\nbackend/.env\n```\n\n`backend/.env` is ignored by git and should contain your real secrets.\n\n### Model Providers\n\nSlotFlow asks LiteLLM which native providers are configured, then exposes every bundled\n`chat + function-calling` model for those providers. No provider/model list is maintained by SlotFlow.\n\n```bash\n# DeepSeek\nDEEPSEEK_API_KEY=sk-...\n# DEEPSEEK_BASE_URL=https://api.deepseek.com\n\n# OpenAI\nOPENAI_API_KEY=sk-...\n# OPENAI_BASE_URL=https://api.openai.com/v1\n\n# Anthropic\nANTHROPIC_API_KEY=sk-ant-...\n# ANTHROPIC_BASE_URL=https://api.anthropic.com/v1\n\n# Other LiteLLM-native providers use their standard variables, for example:\nGEMINI_API_KEY=...\nMISTRAL_API_KEY=...\nAWS_ACCESS_KEY_ID=...\nAWS_SECRET_ACCESS_KEY=...\nAWS_REGION_NAME=us-east-1\n\n# Custom OpenAI-compatible relay\nCUSTOM_BASE_URL=https://your-relay.example.com/v1\nCUSTOM_API_KEY=sk-...\nCUSTOM_MODELS=claude-sonnet-4,gpt-5,qwen-max\n```\n\nImportant model behavior:\n\n- `.env` does not choose the conversation model.\n- The frontend sends the selected model and provider with each run.\n- All providers execute through `ChatLiteLLM`; LiteLLM owns provider protocol, reasoning, tool-call, and usage normalization.\n- `CUSTOM_MODELS` can be used when a relay does not support `/models`.\n- All providers use LiteLLM Chat Completions normalization; OpenAI models are not routed through Responses, so OpenAI-compatible DeepSeek/Qwen/custom relays share one transport shape.\n\n### Frontend URLs\n\nFor the default local setup, no frontend env file is required. The frontend calls:\n\n```text\nhttp://127.0.0.1:8000\n```\n\nOverride this in the frontend shell or `frontend/.env.local`:\n\n```bash\nNEXT_PUBLIC_SLOTFLOW_API_BASE_URL=http://localhost:8000\nNEXT_PUBLIC_SLOTFLOW_STREAM_BASE_URL=http://localhost:8000\n```\n\n### Storage\n\nDefault local paths are under `backend/.slotflow/` when running through `make dev`,\nbecause backend-relative paths are resolved from the `backend/` directory.\n\nCommon settings:\n\n```bash\nSLOTFLOW_CHAT_SQLITE_PATH=.slotflow/chat.sqlite3\nSLOTFLOW_CHECKPOINTER_BACKEND=memory\nSLOTFLOW_CHECKPOINTER_SQLITE_PATH=.slotflow/checkpoints.sqlite3\nSLOTFLOW_MEMORY_SQLITE_PATH=.slotflow/memory.sqlite3\nSLOTFLOW_SKILLS_ROOT=.slotflow/skills\nSLOTFLOW_WORKSPACE_ROOT=.slotflow/workspace\n```\n\n### Feature Flags\n\nMost features are enabled by default in `backend/.env_example`:\n\n```bash\nSLOTFLOW_LONG_TERM_MEMORY_ENABLED=true\nSLOTFLOW_PROACTIVE_MEMORY_EXTRACTION=true\nSLOTFLOW_TODO_MIDDLEWARE=true\nSLOTFLOW_MCP_ENABLED=true\nSLOTFLOW_CODE_EXECUTION_ENABLED=true\n```\n\nDisable a feature only when debugging a subsystem or running in a constrained\nenvironment.\n\n### Agent Reach Host Bridge\n\n`bootstrap.sh` installs Agent Reach and its core upstream CLIs on the host. SlotFlow exposes only\nfixed read-only operations for status, Exa web search, Jina page reading, GitHub search, and YouTube\nmetadata; it never gives the model a host shell or install/configure/write command. The bridge is not\nmounted into Docker and is refreshed by rerunning `bootstrap.sh`.\n\n```bash\nSLOTFLOW_AGENT_REACH_ENABLED=true\nSLOTFLOW_AGENT_REACH_HOME=~/.agent-reach\nSLOTFLOW_AGENT_REACH_TIMEOUT_SECONDS=60\nSLOTFLOW_AGENT_REACH_MAX_OUTPUT_BYTES=524288\n```\n\nThe bridge also turns off when `SLOTFLOW_NETWORK_ENABLED=false`. Cookie/login channels remain an\nexplicit user choice and are not enabled by bootstrap.\n\n### Built-in Playwright MCP\n\nThe protected `playwright` MCP preset is enabled by default. It uses a headless isolated Chromium\nsession that remains alive across browser actions within one run and closes when that run ends;\nconcurrent conversations get separate sessions. The preset is workspace-scoped, enables no optional\nvision/PDF/devtools capabilities, and cannot be replaced by a user HTTP server.\n\n```bash\nSLOTFLOW_PLAYWRIGHT_MCP_ENABLED=true\nSLOTFLOW_PLAYWRIGHT_MCP_ACTION_TIMEOUT_MS=10000\nSLOTFLOW_PLAYWRIGHT_MCP_NAVIGATION_TIMEOUT_MS=60000\n```\n\nIts localhost/private-origin blocklist is defense in depth, not a complete security boundary:\nredirects and page content remain untrusted. Set `SLOTFLOW_NETWORK_ALLOW_PRIVATE=true` only when\nbrowser access to local services is intentional.\n\n### MarkItDown Conversion and Vision OCR\n\nThe single `convert_file_to_markdown` tool converts workspace-local PDF, Word, Excel, PowerPoint,\nHTML/data, image, audio, EPUB, and archive files. It uses the selected run model automatically when\nLiteLLM reports Vision support; otherwise configure a dedicated OpenAI-compatible Vision model.\nScanned PDFs and images use the official `markitdown-ocr` plugin. Large files, archive expansion,\npage/image OCR count, output size, paths, and artifact writes are bounded.\n\n```bash\nSLOTFLOW_MARKITDOWN_ENABLED=true\nSLOTFLOW_MARKITDOWN_MAX_INPUT_BYTES=52428800\nSLOTFLOW_MARKITDOWN_MAX_OUTPUT_CHARS=750000\nSLOTFLOW_MARKITDOWN_VISION_ENABLED=true\nSLOTFLOW_MARKITDOWN_VISION_MAX_PAGES=20\nSLOTFLOW_MARKITDOWN_VISION_MAX_IMAGES=20\n\n# Optional dedicated OpenAI-compatible client:\n# SLOTFLOW_MARKITDOWN_VISION_MODEL=gpt-4o\n# SLOTFLOW_MARKITDOWN_VISION_BASE_URL=https://api.openai.com/v1\n# SLOTFLOW_MARKITDOWN_VISION_API_KEY=sk-...\n```\n\nWithout a compatible selected model or dedicated client, normal extraction still runs and image/\nscanned-PDF results carry an explicit warning instead of silently claiming OCR succeeded.\n\n### Network and Docker Sandbox\n\nNetwork tools:\n\n```bash\nSLOTFLOW_NETWORK_ENABLED=true\nSLOTFLOW_NETWORK_ALLOW_PRIVATE=false\nSLOTFLOW_NETWORK_MAX_FETCH_BYTES=524288\nSLOTFLOW_NETWORK_TIMEOUT_SECONDS=15\n```\n\nDocker sandbox:\n\n```bash\nSLOTFLOW_CODE_EXECUTION_ENABLED=true\nSLOTFLOW_DOCKER_SANDBOX_IMAGE=python:3.12\nSLOTFLOW_DOCKER_SANDBOX_TIMEOUT_SECONDS=120\nSLOTFLOW_DOCKER_SANDBOX_NETWORK_ENABLED=true\nSLOTFLOW_DOCKER_SANDBOX_IDLE_TIMEOUT_SECONDS=600\nSLOTFLOW_ALLOW_HOST_DOCKER_INSTALL=true\n```\n\nGenerated files that should appear in the right workspace panel must be written as\nartifacts. The agent can use:\n\n- `artifact_write` for direct artifact content writes.\n- `sandbox_artifact_copy` for one file already generated inside Docker.\n\n## Running SlotFlow\n\nRecommended:\n\n```bash\nmake dev\n```\n\nManual backend:\n\n```bash\ncd backend\nuv run uvicorn app.main:app --env-file ./.env --reload\n```\n\nManual frontend:\n\n```bash\ncd frontend\npnpm dev\n```\n\nOpen:\n\n```text\nhttp://localhost:3000\n```\n\n## Core Features\n\n### Chat Workspace\n\n- Persistent threads, message history, and streaming replies.\n- File uploads and queued messages.\n- Human-in-the-loop clarification prompts.\n- Visible reasoning output separated from final answer content.\n- Visual todo progress through `write_todos`.\n- Workspace panel for files, previews, and a host terminal.\n\n### Runtime Model Selection\n\nThe composer lets users choose:\n\n- mode: `flash`, `pro`, or `ultra`\n- model: discovered from configured providers\n\nThe backend routes each run using the provider provenance sent by the frontend.\n\n### Skills and MCP\n\nThe UI supports installed Skills and MCP server management, including the protected stateful\nPlaywright preset. Skills can be enabled,\ndisabled, pinned, reordered, installed, uploaded, and deleted. MCP servers can be\nconfigured from environment JSON or managed from the UI.\n\n### Sub-agents\n\nSlotFlow supports focused delegation through functional sub-agents such as researcher,\nanalyst, planner, coder, reviewer, and writer. Role/domain prompts are stored under the\nbackend harness and loaded only when needed, so the lead agent does not need to read the\nentire role library for every task. Delegated child graphs use a recursion limit of 100 so\nmultiple tool/reflection rounds can finish; override it with\n`SLOTFLOW_SUBAGENT_RECURSION_LIMIT=<positive-int>` without changing the main graph limit.\n\n### Artifacts\n\nGenerated deliverables are stored under thread-scoped artifact directories and shown in\nthe workspace panel. The preview panel supports common source/text formats, Markdown,\nHTML, PDF, images, SVG, `.docx`, `.xlsx`/`.xlsm`, `.pptx`, and `.drawio`.\n\n### Memory\n\nSlotFlow has local long-term memory for durable facts, preferences, profile notes, and\ntopic context. Memory can be explicitly managed from the UI, and the harness can also\nextract durable context after a run when proactive memory extraction is enabled.\n\n### Terminal\n\nThe right panel terminal is a user-operated host PTY for setup and debugging. It is not\nan agent tool and is separate from Docker-backed `sandbox_exec`.\n\n## Architecture\n\n```text\nBrowser / Next.js UI\n  -> POST chat stream request\n  -> FastAPI chat routes\n  -> RuntimeBackedAgentAdapter\n  -> ChatLiteLLM + LangGraph StateGraph\n  -> LangGraph v3 projections\n  -> SlotFlow AgentEvent\n  -> SSE stream\n  -> chat UI, todo panel, clarification UI, workspace panel\n```\n\nKey backend layers:\n\n- `backend/app/chat/`: chat API, Pydantic models, SQLite repository, run config, SSE.\n- `backend/app/chat/runtime/`: environment, model creation, checkpointer, graph adapter.\n- `backend/app/chat/agent_adapter/`: LangGraph projection normalization.\n- `backend/app/harness/`: graph, steps, tools, Skills, MCP, memory, sandbox, sub-agents.\n\nKey frontend layers:\n\n- `frontend/src/components/chat/`: chat app, sidebar, message list, composer, workspace.\n- `frontend/src/hooks/`: stream handling, model catalog, workspace data.\n- `frontend/src/lib/`: chat stream client and shared frontend utilities.\n\n## Project Layout\n\n```text\nSlotFlow/\n  bootstrap.sh              first-run setup entrypoint\n  Makefile                  repo-root dev and verification commands\n  backend/\n    .env_example            complete backend configuration template\n    app/\n      chat/                 chat API, runtime config, repository, SSE\n      chat/runtime/         model/checkpointer/graph assembly\n      chat/agent_adapter/   LangGraph projection -> AgentEvent\n      harness/              graph, steps, tools, Skills, MCP, memory, sandbox, sub-agents\n      terminal/             host PTY websocket route\n      uploads/              upload API\n      workspace/            artifact/workspace API\n    tests/                  backend tests\n  frontend/\n    package.json            Next.js app and pnpm version\n    src/\n      app/                  Next.js app shell and global CSS\n      components/chat/      main SlotFlow UI\n      components/ui/        shared UI primitives\n      hooks/                chat/workspace/model hooks\n      lib/                  chat stream client and helpers\n  docs/                     architecture and cleanup notes\n```\n\n## Verification\n\nRun everything:\n\n```bash\nmake verify\n```\n\nRun checks individually:\n\n```bash\nmake test-backend\nmake typecheck-frontend\nmake build-frontend\n```\n\nBackend-only:\n\n```bash\ncd backend\nuv run pytest -q\nuv run ruff check app tests\n```\n\nFrontend-only:\n\n```bash\ncd frontend\npnpm typecheck\npnpm build\n```\n\nLive provider tests are not part of the default offline suite. Use them only when you\nhave the required API keys and intentionally want a live smoke test.\n\n### Agent Evaluation\n\nA 10-sample agent evaluation harness lives in `backend/evals/`, running the real\n`build_slotflow_harness_graph` call path in three tiers — offline stub, FakeModel smoke,\nand live real-model — with six evaluators (tool-trajectory, precision, tool-errors,\nanswer-substring, an anti-reasoning-bloat contract, and an optional LLM-as-judge):\n\n```bash\ncd backend\n.venv/bin/python -m evals.run_eval                              # offline (deterministic, free)\n.venv/bin/python -m evals.run_eval --smoke                      # real graph + FakeModel (free)\n.venv/bin/python -m evals.run_eval --live --model grok-4.5 --judge --langsmith\n```\n\nA live grok-4.5 run scored 6/10 samples; the four misses break down as one workspace-seeding\ngap, two strict single-tool expectations vs. a defensible alternative tool, and one\nmodel-output edge case where the contract under test actually passed. See\n[`backend/evals/README.md`](./backend/evals/README.md) for the annotated scorecard.\n\n## Troubleshooting\n\n### `make dev` cannot find `uv`, `node`, or `pnpm`\n\nStart a new shell after bootstrap, or export the local tool paths:\n\n```bash\nexport PATH=\"$HOME/.local/bin:$HOME/.volta/bin:$PATH\"\n```\n\n### `make kill` does nothing\n\nInstall `fuser`:\n\n```bash\n# Debian/Ubuntu\nsudo apt-get install psmisc\n```\n\n### Docker works only with sudo\n\nIf bootstrap added your user to the `docker` group, log out and back in. Existing shells\ndo not automatically receive new group membership.\n\n### Docker pull is slow or fails\n\nSet mirrors for bootstrap:\n\n```bash\nSLOTFLOW_DOCKER_REGISTRY_MIRRORS=\"https://docker.1ms.run https://docker.m.daocloud.io\" ./bootstrap.sh\n```\n\nOr set `SLOTFLOW_SKIP_DOCKER=1` and configure Docker manually later.\n\n### No models appear in the UI\n\nCheck:\n\n- at least one provider API key is set in `backend/.env`\n- the provider base URL is reachable from the backend process\n- custom relays either support `/models` or set `CUSTOM_MODELS`\n- the backend was restarted after editing `backend/.env`\n\n### Frontend cannot reach backend\n\nVerify the backend is listening on port `8000`:\n\n```bash\ncurl http://127.0.0.1:8000/api/chat/models\n```\n\nIf the backend is elsewhere, set:\n\n```bash\nNEXT_PUBLIC_SLOTFLOW_API_BASE_URL=http://host:port\nNEXT_PUBLIC_SLOTFLOW_STREAM_BASE_URL=http://host:port\n```\n\n## Security Notes\n\nSlotFlow targets local, trusted environments by default. Before exposing it beyond\nlocalhost:\n\n- Keep API keys out of git.\n- Never commit `backend/.env` or frontend `.env.local` files.\n- Add authentication in front of any public deployment.\n- Keep private-network fetching disabled unless you trust the prompts and users.\n- Treat generated artifacts as untrusted content until reviewed.\n- Keep host terminal access local and trusted.\n- Use Docker sandbox execution for generated/untrusted code, not host shell execution.\n\n## Contributing\n\n1. Create a feature branch.\n2. Keep changes focused.\n3. Update tests and documentation when behavior or commands change.\n4. Run `make verify`.\n5. Open a pull request against the protected default branch.\n\nImportant repo docs:\n\n- [AGENTS.md](./AGENTS.md): working rules and current architecture map.\n- [HARNESS_NOTES.md](./HARNESS_NOTES.md): harness engineering log.\n- [docs/](./docs): additional architecture and cleanup notes.\n\n## License\n\nAdd a license before publishing this repository publicly. Until then, all rights are\nreserved by default.\n",
  "bytes": 23031,
  "sha": "c14aa158834e32759befed9a5f5c6ba771adbd69dc6a3913001766d6bb35decf",
  "repo_slug": "iam-xiaofeng/slotflow",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/okf_iam_xiaofeng_slotflow_openwiki_index_md_784c62af/readme"
}