diff --git a/llms-full.txt b/llms-full.txt index f9ba99e5..ec5cd0d9 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -22003,7 +22003,7 @@ If you are running OpenHands Enterprise (OHE), you can use the same Laminar inte 1. Complete the [OpenHands Enterprise quick start](/enterprise/quick-start). 2. Enable analytics in the Admin Console. 3. Deploy OHE and wait for the analytics service to become ready. -4. Open the Laminar UI at `https://analytics.app.`. +4. Open the Laminar UI at `https://analytics.`. 5. Create a Laminar project and an ingest-only API key. 6. Save that key as the **Laminar Project API Key** in the Admin Console. 7. Redeploy, then start a conversation in OpenHands. @@ -28854,7 +28854,7 @@ If you encounter issues with the search functionality: ### ACP Agents Source: https://docs.openhands.dev/openhands/usage/agent-canvas/acp-agents.md -Agent Canvas can drive your conversations with the built-in **OpenHands** agent or with an external **ACP agent** — Claude Code, Codex, or Gemini CLI. This guide explains what ACP agents are, how to onboard one, and how to switch agents or models later. +Use this guide when you want to bring Claude Code, Codex, or other agent CLIs into Agent Canvas. Agent Canvas can drive conversations with the built-in **OpenHands** agent or with an external **ACP agent**. For an ACP agent, the selected backend launches the provider's CLI and must have access to its subscription login or API key. ## What is an ACP agent? @@ -28941,7 +28941,7 @@ Any stdio ACP server works: choose **Custom** in Settings → Agent and enter it ## Related Guides - [Customize and Settings](/openhands/usage/agent-canvas/customize-and-settings) -- [LLM Profiles and Model Configuration](/openhands/usage/agent-canvas/llm-profiles) +- [Manage LLM Profiles](/openhands/usage/agent-canvas/llm-profiles) - [Connect and Manage Backends](/openhands/usage/agent-canvas/backends) ### Agent Profiles @@ -29011,7 +29011,7 @@ If you choose OpenHands, the setup flow also configures the LLM profile that the - [First Time Setup](/openhands/usage/agent-canvas/first-time-setup) - [ACP Agents](/openhands/usage/agent-canvas/acp-agents) -- [LLM Profiles and Model Configuration](/openhands/usage/agent-canvas/llm-profiles) +- [Manage LLM Profiles](/openhands/usage/agent-canvas/llm-profiles) ### Cloud Backend Source: https://docs.openhands.dev/openhands/usage/agent-canvas/backend-setup/cloud.md @@ -29048,6 +29048,8 @@ If your organization runs OpenHands Enterprise, click **Advanced** in the Add Ba - **Sandboxed execution** — each conversation runs in an isolated cloud sandbox rather than on your host filesystem. - **Cloud integrations** — GitHub, GitLab, Bitbucket, Slack, and other integrations configured in OpenHands Cloud are available. - **Settings are per-backend** — LLM configuration, secrets, and MCP servers saved against the Cloud backend are independent from your local backend settings. +- **Cloud-managed customization** — `Customize > Skills` becomes **Skills and Plugins** and opens the Cloud skills settings in a new tab. The local `Plugins` page is hidden; MCP Servers are still fully managed through the Canvas UI but installed on Cloud. +- **Cloud settings links** — the `Cloud` link becomes **All Cloud Settings**, and `Integrations` opens the Cloud integrations settings in a new tab. ## Related Guides @@ -29055,10 +29057,10 @@ If your organization runs OpenHands Enterprise, click **Advanced** in the Add Ba - [OpenHands Cloud](/openhands/usage/cloud/openhands-cloud) - [Local Backend](/openhands/usage/agent-canvas/backend-setup/local) -### Docker Backend +### Use Docker with Agent Canvas Source: https://docs.openhands.dev/openhands/usage/agent-canvas/backend-setup/docker.md -The official Docker image packages the full Agent Canvas stack — backend and frontend — in a single container. The agent runs inside the container rather than directly on your host, giving you a sandboxed environment out of the box. +Use Docker when you want Agent Canvas and its agent tools to run in a container rather than directly on your host. The official image packages the full Agent Canvas stack — backend and frontend — in a single container, with access only to the project directories you mount. ## Prerequisites @@ -29176,11 +29178,11 @@ Use this Helm chart for self-hosted, single-tenant setups; reach for OHE when yo ## Get the Chart -The chart lives alongside the source in the `OpenHands/agent-canvas` repo. Clone it and install from the local path: +The chart lives alongside the source in the `OpenHands/OpenHands` repository. Clone it and install from the local path: ```bash -git clone https://github.com/OpenHands/agent-canvas.git -cd agent-canvas +git clone https://github.com/OpenHands/OpenHands.git +cd OpenHands helm install agent-canvas ./helm/agent-canvas \ --namespace agent-canvas --create-namespace ``` @@ -29639,7 +29641,7 @@ helm upgrade agent-canvas ./helm/agent-canvas -n agent-canvas -f values.yaml ### `ErrImagePull` on `ghcr.io/openhands/agent-canvas:` -Verify the tag exists on GHCR — the chart's `appVersion` pins the default. To pull an image built from a specific commit, use `--set image.tag=sha-`. See [GHCR](https://github.com/OpenHands/agent-canvas/pkgs/container/agent-canvas) for the tag list. +Verify the tag exists on GHCR — the chart's `appVersion` pins the default. To pull an image built from a specific commit, use `--set image.tag=sha-`. See the [Agent Canvas package](https://github.com/orgs/OpenHands/packages/container/package/agent-canvas) for the tag list. ### WebSocket disconnects every minute @@ -29661,7 +29663,7 @@ Either no `StorageClass` exists on the cluster, or the one you set doesn't provi ## Related Guides -- [Docker Backend](/openhands/usage/agent-canvas/backend-setup/docker) — single-container equivalent for laptops and single-host VMs. +- [Use Docker with Agent Canvas](/openhands/usage/agent-canvas/backend-setup/docker) — single-container equivalent for laptops and single-host VMs. - [VM / Self-Hosted Installation](/openhands/usage/agent-canvas/backend-setup/vm) — install directly on a Linux VM without Kubernetes. - [Connect and Manage Backends](/openhands/usage/agent-canvas/backends) — point a local Agent Canvas UI at a remote backend. @@ -29714,7 +29716,7 @@ Switch between them from the backend selector depending on what you're working o - [Connect and Manage Backends](/openhands/usage/agent-canvas/backends) - [VM / Self-Hosted Installation](/openhands/usage/agent-canvas/backend-setup/vm) — backend-only or full Canvas on a remote machine -- [Docker Backend](/openhands/usage/agent-canvas/backend-setup/docker) — run in a container +- [Use Docker with Agent Canvas](/openhands/usage/agent-canvas/backend-setup/docker) — run in a container ### Modal Backend Source: https://docs.openhands.dev/openhands/usage/agent-canvas/backend-setup/modal.md @@ -29835,7 +29837,7 @@ secrets = modal.Secret.from_name("openhands-server-keys") # canvas_ui_tool.py is required by the agent-server but ships with agent-canvas, # not the standalone server image. Fetch it from GitHub during image build. TOOLS_REMOTE_DIR = "/opt/canvas-tools" -CANVAS_UI_TOOL_URL = "https://raw.githubusercontent.com/OpenHands/agent-canvas/main/tools/canvas_ui_tool.py" +CANVAS_UI_TOOL_URL = "https://raw.githubusercontent.com/OpenHands/OpenHands/main/tools/canvas_ui_tool.py" agent_server_image = ( modal.Image.from_registry( @@ -30060,7 +30062,7 @@ modal volume delete openhands-data - [Connect and Manage Backends](/openhands/usage/agent-canvas/backends) - [Local Backend](/openhands/usage/agent-canvas/backend-setup/local) -- [Docker Backend](/openhands/usage/agent-canvas/backend-setup/docker) +- [Use Docker with Agent Canvas](/openhands/usage/agent-canvas/backend-setup/docker) - [VM / Self-Hosted Backend](/openhands/usage/agent-canvas/backend-setup/vm) - [Cloud Backend](/openhands/usage/agent-canvas/backend-setup/cloud) @@ -30399,14 +30401,14 @@ Before exposing Agent Canvas beyond an SSH tunnel: - [Install](/openhands/usage/agent-canvas/setup) - [Connect and Manage Backends](/openhands/usage/agent-canvas/backends) - [Local Backend](/openhands/usage/agent-canvas/backend-setup/local) -- [Docker Backend](/openhands/usage/agent-canvas/backend-setup/docker) +- [Use Docker with Agent Canvas](/openhands/usage/agent-canvas/backend-setup/docker) - [Kubernetes (Helm)](/openhands/usage/agent-canvas/backend-setup/kubernetes) - [Cloud Backend](/openhands/usage/agent-canvas/backend-setup/cloud) ### Backends Source: https://docs.openhands.dev/openhands/usage/agent-canvas/backends.md -A **backend** is an [agent server](/sdk/guides/agent-server/overview#what-is-a-remote-agent-server) and the workspace it operates in. All conversations, settings, and automations run against whichever backend is currently selected. +A **backend** is an [agent server](/sdk/guides/agent-server/overview#what-is-a-remote-agent-server) and the workspace it operates in. A workspace is the folder, mounted project directory, container, or cloud sandbox where the agent reads and writes files. All conversations, settings, and automations run against whichever backend is currently selected. ## Connecting to a Backend @@ -30676,7 +30678,7 @@ If the critic request fails with an API key or authentication error: ## Related Guides - [Customize and Settings](/openhands/usage/agent-canvas/customize-and-settings) -- [LLM Profiles and Model Configuration](/openhands/usage/agent-canvas/llm-profiles) +- [Manage LLM Profiles](/openhands/usage/agent-canvas/llm-profiles) - [OpenHands LLMs](/openhands/usage/llms/openhands-llms) - [SDK Critic Guide](/sdk/guides/critic) - [Critic Model Blog Post](https://openhands.dev/blog/sota-on-swe-bench-verified-with-inference-time-scaling-and-critic-model) @@ -30696,13 +30698,35 @@ Open the top-level `Customize` area to manage: - [Skills](/overview/skills) - [MCP Servers](/openhands/usage/settings/mcp-settings) +- [Plugins](/openhands/usage/agent-canvas/plugins) -Use the section navigation inside `Customize` to switch between those pages. +Use the section navigation inside `Customize` to switch between these pages. - MCP configuration lives under `Customize > MCP Servers`, not under `Settings`. + MCP Server configuration lives under `Customize > MCP Servers`, not under `Settings`. +When using an OpenHands Cloud backend, **Skills** becomes **Skills and Plugins** and opens the Cloud settings in a new tab. The local `Plugins` page is hidden, while `MCP Servers` remains in Agent Canvas. In Settings, **Cloud** becomes **All Cloud Settings** and an **Integrations** link opens the Cloud integrations page. Switching back to a local backend restores the local navigation. + +### Install Skills From Chat + +You can install a skill from a conversation with `/add-skill `. Because skills load when a conversation starts, Agent Canvas shows a banner after installation with **Start new conversation with this skill**. You will need to select it to start a conversation that includes the new skill. + +You can dismiss the banner. It appears again when you install another skill in the same session. + +### Check MCP Server Health + +Installed MCP server cards check their connection and retain the resulting status: + +| Status | Meaning | Available action | +|--------|---------|------------------| +| `Checking` | Agent Canvas is testing the server connection. | Wait for the check to finish. | +| `Reachable` | The server responded. For a public or no-auth server, this means credentials were not verified. | Retry the check or view the server documentation. | +| `Credential check failed` | The server responded but rejected its credentials. | Update credentials, then retry. | +| `Connection failure` | Agent Canvas could not connect to the server. | Retry, check the configuration, or view its documentation. | + +Server URLs and errors redact embedded secrets. Select **Update credentials** to edit a server; saving a corrected configuration refreshes its health status without reloading the page. + ## Settings The `Settings` area currently includes the following sections: @@ -30718,6 +30742,8 @@ The `Settings` area currently includes the following sections: On local backends, the `LLM` page also includes an `Available Profiles` area for saved profiles. +In `Settings > Application`, the **Conversation titles** setting selects the LLM profile used to generate conversation titles. **Automatic** uses the active local LLM profile; you can choose another saved profile, like a small, cheap LLM, when you want titles generated independently from the model selected for agent work. The same page shows the installed Agent Canvas version, update availability, and a **Check for updates** button. + Use `Settings > Agent` to choose the active Agent Profile for new conversations. OpenHands profiles reference LLM profiles from `Settings > LLM`; ACP profiles use the external agent's own model configuration. ## Configuration Is Per Backend @@ -30752,8 +30778,8 @@ Agent Canvas is open source. To work on it from source: 1. Clone the repo and install dependencies: ```bash - git clone https://github.com/OpenHands/agent-canvas.git - cd agent-canvas + git clone https://github.com/OpenHands/OpenHands.git + cd OpenHands npm install ``` @@ -30762,7 +30788,7 @@ Agent Canvas is open source. To work on it from source: npm run dev ``` -For development workflows, environment variables, testing, and advanced configuration, see the [Development Guide](https://github.com/OpenHands/agent-canvas/blob/main/docs/DEVELOPMENT.md) in the repository. +For development workflows, environment variables, testing, and advanced configuration, see the [Development Guide](https://github.com/OpenHands/OpenHands/blob/main/docs/DEVELOPMENT.md) in the repository. ### First Time Setup Source: https://docs.openhands.dev/openhands/usage/agent-canvas/first-time-setup.md @@ -30834,19 +30860,71 @@ Other available templates include: You can browse all pre-built automations from the `Automate` view at any time. See [Pre-built Automations](/openhands/usage/agent-canvas/prebuilt-automations) for the full list. -### LLM Profiles and Model Configuration +## After Your First Session + +Keep the terminal or Docker container that runs Agent Canvas active while you use the browser. When you are done, [stop Agent Canvas](/openhands/usage/agent-canvas/setup#stop-agent-canvas). Start it again with the same command when you return. + +For routine maintenance, see [update and uninstall](/openhands/usage/agent-canvas/setup#update-agent-canvas). If the UI, backend, or model does not work as expected, start with [Troubleshooting](/openhands/usage/agent-canvas/troubleshooting). + +### Manage LLM Profiles Source: https://docs.openhands.dev/openhands/usage/agent-canvas/llm-profiles.md Agent Canvas supports configuring your LLM provider, model, and credentials from the UI. It also supports saved **LLM profiles**, which make it easier to switch models without re-entering provider settings each time. -## Where to Configure Models +LLM profiles can also generate conversation titles. In `Settings > Application > Conversation titles`, leave the selection on **Automatic** to use the active local profile, or select a saved profile dedicated to title generation. + +## Configure an LLM Profile + +Open `Settings > LLM` to add a reusable LLM profile. Use the **Basic** tab for a provider and model available in the dropdowns. Use the **Advanced** tab when you need to enter a model name and base URL directly. Use the **All** tab to view and customize the full set of model configuration fields. + + +ACP agents such as Claude Code, Codex, and Gemini CLI manage their own model access. See [ACP Agents](/openhands/usage/agent-canvas/acp-agents) instead. + + +### Choose a Configuration Path + +| I have | Profile tab | Configure | +|---|---|---| +| An API key from Anthropic, OpenAI, Google, or another provider | **Basic** | Select the provider and model, then add its API key. | +| An OpenHands LLM API key | **Basic** | Select `OpenHands`, choose a model, and add your OpenHands LLM API key. | +| A local OpenAI-compatible server | **Advanced** | Enter the provider, exact model ID, base URL, and any required API key. | +| A LiteLLM proxy | **Advanced** | Use the `litellm_proxy/` model prefix, proxy base URL, and proxy API key. | -Open `Settings > LLM` to: +### Direct Provider -- choose a provider -- select or enter a model -- add the required API key -- save reusable LLM profiles +In the **Basic** tab, select your provider and model, add the API key issued by that provider, and save the profile. Use a new conversation to test the change; an existing conversation continues with the agent and model it started with. + +For provider and model recommendations, see [LLM Configuration](/openhands/usage/llms/llms). + +### OpenHands Provider + +Use an OpenHands LLM API key when you want Agent Canvas to access models through the OpenHands provider: + +1. Copy your LLM API key from [OpenHands Cloud](https://app.all-hands.dev/settings/api-keys). +2. In the **Basic** tab, select `OpenHands`, choose a model, and add the key. +3. Save the profile and start a new conversation. + +For key details and available models, see [OpenHands LLM Provider](/openhands/usage/llms/openhands-llms). + +### Local OpenAI-Compatible Endpoint + +A local server can be LM Studio, Ollama, vLLM, SGLang, or another service that exposes an OpenAI-compatible API. In the **Advanced** tab, enter the provider, exact model ID, endpoint base URL, and the required API key or a placeholder value when the server does not require one. + +The URL must be reachable from the **backend**, not only from your browser. For example, a backend in Docker cannot use `127.0.0.1` to reach a model server running on the host. Use the host address appropriate for that backend and confirm the endpoint's model inventory before saving. + +For example, if the model server runs on the host at port `1234` and the Agent Canvas backend runs in Docker, configure: + +- **Model**: `openai/`, replacing `` with the exact `id` returned by the server's `GET /v1/models` endpoint +- **Base URL**: `http://host.docker.internal:1234/v1` +- **API key**: `local-llm` or another placeholder value when the server does not require authentication + +See [Local LLMs](/openhands/usage/llms/local-llms) for LM Studio, Ollama, and other local-server examples. + +### LiteLLM Proxy + +In the **Advanced** tab, use the model name format `litellm_proxy/`, then enter your LiteLLM proxy base URL and API key. The model name after the prefix must match a model configured on the proxy. + +See [LiteLLM Proxy](/openhands/usage/llms/litellm-proxy) for the complete configuration. ## Working with LLM Profiles @@ -30858,26 +30936,43 @@ LLM profiles are useful when you want different model setups for different tasks LLM profiles are separate from [Agent Profiles](/openhands/usage/agent-canvas/agent-profiles). Agent Profiles choose which agent runs a new conversation. OpenHands Agent Profiles reference an LLM profile to decide which model configuration that agent uses. +### Manage Saved Profiles + +The available profiles list shows each profile's name, configured model, and whether it is active. Use a profile's menu to edit or rename it, set it as the active profile for new conversations, or delete it when you no longer need it. + ## Switching Profiles in a Conversation -You can switch profiles from the chat input with the `/model` command: +You can switch profiles from the profile selector in the chat input or with the `/model` command: - `/model` — list the saved profiles available to the conversation - `/model ` — switch to a specific saved profile -Agent Canvas also shows model-switch events in the conversation timeline so you can see when a profile changed during a task. +A switch preserves the conversation history, workspace, and task state; it applies to future model requests only. Agent Canvas also shows model-switch events in the conversation timeline so you can see when a profile changed during a task. - LLM profiles are fully supported in Agent Canvas and are still rolling out in OpenHands Cloud. If you connect Agent Canvas to a cloud backend, profiles you configure in Agent Canvas may be available there before the same profiles appear in the hosted OpenHands Cloud UI for your account. +Model switching requires saved LLM profiles. If `/model` is not available in the chat input, create a profile in `Settings > LLM` and confirm that the active backend supports profile switching. +## Fix a Failed Configuration + +| Symptom | Check first | Next step | +|---|---|---| +| Provider is not recognized | Provider selection and model prefix | Use the matching configuration path above. | +| Model format or identifier error | Exact model ID | Compare it with the provider or proxy model inventory. | +| Local server cannot be reached | Base URL from the backend | Check host, port, and container or network reachability. | +| Authentication or permission error | Key type and backend scope | Re-enter the key or follow the provider guide. | +| Model cannot perform the task | Context and tool support | Choose a compatible model from the provider's recommendations. | + +For error-specific steps, see [Troubleshooting](/openhands/usage/agent-canvas/troubleshooting#model-or-api-key-errors). + + ## Recommended Workflow -1. Configure a default profile in `Settings > LLM`. -2. Create additional profiles for specific tasks or cost levels. +1. Configure and save a default profile in `Settings > LLM`. +2. Create additional profiles for specific tasks or cost levels, using descriptive names that make their purpose clear. 3. Open `Settings > Agent` and choose which LLM profile an OpenHands Agent Profile should use. -4. Start a conversation. -5. Use `/model` when you want to switch profiles without leaving the chat. +4. Start a new conversation and send a simple message to confirm the selected model responds. +5. Use the profile selector or `/model` when you want to switch profiles without leaving the chat. ## Related Guides @@ -31031,22 +31126,23 @@ ngrok also supports OAuth, IP allowlists, and other access controls for addition ### Agent Canvas Overview Source: https://docs.openhands.dev/openhands/usage/agent-canvas/overview.md -Agent Canvas is an open-source control surface for agentic work. It gives you one browser UI for conversations, files, terminal output, model configuration, backends, and automations. +Agent Canvas is an open-source control surface for agentic work. From one place, you can manage conversations, files, terminals, model configuration, backends, and automations. -By default, Agent Canvas runs on your own machine. You can also connect the same UI to backends running in Docker, on a VM, on Modal, or in [OpenHands Cloud](/openhands/usage/cloud/openhands-cloud). +The browser interface connects to one or more backends that run the agent and its tools. By default, that backend runs on your machine, but you can instead use Docker, a VM, Modal, or [OpenHands Cloud](/openhands/usage/cloud/openhands-cloud). The LLM models can run locally, through a provider API or be accessed through an ACP agent. ## When To Use Agent Canvas -Use Agent Canvas when you want a self-hosted or local browser UI for agents that can work with real files, terminals, tools, and automations. +Choose the path that matches where and how you want your agents to run: | If you want to... | Start here | |-------------------|------------| | Run OpenHands locally in a browser | [Install Agent Canvas](/openhands/usage/agent-canvas/setup) | -| Use a sandboxed local environment | [Docker Backend](/openhands/usage/agent-canvas/backend-setup/docker) | +| Use a sandboxed local environment | [Use Docker with Agent Canvas](/openhands/usage/agent-canvas/backend-setup/docker) | | Run agents on an always-on machine | [VM / Self-Hosted Installation](/openhands/usage/agent-canvas/backend-setup/vm) | | Connect to managed cloud sandboxes | [Cloud Backend](/openhands/usage/agent-canvas/backend-setup/cloud) | | Use Claude Code, Codex, Gemini CLI, or another ACP agent | [ACP Agents](/openhands/usage/agent-canvas/acp-agents) | -| Create scheduled or event-driven workflows | [Pre-built Automations](/openhands/usage/agent-canvas/prebuilt-automations) | + +You can also test a preview build of the native desktop app. [Try the desktop preview](/openhands/usage/agent-canvas/setup#desktop-app-preview-build). ## How Agent Canvas Works @@ -31059,8 +31155,25 @@ Agent Canvas has four pieces to understand: | **Workspace** | The folder, repository, container mount, or cloud sandbox the agent works in. | This determines which files the agent can read and write. | | **Agent and model** | The OpenHands agent or an ACP agent, plus the model credentials it uses. | This determines which LLM or provider receives conversation context and powers the agent. | +```mermaid +flowchart LR + browser["Browser UI"] --> backend["Selected backend"] + backend --> conversation["Conversation and agent"] + conversation --> model["Model access"] + conversation --> workspace["Workspace and tools"] + + classDef primary fill:#f3e8ff,stroke:#7c3aed,stroke-width:2px + classDef secondary fill:#e8f3ff,stroke:#2b6cb0,stroke-width:2px + classDef tertiary fill:#fff4df,stroke:#b7791f,stroke-width:2px + class browser primary + class backend,conversation secondary + class model,workspace tertiary +``` + +The browser UI is a client of the selected backend. Conversations, settings, secrets, LLM profiles, MCP servers, skills, and automations persist on that backend. The workspace and tools run where that backend runs. + - Settings, secrets, LLM configuration, MCP servers, skills, conversations, and automations are scoped to the active backend. Switching backends switches the environment the agent is using. + Switching backends switches the environment the agent is using. For details on how conversations and workspaces remain separate, see [Conversations](/openhands/usage/agent-canvas/conversations) and [Backends](/openhands/usage/agent-canvas/backends). ## Choosing A Trust Boundary @@ -31078,25 +31191,39 @@ Before installing, decide where you want the agent to run and what files it shou Agent Canvas can run agents that execute shell commands, read files, write files, and use connected tools. Only connect a backend to files, secrets, and networks that you are willing to let the agent use. +## What Happens When You Close the Terminal? + +For a local npm or npx installation, closing the terminal stops the Agent Canvas process, so the browser UI can no longer use its local backend. Start Agent Canvas again with the same command to continue. A Docker container, VM, or cloud backend continues running until that backend is stopped. + +See [Install](/openhands/usage/agent-canvas/setup#run-agent-canvas-again) to restart Agent Canvas and [Troubleshooting](/openhands/usage/agent-canvas/troubleshooting) if the browser cannot reconnect. + ## Model Access Agent Canvas supports several model access patterns: - **Direct provider key** — enter an API key from Anthropic, OpenAI, Google, or another supported provider. -- **OpenHands Cloud key** — use an OpenHands Cloud API key for verified hosted models. +- **OpenHands LLM API key** — use an OpenHands LLM API key for verified hosted models. - **ACP agent subscription login** — use a signed-in provider, such as Claude Code, Codex, or Gemini, when the backend runs on the same machine as that login. - **Local or OpenAI-compatible provider** — connect providers such as Ollama, LM Studio, LiteLLM, or a compatible gateway through model settings. -See [LLM Profiles and Model Configuration](/openhands/usage/agent-canvas/llm-profiles) and [ACP Agents](/openhands/usage/agent-canvas/acp-agents) for details. +See [Manage LLM Profiles](/openhands/usage/agent-canvas/llm-profiles) and [ACP Agents](/openhands/usage/agent-canvas/acp-agents) for details. ## How It Fits With Other OpenHands Products -| Product | Use It When | -|---------|-------------| -| **Agent Canvas** | You want a self-hosted browser UI for local, remote, or cloud-backed agents and automations. | -| **OpenHands Cloud** | You want a fully managed hosted experience with no local installation. | -| **OpenHands SDK** | You want to build agents or agent-powered applications in Python. | -| **Local GUI (Legacy)** | You are following older Docker-based Local GUI documentation. New local browser workflows should use Agent Canvas. | +| Surface | Best for | Where it runs | +|---------|----------|---------------| +| **Agent Canvas** | Browser-first agent work, workspace access, and automations | The backend you select: your machine, Docker, a VM, Modal, or Cloud | +| **OpenHands SDK** | Building agent-powered Python applications | Your application and the workspace you configure | +| **OpenHands Cloud** | Fully managed hosted execution | Managed OpenHands Cloud infrastructure | +| **Local GUI (Legacy)** | Following older Docker-based Local GUI documentation | Your local Docker environment | + +### Agent Canvas vs "openhands serve" + +`agent-canvas` starts the current Agent Canvas UI and backend stack. `openhands serve` starts the legacy OpenHands CLI GUI server and will not run if you have only installed agent-canvas. + +### How Conversations and Workspaces Are Isolated + +A conversation belongs to one active backend and has its own history, agent configuration, and backend-managed state. Its workspace is the folder, mount, or sandbox attached to that backend. Start a new conversation for a separate task, or [branch a conversation](/openhands/usage/agent-canvas/conversations#branch-from-a-message) to explore another path while preserving the original. ## Before You Start @@ -31114,7 +31241,9 @@ For a sandboxed local setup, use Docker instead of the direct npm backend path. - [Install Agent Canvas](/openhands/usage/agent-canvas/setup) - [First Time Setup](/openhands/usage/agent-canvas/first-time-setup) - [Connect and Manage Backends](/openhands/usage/agent-canvas/backends) -- [LLM Profiles and Model Configuration](/openhands/usage/agent-canvas/llm-profiles) +- [Manage LLM Profiles](/openhands/usage/agent-canvas/llm-profiles) +- [Conversations](/openhands/usage/agent-canvas/conversations) +- [ACP Agents](/openhands/usage/agent-canvas/acp-agents) - [Troubleshooting](/openhands/usage/agent-canvas/troubleshooting) ### Plugins in Agent Canvas @@ -31157,6 +31286,15 @@ Local plugins are discovered from user-level plugin directories such as `~/.agen Local plugins are read-only in the Plugins page. To change or remove a local plugin, edit the files in the local plugin directory. +## Inspect Plugin Contents + +Select a plugin to open its details. Alongside its metadata, the detail view can show: + +- **Skills in this plugin bundle** — cards for bundled skills, including command-derived skills, with their icons, names, and descriptions. +- **Files** — an expandable directory tree. Select a file to view it inline with syntax highlighting; select it again to close the viewer. + +Plugin content is provided by the active backend. A backend that does not provide this data shows plugin metadata only. + ## Enable or Disable Installed Plugins Enabled installed plugins are automatically available to new conversations on that backend. Disabled plugins remain installed, but they are not loaded into new conversations. @@ -31590,10 +31728,10 @@ After the automation is created: - [Setup a Pre-built Automation](/openhands/usage/agent-canvas/prebuilt-automations) - [Customize and Settings](/openhands/usage/agent-canvas/customize-and-settings) -### Install +### Install Agent Canvas Source: https://docs.openhands.dev/openhands/usage/agent-canvas/setup.md -Agent Canvas can run directly on your machine or inside Docker. Start with the simplest setup that matches the trust boundary you want. +Agent Canvas can run directly on your machine or inside Docker. Use the local npm or npx paths for a direct local backend, or Docker for a sandboxed backend with explicit project mounts. Start with the simplest setup that matches the trust boundary you want. Agent Canvas starts an agent server that can run shell commands, read files, write files, and use connected tools. Treat the machine or container where the backend runs as trusted infrastructure. Before exposing Agent Canvas to a network you do not control, review [VM / Self-Hosted Installation](/openhands/usage/agent-canvas/backend-setup/vm). @@ -31728,8 +31866,8 @@ Agent Canvas can run directly on your machine or inside Docker. Start with the s Use the source workflow only when you want to modify Agent Canvas itself: ```bash - git clone https://github.com/OpenHands/agent-canvas.git - cd agent-canvas + git clone https://github.com/OpenHands/OpenHands.git + cd OpenHands npm install npm run dev ``` @@ -31750,6 +31888,30 @@ After startup: If the page does not load, check the terminal where Agent Canvas is running. Common causes are a missing prerequisite, a busy port, or Docker not running. +## Run Agent Canvas Again + +After you close the terminal or restart your computer, start Agent Canvas with the same command you used to install it. Keep that terminal or Docker container running while you use the browser UI. + + + + ```bash + agent-canvas + ``` + + + + ```bash + npx @openhands/agent-canvas + ``` + + + + Run the same `docker run` command from [Install and Run](#install-and-run). The browser connects to the host port you map, while the backend and model configuration run where the Agent Canvas process or container is running. + + + +If the UI opens but the backend is disconnected or a model cannot respond, use [Troubleshooting](/openhands/usage/agent-canvas/troubleshooting) to identify the affected part of the stack. + ## Common Startup Options | Option | Description | @@ -31780,11 +31942,12 @@ agent-canvas --port 3000 ## Stop Agent Canvas - + + Return to the terminal running Agent Canvas and press `Ctrl+C`. - + Return to the terminal running Agent Canvas and press `Ctrl+C`. @@ -31803,20 +31966,20 @@ agent-canvas --port 3000 ## Update Agent Canvas - - Stop Agent Canvas, then run the latest package: + + Stop Agent Canvas, then reinstall the latest package: ```bash - npx @openhands/agent-canvas@latest + npm install -g @openhands/agent-canvas@latest + agent-canvas --version ``` - - Stop Agent Canvas, then reinstall the latest package: + + Stop Agent Canvas, then run the latest package: ```bash - npm install -g @openhands/agent-canvas@latest - agent-canvas --version + npx @openhands/agent-canvas@latest ``` @@ -31831,19 +31994,13 @@ agent-canvas --port 3000 Your settings and conversation data are stored outside the package or image when you use the documented `~/.openhands` mount. + + **Recover or reset:** Use [Troubleshooting](/openhands/usage/agent-canvas/troubleshooting) when the browser is blank, a port is busy, the backend is unreachable, a model or API key fails, or an update or uninstall is stuck. It also explains clean removal and reinstall. + + ## Uninstall Agent Canvas - - There is no Agent Canvas package to uninstall when you use `npx`. Stop the running process with `Ctrl+C`. - - If you want to clear downloaded package cache entries, use npm's cache commands: - - ```bash - npm cache verify - ``` - - Stop any running Agent Canvas process, then uninstall the package: @@ -31854,6 +32011,16 @@ Your settings and conversation data are stored outside the package or image when If Windows reports that `uv.exe` or another file is in use, close terminals running Agent Canvas, stop related processes, and run the uninstall command again. + + There is no Agent Canvas package to uninstall when you use `npx`. Stop the running process with `Ctrl+C`. + + If you want to clear downloaded package cache entries, use npm's cache commands: + + ```bash + npm cache verify + ``` + + Stop any running container, then remove the image if you no longer need it: @@ -31867,12 +32034,52 @@ Your settings and conversation data are stored outside the package or image when Uninstalling the package or image does not automatically remove your persisted data. If you want to delete local settings, secrets, and conversation history, remove the persistence directory you mounted or used, such as `~/.openhands`. +## Desktop App (Preview Build) + +The Agent Canvas desktop app for macOS and Windows is an early preview build ready for user testing. It bundles the Node.js and `uv` runtimes, so you do not need to install prerequisites or keep a terminal open. + + + Please [join the OpenHands Slack community](https://openhands.dev/joinslack) to share feedback and [open an issue](https://github.com/OpenHands/OpenHands/issues) for problems you find while testing the preview. + + +### Install and Run + +Download the installer for your operating system from the [OpenHands releases page](https://github.com/OpenHands/OpenHands/releases). + +**macOS (Apple silicon)** + +1. Download the `Agent-Canvas--arm64.dmg` file. +2. Open the disk image and drag **Agent Canvas** to **Applications**. +3. Launch Agent Canvas from Applications. + +Pre-built desktop releases support Apple silicon Macs. On an Intel Mac, use the npm or [from-source](#install-and-run) installation method. + +**Windows** + +1. Download the `Agent-Canvas-Setup-.exe` installer. +2. Run the installer. If Windows SmartScreen prompts you, confirm that you want to continue. +3. Launch Agent Canvas from the Start menu. + +The desktop app starts its local backend automatically. During startup, select **Show details** to view and copy the live startup log. This is useful if startup takes longer than expected or fails. + +### Troubleshooting and Lifecycle + +On macOS, the app is ad-hoc signed. If macOS reports that Agent Canvas is damaged or cannot be opened, clear its quarantine attribute in Terminal, then launch it again: + +```bash +xattr -d com.apple.quarantine /Applications/Agent\ Canvas.app +``` + +Do not use `xattr -cr`; that command does not clear this issue on macOS Sequoia. + +To stop the app, quit **Agent Canvas** from its application menu or window controls. To update it, download and install the latest desktop release; `Settings > Application` also shows the installed version and can check for updates. To uninstall, quit the app and move it to the Trash on macOS or uninstall it from **Installed apps** on Windows. + ## Next Steps - [First Time Setup](/openhands/usage/agent-canvas/first-time-setup) - [Connect and Manage Backends](/openhands/usage/agent-canvas/backends) -- [LLM Profiles and Model Configuration](/openhands/usage/agent-canvas/llm-profiles) -- [Docker Backend](/openhands/usage/agent-canvas/backend-setup/docker) +- [Manage LLM Profiles](/openhands/usage/agent-canvas/llm-profiles) +- [Use Docker with Agent Canvas](/openhands/usage/agent-canvas/backend-setup/docker) - [Troubleshooting](/openhands/usage/agent-canvas/troubleshooting) ### Troubleshooting @@ -31880,6 +32087,28 @@ Source: https://docs.openhands.dev/openhands/usage/agent-canvas/troubleshooting. Use this page when Agent Canvas does not start, the browser cannot reach it, the backend is disconnected, model setup fails, or uninstall/update commands get stuck. +## Choose Your Situation + +**Agent Canvas cannot start** + +- ["agent-canvas" Command Not Found](#agent-canvas-command-not-found), +- [Missing `uv` or `uvx`](#missing-uv-or-uvx) +- [Port Already In Use](#port-already-in-use) +- [Docker Daemon Not Running](#docker-daemon-not-running). + +**The browser works but Canvas cannot reach its backend** +- [Backend Is Unreachable](#backend-is-unreachable) +- [Wrong Backend URL Or API Key](#wrong-backend-url-or-api-key). + +**The backend works but the model fails** +- [Model Or API Key Errors](#model-or-api-key-errors) +- [`LLM Provider NOT provided`](#llm-provider-not-provided) +- [ACP Agent Credentials Are Not Used](#acp-agent-credentials-are-not-used). + +**You need to remove or reset Canvas** +- [Update Or Uninstall Is Stuck](#update-or-uninstall-is-stuck) +- [Uninstall Agent Canvas](/openhands/usage/agent-canvas/setup#uninstall-agent-canvas) for clean removal and reinstall. + ## Start With These Checks Run the checks for the install method you used: @@ -32100,8 +32329,7 @@ Common causes: For model setup details, see: -- [LLM Profiles and Model Configuration](/openhands/usage/agent-canvas/llm-profiles) -- [LLM Settings](/openhands/usage/settings/llm-settings) +- [Manage LLM Profiles](/openhands/usage/agent-canvas/llm-profiles) - [Local LLMs](/openhands/usage/llms/local-llms) - [LiteLLM Proxy](/openhands/usage/llms/litellm-proxy) @@ -32215,8 +32443,8 @@ Uninstalling the package or image does not automatically delete persisted settin If you are still stuck: - [Join the OpenHands Slack community](https://openhands.dev/joinslack) -- [Open an issue in the Agent Canvas repository](https://github.com/OpenHands/agent-canvas/issues) -- [Browse the Agent Canvas source](https://github.com/OpenHands/agent-canvas) +- [Open an issue in the OpenHands repository](https://github.com/OpenHands/OpenHands/issues) +- [Browse the Agent Canvas source](https://github.com/OpenHands/OpenHands) ### Main Agent and Capabilities Source: https://docs.openhands.dev/openhands/usage/agents.md @@ -36808,9 +37036,11 @@ retry_max_wait = 30 retry_multiplier = 2 ``` -### Local LLMs +### Run Local LLMs with OpenHands Source: https://docs.openhands.dev/openhands/usage/llms/local-llms.md +Use this guide when you want a local model, rather than a local Agent Canvas backend or local project files. Local LLMs can have limited functionality; use a capable model and GPU-backed server for the best experience. + ## News - 2026/05/21: We now recommend [Qwen3.6-35B-A3B](https://huggingface.co/Qwen/Qwen3.6-35B-A3B) as the first local model to try with OpenHands. It is an open-weight MoE model built for agentic coding, supports a large context window, and is available through LM Studio, Ollama, vLLM, and SGLang. @@ -38455,6 +38685,12 @@ Other options include: - **Docker-based proxies**: Containerized solutions for better isolation. - **Cloud-hosted MCP services**: Third-party services that provide MCP endpoints. +## Manage Installed Servers + +In Agent Canvas, open `Customize > MCP Servers` to manage installed MCP servers. Use the control on an installed server card to disable it without deleting its configuration or saved credentials. Disabled servers are unavailable to new conversations until you enable them again. + +Use the editor's delete action only when you want to remove the server configuration. Editing a disabled server does not enable it. + ## OAuth Authentication Some MCP servers (like Notion MCP) require OAuth authentication instead of API keys. OpenHands supports OAuth-based MCP servers through the [FastMCP](https://gofastmcp.com/) library. @@ -40970,6 +41206,39 @@ make a POST request to the V1 app-conversations endpoint. +#### Optional observability fields + +When starting a conversation, you can attach observability context to the trace: + +| Field | Type | Description | +| --- | --- | --- | +| `observability_span_name` | string | Creates a named child span under the root `conversation` span. Use stable, low-cardinality names for grouping and signal routing. | +| `observability_tags` | string array | Adds tags to the conversation root observability span. | +| `observability_metadata` | object | Adds trace-level metadata. Values must be scalars or homogeneous scalar arrays, such as strings, numbers, booleans, `string[]`, `number[]`, or `boolean[]`. | + +Example: + +```json +{ + "initial_message": { + "content": [ + { + "type": "text", + "text": "Evaluate this repository against the WB rubric." + } + ] + }, + "selected_repository": "yourusername/your-repo", + "observability_span_name": "wb_rubric_eval", + "observability_tags": ["wb-rubric", "evaluation"], + "observability_metadata": { + "evaluation": "wb", + "attempt": 1, + "replay": false + } +} +``` + #### Response The API will return a JSON object with details about the conversation start task: @@ -43179,7 +43448,7 @@ There are a few ways to work with OpenHands: ## Agent Canvas Agent Canvas is a browser-based UI and backend server for running agents and automations. A single `agent-canvas` command starts the full stack locally. Self-host on a VM, or connect to OpenHands Cloud. -[Get started with Agent Canvas](/openhands/usage/agent-canvas/overview) or [view the source](https://github.com/OpenHands/agent-canvas) +[Get started with Agent Canvas](/openhands/usage/agent-canvas/overview) or [view the source](https://github.com/OpenHands/OpenHands) ## OpenHands Cloud A fully managed version of OpenHands with source-available features and integrations: @@ -43892,152 +44161,142 @@ Get started with OpenHands in minutes. -### Overview +### Skills Overview Source: https://docs.openhands.dev/overview/skills.md -Skills are specialized prompts that enhance OpenHands with domain-specific knowledge, expert guidance, and automated task handling. They provide consistent practices across projects and can be triggered automatically based on keywords or context. +Skills give OpenHands reusable instructions for specialized tasks. A skill can capture domain knowledge, define a repeatable workflow, and include supporting scripts, references, or templates. + +Skills guide the agent's behavior; they do not grant permissions or install dependencies by themselves. The agent can only use the files, tools, secrets, and network access available in its environment. -OpenHands supports an **extended version** of the [AgentSkills standard](https://agentskills.io/specification) with optional keyword triggers for automatic activation. See the [SDK Skills Guide](/sdk/guides/skill) for details on the SKILL.md format. +OpenHands supports the [Agent Skills specification](https://agentskills.io/specification) and adds optional features such as keyword triggers and path-triggered rules. Other Agent Skills clients may ignore these OpenHands extensions. -## Official Skill Registry +## Choose the Right Mechanism -The official global skill registry is maintained at [github.com/OpenHands/extensions](https://github.com/OpenHands/extensions). This repository contains community-shared skills that can be used by all OpenHands agents. You can browse available skills, contribute your own, and learn from examples created by the community. - -## How Skills Work - -Skills inject additional context and rules into the agent's behavior. +| Need | Use | Recommended Location | Loading Behavior | +|---|---|---|---| +| Instructions for every task in a repository | `AGENTS.md` | Repository root | Full content is included in the initial system prompt | +| Reusable expertise or a workflow for a specific task | Agent Skills `SKILL.md` | `.agents/skills//SKILL.md` | Name and description are advertised first; the agent invokes the full skill when relevant | +| Automatic activation for specific words or commands | `SKILL.md` with `triggers` | `.agents/skills//SKILL.md` | The skill remains available for model invocation and its content is also injected when a trigger matches | +| Deterministic guidance for specific files | A skill with `paths` | `.agents/skills//SKILL.md` or `.agents/skills/.md` | Content is injected when the agent first touches a matching file | -At a high level, OpenHands supports three loading models: +Use `AGENTS.md` for short, repository-wide conventions. Use `SKILL.md` for focused knowledge that is needed only for some tasks. A legacy `.md` skill without a trigger is always loaded in full; prefer `AGENTS.md` for that use case so its purpose is clear. -- **Always-on context** (e.g., `AGENTS.md`) that is injected into the system prompt at conversation start. -- **On-demand skills** that are either: - - **triggered by the user** (keyword matches), or - - **invoked by the agent** (the agent decides to look up the full skill content). -- **Path-triggered rules** that are injected deterministically when the agent reads, edits, or creates a file whose path matches a glob pattern. +OpenHands also recognizes `CLAUDE.md` and `GEMINI.md` as model-specific repository context. -## Permanent agent context (recommended) +## How Progressive Disclosure Works -For repository-wide, always-on instructions, prefer a root-level `AGENTS.md` file. +Agent Skills use three levels of context: -We also support model-specific variants: -- `GEMINI.md` for Gemini -- `CLAUDE.md` for Claude +1. **Discovery**: OpenHands loads each skill's `name` and `description` into the available-skills catalog. +2. **Invocation**: When a task matches the description, the agent invokes the skill by name and receives the full `SKILL.md` instructions. +3. **Resources**: The agent reads referenced files from `scripts/`, `references/`, or `assets/` only when needed. -## Triggered and optional skills +This keeps the initial prompt smaller than loading every skill in full. Write the description to explain both what the skill does and when it applies; the agent uses that metadata to decide whether to invoke it. -To add optional skills that are loaded on demand: +OpenHands supports two deterministic activation paths: -- **AgentSkills standard (recommended for progressive disclosure)**: create one directory per skill and add a `SKILL.md` file. -- **Legacy/OpenHands format (simple)**: put markdown files in `.agents/skills/*.md` at the repository root. +- `triggers` injects the skill when a keyword or command appears in a user message. The skill is still available for model invocation. +- `paths` turns the file into a path-triggered rule. The rule is not advertised to the model and is injected once per conversation when a matching file is read, edited, or created. If a file declares both `paths` and `triggers`, `paths` takes precedence. -Loaded skills take up space in the context window. On-demand skills help keep the system prompt smaller because the agent sees a summary first and reads the full content only when needed. +Always-on content occupies the conversation context from the beginning. Keep `AGENTS.md` concise and move lengthy or specialized instructions into on-demand skills and references. -### Example Repository Structure +## Official Skill Registry -``` -some-repository/ -├── AGENTS.md # Permanent repository guidelines (recommended) +The official global skill registry is maintained at [github.com/OpenHands/extensions](https://github.com/OpenHands/extensions). This repository contains community-shared skills that can be used by all OpenHands agents. You can browse available skills, contribute your own, and learn from examples created by the community. + + +## Five-Minute Setup + +Add concise repository guidance and one on-demand skill: + +```text +my-repository/ +├── AGENTS.md └── .agents/ └── skills/ - ├── rot13-encryption/ # AgentSkills standard (progressive disclosure) - │ ├── SKILL.md - │ ├── scripts/ - │ │ └── rot13.sh - │ └── references/ - │ └── README.md - ├── another-agentskill/ # AgentSkills standard (progressive disclosure) - │ ├── SKILL.md - │ └── scripts/ - │ └── placeholder.sh - └── legacy_trigger_this.md # Legacy/OpenHands format (keyword-triggered) + └── release-checklist/ + └── SKILL.md ``` -## Skill Loading Precedence +```markdown title="AGENTS.md" +# Repository Guidance -For project location, paths are relative to the repository root; `.agents/skills/` is a subdirectory of the project directory. -For user home location, paths are relative to the user home: `~/` +Run the test suite before committing. Keep changes focused and follow the existing project conventions. +``` -When multiple skills share the same name, OpenHands keeps the first match in this order: +```markdown title=".agents/skills/release-checklist/SKILL.md" +--- +name: release-checklist +description: Prepare and verify a release checklist. Use when creating release notes or publishing a release. +--- -1. `.agents/skills/` (recommended) -2. `.openhands/skills/` (deprecated) -3. `.openhands/microagents/` (deprecated) +Check the version, changelog, validation commands, and release notes before publishing. +``` -Project-specific skills take precedence over user skills. +For a portable Agent Skills package, `name` and `description` are required. The `name` must match the parent directory and use lowercase letters, numbers, and hyphens. See [Creating Skills](/overview/skills/creating) for the complete format and authoring guidance. -## Skill Types +Start a new conversation after changing skill files so OpenHands rebuilds the available-skills catalog. -Currently supported skill types: +## Skill Locations and Precedence -- **[Permanent Context](/overview/skills/repo)**: Repository-wide guidelines and best practices. We recommend `AGENTS.md` (and optionally `GEMINI.md` / `CLAUDE.md`). -- **[Keyword-Triggered Skills](/overview/skills/keyword)**: Guidelines activated by specific keywords in user prompts. -- **[Path-Triggered Rules](/overview/skills/path)**: Guidelines injected automatically when the agent touches files matching a glob pattern. -- **[Organization Skills](/overview/skills/org)**: Team or organization-wide standards. -- **[Global Skills](/overview/skills/public)**: Community-shared skills and templates. +OpenHands can combine skills from several scopes: -### Skills Frontmatter Requirements +| Scope | Recommended Location | Applies To | +|---|---|---| +| Repository context | `/AGENTS.md` | Conversations in that repository | +| Project skills | `/.agents/skills/` | Conversations using that project workspace | +| User skills | `~/.agents/skills/` | Conversations for that user | +| Public skills | [OpenHands extensions registry](https://github.com/OpenHands/extensions/tree/main/skills) | Conversations configured to load the public registry | -Each skill file may include frontmatter that provides additional information. In some cases, this frontmatter is required: +Both the legacy `.openhands/skills/` and `.openhands/microagents/` directories remain supported, but use `.agents/skills/` for new skills. This location follows the Agent Skills standard and makes skills portable across compatible agent tools. -| Skill Type | Required | -|-------------|----------| -| General Skills | No | -| Keyword-Triggered Skills | Yes | -| Path-Triggered Rules | Yes | +Name conflicts are resolved by precedence rather than by merging skill bodies. For automatically loaded sources, project skills override user skills, and user skills override public skills. Within a project or user scope, `.agents/skills/` takes precedence over the legacy directories. -## Skills Support Matrix + +In the SDK, explicitly supplied skills override automatically loaded user and public skills. Project skills are resolved from the conversation workspace and override a same-named skill from another source. See the [SDK Skills Guide](/sdk/guides/skill) for loader configuration. + -| Platform | Support Level | Configuration Method | Implementation | Documentation | -|----------|---------------|---------------------|----------------|---------------| -| **CLI** | ✅ Full Support | `~/.agents/skills/` (user-level) and `.agents/skills/` (repo-level) | File-based markdown | [Skills Overview](/overview/skills) | -| **SDK** | ✅ Full Support | Programmatic `Skill` objects | Code-based configuration | [SDK Skills Guide](/sdk/guides/skill) | -| **Local GUI** | ✅ Full Support | `.agents/skills/` + UI | File-based with UI management | [Local Setup](/openhands/usage/run-openhands/local-setup) | -| **OpenHands Cloud** | ✅ Full Support | Cloud UI + repository integration | Managed skill library | [Cloud UI](/openhands/usage/cloud/cloud-ui) | +## OpenHands-Specific Skill Types -## Platform-Specific Differences +- [Repository Context](/overview/skills/repo) provides always-on project instructions. +- [Keyword-Triggered Skills](/overview/skills/keyword) activate when a user message contains configured terms. +- [Path-Triggered Rules](/overview/skills/path) apply deterministic instructions to matching files. +- [Organization and User Skills](/overview/skills/org) share guidance across repositories. +- [Global Skills](/overview/skills/public) are reusable skills published through the OpenHands extensions registry. - - - - File-based configuration in two locations: - - `~/.agents/skills/` - User-level skills (all conversations). - - `.agents/skills/` - Repository-level skills (current directory) - - Markdown format for skill definitions - - Manual file management required - - Supports both general and keyword-triggered skills - - - - Programmatic `Skill` objects in code - - Dynamic skill creation and management - - Integration with custom workflows - - Full control over skill lifecycle - - - - Visual skill management through UI - - File-based storage with GUI editing - - Real-time skill status display - - Drag-and-drop skill organization - - - - Cloud-based skill library management - - Team-wide skill sharing and templates - - Organization-level skill policies - - Integrated skill marketplace - - +## Using Skills Across OpenHands + +| Surface | How Skills Are Loaded | +|---|---| +| **Agent Canvas** | Manage installed skills under `Customize > Skills`; configuration is scoped to the active backend | +| **SDK and agent server** | Pass `Skill` objects directly or enable the user, project, and public file-based loaders in `AgentContext` | +| **OpenHands Cloud** | Select or import skills for a conversation, including skills stored in Git repositories | + +In Agent Canvas, disabling a bundled or custom skill prevents it from being included in the agent context for new OpenHands and ACP conversations. Enabled skills remain available to new conversations. + +See [Customize and Settings](/openhands/usage/agent-canvas/customize-and-settings) for Agent Canvas and [Plugin Launcher](/openhands/usage/cloud/plugin-launcher) for loading a Git-hosted skill into an OpenHands Cloud conversation. + + +Review a skill and its bundled resources before installing it. A skill can instruct the agent to run scripts, read files, use secrets, or call connected tools. Only install skills from sources you trust. + + +## Next Steps + +- [Add an Existing Skill](/overview/skills/adding) +- [Create a Skill](/overview/skills/creating) +- [Browse the OpenHands Skills Registry](https://github.com/OpenHands/extensions/tree/main/skills) +- [Bundle Skills in a Plugin](/overview/plugins) +- [Monitor and Improve Skills](/overview/skills/monitoring) ## Learn More -- **To add existing skills**: See [Adding New Skills](/overview/skills/adding) -- **To create your own skills**: See [Creating New Skills](/overview/skills/creating) -- **To monitor skill performance**: See [Monitoring and Improving Skills](/overview/skills/monitoring) -- **For bundling multiple components**: See [Plugins](/overview/plugins) -- **For SDK integration**: See [SDK Skills Guide](/sdk/guides/skill) -- **For architecture details**: See [Skills Architecture](/sdk/arch/skill) -- **For specific skill types**: See [Repository Skills](/overview/skills/repo), [Keyword Skills](/overview/skills/keyword), [Path-Triggered Rules](/overview/skills/path), [Organization Skills](/overview/skills/org), and [Global Skills](/overview/skills/public) +- **For SDK integration**: See [**SDK Skills Guide**](/sdk/guides/skill) +- **For architecture details**: See [**Skills Architecture**](/sdk/arch/skill) +- **For specific skill types**: See [**Repository Skills**](/overview/skills/repo), [**Keyword Skills**](/overview/skills/keyword), [**Path-Triggered Rules**](/overview/skills/path), [**Organization Skills**](/overview/skills/org), and [**Global Skills**](/overview/skills/public) ### Adding New Skills Source: https://docs.openhands.dev/overview/skills/adding.md @@ -45475,7 +45734,7 @@ Before you begin, complete the [Quick Start guide](/enterprise/quick-start). frontend: ingress: enabled: true - hostname: "analytics.app." + hostname: "analytics." tls: enabled: true secretName: "laminar-frontend-tls" @@ -45528,7 +45787,7 @@ Before you begin, complete the [Quick Start guide](/enterprise/quick-start). Once the deployment status shows **Ready**, navigate to the Laminar frontend URL: -- VM install: `https://analytics.app.` +- VM install: `https://analytics.` - Kubernetes install: the hostname configured in `laminar.frontend.ingress.hostname` Click the **Continue with Keycloak** button: @@ -45848,6 +46107,39 @@ Conversation startup is asynchronous. The response is a start task. Poll the start task until it reaches `READY` and returns `app_conversation_id` and `sandbox_id`. +### Add Observability Context + +Conversation start requests can include optional observability fields: + +| Field | Type | Description | +| --- | --- | --- | +| `observability_span_name` | string | Creates a named child span under the root `conversation` span. Use stable, low-cardinality names for grouping and signal routing. | +| `observability_tags` | string array | Adds tags to the conversation root observability span. | +| `observability_metadata` | object | Adds trace-level metadata. Values must be scalars or homogeneous scalar arrays, such as strings, numbers, booleans, `string[]`, `number[]`, or `boolean[]`. | + +```json +{ + "initial_message": { + "role": "user", + "content": [ + { + "type": "text", + "text": "Evaluate this repository against the WB rubric." + } + ], + "run": true + }, + "selected_repository": "yourorganization/yourrepository", + "observability_span_name": "wb_rubric_eval", + "observability_tags": ["wb-rubric", "evaluation"], + "observability_metadata": { + "evaluation": "wb", + "attempt": 1, + "replay": false + } +} +``` + ### Pass Secrets At Conversation Start For credentials needed by only one conversation, include a `secrets` map in @@ -46056,7 +46348,7 @@ so the agent can refresh only the parts that need updating without a full rebuil Once your image is built and pushed to a registry, point the Replicated Admin Console at it. -1. Open the **Admin Console** at `https://:30000`. +1. Open the **Admin Console** at `https://admin.:30000`. 2. Navigate to **Config** and find the **Sandbox Image** section. 3. Set the following fields: @@ -46513,12 +46805,12 @@ In the Azure portal, create a Microsoft Entra app registration for OpenHands. 5. Add a **Web** redirect URI: ```text - https://auth.app./realms/allhands/broker/azure_devops/endpoint + https:///realms/allhands/broker/azure_devops/endpoint ``` - Replace `` with the domain for your OpenHands - Enterprise installation. If you configured a custom authentication hostname, - use that hostname instead of `auth.app.`. + Replace `` with your installation's Authentication + hostname (`auth.` by default), for example + `https://auth.openhands.example.com/realms/allhands/broker/azure_devops/endpoint`. 6. Click **Register**. 7. Copy the **Directory (tenant) ID** and **Application (client) ID**. @@ -46674,7 +46966,7 @@ To configure this pattern: | Symptom | Check | | --- | --- | | The Azure DevOps login option is not visible | Confirm **Azure DevOps Authentication** is enabled in the Admin Console or Helm values and the deployment has been applied. | -| OAuth redirects fail | Confirm the Entra redirect URI exactly matches `https://auth.app./realms/allhands/broker/azure_devops/endpoint`. | +| OAuth redirects fail | Confirm the Entra redirect URI exactly matches `https:///realms/allhands/broker/azure_devops/endpoint`. | | Microsoft sign-in shows an invalid client or secret error | Confirm the Azure DevOps Client ID and Client Secret match the Microsoft Entra app registration. If the secret expired, create a new one and redeploy. | | Microsoft sign-in succeeds but no repositories are listed | Confirm the user has access to the Azure DevOps organization, project, and repositories. Also confirm the default organization value is the organization name only. | | Consent fails or Azure DevOps API calls are denied | Confirm the Entra application has the required Azure DevOps delegated permission and that admin consent has been granted if your tenant requires it. | @@ -46713,19 +47005,17 @@ The exact menu labels can vary by Bitbucket version, but this is usually under ![Bitbucket Data Center Application Links settings](../images/bitbucket-data-center-application-links.png) -Use this callback URL: +Use this callback URL, where `` is your installation's +Authentication hostname (`auth.` by default): ```text -https://auth.app./realms/allhands/broker/bitbucket_data_center/endpoint +https:///realms/allhands/broker/bitbucket_data_center/endpoint ``` -Replace only `` in the callback URL. Leave the rest of -the path unchanged. - -Use your actual auth hostname, for example: +Replace only the hostname. Leave the rest of the path unchanged, for example: ```text -https://auth.app.openhands.example.com/realms/allhands/broker/bitbucket_data_center/endpoint +https://auth.openhands.example.com/realms/allhands/broker/bitbucket_data_center/endpoint ``` OpenHands requests the `REPO_ADMIN` OAuth scope so it can list repositories and @@ -46826,7 +47116,7 @@ when the job starts and when it completes. | Symptom | Check | | --- | --- | | The Bitbucket Data Center login option is not visible | Confirm Bitbucket Data Center Authentication is enabled in the Admin Console and the deployment has been applied. | -| OAuth redirects fail | Confirm the callback URL exactly matches `https://auth.app./realms/allhands/broker/bitbucket_data_center/endpoint`. | +| OAuth redirects fail | Confirm the callback URL exactly matches `https:///realms/allhands/broker/bitbucket_data_center/endpoint`. | | Login tries to reach an invalid `https://https://...` URL | Remove `https://` from the Bitbucket Data Center Domain field in the Admin Console. | | Repository webhook install fails | Confirm the user has repository admin access and the OAuth app grants `REPO_ADMIN`. | | Webhook delivery reaches OpenHands but no job starts | Confirm the comment contains `@openhands`, the webhook is installed for that repository, and the mentioning Bitbucket user has signed in to OpenHands. | @@ -47573,12 +47863,13 @@ OpenHands serves these hostnames, using `openhands.example.com` as the base doma | Hostname | Purpose | |---|---| | `app.openhands.example.com` | Application | -| `auth.app.openhands.example.com` | Login (Keycloak) | +| `auth.openhands.example.com` | Login (Keycloak) | | `runtime-api.openhands.example.com` | Runtime API | -| `*.runtime.openhands.example.com` | Per-session sandboxes | +| `-runtime.openhands.example.com` | Per-session sandboxes | -All of these must resolve to your ingress load balancer. The sandbox entry must be a **wildcard** -because each session gets its own subdomain. +All of these must resolve to your ingress load balancer. Every hostname sits one label under the +base domain, so a single **wildcard** DNS record and certificate for `*.openhands.example.com` +cover everything, including the dynamically named sandboxes. ## external-dns @@ -47604,7 +47895,7 @@ With `upsert-only` and a TXT registry, external-dns only ever touches records it ## cert-manager cert-manager issues and renews certificates from Let's Encrypt. Use the **DNS-01** challenge, the -only one that can issue the **wildcard** certificate the sandbox hostnames need. +only one that can issue **wildcard** certificates. @@ -47637,25 +47928,23 @@ only one that can issue the **wildcard** certificate the sandbox hostnames need. - A single wildcard covers every sandbox host. With Traefik, serve it as the default `TLSStore` so + A single wildcard covers every hostname. With Traefik, serve it as the default `TLSStore` so no per-ingress TLS config is needed. ```yaml apiVersion: cert-manager.io/v1 kind: Certificate metadata: - name: runtime-wildcard + name: openhands-wildcard namespace: openhands spec: - secretName: runtime-wildcard-tls + secretName: openhands-wildcard-tls issuerRef: name: letsencrypt-prod kind: ClusterIssuer dnsNames: - - "*.runtime.openhands.example.com" + - "*.openhands.example.com" ``` - - Issue certificates for the `app`, `auth`, and `runtime-api` hosts the same way. @@ -47664,18 +47953,16 @@ only one that can issue the **wildcard** certificate the sandbox hostnames need. If you don't run external-dns and cert-manager, provision these by hand and point the ingress controller at them. -**DNS**: create a record for each hostname in the table above, all pointing to your ingress load -balancer (typically a CNAME to the load balancer's hostname, or a cloud DNS alias). The sandbox -record must be the wildcard `*.runtime.openhands.example.com`. +**DNS**: create a single wildcard record `*.openhands.example.com` pointing to your ingress load +balancer (typically a CNAME to the load balancer's hostname, or a cloud DNS alias). -**TLS**: obtain certificates covering those hostnames and load them into the ingress controller as -Kubernetes TLS secrets. A single wildcard isn't enough, because the hostnames sit at different -depths. You need: +**TLS**: obtain a certificate with a `*.openhands.example.com` SAN and load it into the ingress +controller as a Kubernetes TLS secret. -- `*.runtime.openhands.example.com` for the sandboxes, and -- certificates for `app.openhands.example.com`, `auth.app.openhands.example.com`, and - `runtime-api.openhands.example.com` (for example a `*.openhands.example.com` wildcard, which covers - `app` and `runtime-api`, plus a certificate for `auth.app.openhands.example.com`). +If you can't use a wildcard certificate, obtain one with SANs for the `app`, `auth`, and +`runtime-api` hostnames plus `runtime.openhands.example.com`, and set +`runtime-api.env.RUNTIME_ROUTING_MODE: "path"` in your Helm values so sandboxes are served under +`runtime.openhands.example.com/` instead of their own hostnames. ## Next Steps @@ -47846,14 +48133,15 @@ license automatically at install time. (both provided by our team) - **LLM credentials** from your chosen provider, for example an Anthropic API key from the [Anthropic Console](https://console.anthropic.com/) -- DNS records you control, following the `app.` layout used - throughout this guide (with `openhands.example.com` as the base): - `app.openhands.example.com` (application), `auth.app.openhands.example.com` - (login), `runtime-api.openhands.example.com`, and a **wildcard** - `*.runtime.openhands.example.com` for runtime sandboxes. These point at your - cluster's ingress; see the Quick Start's - [DNS checks](/enterprise/quick-start#dns-checks) for the full hostname list. -- **TLS certificates covering all of the hostnames above**, which you provide. +- DNS records you control, following the layout used throughout this guide + (with `openhands.example.com` as the base domain): + `app.openhands.example.com` (application), `auth.openhands.example.com` + (login), `runtime-api.openhands.example.com`, and + `-runtime.openhands.example.com` for the per-session sandboxes. Every + hostname sits one label under the base domain, so a single **wildcard** + record `*.openhands.example.com` pointing at your cluster's ingress covers + all of them; see [DNS and TLS](/enterprise/k8s-install/dns-and-tls). +- A **wildcard TLS certificate** for `*.openhands.example.com`, which you provide. - An **authentication method** for user login — GitLab, Bitbucket Data Center, and more are supported; this guide uses a **GitHub App**. See [Creating a GitHub App](/enterprise/quick-start#create-a-github-app). @@ -47991,22 +48279,22 @@ postgresql: databaseMigrations: createDatabases: true -# Login is served by the bundled Keycloak at auth. — both the -# component and its ingress must be enabled for users to be able to log in +# Login is served by the bundled Keycloak — both the component and its +# ingress must be enabled for users to be able to log in keycloak: enabled: true ingress: enabled: true - hostname: auth.app.openhands.example.com + hostname: auth.openhands.example.com tls: false # Where agent sandboxes run. The runtime API needs its own hostname, and each -# sandbox gets a subdomain under your wildcard DNS record. +# sandbox gets its own hostname under your wildcard DNS record. sandbox: apiHostname: https://runtime-api.openhands.example.com env: - RUNTIME_URL_PATTERN: "https://{runtime_id}.runtime.openhands.example.com" + RUNTIME_URL_PATTERN: "https://{runtime_id}-runtime.openhands.example.com" LITELLM_DEFAULT_MODEL: litellm_proxy/claude-sonnet-4-5 runtime-api: @@ -48020,10 +48308,11 @@ runtime-api: databaseMigrations: createDatabases: true env: - # Base domain for the per-sandbox ingresses ({runtime_id}.); - # must match RUNTIME_URL_PATTERN above. RUNTIME_DISABLE_SSL defaults to - # "true" — it must be "false" so sandbox URLs are served over https. + # Sandbox hostnames are built as {runtime_id}; + # together these must match RUNTIME_URL_PATTERN above. RUNTIME_DISABLE_SSL + # defaults to "true"; it must be "false" so sandbox URLs are served over https. RUNTIME_BASE_URL: runtime.openhands.example.com + RUNTIME_URL_SEPARATOR: "-" RUNTIME_DISABLE_SSL: "false" # Storage class for sandbox volumes. The chart default (standard-rwo) only # exists on GKE — set a storage class from `kubectl get storageclass` or @@ -48536,7 +48825,7 @@ plugins directly at `/plugins` on your application hostname. ### 1. Open the Admin Console - Navigate to `https://:30000` and log in. + Navigate to `https://admin.:30000` and log in. ### 2. Open the configuration page @@ -48610,7 +48899,7 @@ plugins directly at `/plugins` on your application hostname. oidc: # Keycloak issuer URL — must match your Keycloak realm - issuerUrl: "https://auth.app." + issuerUrl: "https://auth." realmSecretName: "keycloak-realm" ``` @@ -48835,23 +49124,33 @@ You will need a VM to host OpenHands Enterprise. Choose one of the options below Once your VM is running, configure DNS and TLS before starting the installer. - **Create DNS A records** pointing to your VM's public IP address: + **Create a wildcard DNS A record** pointing to your VM's public IP address: | Record | Example | |--------|---------| - | `` | `openhands.example.com` | - | `app.` | `app.openhands.example.com` | - | `analytics.app.` | `analytics.app.openhands.example.com` | - | `auth.app.` | `auth.app.openhands.example.com` | - | `llm-proxy.` | `llm-proxy.openhands.example.com` | - | `runtime-api.` | `runtime-api.openhands.example.com` | - | `*.runtime.` | `*.runtime.openhands.example.com` | - - **Obtain a TLS certificate signed by a well-known certificate authority (CA) such as Let's Encrypt**, with SANs - (Subject Alternative Names) for all of the above domains, then copy the certificate + | `*.` | `*.openhands.example.com` | + + **Obtain a wildcard TLS certificate signed by a well-known certificate authority (CA) such as Let's Encrypt** + for `*.`, then copy the certificate (`.pem` or `.crt`) and private key (`.pem` or `.key`) to the VM. Self-signed certificates are not supported for the OpenHands application. + + Obtain a certificate with SANs (Subject Alternative Names) for each of these hostnames: + + - `admin.` + - `app.` + - `auth.` + - `analytics.` + - `llm-proxy.` + - `runtime-api.` + - `runtime.` + + By default, each sandbox runtime gets its own dynamic hostname, which only a wildcard + certificate can cover. When you configure OpenHands, set **Sandbox Routing Mode** to + **Path-based** so all sandboxes are served under `runtime.` instead. + + If you don't provide TLS certificates during installation, the Admin Console will use a self-signed certificate and your browser will display a security warning. You can still @@ -48886,27 +49185,14 @@ export BASE_DOMAIN="openhands.example.com" ``` Test DNS: ```bash -for h in \ - "${BASE_DOMAIN}" \ - "app.${BASE_DOMAIN}" \ - "analytics.app.${BASE_DOMAIN}" \ - "auth.app.${BASE_DOMAIN}" \ - "llm-proxy.${BASE_DOMAIN}" \ - "runtime-api.${BASE_DOMAIN}"; do +for h in "admin.${BASE_DOMAIN}" "app.${BASE_DOMAIN}" "test-runtime.${BASE_DOMAIN}"; do echo "[DNS] $h" getent hosts "$h" || nslookup "$h" done ``` -Expected: each hostname above resolves to your VM's public IP address. - -Test that a runtime wildcard hostname resolves: - -```bash -getent hosts "test.runtime.${BASE_DOMAIN}" || nslookup "test.runtime.${BASE_DOMAIN}" -``` - -Expected: `test.runtime.${BASE_DOMAIN}` resolves to the same target as `${BASE_DOMAIN}`. +Expected: each hostname resolves to your VM's public IP address through the +wildcard record. ### Outbound connectivity checks @@ -48949,7 +49235,7 @@ If any check fails, stop and resolve before continuing: | `443/TCP` inbound | Primary HTTPS entrypoint for users and service hostnames | | `30000/TCP` inbound | Replicated/KOTS Admin Console for install and configuration | | `80/TCP` inbound | HTTP entrypoint used for ingress/redirect behavior | -| `*.runtime.` DNS + cert SAN | Runtime sandboxes are addressed by dynamic runtime-specific hostnames | +| `*.` DNS + cert SAN | Application services and sandboxes are addressed by hostnames under the base domain | | `replicated.app`, `proxy.replicated.com` | Replicated control-plane/license/install paths | | `images.r9...`, `charts.r9...`, `updates.r9...`, `install.r9...` | Vendor distribution image/chart/update/install endpoints | | `traefik.github.io` | Embedded cluster ingress chart repository | @@ -49009,7 +49295,7 @@ If the install command fails after preflight checks pass, run `sudo ./openhands ### 4. Access the Admin Console Once the install command completes, the Admin Console is available at: -- `https://:30000` (if you provided TLS certificates) +- `https://admin.:30000` (if you provided TLS certificates) - `http://:30000` (if you did not use the `--tls-cert` and `--tls-key` flags on the `install` command) If you did not provide TLS certificates with the `install` command, your browser will display a security warning. @@ -49020,7 +49306,7 @@ Click **Advanced**, then **Proceed** to continue to the Admin Console. ### 5. Upload TLS certificate (if not provided with the install command) If you did not provide certificates with the `install` command, select **"Upload your own"**, -enter your base domain under **Hostname**, upload your private key and SSL certificate, then click **Continue**. +enter `admin.` under **Hostname**, upload your private key and SSL certificate, then click **Continue**. If you upload a private CA certificate, make sure any external webhook or OAuth provider that calls OpenHands also trusts that CA. @@ -49048,7 +49334,7 @@ You should now see the application configuration page. ### Domain Configuration -- Select **"Derive hostnames from domain (recommended)"** +- Keep the Hostname Configuration Mode set to **"Simple (default)"** - Enter your base domain (e.g., `openhands.example.com`) ### Certificate Configuration @@ -49150,9 +49436,172 @@ OpenHands Enterprise is now running. You can open a repository or start a new co ### Release Notes Source: https://docs.openhands.dev/enterprise/release-notes.md +## 0.36.0 + +This release makes the **Agent Canvas** experience available to users at `your-openhands-instance.acmeco.com/canvas`. As mentioned in 0.28.0 release notes, Agent Canvas will coexist with the current OpenHands Enterprise conversation interface for the time being. A future release will announce the deprecation date for the current interface, after which Agent Canvas will become the default UI. + +Additionally, this release improves security and adds support for Bitbucket Data Center as a supported Git provider for Skills marketplace registrations. Improvements to database-pool resiliency, LLM usage-metrics accuracy, and runtime cleanup performance have also made it into this release. + +### Enterprise Server + +#### Features +* feat: Expose app and SDK versions in server info by @malhotra5 in https://github.com/OpenHands/OpenHands/pull/15345 +* feat: surface sandbox start-failure reason in conversation start errors by @ak684 in https://github.com/OpenHands/OpenHands/pull/14885 +* feat(settings): support title generation profile preference by @simonrosenberg in https://github.com/OpenHands/OpenHands/pull/15366 +* feat: Allow disabling redis_rate_limiter via empty RATE_LIMIT_AUTH_WINDOWS by @tofarr in https://github.com/OpenHands/enterprise/pull/97 +* feat: Enforce CSP via middleware (OHE-2815) by @tofarr in https://github.com/OpenHands/enterprise/pull/94 + +#### Bug Fixes +* fix(app-server): support Bitbucket Data Center personal repos as marketplace sources by @ak684 in https://github.com/OpenHands/OpenHands/pull/15334 +* fix(frontend): add jittered rate-limit backoff by @aivong-openhands in https://github.com/OpenHands/OpenHands/pull/15236 +* fix: upgraded instances with no superadmin by @tofarr in https://github.com/OpenHands/OpenHands/pull/15349 +* fix: clear member key on managed profile switch by @saurya in https://github.com/OpenHands/OpenHands/pull/15356 +* fix(enterprise): avoid rotating keys on LiteLLM non-auth errors by @saurya in https://github.com/OpenHands/OpenHands/pull/15267 +* fix(app-server): persist combined LLM usage metrics across all usage buckets by @ak684 in https://github.com/OpenHands/OpenHands/pull/15354 +* fix(app-server): prevent webhook callbacks from starving the database pool by @ak684 in https://github.com/OpenHands/OpenHands/pull/15379 +* fix: filter automation event forwarding by requested types by @malhotra5 in https://github.com/OpenHands/OpenHands/pull/15388 +* fix: enforce cloud analytics consent from TOS by @malhotra5 in https://github.com/OpenHands/enterprise/pull/79 +* fix(ci): use private bot PAT for pr-artifacts cleanup job by @jlav in https://github.com/OpenHands/enterprise/pull/88 +* fix(enterprise): atomically migrate legacy empty tool settings by @simonrosenberg in https://github.com/OpenHands/enterprise/pull/12 +* fix(settings): accept legacy detached MCP configs by @neubig in https://github.com/OpenHands/enterprise/pull/93 + +#### Maintenance +* test: PLTF-1269 split enterprise test_user_model into focused per-model tests by @aivong-openhands in https://github.com/OpenHands/OpenHands/pull/13997 +* chore: Suppress verbose Laminar info logs by @tofarr in https://github.com/OpenHands/OpenHands/pull/15374 +* chore: Unify release-please into a single semver release line by @mamoodi in https://github.com/OpenHands/enterprise/pull/76 + +--- + +### Software Agent SDK + +#### Features +* feat: surface plugin contents in the agent-server plugins API by @hieptl in https://github.com/OpenHands/software-agent-sdk/pull/4103 +* Lazily hydrate persisted conversations by @neubig in https://github.com/OpenHands/software-agent-sdk/pull/4100 +* feat(agent-server): support deployment context on profile launches by @simonrosenberg in https://github.com/OpenHands/software-agent-sdk/pull/4030 +* feat(agent-server): sanitized product-analytics telemetry with split consent policy by @VascoSch92 in https://github.com/OpenHands/software-agent-sdk/pull/4172 +* feat: add opt-in persistent memory across sessions by @hieptl in https://github.com/OpenHands/software-agent-sdk/pull/4178 +* feat(marketplace): auto-load standalone marketplace skills by @ak684 in https://github.com/OpenHands/software-agent-sdk/pull/4176 +* feat(mcp): subscribe to tools/list_changed for progressive-disclosure servers by @neubig in https://github.com/OpenHands/software-agent-sdk/pull/3894 +* feat(agent-server): persist parent/child conversation relationships by @VascoSch92 in https://github.com/OpenHands/software-agent-sdk/pull/4188 +* feat: expose agent_context.load_memory in the agent-settings schema by @hieptl in https://github.com/OpenHands/software-agent-sdk/pull/4205 +* feat: publish typed Agent Server OpenAPI contract by @neubig in https://github.com/OpenHands/software-agent-sdk/pull/4229 +* feat: automate TypeScript client contract handoff by @neubig in https://github.com/OpenHands/software-agent-sdk/pull/4234 +* feat(agent-server): add MCP settings CRUD endpoints by @neubig in https://github.com/OpenHands/software-agent-sdk/pull/4294 +* feat: add MCPServer.enabled to switch a server off without removing it by @hieptl in https://github.com/OpenHands/software-agent-sdk/pull/4307 + +#### Bug Fixes +* fix(sdk): rehydrate persisted subscription LLMs by @lufen in https://github.com/OpenHands/software-agent-sdk/pull/4092 +* fix(observability): stamp tool_call_id onto the TOOL span by @simonrosenberg in https://github.com/OpenHands/software-agent-sdk/pull/4010 +* Fix REST API contract summary deduplication by @enyst in https://github.com/OpenHands/software-agent-sdk/pull/3918 +* fix(acp): bound ACP server startup with a timeout by @rsd-darshan in https://github.com/OpenHands/software-agent-sdk/pull/4126 +* fix(visualizer): show per-request token usage alongside cumulative by @luciobaiocchi in https://github.com/OpenHands/software-agent-sdk/pull/4146 +* fix(agent): apply filter_tools_regex to runtime tools by @VascoSch92 in https://github.com/OpenHands/software-agent-sdk/pull/4186 +* fix(sdk): accept boolean JSON Schema nodes in _process_schema_node by @VascoSch92 in https://github.com/OpenHands/software-agent-sdk/pull/4185 +* fix(sdk): mask all registered secrets, not only exported ones by @VascoSch92 in https://github.com/OpenHands/software-agent-sdk/pull/4191 +* fix(acp): persist rotated Codex credentials by @simonrosenberg in https://github.com/OpenHands/software-agent-sdk/pull/4124 +* fix(settings): restore MCP schema migration by @neubig in https://github.com/OpenHands/software-agent-sdk/pull/4013 +* fix(terminal): submit multiline PowerShell commands on Windows by @VascoSch92 in https://github.com/OpenHands/software-agent-sdk/pull/4155 +* fix(agent-server): default bind host to loopback without a session API key by @neubig in https://github.com/OpenHands/software-agent-sdk/pull/4180 +* fix: parallel tool metrics by @luciobaiocchi in https://github.com/OpenHands/software-agent-sdk/pull/4193 +* fix(agent-server): /api/vscode/url without base_url advertises the configured VSCode port by @harish-chandramowli in https://github.com/OpenHands/software-agent-sdk/pull/4181 +* fix(agent-server): require credential reactivation before cold load by @simonrosenberg in https://github.com/OpenHands/software-agent-sdk/pull/4198 +* fix(sdk): reject unknown event parents on append by @hxaxd in https://github.com/OpenHands/software-agent-sdk/pull/4089 +* fix(agent-server): redact LLM & condenser secrets in download-trajectory by @smolpaws in https://github.com/OpenHands/software-agent-sdk/pull/4217 +* fix: honor the stored memory preference on profile launches by @hieptl in https://github.com/OpenHands/software-agent-sdk/pull/4223 +* fix(agent-server): include server_base_path in the advertised VSCode URL by @harish-chandramowli in https://github.com/OpenHands/software-agent-sdk/pull/4222 +* fix(sdk): mark corrective nudge as environment event by @Sehlani042 in https://github.com/OpenHands/software-agent-sdk/pull/3954 +* fix(security): authenticate WebSockets outside URLs by @simonrosenberg in https://github.com/OpenHands/software-agent-sdk/pull/4279 +* fix(llm): generalize model capability resolution by @neubig in https://github.com/OpenHands/software-agent-sdk/pull/4200 +* fix(security): stop logging runtime command contents by @simonrosenberg in https://github.com/OpenHands/software-agent-sdk/pull/4280 + +#### Maintenance +* chore(deps): bump starlette from 1.0.1 to 1.3.1 by @dependabot[bot] in https://github.com/OpenHands/software-agent-sdk/pull/4140 +* chore(deps): bump pyjwt from 2.12.0 to 2.13.0 by @dependabot[bot] in https://github.com/OpenHands/software-agent-sdk/pull/4138 +* chore(deps): bump tornado from 6.5.5 to 6.5.7 by @dependabot[bot] in https://github.com/OpenHands/software-agent-sdk/pull/4139 +* chore(deps): bump python-multipart from 0.0.27 to 0.0.31 by @dependabot[bot] in https://github.com/OpenHands/software-agent-sdk/pull/4141 +* chore(deps): bump cryptography from 46.0.7 to 48.0.1 by @dependabot[bot] in https://github.com/OpenHands/software-agent-sdk/pull/4142 +* bump laminar to latest version, fix compat issues by @dinmukhamedm in https://github.com/OpenHands/software-agent-sdk/pull/4179 +* perf(agent-server): index conversation execution status for search/count by @VascoSch92 in https://github.com/OpenHands/software-agent-sdk/pull/4201 +* perf(agent-server): evict idle conversations from memory after a configurable TTL by @VascoSch92 in https://github.com/OpenHands/software-agent-sdk/pull/4202 +* Import SkillInfo from the SDK instead of redefining it in skills_router by @onatozmenn in https://github.com/OpenHands/software-agent-sdk/pull/4277 +* Move duplicated LLM option blocks into common.py by @onatozmenn in https://github.com/OpenHands/software-agent-sdk/pull/4276 +* Share the Gemini edit/write_file diff rendering by @onatozmenn in https://github.com/OpenHands/software-agent-sdk/pull/4278 + +--- + +### Runtime API + +#### Features +* feat(cleanup): paginate cleanup_stuck_pvcs PVC list by @tofarr in https://github.com/OpenHands/runtime-api/pull/658 +* feat: surface pod scheduling/image failure reason in sandbox status by @ak684 in https://github.com/OpenHands/runtime-api/pull/615 + +#### Bug Fixes +* fix(cleanup): archive with actual conversation IDs by @simonrosenberg in https://github.com/OpenHands/runtime-api/pull/654 +* fix: reap runtimes stuck Pending/unschedulable by @ak684 in https://github.com/OpenHands/runtime-api/pull/655 +* fix: Optimize idle runtime cleanup pod listing by @tofarr in https://github.com/OpenHands/runtime-api/pull/662 + +#### Maintenance +* perf(cleanup): page snapshot_and_delete_idle_pvcs over bound PVCs by @tofarr in https://github.com/OpenHands/runtime-api/pull/660 +* build(deps): bump starlette from 0.49.1 to 1.3.1 by @dependabot[bot] in https://github.com/OpenHands/runtime-api/pull/650 + +--- + +### Automation + +#### Features +* feat: add automation server info endpoint by @malhotra5 in https://github.com/OpenHands/automation/pull/248 +* feat: capture automation telemetry events by @malhotra5 in https://github.com/OpenHands/automation/pull/254 +* feat: expose requested automation event types by @malhotra5 in https://github.com/OpenHands/automation/pull/260 +* feat: expose automation capabilities and preflight validation by @hieptl in https://github.com/OpenHands/automation/pull/270 + +#### Bug Fixes +* fix: add server versions to telemetry by @malhotra5 in https://github.com/OpenHands/automation/pull/256 +* fix: normalize MCP config shapes in automation presets by @malhotra5 in https://github.com/OpenHands/automation/pull/257 +* fix: attribute PostHog events to automation actors by @neubig in https://github.com/OpenHands/automation/pull/265 +* fix(security): keep injected secrets out of commands by @simonrosenberg in https://github.com/OpenHands/automation/pull/267 + +#### Maintenance +* chore: Add missing index on automation_runs.automation_id by @aivong-openhands in https://github.com/OpenHands/automation/pull/250 + +--- + +### OpenHands Cloud (Helm Chart) + +#### Features +* feat: enable the pending-runtime reaper on OHE installs by @ak684 in https://github.com/OpenHands/OpenHands-Cloud/pull/931 +* feat(charts): add external S3 file store support by @jlav in https://github.com/OpenHands/OpenHands-Cloud/pull/946 +* feat(openhands): PLTF-3258 re-add fail guard for postgresql disabled without external database by @aivong-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/948 +* feat: add SMTP and budget maintenance deployment wiring by @saurya in https://github.com/OpenHands/OpenHands-Cloud/pull/780 +* feat: wire Agent Canvas through Replicated/Helm installs by @lilagrc in https://github.com/OpenHands/OpenHands-Cloud/pull/954 +* feat(rustfs): PLTF-1250 optional in-cluster object store by @aivong-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/983 +* feat(charts): adopt kubernetes recommended labels by @jlav in https://github.com/OpenHands/OpenHands-Cloud/pull/960 +* feat(dns): add a simple single-wildcard hostname layout by @jlav in https://github.com/OpenHands/OpenHands-Cloud/pull/985 + +#### Bug Fixes +* fix(openhands): namespace-qualify bundled litellm url for sandboxes by @jlav in https://github.com/OpenHands/OpenHands-Cloud/pull/937 +* fix(openhands): validate filestore values and test external S3 env by @jlav in https://github.com/OpenHands/OpenHands-Cloud/pull/947 +* fix(openhands): PLTF-3258 scope render guards to enabled releases by @aivong-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/950 +* fix: increase Replicated MinIO resource headroom by @ak684 in https://github.com/OpenHands/OpenHands-Cloud/pull/970 +* fix(integrations-hub): default admin.emails to empty by @tofarr in https://github.com/OpenHands/OpenHands-Cloud/pull/976 +* fix(budget-maintenance): disable the budget maintenance cronjob by default by @jlav in https://github.com/OpenHands/OpenHands-Cloud/pull/978 +* fix(minio): PLTF-1250 stop the bundled bucket job purging data on every upgrade by @aivong-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/981 +* fix(integrations-hub): derive public base URL by @neubig in https://github.com/OpenHands/OpenHands-Cloud/pull/963 +* fix(litellm): PLTF-3363 bump pinned litellm image to 1.93.0 by @aivong-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/987 +* fix(auth): extend Keycloak identity provider timeout by @ak684 in https://github.com/OpenHands/OpenHands-Cloud/pull/975 +* fix(troubleshoot): PLTF-3264 unblock support bundle exec collectors on Helm installs by @aivong-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/989 +* fix(replicated): PLTF-3264 include app and license info in support bundles by @aivong-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/992 +* fix(replicated): PLTF-3264 pass the SDK its pull secret in map form by @aivong-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/996 + +#### Maintenance +* ci: PLTF-3287 sticky comment notify on openhands chart appVersion drift by @aivong-openhands in https://github.com/OpenHands/OpenHands-Cloud/pull/951 +* chore(openhands-secrets): remove no-op config keys by @jlav in https://github.com/OpenHands/OpenHands-Cloud/pull/871 +* chore(openhands): remove no-op values file keys by @jlav in https://github.com/OpenHands/OpenHands-Cloud/pull/869 +* chore(openhands): pin redis master resources to effective values by @jlav in https://github.com/OpenHands/OpenHands-Cloud/pull/868 +* revert: re-enable budget maintenance by default by @saurya in https://github.com/OpenHands/OpenHands-Cloud/pull/982 + ## 0.28.0 -This release adds the embedded **Agent Canvas** (mounted under `{your-openhands-instance.example.com}/canvas`), which will coexist with the current OpenHands Enterprise conversation interface for the time being. A future release will announce the deprecation date for the existing interface, after which Agent Canvas will become the default UI; in the meantime, teams can begin experimenting with the new Agent Canvas experience and share feedback with the OpenHands product teams. +This release adds the embedded **Agent Canvas** endpoint (mounted under `your-openhands-instance.acmeco.com/canvas`). Agent Canvas will coexist with the current OpenHands Enterprise conversation interface for the time being. A future release will announce the deprecation date for the current interface, after which Agent Canvas will become the default UI; in the meantime, teams can begin experimenting with the new Agent Canvas experience and share feedback with the OpenHands product teams. Additionally, this release brings better Helm chart validation and more configuration options to make installs easier to configure and validate. The rest of the release is focused on stability and maintenance fixes. @@ -49617,7 +50066,7 @@ Use the Replicated Admin Console to configure an OpenHands Enterprise deployment ## Open the Configuration Screen -1. Open `https://:30000`. +1. Open `https://admin.:30000`. 2. Log in with the Admin Console password created during installation. 3. Select `Config`. @@ -49639,32 +50088,31 @@ Some changes restart one or more OpenHands components. Make changes during a mai ## Domain Configuration -### Recommended: Derive Hostnames From One Domain +### Recommended: Simple -Use the default `Derive hostnames from domain (recommended)` mode unless your organization requires a custom hostname for each service. +Use the default `Simple` mode unless your organization requires a custom hostname for each service. -1. Leave `Hostname Configuration Mode` set to `Derive hostnames from domain (recommended)`. +1. Leave `Hostname Configuration Mode` set to `Simple (default)`. 2. Enter your `Base Domain`, such as `openhands.example.com`. -3. Create DNS records and TLS coverage for the derived hostnames. -For a base domain of `openhands.example.com`, OpenHands uses: +Every hostname sits one subdomain under the base domain, so a single wildcard DNS record and TLS certificate for `*.openhands.example.com` cover all of them: -| Service | Derived Hostname | +| Service | Hostname | |---|---| -| Admin Console | `openhands.example.com:30000` | +| Admin Console | `admin.openhands.example.com:30000` | | OpenHands application | `app.openhands.example.com` | -| Analytics | `analytics.app.openhands.example.com` | -| Authentication | `auth.app.openhands.example.com` | +| Analytics | `analytics.openhands.example.com` | +| Authentication | `auth.openhands.example.com` | | LLM proxy | `llm-proxy.openhands.example.com` | | Runtime API | `runtime-api.openhands.example.com` | -| Sandboxes | `*.runtime.openhands.example.com` | +| Sandboxes | `-runtime.openhands.example.com` | - The derived mode keeps DNS, certificates, OAuth callbacks, and webhook URLs consistent with the standard OpenHands deployment. It is the recommended path for most installations. + Installations created before the Simple layout run in `Legacy` mode, which nests some hostnames deeper (`auth.app.`, `*.runtime.`). Keep existing installs on Legacy; their certificates and OAuth callbacks were issued for those hostnames. - Select `Enter all hostnames manually` only when your DNS or network requirements do not allow the derived layout. + Select `Manual` only when your DNS or network requirements do not allow the Simple layout. | Field | Description | |---|---| diff --git a/llms.txt b/llms.txt index 69029506..bf6c05bc 100644 --- a/llms.txt +++ b/llms.txt @@ -111,7 +111,7 @@ from the OpenHands Software Agent SDK. ## OpenHands Web App Server - [About OpenHands](https://docs.openhands.dev/openhands/usage/about.md) -- [ACP Agents](https://docs.openhands.dev/openhands/usage/agent-canvas/acp-agents.md): Drive Agent Canvas conversations with an external coding agent — Claude Code, Codex, or Gemini CLI — over the Agent Client Protocol. +- [ACP Agents](https://docs.openhands.dev/openhands/usage/agent-canvas/acp-agents.md): Run Claude Code, Codex, or Gemini CLI in Agent Canvas through the Agent Client Protocol. - [Agent Canvas Overview](https://docs.openhands.dev/openhands/usage/agent-canvas/overview.md): Understand Agent Canvas, how it runs agents, and which setup path to choose. - [Agent Profiles](https://docs.openhands.dev/openhands/usage/agent-canvas/agent-profiles.md): Manage reusable agent configurations for Agent Canvas conversations. - [API Keys Settings](https://docs.openhands.dev/openhands/usage/settings/api-keys-settings.md): View your OpenHands LLM key and create API keys to work with OpenHands programmatically. @@ -137,7 +137,6 @@ from the OpenHands Software Agent SDK. - [Debugging](https://docs.openhands.dev/openhands/usage/developers/debugging.md) - [Dependency Upgrades](https://docs.openhands.dev/openhands/usage/use-cases/dependency-upgrades.md): Automating dependency updates and upgrades with OpenHands - [Development Overview](https://docs.openhands.dev/openhands/usage/developers/development-overview.md): This guide provides an overview of the key documentation resources available in the OpenHands repository. Whether you're looking to contribute, understand the architecture, or work on specific components, these resources will help you navigate the codebase effectively. -- [Docker Backend](https://docs.openhands.dev/openhands/usage/agent-canvas/backend-setup/docker.md): Run Agent Canvas in a Docker container as a sandboxed backend. - [Docker Sandbox](https://docs.openhands.dev/openhands/usage/sandboxes/docker.md): The recommended sandbox provider for running OpenHands locally. - [Environment Variables Reference](https://docs.openhands.dev/openhands/usage/environment-variables.md): Complete reference of all environment variables supported by OpenHands - [Evaluation Harness](https://docs.openhands.dev/openhands/usage/developers/evaluation-harness.md) @@ -150,16 +149,15 @@ from the OpenHands Software Agent SDK. - [Groq](https://docs.openhands.dev/openhands/usage/llms/groq.md): OpenHands uses LiteLLM to make calls to chat models on Groq. You can find their documentation on using Groq as a provider [here](https://docs.litellm.ai/docs/providers/groq). - [Hooks](https://docs.openhands.dev/openhands/usage/customization/hooks.md): Use lifecycle hooks to control agent behavior - block dangerous commands, enforce quality checks before stopping, inject context, and more. - [Incident Triage](https://docs.openhands.dev/openhands/usage/use-cases/incident-triage.md): Using OpenHands to investigate and resolve production incidents -- [Install](https://docs.openhands.dev/openhands/usage/agent-canvas/setup.md): Install, run, update, and uninstall Agent Canvas. +- [Install Agent Canvas](https://docs.openhands.dev/openhands/usage/agent-canvas/setup.md): Install, run, update, or uninstall Agent Canvas. - [Integrations Settings](https://docs.openhands.dev/openhands/usage/settings/integrations-settings.md): How to setup and modify the various integrations in OpenHands. - [Key Features](https://docs.openhands.dev/openhands/usage/key-features.md) - [Kubernetes (Helm)](https://docs.openhands.dev/openhands/usage/agent-canvas/backend-setup/kubernetes.md): Install Agent Canvas into a Kubernetes cluster with the official Helm chart. - [Language Model (LLM) Settings](https://docs.openhands.dev/openhands/usage/settings/llm-settings.md): This page goes over how to set the LLM to use in OpenHands, including LLM profiles for switching models during conversations. - [LiteLLM Proxy](https://docs.openhands.dev/openhands/usage/llms/litellm-proxy.md): OpenHands supports using the [LiteLLM proxy](https://docs.litellm.ai/docs/proxy/quick_start) to access various LLM providers. -- [LLM Profiles and Model Configuration](https://docs.openhands.dev/openhands/usage/agent-canvas/llm-profiles.md): Configure models in Agent Canvas and use saved LLM profiles during conversations. - [Local Backend](https://docs.openhands.dev/openhands/usage/agent-canvas/backend-setup/local.md): Run one or more local backends and connect to them from the Agent Canvas UI. -- [Local LLMs](https://docs.openhands.dev/openhands/usage/llms/local-llms.md): When using a Local LLM, OpenHands may have limited functionality. It is highly recommended that you use GPUs to serve local models for optimal experience. - [Main Agent and Capabilities](https://docs.openhands.dev/openhands/usage/agents.md) +- [Manage LLM Profiles](https://docs.openhands.dev/openhands/usage/agent-canvas/llm-profiles.md): Configure models in Agent Canvas and use saved LLM profiles during conversations. - [Managing automations](https://docs.openhands.dev/openhands/usage/agent-canvas/managing-automations.md): Browse, export, import, enable, disable, and run automations from the Agent Canvas Automate view. - [Managing Automations](https://docs.openhands.dev/openhands/usage/automations/managing-automations.md): List, update, enable, disable, and delete your automations. - [Modal Backend](https://docs.openhands.dev/openhands/usage/agent-canvas/backend-setup/modal.md): Deploy the agent server on Modal as a remote backend for Agent Canvas. @@ -179,6 +177,7 @@ from the OpenHands Software Agent SDK. - [Remote Sandbox](https://docs.openhands.dev/openhands/usage/sandboxes/remote.md): Run conversations in a remote sandbox environment. - [Repository Customization](https://docs.openhands.dev/openhands/usage/customization/repository.md): You can customize how OpenHands interacts with your repository by creating a `.openhands` directory at the root level. - [REST API (V1)](https://docs.openhands.dev/openhands/usage/api/v1.md): Overview of the current V1 REST endpoints used by the Web app. +- [Run Local LLMs with OpenHands](https://docs.openhands.dev/openhands/usage/llms/local-llms.md): Connect OpenHands to local LLM servers such as LM Studio, Ollama, vLLM, and SGLang. - [Runtime Architecture](https://docs.openhands.dev/openhands/usage/architecture/runtime.md) - [Search Engine Setup](https://docs.openhands.dev/openhands/usage/advanced/search-engine-setup.md): Configure OpenHands to use Tavily as a search engine. - [Secrets Management](https://docs.openhands.dev/openhands/usage/settings/secrets-settings.md): How to manage secrets in OpenHands. @@ -190,6 +189,7 @@ from the OpenHands Software Agent SDK. - [Troubleshooting](https://docs.openhands.dev/openhands/usage/troubleshooting/troubleshooting.md) - [Tutorial Library](https://docs.openhands.dev/openhands/usage/get-started/tutorials.md): Centralized hub for OpenHands tutorials and examples - [Use Cases Overview](https://docs.openhands.dev/openhands/usage/use-cases/overview.md): Explore how OpenHands can help with common software development challenges +- [Use Docker with Agent Canvas](https://docs.openhands.dev/openhands/usage/agent-canvas/backend-setup/docker.md): Run Agent Canvas with Docker for a sandboxed backend and mounted project workspace. - [VM / Self-Hosted Installation](https://docs.openhands.dev/openhands/usage/agent-canvas/backend-setup/vm.md): Install Agent Canvas on a VM as a backend-only service or full self-hosted Canvas. - [Vulnerability Remediation](https://docs.openhands.dev/openhands/usage/use-cases/vulnerability-remediation.md): Using OpenHands to identify and fix security vulnerabilities in your codebase - [WebSocket Connection](https://docs.openhands.dev/openhands/usage/developers/websocket-connection.md) @@ -229,10 +229,10 @@ from the OpenHands Software Agent SDK. - [Model Context Protocol (MCP)](https://docs.openhands.dev/overview/model-context-protocol.md): Model Context Protocol support across OpenHands platforms - [Monitoring and Improving Skills](https://docs.openhands.dev/overview/skills/monitoring.md): Monitor skill performance in production using logging, evaluation metrics, dashboarding, and automated feedback aggregation. - [Organization and User Skills](https://docs.openhands.dev/overview/skills/org.md): Organizations and users can define skills that apply to all repositories belonging to the organization or user. -- [Overview](https://docs.openhands.dev/overview/skills.md): Skills are specialized prompts that enhance OpenHands with domain-specific knowledge, expert guidance, and automated task handling. - [Path-Triggered Rules](https://docs.openhands.dev/overview/skills/path.md): Path-triggered rules are skills that OpenHands injects deterministically whenever the agent reads, edits, or creates a file whose path matches a glob pattern. They behave like Claude Code "rules" — guaranteed to load for the files they scope, with no reliance on the model choosing them. - [Plugins](https://docs.openhands.dev/overview/plugins.md): Plugins bundle multiple agent components together—skills, hooks, MCP servers, agents, and commands—into reusable packages that extend OpenHands capabilities. - [Quick Start](https://docs.openhands.dev/overview/quickstart.md): Choose how you want to run OpenHands +- [Skills Overview](https://docs.openhands.dev/overview/skills.md): Give OpenHands reusable instructions, domain knowledge, workflows, and supporting resources. ## Other