* fix: route LLM metadata fetches through cloud proxy for cloud backends When the active backend is 'cloud', ConfigService.searchProviders, ConfigService.searchModels, and fetchVerifiedModelsByProvider all called getAgentServerClientOptions(), which delegates to getEffectiveLocalBackend(). That returns null for cloud backends, so NoBackendAvailableError was thrown, surfacing as the 'No backend is configured' toast on /settings/llm. Follow the established cloud-vs-local branching pattern: for cloud backends, route the three LLM metadata endpoints (/api/llm/providers, /api/llm/models, /api/llm/models/verified) through callCloudProxy so correct Bearer auth is used and CORS is handled; for local backends keep the existing LLMMetadataClient path unchanged. Co-authored-by: openhands <openhands@all-hands.dev> * fix: extract named fields from raw cloud proxy LLM responses callCloudProxy returns the full JSON response body, while LLMMetadataClient extracts named sub-fields: getProviders() → response.data.providers (raw: { providers: string[] }) getModels() → response.data.models (raw: { models: string[] }) getVerifiedModels() → response.data.models (raw: { models: Record<string, string[]> }) The cloud proxy calls were treating the whole response object as the array/record directly, causing '(models ?? []).filter is not a function' and garbled provider/model dropdowns. Use typed raw-response wrappers and chain .then(raw => raw?.field ?? null) to mirror exactly what LLMMetadataClient does internally. Co-authored-by: openhands <openhands@all-hands.dev> * fix: use cloud API search endpoints for providers and models For cloud backends, /api/llm/providers and /api/llm/models are wrong — those are local agent-server endpoints. The cloud API exposes: GET /api/v1/config/providers/search → ProviderPage GET /api/v1/config/models/search → LLMModelPage Both return the same shape the local ConfigService types already define, so the cloud path calls callCloudProxy directly and returns the response as-is, with no reconstruction logic needed. The intermediate fetchVerifiedModelsByProvider step is skipped for cloud entirely — the cloud search endpoints embed verified status natively. Co-authored-by: openhands <openhands@all-hands.dev> * style: fix prettier formatting on buildCloudQueryString signature Co-authored-by: openhands <openhands@all-hands.dev> * docs: address review bot suggestions on cloud LLM metadata fix - Add JSDoc to ConfigService.searchModels and searchProviders noting that verifiedByProvider is ignored for cloud backends (cloud API embeds verified status directly on each returned item) - Expand comment on fetchVerifiedModelsByProvider's cloud early-return to clarify it is safe to treat as a no-op for cloud callers Co-authored-by: openhands <openhands@all-hands.dev> --------- Co-authored-by: openhands <openhands@all-hands.dev>
agent-canvas
Warning
This project is in the Beta phase. It may be vibecoded, untested, or out of date. OpenHands takes no responsibility for the code or its support. Learn more.
OpenHands is a platform for orchestrating coding agents across different environments. You can:
- ⌨️ prompt agents manually
- 🕐 run agents on a schedule
- ⚡ trigger agents automatically — e.g. from Slack, GitHub, or Datadog.
Agents can run anywhere:
- 🧑💻 on your laptop
- 🖥️ on a remote virtual machine
- ☁️ in our hosted cloud
- 🏢 or inside your company’s infrastructure
The same Agent Canvas frontend can swap between each of these environments, so you can see everything in one place.
OpenHands works with any agent harness (e.g. Claude Code, Codex) or connect directly to an LLM (e.g. Anthropic, OpenAI, Gemini, Mistral, Minimax, Kimi).
If you have questions or feedback, please open a GitHub issue or join the #proj-agent-canvas channel in Slack.
Project ownership and support
- Current status: Beta.
- Support channel: #proj-agent-canvas.
- Support level: Best effort while the project remains in Beta.
Quickstart
You can install OpenHands to run agents on any machine: on your laptop, on a dedicated computer like a Mac Mini, or on a server in the cloud.
The most powerful way to run OpenHands is on a server in the cloud. This allows your agents to continue running even when your laptop is shut, and makes it easier to trigger your agents through third-party services like Slack, GitHub, and Datadog. See SELF_HOSTING.md for details, especially with respect to security hardening.
Notably, you can run the backend in multiple different environments, and switch between them from the same Agent Canvas frontend. E.g. you can share an Agent Server with your team for agents doing code review and dependency updates, then have your personal agents running on your laptop.
Option 1: Without a Sandbox
Warning
This runs the agent-server directly on the machine you're installing on — the agent will have full access to your filesystem!
Prerequisites: Node.js 22.12.x or later, uv
npm install -g @openhands/agent-canvas
agent-canvas
The agent-canvas command starts the full local stack by default. You can also split it when you want to run pieces separately:
agent-canvas --frontend-only # static frontend + ingress only
agent-canvas --backend-only # agent server + automation backend + ingress only
Option 2: With a Docker Sandbox
Prerequisites:
- Docker: Docker Desktop on macOS/Windows, or Docker Engine/Docker Desktop on Linux.
- A host directory for
PROJECTS_PATHcontaining the project folders you want the agent to access. Create it before starting the container.
macOS / Linux:
export PROJECTS_PATH="$HOME/projects" # directory containing your project folders
mkdir -p "$PROJECTS_PATH" "$HOME/.openhands"
docker run -it --rm \
-p 8000:8000 \
-v "$HOME/.openhands:/home/openhands/.openhands" \
-v "${PROJECTS_PATH}:/projects" \
ghcr.io/openhands/agent-canvas:1.0.0-beta.6
Windows (PowerShell / Windows Terminal): See README.windows.md for the equivalent commands.
The agent will be able to access any project under PROJECTS_PATH.
Option 3: From Source
Warning
This runs the agent-server directly on the machine you're installing on — the agent will have full access to your filesystem!
Prerequisites: Node.js 22.12.x or later, npm, uv (for running the agent server via uvx)
git clone https://github.com/OpenHands/agent-canvas.git
cd agent-canvas
npm install
npm run dev
Access the UI at http://localhost:8000. You can add additional backends directly from the UI.
Architecture
Agent Canvas is powered by the OpenHands Agent Server, a REST API for running multiple agents on a single machine. Each Agent Server runs on a single host/port; the Agent Canvas can connect to multiple Agent Servers and easily flip between them.
You can run an Agent Server anywhere:
- Directly on your laptop (be careful!)
- On a dedicated machine like a Mac Mini
- On a virtual machine in the cloud
- Inside OpenHands Cloud (our commercial offering)
The Agent Server is often paired with an Automation Server, which lets you set up agents that run on a schedule or in response to events.