Compare commits

..

907 Commits

Author SHA1 Message Date
openhands e79cc6517e Remove outdated create_conversation_from_files function and common tail functionality
- Removed create_conversation_from_files method that referenced non-existent common_tail.j2
- Removed CLI functionality that was unused by workflow templates
- Removed argparse and Path imports that are no longer needed
- Workflow templates continue to work with create_conversation method
- Addresses feedback from @enyst about outdated GPT-5 era functionality
2025-09-10 12:42:41 +00:00
openhands 5c6bf5f7a0 feat: add GitHub Actions workflow templates for OpenHands API
- Add OpenHands API Python helper script for automation
- Create 4 workflow templates:
  - Code review on PRs
  - Bug fix on labeled issues
  - Documentation updates (scheduled/manual)
  - Custom tasks (manual with description input)
- Include metadata files for GitHub template discovery
- Add comprehensive README with setup and usage instructions

Templates make it easy to integrate OpenHands AI agent into any GitHub repository
by simply adding OPENHANDS_API_KEY secret and selecting from template gallery.

Co-authored-by: openhands <openhands@all-hands.dev>
2025-09-05 01:50:32 +00:00
Ray Myers fdf8b21b84 Update enterprise readme (#10826) 2025-09-04 17:20:06 -05:00
Engel Nyst 93e843a06b Revert "feat(agent): add security-related items in system prompt to defense against data exfiltration" (#10822) 2025-09-05 05:07:30 +08:00
Ray Myers e37f7b0e0f Enterprise code and docker build (#10770) 2025-09-04 15:44:54 -04:00
Haowei Lin bd8b1bfa25 Add a new benchmark: AlgoTune (#10724)
Co-authored-by: linhaowei <linhaowei@wizardquant.com>
Co-authored-by: Graham Neubig <neubig@gmail.com>
2025-09-04 18:08:50 +00:00
dependabot[bot] a4f11006f6 chore(deps-dev): bump @tanstack/eslint-plugin-query from 5.83.1 to 5.86.0 in /frontend in the eslint group (#10817)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-04 15:51:28 +00:00
sp.wack c6950946bb Add refetchInterval to useActiveHost hook for automatic host status updates (#10815)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-09-04 14:59:16 +00:00
Engel Nyst 81d6341f9d chore(server): rename Session to WebSession (#10565) 2025-09-04 16:49:54 +02:00
dependabot[bot] 55a6bbd9a4 chore(deps): bump the version-all group across 1 directory with 8 updates (#10799)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-04 17:08:42 +04:00
Zacharias Fisches 20e5c40969 Fix swe-bench run_infer.py config parsing from config.toml (#10792) 2025-09-04 20:10:08 +08:00
Xingyao Wang 3e8dc41bdf Add microagent for fixing E501 line too long errors (#10796)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-09-04 19:48:08 +08:00
Hiep Le 49d37119a9 chore(frontend): remove feature flag (microagent management) (#10769) 2025-09-02 19:46:09 +00:00
Jamie Chicago cfd416c29f feat: update welcome-good-first-issue.yml (#10766) 2025-09-02 19:41:58 +00:00
Ray Myers c052dd7da5 chore - Update license for enterprise folder (#10761) 2025-09-02 18:48:45 +00:00
Ryan H. Tran 3f77b8229a Add support for AGENTS.md files in microagent system (#10528)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-09-03 02:18:38 +08:00
Tim O'Farrell 8d13c9f328 UI for determining if llm options are enabled (#10665)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: sp.wack <83104063+amanape@users.noreply.github.com>
2025-09-02 12:09:55 -06:00
mamoodi f46b112f17 Add more troubleshooting for linux (#10704) 2025-09-02 14:02:16 -04:00
mamoodi 44dc7f9e9b Release 0.55.0 (#10657) 2025-09-02 13:49:02 -04:00
Hiep Le 00eaa7a6e1 refactor(frontend): remove the branch dropdown from the learn this repo modal (microagent management) (#10755) 2025-09-02 22:34:00 +07:00
Hiep Le 9f1d6963b8 feat(frontend): support pagination when loading repositories (microagent management) (#10708) 2025-09-02 17:03:58 +04:00
Rohit Malhotra f61fa93596 Fix fragile URL parsing in Bitbucket service search_repositories method (#10733)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-09-01 02:59:24 -04:00
Rohit Malhotra 3e87c08631 refactor: introduce HTTPClient protocol for git service integrations (#10731)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-09-01 01:44:31 -04:00
Rohit Malhotra 21f3ef540f refactor: Apply GitHub mixins pattern to BitBucket service (#10728)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-31 16:09:41 -04:00
Rohit Malhotra 61a93d010c Refactor GitLab service into modular mixins pattern (#10727)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-31 19:10:40 +00:00
Rohit Malhotra 9d6afa09b6 Fix GraphQL URL configuration for GitHub Enterprise Server (#10725)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-30 18:06:00 -04:00
Rohit Malhotra c648b6f74f Refactor: Modularize GitHubService into feature mixins (#10492)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-29 23:45:15 -04:00
sp.wack c0fa41da65 fix: auto-load repositories when insufficient content in dropdown (#10697)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Rohit Malhotra <rohitvinodmalhotra@gmail.com>
2025-08-29 21:17:27 +00:00
Rohit Malhotra 6eb32e9ae4 Fix: Add method to merge conversation stats (#10667)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-29 20:15:44 +00:00
Rohit Malhotra 6a544d4274 (Hotfix): Branch pagination for GitLab (#10710)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-29 20:15:15 +00:00
Calvin Smith 4aada82b75 fix: Linking condensation and task tracking prompts (#10656)
Co-authored-by: Calvin Smith <calvin@all-hands.dev>
2025-08-29 09:18:31 -06:00
Ryan H. Tran ab2da611f5 fix: validate task_list schema for task tracker (#10624) 2025-08-29 10:57:50 +00:00
Rohit Malhotra e47bcf31e4 [Bug, GitLab]: fix missing context in cloud resolver (#10509)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-29 02:38:03 -04:00
mamoodi 83b9262379 Add troubleshooting guide for linux timeout issue (#10685) 2025-08-29 05:52:36 +02:00
Rohit Malhotra edc95141f7 Implement branch pagination for repository selection and improve UI async dropdown behaviour (#10588)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
2025-08-29 03:38:42 +00:00
Hiep Le 5b35203253 refactor: remove branch dropdown, update title, fix pr_number issue (microagent management) (#10691) 2025-08-29 00:24:48 +04:00
Rohit Malhotra 7e3eabe777 (Hotfix): ConversationStats metrics loss for unregistered services (#10676)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-28 14:15:20 -04:00
dependabot[bot] 23713bfe8c chore(deps): bump the version-all group in /frontend with 5 updates (#10686)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-28 14:53:14 +00:00
Ryan H. Tran 81829289ab Add support for passing list of Message into LLM completion (#10671) 2025-08-28 21:22:28 +08:00
Ray Myers 9709431874 fix: cli dedupe TaskTrackingAction thoughts by using display_thought_if_new (#10660)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-28 21:20:39 +08:00
dependabot[bot] 0e9906f41e chore(deps): bump posthog-js from 1.260.3 to 1.261.0 in /frontend in the version-all group (#10658)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-28 16:15:31 +04:00
chuckbutkus 9ac9a47207 Missed a place for the group change (#10659) 2025-08-27 21:47:20 +00:00
Hiep Le 75653e805a refactor(frontend): enhance the launch microagent modal (memory UI). (#10651) 2025-08-28 01:41:58 +07:00
mamoodi 9630b536cd Revert "Add support for passing list of Message into LLM completion" (#10653) 2025-08-27 17:51:17 +00:00
Engel Nyst 6f5c8186b8 Fix(settings): enforce condenser max history size >= 20 and improve messaging (#10638) 2025-08-27 18:37:41 +02:00
Rohit Malhotra 36e0d8d3da [Fix]: token refresh for nested runtimes (#10637)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-27 12:20:34 -04:00
Ryan H. Tran e68abf8d75 Add support for passing list of Message into LLM completion (#10650) 2025-08-27 22:39:26 +07:00
Ryan H. Tran 93ef1b0cda Remove image content filtering in ConversationMemory (#10645) 2025-08-27 22:28:09 +07:00
Web3 Outlaw 77b5c6b161 Fix Typos in Comment and Docs (#10644) 2025-08-27 14:06:39 +00:00
Hiep Le 57aa7d5c12 feat: hide conversations after PR closure or merge (microagent management) (#10600) 2025-08-27 16:32:04 +07:00
Hiep Le 50391ecdf3 feat(frontend): update learning repo flow (microagent management) (#10597)
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-27 16:02:48 +07:00
dependabot[bot] 672650d3d9 chore(deps): bump the version-all group in /frontend with 7 updates (#10643)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-27 12:10:48 +04:00
Rohit Malhotra 9afedea170 [Bug, GitHub]: fix missing context in cloud resolver (#10517)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-27 07:07:09 +00:00
chuckbutkus c0bb84dfa2 Non root user (#10155)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-27 02:23:39 -04:00
Hiep Le 18b5139237 fix(backend): show name of created branch in conversation list. (#10208) 2025-08-27 11:41:12 +07:00
Rohit Malhotra 4849369ede frontend(chat): render conversation_instructions from RecallObservation (#10639)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-26 23:32:18 -04:00
Xingyao Wang b082ccc0fb feat(llm): add support for deepseek and gpt-5-mini, util for token count (#10626)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-27 11:03:35 +08:00
mamoodi b0007076c0 Remove duplicated command in CLI (#10634) 2025-08-26 16:01:16 -04:00
Tim O'Farrell 4a4f213f57 Remove unused translation keys from translation.json (#10631)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-26 11:59:48 -06:00
Tim O'Farrell f9099fe6db Refactor conversation status (#10590)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-26 08:06:26 -06:00
Xingyao Wang 8f46a0a7a3 Add gpt-5-mini-2025-08-07 as verified model & supported in OpenHands provider (#10628)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-26 13:15:16 +00:00
dependabot[bot] 55d204ae1b chore(deps): bump the version-all group in /frontend with 21 updates (#10614)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-26 06:09:20 +00:00
baii 4d7cd228da Fix(backend): correctly forward AWS Bedrock aws_access_key_id / aws_secret_access_key / aws_region_name to litellm (#9663)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-08-25 22:07:28 +00:00
Tim O'Farrell a3f92df4b3 Fix for issue where exceptions are swallowed (#10602) 2025-08-25 15:50:15 -06:00
Engel Nyst e41f8f5215 feat(settings): configurable condenser max history size (FE+BE) (#10591) 2025-08-25 22:50:52 +02:00
Jamie Chicago 6448f5a681 docs: Add Ubuntu installation steps for Windows WSL setup (#10485)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-25 20:43:04 +00:00
Graham Neubig 5fcc648d5f Add E2E test for multi-conversation resume functionality (Issue #10384) (#10390)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-25 15:15:54 -04:00
danieljbruntz c9d96038c1 feat: Add OPENHANDS_FORCE_VISION env var to override vision capability detection (#10255)
Co-authored-by: mamoodi <mamoodiha@gmail.com>
Co-authored-by: Engel Nyst <engel.nyst@gmail.com>
2025-08-25 19:05:58 +00:00
Calvin Smith 408af4e012 fix: Extend cases where truncation triggers (#10607)
Co-authored-by: Calvin Smith <calvin@all-hands.dev>
2025-08-25 12:59:41 -06:00
mamoodi d9ac2faff6 Add backlog label to exemption (#10598) 2025-08-25 14:57:35 -04:00
Rohit Malhotra 64383a66e2 docs: Update Project Management integration docs (#10161)
Co-authored-by: OpenHands <openhands@all-hands.dev>
2025-08-25 14:51:06 -04:00
chuckbutkus 7fbcb29499 Allow for path based runtimes in the SAAS environment (#10518)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-25 14:31:07 -04:00
hereisok e7aae1495c perf: remove the sleep before runtime initialization (#10033)
Signed-off-by: hereisok <hereisok@angai.wk@gmail.com>
Co-authored-by: mamoodi <mamoodiha@gmail.com>
2025-08-25 13:56:57 -04:00
Hiep Le d33f27d141 refactor(frontend): separate the microagents and conversations (microagent management) (#10596)
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-26 00:50:25 +07:00
Hiep Le d08851859b refactor(frontend): update helper text (microagent management) (#10595)
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-26 00:49:11 +07:00
Hiep Le 7f4d311294 fix: subscription logic by polling for available runtime (microagent management, memory UI) (#10519)
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-25 20:44:00 +04:00
dependabot[bot] 049f058ed1 chore(deps-dev): bump eslint-plugin-unused-imports from 4.1.4 to 4.2.0 in /frontend in the eslint group (#10511)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-25 18:03:22 +04:00
Tim O'Farrell bb6cf5a816 Refactor authentication error handling with global FastAPI exception handler (#10403)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-25 07:54:30 -06:00
Engel Nyst d9bc5824a0 docs: add shell guidance to avoid set -e variants in this environment (#10579)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-24 13:39:37 +08:00
Xingyao Wang fd5b5075d6 Simplify CLI markdown rendering; remove python-markdown deps; update tests (#10538)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-24 01:23:06 +08:00
Hiep Le f5cd7b256d feat(frontend): Implement LLM risk analyzer UI (#10569)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
Co-authored-by: Graham Neubig <neubig@gmail.com>
Co-authored-by: llamantino <213239228+llamantino@users.noreply.github.com>
Co-authored-by: mamoodi <mamoodiha@gmail.com>
Co-authored-by: Tim O'Farrell <tofarr@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ryan H. Tran <descience.thh10@gmail.com>
Co-authored-by: Neeraj Panwar <49247372+npneeraj@users.noreply.github.com>
Co-authored-by: sp.wack <83104063+amanape@users.noreply.github.com>
Co-authored-by: Insop <1240382+insop@users.noreply.github.com>
Co-authored-by: test <test@test.com>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
Co-authored-by: Zhonghao Jiang <zhonghao.J@outlook.com>
Co-authored-by: Ray Myers <ray.myers@gmail.com>
2025-08-23 02:08:45 +07:00
Neeraj Panwar df86fd275d Fixes bug 9682 (#9692)
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-08-22 16:51:53 +00:00
Xingyao Wang d22a2e39e7 feat(agent): add security-related items in system prompt to defense against data exfiltration (#10477)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-22 15:53:13 +00:00
Xingyao Wang ca424ec15d [agent] Add LLM risk analyzer (#9349)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Graham Neubig <neubig@gmail.com>
Co-authored-by: llamantino <213239228+llamantino@users.noreply.github.com>
Co-authored-by: mamoodi <mamoodiha@gmail.com>
Co-authored-by: Tim O'Farrell <tofarr@gmail.com>
Co-authored-by: Hiep Le <69354317+hieptl@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ryan H. Tran <descience.thh10@gmail.com>
Co-authored-by: Neeraj Panwar <49247372+npneeraj@users.noreply.github.com>
Co-authored-by: sp.wack <83104063+amanape@users.noreply.github.com>
Co-authored-by: Insop <1240382+insop@users.noreply.github.com>
Co-authored-by: test <test@test.com>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
Co-authored-by: Zhonghao Jiang <zhonghao.J@outlook.com>
Co-authored-by: Ray Myers <ray.myers@gmail.com>
2025-08-22 14:02:36 +00:00
Xingyao Wang 4507a25b85 Evaluation: redirect sessions to repo-local .eval_sessions via helper; apply across entrypoints; add tests (#10540)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-22 13:34:02 +00:00
llamantino d9cf5b7302 ci: add GitHub Action to post welcome message on good first issues (#9707)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-08-22 09:09:45 -04:00
Xingyao Wang 2a86e32263 fix(CI): Pin @modelcontextprotocol/server-filesystem to version 2025.8.18 (#10561)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-22 05:00:11 +08:00
Engel Nyst b311ae6e15 fix: normalize malformed <parameter> tags (Qwen3) (#10539) 2025-08-21 19:03:20 +02:00
Ryan H. Tran adb773789a Upgrade aci to 0.3.2: clamp view_range end to file length and emit warning instead of error (#10502) 2025-08-21 23:01:54 +07:00
Engel Nyst 91d3d1d20a Fix: expose aggregated LLM metrics in State for evaluation scripts (#10537)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-21 17:43:09 +02:00
llamantino e9e2c98946 fix(tests): increase hard timeout in test_bash_server to avoid timeout on Windows (#9930) 2025-08-21 17:12:42 +02:00
Engel Nyst 7861c1ddf7 fix(anthropic): disable extended thinking for Opus 4.1 (#10532)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-21 00:13:15 +02:00
Engel Nyst 5ce5469bfa docs: update OpenAPI specification to include all current endpoints (#10412)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-20 21:58:35 +02:00
Xingyao Wang 4a3f5dd9b4 fix(runtime): correctly set session_api_key for local runtime (#10506) 2025-08-21 03:51:19 +08:00
Joe O'Connor bc8b995dd3 Add additional networks (#9566)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-08-20 18:52:31 +00:00
chuckbutkus 07c4742496 Add useful tools jq and gettext to image (#10531) 2025-08-20 18:27:09 +00:00
mamoodi b5887f8a9d Fix CLI docs command (#10520) 2025-08-20 14:53:15 +00:00
mamoodi 0166df6575 Release 0.54.0 (#10465) 2025-08-20 10:29:15 -04:00
Ryan H. Tran e03a1f4e37 Move TASKS.md to session-specific directory in ~/.openhands (#10493)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-20 22:26:55 +08:00
sp.wack c763f0e368 chroe(vscode): Refresh vscode integration lockfile (#9965)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-08-20 15:33:11 +02:00
Engel Nyst bb0e24d23b Centralize model feature checks (#10414)
Co-authored-by: OpenHands-GPT-5 <openhands@all-hands.dev>
2025-08-19 20:30:07 +00:00
sp.wack aa6b454772 fix: Enhance GitHub repository search to include user organizations (#10324)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-19 15:56:15 +00:00
sp.wack 0297b3da18 Fix conversation ID validation to return 400 instead of 500 for long IDs (#10496) 2025-08-19 18:03:05 +04:00
Hiep Le 476954f3a4 refactor(frontend): update the styling for the microagent management page. (#10494) 2025-08-19 19:50:42 +07:00
dependabot[bot] f296d7bde5 chore(deps): bump abatilo/actions-poetry from 3 to 4 (#10487)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-19 13:58:39 +02:00
Zacharias Fisches f866b3f8ea Update modal runtime for modal>=1.0 (#10479)
Co-authored-by: Ryan H. Tran <descience.thh10@gmail.com>
2025-08-19 10:33:03 +00:00
Zacharias Fisches 36d31b74f7 fix jinja / dockerfile syntax by removing newlines (#10476)
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-08-19 02:50:41 +00:00
Engel Nyst 634a7691a2 tests: reorganize unit tests into subdirectories mirroring source modules (#10484)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-19 01:11:07 +02:00
Xingyao Wang 81ba4399fa fix(frontend): fix MCP tab in frontend unit tests (#10481)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-18 21:25:09 +00:00
Rohit Malhotra 875036d920 (Hotfix): Fix logs and filestore init for llm registry (#10470) 2025-08-18 20:57:08 +00:00
Xingyao Wang 39333dd5de feat: enable MCP in SaaS (#10480) 2025-08-18 20:40:42 +00:00
Rohit Malhotra 3660933d59 refactor: replace 'convo' naming with 'conversation' (#10473)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-18 15:10:32 -04:00
Xingyao Wang baf2cc5c7e Pin OpenAI Python SDK to 1.99.9 to avoid LiteLLM import breakage (BerriAI/litellm#13711) (#10471)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Rohit Malhotra <rohitvinodmalhotra@gmail.com>
2025-08-18 18:45:34 +00:00
Rohit Malhotra 7b31d57a2f Update conversation stats filename (#10472) 2025-08-18 18:09:13 +00:00
Rohit Malhotra 61d90c31eb (Hotfix): Fix eval pipeline (#10466) 2025-08-18 12:51:51 -04:00
Xingyao Wang 3fea7fd2fc feat: improve MCP config UI with comprehensive add/edit/delete functionality (#10145)
Co-authored-by: OpenHands <openhands@all-hands.dev>
2025-08-18 16:33:27 +00:00
suixinio c64b1ae111 fix(openrouter): Force string serialization for openrouter/anthropic/claude-sonnet-4 model (#10454) 2025-08-18 17:50:01 +02:00
Kevin Musgrave 74ba21bad0 feat(evaluation): Added INSTRUCTION_TEMPLATE_NAME to run_infer.py in swe_bench (#10270)
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
Co-authored-by: mamoodi <mamoodiha@gmail.com>
2025-08-18 14:18:08 +00:00
Engel Nyst bef6b1afee cli: fix Ubuntu white-on-white model autocomplete by merging default prompt_toolkit UI style (#10347) 2025-08-18 20:32:09 +08:00
Graham Neubig ad85e3249a test(e2e): Add web browsing catchphrase E2E for #10378 and wire into CI (#10401)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-18 08:28:42 -04:00
Engel Nyst 822ce86150 Ensure .bashrc exists (#10461) 2025-08-18 20:18:11 +08:00
Graham Neubig 305caf1257 Implement configurable base URL for E2E tests (#10394)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-18 07:44:07 -04:00
Rohit Malhotra 25d9cf2890 [Refactor]: Add LLMRegistry for llm services (#9589)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Graham Neubig <neubig@gmail.com>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-08-18 02:11:20 -04:00
Engel Nyst 17b1a21296 chore(ci): enhance lint-fix workflow for FE (#10448)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-18 05:21:13 +02:00
Engel Nyst 97bcb2162d Add instruction to use existing repository labels in PR/MR microagents (#10446)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-18 04:35:20 +02:00
Engel Nyst 8401641f7e Docs + Code: rename ‘convo’ to ‘conversation’ across codebase and docs (#10447) 2025-08-18 04:35:02 +02:00
Engel Nyst e2343c0927 Runtime-backend docs update (arch) - cron agent run (#10423)
Co-authored-by: OpenHands-GPT-5 <openhands@all-hands.dev>
2025-08-18 02:04:31 +02:00
Xingyao Wang 277064720c chore: remove timeout >600s warning log in Event.set_hard_timeout (#10444)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-17 23:25:13 +02:00
Xingyao Wang ef3e0c8dfe Fix think observation redundant rendering in frontend (#10409)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-17 10:55:03 +08:00
Engel Nyst 315d391414 Revert "tests: reorganize unit tests into subdirectories mirroring source modules" (#10437) 2025-08-17 00:33:17 +00:00
olyashok 95ef8965b7 Allow user actions over websockets (#10420)
Co-authored-by: Xingyao Wang <xingyaoww@gmail.com>
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-08-16 21:29:28 +00:00
Ray Myers ab9fb50c4f fix - Thread-safety in BatchedWebHookFileStore (#10339) 2025-08-16 18:06:40 +00:00
Engel Nyst f866da6bf2 tests: reorganize unit tests into subdirectories mirroring source modules (#10427)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-16 19:13:50 +02:00
Zhonghao Jiang 7229a16b45 feat(evaluation): Add NoCode-bench evaluation script (#10229) 2025-08-16 16:41:22 +00:00
llamantino 19105a2a13 fix(cli): send authentication error resume message to user, not llm (#10421) 2025-08-16 18:01:42 +02:00
Ryan H. Tran fe486ad1f1 Add task tracking tool for long-horizon tasks (#10166)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-08-16 20:05:59 +07:00
Engel Nyst 0ec6ed20cb fix(frontend): browser tab notification respects user-renamed titles; add unit test (#10406) 2025-08-16 07:00:45 +00:00
Xingyao Wang 794381c22b Add "The agent didn't finish the job" feedback reason to Likert scale (#10417) 2025-08-16 00:25:19 -04:00
Tim O'Farrell 0c581ea946 fix(nested_event_store): correct reverse pagination in search_events and add unit test (#10418)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-15 19:29:35 -06:00
Engel Nyst f7f4fcf98f chore(eval): remove old, unused regression test framework under evaluation/regression (#10419) 2025-08-16 01:08:23 +02:00
Xingyao Wang ab004478f6 feat(agent): include a new roleplay-based prompt (#10306)
Co-authored-by: test <test@test.com>
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-16 06:04:28 +08:00
Xingyao Wang 340606e68a microagent: Add /codereview-roasted microagent with Linus Torvalds engineering mindset (#10405)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-15 21:49:57 +00:00
Tim O'Farrell daec23b5d7 Add get_issue_comments method to GitLabService (#10361)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-15 14:55:39 -06:00
Xingyao Wang 587b4c311a runtime(bash): clarify guidance when previous command still running; recommend execute_bash timeout (issue #10350) (#10389)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-16 02:15:05 +08:00
Xingyao Wang 7a86402c9c Add process management guidance to system prompt (#10083)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-16 02:09:20 +08:00
Insop 06d283dfa0 Temp fix for docker file and debug log (#10345) 2025-08-15 15:34:46 +00:00
sp.wack a6a4246e30 fix(frontend): Failing tests (#10369) 2025-08-15 15:18:35 +00:00
Xingyao Wang 4830b9a67d fix(llm): include gpt-5 to fn call model; set top p default value to None (#10363) 2025-08-15 15:08:01 +00:00
Neeraj Panwar d4489d62d7 fix(llm): set AWS credentials in config.toml (#10351) 2025-08-15 22:16:50 +08:00
Ryan H. Tran e41c020073 [CLI] Fix MCP toml formatting issue (#10312)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-15 13:56:46 +00:00
Ryan H. Tran 3f44c8436f Fix swebench modal patch eval intermittent crash (#10353) 2025-08-15 21:51:03 +08:00
Graham Neubig b740944075 Split E2E settings and conversation tests; run settings first in workflow (#10359)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-15 09:19:27 -04:00
dependabot[bot] 5618a3eebb chore(deps): bump the version-all group in /frontend with 9 updates (#10318)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-15 16:51:41 +04:00
Hiep Le a1ffe5c936 fix(frontend): frontend UI keep flashing (#10352) 2025-08-15 12:19:30 +04:00
Hiep Le f8376a9702 fix(frontend): status message missing (#10349) 2025-08-15 12:11:42 +07:00
Tim O'Farrell 985a634d60 Fix for issue where static system commands are truncated (#10292)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-15 04:16:50 +00:00
Xingyao Wang e40681ca61 fix: increase max branches limit to 5000 to fix #10332 (#10333) 2025-08-14 20:44:12 +00:00
mamoodi 228e50df9c Release 0.53.0 (#10314) 2025-08-14 16:43:01 -04:00
llamantino fd805eb835 fix(cli): remove unused mouse support and fix settings autocomplete (#10329) 2025-08-15 02:59:41 +08:00
Graham Neubig 426350224b Add Playwright-based end-to-end testing workflow (#10116)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-14 18:59:06 +00:00
Tim O'Farrell 3e36911038 Add unit test to detect circular imports (#10233)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-14 09:02:09 -06:00
Graham Neubig 4c3ba62665 Fix i18n language code handling to prevent 404 errors on first load (#10257)
Co-authored-by: OpenHands <openhands@all-hands.dev>
2025-08-14 00:10:49 -04:00
Bashwara Undupitiya f5e7c602dc Jira, Jira DC and Linear integration UI tweaks (#10285) 2025-08-14 00:02:59 -04:00
787627858 2f32064778 fix file_ handler to TimedRotatingFileHandler type to prevent log fil… (#10089)
Co-authored-by: liwei136 <liwei136@baidu.com>
2025-08-14 03:16:44 +00:00
Xingyao Wang 5e85986f32 docs: Update documentation to promote uv as recommended installation method (#10291)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-13 23:11:02 +00:00
Xingyao Wang 4f436922ca fix: browser title not updating when conversation title changes (#10275)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-14 05:07:59 +08:00
Xingyao Wang d256348a46 refactor(git): principled way to set git configuration for agents & re-enable git settings in UI (#10293)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-13 20:45:15 +00:00
aeft 6bdc5563cf feat: allow partial modification of CLI settings (#10240) 2025-08-13 19:26:35 +00:00
Xingyao Wang c2f46200c0 chore(lint): Apply comprehensive linting and formatting fixes (#10287)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-13 21:13:19 +02:00
Xingyao Wang e39bf80239 fix(prompt): Add explicit GitHub/GitLab/Slack push instructions to templates (#10290)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-14 02:44:06 +08:00
Rohit Malhotra 368a0248e3 Modify experiment manager defaults for nested runtimes (#10269)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-13 14:41:28 -04:00
mamoodi db9ceb380a Patch release 0.52.1 (#10284)
Co-authored-by: Hiep Le <69354317+hieptl@users.noreply.github.com>
2025-08-13 14:16:34 -04:00
Copilot c64971d0c4 Reorganize unit tests by source module into structured directory hierarchy (#10092)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: enyst <6080905+enyst@users.noreply.github.com>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-08-13 15:22:56 +00:00
llamantino 69fa580899 fix(misc): MCP settings and other UI improvements/fixes (#10141) 2025-08-13 10:30:38 -04:00
mamoodi e3411f743d Release 0.52.0 (#10144) 2025-08-13 09:53:20 -04:00
Hiep Le 2b65b8aff2 fix(frontend): UI breaks when user message contains codeblock that's too wide (#10276) 2025-08-13 15:14:28 +04:00
Hiep Le 11f364c5e4 fix(frontend): UI does not display triggered microagent knowledge well. (#10277) 2025-08-13 14:31:05 +08:00
Jesse 4e3a862571 Add llm disable stop word env var (#10274)
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-08-13 03:52:11 +00:00
Xingyao Wang 50aa014876 refactor(prompt): Consolidate system prompts with Jinja inheritance (#9797)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-13 03:04:08 +00:00
olyashok 500ab46918 Supprot for named volumes in docker_runtime (#10268) 2025-08-12 21:18:53 +00:00
Mislav Lukach e311f3e70f fix(ui): increase settings page spacing (#10202) 2025-08-12 22:04:47 +04:00
Mislav Lukach f68ad3695c Feat/maintenance banner dismissible (#10072)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
2025-08-12 22:02:36 +04:00
mamoodi ed711318e4 Hide git settings again (#10261) 2025-08-12 17:30:57 +00:00
Calvin Smith 57a3d8f17d fix: Solvability setting not stored (#10258)
Co-authored-by: Calvin Smith <calvin@all-hands.dev>
2025-08-12 12:54:45 -04:00
jpelletier1 e1559651b8 Unhide Git Settings feature and add explanatory text (#10256)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-12 14:18:15 +00:00
Ibragim Badertdinov 19a6b6b618 feat(eval): Support evaluation on SWE-rebench (#10251) 2025-08-12 14:05:43 +00:00
Xingyao Wang 2b7e44819f chore(agent_prompt): Add EXTERNAL_SERVICES section to system prompt template (#10244)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-12 21:53:53 +08:00
Xingyao Wang 0699a0ce7c fix: copy microagents file into runtime image (#10245)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: mamoodi <mamoodiha@gmail.com>
2025-08-12 12:42:42 +00:00
Insop 1d0d88d491 Readability improvement & remove duplicated and unused prompts (#10241) 2025-08-12 12:42:17 +08:00
Tim O'Farrell 6f21b6700a Fix for issues where callbacks are not batched (#10235) 2025-08-11 15:44:48 -06:00
Tim O'Farrell af49b615b1 Add BatchedWebHookFileStore for batching webhook updates (#10119)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-11 12:51:08 -06:00
Tim O'Farrell 4651edd5b3 Fix circular import by moving refine_prompt to dedicated module (#10223)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-11 12:17:18 -06:00
olyashok d7f72fec9c OverlayFS support for docker runtimes (#10222) 2025-08-11 18:11:08 +00:00
mamoodi 09011c91f8 Remove rbren from UI changes reviewers (#10230) 2025-08-11 13:32:29 -04:00
Xingyao Wang e56fabfc5e feat(cli): Add markdown schema visualization in CLI (#10193)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-11 15:47:38 +00:00
Xingyao Wang 56f752557c Implement auto-pagination for conversation list with infinite scroll (#10129)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: sp.wack <83104063+amanape@users.noreply.github.com>
2025-08-11 15:03:29 +00:00
Calvin Smith 5f2ad7fbb0 Solvability setting switch (#9727)
Co-authored-by: Calvin Smith <calvin@all-hands.dev>
2025-08-11 08:57:47 -06:00
Ryan H. Tran 758e30c9a8 Remove SecretStr conversion in GAIA eval (#10204) 2025-08-11 21:30:18 +08:00
dependabot[bot] 28017f232e chore(deps): bump the version-all group across 1 directory with 9 updates (#10168)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-11 14:51:36 +04:00
Tim O'Farrell 3302c31c60 Removed Hack that is no longer required (#10195) 2025-08-10 12:13:19 -06:00
Xingyao Wang 116ba199d1 feat(agent): stop using short tool description for gpt-5 (#10184) 2025-08-09 17:56:52 -04:00
Boxuan Li 803bdced9c Fix Windows prompt refinement: ensure 'bash' is replaced with 'powershell' in all prompts (#10179)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-08 20:28:36 -07:00
Xingyao Wang 3eecac2003 docs: Add GPT-5 model recommendation and fix pricing display issue (#10177)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-08 19:19:59 +00:00
mamoodi c02e09fc2d Hide Git Settings section from Application settings (#10176)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-08 19:06:40 +00:00
Tim O'Farrell 18f8661770 feat: add mcp_shttp_servers override to conversation initialization (#10171)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-08 18:05:44 +00:00
Xingyao Wang 04ff4a025b feat(cli): Use CLI to launch OpenHands UI server via Docker (#9783)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-09 02:04:07 +08:00
mamoodi 81ef363658 Increase stale bot inactivity time and better messaging (#10167)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-08-08 16:41:15 +00:00
Xingyao Wang 1474c5bc1c Support gpt-5-2025-08-07 and add it to OpenHands provider (#10172)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-08 16:05:51 +00:00
sp.wack 9b0a5da839 Use EventStore directly in remember prompt; merge client services (#10143)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-08 18:03:03 +04:00
Graham Neubig 7ab2ad2c1b Fix authentication setup issues in unit tests (#10118)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-07 22:12:21 -04:00
Graham Neubig 8416a019cb Fix unit test failures by prioritizing current directory in PYTHONPATH (#10105)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-07 22:12:02 -04:00
Engel Nyst 73a7c7786d Load previous conversation by id (CLI) (#10156) 2025-08-07 23:09:20 +02:00
aeft 11d12c5a01 fix: prevent CLI argument parser defaults from overriding config file values (#10140) 2025-08-08 04:48:04 +08:00
Xingyao Wang c4f303a07b chore(eval): Remove eval_infer_remote.sh script and related references (#10157)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-07 20:46:59 +00:00
Kenny Dizi 3a629cdf08 Add support model claude-opus-4-1-20250805 (#10120) 2025-08-07 18:48:34 +00:00
sp.wack 6ea33b657d chore(frontend): Remove some dead code (#10121) 2025-08-08 02:40:35 +08:00
Xingyao Wang a526f53181 Add uvx CLI command to PR descriptions (#10142)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-08 01:51:55 +08:00
Xingyao Wang 0d28113df1 Fix Docker installation for swebench and mswebench images (#10124)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-07 23:42:35 +08:00
aeft 029a19ca05 fix: remove duplicate error message in provider validator (#10088) 2025-08-07 23:37:51 +08:00
Xingyao Wang d525c5ad93 fix(config): support defining MCP servers via environment variables and improve logging (#10069)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-07 14:48:44 +00:00
chuckbutkus 881729b49c Fix user info api calls (#10137)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-06 23:57:52 -04:00
sp.wack 42ed36e5cc hotfix(frontend): Fix chat message font size (#10134) 2025-08-06 18:37:06 +00:00
Xingyao Wang 2b4e9137e3 chore(logging): Reduce microagents directory logging noise from WARNING to DEBUG (#10127)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-06 20:26:42 +02:00
greese-insight 37cebc1f8f fix: update git config to handle the necessary user name and email se… (#9975) 2025-08-06 20:25:26 +02:00
Graham Neubig 59ecf5515e Promote OpenHands LLM provider as the recommended option (#10108)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-06 13:33:12 -04:00
Rohit Malhotra 3f327a940f Paginate repo list from providers (#9826)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
Co-authored-by: Hiep Le <69354317+hieptl@users.noreply.github.com>
2025-08-06 13:03:46 -04:00
mamoodi 9c83a5623f Remove the "No secrets found" which is unnecessary (#10126)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-06 12:55:32 -04:00
Xingyao Wang efa3c2187d Bump conversation history limit from 20 to 100 (#10128)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-06 16:43:31 +00:00
Jamesz12b 12bc965964 fix: Chat Width Limitation in Chat Window (#9895) 2025-08-06 16:11:56 +00:00
dependabot[bot] 256bad9f5a chore(deps-dev): bump eslint-plugin-prettier from 5.5.3 to 5.5.4 in /frontend in the eslint group (#10123)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-06 15:26:19 +00:00
Tim O'Farrell e9700ecc3d Add "Session Timeout!" translation entry (#10122)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-06 15:00:01 +00:00
Graham Neubig eba4294b08 Add Git credentials settings to frontend (#9956)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Abubakar <abubakaran102025@gmail.com>
2025-08-06 09:54:19 -04:00
Hiep Le dbba60356e chore: remove the feature flag for the microagent management page. (#9874) 2025-08-06 17:46:05 +04:00
Hiep Le dceff1fae4 feat(frontend): add a tooltip to repo dropdown on home page (#10079) 2025-08-06 17:16:18 +04:00
dependabot[bot] 5a35fa571a chore(deps): bump the version-all group in /frontend with 5 updates (#10084)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-06 17:12:55 +04:00
chuckbutkus ff2cfb7bce Get auth URL from config if it is supplied. (#10111) 2025-08-06 08:58:08 -04:00
Graham Neubig 1c66347803 Improve stop button message for better user experience (#9860)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-05 21:53:40 -04:00
Graham Neubig 238ae611f6 Fix: Add APIConnectionError to LLM_RETRY_EXCEPTIONS to handle temporary API errors (#9818)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-05 16:38:41 -04:00
chuckbutkus cda29107f1 Update user and group creation in Dockerfile (#10096) 2025-08-05 14:38:53 -04:00
chuckbutkus 97bfa96a15 Enterprise sso (#10008)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Rohit Malhotra <rohitvinodmalhotra@gmail.com>
2025-08-04 17:50:59 -04:00
Xingyao Wang 0e2f2f4173 Add global git configuration to Dockerfile.j2 (#10080)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-05 04:10:09 +08:00
Rohit Malhotra 5554b7b418 refactor: modify ExperimentManager to take config instead of agent_config and call before session creation (#10001)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-04 16:05:05 -04:00
Chase Farmer d30f77c60a Honor user-set flag for LOG_TO_FILE (#10078) 2025-08-04 19:20:20 +00:00
aeft a36d1673fa feat(cli): add agent state validation to /resume command (#10066) 2025-08-04 21:14:21 +02:00
mamoodi d233e89873 Fix Tavily search API key placeholder format (#10075)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-04 15:13:29 -04:00
Yumi Izumi 402b6224a6 feat: allow optional HTTP protocol for self-hosted GitLab instances (#9757)
Co-authored-by: Rohit Malhotra <rohitvinodmalhotra@gmail.com>
2025-08-04 14:54:19 -04:00
aeft 4e5e2a7095 docs: fix typos and update section numbering in Development.md (#10067) 2025-08-04 14:50:00 -04:00
Tim O'Farrell a0adbd741a Fix: Display logout option even when user is not available (#10077)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-04 11:24:20 -06:00
llamantino d5cdecea21 fix(docker-runtime): adjust default port ranges to avoid Windows ephemeral ports (#9924) 2025-08-04 09:30:18 -04:00
Xingyao Wang fef287fcb0 Always install Docker with MTU 1450 configuration (#10007)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-04 21:21:03 +08:00
Ryan H. Tran 6fc1a63eb8 [CLI] Add default fetch MCP server & update doc to require uvx (#9952) 2025-08-04 04:30:16 +00:00
aeft 5364e2638b docs: update CodeAct agent step method Returns documentation (#10054) 2025-08-02 19:33:44 +00:00
Graham Neubig d3983b00bd [Feature Request]: Make git username and email configurable (#9942)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-02 05:20:05 +08:00
Calvin Smith 39fff41dd4 Set default condenser to ConversationWindowCondenser (#10031)
Co-authored-by: Calvin Smith <calvin@all-hands.dev>
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-01 10:35:40 -06:00
Bashwara Undupitiya d0a8c896c2 feature: Add Jira, Jira DC and Linear UI Integrations (#9761)
Co-authored-by: Wishmi Dhanapala <wishmis@verdentra.com>
2025-08-01 10:25:49 -05:00
dependabot[bot] 4f24bcaec9 chore(deps): bump the version-all group in /frontend with 7 updates (#10042)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-01 15:23:19 +00:00
Tim O'Farrell d3209f8c28 Add unit tests for LocalRuntime's vscode_url and web_hosts methods (#9984)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-08-01 07:02:28 -06:00
Rohit Malhotra 287c34b3f3 Add branch information to repository context to prevent unwanted branch switching (#9833) 2025-08-01 00:25:36 -04:00
Rohit Malhotra 1cdc38eafb Add LLM disclaimer to Slack integration documentation (#10006)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-31 18:43:08 -04:00
Rohit Malhotra ae045251f2 Revert "Add experiment for agent config" (#10032) 2025-07-31 21:25:44 +00:00
Tim O'Farrell 9b374cd6b8 Fix for issued due to changes in spec for custom secrets (#10028) 2025-07-31 14:49:56 -06:00
mamoodi 4759a78c12 Patch release 0.51.1 (#10023)
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-31 15:21:54 -04:00
greese-insight d88e68eb49 fix: update openhands local runtime to handle provider tokens correctly (#9915)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-07-31 15:21:33 -04:00
Tim O'Farrell b9abdf10ce Fixes for git diff viewer (#10026) 2025-07-31 15:19:56 -04:00
Denys Vitali 5b5a9718c2 fix(runtime): use async in git clone (#9334)
Co-authored-by: Tim O'Farrell <tofarr@gmail.com>
Co-authored-by: mamoodi <mamoodiha@gmail.com>
2025-07-31 13:59:20 -04:00
Robert Brennan 86dac5efe4 Improve connecting status messages with time expectations (#10016)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-31 15:20:33 +00:00
Ivan Dagelic dfeab9f767 chore: env for installing third party providers (#9767)
Signed-off-by: Ivan Dagelic <dagelic.ivan@gmail.com>
Co-authored-by: Graham Neubig <neubig@gmail.com>
2025-07-31 15:20:06 +00:00
dependabot[bot] 4b13658401 chore(deps-dev): bump @tanstack/eslint-plugin-query from 5.81.2 to 5.83.1 in /frontend in the eslint group (#10019)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-31 15:14:13 +00:00
Carlos Freund 844b00a380 Make backend and frontend ports configurable in Makefile (#9722) 2025-07-31 11:11:43 -04:00
Carlos Freund 29fe911828 fix(conf): add cause to re-raised value-error to keep context. (#9940)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Xingyao Wang <xingyaoww@gmail.com>
2025-07-31 22:59:13 +08:00
Xingyao Wang 5282770a4c Fix litellm_proxy model info JSON parsing error handling (#10009)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-31 14:52:36 +00:00
Hiep Le 953902dcce feat(frontend): integrate with the updated get microagents API for the microagent management page. (#10010) 2025-07-31 18:42:07 +04:00
sp.wack b28e0533e0 fix(feedback): Batch event feedback status request (#9884)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-31 18:07:06 +04:00
mamoodi 43555fa13b Release 0.51.0 (#9993) 2025-07-31 09:55:05 -04:00
Hiep Le 10ae481b91 refactor: improve the get microagents API (#9958)
Co-authored-by: Rohit Malhotra <rohitvinodmalhotra@gmail.com>
2025-07-31 00:33:02 -04:00
Xingyao Wang c2e860fe92 Improve LLM call metadata (#10004)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-31 07:02:49 +08:00
Xingyao Wang c2fc84e6ea Remove task completion status message from finish action display (#9977)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-07-31 04:33:45 +08:00
Xingyao Wang 6f44b7352e Add search API key settings to CLI (#9976)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-31 02:03:29 +08:00
dependabot[bot] 16106e6262 chore(deps): bump the version-all group in /frontend with 3 updates (#9997)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-30 15:20:33 +00:00
Xingyao Wang 6cea73b6da Add qwen-3-coder-480b to OpenHands provider (#9985)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-30 23:12:31 +08:00
llamantino fdf9a49e28 feat(frontend): improve conversation card context menu (#9917) 2025-07-30 19:09:56 +04:00
Erkin Alp Güney e348634dbd Fix user input commands being echoed twice in terminal (#9959)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-30 17:47:21 +04:00
Ryan H. Tran b67db15f8a [CLI] Fix errno 21 warning when reading directory (#9990) 2025-07-30 21:38:45 +08:00
Engel Nyst a32a623078 perf(gemini): Apply Gemini 2.5 Pro performance optimizations from PR 9913 (#9925)
Co-authored-by: OpenHands-Claude <openhands@all-hands.dev>
2025-07-29 23:28:50 +00:00
Rohit Malhotra 03c8312f5f Add maintenance banner feature (#9981)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Graham Neubig <neubig@gmail.com>
Co-authored-by: sp.wack <83104063+amanape@users.noreply.github.com>
2025-07-29 17:35:10 -04:00
Graham Neubig b75a61bce9 Fix make lint dependencies to work out of the box (#9983)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-29 21:14:00 +00:00
Tim O'Farrell 2c36e2447c Fix for app/worker urls (#9980) 2025-07-29 14:49:22 -06:00
Graham Neubig f87c827fe6 Improve OpenHands authentication error message (#9780)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: sp.wack <83104063+amanape@users.noreply.github.com>
2025-07-29 20:22:47 +00:00
Xingyao Wang 3f395e3cee feat: show export trajectory button in SaaS mode for debugging (#9979)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-30 03:26:21 +08:00
Xingyao Wang 7a45ebf0f4 Fix MCP config priority logic in sessions.py (#9237)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-07-29 18:47:19 +00:00
Rohit Malhotra 5b13cfc2a0 Add experiment for agent config (#9861)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-29 17:56:28 +00:00
Tim O'Farrell 5553584056 Fix git changes panel (#9967) 2025-07-29 11:21:49 -06:00
Rohit Malhotra e951612ff4 Add IP whitelisting information for Bitbucket Cloud integration (#9894)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-29 11:54:54 -04:00
dependabot[bot] 426e16b17d chore(deps): bump the version-all group in /frontend with 7 updates (#9960)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-29 14:59:27 +00:00
Tim O'Farrell d9a595c9b1 Replace bash scripts with Python for git operations (#9914)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-29 07:34:52 -06:00
Engel Nyst 8fb3728391 Do not override user's git config in CLI mode or local machine (#9905) 2025-07-28 20:12:28 +02:00
dependabot[bot] d4c94dce83 chore(deps): bump the version-all group in /frontend with 7 updates (#9947)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-28 17:16:13 +00:00
Rohit Malhotra 74d6633e9b Update Slack OAuth URL for the 'Install OpenHands Slack App' button (#9908)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-28 17:08:25 +00:00
Mislav Lukach eecad803b1 feat(ds): avoid building tailwind (#9945) 2025-07-28 21:04:19 +04:00
Rohit Malhotra da7a31a6fa Update Slack integration 'Add to Slack' button link (#9906)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-28 12:43:01 -04:00
C9luster c677f7284e Fix the BUG in the __init__ file of openhands to obtain the version (#9840)
Co-authored-by: yinjiaqi <yinjiaqi@baidu.com>
2025-07-28 16:13:21 +00:00
sp.wack 60e8e55311 fix: keep tabs visible when agent is stopped (#9941)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-28 22:01:54 +08:00
Xingyao Wang 18557e8654 fix: Properly handle AgentRuntimeTimeoutError in runtime base (#9923)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-28 13:33:19 +00:00
llamantino 39c67e2b92 fix(ci): fix fe unit tests workflow failure due to invalid node-version value (#9928) 2025-07-28 12:13:10 +00:00
Carlos Freund b5146e3188 fix: use poetry run for pre-commit in husky hook (#9934)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-28 16:08:29 +04:00
Erkin Alp Güney a59a6f3041 Optimize pre commit hooks (#9939)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-28 16:07:22 +04:00
llamantino 056d3e4933 fix(tests): fix tests missed by failing frontend test workflow and other flaky tests (#9943) 2025-07-28 16:00:14 +04:00
Engel Nyst 2b4a5a73a4 Fix configuration precedence in CLI mode (#9911)
Co-authored-by: OpenHands-Claude <openhands@all-hands.dev>
2025-07-27 22:42:22 +02:00
Carlos Freund 46504ab0da Fix deprecation message to reference SANDBOX_VOLUMES instead of non-existent RUNTIME_MOUNT (#9931)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-27 18:36:12 +02:00
Ray Myers 412f6ce58d chore - remove stripe and minio python dependencies (#9921) 2025-07-27 10:26:18 -05:00
Xingyao Wang c8f9e6b9fc feat(llm) : add qwen to fn call supported model (#9929) 2025-07-27 04:53:55 +00:00
Graham Neubig 588e838dc4 Fix CLI runtime invalid path error handling (#9814)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-26 08:36:46 +00:00
jpelletier1 2550c08749 docs: Add Known Issues section for Gemini 2.5 Pro (#9909)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-25 14:22:39 -05:00
llamantino 0651c51901 fix(llm_config): extend retry delays to respect rate limit windows (#9489) 2025-07-25 17:26:39 +00:00
bojackli 3ce19993bc Fix typo and remove redundant code in storage module. (#9862) 2025-07-25 18:24:18 +02:00
dependabot[bot] 26a9abbe82 chore(deps): bump the version-all group across 1 directory with 10 updates (#9901)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-25 18:22:11 +02:00
Ivan Dagelic 240017add1 feat: daytona envs for state management (#9893)
Signed-off-by: Ivan Dagelic <dagelic.ivan@gmail.com>
2025-07-25 17:49:10 +02:00
dependabot[bot] b5958b069e chore(deps): bump the version-all group in /frontend with 5 updates (#9903)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-25 19:37:58 +04:00
Mislav Lukach 59b8009d7a fix(ds): add test id support (#9904) 2025-07-25 19:37:25 +04:00
Ryan H. Tran b8b4f58a79 Update swebench version (#9897) 2025-07-25 22:33:59 +07:00
Engel Nyst fcb190281c microagent: Add Git best practices (#9335)
Co-authored-by: OpenHands <openhands@all-hands.dev>
2025-07-25 21:45:00 +08:00
Mislav Lukach 9fcf900a23 feat(toast): custom toast component (#9898) 2025-07-25 12:24:17 +00:00
Tim O'Farrell 06ad5e30c9 feat: Optimize git change detection with performance improvement and multi-repository support (#9870)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-24 19:44:25 -06:00
llamantino 739044087b fix(mcp): workaround for ASGI error caused by duplicate http start in mcp (#9891)
Co-authored-by: Xingyao Wang <xingyaoww@gmail.com>
2025-07-24 17:44:03 +00:00
Hiep Le fa041537c3 feat: Support the “Learn this repo” Button for the Microagent Management Page. (#9873) 2025-07-24 20:30:46 +04:00
dependabot[bot] 079f423a4b chore(deps): bump the version-all group in /frontend with 3 updates (#9883)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-24 18:50:37 +04:00
Vasi f6060f9c53 feat: [CLI] 9392 cli improve confirmation ux - revisited (#9824)
Co-authored-by: bavg <bavg@ubuntu-server.fritz.box>
2025-07-24 16:13:19 +02:00
Graham Neubig b7f234641c Fix system prompts to exclude tests for documentation changes (#9880)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-24 09:28:34 -04:00
mamoodi 4ac0af699f Release 0.50.0 (#9868) 2025-07-24 08:59:16 -04:00
Graham Neubig fb9a941722 docs: Add MCP Cloud availability note and improve document structure (#9801)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: mamoodi <mamoodiha@gmail.com>
2025-07-23 21:40:35 -04:00
Rohit Malhotra c05339cb2d Update summary prompt to avoid repetition in consecutive summaries (#9834)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-23 20:59:06 -04:00
Cansu 2ef518f063 feat: Add configurable runtime support for issue resolver and fix: Kubernetes pod naming limits (#9877) 2025-07-24 00:12:36 +02:00
Ryan H. Tran fbd9280239 Add MCP support for CLI (#9519)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-07-23 17:06:01 +00:00
Mislav Lukach 45ac6b839c fix(button): improve font-weight styling (#9819)
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
2025-07-23 15:37:45 +00:00
Hiep Le 8b59143174 feat: Support the “Learn something new” Button in Microagent Details View. (#9866) 2025-07-23 19:08:36 +04:00
dependabot[bot] c7b8f5d0d1 chore(deps): bump the version-all group in /frontend with 7 updates (#9869)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-23 15:02:35 +00:00
dependabot[bot] 09533d3cb9 chore(deps): bump the version-all group across 1 directory with 30 updates (#9852)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-23 10:49:51 -04:00
Graham Neubig 00582a487c Refactor get_microagents_from_org_or_user error handling (#9865)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-23 14:35:48 +00:00
Graham Neubig 7a168b9b5f Fix Docker runtime port allocation race condition (#9810)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-22 18:12:31 -04:00
Hiep Le 556ec9ab1a feat(frontend): add responsive UI support for the microagent management page (#9847) 2025-07-22 22:47:40 +04:00
Hiep Le d567d22748 feat: Handle Click Events for Microagents and Conversations on the Microagent Management Page. (#9853) 2025-07-22 22:01:49 +04:00
Tim O'Farrell e045b757fa Moved monitoring of last_execution_time to system_stats (#9851)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-22 11:32:59 -06:00
Hiep Le 38ffc85470 feat(frontend): Integrate with the API to add a new microagent. (#9821) 2025-07-22 16:57:05 +00:00
Xingyao Wang 58ea7b5248 Add make lint to pre-commit hook (#9795)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-22 12:36:54 -04:00
bojackli f62ed911d2 Fix: Resolve cross-platform path splitting bug in search (#9732)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-07-22 18:09:50 +02:00
dependabot[bot] d13e32bcec chore(deps-dev): bump @types/node from 24.0.15 to 24.1.0 in /frontend in the version-all group (#9848)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-22 19:20:21 +04:00
Xingyao Wang b978b71c47 Enhance run-eval workflow: Add release triggers and manual dispatch (#9742)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-22 23:11:59 +08:00
llamantino dc2f5cd1b0 fix(cli): filter out LiteLLM coroutine not awaited warning at shutdown (#9842) 2025-07-22 21:53:58 +08:00
mamoodi 07041e057d fix(frontend): Add context menu state management to Controls component (#9841)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-22 09:49:41 -04:00
mamoodi 6e91d19f80 Fix: Prevent LLM settings from being accessible in SaaS mode via double-click (#9831)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-22 09:49:31 -04:00
dependabot[bot] 936510e219 chore(deps): bump the version-all group in /frontend with 2 updates (#9829)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-22 17:41:02 +04:00
Boxuan Li 7af35ab827 Evaluation: disable browser when NOT run_with_browsing (#9837) 2025-07-22 01:45:52 +00:00
Xingyao Wang a7245f2de2 fix(CLI): alias persistence issue (#9828)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-22 05:45:14 +08:00
Tim O'Farrell 6d7ab8a022 Fix for issue where some cases use WORK_PORT and some use APP_PORT (#9830) 2025-07-21 20:24:24 +00:00
Hiep Le bbfa37fd97 feat(frontend): Allow searching/filtering repositories. (#9791) 2025-07-21 16:05:32 +00:00
dependabot[bot] d0cf12e474 chore(deps-dev): bump the eslint group in /frontend with 3 updates (#9825)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-21 16:02:35 +00:00
sp.wack 78306b1ee7 hotfix(frontend): Fix context menu closing (#9822) 2025-07-21 19:44:08 +04:00
sp.wack f6d99234f1 fix(frontend): Fix auth modal tests by adding required providersConfigured prop (#9823) 2025-07-21 19:40:54 +04:00
Boxuan Li 19ca52f954 Skip browser dependency build in Dockerfile when browser is disabled (#9815) 2025-07-21 08:34:11 -07:00
Hiep Le df75116184 feat(frontend): Integrate with API to display repositories and their associated microagents. (#9784)
Co-authored-by: sp.wack <83104063+amanape@users.noreply.github.com>
2025-07-21 19:19:34 +04:00
Xingyao Wang acfb01d743 Fix timestamp corruption in EventStream secret replacement (#9793)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Rohit Malhotra <rohitvinodmalhotra@gmail.com>
2025-07-21 22:23:52 +08:00
Regis David Souza Mesquita 0daaf21607 Add support for the groq hosted kimi-k2-instruct model in the functio… (#9759) 2025-07-21 15:14:09 +02:00
llamantino 95bda09cd9 fix(settings): improve MCP editor layout and controls (#9771)
Co-authored-by: Graham Neubig <neubig@gmail.com>
2025-07-20 19:15:45 +00:00
Rohit Malhotra 1243612694 [Fix]: instruct agent to use token when accessing provider apis (#9807) 2025-07-19 22:04:07 +00:00
Graham Neubig aff8aba5e6 Fix: Use correct git provider in Push & Create PR button (#9803)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-19 11:13:29 -04:00
mamoodi aea37e52f7 Update gitlab integration docs (#9025)
Co-authored-by: Rohit Malhotra <rohitvinodmalhotra@gmail.com>
2025-07-18 16:42:56 -04:00
Xingyao Wang f5674d7c76 feat(agent): Add import placement guidance to CodeAct agent system prompts (#9794)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-18 19:59:09 +00:00
Vasi 9c68146b04 feat: [CLI] 9392 cli improve confirmation ux (#9758) 2025-07-18 19:42:17 +00:00
Boxuan Li ee14f1ea41 Remove poetry dependency in Jupyter Plugin (#9789) 2025-07-18 18:54:53 +00:00
Xingyao Wang b96301061d Bump version in pyproject.toml (#9790) 2025-07-18 14:48:37 -04:00
dependabot[bot] 1281f2d6c2 chore(deps): bump @vitejs/plugin-react from 4.6.0 to 4.7.0 in /frontend in the version-all group (#9785)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-18 21:45:40 +04:00
Hiep Le dc41e0e90c feat(backend): Develop an API to fetch conversations by repository and conversation_trigger. (#9764) 2025-07-18 15:44:24 +00:00
Graham Neubig 793786130a Clarify GitHub integration docs regarding @openhands mentions in pull requests (#9314)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-18 10:58:39 -04:00
Hiep Le 59f03122c7 feat(frontend): Build Add Microagent Modal UI (#9735) 2025-07-18 18:28:13 +04:00
Hiep Le 67edc66da7 feat(backend): Support CreateMicroagent in the “Create New Conversation” API (#9765) 2025-07-18 01:31:09 -04:00
Graham Neubig cb910e6863 Fix MCP tool timeout causing agent to stall indefinitely (#9779)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-17 18:53:09 -04:00
mamoodi 4c39e92351 Docs for OpenHands LLM Provider (#9751) 2025-07-17 18:51:34 +00:00
Engel Nyst e65e0a98f0 Remove/reduce unused content in a CmdOutputObservation (#7404)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-17 19:34:46 +02:00
Hiep Le eecc00fa4a feat(backend): API to get the microagents for the selected repository. (#9749) 2025-07-17 21:00:45 +04:00
sp.wack 5654e251a8 chore: bump to 1.0.0-beta.5 (#9770) 2025-07-17 16:44:01 +00:00
Rohit Malhotra d9694aabcd Add conditional rendering of auth providers based on server config (#9752)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-17 16:42:57 +00:00
Ray Myers bc8ef37192 fix - Avoid building debug log message when not logged (#9600) 2025-07-17 11:42:06 -05:00
Ray Myers 5f141f7712 Fix type hint: add | None to first element of create_default_mcp_server_config return tuple (#9754)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-17 12:10:16 -04:00
Hiep Le 30e3011cb0 feat(backend): Include owner_type in the Get Repositories API response. (#9763) 2025-07-17 11:45:05 -04:00
Xingyao Wang 3475d8021b Fix file duplication in system prompt (#9741)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-17 15:29:44 +00:00
dependabot[bot] 32cd50db2f chore(deps): bump the version-all group in /frontend with 6 updates (#9762)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-17 15:13:44 +00:00
Graham Neubig f0a6db936c Fix: Add navigation to conversation page after clicking Launch button on task suggestions (#9760)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-17 17:43:13 +04:00
Peter Hamilton 11c37d8d70 Update llm constants to match on unpinned claude-sonnet-4 (#9681) 2025-07-17 13:48:35 +02:00
Hiep Le 7e1367057a feat(frontend): Build Microagent Management Sidebar UI. (#9717) 2025-07-17 15:45:24 +04:00
dependabot[bot] 3bbb0c6279 chore(deps): bump the version-all group in /frontend with 2 updates (#9739)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-17 11:40:08 +00:00
Xingyao Wang eed71c21bd Add kimi-k2-0711-preview model to OpenHands provider (#9755)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-17 15:25:31 +04:00
Graham Neubig 4f46826de9 Add Moonshot AI Kimi-K2 model to recommended models (#9706)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: mamoodi <mamoodiha@gmail.com>
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-07-17 04:43:03 +00:00
juanmichelini ea50fe4e3c Fix: Continue evaluation when an instance fails after max retries (#8868)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Xingyao Wang <xingyaoww@gmail.com>
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-07-16 22:42:44 +00:00
Tim O'Farrell b057af8d63 Feat: Add current working directory to LLM instructions (#9718) 2025-07-16 21:10:03 +00:00
Engel Nyst fba2218760 Fix integration tests (#9746) 2025-07-16 22:16:40 +02:00
mamoodi 6147cbdc18 Update OpenHands Cloud with Bitbucket docs (#9740) 2025-07-16 15:10:12 -04:00
Mislav Lukach 802acb3c7e feat(ui): select component (#9712)
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
2025-07-16 17:28:01 +00:00
Xingyao Wang 376dc21e34 (llm): Add Kimi K2 to function calling supported model (#9747) 2025-07-16 17:19:10 +00:00
Mislav Lukach 387318385c feat(ui): tab component (#9673)
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
2025-07-16 16:38:51 +00:00
Mislav Lukach 553f0a0918 feat(ui): toast component (#9632)
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
2025-07-16 16:33:31 +00:00
mamoodi 0d1e21ae45 Release 0.49.0 (#9691)
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
Co-authored-by: Tim O'Farrell <tofarr@gmail.com>
2025-07-16 08:46:41 -04:00
Xingyao Wang a885e9e4d2 Fix newline display in frontend UI (#9729) 2025-07-15 20:59:56 -04:00
Graham Neubig 4c10848e8d Fix dictionary changed size during iteration error in override_provider_tokens_with_custom_secret (#9728)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-15 19:03:28 -04:00
Tim O'Farrell 1d95b01514 Fix: Keep the existing behavior in the docker command. (#9724) 2025-07-15 19:34:00 +00:00
Xingyao Wang cd32b5508c Add OpenAI o3 model support to verified models and OpenHands provider (#9720)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-15 18:19:44 +00:00
Xingyao Wang 9a3bf0f2aa chore(cli): make sonnet first in openhands provider model choice (#9719) 2025-07-15 17:38:08 +00:00
Ryan H. Tran 1d04a83e08 docs: Add SHTTP transport documentation to MCP usage guide (#9701)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-15 23:18:05 +07:00
Hiep Le 17e9b0fd6a chore(Microagent Management UI): Set up the feature flag for the Microagent Management page. (#9704) 2025-07-15 19:49:35 +04:00
dependabot[bot] 54986c9841 chore(deps): bump the version-all group in /frontend with 3 updates (#9709)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-15 14:50:20 +00:00
Xingyao Wang c419277326 Fix Likert Scale displaying "Star Rating" text instead of star icons (#9708)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-15 22:38:02 +08:00
Hiep Le 35b945b9d1 refactor(frontend): Display TOS and Privacy policy links on Sign In page (#9697)
Co-authored-by: sp.wack <83104063+amanape@users.noreply.github.com>
2025-07-15 14:11:51 +00:00
Boxuan Li 5c3619bc48 Add README for terminal_bench evaluation harness (#9700) 2025-07-15 09:48:34 -04:00
Tim O'Farrell 641d0a0bcb Set vscode to use the correct workspace directory (#9698) 2025-07-14 17:40:32 -06:00
dependabot[bot] fbadea9a6f chore(deps): bump the version-all group in /frontend with 3 updates (#9696)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-14 22:34:26 +04:00
Xingyao Wang 6e25d4bbb6 Add OpenHands provider for LLM through OH Cloud (#9526)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-15 01:44:49 +08:00
sp.wack 127220dc39 chore(ui): npm package config (#9535)
Co-authored-by: Ray Myers <ray.myers@gmail.com>
2025-07-14 20:50:44 +04:00
Tim O'Farrell 9a291e385b Introduced config field to determine whether to init a git repo (#9693) 2025-07-14 10:17:26 -06:00
Tim O'Farrell 95ccec82d9 refactor: make /events endpoint lightweight without requiring active conversation (#9685)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-13 17:14:15 -06:00
Xingyao Wang 4aaa2ccd39 Add CLI alias setup for first-time users (#9542)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-13 15:36:06 +00:00
Tim O'Farrell bfe0aa08b6 Fix issue where user gets stuck on TOS page (#9676) 2025-07-11 19:28:13 -06:00
Tim O'Farrell 7fb47761c6 Fix: VSCode using Temp Directory in Nested Mode (#9672) 2025-07-11 18:53:05 +00:00
Xuhui Zhou 415931b4dc Update system prompt for interactional system (#9284)
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-11 18:07:56 +00:00
Hiep Le 6d57eeb3ed feat: Allow the users to edit the conversation's title. (#9648) 2025-07-11 21:46:51 +04:00
Hiep Le c03d390772 fix(frontend): The conversation page cannot be used on mobile devices and tablets. (#9558) 2025-07-11 21:43:53 +04:00
dependabot[bot] a266d4274a chore(deps): bump the version-all group in /frontend with 3 updates (#9669)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-11 21:20:21 +04:00
Engel Nyst a19cd193d9 Log vscode error in a visible way (#9668)
Co-authored-by: OpenHands Bot <openhands@all-hands.dev>
2025-07-11 15:41:21 +00:00
Ivan Dagelic 4f3e648379 chore: update daytona sdk and proxy endpoint (#9664)
Signed-off-by: Ivan Dagelic <dagelic.ivan@gmail.com>
2025-07-11 17:33:12 +02:00
Tim O'Farrell b99150c616 Fixes or vscode token / url not being present (#9661) 2025-07-11 09:31:39 -06:00
OpenHands 8937b3fbfc Fix issue #9655: [Bug]: CodeActAgent is incompatible with xAI Grok-4 due to hardcoded stop parameter (#9666)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-07-11 15:31:11 +00:00
juanmichelini fb5a39a150 Fix libgl1 package for mswebench base images (#9071) 2025-07-11 10:30:33 -05:00
sp.wack fc11c15b75 hotfix(ui): Agent message that includes codeblocks overflows (#9667) 2025-07-11 14:35:55 +00:00
Engel Nyst 50a8741d50 Build from vsix first (#9656)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-11 04:53:06 +02:00
xhguo7 9388fef0ef feat(eval): loc acc evaluation (#8515)
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
Co-authored-by: mamoodi <mamoodiha@gmail.com>
2025-07-11 03:22:35 +08:00
Tim O'Farrell 050e80cc34 Add warm server functionality to local runtime (#9033)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-10 12:12:39 -06:00
Ray Myers 5cc47ee592 Optimize dockerfile by consolidating and reordering steps (#9549) 2025-07-10 12:20:36 -05:00
dependabot[bot] a09346672f chore(deps): bump the version-all group in /frontend with 3 updates (#9651)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-10 19:09:44 +04:00
ManOwnFire 9e72b69cf8 fix (cli): issue 9386 - show settings.json path in /settings (#9481) 2025-07-10 14:59:06 +00:00
sp.wack da1f3a5a7b chore(frontend): Ugprade Node requirement to v22 LTS (#9639) 2025-07-10 17:21:03 +04:00
Hiep Le 5c27a452ac refactor(frontend): Make the API keys table styling consistent. (#9630) 2025-07-10 16:07:35 +04:00
Hiep Le 8cb1c738ff refactor(frontend): Make the secrets table styling consistent. (#9628) 2025-07-10 16:05:24 +04:00
Tim O'Farrell cf276b2e96 All Runtime Status Codes should be in the RuntimeStatus enum (#9601)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-09 15:34:46 -06:00
sp.wack 1f416f616c chore(ui): Fix late redirects in settings page (#9596)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-09 17:26:54 +00:00
sp.wack 52775acd4d chore(eslint): Extend eslint rules to error on i18next/on no-literal-string (#9616)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-09 20:30:24 +04:00
Engel Nyst be0596abd6 add log-level (#9637) 2025-07-09 11:19:10 -04:00
dependabot[bot] e77957aa92 chore(deps): bump the version-all group in /frontend with 3 updates (#9635)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-09 18:57:28 +04:00
Eleanor Berger d04c4c493e Update OpenAI model selection for better agentic coding support (#9597) 2025-07-09 14:44:02 +00:00
Mislav Lukach 5cb534217a feat(ui): spinner component (#9590) 2025-07-09 18:42:29 +04:00
Tim O'Farrell 9331f5e8a7 Fixes for docker nested runtime (#9634) 2025-07-09 08:39:42 -06:00
Hiep Le 8d16567428 refactor(frontend): The Jupyter tab is not showing "Waiting for runtime to start..." when connecting to an agent (#9626) 2025-07-09 18:33:09 +04:00
Xingyao Wang acc69b74c5 docs: Add CLI installation options with shell aliases and local installation (#9575)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-09 03:42:24 +08:00
mamoodi 28d174a7ce Small documentation updates (#9622)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-07-08 15:33:22 -04:00
Xingyao Wang cff5697456 eval: remove gemini-specific swebench template (#9623) 2025-07-08 18:34:23 +00:00
sp.wack 794eedf503 feat(frontend): Memory UI (#8592)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <engel.nyst@gmail.com>
Co-authored-by: tofarr <tofarr@gmail.com>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
Co-authored-by: Robert Brennan <accounts@rbren.io>
Co-authored-by: Rohit Malhotra <rohitvinodmalhotra@gmail.com>
2025-07-08 16:24:07 +00:00
Hiep Le a6ffb2f799 refactor(frontend): Remove the border bottom of the last element on the suggested tasks. (#9610) 2025-07-08 19:13:51 +04:00
Mislav Lukach 3be3779f68 feat(ui): dialog component (#9591) 2025-07-08 19:06:46 +04:00
sp.wack 222f5fdd51 chore: Update codeowners (#9619) 2025-07-08 15:01:00 +00:00
Mislav Lukach 2066f90654 feat(ui): accordion component (#9537) 2025-07-08 18:57:31 +04:00
dependabot[bot] 9ee2f976a1 chore(deps): bump vite from 7.0.2 to 7.0.3 in /frontend in the version-all group (#9618)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-08 14:54:36 +00:00
Hiep Le be62df5277 fix(frontend): Jupyter tab requires page refresh to display content (#9614) 2025-07-08 18:30:58 +04:00
Hiep Le 4baf2a64c1 refactor(frontend): Show the git providers on the suggested tasks (#9608) 2025-07-08 18:25:09 +04:00
Hiep Le 2a833325e1 fix(frontend): The suggested tasks section only filters the tasks by the repository’s title. (#9606) 2025-07-08 18:24:30 +04:00
Hiep Le aa2cacab44 fix(frontend): The terminal is still shown when connecting to an agent. (#9603) 2025-07-08 18:21:06 +04:00
tangwei12 ea07570f62 fix openhands cli loglevel (#9382)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-07-08 16:07:13 +02:00
Kenny Dizi 3f5a5005a2 Improve configuration for reasoning_effort (#9572) 2025-07-08 10:05:15 -04:00
mindflow-cn 7acee9e5da Allow workspace_mount_path to use relative paths (#9615)
Co-authored-by: jianchuanli <jianchuanli@langcode.com>
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-07-08 21:47:28 +08:00
mamoodi 37cbeb735f Some documentation update (#9598)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-07-08 08:59:08 -04:00
Graham Neubig c6c6c202f6 Fix CLI thought display order issue (#9417)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-07 23:33:57 +02:00
Tim O'Farrell 517a72fd0d Use the same event stream instance for conversations as sessions (#9545)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-07 14:37:17 -06:00
Xingyao Wang 7cfecb6e52 Increase success toast duration to 5 seconds with dynamic calculation (#9574)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-08 02:33:47 +08:00
Tim O'Farrell 8fe2e006ee Added run_in_loop method (#9586)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-07 11:01:17 -06:00
dependabot[bot] 6d62c341eb chore(deps): bump @heroui/react from 2.8.0-beta.11 to 2.8.0-beta.13 in /frontend in the version-all group (#9587)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-07 16:48:59 +00:00
Tim O'Farrell 229f35093d perf: make EventStore cur_id a lazy calculated property (#9544)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-07 09:58:46 -06:00
Rohit Malhotra 21a5e3eed5 Improve error logging in verify_repo_provider before AuthenticationError (#9530)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-07 10:02:46 -05:00
Hiep Le 97e3310dd5 fix(frontend): the GET microagents API is called multiple times, and the Available Microagents modal loads for an extended period if the conversation is connecting to an agent. (#9517) 2025-07-07 18:08:26 +04:00
Hiep Le 2053e72474 fix(frontend): Not able to scroll the chat input after pasting long content or clicking on a suggested action. (#9550) 2025-07-07 18:06:45 +04:00
dependabot[bot] 300f20368e chore(deps): bump the version-all group in /frontend with 4 updates (#9559)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-07 17:52:34 +04:00
Hiep Le 0bed046fcc fix(frontend): NaN is shown on the conversation card (#9581) 2025-07-07 17:51:56 +04:00
Hiep Le 0bf0dc9316 fix(frontend): [OpenHands Cloud] The Delete API Key modal does not display correctly if the API key name is too long. (#9556) 2025-07-07 17:50:11 +04:00
Hiep Le 0e8d9a8bb4 fix(frontend): [OpenHands Cloud] The API keys table does not display properly if the API key name is too long. (#9554) 2025-07-07 17:49:13 +04:00
Robert Brennan 9280bc34ad Enhance logging for org-level microagent loading to improve debugging (#9471)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-07 12:31:45 +02:00
Graham Neubig b132348d22 Fix Jupyter tab not showing input commands (#9533)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-07 09:43:43 +02:00
TakumaNakao 1be77faf94 ADD gemini-2.5 to REASONING_EFFORT_SUPPORTED_MODELS (#9546) 2025-07-06 06:31:41 +00:00
Boxuan Li a6301075ec Add core config to disable browser environment (#9570) 2025-07-06 08:20:58 +02:00
Boxuan Li b98615bc1c Mark memory-profiler & jupyter_kernel_gateway dependency as non-optional (#9562) 2025-07-06 04:13:21 +02:00
Boxuan Li 29fdc701a3 Jupyter: remove poetry dependency (#9561) 2025-07-05 15:03:26 -07:00
Ryan H. Tran 8bc9207c24 Add instruction to use Arctic Inference (#9547) 2025-07-04 20:34:05 +07:00
Hiep Le 96008736a4 fix(frontend): [OpenHands Cloud] The input outline on the user setting page is not consistent. (#9552) 2025-07-04 13:23:03 +04:00
Robert Brennan 38d5db0547 Fix capitalization in 'Initializing agent...' status message (#9406)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-04 09:56:40 +02:00
Robert Brennan 8af1f1cac9 Add labels support to PR and MR creation tools (#9402)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-04 09:55:54 +02:00
Engel Nyst ef502ccba8 Add CLI/vscode integration (#9085)
Co-authored-by: OpenHands-Gemini <openhands@all-hands.dev>
Co-authored-by: Claude 3.5 Sonnet <claude-3-5-sonnet@anthropic.com>
2025-07-03 22:42:06 +02:00
Tim O'Farrell ece556c047 Fix issue where coro was not awaited (#9536) 2025-07-03 13:32:51 -06:00
Tim O'Farrell 55a09785ce Fix for issue where wrong method was called (#9532) 2025-07-03 11:46:48 -06:00
Mislav Lukach 2990c21d97 fix(ui): fix base components styling (#9528) 2025-07-03 21:21:18 +04:00
dependabot[bot] 14c8ea93c9 chore(deps): bump vite from 7.0.0 to 7.0.1 in /frontend in the version-all group (#9529)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-03 21:20:22 +04:00
Mislav Lukach 764077ef3d Feat/create UI dir (#9462)
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
2025-07-03 13:26:19 +00:00
Hiep Le 63ead2a638 fix(frontend): The "available microagents" modal does not show the latest agents after adding a new agent or updating the current agents (#9502) 2025-07-03 13:11:06 +00:00
Hiep Le be0049c76e fix(frontend): Some strings are not included in the translation file. (#9524) 2025-07-03 12:55:13 +00:00
Hiep Le bafd1596dd fix(frontend): The secret settings layout will be broken if the secret name is too long. (#9522) 2025-07-03 12:54:47 +00:00
Hiep Le ce58ccab8a fix(frontend): Changing languages on the settings page does not work for some languages. (#9515) 2025-07-03 16:35:52 +04:00
sp.wack b3c8b7c089 Fix WebSocket disconnection when uploading large files (#9504)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-03 16:28:30 +04:00
Engel Nyst ac2947b7ff Fix /init on CLI Runtime (#9474)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-03 08:28:18 -04:00
mamoodi 91cd647f20 Add item to troubleshooting guide (#9490) 2025-07-02 16:31:26 -04:00
mamoodi c521fb7a8f Release 0.48.0 (#9491) 2025-07-02 16:21:45 -04:00
Rohit Malhotra f049411631 (Hotfix): Microagent won't load depending on version number format (#9508)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-02 18:06:36 +00:00
Tim O'Farrell 606ec59b33 Fix CLI confirmation input to handle invalid input properly (#9503)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-02 10:48:43 -06:00
Graham Neubig d2fc5679ad Improve rate limit message to indicate automatic retry (#9281)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-02 12:27:35 -04:00
Hiep Le 7bfa05d38a refactor(frontend): Show branch name and git provider on the conversation cards (#9480)
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
2025-07-02 16:04:55 +00:00
dependabot[bot] 12a95fb548 chore(deps): bump the version-all group in /frontend with 7 updates (#9506)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-02 15:08:05 +00:00
llamantino ae03c4eb80 chore: bump openhands-aci to 0.3.1 to fix ffmpeg warning (#9500) 2025-07-02 13:49:51 +00:00
mindflow-cn 8e486dfd6b Replace libtmux's deprecated methods in bash.py (#9463)
Co-authored-by: jianchuanli <jianchuanli@langcode.com>
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-07-01 21:07:48 -04:00
Rohit Malhotra 48ee5659c9 Conditionally render 'Add GitHub repos' link based on provider (#9499)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-01 20:56:00 -04:00
Graham Neubig b7613d7529 Fix feedback endpoint calls in OSS mode (#9476)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-01 16:31:05 -04:00
Graham Neubig e05e627957 Add ArcticInference doc (#9492) 2025-07-01 14:15:13 -04:00
mamoodi 6da7e051be Make roadmap labels exempt from going stale (#9484) 2025-07-01 12:56:36 -04:00
dependabot[bot] 002e12a049 chore(deps): bump the version-all group in /frontend with 5 updates (#9486)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-01 20:09:02 +04:00
Graham Neubig ed58858e03 Add setup.sh script execution to event stream (#9427)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-07-01 10:37:21 -04:00
Hiep Le 11ae4f96c2 fix(frontend): The "logout" action is still shown even if there is no associated account. (#9478) 2025-07-01 16:51:59 +04:00
Hiep Le c2acf4e07e fix(frontend): Updated LLM settings are not applied to existing conversations. (#9460) 2025-06-30 16:52:59 +00:00
sp.wack e9bdf761b7 hotfix(frontend): Fix action button cutoff (#9465) 2025-06-30 20:32:52 +04:00
Hiep Le 04b93069b4 feat(frontend): Stop conversation (#9458) 2025-06-30 20:31:37 +04:00
Hiep Le ec03ce1ca0 feat(frontend): Tooltip for "suggested tasks" (#9447) 2025-06-30 14:46:39 +00:00
Hiep Le 46157a85d8 fix(frontend): Response issue - the content of the “Agent Tools & Metadata” modal is overflow. (#9449) 2025-06-30 14:44:04 +00:00
Hiep Le a691e3148a fix(frontend): Responsive issue - the horizontal scrollbar is showing when resizing the browser window (#9446) 2025-06-30 18:40:17 +04:00
Hiep Le 4674e0b77a refactor(frontend): When users hover over the buttons, the pointer will not be displayed (#9442) 2025-06-30 13:54:29 +00:00
dependabot[bot] d7d0329d25 chore(deps): bump node from 22.16.0-bookworm-slim to 24.2.0-bookworm-slim in /containers/app (#9040)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-30 17:40:14 +04:00
Graham Neubig 17853cd5bd Change default max_output_tokens to None and add comprehensive model tests (#9366)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-29 21:57:34 -04:00
Boxuan Li c992b6d2a0 Fix CLI runtime not disabling jupyter plugin by default (#9452) 2025-06-29 17:04:16 -07:00
llamantino 34bf645d64 fix(cli): fix terminal input lag on Windows by start&stopping pause task (#9436) 2025-06-29 10:21:40 -07:00
Graham Neubig 1ae1c16b26 docs: Add repository support and missing options to headless mode documentation (#9311)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-06-29 01:05:52 +00:00
Boxuan Li 5099413729 Complete browsing unit tests (#9428) 2025-06-28 09:52:52 -07:00
AY b06a3bdb7c Fixes #9394 - Improve CLI exit messaging to distinguish intentional exits and inter… (#9432) 2025-06-28 18:51:25 +02:00
Xingyao Wang a7b234d1f6 feat(agent): Add TODO.md workflow for long-horizon tasks into a separate system prompt (#8896)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-28 09:08:13 -04:00
Graham Neubig 2c2a721937 Fix unit tests to be environment-independent for cloud deployment (#9425)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-27 20:43:09 -04:00
AutoLTX 7abad5844a [Feature] Support .cursorrules (#9327)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-06-28 02:33:19 +02:00
dependabot[bot] 4781e9a424 chore(deps): bump the version-all group across 1 directory with 20 updates (#9421)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-27 20:32:51 -04:00
llamantino a24d7e636e fix(cli): avoid race condition from multiple process_agent_pause tasks (#9423) 2025-06-27 23:22:43 +00:00
Peter Hamilton 66b95adbc9 Fix: Retry on Bedrock ServiceUnavailableError (#9419)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-27 22:17:50 +02:00
mamoodi d617d6842a Release 0.47.0 (#9405)
Co-authored-by: Graham Neubig <neubig@gmail.com>
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-27 13:59:36 -04:00
Xingyao Wang 0eb7f956a9 fix(CLI): Reduce severity of pending action timeout messages (#9415)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-06-27 16:28:31 +00:00
Graham Neubig d3154c4bae Fix CLI import error with broken third-party runtime dependencies (#9413)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-27 12:00:38 -04:00
Calvin Smith 04a15b1467 Condensation request signal in event stream (#9097)
Co-authored-by: Calvin Smith <calvin@all-hands.dev>
2025-06-27 09:57:39 -06:00
Xingyao Wang b74da7d4c3 feat(CLI): Enhance --file option to prompt agent to read and understand file first (#9398)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-27 15:57:29 +00:00
Graham Neubig 70ad469fb2 Fix typing 2025-06-26 23:47:54 -04:00
Graham Neubig a85f6af9c2 Fix typing in memory module 2025-06-26 23:46:37 -04:00
Graham Neubig 5e213963dc Fix typing 2025-06-26 23:43:13 -04:00
openhands 051c579855 Fix mypy type error in memory.py with reference to GitHub issue #18440 2025-06-27 03:38:50 +00:00
openhands 6d66b8503c Fix mypy type error in memory.py by adding type ignore annotations 2025-06-27 03:20:20 +00:00
Engel Nyst 0fb1a712d5 feat: Add user directory support for microagents (#9333)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-26 22:31:59 -04:00
Ray Myers 94fe052561 chore - Add pydantic lib to type checking (#9086)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-26 18:31:41 +00:00
Robert Brennan 612bc3fa60 Fix prompt for pushing to a branch to check for main/master (#9397)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-26 16:48:13 +00:00
Engel Nyst 668906f079 Fix swe bench modal (#9242)
Co-authored-by: Hoang Tran <descience.thh10@gmail.com>
2025-06-27 00:10:24 +08:00
Graham Neubig c7dff3e4d2 Remove third-party runtimes (daytona, modal, e2b, runloop) from main codebase (#9213)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
Co-authored-by: Engel Nyst <engel.nyst@gmail.com>
2025-06-26 07:39:39 -04:00
Graham Neubig 6efb992bae Fix incomplete localization issue #9282 (#9283)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-26 03:09:48 +00:00
Ray Myers fafbe81d51 chore - Don't build ubuntu image on PR (#9379) 2025-06-25 22:55:13 -04:00
Robert Brennan dfe6f2d8cc Fix terminal truncation to trim middle of long outputs instead of suffix (#9365)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-26 07:19:23 +08:00
Xingyao Wang 743c814ee8 Add important warning about not pushing/creating PRs unless explicitly asked (#9357) 2025-06-25 19:09:48 -04:00
Tim O'Farrell feb529b1d5 Fix alignment on typing indicator (#9367) 2025-06-25 15:40:34 -06:00
Robert Brennan 8f566a4247 Update Slack invite links across all documentation (#9372)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-25 21:29:46 +00:00
Graham Neubig 0e4aeba47c Add GitLab alternative directory support for microagents (#9331)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-25 21:08:01 +00:00
Robert Brennan d37e40caf8 Fix Bitbucket pagination and sorting to fetch ALL repositories (#9356)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-25 21:06:01 +00:00
Xingyao Wang 8e4a8a65f8 Revert "Simplify max_output_tokens handling in LLM classes" (#9364) 2025-06-25 20:01:23 +00:00
Graham Neubig e9027e2ae8 Add YouTube video tutorial to CLI documentation (#9351)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-25 19:09:18 +00:00
Engel Nyst 1fd0aefd20 Revert "chore(deps): bump the version-all group across 1 directory with 12 updates" (#9347) 2025-06-26 01:24:07 +08:00
dependabot[bot] 722fabfa97 chore(deps-dev): bump the eslint group across 1 directory with 3 updates (#9348)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-25 12:16:12 -04:00
dependabot[bot] 24f12eed12 chore(deps): bump the version-all group across 1 directory with 12 updates (#9326)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-25 08:34:40 -04:00
Ryan H. Tran dfa54673d2 [OH-Versa] Add remaining browsing & GAIA eval improvement (#9015)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-06-25 12:36:15 +07:00
Xingyao Wang 76914e3c26 Add new feedback reason: The agent should have asked me first before doing it (#9332)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-24 22:12:20 -04:00
mamoodi b0b820f8b2 Release 0.46.0 (#9328) 2025-06-24 16:47:17 -04:00
Rohit Malhotra 5c8bdd364e [Feat]: BitBucket integration for Cloud OpenHands (#9225)
Co-authored-by: chuckbutkus <chuck@all-hands.dev>
2025-06-24 15:40:58 -04:00
Engel Nyst 0c1c570dac Microagents doc (for LLMs) (#9324)
Co-authored-by: OpenHands-Claude <openhands@all-hands.dev>
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-06-24 17:04:36 +02:00
mindflow-cn fa75b22cc0 Enhanced llm editor (#9174)
Co-authored-by: jianchuanli <jianchuanli@langcode.com>
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-06-24 13:57:18 +00:00
Graham Neubig 8aeb4dd632 Fix org repo deletion to run in runtime (#9319) 2025-06-24 21:43:45 +08:00
mamoodi 4c34a5f0f5 Make some doc changes for consistency (#9309)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-24 08:34:11 -04:00
mamoodi 848f692033 Update CLI docs (#9074)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-06-23 21:58:51 +00:00
Xingyao Wang 2df4536420 Show Likert scale feedback form on AWAITING_USER_INPUT and ERROR agent states (#9292)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-23 21:18:19 +00:00
Robert Brennan d66bcf5021 Update README.md with OpenHands Cloud chart (#9194) 2025-06-23 16:59:26 -04:00
Graham Neubig 4f5e146783 Better translation of "let's start building" in Japanese (#9310)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-23 20:15:42 +00:00
sp.wack 0c38fb0ceb chore(frontend): OpenHands design library scaffold (#9224) 2025-06-23 15:19:35 -04:00
Graham Neubig 7b0f880860 Fix Pydantic class-based config deprecation warnings (#9279)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-23 13:10:38 -06:00
Mizote Hikaru a156d5d243 fix: create metadata.json when joining conversation if it doesn't exist (#8986) 2025-06-23 15:05:26 -04:00
Graham Neubig c29b5e9757 Fix automatic lowercasing of model names in LLM integration (#9271)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-23 18:59:06 +00:00
Graham Neubig 5e5168ffd4 Fix Pydantic model_fields instance access deprecation warnings (#9278)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-23 18:54:13 +00:00
MXDI 6aad23d35c feat: Add support for Mistral AI models with customizable safety sett… (#8802)
Co-authored-by: Mahdiglm <mahdiglm@users.noreply.github.com>
Co-authored-by: Engel Nyst <engel.nyst@gmail.com>
Co-authored-by: mamoodi <mamoodiha@gmail.com>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-06-23 18:37:06 +00:00
மனோஜ்குமார் பழனிச்சாமி f5ae1759b6 Add model name (#8718) 2025-06-23 14:21:47 -04:00
Ikuo Matsumura 9ec94737ed feat(cli): Add vi mode support (#9287)
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-06-23 17:39:38 +00:00
llamantino 63c7815823 docs: rewrite local LLMs page (#9307) 2025-06-24 01:20:03 +08:00
baii 95ae47307c Fix the issue where the shttp_services configuration from config.toml fails to load correctly. (#9175) 2025-06-23 13:02:56 -04:00
Graham Neubig 035050252b Better timeout prompt (#9140)
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-06-23 16:42:15 +00:00
Tommaso Bendinelli 5b48aee0c9 Fix openhands.core.exceptions.FunctionCallConversionError fn_call_converter for GPT-o4-mini when the agent generates images (#9152)
Co-authored-by: tommaso <tommaso@t7144.csem.local>
2025-06-23 16:01:36 +00:00
Xingyao Wang 1a89dbb738 docs: Add Success Stories tab to documentation (#9120)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-23 23:39:39 +08:00
Rohit Malhotra bba62c26fd Make sandbox api key configurable via user settings (#8803)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-23 11:25:10 -04:00
Graham Neubig 9b4ad4e6e3 Fix SambaNova context length exception handling (#9252)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-23 07:06:31 -04:00
Graham Neubig 1e33624951 Simplify max_output_tokens handling in LLM classes (#9296)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-23 06:48:45 -04:00
Graham Neubig 8b90d610c6 Fix CLI model selection to allow custom model names (#9205)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-23 04:03:00 +00:00
mamoodi 834abc0eee More doc updates (#9289) 2025-06-22 22:46:47 -04:00
Tim O'Farrell c9bb0fc168 Conversation Manager small refactor (#9286)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-22 19:27:03 -06:00
Graham Neubig 5d69e606eb feat: Add Windows PowerShell support to CLI runtime (#9211)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-22 20:17:40 -04:00
Engel Nyst 081880248c Fix lint (#9290) 2025-06-22 13:40:14 -04:00
Chase 4ee269c3f7 Add ability to customize configuration model on per-agent basis (#8576) 2025-06-22 14:43:17 +02:00
Xingyao Wang 711315c3b9 docs: Update documentation based on llamantino feedback (#9119)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-21 21:57:14 -04:00
mamoodi c2e6244b86 Small doc updates. Fix FAQs (#9270) 2025-06-21 15:52:29 -07:00
Xingyao Wang a1479adfd3 feat(agent): Add configurable system_prompt_filename to AgentConfig (#9265)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-22 06:21:52 +08:00
dependabot[bot] 99fd3f7bb2 chore(deps): bump ubuntu from 22.04 to 24.04 in /containers/e2b-sandbox (#9042)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-21 12:23:42 -07:00
dependabot[bot] c617881b3c chore(deps): bump the version-all group in /frontend with 4 updates (#9234)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-21 12:22:43 -07:00
dependabot[bot] 7ca3607dcd chore(deps): bump the version-all group with 3 updates (#9256)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-21 12:21:57 -07:00
mamoodi 89999a8e09 Update free credits lines (#9269) 2025-06-21 15:35:04 +00:00
Ray Myers 3d9761df7e Release branch for 0.45.0 (#9264) 2025-06-20 21:14:23 +00:00
Xingyao Wang ea3c4f9366 Fix(CLI): duplicated Command Action display in CLI (#9260)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-21 04:24:16 +08:00
Graham Neubig bda0a64a3d Fix empty image URLs in multimodal browsing causing litellm.BadRequestError (#9214)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-06-20 19:44:11 +00:00
Graham Neubig 8badcb7b35 Fix feedback UI localization in LikertScale component (#9253)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-20 18:50:39 +00:00
Xingyao Wang 078534c2ab Fix httpx deprecation warning during LLM API calls (#9261)
Co-authored-by: Rohit Malhotra <rohitvinodmalhotra@gmail.com>
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-20 18:36:31 +00:00
Rohit Malhotra ba885cd04c Remove Bitbucket login button from SAAS auth modal (#9258)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-20 16:29:57 +00:00
Rohit Malhotra ee64a6662a (Hotfix): tokens go stale for restarted convos in cloud openhands (#9111)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-20 12:16:42 -04:00
solah soyalp 075ef4db9f Add Japanese translations (#9244) 2025-06-20 00:45:08 +00:00
Xingyao Wang a526f73ea6 Add FAQ page to documentation (#9132) 2025-06-19 13:37:03 -07:00
Xingyao Wang 516f9fa635 Add o4-mini model and Mistral provider support to OpenHands CLI (#9217)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-19 18:47:27 +00:00
Xingyao Wang 8c5995a5d8 Update citation in README.md (#9243) 2025-06-19 18:01:30 +00:00
dependabot[bot] afe130f6db chore(deps): bump the version-all group across 1 directory with 15 updates (#9239)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-19 18:48:47 +02:00
Xingyao Wang cc2f96c6c4 Fix search_events signature mismatches after get_events replacement (#9238)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-19 17:57:44 +02:00
Rohit Malhotra b7a6190133 Add max_budget_per_task to settings (#8812)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: sp.wack <83104063+amanape@users.noreply.github.com>
2025-06-18 20:25:01 -04:00
brettstewart 54af9ff3fe feat(runtime): add kubernetes support (#8814)
Co-authored-by: Corey White <corey.white@ziffdavis.com>
Co-authored-by: luke_schulz <luke.schulz@ziffmedia.com>
2025-06-18 21:25:50 +00:00
Xingyao Wang ef582a6335 Increase max iterations from 250 to 500 (#9203)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-18 21:32:15 +02:00
Xingyao Wang d5f5e34ead Fix deprecation warnings in OpenHands CLI (#9199)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-19 02:22:55 +08:00
Graham Neubig 91e6d359c2 Update repo.md with better "openhands with openhands" directions (#9216) 2025-06-18 12:38:51 -04:00
Mislav Lukach a9f26a13a6 feat(chat): support file upload (#8945)
Co-authored-by: sp.wack <83104063+amanape@users.noreply.github.com>
2025-06-18 20:13:07 +04:00
dependabot[bot] a92d6904fc chore(deps): bump the version-all group in /frontend with 2 updates (#9215)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-18 15:28:28 +00:00
dependabot[bot] 306777626f chore(deps): bump the version-all group across 1 directory with 9 updates (#9182)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
2025-06-18 12:05:15 +00:00
Rohit Malhotra 1807efad0b Add Bitbucket integration documentation for local usage (#9206)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-18 05:56:36 -04:00
Graham Neubig e074b2d36f Add Bitbucket microagent and backend implementation (#9021)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
Co-authored-by: Rohit Malhotra <rohitvinodmalhotra@gmail.com>
2025-06-18 00:04:29 -04:00
Ray Myers b7efeb11d9 Bump version to 0.44.0 (#9163)
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-06-17 21:13:17 +00:00
Graham Neubig 7d0aadf8ed Rename ~/.openhands-state to ~/.openhands (#9135)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-06-17 20:44:52 +00:00
Mislav Lukach 78af1de870 chore(analytics): improve label clarity (#9161)
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-06-17 20:33:52 +00:00
llamantino 6a9065960d fix(devcontainer): mark workspace as safe dir (#9136) 2025-06-18 04:22:42 +08:00
Maxim Evtush 653a8a7ce2 Refactor: Improve Consistency in Function Signatures and Regex Usage in compute_ism_pm_score.py (#9145) 2025-06-18 04:22:16 +08:00
Graham Neubig 3591c7a79f Add uvx installation option to CLI documentation (#9186)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-18 04:19:18 +08:00
Ivan Dagelic bae6bd77f4 fix: daytona runtime sandbox handling (#9187)
Signed-off-by: Ivan Dagelic <dagelic.ivan@gmail.com>
2025-06-18 04:18:46 +08:00
Rohit Malhotra 30c71776e7 [Fix]: Loading microagents for integrations (#9189)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-17 16:16:19 -04:00
Robert Brennan 147ffb7e42 Suppress pydub warning about ffmpeg/avconv not found (#8940)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-17 14:44:32 -04:00
Tim O'Farrell 237037cee9 Fix remote runtime status (#9190) 2025-06-18 02:34:41 +08:00
Xingyao Wang 567af43a71 Fix deprecation warning: Replace get_events with search_events (#9188)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-18 00:54:29 +08:00
Rohit Malhotra 65071550b6 Fix grammar issues in Slack documentation (#9180)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-17 23:53:55 +08:00
Alexander d81d2f62cb docs: local serving with ollama documented (#8807)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-06-17 07:18:18 -04:00
Ryan H. Tran ddaa186971 [GAIA] Add prompt improvement to alleviate solution parsing issue & support Tavily search tools (#9057) 2025-06-17 13:16:50 +07:00
Graham Neubig e6e0f4673f docs: Add "Running OpenHands with OpenHands" section for recursive development (#9146)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-16 20:57:52 -04:00
Graham Neubig 7d78b65a1a docs: Add Python version requirement to CLI documentation (#9164)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-16 20:14:10 +00:00
Rohit Malhotra 1f90086030 (Hotfix): Slack app installation flow (#9162)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-16 19:33:43 +00:00
Xingyao Wang 2c4ecd02f7 feat(frontend): add user feedback Likert scale for agent performance rating (only on OH Cloud) (#8992)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: sp.wack <83104063+amanape@users.noreply.github.com>
2025-06-16 19:26:24 +00:00
Rohit Malhotra 2fd1fdcd7e [Refactor, Fix]: Agent controller state/metrics management (#9012)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-16 11:24:13 -04:00
Graham Neubig cbe32a1a12 Fix bash timeout issue caused by interactive git clone prompts (#9148)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-16 08:39:28 -04:00
better629 432d8829dc disable mcp in run_localize and install oh-aci[llama] for issue 9150 (#9151) 2025-06-16 11:03:17 +00:00
Graham Neubig 24f891687d Fix CLI displaying claude-2 as default model for anthropic provider (#9101)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-15 21:21:33 -04:00
Graham Neubig 2d2ccf1329 Fix conversation URL format in pull request links (#9143) 2025-06-15 15:41:08 -04:00
FT e5bff91e8e Fix Typo: Change "accurancy" to "accuracy" in Evaluation Benchmark Comments (#9139) 2025-06-15 12:48:26 +00:00
Linghao Zhang a93b0457c6 feat(eval): Support evaluation on SWE-bench-Live (#9137) 2025-06-15 12:30:47 +00:00
Graham Neubig 98e0f5509c Update CLI mode docs to accurately reflect settings workflow (#9134) 2025-06-14 19:21:18 +00:00
kilavvy 4e99aabcb2 Minor Code Comment Corrections and Clarifications (#9129) 2025-06-14 18:57:14 +00:00
Graham Neubig 0c307ea12e Lint all files in the repo (#9131)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-06-14 16:25:59 +00:00
Graham Neubig 5134a7d938 Add secrets manager documentation to GUI mode docs (#9084)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-14 12:13:24 -04:00
Graham Neubig a1627914ad Fix broken link to LLMs section in GUI mode documentation (#9121)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-14 23:26:41 +08:00
Graham Neubig ccdd86e476 docs: remove 'coming soon' mentions from Slack app installation page (#9112)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Rohit Malhotra <rohitvinodmalhotra@gmail.com>
2025-06-14 14:35:04 +00:00
ASTONE be62ba6b35 add_versicode (#8221) 2025-06-14 13:17:18 +00:00
leopardracer 13c298d35f Minor Typo Fixes in Comments and Documentation (#9058) 2025-06-14 12:51:38 +00:00
llamantino 47b0dc548e feat: support dev container networking without host mode (#9122) 2025-06-14 08:38:18 -04:00
Graham Neubig 90ae4bda0d Restore Windows without WSL documentation (#9090)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-14 08:35:30 -04:00
dependabot[bot] 8963644fb4 chore(deps): bump the version-all group across 1 directory with 14 updates (#9107)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-14 07:58:24 -04:00
Engel Nyst fd3b4ac8e6 Refactor SWE-bench instruction (#8010) 2025-06-13 23:27:52 +02:00
Rohit Malhotra 53623c76b5 [Fix]: allow agent to configure draft status for opened prs/mrs via git mcp (#9117) 2025-06-13 21:06:23 +00:00
Ray Myers e6036b8346 Bump version for 0.43.0 release (#9109) 2025-06-13 14:47:26 -05:00
jpelletier1 144d09a578 Code review microagent (#9093)
Co-authored-by: Graham Neubig <neubig@gmail.com>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-06-13 01:35:44 +00:00
llamantino f97a837d46 fix: fix unreachable runtime container in make docker-dev (#9072) 2025-06-12 12:46:10 -04:00
dependabot[bot] eadec4ce9e chore(deps): bump the version-all group in /frontend with 8 updates (#9095)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-12 15:17:45 +00:00
dependabot[bot] 49e8737779 chore(deps): bump the version-all group across 1 directory with 24 updates (#9066)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
2025-06-12 14:31:35 +00:00
Graham Neubig 4711e74101 Fix default provider in CLI to be 'anthropic' instead of 'openai' (#9004)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-06-12 03:02:03 +00:00
mamoodi c87f1cc8c0 Move Advanced Configurations under Running OpenHands on your Own (#9082) 2025-06-11 16:36:17 -04:00
Rohit Malhotra 33b64786b0 [Docs]: add info about lower scope tokens for gitlab (#9017)
Co-authored-by: mamoodi <mamoodiha@gmail.com>
2025-06-11 19:34:06 +00:00
Rohit Malhotra 12fc50299b [Docs]: add slack integration docs (#8903)
Co-authored-by: mamoodi <mamoodiha@gmail.com>
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-11 19:32:54 +00:00
Tim O'Farrell 57fee17348 Fix VSCode workspace dir (#9080) 2025-06-11 13:31:59 -06:00
Engel Nyst 77517d8ba0 Save CLI settings directly under ~/.openhands (#9079) 2025-06-11 21:07:40 +02:00
Calvin Smith a356f56237 fix: Context window truncation makes progress (#9052)
Co-authored-by: Calvin Smith <calvin@all-hands.dev>
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-11 12:47:34 -06:00
chuckbutkus 7dede37fd8 Make sure redirect URI is HTTPS unless it is for localhost (#9076) 2025-06-11 18:19:15 +00:00
Ray Myers c11dcad309 Add more log context on key events (#9056) 2025-06-11 11:34:16 -05:00
Tim O'Farrell 47209e794a Runtime Status Fixes (#9050)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-11 09:28:17 -06:00
Xingyao Wang 3f50eb0079 feat: Add microagents UI to conversation context menu (#8984)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: sp.wack <83104063+amanape@users.noreply.github.com>
2025-06-11 23:12:27 +08:00
sp.wack f27b02411b chore: Add deprecated tag to ActionMessage type (#9063) 2025-06-11 18:34:07 +04:00
llamantino d151093872 docs: added devstral to llms list, added local llms in local setup (#9062)
Co-authored-by: mamoodi <mamoodiha@gmail.com>
2025-06-11 10:22:15 -04:00
neo ea7294b7f9 docs: add links to other language versions of README (#9038)
Co-authored-by: mamoodi <mamoodiha@gmail.com>
2025-06-11 09:49:40 -04:00
Xingyao Wang 9097f487a6 Move get_agent_obs_text function to browser utils and add return_all option (#9019)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-11 12:32:38 +08:00
Rohit Malhotra fd921a4f88 [Fix]: model tracking in convo metadata (#9053) 2025-06-10 22:19:33 -04:00
Xingyao Wang 96fe5a50d6 Update repo.md (#9054) 2025-06-10 21:51:13 -04:00
Howie Zhou b634e10b45 Add JSON serialization for array and object parameters when converting tools (#8780) 2025-06-10 16:48:49 -04:00
Xingyao Wang 73f01657eb docs: Add TanStack Query state management documentation (#9047) 2025-06-10 16:44:00 -04:00
mamoodi 5d328183d5 Release 0.42.0 (#9046) 2025-06-10 16:34:10 -04:00
Mislav Lukach b7da65d373 chore(ui): update tailwind (#9049)
Co-authored-by: sp.wack <83104063+amanape@users.noreply.github.com>
2025-06-10 18:20:04 +00:00
sp.wack dca9c7bdc6 feat(backend): New "update microagent prompt" API (#8357)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
Co-authored-by: Engel Nyst <engel.nyst@gmail.com>
2025-06-10 22:10:55 +04:00
Rene Leonhardt 07862c32cb chore(docker): update docker base images (#8796)
Co-authored-by: Xingyao Wang <xingyaoww@gmail.com>
2025-06-10 22:48:46 +08:00
Emmanuel Ferdman e04f876df9 Migrate to modern logger interface in server utils (#8965)
Signed-off-by: Emmanuel Ferdman <emmanuelferdman@gmail.com>
2025-06-10 10:25:06 -04:00
Mislav Lukach 78d707de83 chore(billing): add stripe powered by (#9016)
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
2025-06-10 18:10:09 +04:00
sp.wack 058153292f fix(ui): startup message ui (#9007) 2025-06-10 16:50:18 +04:00
dependabot[bot] 53b5e08804 chore(deps): bump the version-all group across 1 directory with 15 updates (#9027)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-09 18:04:14 -04:00
Ray Myers 7cee7dca64 chore - log size of large events (#9024) 2025-06-09 16:47:40 -05:00
mamoodi e12a62d006 Update GUI docs (#9020) 2025-06-09 15:38:44 -04:00
llamantino 77a0c5e073 feat: increase requests timeout to 60s (#8974)
Co-authored-by: llamantino <12345678+yourusername@users.noreply.github.com>
2025-06-09 12:42:03 -06:00
Tim O'Farrell e5d21e003d Added environment variable allowing skipping dependency checks (#9010) 2025-06-09 11:14:39 -06:00
mamoodi c6a4324bda Update Cloud API docs (#9008) 2025-06-09 11:42:37 -04:00
Tim O'Farrell 9ac8f011fe Converted exponential backoff to fixed (#9006) 2025-06-09 09:02:52 -06:00
Leander Maben d84befe28f Adding LLM Based Editing capability (#8677)
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
Co-authored-by: Engel Nyst <engel.nyst@gmail.com>
2025-06-09 21:57:20 +08:00
mamoodi 4eef22e04e Fix some broken links (#9005) 2025-06-09 13:37:00 +00:00
Graham Neubig 93e6811efc Add CLI option to bug template installation dropdown (#9002)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-09 08:49:47 -04:00
Graham Neubig 3ebe3c2140 Update CLI mode documentation to recommend pip install (#8967)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-06-09 08:13:09 -04:00
Xingyao Wang d6d5499416 refactor(MCP): Replace MCPRouter with FastMCP Proxy (#8877)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-08 22:03:18 +00:00
Tim O'Farrell 0221f21c12 Wait for nested container graceful shutdown (#8969) 2025-06-08 13:43:34 -06:00
Tim O'Farrell 617445d5ca Nested event store search no longer throwing errors on 404 (#8985) 2025-06-08 13:41:58 -06:00
Xingyao Wang 34c13c8824 Add back microagent files with special handling for user inputs (#8139)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-06-09 02:49:54 +08:00
Sergey 49939c1f02 Fix typo in evaluation README.md (#8987) 2025-06-08 14:14:07 +00:00
llamantino abec074a66 fix: prevent LLM settings reset when page loses focus during initial setup (#8928)
Co-authored-by: llamantino <12345678+yourusername@users.noreply.github.com>
2025-06-07 20:52:59 +00:00
Graham Neubig 46c12ce258 Update summary_prompt for improved code quality (#8975) 2025-06-07 14:46:40 -04:00
Graham Neubig 5de119dc2e Improve repo.md documentation to instruct OpenHands on capturing repository context efficiently (#8977)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-07 23:18:54 +08:00
llamantino 0abc6f27ef fix(devcontainer): configure host networking to fix runtime connection (#8971)
Co-authored-by: llamantino <12345678+yourusername@users.noreply.github.com>
2025-06-07 01:44:23 +02:00
mamoodi 445d3a5788 Update Cloud UI docs (#8968) 2025-06-07 05:09:54 +08:00
mamoodi 744a6299a7 Update gitlab integration docs (#8946) 2025-06-06 16:07:55 -04:00
chuckbutkus 345dccbf84 Allow user to change their email address (#8861)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-06 18:22:29 +00:00
Rohit Malhotra 6605269e5b [Fix]: make sure to track opened PRs using Git MCP (#8949) 2025-06-07 02:22:14 +08:00
tofarr fac0d59388 Fix for nested runtimes still using the relative url (#8947) 2025-06-06 15:42:54 +00:00
Xingyao Wang 4d6d28a192 Add Google AI Studio API key instructions to documentation (#8938)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: mamoodi <mamoodiha@gmail.com>
2025-06-06 15:39:35 +00:00
llamantino ebacd1b080 fix: make setup.sh executable for devcontainer postCreateCommand (#8891)
Co-authored-by: llamantino <12345678+yourusername@users.noreply.github.com>
2025-06-06 05:26:22 -07:00
Xingyao Wang 59f5f0dc9b feat(agent): remind the agent that it can use timeout to increase the amount of time the command is running (#8932)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-05 20:57:33 -07:00
Rohit Malhotra 4df3ee9d2e (refactor): Update MCP Client to use FastMCP (#8931) 2025-06-06 10:01:39 +08:00
Rohit Malhotra aa54a25241 [Fix]: Broken links from cloud resolver (#8923)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-06 01:46:04 +00:00
Robert Brennan 0813c113f0 Fix for running git commands with the proper user (#8898) 2025-06-06 00:20:15 +00:00
tofarr 19fcf427ba Improved WebSocket Error Handling (#8924)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-05 16:42:18 -06:00
Rohit Malhotra 336b22bea4 [Fix]: add missing await (#8936) 2025-06-05 21:52:30 +00:00
Xingyao Wang 959268b45a chore(dependency): Update opentelemetry-api to resolve conflict with langfuse (#8930)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-05 20:26:51 +00:00
Robert Brennan 309c086976 Fix event stream replay during new connections by replaying before joining (#8818)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-05 12:37:02 -07:00
Ray Myers afd8ee61e7 Fix missing None-check in get_conversations (#8927) 2025-06-05 18:55:41 +00:00
Rohit Malhotra 93b1276768 [Feat]: Add experiment manager (#8820) 2025-06-05 14:49:20 -04:00
mamoodi 412e265745 Update OpenHands Cloud and GitHub Integrations (#8922)
Co-authored-by: Rohit Malhotra <rohitvinodmalhotra@gmail.com>
2025-06-05 17:39:35 +00:00
Ray Myers a3790f1003 0.41.0 Release Branch (#8905) 2025-06-05 17:25:18 +00:00
tofarr b76553136e Added feature flag for opening vscode in a new tab (#8917) 2025-06-05 10:32:07 -06:00
Ray Myers dee89462c2 Improve type coverage for nested runtime (#8921) 2025-06-05 16:19:53 +00:00
mamoodi ad468587ea Split quickstart and getting started workflow (#8904) 2025-06-05 10:01:36 -04:00
Calvin Smith 41cee4b68d Add unit tests for View object (#8900)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Calvin Smith <calvin@all-hands.dev>
2025-06-04 19:35:32 -06:00
tofarr 91e24a4a31 Add conversation start and stop endpoints (#8883)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-04 16:29:24 -06:00
tofarr a1b3c0c7d6 No more 500 error when jumping between conversations (Nested Runtimes) (#8902) 2025-06-04 15:55:26 -06:00
Mislav Lukach 738ecd468c fix(frontend): add security analyzer placeholder (#8901) 2025-06-04 20:07:23 +00:00
tofarr c6c2aafc4f Assorted fixes for the nested / docker runtimes. (#8899) 2025-06-04 13:56:03 -06:00
mamoodi 7bea93b1b6 Move the documentation tabs from top to left nav (#8892) 2025-06-04 14:46:29 -04:00
Robert Brennan d346506d34 Revert "Unrevert "Add username parameter to AsyncBashSession"" (#8897) 2025-06-04 18:45:28 +00:00
Rohit Malhotra d30c6ff720 (Hotfix): make sure MCP tool error observations are surfaced to agent (#8894) 2025-06-04 18:42:09 +00:00
Robert Brennan 80e496d134 Unrevert "Add username parameter to AsyncBashSession" (#8771)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-04 14:32:27 -04:00
Anton Sokolchenko a933a81ef5 Increase sandbox close delay in sandbox_config.py to 3600 seconds (#8889)
Co-authored-by: Robert Brennan <accounts@rbren.io>
2025-06-04 18:12:32 +00:00
tofarr 3c977bd715 Fix for nested mount volumes (#8888) 2025-06-04 09:30:57 -06:00
Graham Neubig c403973616 Add return type annotations to docker runtime (#8543)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-04 11:24:25 -04:00
tofarr 7652ccb000 Fix VSCode iframe SameSite cookie issue with cross-origin fallback (#8881)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-04 09:23:48 -06:00
Calvin Smith 0fd83ff38a Bump condenser window up by 75% (#8887)
Co-authored-by: Calvin Smith <calvin@all-hands.dev>
2025-06-04 15:12:22 +00:00
OpenHands 6c34e5850b Fix issue #8419: Document get_impl and import_from (#8420)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-06-04 01:23:53 +00:00
Robert Brennan b771fb6e32 Add automatic setup flow in CLI mode when settings are not found (#8775)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-06-04 00:01:12 +00:00
tofarr c2a0e525de Now using Dependency Injection to associate conversations with requests (#8863) 2025-06-03 17:36:45 -06:00
Robert Brennan 4aed3944cf Make CLI pip-installable (#8772)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-03 23:35:14 +00:00
Xingyao Wang 5fe7578f45 fix(docs): fix all .md links (#8879) 2025-06-03 14:33:12 -04:00
Rohit Malhotra a348840534 [Feat]: support streamable http mcp (#8864)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-03 17:06:44 +00:00
dependabot[bot] 1850d572b5 chore(deps-dev): bump eslint-plugin-prettier from 5.4.0 to 5.4.1 in /frontend in the eslint group (#8849)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-03 20:30:10 +04:00
Xingyao Wang 728a7e84d8 fix(docs): redirect all /modules to / (#8876) 2025-06-03 16:22:10 +00:00
mamoodi ae4f8b7df9 Re-update to 0.40 (#8875) 2025-06-03 16:17:25 +00:00
baii b706f59cfd fix: can't add gitlab personal access token and add more debug log in validate_provider_token (#8782) 2025-06-03 11:57:04 -04:00
Robert Brennan 633d5b26d0 Fix flaky test_command_output_continuation test in BashSession (#8813)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-03 11:44:08 -04:00
Xingyao Wang 2f55cbb748 Add search engine setup documentation (#8870)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-03 15:27:30 +00:00
mamoodi 9b9a639ea9 Fix CLI mode docs (#8869) 2025-06-03 11:14:32 -04:00
tofarr a5f5bceed6 Fix for nested event store (#8865) 2025-06-03 07:50:50 -06:00
Xingyao Wang 17ae03857f fix(mcp): authentication for mcp calls in remote runtime (#8856) 2025-06-02 21:41:47 +00:00
tofarr e49c984e9f Fix for event params (#8860)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-02 15:16:00 -06:00
Xingyao Wang 6132968324 docs: migrate all docs from All-Hands-AI/docs to OpenHands repo (#8848) 2025-06-03 05:12:10 +08:00
tofarr d03efa284a Added X-Session-API-Key to nested event store (#8857) 2025-06-02 14:15:41 -06:00
மனோஜ்குமார் பழனிச்சாமி aac2e51fc7 Add INIT_PLUGIN_TIMEOUT env (#8840) 2025-06-03 02:47:58 +08:00
Robert Brennan 21af52560a Add detailed logging to remote runtime resume process (#8819)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-02 13:12:24 -04:00
tofarr 72c24b461c Fix LocalRuntime to properly handle existing subprocesses (#8821)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-02 17:03:48 +00:00
Xingyao Wang ab1cdb5b5f feat(aci): adding file viewing capability to different extension types (#8742)
Co-authored-by: Hoang Tran <descience.thh10@gmail.com>
2025-06-03 00:02:02 +07:00
Ryan H. Tran cab144cc51 Upgrade openhands-aci to 0.2.15 (#8811) 2025-06-02 22:08:14 +07:00
tofarr 3f412027ec Reduce the noise from loggers (#8833) 2025-06-02 08:34:29 -06:00
Ming Fang 4221ce8566 Fix typo in issue_resolver.py: 'confgurable' -> 'configurable' (#8839)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-06-02 00:11:34 -04:00
mamoodi 27dc4932bf Release 0.40.0 (#8731)
Co-authored-by: sp.wack <83104063+amanape@users.noreply.github.com>
Co-authored-by: Graham Neubig <neubig@gmail.com>
2025-06-01 16:38:08 -04:00
kotauchisunsun 28dbb1fc74 [refactor]: call load_openhands_config in resolver (#8641) 2025-06-01 16:48:17 +02:00
KianoshArian 9fb5d2109a fix(frontend): fix mobile view of settings page (#8826) 2025-06-01 07:01:08 -06:00
llamantino 880c05ed94 Fix all broken docs links across the project (#8830)
Co-authored-by: llamantino <12345678+yourusername@users.noreply.github.com>
2025-05-31 21:24:59 -04:00
llamantino 6d2074d69b Fix broken links in README after docs site upgrade (#8829)
Co-authored-by: llamantino <12345678+yourusername@users.noreply.github.com>
2025-05-31 23:08:51 +00:00
Graham Neubig 59858dc73b Add OpenHands app support on windows without WSL (#8674)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Boxuan Li <liboxuan@connect.hku.hk>
2025-05-30 23:15:35 -07:00
Xingyao Wang 277b87413b chore: log stack trace when failed to connect in mcp (#8804) 2025-05-30 18:35:19 -04:00
Rohit Malhotra 972837ff73 [Feat]: Gitlab resolver (#8770) 2025-05-30 22:18:34 +00:00
tofarr de196d6da1 Allowing local runtimes to have domains (#8798) 2025-05-29 15:15:27 -06:00
Rohit Malhotra 10a4ab9199 [Fix]: inconsistent microagent descriptions (#8800) 2025-05-29 20:09:01 +00:00
Robert Brennan 3f0d8e7f47 add more logging to debug runtime restarts (#8799) 2025-05-29 19:52:13 +00:00
Engel Nyst 0e0687efc3 Rename service (#8791) 2025-05-29 19:43:42 +00:00
tofarr 30d53f8df0 Fix openapi authorize (#8794) 2025-05-29 13:20:00 -06:00
sp.wack fd52841842 Add git_provider and selected_branch to conversation response (#8795)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-29 22:59:30 +04:00
Graham Neubig d770edc010 Add images and example commands to cloud issue resolver documentation (#8785)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-29 18:13:49 +00:00
Engel Nyst df2374bd85 Refactor agent controller's filter (#8792) 2025-05-29 19:59:34 +02:00
sp.wack 542be7338e fix(frontend): Replace actions with their observations pairs in the chat interface (#8760)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-05-29 19:22:10 +02:00
Rohit Malhotra e4d84946db (Chore): deprecate alias (#8704) 2025-05-29 11:01:28 -04:00
tofarr cc881a6bcb Added Webhooks to event store (#8763)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-29 07:39:08 -06:00
Howie Zhou cb0a1c91e4 docs: change to existing testing files (#8779) 2025-05-29 12:23:24 +00:00
Graham Neubig e208bffade Fix localization issue with hardcoded English strings (#8736)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-29 00:40:57 +02:00
Graham Neubig 6491142364 Fix KeyError on router error logging (#8769) 2025-05-28 19:59:18 +00:00
Robert Brennan 205f0234e8 Rename Conversation to ServerConversation and AppConfig to OpenHandsConfig (#8754)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-28 21:48:34 +02:00
Robert Brennan c76809a766 Revert "Add username parameter to AsyncBashSession" (#8767) 2025-05-28 14:28:26 -04:00
chuckbutkus 9f86f731a7 Update login (#8743)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-28 17:53:35 +00:00
sp.wack 6fe5da810b fix(frontend): Handle assistant messages at the top (#8766) 2025-05-28 17:33:05 +00:00
dependabot[bot] 52a1e94335 chore(deps): bump the docusaurus group in /docs with 7 updates (#8758)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-28 21:24:54 +04:00
sp.wack 3e0532e8b9 fix(frontend): Only clear UI messages on cid change (#8762) 2025-05-28 15:31:34 +00:00
tofarr 90c440d709 Add HTTP FileStore implementation (#8751)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-28 08:17:26 -06:00
Robert Brennan 82657b7ba1 Add username parameter to AsyncBashSession (#8746)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-28 10:16:45 -04:00
Engel Nyst 3c51600260 Add vscode rules/ignores to .gitignore (#8755) 2025-05-28 15:42:11 +02:00
sp.wack b5f2a04ea2 Add refill link to out-of-credits error message (#8737)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-28 17:23:14 +04:00
sp.wack 155615bbb1 hotfix(frontend): Invalidate and refetch git changes if messages aren't being received (#8752) 2025-05-28 13:22:15 +00:00
Kent Johnson 4b6f2aeb4d docs: Mention dev container in Development.md (#8726) 2025-05-27 18:29:05 -04:00
Rohit Malhotra 0023eb0982 (Hotfix): Handle cases where user secrets store doesn't exist (#8745)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-27 18:26:36 -04:00
Robert Brennan c3ab4b480b Fix TypeError in list_files endpoint while preserving router_error_log functionality (#8744)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-27 18:25:07 -04:00
Xingyao Wang 35f7efb9d7 Fix: Remove strip() from parameter value extraction to preserve indentation (#8739)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-27 20:24:00 +00:00
Xuhui Zhou 14498c5e25 Feature/swe run interact (#8714)
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-05-27 19:35:21 +00:00
sp.wack cdb9aeb9ba fix(frontend): Don't show terminal commands in chat interface that are from the user (#8729) 2025-05-27 18:59:32 +00:00
Robert Brennan 318883e5e0 Fix VS Code tab and other runtime-dependent features showing null (#8734)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-27 18:41:31 +00:00
Rohit Malhotra 767b6ce600 [Refactor]: separate args setup logic for restarting conversations (#8679)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-05-27 13:16:33 -04:00
Xingyao Wang 3ccc96d794 Fix(docs): volumes configuration under [sandbox] in config.toml (#8724)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-28 00:30:07 +08:00
Yunfeng Yu 6f1effba5b Fix Feedback Submission Retry (#8693)
Co-authored-by: Test User <test@example.com>
Co-authored-by: Auroral <1596588744@163.com>
2025-05-27 14:48:30 +00:00
dependabot[bot] bc223885a0 chore(deps): bump the version-all group across 1 directory with 9 updates (#8709)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
2025-05-27 14:33:27 +00:00
sp.wack 0dcd5e9d30 hotfix(frontend): Clear error message on WS connect (#8725) 2025-05-27 10:12:56 -04:00
Engel Nyst 8ee85a45a2 Reduce more logs (#8712) 2025-05-27 16:05:04 +02:00
Marco Dalalba 342563d113 fix: url repo encode (#8713) 2025-05-27 17:39:13 +04:00
KianoshArian af037b3a8a fix(frontend): fix mobile view of SettingsModal (#8711) 2025-05-27 17:38:31 +04:00
sp.wack 33b714e0a0 fix(frontend): Consider agent state errors (#8672) 2025-05-27 09:30:53 -04:00
Kent Johnson 35d2281717 feat: Add dev container (#8589) 2025-05-26 21:35:27 -04:00
dependabot[bot] 83bfbc7045 chore(deps): bump the version-all group across 1 directory with 16 updates (#8710)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-26 23:35:15 +02:00
CoreJa 11e6d40c7a bug: fix fn_call error during API response (#8695)
Co-authored-by: Engel Nyst <engel.nyst@gmail.com>
2025-05-26 14:10:10 +02:00
mamoodi 41d84ee8cd Update the versions to align with already released 0.39.2 (#8673) 2025-05-25 12:09:19 -04:00
CoreJa 0c2924453f bug: fix cache_control missing during convertion (#8692)
Co-authored-by: Engel Nyst <engel.nyst@gmail.com>
2025-05-25 15:35:34 +02:00
Graham Neubig 77cd05c33b Fix setup.sh error logging (#8678) 2025-05-24 17:23:26 -04:00
sp.wack ff22712686 fix(frontend): Use uppercase event type for generic events without translation keys (#8671)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-24 18:20:08 +00:00
sp.wack edc43ca60d fix(frontend): Fix actionHasObservationPair function to correctly identify pairs (#8661)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
2025-05-24 09:39:37 +00:00
sp.wack b838ea0427 hotfix(frontend): Prevent too many re-renders (#8670) 2025-05-24 09:38:51 +00:00
tofarr 9a5e5956fc Added ability to read specify permitted origins in env (#8675)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-23 19:18:20 -06:00
Robert Brennan 35426a04d8 fix warning for workspace_base (#8667) 2025-05-23 15:11:53 -04:00
Rohit Malhotra 598d19cd5d [Feat]: slack conversation instruction template (#8648) 2025-05-23 14:39:53 -04:00
Rohit Malhotra dd3b3d1253 [Fix]: conversation ID attachment in create_new_conversation (#8669) 2025-05-23 14:37:10 -04:00
tofarr 693d912361 Fix conversation initial state (#8647) 2025-05-23 17:36:58 +00:00
Xingyao Wang 31ad7fc175 chore: add claude 4 to verified mode & global replace 3.7 to claude 4 (#8665)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-23 17:35:30 +00:00
Xingyao Wang 5e43dbadcb feat(frontend): Display MCP tool name and arguments as JSON in MCPObservation when visualized in frontend (#8644)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-23 17:21:22 +00:00
Ryan H. Tran b0b5a6c2a1 Expose partial MCP server addition failure logs (#8655) 2025-05-24 00:17:31 +07:00
chuckbutkus 92f8061558 Fix so redirect URL is in OAuth state (#8653) 2025-05-23 17:09:47 +00:00
mamoodi 2bb1b7b7aa Fix tip link (#8666) 2025-05-24 00:56:35 +08:00
Howie Zhou ca9fe7c5c8 docs: fix debug command (#8654) 2025-05-23 12:43:27 -04:00
Xingyao Wang a40443f5f4 feat(agent): First-class Search API support via MCP (#8638)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-24 00:07:48 +08:00
sp.wack 20983a2128 refactor(frontend): Simplify useConversation hook by removing context dependency (#8659)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-23 19:56:00 +04:00
Zhaoling Chen efe287ce34 integrate LocAgent into OpenHands (#7371)
Co-authored-by: czlll <gangda@huaihe.usc.edu>
Co-authored-by: Hoang Tran <descience.thh10@gmail.com>
2025-05-23 22:42:58 +07:00
sp.wack fa5b52298e fix(frontend): Fix action buttons display bugs in chat interface (#8660)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-23 15:35:41 +00:00
dependabot[bot] 57bfef3735 chore(deps): bump the version-all group in /frontend with 2 updates (#8635)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
2025-05-23 13:55:42 +00:00
Graham Neubig f3a127a17f Fix unlocalized elements in frontend (#8650)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-23 08:40:10 -04:00
Robert Brennan 8cc039997f Downgrade info to debug log (#8643) 2025-05-23 13:43:40 +02:00
Robert Brennan 50d4c79094 Add CLIRuntime implementation for local command execution (#8264)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
Co-authored-by: Engel Nyst <engel.nyst@gmail.com>
2025-05-23 03:03:22 +00:00
tofarr f7cdf4720f Fix gitlab header error in console (#8631) 2025-05-22 14:22:02 -06:00
mamoodi 6d3c2170b1 Release 0.39.1 (#8608)
Co-authored-by: tofarr <tofarr@gmail.com>
Co-authored-by: Rohit Malhotra <rohitvinodmalhotra@gmail.com>
2025-05-22 16:18:54 -04:00
Xingyao Wang 926b425e12 add claude 4 to prompt caching and fn call list; do not add icl for devstral (#8642) 2025-05-22 19:10:00 +00:00
Ryan H. Tran 3980ba53c9 Add option to run patch evaluation on Modal (#8607)
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-05-23 00:45:45 +07:00
Xingyao Wang be78cc07bd docs: add documentation for adding user settings and tooltips (#8634)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-22 17:38:54 +00:00
Graham Neubig 13f9acd48a Fix Cloud documentation structure and consolidate issue resolver information (#8558)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: mamoodi <mamoodiha@gmail.com>
2025-05-22 11:05:15 -04:00
Xingyao Wang 2906a9023f fix(frontend): MCP tool name rendering (#8623)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-22 21:46:40 +08:00
dependabot[bot] 66f33bfa96 chore(deps-dev): bump swagger-ui-dist from 5.21.0 to 5.22.0 in /docs in the version-all group (#8611)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-22 17:11:14 +04:00
kotauchisunsun cfa2725abd Split IssueResolver class into a separate file (#8619) 2025-05-22 09:53:55 +02:00
Rohit Malhotra 097f757c65 [Refactor]: Update resolver instructions (#8601)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-05-21 19:26:48 -04:00
Rohit Malhotra ac87ff8d27 [Fix]: Don't start conversations without user instructions for remote api key conversations (#8626) 2025-05-21 17:51:48 -04:00
tofarr a3d1a92353 Nested Conversation Support (#8588)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Robert Brennan <contact@rbren.io>
2025-05-21 15:17:30 -06:00
Xingyao Wang 70573dcbc0 fix(mcp): fix the config conflict between microagent MCP tools & MCP config (#8620)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-21 20:26:02 +00:00
Engel Nyst 637cb0726a specify condenser config for evals (#8177)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-21 22:08:57 +02:00
tofarr 2bd10de636 Revert "Fix for issue where initial env vars are not passed to runtime" (#8624) 2025-05-21 20:00:56 +00:00
dependabot[bot] 70322c8418 chore(deps): bump the version-all group across 1 directory with 8 updates (#8617)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
2025-05-21 19:34:59 +00:00
Rohit Malhotra 8b08958efe [Fix]: make mcp config optional in settings (#8622) 2025-05-21 19:17:43 +00:00
dependabot[bot] 5b021ad1bb chore(deps): bump the version-all group across 1 directory with 2 updates (#8618)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-21 16:39:07 +00:00
Rohit Malhotra 890796cc9d [Feat]: Git mcp server to open PRs (#8348)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Xingyao Wang <xingyao@all-hands.dev>
Co-authored-by: Robert Brennan <accounts@rbren.io>
2025-05-21 11:48:02 -04:00
sp.wack 7305c8fb31 hotfix(frontend): Prevent merging conversation events when switching between conversations (#8614) 2025-05-21 15:12:04 +00:00
Xingyao Wang f1897b8095 docs: add Devstral MLX link for local models documentation (#8615) 2025-05-21 15:04:50 +00:00
Engel Nyst c26ef180f2 Fix unsupported MCP tools param (#8610) 2025-05-21 14:41:01 +00:00
Robert Brennan 37e9933092 Revert "Fix passing environment" (#8612) 2025-05-21 14:32:47 +00:00
Xingyao Wang c353fb6e7e docs: update local llm documentation (#8609)
Co-authored-by: mamoodi <mamoodiha@gmail.com>
2025-05-21 14:05:21 +00:00
chuckbutkus 3280f450ac Update to login if session times out and return to previous conversation (#8587)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-20 22:10:28 +00:00
Graham Neubig 6335afb010 Fix environment variable casting for dict and list types (#8494)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-20 17:47:07 -04:00
mamoodi 40d9b0b13a Remove duplicated documentation from cognition (#8600) 2025-05-20 21:23:12 +00:00
Boxuan Li 005c5d6bde Document native windows support without WSL (#8567)
Co-authored-by: mamoodi <mamoodiha@gmail.com>
2025-05-20 20:54:32 +00:00
Rohit Malhotra 0deabd5935 [Feat]: add context msg to new conversation endpoint (#8586)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-05-20 20:47:15 +00:00
Erkin Alp Güney 6f5bb4341f Add a DeepWiki reference (#8350) 2025-05-20 16:20:56 -04:00
dependabot[bot] a5daf0e3c1 chore(deps): bump the version-all group with 6 updates (#8596)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-20 21:35:22 +02:00
tofarr 3873d9f002 Fix for issue where initial env vars are not passed to runtime (#8597) 2025-05-20 10:58:43 -06:00
Robert Brennan 5e1039e4b5 Make chat auto-scroll functionality more explicit (#8562)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-20 12:58:05 -04:00
mamoodi d648d249d8 Release 0.39.0 (#8539) 2025-05-20 11:39:55 -04:00
tofarr aa55da27fa Fix unlocalized strings in frontend components (#8585)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-19 19:12:26 +00:00
tofarr e69d6b3ef1 fix: add missing translation keys to declaration.ts (#8580)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-19 11:49:57 -06:00
tofarr be1ddaa57d Add conversationUrl static variable with getter and setter methods (#8531)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-19 11:28:07 -06:00
Robert Brennan 7b59e81048 make scrollbar prettier (#8581) 2025-05-19 17:23:47 +00:00
dependabot[bot] 470687f826 chore(deps): bump the mcp-packages group with 2 updates (#8546)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-19 18:37:11 +02:00
tofarr 38b4d93237 Add Session API Key Authentication for Runtime Communication (#8550) 2025-05-19 09:59:22 -06:00
dependabot[bot] 872b97a3c8 chore(deps): bump the version-all group across 1 directory with 20 updates (#8545)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: amanape <83104063+amanape@users.noreply.github.com>
2025-05-19 15:49:53 +00:00
sp.wack 14334040f1 chore(frontend): Refactor chat interface-related event handling (#8403) 2025-05-19 15:15:09 +00:00
sp.wack b244138ec5 fix(frontend): Prevent making too many calls to /git/changes on conversation load (#8579) 2025-05-19 18:57:18 +04:00
Xingyao Wang 4a3d2e6859 Fix #8551: Show images produced in Jupyter Notebook to LLM directly (#8552)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-19 14:14:00 +00:00
luolin101 1a3cb16ba6 add Visual SWE-bench benchmark (#7131)
Co-authored-by: tsukimi <yuailun@pku.edu.cn>
Co-authored-by: Ryan H. Tran <descience.thh10@gmail.com>
2025-05-19 12:08:46 +07:00
Xingyao Wang 2ecc39ffcc [eval]: disable MCP for SWE-Bench evaluation (#8574)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
Co-authored-by: Engel Nyst <engel.nyst@gmail.com>
2025-05-19 01:32:46 +00:00
Graham Neubig 0b26174d60 Add documentation microagent (#8563)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-18 16:34:15 -04:00
Calvin Smith b0005d4e09 Limit size of browser events (#8559)
Co-authored-by: Calvin Smith <calvin@all-hands.dev>
2025-05-18 11:35:09 -06:00
Graham Neubig 2dc7b37fe8 Fix flaky TestLocalFileStore tests (#8569)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-18 06:37:28 -04:00
Carlos Freund 27c18f5bdd build(makefile) Develop in OpenhandsCloud (#7440)
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Boxuan Li <liboxuan@connect.hku.hk>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
2025-05-17 14:40:46 +00:00
Graham Neubig 5077fea5c7 Fix: Run setup.sh script in GitHub resolver (#8548)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-05-17 09:52:34 -04:00
2035 changed files with 202201 additions and 77271 deletions
+19
View File
@@ -0,0 +1,19 @@
// For format details, see: https://aka.ms/devcontainer.json
{
"name": "Python 3",
// Documentation for this image:
// - https://github.com/devcontainers/templates/tree/main/src/python
// - https://github.com/microsoft/vscode-remote-try-python
// - https://hub.docker.com/r/microsoft/devcontainers-python
"image": "mcr.microsoft.com/devcontainers/python:1-3.12-bullseye",
"features": {
"ghcr.io/devcontainers/features/docker-outside-of-docker:1": {},
"ghcr.io/devcontainers-extra/features/poetry:2": {},
"ghcr.io/devcontainers/features/node:1": {},
},
"postCreateCommand": ".devcontainer/setup.sh",
"runArgs": ["--add-host=host.docker.internal:host-gateway"],
"containerEnv": {
"DOCKER_HOST_ADDR": "host.docker.internal"
},
}
+11
View File
@@ -0,0 +1,11 @@
#!/bin/bash
# Mark the current repository as safe for Git to prevent "dubious ownership" errors,
# which can occur in containerized environments when directory ownership doesn't match the current user.
git config --global --add safe.directory "$(realpath .)"
# Install `nc`
sudo apt update && sudo apt install netcat -y
# Do common setup tasks
source .openhands/setup.sh
+22 -4
View File
@@ -1,5 +1,23 @@
# NodeJS
frontend/node_modules
config.toml
.envrc
.env
.git
# Configuration (except pyproject.toml)
*.ini
*.toml
!pyproject.toml
*.yml
# Documentation (except README.md)
*.md
!README.md
# Hidden files and directories
.*
__pycache__
# Unneded files and directories
/dev_config/
/docs/
/evaluation/
/tests/
CITATION.cff
+5
View File
@@ -0,0 +1,5 @@
[*]
# force *nix line endings so files don't look modified in container run from Windows clone
end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true
+6
View File
@@ -1 +1,7 @@
*.ipynb linguist-vendored
# force *nix line endings so files don't look modified in container run from Windows clone
* text eol=lf
# Git incorrectly thinks some media is text
*.png -text
*.mp4 -text
+3 -2
View File
@@ -2,10 +2,11 @@
# See https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
# Frontend code owners
/frontend/ @rbren @amanape
/frontend/ @amanape
/openhands-ui/ @amanape
# Evaluation code owners
/evaluation/ @xingyaoww @neubig
/evaluation/ @xingyaoww @neubig
# Documentation code owners
/docs/ @mamoodi
+8
View File
@@ -33,6 +33,7 @@ body:
- Docker command in README
- GitHub resolver
- Development workflow
- CLI
- app.all-hands.dev
- Other
default: 0
@@ -44,6 +45,13 @@ body:
description: What version of OpenHands are you using?
placeholder: ex. 0.9.8, main, etc.
- type: input
id: model-name
attributes:
label: Model Name
description: What model are you using?
placeholder: ex. gpt-4o, claude-3-5-sonnet, openrouter/deepseek-r1, etc.
- type: dropdown
id: os
attributes:
+6 -1
View File
@@ -16,7 +16,6 @@ updates:
mcp-packages:
patterns:
- "mcp"
- "mcpm"
security-all:
applies-to: "security-updates"
patterns:
@@ -73,3 +72,9 @@ updates:
directory: "/"
schedule:
interval: "weekly"
- package-ecosystem: "docker"
directories:
- "containers/*"
schedule:
interval: "weekly"
+71
View File
@@ -0,0 +1,71 @@
#!/bin/bash
set -euxo pipefail
# This script updates the PR description with commands to run the PR locally
# It adds both Docker and uvx commands
# Get the branch name for the PR
BRANCH_NAME=$(gh pr view "$PR_NUMBER" --json headRefName --jq .headRefName)
# Define the Docker command
DOCKER_RUN_COMMAND="docker run -it --rm \
-p 3000:3000 \
-v /var/run/docker.sock:/var/run/docker.sock \
--add-host host.docker.internal:host-gateway \
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:${SHORT_SHA}-nikolaik \
--name openhands-app-${SHORT_SHA} \
docker.all-hands.dev/all-hands-ai/openhands:${SHORT_SHA}"
# Define the uvx command
UVX_RUN_COMMAND="uvx --python 3.12 --from git+https://github.com/All-Hands-AI/OpenHands@${BRANCH_NAME} openhands"
# Get the current PR body
PR_BODY=$(gh pr view "$PR_NUMBER" --json body --jq .body)
# Prepare the new PR body with both commands
if echo "$PR_BODY" | grep -q "To run this PR locally, use the following command:"; then
# For existing PR descriptions, use a more robust approach
# Split the PR body at the "To run this PR locally" section and replace everything after it
BEFORE_SECTION=$(echo "$PR_BODY" | sed '/To run this PR locally, use the following command:/,$d')
NEW_PR_BODY=$(cat <<EOF
${BEFORE_SECTION}
To run this PR locally, use the following command:
GUI with Docker:
\`\`\`
${DOCKER_RUN_COMMAND}
\`\`\`
CLI with uvx:
\`\`\`
${UVX_RUN_COMMAND}
\`\`\`
EOF
)
else
# For new PR descriptions: use heredoc safely without indentation
NEW_PR_BODY=$(cat <<EOF
$PR_BODY
---
To run this PR locally, use the following command:
GUI with Docker:
\`\`\`
${DOCKER_RUN_COMMAND}
\`\`\`
CLI with uvx:
\`\`\`
${UVX_RUN_COMMAND}
\`\`\`
EOF
)
fi
# Update the PR description
echo "Updating PR description with Docker and uvx commands"
gh pr edit "$PR_NUMBER" --body "$NEW_PR_BODY"
+123
View File
@@ -0,0 +1,123 @@
# OpenHands GitHub Actions Workflow Templates
This directory contains workflow templates that make it easy to integrate OpenHands AI agent into your GitHub CI/CD workflows.
## Available Templates
### 1. OpenHands Code Review (`openhands-code-review.yml`)
Automatically reviews pull requests for code quality, security, and best practices.
**Triggers:** Pull request opened or updated
**Permissions:** `contents: read`, `pull-requests: write`, `issues: write`
### 2. OpenHands Bug Fix (`openhands-bug-fix.yml`)
Automatically investigates and fixes bugs when issues are labeled with 'bug'.
**Triggers:** Issue labeled with 'bug'
**Permissions:** `contents: write`, `pull-requests: write`, `issues: write`
### 3. OpenHands Documentation (`openhands-documentation.yml`)
Keeps project documentation up-to-date by reviewing code changes and updating docs.
**Triggers:** Weekly schedule, manual dispatch, or code changes
**Permissions:** `contents: write`, `pull-requests: write`
### 4. OpenHands Custom Task (`openhands-custom-task.yml`)
Run any custom development task with a manual trigger and custom description.
**Triggers:** Manual dispatch with task description input
**Permissions:** `contents: write`, `pull-requests: write`, `issues: write`
## Setup Instructions
### Prerequisites
1. **OpenHands API Key**: Get your API key from [OpenHands](https://app.all-hands.dev)
2. **GitHub Repository**: The templates work with any GitHub repository
### Installation
1. **Add API Key Secret**:
- Go to your repository's Settings → Secrets and variables → Actions
- Add a new repository secret named `OPENHANDS_API_KEY`
- Set the value to your OpenHands API key
2. **Use Templates**:
- Go to your repository's Actions tab
- Click "New workflow"
- Look for "OpenHands" templates in the template gallery
- Choose the template that fits your needs
- Customize as needed and commit
### Customization
All templates can be customized:
- **Prompts**: Modify the task descriptions to fit your specific needs
- **Triggers**: Change when workflows run (schedule, events, manual)
- **Timeouts**: Adjust polling timeouts based on task complexity
- **Permissions**: Modify based on what actions OpenHands needs to perform
### Example Customizations
#### Custom Review Criteria
```yaml
prompt = '''Please review this pull request focusing on:
- Performance optimization opportunities
- Database query efficiency
- API design consistency
- Error handling completeness
'''
```
#### Specific Documentation Updates
```yaml
prompt = '''Update the following documentation:
1. API reference in docs/api.md
2. Installation guide in README.md
3. Code examples in docs/examples/
'''
```
## How It Works
1. **Workflow Trigger**: GitHub event triggers the workflow
2. **Setup**: Installs Python and downloads the OpenHands API helper
3. **API Call**: Creates a conversation with OpenHands using your prompt
4. **Execution**: OpenHands performs the requested task in your repository
5. **Results**: OpenHands may create PRs, comments, or other outputs
## Security Considerations
- **API Key**: Keep your `OPENHANDS_API_KEY` secret secure
- **Permissions**: Templates request minimal required permissions
- **Repository Access**: OpenHands will have access to your repository during task execution
- **Review Changes**: Always review any PRs or changes made by OpenHands
## Troubleshooting
### Common Issues
1. **Missing API Key**: Ensure `OPENHANDS_API_KEY` is set in repository secrets
2. **Permission Errors**: Check that workflow permissions match template requirements
3. **Timeout Issues**: Increase timeout values for complex tasks
4. **Rate Limits**: OpenHands API has rate limits; space out workflow runs if needed
### Getting Help
- Check the [OpenHands Documentation](https://docs.all-hands.dev)
- Review workflow run logs for detailed error messages
- Ensure your repository is accessible and has the necessary permissions
## Contributing
To improve these templates:
1. Test changes thoroughly
2. Update documentation
3. Follow GitHub Actions best practices
4. Consider security implications
## License
These templates are provided under the same license as the OpenHands project.
@@ -0,0 +1,23 @@
{
"name": "OpenHands Bug Fix",
"description": "Automatically investigate and fix bugs using OpenHands AI agent. Triggered when issues are labeled with 'bug'.",
"iconName": "octicon bug",
"categories": [
"Bug Fix",
"AI",
"Automation",
"Debugging"
],
"filePatterns": [
".*\\.py$",
".*\\.js$",
".*\\.ts$",
".*\\.jsx$",
".*\\.tsx$",
".*\\.java$",
".*\\.go$",
".*\\.rs$",
".*\\.cpp$",
".*\\.c$"
]
}
@@ -0,0 +1,76 @@
name: OpenHands Bug Fix
on:
issues:
types: [labeled]
jobs:
openhands-fix:
if: contains(github.event.label.name, 'bug')
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
issues: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install OpenHands API helper
run: |
curl -O https://raw.githubusercontent.com/All-Hands-AI/OpenHands/main/scripts/openhands_api.py
python -m pip install --upgrade pip
pip install requests
- name: Run OpenHands Bug Fix
env:
OPENHANDS_API_KEY: ${{ secrets.OPENHANDS_API_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
python -c "
import sys
sys.path.append('.')
from openhands_api import OpenHandsAPI
# Create bug fix prompt
prompt = '''Please investigate and fix the bug described in this GitHub issue:
Repository: ${{ github.repository }}
Issue: #${{ github.event.issue.number }}
Title: ${{ github.event.issue.title }}
Issue Description:
${{ github.event.issue.body }}
Please:
1. Analyze the issue and identify the root cause
2. Implement a fix with proper error handling
3. Add or update tests to prevent regression
4. Create a pull request with your changes
5. Include a clear description of what was fixed and how
Make sure to follow the project'\''s coding standards and best practices.
'''
# Start OpenHands conversation
client = OpenHandsAPI()
response = client.create_conversation(
initial_user_msg=prompt,
repository='${{ github.repository }}'
)
print(f'Started OpenHands bug fix: {response.get(\"conversation_id\", \"Unknown\")}')
# Poll for completion (optional - remove if you want fire-and-forget)
try:
final_response = client.poll_until_stopped(response['conversation_id'], timeout=1200)
print(f'Bug fix completed with status: {final_response.get(\"status\", \"Unknown\")}')
except Exception as e:
print(f'Bug fix may still be running: {e}')
"
@@ -0,0 +1,25 @@
{
"name": "OpenHands Code Review",
"description": "Automated code review using OpenHands AI agent. Reviews PRs for code quality, security, and best practices.",
"iconName": "octicon code-review",
"categories": [
"Code Quality",
"AI",
"Automation",
"Python",
"JavaScript",
"TypeScript"
],
"filePatterns": [
".*\\.py$",
".*\\.js$",
".*\\.ts$",
".*\\.jsx$",
".*\\.tsx$",
".*\\.java$",
".*\\.go$",
".*\\.rs$",
".*\\.cpp$",
".*\\.c$"
]
}
@@ -0,0 +1,71 @@
name: OpenHands Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
openhands-review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
issues: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install OpenHands API helper
run: |
curl -O https://raw.githubusercontent.com/All-Hands-AI/OpenHands/main/scripts/openhands_api.py
python -m pip install --upgrade pip
pip install requests
- name: Run OpenHands Code Review
env:
OPENHANDS_API_KEY: ${{ secrets.OPENHANDS_API_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
python -c "
import sys
sys.path.append('.')
from openhands_api import OpenHandsAPI
# Create review prompt
prompt = '''Please review this pull request for:
- Code quality and best practices
- Security vulnerabilities
- Performance considerations
- Documentation completeness
- Test coverage
Repository: ${{ github.repository }}
PR: #${{ github.event.number }}
Title: ${{ github.event.pull_request.title }}
Please provide constructive feedback and suggestions for improvement.
If you find any issues, please create a detailed comment explaining the problem and suggesting solutions.
'''
# Start OpenHands conversation
client = OpenHandsAPI()
response = client.create_conversation(
initial_user_msg=prompt,
repository='${{ github.repository }}'
)
print(f'Started OpenHands review: {response.get(\"conversation_id\", \"Unknown\")}')
# Poll for completion (optional - remove if you want fire-and-forget)
try:
final_response = client.poll_until_stopped(response['conversation_id'], timeout=600)
print(f'Review completed with status: {final_response.get(\"status\", \"Unknown\")}')
except Exception as e:
print(f'Review may still be running: {e}')
"
@@ -0,0 +1,14 @@
{
"name": "OpenHands Custom Task",
"description": "Run any custom development task using OpenHands AI agent. Manually triggered with custom task description.",
"iconName": "octicon tools",
"categories": [
"AI",
"Automation",
"Custom",
"Development"
],
"filePatterns": [
".*"
]
}
@@ -0,0 +1,78 @@
name: OpenHands Custom Task
on:
workflow_dispatch:
inputs:
task_description:
description: 'Describe the task you want OpenHands to perform'
required: true
type: string
timeout_minutes:
description: 'Timeout in minutes (default: 20)'
required: false
default: '20'
type: string
jobs:
openhands-task:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
issues: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install OpenHands API helper
run: |
curl -O https://raw.githubusercontent.com/All-Hands-AI/OpenHands/main/scripts/openhands_api.py
python -m pip install --upgrade pip
pip install requests
- name: Run OpenHands Custom Task
env:
OPENHANDS_API_KEY: ${{ secrets.OPENHANDS_API_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
python -c "
import sys
sys.path.append('.')
from openhands_api import OpenHandsAPI
# Create custom task prompt
prompt = '''${{ github.event.inputs.task_description }}
Repository: ${{ github.repository }}
Please complete this task following best practices:
- Write clean, well-documented code
- Add appropriate tests if needed
- Follow the project'\''s coding standards
- Create a pull request if changes are made
- Provide clear explanations of what was done
'''
# Start OpenHands conversation
client = OpenHandsAPI()
response = client.create_conversation(
initial_user_msg=prompt,
repository='${{ github.repository }}'
)
print(f'Started OpenHands custom task: {response.get(\"conversation_id\", \"Unknown\")}')
# Poll for completion
timeout_seconds = int('${{ github.event.inputs.timeout_minutes }}') * 60
try:
final_response = client.poll_until_stopped(response['conversation_id'], timeout=timeout_seconds)
print(f'Custom task completed with status: {final_response.get(\"status\", \"Unknown\")}')
except Exception as e:
print(f'Custom task may still be running or timed out: {e}')
"
@@ -0,0 +1,19 @@
{
"name": "OpenHands Documentation",
"description": "Automatically update and maintain project documentation using OpenHands AI agent. Runs weekly and on code changes.",
"iconName": "octicon book",
"categories": [
"Documentation",
"AI",
"Automation",
"Maintenance"
],
"filePatterns": [
"README.md$",
".*\\.md$",
"docs/.*",
".*\\.py$",
".*\\.js$",
".*\\.ts$"
]
}
@@ -0,0 +1,81 @@
name: OpenHands Documentation
on:
schedule:
- cron: '0 2 * * 1' # Weekly on Monday at 2 AM UTC
workflow_dispatch:
push:
branches: [ $default-branch ]
paths:
- 'src/**'
- 'lib/**'
- '*.py'
- '*.js'
- '*.ts'
jobs:
openhands-docs:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install OpenHands API helper
run: |
curl -O https://raw.githubusercontent.com/All-Hands-AI/OpenHands/main/scripts/openhands_api.py
python -m pip install --upgrade pip
pip install requests
- name: Generate Documentation with OpenHands
env:
OPENHANDS_API_KEY: ${{ secrets.OPENHANDS_API_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
python -c "
import sys
sys.path.append('.')
from openhands_api import OpenHandsAPI
# Create documentation prompt
prompt = '''Please review the current codebase and update the project documentation:
Repository: ${{ github.repository }}
Tasks:
1. Review the README.md and ensure it accurately reflects the current project state
2. Update API documentation if there are new endpoints or changes
3. Check that code examples in documentation are up-to-date
4. Add documentation for any new features or significant changes
5. Ensure installation and setup instructions are current
6. Update any outdated links or references
7. Add or improve code comments where needed
Please create a pull request with your documentation updates if changes are needed.
Focus on clarity, accuracy, and completeness.
'''
# Start OpenHands conversation
client = OpenHandsAPI()
response = client.create_conversation(
initial_user_msg=prompt,
repository='${{ github.repository }}'
)
print(f'Started OpenHands documentation update: {response.get(\"conversation_id\", \"Unknown\")}')
# Poll for completion (optional - remove if you want fire-and-forget)
try:
final_response = client.poll_until_stopped(response['conversation_id'], timeout=900)
print(f'Documentation update completed with status: {final_response.get(\"status\", \"Unknown\")}')
except Exception as e:
print(f'Documentation update may still be running: {e}')
"
-72
View File
@@ -1,72 +0,0 @@
# Workflow that builds and deploys the documentation website
name: Deploy Docs to GitHub Pages
# * Always run on "main"
# * Run on PRs that target the "main" branch and have changes in the "docs" folder or this workflow
on:
push:
branches:
- main
pull_request:
paths:
- 'docs/**'
- '.github/workflows/deploy-docs.yml'
branches:
- main
# If triggered by a PR, it will be in the same group. However, each commit on main will be in its own unique group
concurrency:
group: ${{ github.workflow }}-${{ (github.head_ref && github.ref) || github.run_id }}
cancel-in-progress: true
jobs:
# Build the documentation website
build:
if: github.repository == 'All-Hands-AI/OpenHands'
name: Build Docusaurus
runs-on: blacksmith-4vcpu-ubuntu-2204
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: useblacksmith/setup-node@v5
with:
node-version: 18
cache: npm
cache-dependency-path: docs/package-lock.json
- name: Set up Python
uses: useblacksmith/setup-python@v6
with:
python-version: '3.12'
- name: Install dependencies
run: cd docs && npm ci
- name: Build website
run: cd docs && npm run build
- name: Upload Build Artifact
if: github.ref == 'refs/heads/main'
uses: actions/upload-pages-artifact@v3
with:
path: docs/build
# Deploy the documentation website
deploy:
if: github.ref == 'refs/heads/main' && github.repository == 'All-Hands-AI/OpenHands'
name: Deploy to GitHub Pages
runs-on: blacksmith-4vcpu-ubuntu-2204
# This job only runs on "main" so only run one of these jobs at a time
# otherwise it will fail if one is already running
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
needs: build
# Grant GITHUB_TOKEN the permissions required to make a Pages deployment
permissions:
pages: write # to deploy to Pages
id-token: write # to verify the deployment originates from an appropriate source
# Deploy to the github-pages environment
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
+228
View File
@@ -0,0 +1,228 @@
name: End-to-End Tests
on:
pull_request:
types: [opened, synchronize, reopened, labeled]
branches:
- main
- develop
workflow_dispatch:
jobs:
e2e-tests:
if: contains(github.event.pull_request.labels.*.name, 'end-to-end') || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
timeout-minutes: 60
env:
GITHUB_REPO_NAME: ${{ github.repository }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install poetry via pipx
uses: abatilo/actions-poetry@v4
with:
poetry-version: 2.1.3
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'poetry'
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libgtk-3-0 libnotify4 libnss3 libxss1 libxtst6 xauth xvfb libgbm1 libasound2t64 netcat-openbsd
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
cache-dependency-path: 'frontend/package-lock.json'
- name: Setup environment for end-to-end tests
run: |
# Create test results directory
mkdir -p test-results
# Create downloads directory for OpenHands (use a directory in the home folder)
mkdir -p $HOME/downloads
sudo chown -R $USER:$USER $HOME/downloads
sudo chmod -R 755 $HOME/downloads
- name: Build OpenHands
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
LLM_MODEL: ${{ secrets.LLM_MODEL || 'gpt-4o' }}
LLM_API_KEY: ${{ secrets.LLM_API_KEY || 'test-key' }}
LLM_BASE_URL: ${{ secrets.LLM_BASE_URL }}
INSTALL_DOCKER: 1
RUNTIME: docker
FRONTEND_PORT: 12000
FRONTEND_HOST: 0.0.0.0
BACKEND_HOST: 0.0.0.0
BACKEND_PORT: 3000
ENABLE_BROWSER: true
INSTALL_PLAYWRIGHT: 1
run: |
# Fix poetry.lock file if needed
echo "Fixing poetry.lock file if needed..."
poetry lock
# Build OpenHands using make build
echo "Running make build..."
make build
# Install Chromium Headless Shell for Playwright (needed for pytest-playwright)
echo "Installing Chromium Headless Shell for Playwright..."
poetry run playwright install chromium-headless-shell
# Verify Playwright browsers are installed (for e2e tests only)
echo "Verifying Playwright browsers installation for e2e tests..."
BROWSER_CHECK=$(poetry run python tests/e2e/check_playwright.py 2>/dev/null)
if [ "$BROWSER_CHECK" != "chromium_found" ]; then
echo "ERROR: Chromium browser not found or not working for e2e tests"
echo "$BROWSER_CHECK"
exit 1
else
echo "Playwright browsers are properly installed for e2e tests."
fi
# Docker runtime will handle workspace directory creation
# Start the application using make run with custom parameters and reduced logging
echo "Starting OpenHands using make run..."
# Set environment variables to reduce logging verbosity
export PYTHONUNBUFFERED=1
export LOG_LEVEL=WARNING
export UVICORN_LOG_LEVEL=warning
export OPENHANDS_LOG_LEVEL=WARNING
FRONTEND_PORT=12000 FRONTEND_HOST=0.0.0.0 BACKEND_HOST=0.0.0.0 make run > /tmp/openhands-e2e-test.log 2>&1 &
# Store the PID of the make run process
MAKE_PID=$!
echo "OpenHands started with PID: $MAKE_PID"
# Wait for the application to start
echo "Waiting for OpenHands to start..."
max_attempts=15
attempt=1
while [ $attempt -le $max_attempts ]; do
echo "Checking if OpenHands is running (attempt $attempt of $max_attempts)..."
# Check if the process is still running
if ! ps -p $MAKE_PID > /dev/null; then
echo "ERROR: OpenHands process has terminated unexpectedly"
echo "Last 50 lines of the log:"
tail -n 50 /tmp/openhands-e2e-test.log
exit 1
fi
# Check if frontend port is open
if nc -z localhost 12000; then
# Verify we can get HTML content
if curl -s http://localhost:12000 | grep -q "<html"; then
echo "SUCCESS: OpenHands is running and serving HTML content on port 12000"
break
else
echo "Port 12000 is open but not serving HTML content yet"
fi
else
echo "Frontend port 12000 is not open yet"
fi
# Show log output on each attempt
echo "Recent log output:"
tail -n 20 /tmp/openhands-e2e-test.log
# Wait before next attempt
echo "Waiting 10 seconds before next check..."
sleep 10
attempt=$((attempt + 1))
# Exit if we've reached the maximum number of attempts
if [ $attempt -gt $max_attempts ]; then
echo "ERROR: OpenHands failed to start after $max_attempts attempts"
echo "Last 50 lines of the log:"
tail -n 50 /tmp/openhands-e2e-test.log
exit 1
fi
done
# Final verification that the app is running
if ! nc -z localhost 12000 || ! curl -s http://localhost:12000 | grep -q "<html"; then
echo "ERROR: OpenHands is not running properly on port 12000"
echo "Last 50 lines of the log:"
tail -n 50 /tmp/openhands-e2e-test.log
exit 1
fi
# Print success message
echo "OpenHands is running successfully on port 12000"
- name: Run end-to-end tests
env:
GITHUB_TOKEN: ${{ secrets.E2E_TEST_GITHUB_TOKEN }}
LLM_MODEL: ${{ secrets.LLM_MODEL || 'gpt-4o' }}
LLM_API_KEY: ${{ secrets.LLM_API_KEY || 'test-key' }}
LLM_BASE_URL: ${{ secrets.LLM_BASE_URL }}
run: |
# Check if the application is running
if ! nc -z localhost 12000; then
echo "ERROR: OpenHands is not running on port 12000"
echo "Last 50 lines of the log:"
tail -n 50 /tmp/openhands-e2e-test.log
exit 1
fi
# Run the tests with detailed output
cd tests/e2e
poetry run python -m pytest \
test_settings.py::test_github_token_configuration \
test_conversation.py::test_conversation_start \
test_browsing_catchphrase.py::test_browsing_catchphrase \
test_multi_conversation_resume.py::test_multi_conversation_resume \
-v --no-header --capture=no --timeout=900
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: playwright-report
path: tests/e2e/test-results/
retention-days: 30
- name: Upload OpenHands logs
if: always()
uses: actions/upload-artifact@v4
with:
name: openhands-logs
path: |
/tmp/openhands-e2e-test.log
/tmp/openhands-e2e-build.log
/tmp/openhands-backend.log
/tmp/openhands-frontend.log
/tmp/backend-health-check.log
/tmp/frontend-check.log
/tmp/vite-config.log
/tmp/makefile-contents.log
retention-days: 30
- name: Cleanup
if: always()
run: |
# Stop OpenHands processes
echo "Stopping OpenHands processes..."
pkill -f "python -m openhands.server" || true
pkill -f "npm run dev" || true
pkill -f "make run" || true
# Print process status for debugging
echo "Checking if any OpenHands processes are still running:"
ps aux | grep -E "openhands|npm run dev" || true
+4 -4
View File
@@ -9,8 +9,8 @@ on:
- main
pull_request:
paths:
- 'frontend/**'
- '.github/workflows/fe-unit-tests.yml'
- "frontend/**"
- ".github/workflows/fe-unit-tests.yml"
# If triggered by a PR, it will be in the same group. However, each commit on main will be in its own unique group
concurrency:
@@ -24,7 +24,7 @@ jobs:
runs-on: blacksmith-4vcpu-ubuntu-2204
strategy:
matrix:
node-version: [20, 22]
node-version: [22]
fail-fast: true
steps:
- name: Checkout
@@ -38,7 +38,7 @@ jobs:
run: npm ci
- name: Run TypeScript compilation
working-directory: ./frontend
run: npm run make-i18n && tsc
run: npm run build
- name: Run tests and collect coverage
working-directory: ./frontend
run: npm run test:coverage
+110 -141
View File
@@ -10,14 +10,14 @@ on:
branches:
- main
tags:
- '*'
- "*"
pull_request:
workflow_dispatch:
inputs:
reason:
description: 'Reason for manual trigger'
description: "Reason for manual trigger"
required: true
default: ''
default: ""
# If triggered by a PR, it will be in the same group. However, each commit on main will be in its own unique group
concurrency:
@@ -42,7 +42,6 @@ jobs:
json=$(jq -n -c '[
{ image: "nikolaik/python-nodejs:python3.12-nodejs22", tag: "nikolaik" },
{ image: "ubuntu:24.04", tag: "ubuntu" }
]')
else
json=$(jq -n -c '[
@@ -56,12 +55,10 @@ jobs:
ghcr_build_app:
name: Build App Image
runs-on: blacksmith-4vcpu-ubuntu-2204
if: "!(github.event_name == 'push' && startsWith(github.ref, 'refs/tags/ext-v'))"
permissions:
contents: read
packages: write
outputs:
# Since this job uses outputs it cannot use matrix
hash_from_app_image: ${{ steps.get_hash_in_app_image.outputs.hash_from_app_image }}
steps:
- name: Checkout
uses: actions/checkout@v4
@@ -87,24 +84,12 @@ jobs:
if: "!github.event.pull_request.head.repo.fork"
run: |
./containers/build.sh -i openhands -o ${{ env.REPO_OWNER }} --push
- name: Build app image
if: "github.event.pull_request.head.repo.fork"
run: |
./containers/build.sh -i openhands -o ${{ env.REPO_OWNER }} --load
- name: Get hash in App Image
id: get_hash_in_app_image
run: |
# Run the build script in the app image
docker run -e SANDBOX_USER_ID=0 -v /var/run/docker.sock:/var/run/docker.sock ghcr.io/${{ env.REPO_OWNER }}/openhands:${{ env.RELEVANT_SHA }} /bin/bash -c "mkdir -p containers/runtime; python3 openhands/runtime/utils/runtime_build.py --base_image ${{ env.BASE_IMAGE_FOR_HASH_EQUIVALENCE_TEST }} --build_folder containers/runtime --force_rebuild" 2>&1 | tee docker-outputs.txt
# Get the hash from the build script
hash_from_app_image=$(cat docker-outputs.txt | grep "Hash for docker build directory" | awk -F "): " '{print $2}' | uniq | head -n1)
echo "hash_from_app_image=$hash_from_app_image" >> $GITHUB_OUTPUT
echo "Hash from app image: $hash_from_app_image"
# Builds the runtime Docker images
ghcr_build_runtime:
name: Build Image
runs-on: blacksmith-4vcpu-ubuntu-2204
runs-on: blacksmith-8vcpu-ubuntu-2204
if: "!(github.event_name == 'push' && startsWith(github.ref, 'refs/tags/ext-v'))"
permissions:
contents: read
packages: write
@@ -130,22 +115,13 @@ jobs:
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
- name: Install poetry via pipx
run: pipx install poetry
- name: Set up Python
uses: useblacksmith/setup-python@v6
with:
python-version: '3.12'
- name: Cache Poetry dependencies
uses: useblacksmith/cache@v5
with:
path: |
~/.cache/pypoetry
~/.virtualenvs
key: ${{ runner.os }}-poetry-${{ hashFiles('**/poetry.lock') }}
# This is the one that saves the cache, the others set 'lookup-only: true'
restore-keys: |
${{ runner.os }}-poetry-
- name: Install poetry via pipx
run: pipx install poetry
python-version: "3.12"
cache: poetry
- name: Install Python dependencies using Poetry
run: make install-python-dependencies POETRY_GROUP=main INSTALL_PLAYWRIGHT=0
- name: Create source distribution and Dockerfile
@@ -190,60 +166,88 @@ jobs:
name: runtime-src-${{ matrix.base_image.tag }}
path: containers/runtime
verify_hash_equivalence_in_runtime_and_app:
name: Verify Hash Equivalence in Runtime and Docker images
runs-on: blacksmith-4vcpu-ubuntu-2204
needs: [ghcr_build_runtime, ghcr_build_app]
strategy:
fail-fast: false
matrix:
base_image: ['nikolaik']
env:
BASE_IMAGE_FOR_HASH_EQUIVALENCE_TEST: nikolaik/python-nodejs:python3.12-nodejs22
ghcr_build_enterprise:
name: Push Enterprise Image
runs-on: blacksmith-8vcpu-ubuntu-2204
permissions:
contents: read
packages: write
needs: [define-matrix, ghcr_build_app]
# Do not build enterprise in forks
if: github.event.pull_request.head.repo.fork != true
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Cache Poetry dependencies
uses: useblacksmith/cache@v5
with:
path: |
~/.cache/pypoetry
~/.virtualenvs
key: ${{ runner.os }}-poetry-${{ hashFiles('**/poetry.lock') }}
lookup-only: true
restore-keys: |
${{ runner.os }}-poetry-
- name: Set up Python
uses: useblacksmith/setup-python@v6
with:
python-version: '3.12'
- name: Install poetry via pipx
run: pipx install poetry
- name: Install Python dependencies using Poetry
run: make install-python-dependencies POETRY_GROUP=main INSTALL_PLAYWRIGHT=0
- name: Get hash in App Image
run: |
echo "Hash from app image: ${{ needs.ghcr_build_app.outputs.hash_from_app_image }}"
echo "hash_from_app_image=${{ needs.ghcr_build_app.outputs.hash_from_app_image }}" >> $GITHUB_ENV
- name: Checkout repository
uses: actions/checkout@v4
- name: Get hash using code (development mode)
run: |
mkdir -p containers/runtime
poetry run python3 openhands/runtime/utils/runtime_build.py --base_image ${{ env.BASE_IMAGE_FOR_HASH_EQUIVALENCE_TEST }} --build_folder containers/runtime --force_rebuild > output.txt 2>&1
hash_from_code=$(cat output.txt | grep "Hash for docker build directory" | awk -F "): " '{print $2}' | uniq | head -n1)
echo "hash_from_code=$hash_from_code" >> $GITHUB_ENV
# Set up Docker Buildx for better performance
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
with:
driver-opts: network=host
- name: Compare hashes
- name: Login to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/all-hands-ai/enterprise-server
tags: |
type=ref,event=branch
type=ref,event=pr
type=sha
type=sha,format=long
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
flavor: |
latest=auto
prefix=
suffix=
- name: Determine app image tag
shell: bash
run: |
echo "Hash from App Image: ${{ env.hash_from_app_image }}"
echo "Hash from Code: ${{ env.hash_from_code }}"
if [ "${{ env.hash_from_app_image }}" = "${{ env.hash_from_code }}" ]; then
echo "Hashes match!"
else
echo "Hashes do not match!"
exit 1
fi
# Duplicated with build.sh
sanitized_ref_name=$(echo "$GITHUB_REF_NAME" | sed 's/[^a-zA-Z0-9.-]\+/-/g')
OPENHANDS_BUILD_VERSION=$sanitized_ref_name
sanitized_ref_name=$(echo "$sanitized_ref_name" | tr '[:upper:]' '[:lower:]') # lower case is required in tagging
echo "OPENHANDS_DOCKER_TAG=${sanitized_ref_name}" >> $GITHUB_ENV
- name: Build and push Docker image
uses: useblacksmith/build-push-action@v1
with:
context: .
file: enterprise/Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
OPENHANDS_VERSION=${{ env.OPENHANDS_DOCKER_TAG }}
platforms: linux/amd64
# Add build provenance
provenance: true
# Add build attestations for better security
sbom: true
enterprise-preview:
name: Enterprise preview
if: |
(github.event_name == 'pull_request' && github.event.action == 'labeled' && github.event.label.name == 'deploy') ||
(github.event_name == 'pull_request' && github.event.action != 'labeled' && contains(github.event.pull_request.labels.*.name, 'deploy'))
runs-on: blacksmith-4vcpu-ubuntu-2204
needs: [ghcr_build_enterprise]
steps:
- name: Trigger remote job
run: |
curl --fail-with-body -sS -X POST \
-H "Authorization: Bearer ${{ secrets.PAT_TOKEN }}" \
-H "Accept: application/vnd.github+json" \
-d "{\"ref\": \"main\", \"inputs\": {\"openhandsPrNumber\": \"${{ github.event.pull_request.number }}\", \"deployEnvironment\": \"feature\", \"enterpriseImageTag\": \"pr-${{ github.event.pull_request.number }}\" }}" \
https://api.github.com/repos/All-Hands-AI/deploy/actions/workflows/deploy.yaml/dispatches
# Run unit tests with the Docker runtime Docker images as root
test_runtime_root:
@@ -276,25 +280,17 @@ jobs:
load: true
tags: ghcr.io/${{ env.REPO_OWNER }}/runtime:${{ env.RELEVANT_SHA }}-${{ matrix.base_image.tag }}
context: containers/runtime
- name: Cache Poetry dependencies
uses: useblacksmith/cache@v5
with:
path: |
~/.cache/pypoetry
~/.virtualenvs
key: ${{ runner.os }}-poetry-${{ hashFiles('**/poetry.lock') }}
lookup-only: true
restore-keys: |
${{ runner.os }}-poetry-
- name: Install poetry via pipx
run: pipx install poetry
- name: Set up Python
uses: useblacksmith/setup-python@v6
with:
python-version: '3.12'
- name: Install poetry via pipx
run: pipx install poetry
python-version: "3.12"
cache: poetry
- name: Install Python dependencies using Poetry
run: make install-python-dependencies POETRY_GROUP=main,test,runtime INSTALL_PLAYWRIGHT=0
run: make install-python-dependencies INSTALL_PLAYWRIGHT=0
- name: Run docker runtime tests
shell: bash
run: |
# We install pytest-xdist in order to run tests across CPUs
poetry run pip install pytest-xdist
@@ -312,7 +308,9 @@ jobs:
SANDBOX_RUNTIME_CONTAINER_IMAGE=$image_name \
TEST_IN_CI=true \
RUN_AS_OPENHANDS=false \
poetry run pytest -n 7 -raRs --reruns 2 --reruns-delay 5 -s ./tests/runtime --ignore=tests/runtime/test_browsergym_envs.py --durations=10
poetry run pytest -n 0 -raRs --reruns 2 --reruns-delay 5 -s ./tests/runtime --ignore=tests/runtime/test_browsergym_envs.py --durations=10
env:
DEBUG: "1"
# Run unit tests with the Docker runtime Docker images as openhands user
test_runtime_oh:
@@ -344,25 +342,17 @@ jobs:
load: true
tags: ghcr.io/${{ env.REPO_OWNER }}/runtime:${{ env.RELEVANT_SHA }}-${{ matrix.base_image.tag }}
context: containers/runtime
- name: Cache Poetry dependencies
uses: useblacksmith/cache@v5
with:
path: |
~/.cache/pypoetry
~/.virtualenvs
key: ${{ runner.os }}-poetry-${{ hashFiles('**/poetry.lock') }}
lookup-only: true
restore-keys: |
${{ runner.os }}-poetry-
- name: Install poetry via pipx
run: pipx install poetry
- name: Set up Python
uses: useblacksmith/setup-python@v6
with:
python-version: '3.12'
- name: Install poetry via pipx
run: pipx install poetry
python-version: "3.12"
cache: poetry
- name: Install Python dependencies using Poetry
run: make install-python-dependencies POETRY_GROUP=main,test,runtime INSTALL_PLAYWRIGHT=0
- name: Run runtime tests
shell: bash
run: |
# We install pytest-xdist in order to run tests across CPUs
poetry run pip install pytest-xdist
@@ -377,7 +367,9 @@ jobs:
SANDBOX_RUNTIME_CONTAINER_IMAGE=$image_name \
TEST_IN_CI=true \
RUN_AS_OPENHANDS=true \
poetry run pytest -n 7 -raRs --reruns 2 --reruns-delay 5 -s ./tests/runtime --ignore=tests/runtime/test_browsergym_envs.py --durations=10
poetry run pytest -n 0 -raRs --reruns 2 --reruns-delay 5 -s ./tests/runtime --ignore=tests/runtime/test_browsergym_envs.py --durations=10
env:
DEBUG: "1"
# The two following jobs (named identically) are to check whether all the runtime tests have passed as the
# "All Runtime Tests Passed" is a required job for PRs to merge
@@ -387,7 +379,7 @@ jobs:
name: All Runtime Tests Passed
if: ${{ !cancelled() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') }}
runs-on: blacksmith-4vcpu-ubuntu-2204
needs: [test_runtime_root, test_runtime_oh, verify_hash_equivalence_in_runtime_and_app]
needs: [test_runtime_root, test_runtime_oh]
steps:
- name: All tests passed
run: echo "All runtime tests have passed successfully!"
@@ -396,7 +388,7 @@ jobs:
name: All Runtime Tests Passed
if: ${{ cancelled() || contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }}
runs-on: blacksmith-4vcpu-ubuntu-2204
needs: [test_runtime_root, test_runtime_oh, verify_hash_equivalence_in_runtime_and_app]
needs: [test_runtime_root, test_runtime_oh]
steps:
- name: Some tests failed
run: |
@@ -421,30 +413,7 @@ jobs:
PR_NUMBER: ${{ github.event.pull_request.number }}
REPO: ${{ github.repository }}
SHORT_SHA: ${{ steps.short_sha.outputs.SHORT_SHA }}
shell: bash
run: |
echo "updating PR description"
DOCKER_RUN_COMMAND="docker run -it --rm \
-p 3000:3000 \
-v /var/run/docker.sock:/var/run/docker.sock \
--add-host host.docker.internal:host-gateway \
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:$SHORT_SHA-nikolaik \
--name openhands-app-$SHORT_SHA \
docker.all-hands.dev/all-hands-ai/openhands:$SHORT_SHA"
PR_BODY=$(gh pr view $PR_NUMBER --json body --jq .body)
if echo "$PR_BODY" | grep -q "To run this PR locally, use the following command:"; then
UPDATED_PR_BODY=$(echo "${PR_BODY}" | sed -E "s|docker run -it --rm.*|$DOCKER_RUN_COMMAND|")
else
UPDATED_PR_BODY="${PR_BODY}
---
To run this PR locally, use the following command:
\`\`\`
$DOCKER_RUN_COMMAND
\`\`\`"
fi
echo "updated body: $UPDATED_PR_BODY"
gh pr edit $PR_NUMBER --body "$UPDATED_PR_BODY"
echo "Updating PR description with Docker and uvx commands"
bash ${GITHUB_WORKSPACE}/.github/scripts/update_pr_description.sh
+3 -3
View File
@@ -54,7 +54,7 @@ jobs:
Hi! I started running the integration tests on your PR. You will receive a comment with the results shortly.
- name: Install Python dependencies using Poetry
run: poetry install --without evaluation
run: poetry install --with dev,test,runtime,evaluation
- name: Configure config.toml for testing with Haiku
env:
@@ -179,8 +179,8 @@ jobs:
id: create_comment
uses: KeisukeYamashita/create-comment@v1
with:
# if triggered by PR, use PR number, otherwise use 5318 as fallback issue number for manual triggers
number: ${{ github.event_name == 'pull_request' && github.event.pull_request.number || 5318 }}
# if triggered by PR, use PR number, otherwise use 9745 as fallback issue number for manual triggers
number: ${{ github.event_name == 'pull_request' && github.event.pull_request.number || 9745 }}
unique: false
comment: |
Trigger by: ${{ github.event_name == 'pull_request' && format('Pull Request (integration-test label on PR #{0})', github.event.pull_request.number) || (github.event_name == 'workflow_dispatch' && format('Manual Trigger: {0}', github.event.inputs.reason)) || 'Nightly Scheduled Run' }}
+12 -6
View File
@@ -21,14 +21,20 @@ jobs:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: Install Node.js 20
- name: Install Node.js 22
uses: useblacksmith/setup-node@v5
with:
node-version: 20
node-version: 22
- name: Install frontend dependencies
run: |
cd frontend
npm install --frozen-lockfile
- name: Generate i18n and route types
run: |
cd frontend
npm run make-i18n
npx react-router typegen || true
- name: Fix frontend lint issues
run: |
cd frontend
@@ -45,7 +51,7 @@ jobs:
git config --local user.email "openhands@all-hands.dev"
git config --local user.name "OpenHands Bot"
git add -A
git commit -m "🤖 Auto-fix frontend linting issues"
git commit -m "🤖 Auto-fix frontend linting issues" --no-verify
git push
# Python lint fixes
@@ -68,13 +74,13 @@ jobs:
uses: useblacksmith/setup-python@v6
with:
python-version: 3.12
cache: 'pip'
cache: "pip"
- name: Install pre-commit
run: pip install pre-commit==3.7.0
- name: Fix python lint issues
run: |
# Run all pre-commit hooks and continue even if they modify files (exit code 1)
pre-commit run --config ./dev_config/python/.pre-commit-config.yaml --files openhands/**/* evaluation/**/* tests/**/* || true
pre-commit run --config ./dev_config/python/.pre-commit-config.yaml --all-files || true
# Commit and push changes if any
- name: Check for changes
@@ -87,5 +93,5 @@ jobs:
git config --local user.email "openhands@all-hands.dev"
git config --local user.name "OpenHands Bot"
git add -A
git commit -m "🤖 Auto-fix Python linting issues"
git commit -m "🤖 Auto-fix Python linting issues" --no-verify
git push
+23 -5
View File
@@ -7,7 +7,7 @@ name: Lint
on:
push:
branches:
- main
- main
pull_request:
# If triggered by a PR, it will be in the same group. However, each commit on main will be in its own unique group
@@ -22,10 +22,10 @@ jobs:
runs-on: blacksmith-4vcpu-ubuntu-2204
steps:
- uses: actions/checkout@v4
- name: Install Node.js 20
- name: Install Node.js 22
uses: useblacksmith/setup-node@v5
with:
node-version: 20
node-version: 22
- name: Install dependencies
run: |
cd frontend
@@ -49,11 +49,29 @@ jobs:
uses: useblacksmith/setup-python@v6
with:
python-version: 3.12
cache: 'pip'
cache: "pip"
- name: Install pre-commit
run: pip install pre-commit==3.7.0
- name: Run pre-commit hooks
run: pre-commit run --files openhands/**/* evaluation/**/* tests/**/* --show-diff-on-failure --config ./dev_config/python/.pre-commit-config.yaml
run: pre-commit run --all-files --show-diff-on-failure --config ./dev_config/python/.pre-commit-config.yaml
lint-enterprise-python:
name: Lint enterprise python
runs-on: blacksmith-4vcpu-ubuntu-2204
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up python
uses: useblacksmith/setup-python@v6
with:
python-version: 3.12
cache: "pip"
- name: Install pre-commit
run: pip install pre-commit==4.2.0
- name: Run pre-commit hooks
working-directory: ./enterprise
run: pre-commit run --all-files --config ./dev_config/python/.pre-commit-config.yaml
# Check version consistency across documentation
check-version-consistency:
+108
View File
@@ -0,0 +1,108 @@
name: Publish OpenHands UI Package
# * Always run on "main"
# * Run on PRs that have changes in the "openhands-ui" folder or this workflow
on:
push:
branches:
- main
paths:
- "openhands-ui/**"
- ".github/workflows/npm-publish-ui.yml"
# If triggered by a PR, it will be in the same group. However, each commit on main will be in its own unique group
concurrency:
group: npm-publish-ui
cancel-in-progress: false
jobs:
check-version:
name: Check if version has changed
runs-on: blacksmith-4vcpu-ubuntu-2204
defaults:
run:
shell: bash
outputs:
should-publish: ${{ steps.version-check.outputs.should-publish }}
current-version: ${{ steps.version-check.outputs.current-version }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 2 # Need previous commit to compare
- name: Check if version changed
id: version-check
run: |
# Get current version from package.json
CURRENT_VERSION=$(jq -r .version openhands-ui/package.json)
echo "current-version=$CURRENT_VERSION" >> $GITHUB_OUTPUT
# Check if package.json version changed in this commit
if git diff HEAD~1 HEAD --name-only | grep -q "openhands-ui/package.json"; then
# Check if the version field specifically changed
if git diff HEAD~1 HEAD openhands-ui/package.json | grep -q '"version"'; then
echo "Version changed in package.json, will publish"
echo "should-publish=true" >> $GITHUB_OUTPUT
else
echo "package.json changed but version did not change, skipping publish"
echo "should-publish=false" >> $GITHUB_OUTPUT
fi
else
echo "package.json did not change, skipping publish"
echo "should-publish=false" >> $GITHUB_OUTPUT
fi
publish:
name: Publish to npm
runs-on: blacksmith-4vcpu-ubuntu-2204
needs: check-version
if: needs.check-version.outputs.should-publish == 'true'
defaults:
run:
shell: bash
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version-file: "openhands-ui/.bun-version"
- name: Install dependencies
working-directory: ./openhands-ui
run: bun install --frozen-lockfile
- name: Build package
working-directory: ./openhands-ui
run: bun run build
- name: Check if package already exists on npm
id: npm-check
working-directory: ./openhands-ui
run: |
PACKAGE_NAME=$(jq -r .name package.json)
VERSION="${{ needs.check-version.outputs.current-version }}"
# Check if this version already exists on npm
if npm view "$PACKAGE_NAME@$VERSION" version 2>/dev/null; then
echo "Version $VERSION already exists on npm, skipping publish"
echo "already-exists=true" >> $GITHUB_OUTPUT
else
echo "Version $VERSION does not exist on npm, proceeding with publish"
echo "already-exists=false" >> $GITHUB_OUTPUT
fi
- name: Setup npm authentication
if: steps.npm-check.outputs.already-exists == 'false'
run: |
echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" > ~/.npmrc
- name: Publish to npm
if: steps.npm-check.outputs.already-exists == 'false'
working-directory: ./openhands-ui
run: |
# The prepublishOnly script will run automatically and build the package
npm publish
echo "✅ Successfully published @openhands/ui@${{ needs.check-version.outputs.current-version }} to npm"
+1 -1
View File
@@ -24,7 +24,7 @@ on:
LLM_MODEL:
required: false
type: string
default: "anthropic/claude-3-7-sonnet-20250219"
default: "anthropic/claude-sonnet-4-20250514"
LLM_API_VERSION:
required: false
type: string
+106
View File
@@ -0,0 +1,106 @@
# Workflow that runs python tests
name: Run Python Tests
# The jobs in this workflow are required, so they must run at all times
# * Always run on "main"
# * Always run on PRs
on:
push:
branches:
- main
pull_request:
# If triggered by a PR, it will be in the same group. However, each commit on main will be in its own unique group
concurrency:
group: ${{ github.workflow }}-${{ (github.head_ref && github.ref) || github.run_id }}
cancel-in-progress: true
jobs:
# Run python tests on Linux
test-on-linux:
name: Python Tests on Linux
runs-on: blacksmith-4vcpu-ubuntu-2204
env:
INSTALL_DOCKER: "0" # Set to '0' to skip Docker installation
strategy:
matrix:
python-version: ["3.12"]
steps:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
- name: Install tmux
run: sudo apt-get update && sudo apt-get install -y tmux
- name: Setup Node.js
uses: useblacksmith/setup-node@v5
with:
node-version: "22.x"
- name: Install poetry via pipx
run: pipx install poetry
- name: Set up Python
uses: useblacksmith/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
cache: "poetry"
- name: Install Python dependencies using Poetry
run: poetry install --with dev,test,runtime
- name: Build Environment
run: make build
- name: Run Unit Tests
run: PYTHONPATH=".:$PYTHONPATH" poetry run pytest --forked -n auto -svv ./tests/unit
- name: Run Runtime Tests with CLIRuntime
run: PYTHONPATH=".:$PYTHONPATH" TEST_RUNTIME=cli poetry run pytest -svv tests/runtime/test_bash.py
# Run specific Windows python tests
test-on-windows:
name: Python Tests on Windows
runs-on: windows-latest
strategy:
matrix:
python-version: ["3.12"]
steps:
- uses: actions/checkout@v4
- name: Install pipx
run: pip install pipx
- name: Install poetry via pipx
run: pipx install poetry
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: "poetry"
- name: Install Python dependencies using Poetry
run: poetry install --with dev,test,runtime
- name: Run Windows unit tests
run: poetry run pytest -svv tests/unit/runtime/utils/test_windows_bash.py
env:
PYTHONPATH: ".;$env:PYTHONPATH"
DEBUG: "1"
- name: Run Windows runtime tests with LocalRuntime
run: $env:TEST_RUNTIME="local"; poetry run pytest -svv tests/runtime/test_bash.py
env:
PYTHONPATH: ".;$env:PYTHONPATH"
TEST_RUNTIME: local
DEBUG: "1"
test-enterprise:
name: Enterprise Python Unit Tests
runs-on: blacksmith-4vcpu-ubuntu-2204
strategy:
matrix:
python-version: ["3.12"]
steps:
- uses: actions/checkout@v4
- name: Install poetry via pipx
run: pipx install poetry
- name: Set up Python
uses: useblacksmith/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
cache: "poetry"
- name: Install Python dependencies using Poetry
working-directory: ./enterprise
run: poetry install --with dev,test
- name: Run Unit Tests
working-directory: ./enterprise
run: PYTHONPATH=".:$PYTHONPATH" poetry run pytest --forked -n auto -svv -p no:ddtrace -p no:ddtrace.pytest_bdd -p no:ddtrace.pytest_benchmark ./tests/unit
-76
View File
@@ -1,76 +0,0 @@
# Workflow that runs python unit tests
name: Run Python Unit Tests
# The jobs in this workflow are required, so they must run at all times
# * Always run on "main"
# * Always run on PRs
on:
push:
branches:
- main
pull_request:
# If triggered by a PR, it will be in the same group. However, each commit on main will be in its own unique group
concurrency:
group: ${{ github.workflow }}-${{ (github.head_ref && github.ref) || github.run_id }}
cancel-in-progress: true
jobs:
# Run python unit tests on Linux
test-on-linux:
name: Python Unit Tests on Linux
runs-on: blacksmith-4vcpu-ubuntu-2204
env:
INSTALL_DOCKER: '0' # Set to '0' to skip Docker installation
strategy:
matrix:
python-version: ['3.12']
steps:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
- name: Install tmux
run: sudo apt-get update && sudo apt-get install -y tmux
- name: Setup Node.js
uses: useblacksmith/setup-node@v5
with:
node-version: '22.x'
- name: Install poetry via pipx
run: pipx install poetry
- name: Set up Python
uses: useblacksmith/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
cache: 'poetry'
- name: Install Python dependencies using Poetry
run: poetry install --without evaluation
- name: Build Environment
run: make build
- name: Run Tests
run: poetry run pytest --forked -n auto -svv ./tests/unit
# Run specific Windows python tests
test-on-windows:
name: Python Tests on Windows
runs-on: windows-latest
strategy:
matrix:
python-version: ['3.12']
steps:
- uses: actions/checkout@v4
- name: Install pipx
run: pip install pipx
- name: Install poetry via pipx
run: pipx install poetry
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: 'poetry'
- name: Install Python dependencies using Poetry
run: poetry install --without evaluation
- name: Run Windows unit tests
run: poetry run pytest -svv tests/unit/test_windows_bash.py
- name: Run Windows runtime tests
run: $env:TEST_RUNTIME="local"; poetry run pytest -svv tests/runtime/test_bash.py
+100 -21
View File
@@ -1,56 +1,135 @@
# Run evaluation on a PR
# Run evaluation on a PR, after releases, or manually
name: Run Eval
# Runs when a PR is labeled with one of the "run-eval-" labels
# Runs when a PR is labeled with one of the "run-eval-" labels, after releases, or manually triggered
on:
pull_request:
types: [labeled]
release:
types: [published]
workflow_dispatch:
inputs:
branch:
description: 'Branch to evaluate'
required: true
default: 'main'
eval_instances:
description: 'Number of evaluation instances'
required: true
default: '50'
type: choice
options:
- '1'
- '2'
- '50'
- '100'
reason:
description: 'Reason for manual trigger'
required: false
default: ''
env:
# Environment variable for the master GitHub issue number where all evaluation results will be commented
# This should be set to the issue number where you want all evaluation results to be posted
MASTER_EVAL_ISSUE_NUMBER: ${{ vars.MASTER_EVAL_ISSUE_NUMBER || '0' }}
jobs:
trigger-job:
name: Trigger remote eval job
if: ${{ github.event.label.name == 'run-eval-1' || github.event.label.name == 'run-eval-2' || github.event.label.name == 'run-eval-50' || github.event.label.name == 'run-eval-100' }}
if: ${{ (github.event_name == 'pull_request' && (github.event.label.name == 'run-eval-1' || github.event.label.name == 'run-eval-2' || github.event.label.name == 'run-eval-50' || github.event.label.name == 'run-eval-100')) || github.event_name == 'release' || github.event_name == 'workflow_dispatch' }}
runs-on: blacksmith-4vcpu-ubuntu-2204
steps:
- name: Checkout PR branch
- name: Checkout branch
uses: actions/checkout@v4
with:
ref: ${{ github.head_ref }}
ref: ${{ github.event_name == 'pull_request' && github.head_ref || (github.event_name == 'workflow_dispatch' && github.event.inputs.branch) || github.ref }}
- name: Trigger remote job
env:
PR_BRANCH: ${{ github.head_ref }}
- name: Set evaluation parameters
id: eval_params
run: |
REPO_URL="https://github.com/${{ github.repository }}"
echo "Repository URL: $REPO_URL"
echo "PR Branch: $PR_BRANCH"
if [[ "${{ github.event.label.name }}" == "run-eval-1" ]]; then
EVAL_INSTANCES="1"
elif [[ "${{ github.event.label.name }}" == "run-eval-2" ]]; then
EVAL_INSTANCES="2"
elif [[ "${{ github.event.label.name }}" == "run-eval-50" ]]; then
# Determine branch based on trigger type
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
EVAL_BRANCH="${{ github.head_ref }}"
echo "PR Branch: $EVAL_BRANCH"
elif [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
EVAL_BRANCH="${{ github.event.inputs.branch }}"
echo "Manual Branch: $EVAL_BRANCH"
else
# For release events, use the tag name or main branch
EVAL_BRANCH="${{ github.ref_name }}"
echo "Release Branch/Tag: $EVAL_BRANCH"
fi
# Determine evaluation instances based on trigger type
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
if [[ "${{ github.event.label.name }}" == "run-eval-1" ]]; then
EVAL_INSTANCES="1"
elif [[ "${{ github.event.label.name }}" == "run-eval-2" ]]; then
EVAL_INSTANCES="2"
elif [[ "${{ github.event.label.name }}" == "run-eval-50" ]]; then
EVAL_INSTANCES="50"
elif [[ "${{ github.event.label.name }}" == "run-eval-100" ]]; then
EVAL_INSTANCES="100"
fi
elif [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
EVAL_INSTANCES="${{ github.event.inputs.eval_instances }}"
else
# For release events, default to 50 instances
EVAL_INSTANCES="50"
elif [[ "${{ github.event.label.name }}" == "run-eval-100" ]]; then
EVAL_INSTANCES="100"
fi
echo "Evaluation instances: $EVAL_INSTANCES"
echo "repo_url=$REPO_URL" >> $GITHUB_OUTPUT
echo "eval_branch=$EVAL_BRANCH" >> $GITHUB_OUTPUT
echo "eval_instances=$EVAL_INSTANCES" >> $GITHUB_OUTPUT
- name: Trigger remote job
run: |
# Determine PR number for the remote evaluation system
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
PR_NUMBER="${{ github.event.pull_request.number }}"
else
# For non-PR triggers, use the master issue number as PR number
PR_NUMBER="${{ env.MASTER_EVAL_ISSUE_NUMBER }}"
fi
curl -X POST \
-H "Authorization: Bearer ${{ secrets.PAT_TOKEN }}" \
-H "Accept: application/vnd.github+json" \
-d "{\"ref\": \"main\", \"inputs\": {\"github-repo\": \"${REPO_URL}\", \"github-branch\": \"${PR_BRANCH}\", \"pr-number\": \"${{ github.event.pull_request.number }}\", \"eval-instances\": \"${EVAL_INSTANCES}\"}}" \
-d "{\"ref\": \"main\", \"inputs\": {\"github-repo\": \"${{ steps.eval_params.outputs.repo_url }}\", \"github-branch\": \"${{ steps.eval_params.outputs.eval_branch }}\", \"pr-number\": \"${PR_NUMBER}\", \"eval-instances\": \"${{ steps.eval_params.outputs.eval_instances }}\"}}" \
https://api.github.com/repos/All-Hands-AI/evaluation/actions/workflows/create-branch.yml/dispatches
# Send Slack message
PR_URL="https://github.com/${{ github.repository }}/pull/${{ github.event.pull_request.number }}"
slack_text="PR $PR_URL has triggered evaluation on $EVAL_INSTANCES instances..."
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
TRIGGER_URL="https://github.com/${{ github.repository }}/pull/${{ github.event.pull_request.number }}"
slack_text="PR $TRIGGER_URL has triggered evaluation on ${{ steps.eval_params.outputs.eval_instances }} instances..."
elif [[ "${{ github.event_name }}" == "release" ]]; then
TRIGGER_URL="https://github.com/${{ github.repository }}/releases/tag/${{ github.ref_name }}"
slack_text="Release $TRIGGER_URL has triggered evaluation on ${{ steps.eval_params.outputs.eval_instances }} instances..."
else
TRIGGER_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
slack_text="Manual trigger (${{ github.event.inputs.reason || 'No reason provided' }}) has triggered evaluation on ${{ steps.eval_params.outputs.eval_instances }} instances for branch ${{ steps.eval_params.outputs.eval_branch }}..."
fi
curl -X POST -H 'Content-type: application/json' --data '{"text":"'"$slack_text"'"}' \
https://hooks.slack.com/services/${{ secrets.SLACK_TOKEN }}
- name: Comment on PR
- name: Comment on issue/PR
uses: KeisukeYamashita/create-comment@v1
with:
# For PR triggers, comment on the PR. For other triggers, comment on the master issue
number: ${{ github.event_name == 'pull_request' && github.event.pull_request.number || env.MASTER_EVAL_ISSUE_NUMBER }}
unique: false
comment: |
Running evaluation on the PR. Once eval is done, the results will be posted.
**Evaluation Triggered**
**Trigger:** ${{ github.event_name == 'pull_request' && format('Pull Request #{0}', github.event.pull_request.number) || (github.event_name == 'release' && 'Release') || format('Manual Trigger: {0}', github.event.inputs.reason || 'No reason provided') }}
**Branch:** ${{ steps.eval_params.outputs.eval_branch }}
**Instances:** ${{ steps.eval_params.outputs.eval_instances }}
**Commit:** ${{ github.sha }}
Running evaluation on the specified branch. Once eval is done, the results will be posted here.
+7 -7
View File
@@ -12,11 +12,11 @@ jobs:
steps:
- uses: actions/stale@v9
with:
stale-issue-message: 'This issue is stale because it has been open for 30 days with no activity. Remove stale label or comment or this will be closed in 7 days.'
stale-pr-message: 'This PR is stale because it has been open for 30 days with no activity. Remove stale label or comment or this will be closed in 7 days.'
days-before-stale: 30
exempt-issue-labels: 'tracked'
close-issue-message: 'This issue was closed because it has been stalled for over 30 days with no activity.'
close-pr-message: 'This PR was closed because it has been stalled for over 30 days with no activity.'
days-before-close: 7
stale-issue-message: 'This issue is stale because it has been open for 40 days with no activity. Remove the stale label or leave a comment, otherwise it will be closed in 10 days.'
stale-pr-message: 'This PR is stale because it has been open for 40 days with no activity. Remove the stale label or leave a comment, otherwise it will be closed in 10 days.'
days-before-stale: 40
exempt-issue-labels: roadmap,backlog
close-issue-message: 'This issue was automatically closed due to 50 days of inactivity. We do this to help keep the issues somewhat manageable and focus on active issues.'
close-pr-message: 'This PR was closed because it had no activity for 50 days. If you feel this was closed in error, and you would like to continue the PR, please resubmit or let us know.'
days-before-close: 10
operations-per-run: 150
+34
View File
@@ -0,0 +1,34 @@
name: Run UI Component Build
# * Always run on "main"
# * Run on PRs that have changes in the "openhands-ui" folder or this workflow
on:
push:
branches:
- main
pull_request:
paths:
- 'openhands-ui/**'
- '.github/workflows/ui-build.yml'
# If triggered by a PR, it will be in the same group. However, each commit on main will be in its own unique group
concurrency:
group: ${{ github.workflow }}-${{ (github.head_ref && github.ref) || github.run_id }}
cancel-in-progress: true
jobs:
ui-build:
name: Build openhands-ui
runs-on: blacksmith-4vcpu-ubuntu-2204
steps:
- name: Checkout
uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
bun-version-file: "openhands-ui/.bun-version"
- name: Install dependencies
working-directory: ./openhands-ui
run: bun install --frozen-lockfile
- name: Build package
working-directory: ./openhands-ui
run: bun run build
@@ -0,0 +1,156 @@
# Workflow that validates the VSCode extension builds correctly
name: VSCode Extension CI
# * Always run on "main"
# * Run on PRs that have changes in the VSCode extension folder or this workflow
# * Run on tags that start with "ext-v"
on:
push:
branches:
- main
tags:
- 'ext-v*'
pull_request:
paths:
- 'openhands/integrations/vscode/**'
- 'build_vscode.py'
- '.github/workflows/vscode-extension-build.yml'
# If triggered by a PR, it will be in the same group. However, each commit on main will be in its own unique group
concurrency:
group: ${{ github.workflow }}-${{ (github.head_ref && github.ref) || github.run_id }}
cancel-in-progress: true
jobs:
# Validate VSCode extension builds correctly
validate-vscode-extension:
name: Validate VSCode Extension Build
runs-on: blacksmith-4vcpu-ubuntu-2204
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Node.js
uses: useblacksmith/setup-node@v5
with:
node-version: '22'
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install VSCode extension dependencies
working-directory: ./openhands/integrations/vscode
run: npm ci
- name: Build VSCode extension via build_vscode.py
run: python build_vscode.py
env:
# Ensure we don't skip the build
SKIP_VSCODE_BUILD: ""
- name: Validate .vsix file
run: |
# Verify the .vsix was created and is valid
if [ -f "openhands/integrations/vscode/openhands-vscode-0.0.1.vsix" ]; then
echo "✅ VSCode extension built successfully"
ls -la openhands/integrations/vscode/openhands-vscode-0.0.1.vsix
# Basic validation that the .vsix is a valid zip file
echo "🔍 Validating .vsix structure..."
file openhands/integrations/vscode/openhands-vscode-0.0.1.vsix
unzip -t openhands/integrations/vscode/openhands-vscode-0.0.1.vsix
echo "✅ VSCode extension validation passed"
else
echo "❌ VSCode extension build failed - .vsix not found"
exit 1
fi
- name: Upload VSCode extension artifact
uses: actions/upload-artifact@v4
with:
name: vscode-extension
path: openhands/integrations/vscode/openhands-vscode-0.0.1.vsix
retention-days: 7
- name: Comment on PR with artifact link
if: github.event_name == 'pull_request'
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const path = require('path');
// Get file size for display
const vsixPath = 'openhands/integrations/vscode/openhands-vscode-0.0.1.vsix';
const stats = fs.statSync(vsixPath);
const fileSizeKB = Math.round(stats.size / 1024);
const comment = `## 🔧 VSCode Extension Built Successfully!
The VSCode extension has been built and is ready for testing.
**📦 Download**: [openhands-vscode-0.0.1.vsix](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) (${fileSizeKB} KB)
**🚀 To install**:
1. Download the artifact from the workflow run above
2. In VSCode: \`Ctrl+Shift+P\` → "Extensions: Install from VSIX..."
3. Select the downloaded \`.vsix\` file
**✅ Tested with**: Node.js 22
**🔍 Validation**: File structure and integrity verified
---
*Built from commit ${{ github.sha }}*`;
// Check if we already commented on this PR and delete it
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
});
const botComment = comments.find(comment =>
comment.user.login === 'github-actions[bot]' &&
comment.body.includes('VSCode Extension Built Successfully')
);
if (botComment) {
await github.rest.issues.deleteComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: botComment.id,
});
}
// Create a new comment
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: comment
});
release:
name: Create GitHub Release
runs-on: blacksmith-4vcpu-ubuntu-2204
needs: validate-vscode-extension
if: startsWith(github.ref, 'refs/tags/ext-v')
steps:
- name: Download .vsix artifact
uses: actions/download-artifact@v4
with:
name: vscode-extension
path: ./
- name: Create Release
uses: ncipollo/release-action@v1.16.0
with:
artifacts: "*.vsix"
token: ${{ secrets.GITHUB_TOKEN }}
draft: true
allowUpdates: true
@@ -0,0 +1,51 @@
name: Welcome Good First Issue
on:
issues:
types: [labeled]
permissions:
issues: write
jobs:
comment-on-good-first-issue:
if: github.event.label.name == 'good first issue'
runs-on: ubuntu-latest
steps:
- name: Check if welcome comment already exists
id: check_comment
uses: actions/github-script@v7
with:
result-encoding: string
script: |
const issueNumber = context.issue.number;
const comments = await github.rest.issues.listComments({
...context.repo,
issue_number: issueNumber
});
const alreadyCommented = comments.data.some(
(comment) =>
comment.body.includes('<!-- auto-comment:good-first-issue -->')
);
return alreadyCommented ? 'true' : 'false';
- name: Leave welcome comment
if: steps.check_comment.outputs.result == 'false'
uses: actions/github-script@v7
with:
script: |
const repoUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}`;
await github.rest.issues.createComment({
...context.repo,
issue_number: context.issue.number,
body: "🙌 **Hey there, future contributor!** 🙌\n\n" +
"This issue has been labeled as **good first issue**, which means it's a great place to get started with the OpenHands project.\n\n" +
"If you're interested in working on it, feel free to! No need to ask for permission.\n\n" +
"Be sure to check out our [development setup guide](" + repoUrl + "/blob/main/Development.md) to get your environment set up, and follow our [contribution guidelines](" + repoUrl + "/blob/main/CONTRIBUTING.md) when you're ready to submit a fix.\n\n" +
"Feel free to join our developer community on [Slack](dub.sh/openhands). You can ask for [help](https://openhands-ai.slack.com/archives/C078L0FUGUX), [feedback](https://openhands-ai.slack.com/archives/C086ARSNMGA), and even ask for a [PR review](https://openhands-ai.slack.com/archives/C08D8FJ5771).\n\n" +
"🙌 Happy hacking! 🙌\n\n" +
"<!-- auto-comment:good-first-issue -->"
});
+27 -1
View File
@@ -161,8 +161,29 @@ cython_debug/
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
.idea/
.vscode/
# VS Code: Ignore all but certain files that specify repo-specific settings.
# https://stackoverflow.com/questions/32964920/should-i-commit-the-vscode-folder-to-source-control
.vscode/**/*
!.vscode/extensions.json
!.vscode/settings.json
!.vscode/tasks.json
# VS Code extensions/forks:
.cursorignore
.rooignore
.clineignore
.windsurfignore
.cursorrules
.roorules
.clinerules
.windsurfrules
.cursor/rules
.roo/rules
.cline/rules
.windsurf/rules
.repomix
repomix-output.txt
# evaluation
evaluation/evaluation_outputs
@@ -233,3 +254,8 @@ containers/runtime/Dockerfile
containers/runtime/project.tar.gz
containers/runtime/code
**/node_modules/
# test results
test-results
.sessions
.eval_sessions
+33
View File
@@ -0,0 +1,33 @@
---
name: documentation
type: knowledge
version: 1.0.0
agent: CodeActAgent
triggers:
- documentation
- docs
- document
---
# Documentation Guidelines
All documentation must be grounded in fact, so you must not make anything up without proper evidence. When you have finished writing documentation, convey to the user what reference source, including web pages, source code, or other sources of documentation you referenced when writing each new fact in the documentation. If you cannot reference a source for anything do not include it in the pull request.
## Best Practices for Documentation
1. **Be Factual**: Only include information that can be verified from reliable sources.
2. **Cite Sources**: Always reference the source of information (code, web pages, official documentation).
3. **Be Clear and Concise**: Use simple language and avoid unnecessary jargon.
4. **Use Examples**: Include practical examples to illustrate concepts.
5. **Structure Properly**: Use headings, lists, and code blocks to organize information.
6. **Keep Updated**: Ensure documentation reflects the current state of the code or system.
## Documentation Process
1. Research and gather information from reliable sources
2. Draft documentation based on verified facts
3. Review for accuracy and completeness
4. Include references for all factual statements
5. Submit only when all information is properly sourced
Remember: If you cannot verify a piece of information, it's better to exclude it than to include potentially incorrect information.
+1 -1
View File
@@ -121,7 +121,7 @@ A specialized prompt that enhances OpenHands with domain-specific knowledge, rep
A central repository of available microagents and their configurations.
#### Public Microagent
A general-purpose microagent available to all OpenHands users, triggered by specific keywords.
A general-purpose microagent available to all OpenHands users, triggered by specific keywords. Located in `microagents/`.
#### Repository Microagent
A type of microagent that provides repository-specific context and guidelines, stored in the `.openhands/microagents/` directory.
+168
View File
@@ -5,12 +5,21 @@ This repository contains the code for OpenHands, an automated AI software engine
To set up the entire repo, including frontend and backend, run `make build`.
You don't need to do this unless the user asks you to, or if you're trying to run the entire application.
## Running OpenHands with OpenHands:
To run the full application to debug issues:
```bash
export INSTALL_DOCKER=0
export RUNTIME=local
make build && make run FRONTEND_PORT=12000 FRONTEND_HOST=0.0.0.0 BACKEND_HOST=0.0.0.0 &> /tmp/openhands-log.txt &
```
IMPORTANT: Before making any changes to the codebase, ALWAYS run `make install-pre-commit-hooks` to ensure pre-commit hooks are properly installed.
Before pushing any changes, you MUST ensure that any lint errors or simple test errors have been fixed.
* If you've made changes to the backend, you should run `pre-commit run --config ./dev_config/python/.pre-commit-config.yaml` (this will run on staged files).
* If you've made changes to the frontend, you should run `cd frontend && npm run lint:fix && npm run build ; cd ..`
* If you've made changes to the VSCode extension, you should run `cd openhands/integrations/vscode && npm run lint:fix && npm run compile ; cd ../../..`
The pre-commit hooks MUST pass successfully before pushing any changes to the repository. This is a mandatory requirement to maintain code quality and consistency.
@@ -21,6 +30,12 @@ then re-run the command to ensure it passes. Common issues include:
- Trailing whitespace
- Missing newlines at end of files
## Git Best Practices
- Prefer specific `git add <filename>` instead of `git add .` to avoid accidentally staging unintended files
- Be especially careful with `git reset --hard` after staging files, as it will remove accidentally staged files
- When remote has new changes, use `git fetch upstream && git rebase upstream/<branch>` on the same branch
## Repository Structure
Backend:
- Located in the `openhands` directory
@@ -44,16 +59,63 @@ Frontend:
- Available variables: VITE_BACKEND_HOST, VITE_USE_TLS, VITE_INSECURE_SKIP_VERIFY, VITE_FRONTEND_PORT
- Internationalization:
- Generate i18n declaration file: `npm run make-i18n`
- Data Fetching & Cache Management:
- We use TanStack Query (fka React Query) for data fetching and cache management
- Data Access Layer: API client methods are located in `frontend/src/api` and should never be called directly from UI components - they must always be wrapped with TanStack Query
- Custom hooks are located in `frontend/src/hooks/query/` and `frontend/src/hooks/mutation/`
- Query hooks should follow the pattern use[Resource] (e.g., `useConversationMicroagents`)
- Mutation hooks should follow the pattern use[Action] (e.g., `useDeleteConversation`)
- Architecture rule: UI components → TanStack Query hooks → Data Access Layer (`frontend/src/api`) → API endpoints
VSCode Extension:
- Located in the `openhands/integrations/vscode` directory
- Setup: Run `npm install` in the extension directory
- Linting:
- Run linting with fixes: `npm run lint:fix`
- Check only: `npm run lint`
- Type checking: `npm run typecheck`
- Building:
- Compile TypeScript: `npm run compile`
- Package extension: `npm run package-vsix`
- Testing:
- Run tests: `npm run test`
- Development Best Practices:
- Use `vscode.window.createOutputChannel()` for debug logging instead of `showErrorMessage()` popups
- Pre-commit process runs both frontend and backend checks when committing extension changes
## Template for Github Pull Request
If you are starting a pull request (PR), please follow the template in `.github/pull_request_template.md`.
If you need to add labels when opening a PR, check the existing labels defined on that repository and select from existing ones. Do not invent your own labels.
## Implementation Details
These details may or may not be useful for your current task.
### Microagents
Microagents are specialized prompts that enhance OpenHands with domain-specific knowledge and task-specific workflows. They are Markdown files that can include frontmatter for configuration.
#### Types:
- **Public Microagents**: Located in `microagents/`, available to all users
- **Repository Microagents**: Located in `.openhands/microagents/`, specific to this repository
#### Loading Behavior:
- **Without frontmatter**: Always loaded into LLM context
- **With triggers in frontmatter**: Only loaded when user's message matches the specified trigger keywords
#### Structure:
```yaml
---
triggers:
- keyword1
- keyword2
---
# Microagent Content
Your specialized knowledge and instructions here...
```
### Frontend
#### Action Handling:
@@ -66,3 +128,109 @@ These details may or may not be useful for your current task.
- Actions with `thought` property are displayed in the UI based on their action type:
- Regular actions (like "run", "edit") display the thought as a separate message
- Special actions (like "think") are displayed as collapsible elements only
#### Adding User Settings:
- To add a new user setting to OpenHands, follow these steps:
1. Add the setting to the frontend:
- Add the setting to the `Settings` type in `frontend/src/types/settings.ts`
- Add the setting to the `ApiSettings` type in the same file
- Add the setting with an appropriate default value to `DEFAULT_SETTINGS` in `frontend/src/services/settings.ts`
- Update the `useSettings` hook in `frontend/src/hooks/query/use-settings.ts` to map the API response
- Update the `useSaveSettings` hook in `frontend/src/hooks/mutation/use-save-settings.ts` to include the setting in API requests
- Add UI components (like toggle switches) in the appropriate settings screen (e.g., `frontend/src/routes/app-settings.tsx`)
- Add i18n translations for the setting name and any tooltips in `frontend/src/i18n/translation.json`
- Add the translation key to `frontend/src/i18n/declaration.ts`
2. Add the setting to the backend:
- Add the setting to the `Settings` model in `openhands/storage/data_models/settings.py`
- Update any relevant backend code to apply the setting (e.g., in session creation)
#### Settings UI Patterns:
There are two main patterns for saving settings in the OpenHands frontend:
**Pattern 1: Entity-based Resources (Immediate Save)**
- Used for: API Keys, Secrets, MCP Servers
- Behavior: Changes are saved immediately when user performs actions (add/edit/delete)
- Implementation:
- No "Save Changes" button
- No local state management or `isDirty` tracking
- Uses dedicated mutation hooks for each operation (e.g., `use-add-mcp-server.ts`, `use-delete-mcp-server.ts`)
- Each mutation triggers immediate API call with query invalidation for UI updates
- Example: MCP settings, API Keys & Secrets tabs
- Benefits: Simpler UX, no risk of losing changes, consistent with modern web app patterns
**Pattern 2: Form-based Settings (Manual Save)**
- Used for: Application settings, LLM configuration
- Behavior: Changes are accumulated locally and saved when user clicks "Save Changes"
- Implementation:
- Has "Save Changes" button that becomes enabled when changes are detected
- Uses local state management with `isDirty` tracking
- Uses `useSaveSettings` hook to save all changes at once
- Example: LLM tab, Application tab
- Benefits: Allows bulk changes, explicit save action, can validate all fields before saving
**When to use each pattern:**
- Use Pattern 1 (Immediate Save) for entity management where each item is independent
- Use Pattern 2 (Manual Save) for configuration forms where settings are interdependent or need validation
### Adding New LLM Models
To add a new LLM model to OpenHands, you need to update multiple files across both frontend and backend:
#### Model Configuration Procedure:
1. **Frontend Model Arrays** (`frontend/src/utils/verified-models.ts`):
- Add the model to `VERIFIED_MODELS` array (main list of all verified models)
- Add to provider-specific arrays based on the model's provider:
- `VERIFIED_OPENAI_MODELS` for OpenAI models
- `VERIFIED_ANTHROPIC_MODELS` for Anthropic models
- `VERIFIED_MISTRAL_MODELS` for Mistral models
- `VERIFIED_OPENHANDS_MODELS` for models available through OpenHands provider
2. **Backend CLI Integration** (`openhands/cli/utils.py`):
- Add the model to the appropriate `VERIFIED_*_MODELS` arrays
- This ensures the model appears in CLI model selection
3. **Backend Model List** (`openhands/utils/llm.py`):
- **CRITICAL**: Add the model to the `openhands_models` list (lines 57-66) if using OpenHands provider
- This is required for the model to appear in the frontend model selector
- Format: `'openhands/model-name'` (e.g., `'openhands/o3'`)
4. **Backend LLM Configuration** (`openhands/llm/llm.py`):
- Add to feature-specific arrays based on model capabilities:
- `FUNCTION_CALLING_SUPPORTED_MODELS` if the model supports function calling
- `REASONING_EFFORT_SUPPORTED_MODELS` if the model supports reasoning effort parameters
- `CACHE_PROMPT_SUPPORTED_MODELS` if the model supports prompt caching
- `MODELS_WITHOUT_STOP_WORDS` if the model doesn't support stop words
5. **Validation**:
- Run backend linting: `pre-commit run --config ./dev_config/python/.pre-commit-config.yaml`
- Run frontend linting: `cd frontend && npm run lint:fix`
- Run frontend build: `cd frontend && npm run build`
#### Model Verification Arrays:
- **VERIFIED_MODELS**: Main array of all verified models shown in the UI
- **VERIFIED_OPENAI_MODELS**: OpenAI models (LiteLLM doesn't return provider prefix)
- **VERIFIED_ANTHROPIC_MODELS**: Anthropic models (LiteLLM doesn't return provider prefix)
- **VERIFIED_MISTRAL_MODELS**: Mistral models (LiteLLM doesn't return provider prefix)
- **VERIFIED_OPENHANDS_MODELS**: Models available through OpenHands managed provider
#### Model Feature Support Arrays:
- **FUNCTION_CALLING_SUPPORTED_MODELS**: Models that support structured function calling
- **REASONING_EFFORT_SUPPORTED_MODELS**: Models that support reasoning effort parameters (like o1, o3)
- **CACHE_PROMPT_SUPPORTED_MODELS**: Models that support prompt caching for efficiency
- **MODELS_WITHOUT_STOP_WORDS**: Models that don't support stop word parameters
#### Frontend Model Integration:
- Models are automatically available in the model selector UI once added to verified arrays
- The `extractModelAndProvider` utility automatically detects provider from model arrays
- Provider-specific models are grouped and prioritized in the UI selection
#### CLI Model Integration:
- Models appear in CLI provider selection based on the verified arrays
- The `organize_models_and_providers` function groups models by provider
- Default model selection prioritizes verified models for each provider
+134 -32
View File
@@ -1,56 +1,158 @@
#!/bin/bash
echo "Running OpenHands pre-commit hook..."
echo "This hook runs selective linting based on changed files."
# Store the exit code to return at the end
# This allows us to be additive to existing pre-commit hooks
EXIT_CODE=0
# Check if frontend directory has changed
frontend_changes=$(git diff --cached --name-only | grep "^frontend/")
if [ -n "$frontend_changes" ]; then
echo "Frontend changes detected. Running frontend checks..."
# Get the list of staged files
STAGED_FILES=$(git diff --cached --name-only)
# Check if frontend directory exists
if [ -d "frontend" ]; then
# Change to frontend directory
cd frontend || exit 1
# Check if any files match specific patterns
has_frontend_changes=false
has_backend_changes=false
has_vscode_changes=false
# Run lint:fix
echo "Running npm lint:fix..."
npm run lint:fix
# Check each file individually to avoid issues with grep
for file in $STAGED_FILES; do
if [[ $file == frontend/* ]]; then
has_frontend_changes=true
elif [[ $file == openhands/* || $file == evaluation/* || $file == tests/* ]]; then
has_backend_changes=true
# Check for VSCode extension changes (subset of backend changes)
if [[ $file == openhands/integrations/vscode/* ]]; then
has_vscode_changes=true
fi
fi
done
echo "Analyzing changes..."
echo "- Frontend changes: $has_frontend_changes"
echo "- Backend changes: $has_backend_changes"
echo "- VSCode extension changes: $has_vscode_changes"
# Run frontend linting if needed
if [ "$has_frontend_changes" = true ]; then
# Check if we're in a CI environment or if frontend dependencies are missing
if [ -n "$CI" ] || ! command -v react-router &> /dev/null || ! command -v vitest &> /dev/null; then
echo "Skipping frontend checks (CI environment or missing dependencies detected)."
echo "WARNING: Frontend files have changed but frontend checks are being skipped."
echo "Please run 'make lint-frontend' manually before submitting your PR."
else
echo "Running frontend linting..."
make lint-frontend
if [ $? -ne 0 ]; then
echo "Frontend linting failed. Please fix the issues before committing."
EXIT_CODE=1
else
echo "Frontend linting checks passed!"
fi
# Run build
echo "Running npm build..."
npm run build
if [ $? -ne 0 ]; then
echo "Frontend build failed. Please fix the issues before committing."
EXIT_CODE=1
fi
# Run additional frontend checks
if [ -d "frontend" ]; then
echo "Running additional frontend checks..."
cd frontend || exit 1
# Run tests
echo "Running npm test..."
npm test
if [ $? -ne 0 ]; then
echo "Frontend tests failed. Please fix the failing tests before committing."
EXIT_CODE=1
fi
# Run build
echo "Running npm build..."
npm run build
if [ $? -ne 0 ]; then
echo "Frontend build failed. Please fix the issues before committing."
EXIT_CODE=1
fi
# Return to the original directory
cd ..
# Run tests
echo "Running npm test..."
npm test
if [ $? -ne 0 ]; then
echo "Frontend tests failed. Please fix the failing tests before committing."
EXIT_CODE=1
fi
if [ $EXIT_CODE -eq 0 ]; then
echo "Frontend checks passed!"
cd ..
fi
else
echo "Frontend directory not found. Skipping frontend checks."
fi
else
echo "No frontend changes detected. Skipping frontend checks."
echo "Skipping frontend checks (no frontend changes detected)."
fi
# Run backend linting if needed
if [ "$has_backend_changes" = true ]; then
echo "Running backend linting..."
make lint-backend
if [ $? -ne 0 ]; then
echo "Backend linting failed. Please fix the issues before committing."
EXIT_CODE=1
else
echo "Backend linting checks passed!"
fi
else
echo "Skipping backend checks (no backend changes detected)."
fi
# Run VSCode extension checks if needed
if [ "$has_vscode_changes" = true ]; then
# Check if we're in a CI environment
if [ -n "$CI" ]; then
echo "Skipping VSCode extension checks (CI environment detected)."
echo "WARNING: VSCode extension files have changed but checks are being skipped."
echo "Please run VSCode extension checks manually before submitting your PR."
else
echo "Running VSCode extension checks..."
if [ -d "openhands/integrations/vscode" ]; then
cd openhands/integrations/vscode || exit 1
echo "Running npm lint:fix..."
npm run lint:fix
if [ $? -ne 0 ]; then
echo "VSCode extension linting failed. Please fix the issues before committing."
EXIT_CODE=1
else
echo "VSCode extension linting passed!"
fi
echo "Running npm typecheck..."
npm run typecheck
if [ $? -ne 0 ]; then
echo "VSCode extension type checking failed. Please fix the issues before committing."
EXIT_CODE=1
else
echo "VSCode extension type checking passed!"
fi
echo "Running npm compile..."
npm run compile
if [ $? -ne 0 ]; then
echo "VSCode extension compilation failed. Please fix the issues before committing."
EXIT_CODE=1
else
echo "VSCode extension compilation passed!"
fi
cd ../../..
fi
fi
else
echo "Skipping VSCode extension checks (no VSCode extension changes detected)."
fi
# If no specific code changes detected, run basic checks
if [ "$has_frontend_changes" = false ] && [ "$has_backend_changes" = false ]; then
echo "No specific code changes detected. Running basic checks..."
if [ -n "$STAGED_FILES" ]; then
# Run only basic pre-commit hooks for non-code files
poetry run pre-commit run --files $(echo "$STAGED_FILES" | tr '\n' ' ') --hook-stage commit --config ./dev_config/python/.pre-commit-config.yaml
if [ $? -ne 0 ]; then
echo "Basic checks failed. Please fix the issues before committing."
EXIT_CODE=1
else
echo "Basic checks passed!"
fi
else
echo "No files changed. Skipping basic checks."
fi
fi
# Run any existing pre-commit hooks that might have been installed by the user
+1
View File
@@ -9,4 +9,5 @@ python -m pip install pre-commit
if [ -d ".git" ]; then
echo "Installing pre-commit hooks..."
pre-commit install
make install-pre-commit-hooks
fi
+6
View File
@@ -0,0 +1,6 @@
{
// force *nix line endings so files don't look modified in container run from Windows clone
"files.eol": "\n",
"files.trimTrailingWhitespace": true,
"files.insertFinalNewline": true,
}
+2 -2
View File
@@ -20,7 +20,7 @@ We have a separate doc [Development.md](https://github.com/All-Hands-AI/OpenHand
There are many ways that you can contribute:
1. **Download and use** OpenHands, and send [issues](https://github.com/All-Hands-AI/OpenHands/issues) when you encounter something that isn't working or a feature that you'd like to see.
2. **Send feedback** after each session by [clicking the thumbs-up thumbs-down buttons](https://docs.all-hands.dev/modules/usage/feedback), so we can see where things are working and failing, and also build an open dataset for training code agents.
2. **Send feedback** after each session by [clicking the thumbs-up thumbs-down buttons](https://docs.all-hands.dev/usage/feedback), so we can see where things are working and failing, and also build an open dataset for training code agents.
3. **Improve the Codebase** by sending [PRs](#sending-pull-requests-to-openhands) (see details below). In particular, we have some [good first issues](https://github.com/All-Hands-AI/OpenHands/labels/good%20first%20issue) that may be ones to start on.
## What Can I Build?
@@ -31,7 +31,7 @@ We're always looking to improve the look and feel of the application. If you've
for something that's bugging you, feel free to open up a PR that changes the [`./frontend`](./frontend) directory.
If you're looking to make a bigger change, add a new UI element, or significantly alter the style
of the application, please open an issue first, or better, join the #frontend channel in our Slack
of the application, please open an issue first, or better, join the #eng-ui-ux channel in our Slack
to gather consensus from our design team first.
#### Improving the agent
+49 -13
View File
@@ -1,8 +1,10 @@
# Development Guide
This guide is for people working on OpenHands and editing the source code.
If you wish to contribute your changes, check out the [CONTRIBUTING.md](https://github.com/All-Hands-AI/OpenHands/blob/main/CONTRIBUTING.md) on how to clone and setup the project
initially before moving on. Otherwise, you can clone the OpenHands project directly.
If you wish to contribute your changes, check out the
[CONTRIBUTING.md](https://github.com/All-Hands-AI/OpenHands/blob/main/CONTRIBUTING.md)
on how to clone and setup the project initially before moving on. Otherwise,
you can clone the OpenHands project directly.
## Start the Server for Development
@@ -19,9 +21,20 @@ initially before moving on. Otherwise, you can clone the OpenHands project direc
Make sure you have all these dependencies installed before moving on to `make build`.
#### Dev container
There is a [dev container](https://containers.dev/) available which provides a
pre-configured environment with all the necessary dependencies installed if you
are using a [supported editor or tool](https://containers.dev/supporting). For
example, if you are using Visual Studio Code (VS Code) with the
[Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)
extension installed, you can open the project in a dev container by using the
_Dev Container: Reopen in Container_ command from the Command Palette
(Ctrl+Shift+P).
#### Develop without sudo access
If you want to develop without system admin/sudo access to upgrade/install `Python` and/or `NodeJs`, you can use
If you want to develop without system admin/sudo access to upgrade/install `Python` and/or `NodeJS`, you can use
`conda` or `mamba` to manage the packages for you:
```bash
@@ -37,7 +50,7 @@ mamba install conda-forge::poetry
### 2. Build and Setup The Environment
Begin by building the project which includes setting up the environment and installing dependencies. This step ensures
Begin by building the project which includes setting up the environment and installing dependencies. This step ensures
that OpenHands is ready to run on your system:
```bash
@@ -54,16 +67,16 @@ To configure the LM of your choice, run:
make setup-config
```
This command will prompt you to enter the LLM API key, model name, and other variables ensuring that OpenHands is
tailored to your specific needs. Note that the model name will apply only when you run headless. If you use the UI,
This command will prompt you to enter the LLM API key, model name, and other variables ensuring that OpenHands is
tailored to your specific needs. Note that the model name will apply only when you run headless. If you use the UI,
please set the model in the UI.
Note: If you have previously run OpenHands using the docker command, you may have already set some environmental
Note: If you have previously run OpenHands using the docker command, you may have already set some environment
variables in your terminal. The final configurations are set from highest to lowest priority:
Environment variables > config.toml variables > default variables
**Note on Alternative Models:**
See [our documentation](https://docs.all-hands.dev/modules/usage/llms) for recommended models.
See [our documentation](https://docs.all-hands.dev/usage/llms) for recommended models.
### 4. Running the application
@@ -77,19 +90,42 @@ make run
#### Option B: Individual Server Startup
- **Start the Backend Server:** If you prefer, you can start the backend server independently to focus on
- **Start the Backend Server:** If you prefer, you can start the backend server independently to focus on
backend-related tasks or configurations.
```bash
make start-backend
```
- **Start the Frontend Server:** Similarly, you can start the frontend server on its own to work on frontend-related
- **Start the Frontend Server:** Similarly, you can start the frontend server on its own to work on frontend-related
components or interface enhancements.
```bash
make start-frontend
```
### 5. Running OpenHands with OpenHands
You can use OpenHands to develop and improve OpenHands itself! This is a powerful way to leverage AI assistance for contributing to the project.
#### Quick Start
1. **Build and run OpenHands:**
```bash
export INSTALL_DOCKER=0
export RUNTIME=local
make build && make run
```
2. **Access the interface:**
- Local development: http://localhost:3001
- Remote/cloud environments: Use the appropriate external URL
3. **Configure for external access (if needed):**
```bash
# For external access (e.g., cloud environments)
make run FRONTEND_PORT=12000 FRONTEND_HOST=0.0.0.0 BACKEND_HOST=0.0.0.0
```
### 6. LLM Debugging
If you encounter any issues with the Language Model (LM) or you're simply curious, export DEBUG=1 in the environment and restart the backend.
@@ -118,12 +154,12 @@ poetry run pytest ./tests/unit/test_*.py
1. Add your dependency in `pyproject.toml` or use `poetry add xxx`.
2. Update the poetry.lock file via `poetry lock --no-update`.
### 9. Use existing Docker image
### 10. Use existing Docker image
To reduce build time (e.g., if no changes were made to the client-runtime component), you can use an existing Docker
To reduce build time (e.g., if no changes were made to the client-runtime component), you can use an existing Docker
container image by setting the SANDBOX_RUNTIME_CONTAINER_IMAGE environment variable to the desired Docker image.
Example: `export SANDBOX_RUNTIME_CONTAINER_IMAGE=ghcr.io/all-hands-ai/runtime:0.38-nikolaik`
Example: `export SANDBOX_RUNTIME_CONTAINER_IMAGE=ghcr.io/all-hands-ai/runtime:0.55-nikolaik`
## Develop inside Docker container
+7 -2
View File
@@ -1,7 +1,12 @@
The MIT License (MIT)
Portions of this software are licensed as follows:
* All content that resides under the enterprise/ directory is licensed under the license defined in "enterprise/LICENSE".
* Content outside of the above mentioned directories or restrictions above is available under the MIT license as defined below.
=====================
Copyright © 2023
The MIT License (MIT)
Copyright © 2025
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
+55 -10
View File
@@ -3,14 +3,16 @@ SHELL=/usr/bin/env bash
# Variables
BACKEND_HOST ?= "127.0.0.1"
BACKEND_PORT = 3000
BACKEND_PORT ?= 3000
BACKEND_HOST_PORT = "$(BACKEND_HOST):$(BACKEND_PORT)"
FRONTEND_PORT = 3001
FRONTEND_HOST ?= "127.0.0.1"
FRONTEND_PORT ?= 3001
DEFAULT_WORKSPACE_DIR = "./workspace"
DEFAULT_MODEL = "gpt-4o"
CONFIG_FILE = config.toml
PRE_COMMIT_CONFIG_PATH = "./dev_config/python/.pre-commit-config.yaml"
PYTHON_VERSION = 3.12
KIND_CLUSTER_NAME = "local-hands"
# ANSI color codes
GREEN=$(shell tput -Txterm setaf 2)
@@ -150,7 +152,7 @@ install-python-dependencies:
echo "Installing only POETRY_GROUP=${POETRY_GROUP}"; \
poetry install --only $${POETRY_GROUP}; \
else \
poetry install; \
poetry install --with dev,test,runtime; \
fi
@if [ "${INSTALL_PLAYWRIGHT}" != "false" ] && [ "${INSTALL_PLAYWRIGHT}" != "0" ]; then \
if [ -f "/etc/manjaro-release" ]; then \
@@ -172,7 +174,7 @@ install-python-dependencies:
fi
@echo "$(GREEN)Python dependencies installed successfully.$(RESET)"
install-frontend-dependencies:
install-frontend-dependencies: check-npm check-nodejs
@echo "$(YELLOW)Setting up frontend environment...$(RESET)"
@echo "$(YELLOW)Detect Node.js version...$(RESET)"
@cd frontend && node ./scripts/detect-node-version.js
@@ -180,17 +182,17 @@ install-frontend-dependencies:
@cd frontend && npm install
@echo "$(GREEN)Frontend dependencies installed successfully.$(RESET)"
install-pre-commit-hooks:
install-pre-commit-hooks: check-python check-poetry install-python-dependencies
@echo "$(YELLOW)Installing pre-commit hooks...$(RESET)"
@git config --unset-all core.hooksPath || true
@poetry run pre-commit install --config $(PRE_COMMIT_CONFIG_PATH)
@echo "$(GREEN)Pre-commit hooks installed successfully.$(RESET)"
lint-backend:
lint-backend: install-pre-commit-hooks
@echo "$(YELLOW)Running linters...$(RESET)"
@poetry run pre-commit run --files openhands/**/* evaluation/**/* tests/**/* --show-diff-on-failure --config $(PRE_COMMIT_CONFIG_PATH)
@poetry run pre-commit run --all-files --show-diff-on-failure --config $(PRE_COMMIT_CONFIG_PATH)
lint-frontend:
lint-frontend: install-frontend-dependencies
@echo "$(YELLOW)Running linters for frontend...$(RESET)"
@cd frontend && npm run lint
@@ -198,6 +200,40 @@ lint:
@$(MAKE) -s lint-frontend
@$(MAKE) -s lint-backend
kind:
@echo "$(YELLOW)Checking if kind is installed...$(RESET)"
@if ! command -v kind > /dev/null; then \
echo "$(RED)kind is not installed. Please install kind with `brew install kind` to continue$(RESET)"; \
exit 1; \
else \
echo "$(BLUE)kind $(shell kind version) is already installed.$(RESET)"; \
fi
@echo "$(YELLOW)Checking if kind cluster '$(KIND_CLUSTER_NAME)' already exists...$(RESET)"
@if kind get clusters | grep -q "^$(KIND_CLUSTER_NAME)$$"; then \
echo "$(BLUE)Kind cluster '$(KIND_CLUSTER_NAME)' already exists.$(RESET)"; \
kubectl config use-context kind-$(KIND_CLUSTER_NAME); \
else \
echo "$(YELLOW)Creating kind cluster '$(KIND_CLUSTER_NAME)'...$(RESET)"; \
kind create cluster --name $(KIND_CLUSTER_NAME) --config kind/cluster.yaml; \
fi
@echo "$(YELLOW)Checking if mirrord is installed...$(RESET)"
@if ! command -v mirrord > /dev/null; then \
echo "$(RED)mirrord is not installed. Please install mirrord with `brew install metalbear-co/mirrord/mirrord` to continue$(RESET)"; \
exit 1; \
else \
echo "$(BLUE)mirrord $(shell mirrord --version) is already installed.$(RESET)"; \
fi
@echo "$(YELLOW)Installing k8s mirrord resources...$(RESET)"
@kubectl apply -f kind/manifests
@echo "$(GREEN)Mirrord resources installed successfully.$(RESET)"
@echo "$(YELLOW)Waiting for Mirrord pod to be ready.$(RESET)"
@sleep 5
@kubectl wait --for=condition=Available deployment/ubuntu-dev
@echo "$(YELLOW)Waiting for Nginx to be ready.$(RESET)"
@kubectl -n ingress-nginx wait --for=condition=Available deployment/ingress-nginx-controller
@echo "$(YELLOW)Running make run inside of mirrord.$(RESET)"
@mirrord exec --target deployment/ubuntu-dev -- make run
test-frontend:
@echo "$(YELLOW)Running tests for frontend...$(RESET)"
@cd frontend && npm run test
@@ -288,6 +324,15 @@ setup-config-prompts:
@read -p "Enter your LLM base URL [mostly used for local LLMs, leave blank if not needed - example: http://localhost:5001/v1/]: " llm_base_url; \
if [[ ! -z "$$llm_base_url" ]]; then echo "base_url=\"$$llm_base_url\"" >> $(CONFIG_FILE).tmp; fi
setup-config-basic:
@printf '%s\n' \
'[core]' \
'workspace_base="./workspace"' \
> config.toml
@echo "$(GREEN)config.toml created.$(RESET)"
openhands-cloud-run:
@$(MAKE) run BACKEND_HOST="0.0.0.0" BACKEND_PORT="12000" FRONTEND_HOST="0.0.0.0" FRONTEND_PORT="12001"
# Develop in container
docker-dev:
@@ -322,5 +367,5 @@ help:
@echo " $(GREEN)help$(RESET) - Display this help message, providing information on available targets."
# Phony targets
.PHONY: build check-dependencies check-python check-npm check-docker check-poetry install-python-dependencies install-frontend-dependencies install-pre-commit-hooks lint start-backend start-frontend run run-wsl setup-config setup-config-prompts help
.PHONY: docker-dev docker-run
.PHONY: build check-dependencies check-system check-python check-npm check-nodejs check-docker check-poetry install-python-dependencies install-frontend-dependencies install-pre-commit-hooks lint-backend lint-frontend lint test-frontend test build-frontend start-backend start-frontend _run_setup run run-wsl setup-config setup-config-prompts setup-config-basic openhands-cloud-run docker-dev docker-run clean help
.PHONY: kind
+74 -37
View File
@@ -11,13 +11,24 @@
<a href="https://github.com/All-Hands-AI/OpenHands/stargazers"><img src="https://img.shields.io/github/stars/All-Hands-AI/OpenHands?style=for-the-badge&color=blue" alt="Stargazers"></a>
<a href="https://github.com/All-Hands-AI/OpenHands/blob/main/LICENSE"><img src="https://img.shields.io/github/license/All-Hands-AI/OpenHands?style=for-the-badge&color=blue" alt="MIT License"></a>
<br/>
<a href="https://join.slack.com/t/openhands-ai/shared_invite/zt-34zm4j0gj-Qz5kRHoca8DFCbqXPS~f_A"><img src="https://img.shields.io/badge/Slack-Join%20Us-red?logo=slack&logoColor=white&style=for-the-badge" alt="Join our Slack community"></a>
<a href="https://join.slack.com/t/openhands-ai/shared_invite/zt-3847of6xi-xuYJIPa6YIPg4ElbDWbtSA"><img src="https://img.shields.io/badge/Slack-Join%20Us-red?logo=slack&logoColor=white&style=for-the-badge" alt="Join our Slack community"></a>
<a href="https://discord.gg/ESHStjSjD4"><img src="https://img.shields.io/badge/Discord-Join%20Us-purple?logo=discord&logoColor=white&style=for-the-badge" alt="Join our Discord community"></a>
<a href="https://github.com/All-Hands-AI/OpenHands/blob/main/CREDITS.md"><img src="https://img.shields.io/badge/Project-Credits-blue?style=for-the-badge&color=FFE165&logo=github&logoColor=white" alt="Credits"></a>
<br/>
<a href="https://docs.all-hands.dev/modules/usage/getting-started"><img src="https://img.shields.io/badge/Documentation-000?logo=googledocs&logoColor=FFE165&style=for-the-badge" alt="Check out the documentation"></a>
<a href="https://docs.all-hands.dev/usage/getting-started"><img src="https://img.shields.io/badge/Documentation-000?logo=googledocs&logoColor=FFE165&style=for-the-badge" alt="Check out the documentation"></a>
<a href="https://arxiv.org/abs/2407.16741"><img src="https://img.shields.io/badge/Paper%20on%20Arxiv-000?logoColor=FFE165&logo=arxiv&style=for-the-badge" alt="Paper on Arxiv"></a>
<a href="https://docs.google.com/spreadsheets/d/1wOUdFCMyY6Nt0AIqF705KN4JKOWgeI4wUGUP60krXXs/edit?gid=0#gid=0"><img src="https://img.shields.io/badge/Benchmark%20score-000?logoColor=FFE165&logo=huggingface&style=for-the-badge" alt="Evaluation Benchmark Score"></a>
<!-- Keep these links. Translations will automatically update with the README. -->
<a href="https://www.readme-i18n.com/All-Hands-AI/OpenHands?lang=de">Deutsch</a> |
<a href="https://www.readme-i18n.com/All-Hands-AI/OpenHands?lang=es">Español</a> |
<a href="https://www.readme-i18n.com/All-Hands-AI/OpenHands?lang=fr">français</a> |
<a href="https://www.readme-i18n.com/All-Hands-AI/OpenHands?lang=ja">日本語</a> |
<a href="https://www.readme-i18n.com/All-Hands-AI/OpenHands?lang=ko">한국어</a> |
<a href="https://www.readme-i18n.com/All-Hands-AI/OpenHands?lang=pt">Português</a> |
<a href="https://www.readme-i18n.com/All-Hands-AI/OpenHands?lang=ru">Русский</a> |
<a href="https://www.readme-i18n.com/All-Hands-AI/OpenHands?lang=zh">中文</a>
<hr>
</div>
@@ -37,64 +48,91 @@ Learn more at [docs.all-hands.dev](https://docs.all-hands.dev), or [sign up for
## ☁️ OpenHands Cloud
The easiest way to get started with OpenHands is on [OpenHands Cloud](https://app.all-hands.dev),
which comes with $50 in free credits for new users.
which comes with $20 in free credits for new users.
## 💻 Running OpenHands Locally
OpenHands can also run on your local system using Docker.
See the [Running OpenHands](https://docs.all-hands.dev/modules/usage/installation) guide for
system requirements and more information.
### Option 1: CLI Launcher (Recommended)
> [!WARNING]
> On a public network? See our [Hardened Docker Installation Guide](https://docs.all-hands.dev/modules/usage/runtimes/docker#hardened-docker-installation)
> to secure your deployment by restricting network binding and implementing additional security measures.
The easiest way to run OpenHands locally is using the CLI launcher with [uv](https://docs.astral.sh/uv/). This provides better isolation from your current project's virtual environment and is required for OpenHands' default MCP servers.
**Install uv** (if you haven't already):
See the [uv installation guide](https://docs.astral.sh/uv/getting-started/installation/) for the latest installation instructions for your platform.
**Launch OpenHands**:
```bash
# Launch the GUI server
uvx --python 3.12 --from openhands-ai openhands serve
# Or launch the CLI
uvx --python 3.12 --from openhands-ai openhands
```
You'll find OpenHands running at [http://localhost:3000](http://localhost:3000) (for GUI mode)!
### Option 2: Docker
<details>
<summary>Click to expand Docker command</summary>
You can also run OpenHands directly with Docker:
```bash
docker pull docker.all-hands.dev/all-hands-ai/runtime:0.38-nikolaik
docker pull docker.all-hands.dev/all-hands-ai/runtime:0.55-nikolaik
docker run -it --rm --pull=always \
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.38-nikolaik \
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.55-nikolaik \
-e LOG_ALL_EVENTS=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands-state:/.openhands-state \
-v ~/.openhands:/.openhands \
-p 3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands-app \
docker.all-hands.dev/all-hands-ai/openhands:0.38
docker.all-hands.dev/all-hands-ai/openhands:0.55
```
You'll find OpenHands running at [http://localhost:3000](http://localhost:3000)!
</details>
> **Note**: If you used OpenHands before version 0.44, you may want to run `mv ~/.openhands-state ~/.openhands` to migrate your conversation history to the new location.
> [!WARNING]
> On a public network? See our [Hardened Docker Installation Guide](https://docs.all-hands.dev/usage/runtimes/docker#hardened-docker-installation)
> to secure your deployment by restricting network binding and implementing additional security measures.
### Getting Started
When you open the application, you'll be asked to choose an LLM provider and add an API key.
[Anthropic's Claude 3.7 Sonnet](https://www.anthropic.com/api) (`anthropic/claude-3-7-sonnet-20250219`)
works best, but you have [many options](https://docs.all-hands.dev/modules/usage/llms).
[Anthropic's Claude Sonnet 4](https://www.anthropic.com/api) (`anthropic/claude-sonnet-4-20250514`)
works best, but you have [many options](https://docs.all-hands.dev/usage/llms).
See the [Running OpenHands](https://docs.all-hands.dev/usage/installation) guide for
system requirements and more information.
## 💡 Other ways to run OpenHands
> [!CAUTION]
> [!WARNING]
> OpenHands is meant to be run by a single user on their local workstation.
> It is not appropriate for multi-tenant deployments where multiple users share the same instance. There is no built-in authentication, isolation, or scalability.
>
> If you're interested in running OpenHands in a multi-tenant environment, please
> [get in touch with us](https://docs.google.com/forms/d/e/1FAIpQLSet3VbGaz8z32gW9Wm-Grl4jpt5WgMXPgJ4EDPVmCETCBpJtQ/viewform)
> for advanced deployment options.
> If you're interested in running OpenHands in a multi-tenant environment, check out the source-available, commercially-licensed
> [OpenHands Cloud Helm Chart](https://github.com/all-Hands-AI/OpenHands-cloud)
You can also [connect OpenHands to your local filesystem](https://docs.all-hands.dev/modules/usage/runtimes/docker#connecting-to-your-filesystem),
run OpenHands in a scriptable [headless mode](https://docs.all-hands.dev/modules/usage/how-to/headless-mode),
interact with it via a [friendly CLI](https://docs.all-hands.dev/modules/usage/how-to/cli-mode),
or run it on tagged issues with [a github action](https://docs.all-hands.dev/modules/usage/how-to/github-action).
You can [connect OpenHands to your local filesystem](https://docs.all-hands.dev/usage/runtimes/docker#connecting-to-your-filesystem),
interact with it via a [friendly CLI](https://docs.all-hands.dev/usage/how-to/cli-mode),
run OpenHands in a scriptable [headless mode](https://docs.all-hands.dev/usage/how-to/headless-mode),
or run it on tagged issues with [a github action](https://docs.all-hands.dev/usage/how-to/github-action).
Visit [Running OpenHands](https://docs.all-hands.dev/modules/usage/installation) for more information and setup instructions.
Visit [Running OpenHands](https://docs.all-hands.dev/usage/installation) for more information and setup instructions.
If you want to modify the OpenHands source code, check out [Development.md](https://github.com/All-Hands-AI/OpenHands/blob/main/Development.md).
Having issues? The [Troubleshooting Guide](https://docs.all-hands.dev/modules/usage/troubleshooting) can help.
Having issues? The [Troubleshooting Guide](https://docs.all-hands.dev/usage/troubleshooting) can help.
## 📖 Documentation
To learn more about the project, and for tips on using OpenHands,
check out our [documentation](https://docs.all-hands.dev/modules/usage/getting-started).
check out our [documentation](https://docs.all-hands.dev/usage/getting-started).
There you'll find resources on how to use different LLM providers,
troubleshooting resources, and advanced configuration options.
@@ -104,7 +142,7 @@ troubleshooting resources, and advanced configuration options.
OpenHands is a community-driven project, and we welcome contributions from everyone. We do most of our communication
through Slack, so this is the best place to start, but we also are happy to have you contact us on Discord or Github:
- [Join our Slack workspace](https://join.slack.com/t/openhands-ai/shared_invite/zt-34zm4j0gj-Qz5kRHoca8DFCbqXPS~f_A) - Here we talk about research, architecture, and future development.
- [Join our Slack workspace](https://join.slack.com/t/openhands-ai/shared_invite/zt-3847of6xi-xuYJIPa6YIPg4ElbDWbtSA) - Here we talk about research, architecture, and future development.
- [Join our Discord server](https://discord.gg/ESHStjSjD4) - This is a community-run server for general discussion, questions, and feedback.
- [Read or post Github Issues](https://github.com/All-Hands-AI/OpenHands/issues) - Check out the issues we're working on, or add your own ideas.
@@ -122,7 +160,7 @@ See the monthly OpenHands roadmap [here](https://github.com/orgs/All-Hands-AI/pr
## 📜 License
Distributed under the MIT License. See [`LICENSE`](./LICENSE) for more information.
Distributed under the MIT License, with the exception of the `enterprise/` folder. See [`LICENSE`](./LICENSE) for more information.
## 🙏 Acknowledgements
@@ -133,13 +171,12 @@ For a list of open source projects and licenses used in OpenHands, please see ou
## 📚 Cite
```
@misc{openhands,
title={{OpenHands: An Open Platform for AI Software Developers as Generalist Agents}},
author={Xingyao Wang and Boxuan Li and Yufan Song and Frank F. Xu and Xiangru Tang and Mingchen Zhuge and Jiayi Pan and Yueqi Song and Bowen Li and Jaskirat Singh and Hoang H. Tran and Fuqiang Li and Ren Ma and Mingzhang Zheng and Bill Qian and Yanjun Shao and Niklas Muennighoff and Yizhe Zhang and Binyuan Hui and Junyang Lin and Robert Brennan and Hao Peng and Heng Ji and Graham Neubig},
year={2024},
eprint={2407.16741},
archivePrefix={arXiv},
primaryClass={cs.SE},
url={https://arxiv.org/abs/2407.16741},
@inproceedings{
wang2025openhands,
title={OpenHands: An Open Platform for {AI} Software Developers as Generalist Agents},
author={Xingyao Wang and Boxuan Li and Yufan Song and Frank F. Xu and Xiangru Tang and Mingchen Zhuge and Jiayi Pan and Yueqi Song and Bowen Li and Jaskirat Singh and Hoang H. Tran and Fuqiang Li and Ren Ma and Mingzhang Zheng and Bill Qian and Yanjun Shao and Niklas Muennighoff and Yizhe Zhang and Binyuan Hui and Junyang Lin and Robert Brennan and Hao Peng and Heng Ji and Graham Neubig},
booktitle={The Thirteenth International Conference on Learning Representations},
year={2025},
url={https://openreview.net/forum?id=OJd3ayDDoF}
}
```
+148
View File
@@ -0,0 +1,148 @@
<a name="readme-top"></a>
<div align="center">
<img src="./docs/static/img/logo.png" alt="Logo" width="200">
<h1 align="center">OpenHands: 少写代码,多做事</h1>
</div>
<div align="center">
<a href="https://github.com/All-Hands-AI/OpenHands/graphs/contributors"><img src="https://img.shields.io/github/contributors/All-Hands-AI/OpenHands?style=for-the-badge&color=blue" alt="Contributors"></a>
<a href="https://github.com/All-Hands-AI/OpenHands/stargazers"><img src="https://img.shields.io/github/stars/All-Hands-AI/OpenHands?style=for-the-badge&color=blue" alt="Stargazers"></a>
<a href="https://github.com/All-Hands-AI/OpenHands/blob/main/LICENSE"><img src="https://img.shields.io/github/license/All-Hands-AI/OpenHands?style=for-the-badge&color=blue" alt="MIT License"></a>
<br/>
<a href="https://join.slack.com/t/openhands-ai/shared_invite/zt-3847of6xi-xuYJIPa6YIPg4ElbDWbtSA"><img src="https://img.shields.io/badge/Slack-Join%20Us-red?logo=slack&logoColor=white&style=for-the-badge" alt="加入我们的Slack社区"></a>
<a href="https://discord.gg/ESHStjSjD4"><img src="https://img.shields.io/badge/Discord-Join%20Us-purple?logo=discord&logoColor=white&style=for-the-badge" alt="加入我们的Discord社区"></a>
<a href="https://github.com/All-Hands-AI/OpenHands/blob/main/CREDITS.md"><img src="https://img.shields.io/badge/Project-Credits-blue?style=for-the-badge&color=FFE165&logo=github&logoColor=white" alt="致谢"></a>
<br/>
<a href="https://docs.all-hands.dev/usage/getting-started"><img src="https://img.shields.io/badge/Documentation-000?logo=googledocs&logoColor=FFE165&style=for-the-badge" alt="查看文档"></a>
<a href="https://arxiv.org/abs/2407.16741"><img src="https://img.shields.io/badge/Paper%20on%20Arxiv-000?logoColor=FFE165&logo=arxiv&style=for-the-badge" alt="Arxiv论文"></a>
<a href="https://docs.google.com/spreadsheets/d/1wOUdFCMyY6Nt0AIqF705KN4JKOWgeI4wUGUP60krXXs/edit?gid=0#gid=0"><img src="https://img.shields.io/badge/Benchmark%20score-000?logoColor=FFE165&logo=huggingface&style=for-the-badge" alt="评估基准分数"></a>
<hr>
</div>
欢迎使用OpenHands(前身为OpenDevin),这是一个由AI驱动的软件开发代理平台。
OpenHands代理可以完成人类开发者能做的任何事情:修改代码、运行命令、浏览网页、调用API,甚至从StackOverflow复制代码片段。
在[docs.all-hands.dev](https://docs.all-hands.dev)了解更多信息,或[注册OpenHands Cloud](https://app.all-hands.dev)开始使用。
> [!IMPORTANT]
> 在工作中使用OpenHands?我们很想与您交流!填写
> [这份简短表格](https://docs.google.com/forms/d/e/1FAIpQLSet3VbGaz8z32gW9Wm-Grl4jpt5WgMXPgJ4EDPVmCETCBpJtQ/viewform)
> 加入我们的设计合作伙伴计划,您将获得商业功能的早期访问权限,并有机会对我们的产品路线图提供意见。
![应用截图](./docs/static/img/screenshot.png)
## ☁️ OpenHands Cloud
开始使用OpenHands的最简单方式是在[OpenHands Cloud](https://app.all-hands.dev)上,
新用户可获得$50的免费额度。
## 💻 在本地运行OpenHands
OpenHands也可以使用Docker在本地系统上运行。
查看[运行OpenHands](https://docs.all-hands.dev/usage/installation)指南了解
系统要求和更多信息。
> [!WARNING]
> 在公共网络上?请参阅我们的[强化Docker安装指南](https://docs.all-hands.dev/usage/runtimes/docker#hardened-docker-installation)
> 通过限制网络绑定和实施其他安全措施来保护您的部署。
```bash
docker pull docker.all-hands.dev/all-hands-ai/runtime:0.55-nikolaik
docker run -it --rm --pull=always \
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.55-nikolaik \
-e LOG_ALL_EVENTS=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands:/.openhands \
-p 3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands-app \
docker.all-hands.dev/all-hands-ai/openhands:0.55
```
> **注意**: 如果您在0.44版本之前使用过OpenHands,您可能需要运行 `mv ~/.openhands-state ~/.openhands` 来将对话历史迁移到新位置。
您将在[http://localhost:3000](http://localhost:3000)找到运行中的OpenHands
打开应用程序时,您将被要求选择一个LLM提供商并添加API密钥。
[Anthropic的Claude Sonnet 4](https://www.anthropic.com/api)`anthropic/claude-sonnet-4-20250514`
效果最佳,但您还有[许多选择](https://docs.all-hands.dev/usage/llms)。
## 💡 运行OpenHands的其他方式
> [!CAUTION]
> OpenHands旨在由单个用户在其本地工作站上运行。
> 它不适合多租户部署,即多个用户共享同一实例。没有内置的身份验证、隔离或可扩展性。
>
> 如果您有兴趣在多租户环境中运行OpenHands,请
> [与我们联系](https://docs.google.com/forms/d/e/1FAIpQLSet3VbGaz8z32gW9Wm-Grl4jpt5WgMXPgJ4EDPVmCETCBpJtQ/viewform)
> 了解高级部署选项。
您还可以[将OpenHands连接到本地文件系统](https://docs.all-hands.dev/usage/runtimes/docker#connecting-to-your-filesystem)
以可编程的[无头模式](https://docs.all-hands.dev/usage/how-to/headless-mode)运行OpenHands
通过[友好的CLI](https://docs.all-hands.dev/usage/how-to/cli-mode)与其交互,
或使用[GitHub Action](https://docs.all-hands.dev/usage/how-to/github-action)在标记的问题上运行它。
访问[运行OpenHands](https://docs.all-hands.dev/usage/installation)获取更多信息和设置说明。
如果您想修改OpenHands源代码,请查看[Development.md](https://github.com/All-Hands-AI/OpenHands/blob/main/Development.md)。
遇到问题?[故障排除指南](https://docs.all-hands.dev/usage/troubleshooting)可以提供帮助。
## 📖 文档
<a href="https://deepwiki.com/All-Hands-AI/OpenHands"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki" title="DeepWiki自动生成文档"></a>
要了解有关项目的更多信息,以及使用OpenHands的技巧,
请查看我们的[文档](https://docs.all-hands.dev/usage/getting-started)。
在那里,您将找到有关如何使用不同LLM提供商、
故障排除资源和高级配置选项的资源。
## 🤝 如何加入社区
OpenHands是一个社区驱动的项目,我们欢迎每个人的贡献。我们大部分沟通
通过Slack进行,因此这是开始的最佳场所,但我们也很乐意您通过Discord或Github与我们联系:
- [加入我们的Slack工作空间](https://join.slack.com/t/openhands-ai/shared_invite/zt-3847of6xi-xuYJIPa6YIPg4ElbDWbtSA) - 这里我们讨论研究、架构和未来发展。
- [加入我们的Discord服务器](https://discord.gg/ESHStjSjD4) - 这是一个社区运营的服务器,用于一般讨论、问题和反馈。
- [阅读或发布Github问题](https://github.com/All-Hands-AI/OpenHands/issues) - 查看我们正在处理的问题,或添加您自己的想法。
在[COMMUNITY.md](./COMMUNITY.md)中了解更多关于社区的信息,或在[CONTRIBUTING.md](./CONTRIBUTING.md)中找到有关贡献的详细信息。
## 📈 进展
在[这里](https://github.com/orgs/All-Hands-AI/projects/1)查看OpenHands月度路线图(每月月底在维护者会议上更新)。
<p align="center">
<a href="https://star-history.com/#All-Hands-AI/OpenHands&Date">
<img src="https://api.star-history.com/svg?repos=All-Hands-AI/OpenHands&type=Date" width="500" alt="Star History Chart">
</a>
</p>
## 📜 许可证
根据MIT许可证分发。有关更多信息,请参阅[`LICENSE`](./LICENSE)。
## 🙏 致谢
OpenHands由大量贡献者构建,每一份贡献都备受感谢!我们还借鉴了其他开源项目,对他们的工作深表感谢。
有关OpenHands中使用的开源项目和许可证列表,请参阅我们的[CREDITS.md](./CREDITS.md)文件。
## 📚 引用
```
@misc{openhands,
title={{OpenHands: An Open Platform for AI Software Developers as Generalist Agents}},
author={Xingyao Wang and Boxuan Li and Yufan Song and Frank F. Xu and Xiangru Tang and Mingchen Zhuge and Jiayi Pan and Yueqi Song and Bowen Li and Jaskirat Singh and Hoang H. Tran and Fuqiang Li and Ren Ma and Mingzhang Zheng and Bill Qian and Yanjun Shao and Niklas Muennighoff and Yizhe Zhang and Binyuan Hui and Junyang Lin and Robert Brennan and Hao Peng and Heng Ji and Graham Neubig},
year={2024},
eprint={2407.16741},
archivePrefix={arXiv},
primaryClass={cs.SE},
url={https://arxiv.org/abs/2407.16741},
}
```
+60
View File
@@ -0,0 +1,60 @@
<a name="readme-top"></a>
<div align="center">
<img src="./docs/static/img/logo.png" alt="Logo" width="200">
<h1 align="center">OpenHands: コードを減らして、もっと作ろう</h1>
</div>
<div align="center">
<a href="https://github.com/All-Hands-AI/OpenHands/graphs/contributors"><img src="https://img.shields.io/github/contributors/All-Hands-AI/OpenHands?style=for-the-badge&color=blue" alt="Contributors"></a>
<a href="https://github.com/All-Hands-AI/OpenHands/stargazers"><img src="https://img.shields.io/github/stars/All-Hands-AI/OpenHands?style=for-the-badge&color=blue" alt="Stargazers"></a>
<a href="https://github.com/All-Hands-AI/OpenHands/blob/main/LICENSE"><img src="https://img.shields.io/github/license/All-Hands-AI/OpenHands?style=for-the-badge&color=blue" alt="MIT License"></a>
<br/>
<a href="https://join.slack.com/t/openhands-ai/shared_invite/zt-3847of6xi-xuYJIPa6YIPg4ElbDWbtSA"><img src="https://img.shields.io/badge/Slack-Join%20Us-red?logo=slack&logoColor=white&style=for-the-badge" alt="Slackコミュニティに参加"></a>
<a href="https://discord.gg/ESHStjSjD4"><img src="https://img.shields.io/badge/Discord-Join%20Us-purple?logo=discord&logoColor=white&style=for-the-badge" alt="Discordコミュニティに参加"></a>
<a href="https://github.com/All-Hands-AI/OpenHands/blob/main/CREDITS.md"><img src="https://img.shields.io/badge/Project-Credits-blue?style=for-the-badge&color=FFE165&logo=github&logoColor=white" alt="クレジット"></a>
<br/>
<a href="https://docs.all-hands.dev/usage/getting-started"><img src="https://img.shields.io/badge/Documentation-000?logo=googledocs&logoColor=FFE165&style=for-the-badge" alt="ドキュメントを見る"></a>
<a href="https://arxiv.org/abs/2407.16741"><img src="https://img.shields.io/badge/Paper%20on%20Arxiv-000?logoColor=FFE165&logo=arxiv&style=for-the-badge" alt="Arxiv論文"></a>
<a href="https://docs.google.com/spreadsheets/d/1wOUdFCMyY6Nt0AIqF705KN4JKOWgeI4wUGUP60krXXs/edit?gid=0#gid=0"><img src="https://img.shields.io/badge/Benchmark%20score-000?logoColor=FFE165&logo=huggingface&style=for-the-badge" alt="評価ベンチマークスコア"></a>
<hr>
</div>
OpenHands(旧OpenDevin)へようこそ。これはAIが駆動するソフトウェア開発エージェントのプラットフォームです。
OpenHandsのエージェントは人間の開発者ができることは何でもこなします。コードを修正し、コマンドを実行し、ウェブを閲覧し、APIを呼び出し、StackOverflowからコードスニペットをコピーすることさえできます。
詳細は[docs.all-hands.dev](https://docs.all-hands.dev)をご覧いただくか、[OpenHands Cloud](https://app.all-hands.dev)に登録して始めましょう。
> [!IMPORTANT]
> 仕事でOpenHandsを使っていますか?ぜひお話を聞かせてください。[こちらの短いフォーム](https://docs.google.com/forms/d/e/1FAIpQLSet3VbGaz8z32gW9Wm-Grl4jpt5WgMXPgJ4EDPVmCETCBpJtQ/viewform)にご記入いただき、Design Partnerプログラムにご参加ください。商用機能の早期アクセスや製品ロードマップへのフィードバックの機会を提供します。
![アプリのスクリーンショット](./docs/static/img/screenshot.png)
## ☁️ OpenHands Cloud
OpenHandsを始める最も簡単な方法は[OpenHands Cloud](https://app.all-hands.dev)を利用することです。新規ユーザーには50ドル分の無料クレジットが付与されます。
## 💻 OpenHandsをローカルで実行する
OpenHandsはDockerを利用してローカル環境でも実行できます。システム要件や詳細については[Running OpenHands](https://docs.all-hands.dev/usage/installation)ガイドをご覧ください。
> [!WARNING]
> 公共ネットワークで実行していますか?[Hardened Docker Installation Guide](https://docs.all-hands.dev/usage/runtimes/docker#hardened-docker-installation)を参照して、ネットワークバインディングの制限や追加のセキュリティ対策を実施してください。
```bash
docker pull docker.all-hands.dev/all-hands-ai/runtime:0.55-nikolaik
docker run -it --rm --pull=always \
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.55-nikolaik \
-e LOG_ALL_EVENTS=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands:/.openhands \
-p 3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands-app \
docker.all-hands.dev/all-hands-ai/openhands:0.55
```
**注**: バージョン0.44以前のOpenHandsを使用していた場合は、会話履歴を移行するために `mv ~/.openhands-state ~/.openhands` を実行してください。
OpenHandsは[http://localhost:3000](http://localhost:3000)で起動します!
+113
View File
@@ -0,0 +1,113 @@
import os
import pathlib
import subprocess
# This script is intended to be run by Poetry during the build process.
# Define the expected name of the .vsix file based on the extension's package.json
# This should match the name and version in openhands-vscode/package.json
EXTENSION_NAME = 'openhands-vscode'
EXTENSION_VERSION = '0.0.1'
VSIX_FILENAME = f'{EXTENSION_NAME}-{EXTENSION_VERSION}.vsix'
# Paths
ROOT_DIR = pathlib.Path(__file__).parent.resolve()
VSCODE_EXTENSION_DIR = ROOT_DIR / 'openhands' / 'integrations' / 'vscode'
def check_node_version():
"""Check if Node.js version is sufficient for building the extension."""
try:
result = subprocess.run(
['node', '--version'], capture_output=True, text=True, check=True
)
version_str = result.stdout.strip()
# Extract major version number (e.g., "v12.22.9" -> 12)
major_version = int(version_str.lstrip('v').split('.')[0])
return major_version >= 18 # Align with frontend actual usage (18.20.1)
except (subprocess.CalledProcessError, FileNotFoundError, ValueError):
return False
def build_vscode_extension():
"""Builds the VS Code extension."""
vsix_path = VSCODE_EXTENSION_DIR / VSIX_FILENAME
# Check if VSCode extension build is disabled via environment variable
if os.environ.get('SKIP_VSCODE_BUILD', '').lower() in ('1', 'true', 'yes'):
print('--- Skipping VS Code extension build (SKIP_VSCODE_BUILD is set) ---')
if vsix_path.exists():
print(f'--- Using existing VS Code extension: {vsix_path} ---')
else:
print('--- No pre-built VS Code extension found ---')
return
# Check Node.js version - if insufficient, use pre-built extension as fallback
if not check_node_version():
print('--- Warning: Node.js version < 18 detected or Node.js not found ---')
print('--- Skipping VS Code extension build (requires Node.js >= 18) ---')
print('--- Using pre-built extension if available ---')
if not vsix_path.exists():
print('--- Warning: No pre-built VS Code extension found ---')
print('--- VS Code extension will not be available ---')
else:
print(f'--- Using pre-built VS Code extension: {vsix_path} ---')
return
print(f'--- Building VS Code extension in {VSCODE_EXTENSION_DIR} ---')
try:
# Ensure npm dependencies are installed
print('--- Running npm install for VS Code extension ---')
subprocess.run(
['npm', 'install'],
cwd=VSCODE_EXTENSION_DIR,
check=True,
shell=os.name == 'nt',
)
# Package the extension
print(f'--- Packaging VS Code extension ({VSIX_FILENAME}) ---')
subprocess.run(
['npm', 'run', 'package-vsix'],
cwd=VSCODE_EXTENSION_DIR,
check=True,
shell=os.name == 'nt',
)
# Verify the generated .vsix file exists
if not vsix_path.exists():
raise FileNotFoundError(
f'VS Code extension package not found after build: {vsix_path}'
)
print(f'--- VS Code extension built successfully: {vsix_path} ---')
except subprocess.CalledProcessError as e:
print(f'--- Warning: Failed to build VS Code extension: {e} ---')
print('--- Continuing without building extension ---')
if not vsix_path.exists():
print('--- Warning: No pre-built VS Code extension found ---')
print('--- VS Code extension will not be available ---')
def build(setup_kwargs):
"""This function is called by Poetry during the build process.
`setup_kwargs` is a dictionary that will be passed to `setuptools.setup()`.
"""
print('--- Running custom Poetry build script (build_vscode.py) ---')
# Build the VS Code extension and place the .vsix file
build_vscode_extension()
# Poetry will handle including files based on pyproject.toml `include` patterns.
# Ensure openhands/integrations/vscode/*.vsix is included there.
print('--- Custom Poetry build script (build_vscode.py) finished ---')
if __name__ == '__main__':
print('Running build_vscode.py directly for testing VS Code extension packaging...')
build_vscode_extension()
print('Direct execution of build_vscode.py finished.')
+92 -18
View File
@@ -10,18 +10,7 @@
# General core configurations
##############################################################################
[core]
# API key for E2B
#e2b_api_key = ""
# API key for Modal
#modal_api_token_id = ""
#modal_api_token_secret = ""
# API key for Daytona
#daytona_api_key = ""
# Daytona Target
#daytona_target = ""
# API keys and configuration for core services
# Base path for the workspace
#workspace_base = "./workspace"
@@ -29,9 +18,6 @@
# Cache directory path
#cache_dir = "/tmp/cache"
# Reasoning effort for o1 models (low, medium, high, or not set)
#reasoning_effort = "medium"
# Debugging enabled
#debug = false
@@ -60,11 +46,14 @@
# Maximum file size for uploads, in megabytes
#file_uploads_max_file_size_mb = 0
# Enable the browser environment
#enable_browser = true
# Maximum budget per task, 0.0 means no limit
#max_budget_per_task = 0.0
# Maximum number of iterations
#max_iterations = 250
#max_iterations = 500
# Path to mount the workspace in the sandbox
#workspace_mount_path_in_sandbox = "/workspace"
@@ -127,6 +116,9 @@ api_key = ""
# API version
#api_version = ""
# Reasoning effort for OpenAI o-series models (low, medium, high, or not set)
#reasoning_effort = "medium"
# Cost per input token
#input_cost_per_token = 0.0
@@ -201,6 +193,27 @@ model = "gpt-4o"
#native_tool_calling = None
# Safety settings for models that support them (e.g., Mistral AI, Gemini)
# Example for Mistral AI:
# safety_settings = [
# { "category" = "hate", "threshold" = "low" },
# { "category" = "harassment", "threshold" = "low" },
# { "category" = "sexual", "threshold" = "low" },
# { "category" = "dangerous", "threshold" = "low" }
# ]
#
# Example for Gemini:
# safety_settings = [
# { "category" = "HARM_CATEGORY_HARASSMENT", "threshold" = "BLOCK_NONE" },
# { "category" = "HARM_CATEGORY_HATE_SPEECH", "threshold" = "BLOCK_NONE" },
# { "category" = "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold" = "BLOCK_NONE" },
# { "category" = "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold" = "BLOCK_NONE" }
# ]
#safety_settings = []
[llm.draft_editor]
# The number of times llm_editor tries to fix an error when editing.
correct_num = 5
[llm.gpt4o-mini]
api_key = ""
@@ -216,6 +229,7 @@ model = "gpt-4o"
[agent]
# Whether the browsing tool is enabled
# Note: when this is set to true, enable_browser in the core config must also be true
enable_browsing = true
# Whether the LLM draft editor is enabled
@@ -250,6 +264,9 @@ enable_finish = true
# length limit
enable_history_truncation = true
# Whether the condensation request tool is enabled
enable_condensation_request = false
[agent.RepoExplorerAgent]
# Example: use a cheaper model for RepoExplorerAgent to reduce cost, especially
# useful when an agent doesn't demand high quality but uses a lot of tokens
@@ -318,6 +335,9 @@ classpath = "my_package.my_module.MyCustomAgent"
# Enable GPU support in the runtime
#enable_gpu = false
# When there are multiple cards, you can specify the GPU by ID
#cuda_visible_devices = ''
# Additional Docker runtime kwargs
#docker_runtime_kwargs = {}
@@ -325,6 +345,15 @@ classpath = "my_package.my_module.MyCustomAgent"
# Useful when deploying OpenHands in a remote machine where you need to expose a specific port.
#vscode_port = 41234
# Volume mounts in the format 'host_path:container_path[:mode]'
# e.g. '/my/host/dir:/workspace:rw'
# Multiple mounts can be specified using commas
# e.g. '/path1:/workspace/path1,/path2:/workspace/path2:ro'
# Configure volumes under the [sandbox] section:
# [sandbox]
# volumes = "/my/host/dir:/workspace:rw,/path2:/workspace/path2:ro"
#################################### Security ###################################
# Configuration for security features
##############################################################################
@@ -334,10 +363,11 @@ classpath = "my_package.my_module.MyCustomAgent"
#confirmation_mode = false
# The security analyzer to use (For Headless / CLI only - In Web this is overridden by Session Init)
#security_analyzer = ""
# Available options: 'llm' (default), 'invariant'
#security_analyzer = "llm"
# Whether to enable security analyzer
#enable_security_analyzer = false
#enable_security_analyzer = true
#################################### Condenser #################################
# Condensers control how conversation history is managed and compressed when
@@ -406,3 +436,47 @@ type = "noop"
# Configuration for the evaluation, please refer to the specific evaluation
# plugin for the available options
##############################################################################
########################### Kubernetes #######################################
# Kubernetes configuration when using the Kubernetes runtime
##############################################################################
[kubernetes]
# The Kubernetes namespace to use for OpenHands resources
#namespace = "default"
# Domain for ingress resources
#ingress_domain = "localhost"
# Size of the persistent volume claim
#pvc_storage_size = "2Gi"
# Storage class for persistent volume claims
#pvc_storage_class = "standard"
# CPU request for runtime pods
#resource_cpu_request = "1"
# Memory request for runtime pods
#resource_memory_request = "1Gi"
# Memory limit for runtime pods
#resource_memory_limit = "2Gi"
# Optional name of image pull secret for private registries
#image_pull_secret = ""
# Optional name of TLS secret for ingress
#ingress_tls_secret = ""
# Optional node selector key for pod scheduling
#node_selector_key = ""
# Optional node selector value for pod scheduling
#node_selector_val = ""
# Optional YAML string defining pod tolerations
#tolerations_yaml = ""
# Run the runtime sandbox container in privileged mode for use with docker-in-docker
#privileged = false
+28 -31
View File
@@ -1,16 +1,16 @@
ARG OPENHANDS_BUILD_VERSION=dev
FROM node:21.7.2-bookworm-slim AS frontend-builder
FROM node:24.3.0-bookworm-slim AS frontend-builder
WORKDIR /app
COPY ./frontend/package.json frontend/package-lock.json ./
RUN npm install -g npm@10.5.1
COPY frontend/package.json frontend/package-lock.json ./
RUN npm ci
COPY ./frontend ./
COPY frontend ./
RUN npm run build
FROM python:3.12.3-slim AS backend-builder
FROM python:3.12.10-slim AS base
FROM base AS backend-builder
WORKDIR /app
ENV PYTHONPATH='/app'
@@ -21,18 +21,19 @@ ENV POETRY_NO_INTERACTION=1 \
POETRY_CACHE_DIR=/tmp/poetry_cache
RUN apt-get update -y \
&& apt-get install -y curl make git build-essential \
&& python3 -m pip install poetry==1.8.2 --break-system-packages
&& apt-get install -y curl make git build-essential jq gettext \
&& python3 -m pip install poetry --break-system-packages
COPY ./pyproject.toml ./poetry.lock ./
COPY pyproject.toml poetry.lock ./
RUN touch README.md
RUN export POETRY_CACHE_DIR && poetry install --without evaluation --no-root && rm -rf $POETRY_CACHE_DIR
RUN export POETRY_CACHE_DIR && poetry install --no-root && rm -rf $POETRY_CACHE_DIR
FROM python:3.12.3-slim AS openhands-app
FROM base AS openhands-app
WORKDIR /app
ARG OPENHANDS_BUILD_VERSION #re-declare for this section
# re-declare for this section
ARG OPENHANDS_BUILD_VERSION
ENV RUN_AS_OPENHANDS=true
# A random number--we need this to be different from the user's UID on the host machine
@@ -43,7 +44,8 @@ ENV WORKSPACE_BASE=/opt/workspace_base
ENV OPENHANDS_BUILD_VERSION=$OPENHANDS_BUILD_VERSION
ENV SANDBOX_USER_ID=0
ENV FILE_STORE=local
ENV FILE_STORE_PATH=/.openhands-state
ENV FILE_STORE_PATH=/.openhands
ENV INIT_GIT_IN_EMPTY_WORKSPACE=1
RUN mkdir -p $FILE_STORE_PATH
RUN mkdir -p $WORKSPACE_BASE
@@ -56,39 +58,34 @@ RUN sed -i 's/^UID_MIN.*/UID_MIN 499/' /etc/login.defs
# Default is 60000, but we've seen up to 200000
RUN sed -i 's/^UID_MAX.*/UID_MAX 1000000/' /etc/login.defs
RUN groupadd app
RUN useradd -l -m -u $OPENHANDS_USER_ID -s /bin/bash openhands && \
usermod -aG app openhands && \
RUN groupadd --gid $OPENHANDS_USER_ID openhands
RUN useradd -l -m -u $OPENHANDS_USER_ID --gid $OPENHANDS_USER_ID -s /bin/bash openhands && \
usermod -aG openhands openhands && \
usermod -aG sudo openhands && \
echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
RUN chown -R openhands:app /app && chmod -R 770 /app
RUN sudo chown -R openhands:app $WORKSPACE_BASE && sudo chmod -R 770 $WORKSPACE_BASE
RUN chown -R openhands:openhands /app && chmod -R 770 /app
RUN sudo chown -R openhands:openhands $WORKSPACE_BASE && sudo chmod -R 770 $WORKSPACE_BASE
USER openhands
ENV VIRTUAL_ENV=/app/.venv \
PATH="/app/.venv/bin:$PATH" \
PYTHONPATH='/app'
COPY --chown=openhands:app --chmod=770 --from=backend-builder ${VIRTUAL_ENV} ${VIRTUAL_ENV}
COPY --chown=openhands:openhands --chmod=770 --from=backend-builder ${VIRTUAL_ENV} ${VIRTUAL_ENV}
COPY --chown=openhands:app --chmod=770 ./microagents ./microagents
COPY --chown=openhands:app --chmod=770 ./openhands ./openhands
COPY --chown=openhands:app --chmod=777 ./openhands/runtime/plugins ./openhands/runtime/plugins
COPY --chown=openhands:app --chmod=770 ./openhands/agenthub ./openhands/agenthub
COPY --chown=openhands:app ./pyproject.toml ./pyproject.toml
COPY --chown=openhands:app ./poetry.lock ./poetry.lock
COPY --chown=openhands:app ./README.md ./README.md
COPY --chown=openhands:app ./MANIFEST.in ./MANIFEST.in
COPY --chown=openhands:app ./LICENSE ./LICENSE
COPY --chown=openhands:openhands --chmod=770 ./microagents ./microagents
COPY --chown=openhands:openhands --chmod=770 ./openhands ./openhands
COPY --chown=openhands:openhands --chmod=777 ./openhands/runtime/plugins ./openhands/runtime/plugins
COPY --chown=openhands:openhands pyproject.toml poetry.lock README.md MANIFEST.in LICENSE ./
# This is run as "openhands" user, and will create __pycache__ with openhands:openhands ownership
RUN python openhands/core/download.py # No-op to download assets
# Add this line to set group ownership of all files/directories not already in "app" group
# openhands:openhands -> openhands:app
RUN find /app \! -group app -exec chgrp app {} +
# openhands:openhands -> openhands:openhands
RUN find /app \! -group openhands -exec chgrp openhands {} +
COPY --chown=openhands:app --chmod=770 --from=frontend-builder /app/build ./frontend/build
COPY --chown=openhands:app --chmod=770 ./containers/app/entrypoint.sh /app/entrypoint.sh
COPY --chown=openhands:openhands --chmod=770 --from=frontend-builder /app/build ./frontend/build
COPY --chown=openhands:openhands --chmod=770 ./containers/app/entrypoint.sh /app/entrypoint.sh
USER root
+13 -1
View File
@@ -23,6 +23,18 @@ if [ -z "$WORKSPACE_MOUNT_PATH" ]; then
unset WORKSPACE_BASE
fi
if [[ "$INSTALL_THIRD_PARTY_RUNTIMES" == "true" ]]; then
echo "Downloading and installing third_party_runtimes..."
echo "Warning: Third-party runtimes are provided as-is, not actively supported and may be removed in future releases."
if pip install 'openhands-ai[third_party_runtimes]' -qqq 2> >(tee /dev/stderr); then
echo "third_party_runtimes installed successfully."
else
echo "Failed to install third_party_runtimes." >&2
exit 1
fi
fi
if [[ "$SANDBOX_USER_ID" -eq 0 ]]; then
echo "Running OpenHands as root"
export RUN_AS_OPENHANDS=false
@@ -42,7 +54,7 @@ else
fi
fi
fi
usermod -aG app enduser
usermod -aG openhands enduser
# get the user group of /var/run/docker.sock and set openhands to that group
DOCKER_SOCKET_GID=$(stat -c '%g' /var/run/docker.sock)
echo "Docker socket group id: $DOCKER_SOCKET_GID"
+2 -1
View File
@@ -10,8 +10,9 @@ services:
environment:
- BACKEND_HOST=${BACKEND_HOST:-"0.0.0.0"}
- SANDBOX_API_HOSTNAME=host.docker.internal
- DOCKER_HOST_ADDR=host.docker.internal
#
- SANDBOX_RUNTIME_CONTAINER_IMAGE=${SANDBOX_RUNTIME_CONTAINER_IMAGE:-ghcr.io/all-hands-ai/runtime:0.38-nikolaik}
- SANDBOX_RUNTIME_CONTAINER_IMAGE=${SANDBOX_RUNTIME_CONTAINER_IMAGE:-ghcr.io/all-hands-ai/runtime:0.55-nikolaik}
- SANDBOX_USER_ID=${SANDBOX_USER_ID:-1234}
- WORKSPACE_MOUNT_PATH=${WORKSPACE_BASE:-$PWD/workspace}
ports:
+16 -3
View File
@@ -3,10 +3,11 @@ repos:
rev: v5.0.0
hooks:
- id: trailing-whitespace
exclude: docs/modules/python
exclude: ^(docs/|modules/|python/|openhands-ui/|third_party/|enterprise/)
- id: end-of-file-fixer
exclude: docs/modules/python
exclude: ^(docs/|modules/|python/|openhands-ui/|third_party/|enterprise/)
- id: check-yaml
args: ["--allow-multiple-documents"]
- id: debug-statements
- repo: https://github.com/tox-dev/pyproject-fmt
@@ -27,17 +28,29 @@ repos:
entry: ruff check --config dev_config/python/ruff.toml
types_or: [python, pyi, jupyter]
args: [--fix, --unsafe-fixes]
exclude: ^(third_party/|enterprise/)
# Run the formatter.
- id: ruff-format
entry: ruff format --config dev_config/python/ruff.toml
types_or: [python, pyi, jupyter]
exclude: ^(third_party/|enterprise/)
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.15.0
hooks:
- id: mypy
additional_dependencies:
[types-requests, types-setuptools, types-pyyaml, types-toml]
[
types-requests,
types-setuptools,
types-pyyaml,
types-toml,
types-docker,
types-Markdown,
pydantic,
lxml,
]
# To see gaps add `--html-report mypy-report/`
entry: mypy --config-file dev_config/python/mypy.ini openhands/
always_run: true
pass_filenames: false
+6
View File
@@ -7,3 +7,9 @@ warn_unreachable = True
warn_redundant_casts = True
no_implicit_optional = True
strict_optional = True
# Exclude third-party runtime directory from type checking
exclude = (third_party/|enterprise/)
[mypy-openhands.memory.condenser.impl.*]
disable_error_code = override
+3
View File
@@ -1,3 +1,6 @@
# Exclude third-party runtime directory from linting
exclude = ["third_party/", "enterprise/"]
[lint]
select = [
"E",
+3 -3
View File
@@ -7,8 +7,8 @@ services:
image: openhands:latest
container_name: openhands-app-${DATE:-}
environment:
- SANDBOX_RUNTIME_CONTAINER_IMAGE=${SANDBOX_RUNTIME_CONTAINER_IMAGE:-docker.all-hands.dev/all-hands-ai/runtime:0.38-nikolaik}
#- SANDBOX_USER_ID=${SANDBOX_USER_ID:-1234} # enable this only if you want a specific non-root sandbox user but you will have to manually adjust permissions of openhands-state for this user
- SANDBOX_RUNTIME_CONTAINER_IMAGE=${SANDBOX_RUNTIME_CONTAINER_IMAGE:-docker.all-hands.dev/all-hands-ai/runtime:0.55-nikolaik}
#- SANDBOX_USER_ID=${SANDBOX_USER_ID:-1234} # enable this only if you want a specific non-root sandbox user but you will have to manually adjust permissions of ~/.openhands for this user
- WORKSPACE_MOUNT_PATH=${WORKSPACE_BASE:-$PWD/workspace}
ports:
- "3000:3000"
@@ -16,7 +16,7 @@ services:
- "host.docker.internal:host-gateway"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ~/.openhands-state:/.openhands-state
- ~/.openhands:/.openhands
- ${WORKSPACE_BASE:-$PWD/workspace}:/opt/workspace_base
pull_policy: build
stdin_open: true
-21
View File
@@ -1,21 +0,0 @@
# Dependencies
/node_modules
# Production
/build
/static/swagger-ui
# Generated files
.docusaurus
.cache-loader
# Misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
+2 -2
View File
@@ -54,9 +54,9 @@ docker run -it \
When adding a note or warning, use the built-in note and warning syntax.
Example:
:::note
<Note>
This section is for advanced users only.
:::
</Note>
### Referring to UI Elements
+7 -45
View File
@@ -1,55 +1,17 @@
# OpenHands Documentation
This website is built using [Docusaurus](https://docusaurus.io/).
When published, the content will be published at https://docs.all-hands.dev/.
### Local Development
```bash
$ cd docs
$ npm install
$ npm run start
```
This command starts a local development server and opens up a browser window.
Most changes are reflected live without having to restart the server.
Alternatively, you can pass a `--locale` argument to render a specific language in dev mode as in:
# Setup
```
$ npm run start --locale pt-BR # for the Brazilian Portuguese version
$ npm run start --locale fr # for the French version
$ npm run start --locale zh-Hans # for the Chinese Han (simplified variant) version
npm install -g mint
```
### Build
or
```
$ npm run build
yarn global add mint
```
This command generates static content into the `build` directory and can be served using any static contents hosting service.
It compiles all languages.
# Preview
### Deployment
Open a new pull request and - when it is merged - the [deploy-docs](.github/workflows/deploy-docs.yml) GH action will take care of everything else.
## Automatic Translations
Translations can be automatically updated when the original English content changes, this is done by the script [`translation_updater.py`](./translation_updater.py).
From the root of the repository, you can run the following:
```bash
$ export ANTHROPIC_API_KEY=<your_api_key>
$ poetry run python docs/translation_updater.py
# ...
# Change detected in docs/modules/usage/getting-started.mdx
# translating... docs/modules/usage/getting-started.mdx pt-BR
# translation done
# ...
```
This process uses `claude-3-7-sonnet-20250219` as base model and each language consumes at least ~30k input tokens and ~35k output tokens.
mint dev
```
+17
View File
@@ -0,0 +1,17 @@
# セットアップ
```
npm install -g mint
```
または
```
yarn global add mint
```
# プレビュー
```
mint dev
```
-3
View File
@@ -1,3 +0,0 @@
module.exports = {
presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
};
-249
View File
@@ -1,249 +0,0 @@
# Agent Mode Toggle Design Document
## Overview
This document outlines the design for implementing a toggle switch between "Read-only mode" and "Execute mode" in the OpenHands application. This feature will allow users to switch between a restricted ReadOnlyAgent that can only explore and analyze code, and the fully capable CodeActAgent that can modify code and execute commands.
## Motivation
Users often want to explore a codebase and discuss implementation details with the agent before making any changes. The ability to switch between read-only and execute modes provides several benefits:
1. **Safety**: Users can ensure no changes are made during the exploration phase
2. **Clarity**: Clear indication of the agent's current capabilities
3. **Control**: Users decide when to transition from planning to execution
4. **Workflow**: Supports a natural workflow of exploration → planning → implementation
## Architecture
The implementation will leverage the existing agent delegation mechanism in OpenHands. When a user toggles the switch:
1. In **Execute Mode** (default): The application uses the standard CodeActAgent
2. In **Read-only Mode**: The application delegates to a ReadOnlyAgent
### Key Components
#### Frontend
1. **Toggle Switch Component**:
- UI element that shows the current mode and allows switching
- Sends appropriate actions to the event stream when toggled
2. **Agent State Tracking**:
- Redux state to track current agent type and delegation status
- Event listeners to update state based on event stream
3. **Visual Indicators**:
- Mode indicator showing current agent mode
- Visual styling differences between modes
#### Backend
1. **Agent Delegation**:
- Uses existing delegation mechanism to switch to ReadOnlyAgent
- User-initiated FinishAction to end delegation and return to CodeActAgent
2. **Event Stream Integration**:
- AgentDelegateAction to start read-only mode
- AgentFinishAction to end read-only mode
- System messages to indicate mode changes
## Implementation Details
### Frontend Implementation
#### Redux State Extension
```typescript
interface AgentState {
curAgentState: AgentState;
currentAgentType: string; // Track the agent type
isDelegated: boolean; // Track if we're in a delegation
// other existing fields...
}
const initialState: AgentState = {
curAgentState: AgentState.IDLE,
currentAgentType: "CodeActAgent", // Default agent type
isDelegated: false,
// other initial values...
};
```
#### Action Generators
```typescript
export const generateDelegateToReadOnlyAction = () => ({
action: ActionType.DELEGATE,
args: {
agent: "ReadOnlyAgent",
inputs: {
task: "Continue the conversation in READ-ONLY MODE. You can explore and analyze code but cannot make changes."
},
thought: "Switching to read-only mode at user's request"
}
});
export const generateFinishDelegationAction = () => ({
action: ActionType.FINISH,
args: {
message: "Switching back to EXECUTE MODE. You now have full capabilities to modify code and execute commands.",
task_completed: "true",
outputs: {
mode_switch: true
}
}
});
```
#### Toggle Switch Component
```tsx
function AgentModeToggle() {
const { t } = useTranslation();
const dispatch = useDispatch();
const { send } = useWsClient();
// Get agent type from Redux
const { currentAgentType, isDelegated } = useSelector((state: RootState) => state.agent);
// Compute if we're in read-only mode
const isReadOnly = currentAgentType === "ReadOnlyAgent";
const handleToggle = () => {
if (isReadOnly) {
// Currently in read-only mode, switch back to execute mode
send(generateFinishDelegationAction());
} else {
// Currently in execute mode, switch to read-only mode
send(generateDelegateToReadOnlyAction());
}
};
return (
<div className="flex items-center gap-2">
<span className="text-sm font-medium">
{isReadOnly ? "Read-Only Mode" : "Execute Mode"}
</span>
<Switch
checked={isReadOnly}
onChange={handleToggle}
className={`${isReadOnly ? 'bg-amber-600' : 'bg-blue-600'} relative inline-flex h-6 w-11 items-center rounded-full`}
>
<span className="sr-only">Toggle agent mode</span>
<span
className={`${isReadOnly ? 'translate-x-6' : 'translate-x-1'} inline-block h-4 w-4 transform rounded-full bg-white transition`}
/>
</Switch>
</div>
);
}
```
#### Event Listener for State Updates
```typescript
function handleEvent(event) {
// Handle agent delegation events
if (event.action === ActionType.DELEGATE) {
// A delegation is starting
dispatch(setDelegationState(true));
dispatch(setAgentType(event.args.agent));
}
// Handle agent delegate observation (delegation ended)
else if (event.observation === "delegate") {
// Delegation has ended, returning to parent agent
dispatch(setDelegationState(false));
dispatch(setAgentType("CodeActAgent")); // Reset to default agent
}
// Handle other events...
}
```
### Backend Considerations
The backend implementation will leverage the existing agent delegation mechanism:
1. When the user toggles to read-only mode:
- An AgentDelegateAction is sent to the event stream
- The AgentController creates a ReadOnlyAgent delegate
- All subsequent events are handled by the delegate
2. When the user toggles back to execute mode:
- An AgentFinishAction is sent to the event stream
- The delegate agent finishes its task
- The parent AgentController resumes normal operation
No backend code changes are required as we're using the existing delegation mechanism.
## User Experience
1. **Initial State**: The application starts in Execute Mode with CodeActAgent
2. **Mode Switching**:
- User clicks the toggle switch to enter Read-only Mode
- System message indicates the mode change
- Agent capabilities are restricted to read-only tools
- UI shows visual indicators of the current mode
- User clicks the toggle switch again to return to Execute Mode
- System message indicates the return to full capabilities
3. **Visual Indicators**:
- Toggle switch position (left/right)
- Color coding (amber for read-only, blue for execute)
- Mode label text
- System messages in the conversation
## Future Enhancements
1. **Persistent Mode Preference**: Remember the user's preferred starting mode
2. **Context Preservation**: Improve context retention when switching modes
3. **Custom Tool Sets**: Allow users to customize which tools are available in each mode
4. **Mode-specific Prompts**: Optimize agent prompts for each mode
## Implementation Plan
1. **Frontend Implementation**:
- Add Redux state for agent type tracking ✅
- Create toggle switch component ✅
- Implement event listeners for state updates ✅
- Add visual indicators for current mode ✅
- Add notifications for mode changes ✅
2. **Testing**:
- Test mode switching with various conversation states
- Verify proper tool restrictions in read-only mode
- Test persistence across page refreshes
3. **Documentation**:
- Update user documentation to explain the mode toggle feature
- Add developer documentation for the implementation details ✅
## Implementation Status
The agent mode toggle feature has been implemented with the following components:
1. **Redux State**:
- Added `currentAgentType` and `isDelegated` properties to the agent slice
- Default agent type is set to "CodeActAgent"
2. **Agent Mode Service**:
- Created `agent-mode-service.ts` with action generators for delegation
- Implemented `generateDelegateToReadOnlyAction()` and `generateFinishDelegationAction()`
3. **UI Components**:
- Created `AgentModeToggle` component with toggle switch UI
- Integrated toggle into the agent control bar
- Updated agent status bar to display current mode
- Added color coding (amber for read-only, blue for execute)
4. **Event Handling**:
- Updated `use-handle-ws-events.ts` to process agent delegation events
- Added state updates when delegation starts/ends
- Added notifications to inform users of mode changes
5. **Internationalization**:
- Added translations for all UI elements
- Supported multiple languages through i18n
The implementation is complete and ready for testing. The feature allows users to seamlessly switch between read-only and execute modes during a conversation, with clear visual indicators and notifications of the current mode.
+230
View File
@@ -0,0 +1,230 @@
{
"$schema": "https://mintlify.com/docs.json",
"theme": "mint",
"name": "All Hands Docs",
"colors": {
"primary": "#99873c",
"light": "#ffe165",
"dark": "#ffe165"
},
"background": {
"color": {
"light": "#f7f3ee",
"dark": "#0B0D0E"
}
},
"appearance": {
"default": "light"
},
"favicon": "/logo-square.png",
"navigation": {
"tabs": [
{
"tab": "Docs",
"pages": [
"index",
"usage/installation",
"usage/getting-started",
"usage/key-features",
"usage/faqs",
{
"group": "OpenHands Cloud",
"pages": [
"usage/cloud/openhands-cloud",
{
"group": "Integrations",
"pages": [
"usage/cloud/bitbucket-installation",
"usage/cloud/github-installation",
"usage/cloud/gitlab-installation",
"usage/cloud/slack-installation",
{
"group": "Project Management Tools",
"pages": [
"usage/cloud/project-management/overview",
"usage/cloud/project-management/jira-integration",
"usage/cloud/project-management/jira-dc-integration",
"usage/cloud/project-management/linear-integration"
]
}
]
},
"usage/cloud/cloud-ui",
"usage/cloud/cloud-api"
]
},
{
"group": "Run OpenHands on Your Own",
"pages": [
"usage/local-setup",
"usage/how-to/gui-mode",
"usage/how-to/cli-mode",
"usage/how-to/headless-mode",
"usage/how-to/github-action",
{
"group": "Advanced Configuration",
"pages": [
{
"group": "LLM Configuration",
"pages": [
"usage/llms/llms",
{
"group": "Providers",
"pages": [
"usage/llms/openhands-llms",
"usage/llms/azure-llms",
"usage/llms/google-llms",
"usage/llms/groq",
"usage/llms/local-llms",
"usage/llms/litellm-proxy",
"usage/llms/moonshot",
"usage/llms/openai-llms",
"usage/llms/openrouter"
]
}
]
},
{
"group": "Runtime Configuration",
"pages": [
"usage/runtimes/overview",
{
"group": "Providers",
"pages": [
"usage/runtimes/docker",
"usage/runtimes/remote",
"usage/runtimes/local",
{
"group": "Third-Party Providers",
"pages": [
"usage/runtimes/modal",
"usage/runtimes/daytona",
"usage/runtimes/runloop",
"usage/runtimes/e2b"
]
}
]
}
]
},
"usage/configuration-options",
"usage/how-to/custom-sandbox-guide",
"usage/search-engine-setup",
"usage/mcp"
]
}
]
},
{
"group": "Customizations & Settings",
"pages": [
"usage/common-settings",
"usage/prompting/repository",
{
"group": "Microagents",
"pages": [
"usage/prompting/microagents-overview",
"usage/prompting/microagents-repo",
"usage/prompting/microagents-keyword",
"usage/prompting/microagents-org",
"usage/prompting/microagents-public"
]
}
]
},
{
"group": "Tips and Tricks",
"pages": [
"usage/prompting/prompting-best-practices"
]
},
{
"group": "Troubleshooting & Feedback",
"pages": [
"usage/troubleshooting/troubleshooting",
"usage/feedback"
]
},
{
"group": "OpenHands Developers",
"pages": [
"usage/how-to/development-overview",
{
"group": "Architecture",
"pages": [
"usage/architecture/backend",
"usage/architecture/runtime"
]
},
"usage/how-to/debugging",
"usage/how-to/evaluation-harness",
"usage/how-to/websocket-connection"
]
}
]
},
{
"tab": "Success Stories",
"pages": [
"success-stories/index"
]
},
{
"tab": "API Reference",
"openapi": "/openapi.json"
}
],
"global": {
"anchors": [
{
"anchor": "Company",
"href": "https://www.all-hands.dev/",
"icon": "house"
},
{
"anchor": "Blog",
"href": "https://www.all-hands.dev/blog",
"icon": "newspaper"
},
{
"anchor": "OpenHands Cloud",
"href": "https://app.all-hands.dev",
"icon": "cloud"
}
]
}
},
"logo": {
"light": "/logo/light.svg",
"dark": "/logo/dark.svg"
},
"navbar": {
"links": [
],
"primary": {
"type": "github",
"href": "https://github.com/All-Hands-AI/OpenHands"
}
},
"footer": {
"socials": {
"slack": "https://join.slack.com/t/openhands-ai/shared_invite/zt-3847of6xi-xuYJIPa6YIPg4ElbDWbtSA",
"github": "https://github.com/All-Hands-AI/OpenHands",
"discord": "https://discord.gg/ESHStjSjD4"
}
},
"contextual": {
"options": [
"copy",
"view",
"chatgpt",
"claude"
]
},
"redirects": [
{
"source": "/modules/:slug*",
"destination": "/:slug*"
}
]
}
-118
View File
@@ -1,118 +0,0 @@
import type * as Preset from '@docusaurus/preset-classic';
import type { Config } from '@docusaurus/types';
import { themes as prismThemes } from 'prism-react-renderer';
const config: Config = {
title: 'OpenHands',
tagline: 'Code Less, Make More',
favicon: 'img/logo-square.png',
// Set the production url of your site here
url: 'https://docs.all-hands.dev',
baseUrl: '/',
// GitHub pages deployment config.
organizationName: 'All-Hands-AI',
projectName: 'OpenHands',
trailingSlash: false,
onBrokenLinks: 'throw',
onBrokenMarkdownLinks: 'warn',
// Even if you don't use internationalization, you can use this field to set
// useful metadata like html lang. For example, if your site is Chinese, you
// may want to replace "en" with "zh-Hans".
i18n: {
defaultLocale: 'en',
locales: ['en', 'fr', 'zh-Hans', 'ja', 'pt-BR'],
localeConfigs: {
en: {
htmlLang: 'en-GB',
},
},
},
markdown: {
mermaid: true,
},
themes: ['@docusaurus/theme-mermaid'],
plugins: [
[
require.resolve('docusaurus-lunr-search'),
{
languages: ['en', 'zh', 'fr', 'ja', 'pt']
}
]
],
presets: [
[
'classic',
{
docs: {
path: 'modules',
routeBasePath: 'modules',
sidebarPath: './sidebars.ts',
exclude: [
// '**/_*.{js,jsx,ts,tsx,md,mdx}',
// '**/_*/**',
'**/*.test.{js,jsx,ts,tsx}',
'**/__tests__/**',
],
},
blog: {
showReadingTime: true,
},
theme: {
customCss: './src/css/custom.css',
},
} satisfies Preset.Options,
],
],
themeConfig: {
image: 'img/docusaurus.png',
navbar: {
title: 'OpenHands',
logo: {
alt: 'OpenHands',
src: 'img/logo.png',
},
items: [
{
type: 'docSidebar',
sidebarId: 'docsSidebar',
position: 'left',
label: 'User Guides',
},
{
href: 'https://docs.all-hands.dev/swagger-ui/', // FIXME: this should be a relative path, but docusarus steals the click
label: 'API',
position: 'left',
},
{
type: 'localeDropdown',
position: 'left',
},
{
type: 'search',
position: 'left',
},
{
href: 'https://all-hands.dev',
label: 'Company',
position: 'right',
},
{
href: 'https://github.com/All-Hands-AI/OpenHands',
label: 'GitHub',
position: 'right',
},
],
},
prism: {
theme: prismThemes.oneLight,
darkTheme: prismThemes.oneDark,
},
} satisfies Preset.ThemeConfig,
};
export default config;
+19
View File
@@ -0,0 +1,19 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.06145 23.1079C5.26816 22.3769 -3.39077 20.6274 1.4173 5.06384C9.6344 6.09939 16.9728 14.0644 9.06145 23.1079Z" fill="url(#paint0_linear_17557_2021)"/>
<path d="M8.91928 23.0939C5.27642 21.2223 0.78371 4.20891 17.0071 0C20.7569 7.19341 19.6212 16.5452 8.91928 23.0939Z" fill="url(#paint1_linear_17557_2021)"/>
<path d="M8.91388 23.0788C8.73534 19.8817 10.1585 9.08525 23.5699 13.1107C23.1812 20.1229 18.984 26.4182 8.91388 23.0788Z" fill="url(#paint2_linear_17557_2021)"/>
<defs>
<linearGradient id="paint0_linear_17557_2021" x1="3.77557" y1="5.91571" x2="5.23185" y2="21.5589" gradientUnits="userSpaceOnUse">
<stop stop-color="#18E299"/>
<stop offset="1" stop-color="#15803D"/>
</linearGradient>
<linearGradient id="paint1_linear_17557_2021" x1="12.1711" y1="-0.718425" x2="10.1897" y2="22.9832" gradientUnits="userSpaceOnUse">
<stop stop-color="#16A34A"/>
<stop offset="1" stop-color="#4ADE80"/>
</linearGradient>
<linearGradient id="paint2_linear_17557_2021" x1="23.1327" y1="15.353" x2="9.33841" y2="18.5196" gradientUnits="userSpaceOnUse">
<stop stop-color="#4ADE80"/>
<stop offset="1" stop-color="#0D9373"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

-102
View File
@@ -1,102 +0,0 @@
const fs = require('fs');
const path = require('path');
const swaggerUiDist = require('swagger-ui-dist');
/**
* This script manually sets up Swagger UI for the Docusaurus documentation.
*
* Why we need this approach:
* 1. Docusaurus doesn't have a built-in way to integrate Swagger UI
* 2. We need to copy the necessary files from swagger-ui-dist to our static directory
* 3. We need to create a custom index.html file that points to our OpenAPI spec
* 4. This approach allows us to customize the Swagger UI to match our documentation style
*/
// Get the absolute path to the swagger-ui-dist package
const swaggerUiDistPath = swaggerUiDist.getAbsoluteFSPath();
// Create the target directory if it doesn't exist
const targetDir = path.join(__dirname, 'static', 'swagger-ui');
if (!fs.existsSync(targetDir)) {
fs.mkdirSync(targetDir, { recursive: true });
}
// Copy all files from swagger-ui-dist to our target directory
const files = fs.readdirSync(swaggerUiDistPath);
files.forEach(file => {
const sourcePath = path.join(swaggerUiDistPath, file);
const targetPath = path.join(targetDir, file);
// Skip directories and non-essential files
if (fs.statSync(sourcePath).isDirectory() ||
file === 'package.json' ||
file === 'README.md' ||
file.endsWith('.map')) {
return;
}
fs.copyFileSync(sourcePath, targetPath);
});
// Create a custom index.html file that points to our OpenAPI spec
const indexHtml = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>OpenHands API Documentation</title>
<link rel="stylesheet" type="text/css" href="./swagger-ui.css" />
<link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32" />
<link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16" />
<style>
html {
box-sizing: border-box;
overflow: -moz-scrollbars-vertical;
overflow-y: scroll;
}
*,
*:before,
*:after {
box-sizing: inherit;
}
body {
margin: 0;
background: #fafafa;
}
</style>
</head>
<body>
<div id="swagger-ui"></div>
<script src="./swagger-ui-bundle.js" charset="UTF-8"> </script>
<script src="./swagger-ui-standalone-preset.js" charset="UTF-8"> </script>
<script>
window.onload = function() {
// Begin Swagger UI call region
const ui = SwaggerUIBundle({
url: "/openapi.json",
dom_id: '#swagger-ui',
deepLinking: true,
presets: [
SwaggerUIBundle.presets.apis,
SwaggerUIStandalonePreset
],
plugins: [
SwaggerUIBundle.plugins.DownloadUrl
],
layout: "StandaloneLayout"
});
// End Swagger UI call region
window.ui = ui;
};
</script>
</body>
</html>
`;
fs.writeFileSync(path.join(targetDir, 'index.html'), indexHtml);
console.log('Swagger UI files generated successfully in static/swagger-ui/');
-427
View File
@@ -1,427 +0,0 @@
{
"footer.title": {
"message": "OpenHands"
},
"footer.docs": {
"message": "Documents"
},
"footer.community": {
"message": "Communauté"
},
"footer.copyright": {
"message": "© {year} OpenHands"
},
"faq.title": {
"message": "Questions Fréquemment Posées",
"description": "FAQ Title"
},
"faq.description": {
"message": "Questions Fréquemment Posées"
},
"faq.section.title.1": {
"message": "Qu'est-ce qu'OpenHands ?",
"description": "First Section Title"
},
"faq.section.highlight": {
"message": "OpenHands",
"description": "Highlight Text"
},
"faq.section.description.1": {
"message": "est un ingénieur logiciel autonome qui peut résoudre des tâches d'ingénierie logicielle et de navigation web à tout moment. Il peut exécuter des requêtes en sciences des données, telles que \"Trouver le nombre de demandes de pull à l'repository OpenHands dans les derniers mois\", et des tâches d'ingénierie logicielle, comme \"Veuillez ajouter des tests à ce fichier et vérifier si tous les tests passent. Si ce n'est pas le cas, réparez le fichier.\"",
"description": "Description for OpenHands"
},
"faq.section.description.2": {
"message": "De plus, OpenHands est une plateforme et communauté pour les développeurs d'agents qui souhaitent tester et évaluer de nouveaux agents.",
"description": "Further Description for OpenHands"
},
"faq.section.title.2": {
"message": "Support",
"description": "Support Section Title"
},
"faq.section.support.answer": {
"message": "Si vous rencontrez un problème que d'autres utilisateurs peuvent également avoir, merci de le signaler sur {githubLink}. Si vous avez des difficultés à l'installation ou des questions générales, rejoignez-vous sur {discordLink} ou {slackLink}.",
"description": "Support Answer"
},
"faq.section.title.3": {
"message": "Comment résoudre un problème sur GitHub avec OpenHands ?",
"description": "GitHub Issue Section Title"
},
"faq.section.github.steps.intro": {
"message": "Pour résoudre un problème sur GitHub en utilisant OpenHands, envoyez une commande à OpenHands demandant qu'il suit des étapes comme les suivantes :",
"description": "GitHub Steps Introduction"
},
"faq.section.github.step1": {
"message": "Lisez l'issue https://github.com/All-Hands-AI/OpenHands/issues/1611",
"description": "GitHub Step 1"
},
"faq.section.github.step2": {
"message": "Cloner le dépôt et vérifier une nouvelle branche",
"description": "GitHub Step 2"
},
"faq.section.github.step3": {
"message": "Sur la base des instructions dans la description de l'issue, modifiez les fichiers pour résoudre le problème",
"description": "GitHub Step 3"
},
"faq.section.github.step4": {
"message": "Pousser le résultat à GitHub en utilisant la variable d'environnement GITHUB_TOKEN",
"description": "GitHub Step 4"
},
"faq.section.github.step5": {
"message": "Dites-moi le lien que je dois utiliser pour envoyer une demande de pull",
"description": "GitHub Step 5"
},
"faq.section.github.steps.preRun": {
"message": "Avant de lancer OpenHands, vous pouvez faire :",
"description": "GitHub Steps Pre-Run"
},
"faq.section.github.steps.tokenInfo": {
"message": "où XXX est un jeton GitHub que vous avez créé et qui a les autorisations pour pousser dans le dépôt OpenHands. Si vous n'avez pas d'autorisations de modification du dépôt OpenHands, vous devrez peut-être changer cela en :",
"description": "GitHub Steps Token Info"
},
"faq.section.github.steps.usernameInfo": {
"message": "où USERNAME est votre nom GitHub.",
"description": "GitHub Steps Username Info"
},
"faq.section.title.4": {
"message": "Comment OpenHands est-il différent de Devin ?",
"description": "Devin Section Title"
},
"faq.section.openhands.linkText": {
"message": "Devin",
"description": "Devin Link Text"
},
"faq.section.openhands.description": {
"message": "est un produit commercial par Cognition Inc., qui a servi d'inspiration initiale pour OpenHands. Les deux visent à bien faire le travail d'ingénierie logicielle, mais vous pouvez télécharger, utiliser et modifier OpenHands, tandis que Devin peut être utilisé uniquement via le site de Cognition. De plus, OpenHands a évolué au-delà de l'inspiration initiale, et est maintenant un écosystème communautaire pour le développement d'agents en général, et nous serions ravis de vous voir rejoindre et",
"description": "Devin Description"
},
"faq.section.openhands.contribute": {
"message": "contribuer",
"description": "Contribute Link"
},
"faq.section.title.5": {
"message": "Comment OpenHands est-il différent de ChatGPT ?",
"description": "ChatGPT Section Title"
},
"faq.section.chatgpt.description": {
"message": "ChatGPT vous pouvez accéder en ligne, il ne se connecte pas aux fichiers locaux et ses capacités d'exécution du code sont limitées. Alors qu'il peut écrire du code, mais c'est difficile à tester ou à exécuter.",
"description": "ChatGPT Description"
},
"homepage.description": {
"message": "Génération d'code AI pour l'ingénierie logicielle.",
"description": "The homepage description"
},
"homepage.getStarted": {
"message": "Commencer"
},
"welcome.message": {
"message": "Bienvenue à OpenHands, un système d'IA autonome ingénieur logiciel capable d'exécuter des tâches d'ingénierie complexes et de collaborer activement avec les utilisateurs sur les projets de développement logiciel."
},
"theme.ErrorPageContent.title": {
"message": "Cette page a planté.",
"description": "The title of the fallback page when the page crashed"
},
"theme.BackToTopButton.buttonAriaLabel": {
"message": "Retourner en haut de la page",
"description": "The ARIA label for the back to top button"
},
"theme.blog.archive.title": {
"message": "Archives",
"description": "The page & hero title of the blog archive page"
},
"theme.blog.archive.description": {
"message": "Archives",
"description": "The page & hero description of the blog archive page"
},
"theme.blog.paginator.navAriaLabel": {
"message": "Pagination des listes d'articles du blog",
"description": "The ARIA label for the blog pagination"
},
"theme.blog.paginator.newerEntries": {
"message": "Nouvelles entrées",
"description": "The label used to navigate to the newer blog posts page (previous page)"
},
"theme.blog.paginator.olderEntries": {
"message": "Anciennes entrées",
"description": "The label used to navigate to the older blog posts page (next page)"
},
"theme.blog.post.paginator.navAriaLabel": {
"message": "Pagination des articles du blog",
"description": "The ARIA label for the blog posts pagination"
},
"theme.blog.post.paginator.newerPost": {
"message": "Article plus récent",
"description": "The blog post button label to navigate to the newer/previous post"
},
"theme.blog.post.paginator.olderPost": {
"message": "Article plus ancien",
"description": "The blog post button label to navigate to the older/next post"
},
"theme.blog.post.plurals": {
"message": "Un article|{count} articles",
"description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.blog.tagTitle": {
"message": "{nPosts} tags avec « {tagName} »",
"description": "The title of the page for a blog tag"
},
"theme.tags.tagsPageLink": {
"message": "Voir tous les tags",
"description": "The label of the link targeting the tag list page"
},
"theme.colorToggle.ariaLabel": {
"message": "Basculer entre le mode sombre et clair (actuellement {mode})",
"description": "The ARIA label for the navbar color mode toggle"
},
"theme.colorToggle.ariaLabel.mode.dark": {
"message": "mode sombre",
"description": "The name for the dark color mode"
},
"theme.colorToggle.ariaLabel.mode.light": {
"message": "mode clair",
"description": "The name for the light color mode"
},
"theme.docs.breadcrumbs.navAriaLabel": {
"message": "Bouton de navigation des liens de la page",
"description": "The ARIA label for the breadcrumbs"
},
"theme.docs.DocCard.categoryDescription.plurals": {
"message": "1 élément|{count} éléments",
"description": "The default description for a category card in the generated index about how many items this category includes"
},
"theme.docs.paginator.navAriaLabel": {
"message": "Pages de documentation",
"description": "The ARIA label for the docs pagination"
},
"theme.docs.paginator.previous": {
"message": "Précédent",
"description": "The label used to navigate to the previous doc"
},
"theme.docs.paginator.next": {
"message": "Suivant",
"description": "The label used to navigate to the next doc"
},
"theme.docs.tagDocListPageTitle.nDocsTagged": {
"message": "Un document tagué|{count} documents tagués",
"description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.docs.tagDocListPageTitle": {
"message": "{nDocsTagged} avec \"{tagName}\"",
"description": "The title of the page for a docs tag"
},
"theme.docs.versionBadge.label": {
"message": "Version: {versionLabel}"
},
"theme.docs.versions.unreleasedVersionLabel": {
"message": "Ceci est la documentation de la prochaine version {versionLabel} de {siteTitle}.",
"description": "The label used to tell the user that he's browsing an unreleased doc version"
},
"theme.docs.versions.unmaintainedVersionLabel": {
"message": "Ceci est la documentation de {siteTitle} {versionLabel}, qui n'est plus activement maintenue.",
"description": "The label used to tell the user that he's browsing an unmaintained doc version"
},
"theme.docs.versions.latestVersionSuggestionLabel": {
"message": "Pour une documentation à jour, consultez la {latestVersionLink} ({versionLabel}).",
"description": "The label used to tell the user to check the latest version"
},
"theme.docs.versions.latestVersionLinkLabel": {
"message": "dernière version",
"description": "The label used for the latest version suggestion link label"
},
"theme.common.editThisPage": {
"message": "Éditer cette page",
"description": "The link label to edit the current page"
},
"theme.common.headingLinkTitle": {
"message": "Lien direct vers {heading}",
"description": "Title for link to heading"
},
"theme.lastUpdated.atDate": {
"message": " le {date}",
"description": "The words used to describe on which date a page has been last updated"
},
"theme.lastUpdated.byUser": {
"message": " par {user}",
"description": "The words used to describe by who the page has been last updated"
},
"theme.lastUpdated.lastUpdatedAtBy": {
"message": "Dernière mise à jour{atDate}{byUser}",
"description": "The sentence used to display when a page has been last updated, and by who"
},
"theme.navbar.mobileVersionsDropdown.label": {
"message": "Versions",
"description": "The label for the navbar versions dropdown on mobile view"
},
"theme.NotFound.title": {
"message": "Page introuvable",
"description": "The title of the 404 page"
},
"theme.tags.tagsListLabel": {
"message": "Tags :",
"description": "The label alongside a tag list"
},
"theme.admonition.caution": {
"message": "prudence",
"description": "The default label used for the Caution admonition (:::caution)"
},
"theme.admonition.danger": {
"message": "danger",
"description": "The default label used for the Danger admonition (:::danger)"
},
"theme.admonition.info": {
"message": "information",
"description": "The default label used for the Info admonition (:::info)"
},
"theme.admonition.note": {
"message": "remarque",
"description": "The default label used for the Note admonition (:::note)"
},
"theme.admonition.tip": {
"message": "astuce",
"description": "The default label used for the Tip admonition (:::tip)"
},
"theme.admonition.warning": {
"message": "prudence",
"description": "The default label used for the Warning admonition (:::warning)"
},
"theme.AnnouncementBar.closeButtonAriaLabel": {
"message": "Fermer",
"description": "The ARIA label for close button of announcement bar"
},
"theme.blog.sidebar.navAriaLabel": {
"message": "Navigation vers les articles récents du blog",
"description": "The ARIA label for recent posts in the blog sidebar"
},
"theme.CodeBlock.copied": {
"message": "Copié",
"description": "The copied button label on code blocks"
},
"theme.CodeBlock.copyButtonAriaLabel": {
"message": "Copier le code",
"description": "The ARIA label for copy code blocks button"
},
"theme.CodeBlock.copy": {
"message": "Copier",
"description": "The copy button label on code blocks"
},
"theme.CodeBlock.wordWrapToggle": {
"message": "Activer/désactiver le retour à la ligne",
"description": "The title attribute for toggle word wrapping button of code block lines"
},
"theme.DocSidebarItem.expandCategoryAriaLabel": {
"message": "Développer la catégorie '{label}' de la barre latérale",
"description": "The ARIA label to expand the sidebar category"
},
"theme.DocSidebarItem.collapseCategoryAriaLabel": {
"message": "Réduire la catégorie '{label}' de la barre latérale",
"description": "The ARIA label to collapse the sidebar category"
},
"theme.NavBar.navAriaLabel": {
"message": "Main",
"description": "The ARIA label for the main navigation"
},
"theme.navbar.mobileLanguageDropdown.label": {
"message": "Langues",
"description": "The label for the mobile language switcher dropdown"
},
"theme.NotFound.p1": {
"message": "Nous n'avons pas trouvé ce que vous recherchez.",
"description": "The first paragraph of the 404 page"
},
"theme.NotFound.p2": {
"message": "Veuillez contacter le propriétaire du site qui vous a lié à l'URL d'origine et leur faire savoir que leur lien est cassé.",
"description": "The 2nd paragraph of the 404 page"
},
"theme.TOCCollapsible.toggleButtonLabel": {
"message": "Sur cette page",
"description": "The label used by the button on the collapsible TOC component"
},
"theme.blog.post.readMore": {
"message": "Lire plus",
"description": "The label used in blog post item excerpts to link to full blog posts"
},
"theme.blog.post.readMoreLabel": {
"message": "En savoir plus sur {title}",
"description": "The ARIA label for the link to full blog posts from excerpts"
},
"theme.blog.post.readingTime.plurals": {
"message": "Une minute de lecture|{readingTime} minutes de lecture",
"description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
},
"theme.docs.breadcrumbs.home": {
"message": "Page d'accueil",
"description": "The ARIA label for the home page in the breadcrumbs"
},
"theme.docs.sidebar.collapseButtonTitle": {
"message": "Réduire le menu latéral",
"description": "The title attribute for collapse button of doc sidebar"
},
"theme.docs.sidebar.collapseButtonAriaLabel": {
"message": "Réduire le menu latérale",
"description": "The title attribute for collapse button of doc sidebar"
},
"theme.docs.sidebar.navAriaLabel": {
"message": "Barre de navigation latérale des docs",
"description": "The ARIA label for the sidebar navigation"
},
"theme.docs.sidebar.closeSidebarButtonAriaLabel": {
"message": "Fermer la barre de navigation",
"description": "The ARIA label for close button of mobile sidebar"
},
"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": {
"message": "← Retour au menu principal",
"description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"
},
"theme.docs.sidebar.toggleSidebarButtonAriaLabel": {
"message": "Ouvrir/fermer la barre de navigation",
"description": "The ARIA label for hamburger menu button of mobile navigation"
},
"theme.docs.sidebar.expandButtonTitle": {
"message": "Déplier le menu latéral",
"description": "The ARIA label and title attribute for expand button of doc sidebar"
},
"theme.docs.sidebar.expandButtonAriaLabel": {
"message": "Déployer le menu latérale",
"description": "The ARIA label and title attribute for expand button of doc sidebar"
},
"theme.ErrorPageContent.tryAgain": {
"message": "Réessayer",
"description": "The label of the button to try again rendering when the React error boundary captures an error"
},
"theme.common.skipToMainContent": {
"message": "Aller directement au contenu principal",
"description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"
},
"theme.tags.tagsPageTitle": {
"message": "Tags",
"description": "The title of the tag list page"
},
"theme.unlistedContent.title": {
"message": "Page non répertoriée",
"description": "The unlisted content banner title"
},
"theme.unlistedContent.message": {
"message": "Cette page n'est pas répertoriée. Les moteurs de recherche ne l'indexeront pas, et seuls les utilisateurs ayant un lien direct peuvent y accéder.",
"description": "The unlisted content banner message"
},
"Use AI to tackle the toil in your backlog. Our agents have all the same tools as a human developer: they can modify code, run commands, browse the web, call APIs, and yes-even copy code snippets from StackOverflow.": {
"message": "Utilisez l'IA pour gérer les tâches répétitives de votre backlog. Nos agents disposent des mêmes outils qu'un développeur humain : ils peuvent modifier du code, exécuter des commandes, naviguer sur le web, appeler des API et même copier des extraits de code depuis StackOverflow."
},
"Get started with OpenHands.": {
"message": "Commencer avec OpenHands"
},
"Most Popular Links": {
"message": "Liens Populaires"
},
"Customizing OpenHands to a repository": {
"message": "Personnaliser OpenHands pour un dépôt"
},
"Integrating OpenHands with Github": {
"message": "Intégrer OpenHands avec Github"
},
"Recommended models to use": {
"message": "Modèles recommandés"
},
"Connecting OpenHands to your filesystem": {
"message": "Connecter OpenHands à votre système de fichiers"
}
}
@@ -1,14 +0,0 @@
{
"title": {
"message": "Blog",
"description": "The title for the blog used in SEO"
},
"description": {
"message": "Blog",
"description": "The description for the blog used in SEO"
},
"sidebar.title": {
"message": "Articles récents",
"description": "The label for the left sidebar"
}
}
@@ -1,210 +0,0 @@
{
"version.label": {
"message": "Next",
"description": "The label for version current"
},
"sidebar.docsSidebar.category.🤖 Backends LLM": {
"message": "🤖 Backends LLM",
"description": "The label for category 🤖 Backends LLM in sidebar docsSidebar"
},
"sidebar.docsSidebar.category.🚧 Dépannage": {
"message": "🚧 Dépannage",
"description": "The label for category 🚧 Dépannage in sidebar docsSidebar"
},
"sidebar.apiSidebar.category.Backend": {
"message": "Backend",
"description": "The label for category Backend in sidebar apiSidebar"
},
"sidebar.docsSidebar.category.User Guides": {
"message": "Guides d'Utilisateur",
"description": "The label for category User Guides in sidebar docsSidebar"
},
"sidebar.docsSidebar.category.Running OpenHands": {
"message": "Exécution d'OpenHands",
"description": "The label for category Running OpenHands in sidebar docsSidebar"
},
"sidebar.docsSidebar.category.Prompting": {
"message": "Prompting",
"description": "The label for category Prompting in sidebar docsSidebar"
},
"sidebar.docsSidebar.category.Architecture": {
"message": "Architecture",
"description": "The label for category Architecture in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Running OpenHands": {
"message": "Exécution d'OpenHands",
"description": "The label for document Running OpenHands in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Getting Started": {
"message": "Commencer",
"description": "The label for document Getting Started in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Key Features": {
"message": "Fonctionnalités Clés",
"description": "The label for document Key Features in sidebar docsSidebar"
},
"sidebar.docsSidebar.category.Customization": {
"message": "Personnalisation",
"description": "The label for category Customization in sidebar docsSidebar"
},
"sidebar.docsSidebar.category.Usage Methods": {
"message": "Méthodes d'Utilisation",
"description": "The label for category Usage Methods in sidebar docsSidebar"
},
"sidebar.docsSidebar.category.Advanced Configuration": {
"message": "Configuration Avancée",
"description": "The label for category Advanced Configuration in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Troubleshooting": {
"message": "Dépannage",
"description": "The label for document Troubleshooting in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Feedback": {
"message": "Retour d'Information",
"description": "The label for document Feedback in sidebar docsSidebar"
},
"sidebar.docsSidebar.category.For OpenHands Developers": {
"message": "Pour les Développeurs OpenHands",
"description": "The label for category For OpenHands Developers in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.About": {
"message": "À Propos",
"description": "The label for document About in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Best Practices": {
"message": "Meilleures Pratiques",
"description": "The label for document Best Practices in sidebar docsSidebar"
},
"sidebar.docsSidebar.category.Microagents": {
"message": "Micro-agents",
"description": "The label for category Microagents in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Overview": {
"message": "Aperçu",
"description": "The label for document Overview in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Repository": {
"message": "Dépôt",
"description": "The label for document Repository in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Public": {
"message": "Public",
"description": "The label for document Public in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Repository Customization": {
"message": "Personnalisation du Dépôt",
"description": "The label for document Repository Customization in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.GUI Mode": {
"message": "Mode GUI",
"description": "The label for document GUI Mode in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.CLI Mode": {
"message": "Mode CLI",
"description": "The label for document CLI Mode in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Headless Mode": {
"message": "Mode Sans Interface",
"description": "The label for document Headless Mode in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Github Action": {
"message": "Action GitHub",
"description": "The label for document Github Action in sidebar docsSidebar"
},
"sidebar.docsSidebar.category.Cloud": {
"message": "Cloud",
"description": "The label for category Cloud in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Openhands Cloud": {
"message": "OpenHands Cloud",
"description": "The label for document Openhands Cloud in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Cloud GitHub Resolver": {
"message": "Résolveur GitHub Cloud",
"description": "The label for document Cloud GitHub Resolver in sidebar docsSidebar"
},
"sidebar.docsSidebar.category.LLM Configuration": {
"message": "Configuration LLM",
"description": "The label for category LLM Configuration in sidebar docsSidebar"
},
"sidebar.docsSidebar.category.Providers": {
"message": "Fournisseurs",
"description": "The label for category Providers in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Azure": {
"message": "Azure",
"description": "The label for document Azure in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Google": {
"message": "Google",
"description": "The label for document Google in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Groq": {
"message": "Groq",
"description": "The label for document Groq in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.LiteLLM Proxy": {
"message": "Proxy LiteLLM",
"description": "The label for document LiteLLM Proxy in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.OpenAI": {
"message": "OpenAI",
"description": "The label for document OpenAI in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.OpenRouter": {
"message": "OpenRouter",
"description": "The label for document OpenRouter in sidebar docsSidebar"
},
"sidebar.docsSidebar.category.Runtime Configuration": {
"message": "Configuration d'Exécution",
"description": "The label for category Runtime Configuration in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Docker Runtime": {
"message": "Environnement Docker",
"description": "The label for document Docker Runtime in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Remote Runtime": {
"message": "Environnement Distant",
"description": "The label for document Remote Runtime in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Modal Runtime": {
"message": "Environnement Modal",
"description": "The label for document Modal Runtime in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Daytona Runtime": {
"message": "Environnement Daytona",
"description": "The label for document Daytona Runtime in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Local Runtime": {
"message": "Environnement Local",
"description": "The label for document Local Runtime in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Configuration Options": {
"message": "Options de Configuration",
"description": "The label for document Configuration Options in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Custom Sandbox": {
"message": "Bac à Sable Personnalisé",
"description": "The label for document Custom Sandbox in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Development Overview": {
"message": "Aperçu du Développement",
"description": "The label for document Development Overview in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Backend": {
"message": "Backend",
"description": "The label for document Backend in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Runtime": {
"message": "Environnement d'Exécution",
"description": "The label for document Runtime in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Debugging": {
"message": "Débogage",
"description": "The label for document Debugging in sidebar docsSidebar"
},
"sidebar.docsSidebar.doc.Evaluation": {
"message": "Évaluation",
"description": "The label for document Evaluation in sidebar docsSidebar"
}
}
@@ -1,5 +0,0 @@
# Documentation Python
La documentation apparaîtra ici après le déploiement.
@@ -1,5 +0,0 @@
{
"items": ["python/python"],
"label": "Backend",
"type": "categorie"
}
@@ -1,25 +0,0 @@
# À propos d'OpenHands
## Stratégie de recherche
Réaliser une réplication complète d'applications de qualité production avec des LLM est une entreprise complexe. Notre stratégie comprend :
- **Recherche technique fondamentale :** Concentration sur la recherche fondamentale pour comprendre et améliorer les aspects techniques de la génération et de la gestion du code.
- **Planification des tâches :** Développement de capacités pour la détection de bugs, la gestion de base de code et l'optimisation.
- **Évaluation :** Établissement de métriques d'évaluation complètes pour mieux comprendre et améliorer nos agents.
## Agent par défaut
Notre Agent par défaut est actuellement le [CodeActAgent](agents), qui est capable de générer du code et de gérer des fichiers.
## Construit avec
OpenHands est construit en utilisant une combinaison de frameworks et bibliothèques puissants, fournissant une base solide pour son développement. Voici les technologies clés utilisées dans le projet :
![FastAPI](https://img.shields.io/badge/FastAPI-black?style=for-the-badge) ![uvicorn](https://img.shields.io/badge/uvicorn-black?style=for-the-badge) ![LiteLLM](https://img.shields.io/badge/LiteLLM-black?style=for-the-badge) ![Docker](https://img.shields.io/badge/Docker-black?style=for-the-badge) ![Ruff](https://img.shields.io/badge/Ruff-black?style=for-the-badge) ![MyPy](https://img.shields.io/badge/MyPy-black?style=for-the-badge) ![LlamaIndex](https://img.shields.io/badge/LlamaIndex-black?style=for-the-badge) ![React](https://img.shields.io/badge/React-black?style=for-the-badge)
Veuillez noter que la sélection de ces technologies est en cours, et des technologies supplémentaires peuvent être ajoutées ou des existantes peuvent être supprimées à mesure que le projet évolue. Nous nous efforçons d'adopter les outils les plus appropriés et efficaces pour améliorer les capacités d'OpenHands.
## Licence
Distribué sous la [Licence](https://github.com/All-Hands-AI/OpenHands/blob/main/LICENSE) MIT.
@@ -1,23 +0,0 @@
# 🧠 Agent Principal et Capacités
## CodeActAgent
### Description
Cet agent implémente l'idée CodeAct ([article](https://arxiv.org/abs/2402.01030), [tweet](https://twitter.com/xingyaow_/status/1754556835703751087)) qui consolide les **act**ions des agents LLM dans un espace d'action **code** unifié pour la _simplicité_ et la _performance_.
L'idée conceptuelle est illustrée ci-dessous. À chaque tour, l'agent peut :
1. **Converser** : Communiquer avec les humains en langage naturel pour demander des clarifications, des confirmations, etc.
2. **CodeAct** : Choisir d'effectuer la tâche en exécutant du code
- Exécuter n'importe quelle commande Linux `bash` valide
- Exécuter n'importe quel code `Python` valide avec [un interpréteur Python interactif](https://ipython.org/). Ceci est simulé via la commande `bash`, voir le système de plugins ci-dessous pour plus de détails.
![image](https://github.com/All-Hands-AI/OpenHands/assets/38853559/92b622e3-72ad-4a61-8f41-8c040b6d5fb3)
### Démo
https://github.com/All-Hands-AI/OpenHands/assets/38853559/f592a192-e86c-4f48-ad31-d69282d5f6ac
_Exemple de CodeActAgent avec `gpt-4-turbo-2024-04-09` réalisant une tâche de science des données (régression linéaire)_.
@@ -1,50 +0,0 @@
---
sidebar_position: 4
---
# 🏛️ Aperçu de l'Architecture Système
Voici un aperçu de haut niveau de l'architecture du système. Le système est divisé en deux composants principaux : le frontend et le backend. Le frontend est responsable de la gestion des interactions avec l'utilisateur et de l'affichage des résultats. Le backend est responsable de la gestion de la logique métier et de l'exécution des agents.
![system_architecture.svg](/img/system_architecture.svg)
Cet aperçu est simplifié pour montrer les principaux composants et leurs interactions. Pour une vue plus détaillée de l'architecture du backend, consultez la section [Architecture du Backend](#backend-architecture-fr).
# Architecture du Backend {#backend-architecture-fr}
_**Avertissement**: L'architecture du backend est en cours de développement et est sujette à modifications. Le schéma suivant montre l'architecture actuelle du backend basée sur le commit indiqué dans le pied de page du schéma._
![backend_architecture.svg](/img/backend_architecture.svg)
<details>
<summary>Mise à jour de ce Schéma</summary>
<div>
La génération du schéma d'architecture du backend est partiellement automatisée.
Le schéma est généré à partir des annotations de type dans le code en utilisant l'outil py2puml.
Le schéma est ensuite revu manuellement, ajusté et exporté en PNG et SVG.
## Prérequis
- Un environnement Python dans lequel openhands est exécutable
(selon les instructions du fichier README.md à la racine du dépôt)
- [py2puml](https://github.com/lucsorel/py2puml) installé
## Étapes
1. Générez automatiquement le schéma en exécutant la commande suivante depuis la racine du dépôt :
`py2puml openhands openhands > docs/architecture/backend_architecture.puml`
2. Ouvrez le fichier généré dans un éditeur PlantUML, par exemple Visual Studio Code avec l'extension PlantUML ou [PlantText](https://www.planttext.com/)
3. Révisez le PUML généré et apportez toutes les modifications nécessaires au schéma (ajoutez les parties manquantes, corrigez les erreurs, améliorez l'agencement).
_py2puml crée le schéma à partir des annotations de type dans le code, donc les annotations de type manquantes ou incorrectes peuvent entraîner un schéma incomplet ou incorrect._
4. Examinez la différence entre le nouveau schéma et le précédent et vérifiez manuellement si les modifications sont correctes.
_Assurez-vous de ne pas supprimer les parties ajoutées manuellement au schéma par le passé et qui sont toujours pertinentes._
5. Ajoutez le hash du commit qui a été utilisé pour générer le schéma dans le pied de page du schéma.
6. Exporte le schéma sous forme de fichiers PNG et SVG et remplacez les schémas existants dans le répertoire `docs/architecture`. Cela peut être fait avec (par exemple [PlantText](https://www.planttext.com/))
</div>
</details>
@@ -1,54 +0,0 @@
# 🏛️ Architecture du Système
<div style={{ textAlign: 'center' }}>
<img src="https://github.com/All-Hands-AI/OpenHands/assets/16201837/97d747e3-29d8-4ccb-8d34-6ad1adb17f38" alt="Diagramme d'Architecture OpenHands 4 juillet 2024" />
<p><em>Diagramme d'Architecture OpenHands (4 juillet 2024)</em></p>
</div>
Voici une vue d'ensemble de l'architecture du système. Le système est divisé en deux composants principaux : le frontend et le backend. Le frontend est responsable de la gestion des interactions utilisateur et de l'affichage des résultats. Le backend est responsable de la gestion de la logique métier et de l'exécution des agents.
# Architecture Frontend {#frontend-architecture-en}
![system_architecture.svg](/img/system_architecture.svg)
Cette vue d'ensemble est simplifiée pour montrer les composants principaux et leurs interactions. Pour une vue plus détaillée de l'architecture backend, consultez la section Architecture Backend ci-dessous.
# Architecture Backend {#backend-architecture-en}
_**Avertissement** : L'architecture backend est en cours de développement et peut être modifiée. Le diagramme suivant montre l'architecture actuelle du backend basée sur le commit indiqué dans le pied de page du diagramme._
![backend_architecture.svg](/img/backend_architecture.svg)
<details>
<summary>Mise à jour de ce diagramme</summary>
<div>
La génération du diagramme d'architecture backend est partiellement automatisée.
Le diagramme est généré à partir des annotations de type dans le code en utilisant l'outil
py2puml. Le diagramme est ensuite manuellement révisé, ajusté et exporté en PNG
et SVG.
## Prérequis
- Environnement Python opérationnel dans lequel openhands est exécutable
(selon les instructions du fichier README.md à la racine du dépôt)
- [py2puml](https://github.com/lucsorel/py2puml) installé
## Étapes
1. Générer automatiquement le diagramme en exécutant la commande suivante depuis la racine du dépôt :
`py2puml openhands openhands > docs/architecture/backend_architecture.puml`
2. Ouvrir le fichier généré dans un éditeur PlantUML, par exemple Visual Studio Code avec l'extension PlantUML ou [PlantText](https://www.planttext.com/)
3. Examiner le PUML généré et faire tous les ajustements nécessaires au diagramme (ajouter les parties manquantes, corriger les erreurs, améliorer le positionnement).
_py2puml crée le diagramme basé sur les annotations de type dans le code, donc des annotations manquantes ou incorrectes peuvent entraîner un diagramme incomplet ou incorrect._
4. Examiner la différence entre le nouveau diagramme et le précédent et vérifier manuellement si les changements sont corrects.
_Assurez-vous de ne pas supprimer des parties qui ont été ajoutées manuellement au diagramme dans le passé et qui sont toujours pertinentes._
5. Ajouter le hash du commit qui a été utilisé pour générer le diagramme dans le pied de page du diagramme.
6. Exporter le diagramme en fichiers PNG et SVG et remplacer les diagrammes existants dans le répertoire `docs/architecture`. Cela peut être fait avec (par exemple [PlantText](https://www.planttext.com/))
</div>
</details>
@@ -1,128 +0,0 @@
# 📦 Docker Runtime
Le Docker Runtime d'OpenHands est le composant central qui permet l'exécution sécurisée et flexible des actions d'un agent IA.
Il crée un environnement isolé (sandbox) en utilisant Docker, où du code arbitraire peut être exécuté en toute sécurité sans risquer de compromettre le système hôte.
## Pourquoi avons-nous besoin d'un environnement d'exécution isolé ?
OpenHands doit exécuter du code arbitraire dans un environnement sécurisé et isolé pour plusieurs raisons :
1. Sécurité : L'exécution de code non fiable peut présenter des risques importants pour le système hôte. Un environnement isolé empêche le code malveillant d'accéder ou de modifier les ressources du système hôte
2. Cohérence : Un environnement isolé garantit que l'exécution du code est cohérente sur différentes machines et configurations, éliminant les problèmes du type "ça marche sur ma machine"
3. Contrôle des ressources : L'isolation permet un meilleur contrôle de l'allocation et de l'utilisation des ressources, empêchant les processus incontrôlés d'affecter le système hôte
4. Isolation : Différents projets ou utilisateurs peuvent travailler dans des environnements isolés sans interférer les uns avec les autres ou avec le système hôte
5. Reproductibilité : Les environnements isolés facilitent la reproduction des bugs et des problèmes, car l'environnement d'exécution est cohérent et contrôlable
## Comment fonctionne le Runtime ?
Le système Runtime d'OpenHands utilise une architecture client-serveur implémentée avec des conteneurs Docker. Voici un aperçu de son fonctionnement :
```mermaid
graph TD
A[Image Docker personnalisée fournie par l'utilisateur] --> B[Backend OpenHands]
B -->|Construit| C[Image OH Runtime]
C -->|Lance| D[Action Executor]
D -->|Initialise| E[Navigateur]
D -->|Initialise| F[Shell Bash]
D -->|Initialise| G[Plugins]
G -->|Initialise| L[Serveur Jupyter]
B -->|Crée| H[Agent]
B -->|Crée| I[EventStream]
I <--->|Exécute l'action pour
obtenir l'observation
via API REST
| D
H -->|Génère l'action| I
I -->|Obtient l'observation| H
subgraph "Conteneur Docker"
D
E
F
G
L
end
```
1. Entrée utilisateur : L'utilisateur fournit une image Docker de base personnalisée
2. Construction de l'image : OpenHands construit une nouvelle image Docker (l'"image OH runtime") basée sur l'image fournie par l'utilisateur. Cette nouvelle image inclut le code spécifique à OpenHands, principalement le "client runtime"
3. Lancement du conteneur : Lorsqu'OpenHands démarre, il lance un conteneur Docker utilisant l'image OH runtime
4. Initialisation du serveur d'exécution d'actions : Le serveur d'exécution d'actions initialise un `ActionExecutor` à l'intérieur du conteneur, configurant les composants nécessaires comme un shell bash et chargeant les plugins spécifiés
5. Communication : Le backend OpenHands (`openhands/runtime/impl/eventstream/eventstream_runtime.py`) communique avec le serveur d'exécution d'actions via une API RESTful, envoyant des actions et recevant des observations
6. Exécution d'actions : Le client runtime reçoit les actions du backend, les exécute dans l'environnement isolé, et renvoie des observations
7. Retour d'observation : Le serveur d'exécution d'actions renvoie les résultats d'exécution au backend OpenHands sous forme d'observations
Le rôle du client :
- Il agit comme intermédiaire entre le backend OpenHands et l'environnement isolé
- Il exécute divers types d'actions (commandes shell, opérations sur fichiers, code Python, etc.) en toute sécurité dans le conteneur
- Il gère l'état de l'environnement isolé, y compris le répertoire de travail actuel et les plugins chargés
- Il formate et renvoie les observations au backend, assurant une interface cohérente pour le traitement des résultats
## Comment OpenHands construit et maintient les images OH Runtime
L'approche d'OpenHands pour construire et gérer les images runtime assure efficacité, cohérence et flexibilité dans la création et la maintenance des images Docker pour les environnements de production et de développement.
Consultez le [code pertinent](https://github.com/All-Hands-AI/OpenHands/blob/main/openhands/runtime/utils/runtime_build.py) si vous êtes intéressé par plus de détails.
### Système de marquage d'images
OpenHands utilise un système à trois tags pour ses images runtime afin d'équilibrer reproductibilité et flexibilité.
Les tags peuvent être dans l'un des 2 formats suivants :
- **Tag versionné** : `oh_v{openhands_version}_{base_image}` (ex. : `oh_v0.9.9_nikolaik_s_python-nodejs_t_python3.12-nodejs22`)
- **Tag de verrouillage** : `oh_v{openhands_version}_{16_digit_lock_hash}` (ex. : `oh_v0.9.9_1234567890abcdef`)
- **Tag source** : `oh_v{openhands_version}_{16_digit_lock_hash}_{16_digit_source_hash}`
(ex. : `oh_v0.9.9_1234567890abcdef_1234567890abcdef`)
#### Tag source - Le plus spécifique
Il s'agit des 16 premiers chiffres du MD5 du hash du répertoire pour le répertoire source. Cela donne un hash
uniquement pour la source openhands.
#### Tag de verrouillage
Ce hash est construit à partir des 16 premiers chiffres du MD5 de :
- Le nom de l'image de base sur laquelle l'image a été construite (ex. : `nikolaik/python-nodejs:python3.12-nodejs22`)
- Le contenu du `pyproject.toml` inclus dans l'image.
- Le contenu du `poetry.lock` inclus dans l'image.
Cela donne effectivement un hash pour les dépendances d'Openhands indépendamment du code source.
#### Tag versionné - Le plus générique
Ce tag est une concaténation de la version openhands et du nom de l'image de base (transformé pour s'adapter au standard des tags).
#### Processus de construction
Lors de la génération d'une image...
- **Pas de reconstruction** : OpenHands vérifie d'abord si une image avec le même **tag source le plus spécifique** existe. S'il existe une telle image, aucune construction n'est effectuée - l'image existante est utilisée.
- **Reconstruction la plus rapide** : OpenHands vérifie ensuite si une image avec le **tag de verrouillage générique** existe. S'il existe une telle image, OpenHands construit une nouvelle image basée sur celle-ci, contournant toutes les étapes d'installation (comme `poetry install` et `apt-get`) sauf une opération finale pour copier le code source actuel. La nouvelle image est marquée uniquement avec un tag **source**.
- **Reconstruction acceptable** : Si ni un tag **source** ni un tag **verrouillage** n'existe, une image sera construite basée sur l'image avec le tag **versionné**. Dans l'image avec tag versionné, la plupart des dépendances devraient déjà être installées, ce qui permet de gagner du temps.
- **Reconstruction la plus lente** : Si aucun des trois tags n'existe, une toute nouvelle image est construite basée sur l'image de base (ce qui est une opération plus lente). Cette nouvelle image est marquée avec tous les tags **source**, **verrouillage** et **versionné**.
Cette approche de marquage permet à OpenHands de gérer efficacement les environnements de développement et de production.
1. Un code source et un Dockerfile identiques produisent toujours la même image (via des tags basés sur des hashs)
2. Le système peut rapidement reconstruire des images lorsque des changements mineurs se produisent (en exploitant des images compatibles récentes)
3. Le tag **verrouillage** (ex., `runtime:oh_v0.9.3_1234567890abcdef`) pointe toujours vers la dernière construction pour une combinaison particulière d'image de base, de dépendances et de version OpenHands
## Système de plugins Runtime
Le Runtime OpenHands prend en charge un système de plugins qui permet d'étendre les fonctionnalités et de personnaliser l'environnement d'exécution. Les plugins sont initialisés au démarrage du client runtime.
Consultez [un exemple de plugin Jupyter ici](https://github.com/All-Hands-AI/OpenHands/blob/ecf4aed28b0cf7c18d4d8ff554883ba182fc6bdd/openhands/runtime/plugins/jupyter/__init__.py#L21-L55) si vous souhaitez implémenter votre propre plugin.
*Plus de détails sur le système de plugins sont encore en construction - les contributions sont les bienvenues !*
Aspects clés du système de plugins :
1. Définition du plugin : Les plugins sont définis comme des classes Python qui héritent d'une classe de base `Plugin`
2. Enregistrement du plugin : Les plugins disponibles sont enregistrés dans un dictionnaire `ALL_PLUGINS`
3. Spécification du plugin : Les plugins sont associés à `Agent.sandbox_plugins: list[PluginRequirement]`. Les utilisateurs peuvent spécifier quels plugins charger lors de l'initialisation du runtime
4. Initialisation : Les plugins sont initialisés de manière asynchrone au démarrage du client runtime
5. Utilisation : Le client runtime peut utiliser les plugins initialisés pour étendre ses capacités (par exemple, le JupyterPlugin pour exécuter des cellules IPython)
@@ -1,177 +0,0 @@
# API Cloud OpenHands
OpenHands Cloud fournit une API REST qui vous permet d'interagir programmatiquement avec le service. Cela est utile si vous souhaitez facilement lancer vos propres tâches depuis vos programmes de manière flexible.
Ce guide explique comment obtenir une clé API et utiliser l'API pour démarrer des conversations.
Pour des informations plus détaillées sur l'API, consultez la [Référence API OpenHands](https://docs.all-hands.dev/swagger-ui/).
## Obtention d'une clé API
Pour utiliser l'API OpenHands Cloud, vous devrez générer une clé API :
1. Connectez-vous à votre compte [OpenHands Cloud](https://app.all-hands.dev)
2. Accédez à la [page Paramètres](https://app.all-hands.dev/settings)
3. Localisez la section "Clés API"
4. Cliquez sur "Générer une nouvelle clé"
5. Donnez à votre clé un nom descriptif (par exemple, "Développement", "Production")
6. Copiez la clé API générée et conservez-la en lieu sûr - elle ne sera affichée qu'une seule fois
![Génération de clé API](/img/docs/api-key-generation.png)
## Utilisation de l'API
### Démarrer une nouvelle conversation
Pour démarrer une nouvelle conversation avec OpenHands effectuant une tâche, vous devrez faire une requête POST vers le point de terminaison de conversation.
#### Paramètres de la requête
| Paramètre | Type | Obligatoire | Description |
|-----------|------|-------------|-------------|
| `initial_user_msg` | chaîne | Oui | Le message initial pour démarrer la conversation |
| `repository` | chaîne | Non | Nom du dépôt Git pour fournir du contexte au format `propriétaire/repo`. Vous devez avoir accès au dépôt. |
#### Exemples
<details>
<summary>cURL</summary>
```bash
curl -X POST "https://app.all-hands.dev/api/conversations" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"initial_user_msg": "Check whether there is any incorrect information in the README.md file and send a PR to fix it if so.",
"repository": "yourusername/your-repo"
}'
```
</details>
<details>
<summary>Python (avec requests)</summary>
```python
import requests
api_key = "YOUR_API_KEY"
url = "https://app.all-hands.dev/api/conversations"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
data = {
"initial_user_msg": "Check whether there is any incorrect information in the README.md file and send a PR to fix it if so.",
"repository": "yourusername/your-repo"
}
response = requests.post(url, headers=headers, json=data)
conversation = response.json()
print(f"Conversation Link: https://app.all-hands.dev/conversations/{conversation['conversation_id']}")
print(f"Status: {conversation['status']}")
```
</details>
<details>
<summary>TypeScript/JavaScript (avec fetch)</summary>
```typescript
const apiKey = "YOUR_API_KEY";
const url = "https://app.all-hands.dev/api/conversations";
const headers = {
"Authorization": `Bearer ${apiKey}`,
"Content-Type": "application/json"
};
const data = {
initial_user_msg: "Check whether there is any incorrect information in the README.md file and send a PR to fix it if so.",
repository: "yourusername/your-repo"
};
async function startConversation() {
try {
const response = await fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(data)
});
const conversation = await response.json();
console.log(`Conversation Link: https://app.all-hands.dev/conversations/${conversation.id}`);
console.log(`Status: ${conversation.status}`);
return conversation;
} catch (error) {
console.error("Error starting conversation:", error);
}
}
startConversation();
```
</details>
#### Réponse
L'API renverra un objet JSON avec les détails de la conversation créée :
```json
{
"status": "ok",
"conversation_id": "abc1234",
}
```
Vous pouvez également recevoir une `AuthenticationError` si :
1. Vous avez fourni une clé API invalide
2. Vous avez fourni un nom de dépôt incorrect
3. Vous n'avez pas accès au dépôt
### Récupération du statut d'une conversation
Vous pouvez vérifier le statut d'une conversation en faisant une requête GET vers le point de terminaison de conversation.
#### Point de terminaison
```
GET https://app.all-hands.dev/api/conversations/{conversation_id}
```
#### Exemple
<details>
<summary>cURL</summary>
```bash
curl -X GET "https://app.all-hands.dev/api/conversations/{conversation_id}" \
-H "Authorization: Bearer YOUR_API_KEY"
```
</details>
#### Réponse
La réponse est formatée comme suit :
```json
{
"conversation_id":"abc1234",
"title":"Update README.md",
"created_at":"2025-04-29T15:13:51.370706Z",
"last_updated_at":"2025-04-29T15:13:57.199210Z",
"status":"RUNNING",
"selected_repository":"yourusername/your-repo",
"trigger":"gui"
}
```
## Limites de taux
L'API a une limite de 10 conversations simultanées par compte. Si vous avez besoin d'une limite plus élevée pour votre cas d'utilisation, veuillez nous contacter à [contact@all-hands.dev](mailto:contact@all-hands.dev).
Si vous dépassez cette limite, l'API renverra une réponse 429 Too Many Requests.
@@ -1,33 +0,0 @@
# Résolveur GitHub Cloud
Le Résolveur GitHub automatise les corrections de code et fournit une assistance intelligente pour vos dépôts.
## Configuration
Le Résolveur GitHub Cloud est disponible automatiquement lorsque vous
[accordez l'accès au dépôt OpenHands Cloud](./openhands-cloud#adding-repository-access).
## Utilisation
Après avoir accordé l'accès au dépôt OpenHands Cloud, vous pouvez utiliser le Résolveur GitHub Cloud sur les problèmes et les pull requests
du dépôt.
### Problèmes (Issues)
Sur votre dépôt, étiquetez un problème avec `openhands`. OpenHands va :
1. Commenter le problème pour vous informer qu'il y travaille.
- Vous pouvez cliquer sur le lien pour suivre la progression sur OpenHands Cloud.
2. Ouvrir une pull request s'il détermine que le problème a été résolu avec succès.
3. Commenter le problème avec un résumé des tâches effectuées et un lien vers la pull request.
### Pull Requests
Pour qu'OpenHands travaille sur des pull requests, utilisez `@openhands` dans les commentaires de premier niveau ou en ligne pour :
- Poser des questions
- Demander des mises à jour
- Obtenir des explications de code
OpenHands va :
1. Commenter la PR pour vous informer qu'il y travaille.
2. Effectuer la tâche.
@@ -1,65 +0,0 @@
# OpenHands Cloud
OpenHands Cloud est la version hébergée dans le cloud d'OpenHands par All Hands AI.
## Accéder à OpenHands Cloud
OpenHands Cloud est accessible à l'adresse https://app.all-hands.dev/.
Vous pouvez également interagir avec OpenHands Cloud par programmation en utilisant l'[API](./cloud-api).
## Premiers pas
Après avoir visité OpenHands Cloud, il vous sera demandé de vous connecter avec votre compte GitHub ou GitLab :
1. Après avoir lu et accepté les conditions d'utilisation, cliquez sur `Log in with GitHub` ou `Log in with GitLab`.
2. Examinez les autorisations demandées par OpenHands, puis cliquez sur `Authorize OpenHands AI`.
- OpenHands nécessitera certaines autorisations de votre compte GitHub ou GitLab. Pour en savoir plus sur ces autorisations :
- GitHub : Vous pouvez cliquer sur le lien `Learn more` sur la page d'autorisation GitHub.
- GitLab : Vous pouvez développer chaque demande d'autorisation sur la page d'autorisation GitLab.
## Accès aux dépôts
### GitHub
#### Ajouter l'accès aux dépôts
Vous pouvez accorder à OpenHands un accès à des dépôts spécifiques :
1. Cliquez sur `Add GitHub repos` sur la page d'accueil.
2. Sélectionnez l'organisation, puis choisissez les dépôts spécifiques auxquels vous souhaitez donner accès à OpenHands.
<details>
<summary>Détails des autorisations pour l'accès aux dépôts</summary>
Openhands demande des jetons à courte durée de vie (expiration de 8 heures) avec ces autorisations :
- Actions : Lecture et écriture
- Administration : Lecture seule
- Statuts de commit : Lecture et écriture
- Contenus : Lecture et écriture
- Issues : Lecture et écriture
- Métadonnées : Lecture seule
- Pull requests : Lecture et écriture
- Webhooks : Lecture et écriture
- Workflows : Lecture et écriture
L'accès au dépôt pour un utilisateur est accordé en fonction de :
- L'autorisation accordée pour le dépôt.
- Les autorisations GitHub de l'utilisateur (propriétaire/collaborateur).
</details>
3. Cliquez sur `Install & Authorize`.
#### Modifier l'accès aux dépôts
Vous pouvez modifier l'accès aux dépôts GitHub à tout moment en :
* Utilisant le même processus `Add GitHub repos`, ou
* Visitant la page Paramètres et en sélectionnant `Configure GitHub Repositories` dans la section `Git Settings`.
### GitLab
Lorsque vous utilisez votre compte GitLab, OpenHands aura automatiquement accès à vos dépôts.
## Persistance des conversations
- Liste des conversations Affiche uniquement les 10 conversations les plus récentes initiées au cours des 10 derniers jours.
- Espaces de travail Les espaces de travail de conversation sont conservés pendant 14 jours.
- Environnements d'exécution Les environnements d'exécution restent actifs ("chauds") pendant 30 minutes. Après cette période, la reprise d'une conversation peut prendre 1 à 2 minutes.
@@ -1,395 +0,0 @@
# Options de Configuration
:::note
Cette page présente toutes les options de configuration disponibles pour OpenHands, vous permettant de personnaliser son comportement et
de l'intégrer avec d'autres services. En Mode GUI, tous les paramètres appliqués via l'interface Paramètres auront la priorité.
:::
## Configuration Principale
Les options de configuration principales sont définies dans la section `[core]` du fichier `config.toml`.
### Clés API
- `e2b_api_key`
- Type: `str`
- Défaut: `""`
- Description: Clé API pour E2B
- `modal_api_token_id`
- Type: `str`
- Défaut: `""`
- Description: ID de token API pour Modal
- `modal_api_token_secret`
- Type: `str`
- Défaut: `""`
- Description: Secret de token API pour Modal
### Espace de travail
- `workspace_base` **(Déprécié)**
- Type: `str`
- Défaut: `"./workspace"`
- Description: Chemin de base pour l'espace de travail. **Déprécié: Utilisez `SANDBOX_VOLUMES` à la place.**
- `cache_dir`
- Type: `str`
- Défaut: `"/tmp/cache"`
- Description: Chemin du répertoire de cache
### Débogage et Journalisation
- `debug`
- Type: `bool`
- Défaut: `false`
- Description: Activer le débogage
- `disable_color`
- Type: `bool`
- Défaut: `false`
- Description: Désactiver la couleur dans la sortie du terminal
### Trajectoires
- `save_trajectory_path`
- Type: `str`
- Défaut: `"./trajectories"`
- Description: Chemin pour stocker les trajectoires (peut être un dossier ou un fichier). Si c'est un dossier, les trajectoires seront sauvegardées dans un fichier nommé avec l'ID de session et l'extension .json, dans ce dossier.
- `replay_trajectory_path`
- Type: `str`
- Défaut: `""`
- Description: Chemin pour charger une trajectoire et la rejouer. Si fourni, doit être un chemin vers le fichier de trajectoire au format JSON. Les actions dans le fichier de trajectoire seront rejouées d'abord avant que toute instruction utilisateur ne soit exécutée.
### Stockage de Fichiers
- `file_store_path`
- Type: `str`
- Défaut: `"/tmp/file_store"`
- Description: Chemin du stockage de fichiers
- `file_store`
- Type: `str`
- Défaut: `"memory"`
- Description: Type de stockage de fichiers
- `file_uploads_allowed_extensions`
- Type: `liste de str`
- Défaut: `[".*"]`
- Description: Liste des extensions de fichiers autorisées pour les téléchargements
- `file_uploads_max_file_size_mb`
- Type: `int`
- Défaut: `0`
- Description: Taille maximale de fichier pour les téléchargements, en mégaoctets
- `file_uploads_restrict_file_types`
- Type: `bool`
- Défaut: `false`
- Description: Restreindre les types de fichiers pour les téléchargements
- `file_uploads_allowed_extensions`
- Type: `liste de str`
- Défaut: `[".*"]`
- Description: Liste des extensions de fichiers autorisées pour les téléchargements
### Gestion des Tâches
- `max_budget_per_task`
- Type: `float`
- Défaut: `0.0`
- Description: Budget maximum par tâche (0.0 signifie pas de limite)
- `max_iterations`
- Type: `int`
- Défaut: `100`
- Description: Nombre maximum d'itérations
### Configuration du Sandbox
- `volumes`
- Type: `str`
- Défaut: `None`
- Description: Montages de volumes au format 'chemin_hôte:chemin_conteneur[:mode]', par ex. '/my/host/dir:/workspace:rw'. Plusieurs montages peuvent être spécifiés en utilisant des virgules, par ex. '/path1:/workspace/path1,/path2:/workspace/path2:ro'
- `workspace_mount_path_in_sandbox` **(Déprécié)**
- Type: `str`
- Défaut: `"/workspace"`
- Description: Chemin pour monter l'espace de travail dans le sandbox. **Déprécié: Utilisez `SANDBOX_VOLUMES` à la place.**
- `workspace_mount_path` **(Déprécié)**
- Type: `str`
- Défaut: `""`
- Description: Chemin pour monter l'espace de travail. **Déprécié: Utilisez `SANDBOX_VOLUMES` à la place.**
- `workspace_mount_rewrite` **(Déprécié)**
- Type: `str`
- Défaut: `""`
- Description: Chemin pour réécrire le chemin de montage de l'espace de travail. Vous pouvez généralement ignorer cela, cela fait référence à des cas spéciaux d'exécution à l'intérieur d'un autre conteneur. **Déprécié: Utilisez `SANDBOX_VOLUMES` à la place.**
### Divers
- `run_as_openhands`
- Type: `bool`
- Défaut: `true`
- Description: Exécuter en tant qu'OpenHands
- `runtime`
- Type: `str`
- Défaut: `"docker"`
- Description: Environnement d'exécution
- `default_agent`
- Type: `str`
- Défaut: `"CodeActAgent"`
- Description: Nom de l'agent par défaut
- `jwt_secret`
- Type: `str`
- Défaut: `uuid.uuid4().hex`
- Description: Secret JWT pour l'authentification. Veuillez le définir avec votre propre valeur.
## Configuration LLM
Les options de configuration LLM (Large Language Model) sont définies dans la section `[llm]` du fichier `config.toml`.
Pour les utiliser avec la commande docker, passez `-e LLM_<option>`. Exemple: `-e LLM_NUM_RETRIES`.
:::note
Pour les configurations de développement, vous pouvez également définir des configurations LLM personnalisées nommées. Voir [Configurations LLM personnalisées](./llms/custom-llm-configs) pour plus de détails.
:::
**Identifiants AWS**
- `aws_access_key_id`
- Type: `str`
- Défaut: `""`
- Description: ID de clé d'accès AWS
- `aws_region_name`
- Type: `str`
- Défaut: `""`
- Description: Nom de région AWS
- `aws_secret_access_key`
- Type: `str`
- Défaut: `""`
- Description: Clé d'accès secrète AWS
### Configuration API
- `api_key`
- Type: `str`
- Défaut: `None`
- Description: Clé API à utiliser
- `base_url`
- Type: `str`
- Défaut: `""`
- Description: URL de base de l'API
- `api_version`
- Type: `str`
- Défaut: `""`
- Description: Version de l'API
- `input_cost_per_token`
- Type: `float`
- Défaut: `0.0`
- Description: Coût par token d'entrée
- `output_cost_per_token`
- Type: `float`
- Défaut: `0.0`
- Description: Coût par token de sortie
### Fournisseur LLM personnalisé
- `custom_llm_provider`
- Type: `str`
- Défaut: `""`
- Description: Fournisseur LLM personnalisé
### Gestion des messages
- `max_message_chars`
- Type: `int`
- Défaut: `30000`
- Description: Le nombre approximatif maximum de caractères dans le contenu d'un événement inclus dans le prompt au LLM. Les observations plus grandes sont tronquées.
- `max_input_tokens`
- Type: `int`
- Défaut: `0`
- Description: Nombre maximum de tokens d'entrée
- `max_output_tokens`
- Type: `int`
- Défaut: `0`
- Description: Nombre maximum de tokens de sortie
### Sélection du modèle
- `model`
- Type: `str`
- Défaut: `"claude-3-5-sonnet-20241022"`
- Description: Modèle à utiliser
### Nouvelles tentatives
- `num_retries`
- Type: `int`
- Défaut: `8`
- Description: Nombre de tentatives à effectuer
- `retry_max_wait`
- Type: `int`
- Défaut: `120`
- Description: Temps d'attente maximum (en secondes) entre les tentatives
- `retry_min_wait`
- Type: `int`
- Défaut: `15`
- Description: Temps d'attente minimum (en secondes) entre les tentatives
- `retry_multiplier`
- Type: `float`
- Défaut: `2.0`
- Description: Multiplicateur pour le calcul de backoff exponentiel
### Options avancées
- `drop_params`
- Type: `bool`
- Défaut: `false`
- Description: Ignorer les paramètres non mappés (non pris en charge) sans provoquer d'exception
- `caching_prompt`
- Type: `bool`
- Défaut: `true`
- Description: Utiliser la fonctionnalité de mise en cache des prompts si fournie par le LLM et prise en charge
- `ollama_base_url`
- Type: `str`
- Défaut: `""`
- Description: URL de base pour l'API OLLAMA
- `temperature`
- Type: `float`
- Défaut: `0.0`
- Description: Température pour l'API
- `timeout`
- Type: `int`
- Défaut: `0`
- Description: Délai d'attente pour l'API
- `top_p`
- Type: `float`
- Défaut: `1.0`
- Description: Top p pour l'API
- `disable_vision`
- Type: `bool`
- Défaut: `None`
- Description: Si le modèle est capable de vision, cette option permet de désactiver le traitement d'images (utile pour réduire les coûts)
## Configuration de l'Agent
Les options de configuration de l'agent sont définies dans les sections `[agent]` et `[agent.<agent_name>]` du fichier `config.toml`.
### Configuration LLM
- `llm_config`
- Type: `str`
- Défaut: `'your-llm-config-group'`
- Description: Le nom de la configuration LLM à utiliser
### Configuration de l'espace d'action
- `function_calling`
- Type: `bool`
- Défaut: `true`
- Description: Si l'appel de fonction est activé
- `enable_browsing`
- Type: `bool`
- Défaut: `false`
- Description: Si le délégué de navigation est activé dans l'espace d'action (fonctionne uniquement avec l'appel de fonction)
- `enable_llm_editor`
- Type: `bool`
- Défaut: `false`
- Description: Si l'éditeur LLM est activé dans l'espace d'action (fonctionne uniquement avec l'appel de fonction)
- `enable_jupyter`
- Type: `bool`
- Défaut: `false`
- Description: Si Jupyter est activé dans l'espace d'action
- `enable_history_truncation`
- Type: `bool`
- Défaut: `true`
- Description: Si l'historique doit être tronqué pour continuer la session lorsqu'on atteint la limite de longueur de contexte du LLM
### Utilisation des microagents
- `enable_prompt_extensions`
- Type: `bool`
- Défaut: `true`
- Description: Si les microagents doivent être utilisés
- `disabled_microagents`
- Type: `liste de str`
- Défaut: `None`
- Description: Une liste de microagents à désactiver
## Configuration du Sandbox
Les options de configuration du sandbox sont définies dans la section `[sandbox]` du fichier `config.toml`.
Pour les utiliser avec la commande docker, passez `-e SANDBOX_<option>`. Exemple: `-e SANDBOX_TIMEOUT`.
### Exécution
- `timeout`
- Type: `int`
- Défaut: `120`
- Description: Délai d'attente du sandbox en secondes
- `user_id`
- Type: `int`
- Défaut: `1000`
- Description: ID utilisateur du sandbox
### Image du conteneur
- `base_container_image`
- Type: `str`
- Défaut: `"nikolaik/python-nodejs:python3.12-nodejs22"`
- Description: Image de conteneur à utiliser pour le sandbox
### Réseau
- `use_host_network`
- Type: `bool`
- Défaut: `false`
- Description: Utiliser le réseau de l'hôte
- `runtime_binding_address`
- Type: `str`
- Défaut: `0.0.0.0`
- Description: L'adresse de liaison pour les ports d'exécution. Elle spécifie quelle interface réseau sur la machine hôte Docker doit lier les ports d'exécution.
### Linting et Plugins
- `enable_auto_lint`
- Type: `bool`
- Défaut: `false`
- Description: Activer le linting automatique après l'édition
- `initialize_plugins`
- Type: `bool`
- Défaut: `true`
- Description: Si les plugins doivent être initialisés
### Dépendances et Environnement
- `runtime_extra_deps`
- Type: `str`
- Défaut: `""`
- Description: Dépendances supplémentaires à installer dans l'image d'exécution
- `runtime_startup_env_vars`
- Type: `dict`
- Défaut: `{}`
- Description: Variables d'environnement à définir au lancement de l'exécution
### Évaluation
- `browsergym_eval_env`
- Type: `str`
- Défaut: `""`
- Description: Environnement BrowserGym à utiliser pour l'évaluation
## Configuration de Sécurité
Les options de configuration de sécurité sont définies dans la section `[security]` du fichier `config.toml`.
Pour les utiliser avec la commande docker, passez `-e SECURITY
@@ -1,81 +0,0 @@
# 💿 Comment Créer un Soutien Docker sur Mesure
Le sandbox par défaut OpenHands est équipé d'une configuration ubuntu minimaliste. Votre cas d'utilisation pourrait nécessiter des logiciels installés par défaut. Cet article vous enseignera comment réaliser cela en utilisant une image docker personnalisée.
## Configuration
Assurez-vous de pouvoir utiliser OpenHands en suivant la documentation [Development.md](https://github.com/All-Hands-AI/OpenHands/blob/main/Development.md).
## Créer Votre Image Docker
Ensuite, vous devez créer votre image docker personnalisée qui doit être basée sur debian/ubuntu. Par exemple, si nous souhaitons que OpenHands ait accès au "node" binaire, nous utiliserions ce Dockerfile:
```bash
# Commencez avec l'image ubuntu la plus récente
FROM ubuntu:latest
# Effectuez les mises à jour nécessaires
RUN apt-get update && apt-get install
# Installez nodejs
RUN apt-get install -y nodejs
```
Ensuite, construisez votre image docker avec le nom de votre choix. Par exemple "image_personnalisée". Pour cela, créez un répertoire et placez le fichier à l'intérieur avec le nom "Dockerfile", puis dans le répertoire exécutez cette commande:
```bash
docker build -t image_personnalisée .
```
Cela produira une nouvelle image appelée ```image_personnalisée``` qui sera disponible dans Docker Engine.
> Remarque: Dans la configuration décrite ici, OpenHands va fonctionner en tant que utilisateur "openhands" à l'intérieur du sandbox et donc tous les packages installés via le Dockerfile seront disponibles pour tous les utilisateurs sur le système, pas seulement root.
>
> L'installation avec apt-get ci-dessus installe nodejs pour tous les utilisateurs.
## Spécifiez votre image personnalisée dans le fichier config.toml
La configuration OpenHands se fait via le fichier de niveau supérieur ```config.toml``` .
Créez un fichier ```config.toml``` dans le répertoire OpenHands et entrez ces contenus:
```toml
[core]
workspace_base="./workspace"
run_as_openhands=true
[sandbox]
base_container_image="image_personnalisée"
```
> Assurez-vous que ```base_container_image``` est défini sur le nom de votre image personnalisée précédente.
## Exécution
Exécutez OpenHands en exécutant ```make run``` dans le répertoire racine.
Naviguez vers ```localhost:3001``` et vérifiez si vos dépendances souhaitées sont disponibles.
Dans le cas de l'exemple ci-dessus, la commande ```node -v``` dans la console produit ```v18.19.1```
Félicitations !
## Explication technique
Veuillez consulter le [chapitre sur les images Docker personnalisées dans la documentation d'exécution](https://docs.all-hands.dev/fr/modules/usage/architecture/runtime) pour obtenir des explications plus détaillées.
## Dépannage / Erreurs
### Erreur: ```useradd: UID 1000 est non unique```
Si vous voyez cette erreur dans la sortie de la console, il s'agit du fait que OpenHands essaie de créer le utilisateur openhands dans le sandbox avec un ID d'utilisateur de 1000, cependant cet ID d'utilisateur est déjà utilisé dans l'image (pour une raison inconnue). Pour résoudre ce problème, changez la valeur du champ user_id dans le fichier config.toml en une valeur différente:
```toml
[core]
workspace_base="./workspace"
run_as_openhands=true
[sandbox]
base_container_image="image_personnalisée"
user_id="1001"
```
### Erreurs de port d'utilisation
Si vous voyez un message d'erreur indiquant que le port est utilisé ou indisponible, essayez de supprimer toutes les containers docker en cours d'exécution (exécutez `docker ps` et `docker rm` des containers concernés) puis ré-exécutez ```make run```
@@ -1,23 +0,0 @@
# Personnalisation du dépôt
Vous pouvez personnaliser la façon dont OpenHands interagit avec votre dépôt en créant un
répertoire `.openhands` à la racine.
## Microagents
Les microagents vous permettent d'étendre les prompts d'OpenHands avec des informations spécifiques à votre projet et de définir comment OpenHands
doit fonctionner. Consultez [Vue d'ensemble des microagents](../prompting/microagents-overview) pour plus d'informations.
## Script de configuration
Vous pouvez ajouter un fichier `.openhands/setup.sh`, qui s'exécutera chaque fois qu'OpenHands commence à travailler avec votre dépôt.
C'est un emplacement idéal pour installer des dépendances, définir des variables d'environnement et effectuer d'autres tâches de configuration.
Par exemple :
```bash
#!/bin/bash
export MY_ENV_VAR="my value"
sudo apt-get update
sudo apt-get install -y lsof
cd frontend && npm install ; cd ..
```
@@ -1,38 +0,0 @@
# ✅ Fournir des Commentaires
Lorsque vous utilisez OpenHands, vous rencontrerez des cas où les choses fonctionnent bien, et d'autres où ce n'est pas le cas. Nous vous encourageons à fournir des commentaires lorsque vous utilisez OpenHands pour aider à donner un retour à l'équipe de développement et, peut-être plus important encore, créer un corpus ouvert d'exemples d'entraînement pour les agents de codage -- Share-OpenHands!
## 📝 Comment Fournir des Commentaires
Fournir des commentaires est facile ! Lorsque vous utilisez OpenHands, vous pouvez appuyer sur le bouton pouce levé ou pouce baissé à tout moment pendant votre interaction. Il vous sera demandé de fournir votre adresse e-mail (par exemple, pour que nous puissions vous contacter si nous souhaitons poser des questions complémentaires), et vous pouvez choisir si vous souhaitez fournir des commentaires publiquement ou en privé.
<iframe width="560" height="315" src="https://www.youtube.com/embed/5rFx-StMVV0?si=svo7xzp6LhGK_GXr" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
## 📜 Utilisation des Données et Confidentialité
### Paramètres de partage des données
Lorsque vous soumettez des données, vous pouvez les soumettre soit publiquement, soit en privé.
- Les données **publiques** seront distribuées sous la licence MIT, comme OpenHands lui-même, et pourront être utilisées par la communauté pour entraîner et tester des modèles. Évidemment, les commentaires que vous pouvez rendre publics seront plus précieux pour la communauté dans son ensemble, donc lorsque vous ne traitez pas d'informations sensibles, nous vous encourageons à choisir cette option !
- Les données **privées** seront mises à la disposition de l'équipe OpenHands dans le but d'améliorer OpenHands. Cependant, un lien avec un identifiant unique sera toujours créé que vous pourrez partager publiquement avec d'autres.
### Qui collecte et stocke les données ?
Les données sont collectées et stockées par [All Hands AI](https://all-hands.dev), une entreprise fondée par les mainteneurs d'OpenHands pour soutenir et améliorer OpenHands.
### Comment les données publiques seront-elles publiées ?
Les données publiques seront publiées lorsque nous atteindrons des jalons fixes, tels que 1 000 exemples publics, 10 000 exemples publics, etc. À ce moment-là, nous suivrons le processus de publication suivant :
1. Toutes les personnes ayant contribué avec des commentaires publics recevront un e-mail décrivant la publication des données et auront la possibilité de se désinscrire.
2. La ou les personnes responsables de la publication des données effectueront un contrôle de qualité des données, supprimant les commentaires de faible qualité, supprimant les adresses e-mail des soumissionnaires et tentant de supprimer toute information sensible.
3. Les données seront publiées publiquement sous la licence MIT via des sites couramment utilisés tels que GitHub ou Hugging Face.
### Que faire si je souhaite que mes données soient supprimées ?
Pour les données sur les serveurs d'All Hands AI, nous sommes heureux de les supprimer sur demande :
**Une Seule Donnée :** Si vous souhaitez qu'une donnée soit supprimée, nous ajouterons prochainement un mécanisme pour supprimer des éléments de données en utilisant le lien et le mot de passe qui s'affichent sur l'interface lorsque vous soumettez des données.
**Toutes les Données :** Si vous souhaitez que toutes vos données soient supprimées, ou si vous ne disposez pas de l'identifiant et du mot de passe que vous avez reçus lors de la soumission des données, veuillez contacter `contact@all-hands.dev` depuis l'adresse e-mail que vous avez enregistrée lors de la soumission initiale des données.
@@ -1,99 +0,0 @@
# Premiers pas avec OpenHands
Vous avez [exécuté OpenHands](./installation) et vous avez
[configuré votre LLM](./installation#setup). Et maintenant ?
OpenHands peut vous aider pour diverses tâches d'ingénierie. Cependant, la technologie est encore nouvelle, et nous sommes loin d'avoir
des agents capables de gérer des tâches complexes de manière autonome. Il est important de comprendre ce que l'agent fait bien et où il
a besoin de soutien.
## Hello World
Commencez par un simple exemple "hello world". Cela pourrait être plus délicat qu'il n'y paraît !
Demandez à l'agent :
> Écrivez un script bash hello.sh qui affiche "hello world!"
L'agent écrira le script, définira les permissions correctes et l'exécutera pour vérifier la sortie.
Vous pouvez continuer à demander à l'agent d'affiner votre code. C'est une excellente façon de
travailler avec les agents. Commencez simplement, puis itérez.
> Modifiez hello.sh pour qu'il accepte un nom comme premier argument, mais utilise "world" par défaut
Vous pouvez également utiliser n'importe quel langage dont vous avez besoin. L'agent peut avoir besoin de temps pour configurer l'environnement.
> Veuillez convertir hello.sh en script Ruby, et exécutez-le
## Construire à partir de zéro
Les agents excellent dans les tâches "greenfield", où ils n'ont pas besoin de contexte sur le code existant et
peuvent partir de zéro.
Commencez par une tâche simple et itérez à partir de là. Soyez précis sur ce que vous voulez et la pile technologique.
Par exemple, nous pourrions construire une application TODO :
> Construisez une application TODO frontend uniquement en React. Tout l'état doit être stocké dans localStorage.
Une fois la structure de base en place, continuez à affiner :
> Permettez d'ajouter une date d'échéance optionnelle à chaque tâche.
Comme pour le développement normal, committez et poussez votre code souvent.
De cette façon, vous pouvez toujours revenir à un état antérieur si l'agent s'égare.
Vous pouvez demander à l'agent de committer et pousser pour vous :
> Committez les changements et poussez-les vers une nouvelle branche appelée "feature/due-dates"
## Ajouter du nouveau code
OpenHands est excellent pour ajouter du nouveau code à une base de code existante.
Par exemple, vous pouvez demander à OpenHands d'ajouter une action GitHub qui vérifie votre code. Il pourrait vérifier votre base de code pour
déterminer le langage, puis créer un nouveau fichier dans `./github/workflows/lint.yml`.
> Ajoutez une action GitHub qui vérifie le code dans ce dépôt.
Certaines tâches nécessitent plus de contexte. Bien qu'OpenHands puisse utiliser des commandes comme ls et grep pour rechercher, fournir du contexte dès le départ
accélère les choses et réduit l'utilisation de tokens.
> Modifiez ./backend/api/routes.js pour ajouter une nouvelle route qui renvoie une liste de toutes les tâches.
> Ajoutez un nouveau composant React au répertoire ./frontend/components pour afficher une liste de Widgets.
> Il devrait utiliser le composant Widget existant.
## Refactoring
OpenHands est très efficace pour refactoriser du code en petits morceaux. Plutôt que de réarchitecturer l'ensemble de la base de code,
il est plus efficace de décomposer les fichiers et fonctions longs ou de renommer des variables.
> Renommez toutes les variables à une seule lettre dans ./app.go.
> Divisez la fonction `build_and_deploy_widgets` en deux fonctions, `build_widgets` et `deploy_widgets` dans widget.php.
> Décomposez ./api/routes.js en fichiers séparés pour chaque route.
## Corrections de bugs
OpenHands peut aider à traquer et corriger des bugs, mais la correction de bugs peut être délicate et nécessite souvent plus de contexte.
C'est utile si vous avez déjà diagnostiqué le problème et avez juste besoin qu'OpenHands gère la logique.
> Le champ email dans le point de terminaison `/subscribe` rejette les domaines .io. Corrigez cela.
> La fonction `search_widgets` dans ./app.py effectue une recherche sensible à la casse. Rendez-la insensible à la casse.
Pour la correction de bugs, le développement piloté par les tests peut être vraiment utile. Vous pouvez demander à l'agent d'écrire un nouveau test et d'itérer
jusqu'à ce que le bug soit corrigé :
> La fonction `hello` plante sur une chaîne vide. Écrivez un test qui reproduit ce bug, puis corrigez le code pour qu'il passe.
## Plus
OpenHands peut vous aider pour presque n'importe quelle tâche de codage, mais il faut un peu de pratique pour obtenir les meilleurs résultats.
Gardez ces conseils à l'esprit :
* Gardez vos tâches petites.
* Soyez précis.
* Fournissez beaucoup de contexte.
* Committez et poussez fréquemment.
Consultez [Meilleures pratiques de prompt](./prompting/prompting-best-practices) pour plus de conseils sur la façon de tirer le meilleur parti d'OpenHands.
@@ -1,55 +0,0 @@
# Mode CLI
OpenHands peut être exécuté en mode CLI interactif, ce qui permet aux utilisateurs de démarrer une session interactive via la ligne de commande.
Ce mode est différent du [mode headless](headless-mode), qui est non interactif et mieux adapté aux scripts.
## Avec Python
Pour démarrer une session interactive OpenHands via la ligne de commande :
1. Assurez-vous d'avoir suivi les [instructions de configuration pour le développement](https://github.com/All-Hands-AI/OpenHands/blob/main/Development.md).
2. Exécutez la commande suivante :
```bash
poetry run python -m openhands.core.cli
```
Cette commande lancera une session interactive où vous pourrez saisir des tâches et recevoir des réponses d'OpenHands.
Vous devrez vous assurer de définir votre modèle, clé API et autres paramètres via des variables d'environnement
[ou le fichier `config.toml`](https://github.com/All-Hands-AI/OpenHands/blob/main/config.template.toml).
## Avec Docker
Pour exécuter OpenHands en mode CLI avec Docker :
1. Définissez les variables d'environnement suivantes dans votre terminal :
- `SANDBOX_VOLUMES` pour spécifier le répertoire auquel vous souhaitez qu'OpenHands accède (Ex : `export SANDBOX_VOLUMES=$(pwd)/workspace:/workspace:rw`).
- L'agent travaille dans `/workspace` par défaut, donc montez votre répertoire de projet à cet emplacement si vous souhaitez que l'agent modifie des fichiers.
- Pour les données en lecture seule, utilisez un chemin de montage différent (Ex : `export SANDBOX_VOLUMES=$(pwd)/workspace:/workspace:rw,/path/to/large/dataset:/data:ro`).
- `LLM_MODEL` pour le modèle à utiliser (Ex : `export LLM_MODEL="anthropic/claude-3-5-sonnet-20241022"`).
- `LLM_API_KEY` pour la clé API (Ex : `export LLM_API_KEY="sk_test_12345"`).
2. Exécutez la commande Docker suivante :
```bash
docker run -it \
--pull=always \
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.38-nikolaik \
-e SANDBOX_USER_ID=$(id -u) \
-e SANDBOX_VOLUMES=$SANDBOX_VOLUMES \
-e LLM_API_KEY=$LLM_API_KEY \
-e LLM_MODEL=$LLM_MODEL \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands-state:/.openhands-state \
--add-host host.docker.internal:host-gateway \
--name openhands-app-$(date +%Y%m%d%H%M%S) \
docker.all-hands.dev/all-hands-ai/openhands:0.38 \
python -m openhands.core.cli
```
Cette commande lancera une session interactive dans Docker où vous pourrez saisir des tâches et recevoir des réponses d'OpenHands.
Le paramètre `-e SANDBOX_USER_ID=$(id -u)` est transmis à la commande Docker pour s'assurer que l'utilisateur du sandbox correspond aux permissions de l'utilisateur hôte. Cela empêche l'agent de créer des fichiers appartenant à root dans l'espace de travail monté.
@@ -1,95 +0,0 @@
# Sandbox personnalisé
:::note
Ce guide est destiné aux utilisateurs qui souhaitent utiliser leur propre image Docker personnalisée pour l'environnement d'exécution. Par exemple, avec certains outils ou langages de programmation préinstallés.
:::
Le sandbox est l'endroit où l'agent effectue ses tâches. Au lieu d'exécuter des commandes directement sur votre ordinateur (ce qui pourrait être risqué), l'agent les exécute à l'intérieur d'un conteneur Docker.
Le sandbox OpenHands par défaut (`python-nodejs:python3.12-nodejs22` de [nikolaik/python-nodejs](https://hub.docker.com/r/nikolaik/python-nodejs)) est livré avec certains packages installés comme python et Node.js, mais peut nécessiter d'autres logiciels installés par défaut.
Vous avez deux options pour la personnalisation :
- Utiliser une image existante avec les logiciels requis.
- Créer votre propre image Docker personnalisée.
Si vous choisissez la première option, vous pouvez ignorer la section `Créer votre image Docker`.
## Créer votre image Docker
Pour créer une image Docker personnalisée, elle doit être basée sur Debian.
Par exemple, si vous voulez qu'OpenHands ait `ruby` installé, vous pourriez créer un `Dockerfile` avec le contenu suivant :
```dockerfile
FROM nikolaik/python-nodejs:python3.12-nodejs22
# Install required packages
RUN apt-get update && apt-get install -y ruby
```
Ou vous pourriez utiliser une image de base spécifique à Ruby :
```dockerfile
FROM ruby:latest
```
Enregistrez ce fichier dans un dossier. Ensuite, construisez votre image Docker (par exemple, nommée custom-image) en naviguant vers le dossier dans le terminal et en exécutant :
```bash
docker build -t custom-image .
```
Cela produira une nouvelle image appelée `custom-image`, qui sera disponible dans Docker.
## Utilisation de la commande Docker
Lorsque vous exécutez OpenHands en utilisant [la commande docker](/modules/usage/installation#start-the-app), remplacez `-e SANDBOX_RUNTIME_CONTAINER_IMAGE=...` par `-e SANDBOX_BASE_CONTAINER_IMAGE=<nom de l'image personnalisée>` :
```commandline
docker run -it --rm --pull=always \
-e SANDBOX_BASE_CONTAINER_IMAGE=custom-image \
...
```
## Utilisation du flux de travail de développement
### Configuration
Tout d'abord, assurez-vous de pouvoir exécuter OpenHands en suivant les instructions dans [Development.md](https://github.com/All-Hands-AI/OpenHands/blob/main/Development.md).
### Spécifier l'image de base du Sandbox
Dans le fichier `config.toml` du répertoire OpenHands, définissez `base_container_image` sur l'image que vous souhaitez utiliser. Il peut s'agir d'une image que vous avez déjà téléchargée ou que vous avez construite :
```bash
[core]
...
[sandbox]
base_container_image="custom-image"
```
### Options de configuration supplémentaires
Le fichier `config.toml` prend en charge plusieurs autres options pour personnaliser votre sandbox :
```toml
[core]
# Install additional dependencies when the runtime is built
# Can contain any valid shell commands
# If you need the path to the Python interpreter in any of these commands, you can use the $OH_INTERPRETER_PATH variable
runtime_extra_deps = """
pip install numpy pandas
apt-get update && apt-get install -y ffmpeg
"""
# Set environment variables for the runtime
# Useful for configuration that needs to be available at runtime
runtime_startup_env_vars = { DATABASE_URL = "postgresql://user:pass@localhost/db" }
# Specify platform for multi-architecture builds (e.g., "linux/amd64" or "linux/arm64")
platform = "linux/amd64"
```
### Exécution
Exécutez OpenHands en lançant ```make run``` dans le répertoire principal.
@@ -1,71 +0,0 @@
# Débogage
Ce qui suit est destiné à servir d'introduction au débogage d'OpenHands à des fins de développement.
## Serveur / VSCode
Le fichier `launch.json` suivant permettra de déboguer les éléments de l'agent, du contrôleur et du serveur, mais pas le bac à sable (qui s'exécute dans Docker). Il ignorera tous les changements dans le répertoire `workspace/` :
```
{
"version": "0.2.0",
"configurations": [
{
"name": "OpenHands CLI",
"type": "debugpy",
"request": "launch",
"module": "openhands.core.cli",
"justMyCode": false
},
{
"name": "OpenHands WebApp",
"type": "debugpy",
"request": "launch",
"module": "uvicorn",
"args": [
"openhands.server.listen:app",
"--reload",
"--reload-exclude",
"${workspaceFolder}/workspace",
"--port",
"3000"
],
"justMyCode": false
}
]
}
```
Des configurations de débogage plus spécifiques qui incluent davantage de paramètres peuvent être spécifiées :
```
...
{
"name": "Debug CodeAct",
"type": "debugpy",
"request": "launch",
"module": "openhands.core.main",
"args": [
"-t",
"Ask me what your task is.",
"-d",
"${workspaceFolder}/workspace",
"-c",
"CodeActAgent",
"-l",
"llm.o1",
"-n",
"prompts"
],
"justMyCode": false
}
...
```
Les valeurs dans l'extrait ci-dessus peuvent être mises à jour de sorte que :
* *t* : la tâche
* *d* : le répertoire de travail openhands
* *c* : l'agent
* *l* : la configuration LLM (prédéfinie dans config.toml)
* *n* : nom de session (par exemple, nom d'eventstream)
@@ -1,74 +0,0 @@
---
sidebar_position: 9
---
# Aperçu du développement
Ce guide fournit un aperçu des principales ressources de documentation disponibles dans le dépôt OpenHands. Que vous souhaitiez contribuer, comprendre l'architecture ou travailler sur des composants spécifiques, ces ressources vous aideront à naviguer efficacement dans le code.
## Documentation principale
### Fondamentaux du projet
- **Aperçu principal du projet** (`/README.md`)
Le point d'entrée principal pour comprendre OpenHands, y compris les fonctionnalités et les instructions de configuration de base.
- **Guide de développement** (`/Development.md`)
Guide complet pour les développeurs travaillant sur OpenHands, incluant la configuration, les exigences et les flux de travail de développement.
- **Directives de contribution** (`/CONTRIBUTING.md`)
Informations essentielles pour les contributeurs, couvrant le style de code, le processus de PR et les flux de travail de contribution.
### Documentation des composants
#### Frontend
- **Application Frontend** (`/frontend/README.md`)
Guide complet pour configurer et développer l'application frontend basée sur React.
#### Backend
- **Implémentation Backend** (`/openhands/README.md`)
Documentation détaillée de l'implémentation et de l'architecture du backend Python.
- **Documentation du serveur** (`/openhands/server/README.md`)
Détails d'implémentation du serveur, documentation API et architecture des services.
- **Environnement d'exécution** (`/openhands/runtime/README.md`)
Documentation couvrant l'environnement d'exécution, le modèle d'exécution et les configurations d'exécution.
#### Infrastructure
- **Documentation des conteneurs** (`/containers/README.md`)
Informations complètes sur les conteneurs Docker, les stratégies de déploiement et la gestion des conteneurs.
### Tests et évaluation
- **Guide des tests unitaires** (`/tests/unit/README.md`)
Instructions pour écrire, exécuter et maintenir les tests unitaires.
- **Cadre d'évaluation** (`/evaluation/README.md`)
Documentation du cadre d'évaluation, des benchmarks et des tests de performance.
### Fonctionnalités avancées
- **Architecture des microagents** (`/microagents/README.md`)
Informations détaillées sur l'architecture des microagents, leur implémentation et leur utilisation.
### Normes de documentation
- **Guide de style de documentation** (`/docs/DOC_STYLE_GUIDE.md`)
Normes et directives pour la rédaction et la maintenance de la documentation du projet.
## Débuter avec le développement
Si vous débutez dans le développement avec OpenHands, nous vous recommandons de suivre cette séquence :
1. Commencez par le `README.md` principal pour comprendre l'objectif et les fonctionnalités du projet
2. Consultez les directives de `CONTRIBUTING.md` si vous prévoyez de contribuer
3. Suivez les instructions de configuration dans `Development.md`
4. Plongez dans la documentation spécifique des composants selon votre domaine d'intérêt :
- Les développeurs frontend devraient se concentrer sur `/frontend/README.md`
- Les développeurs backend devraient commencer par `/openhands/README.md`
- Le travail d'infrastructure devrait commencer par `/containers/README.md`
## Mises à jour de la documentation
Lorsque vous apportez des modifications au code, veuillez vous assurer que :
1. La documentation pertinente est mise à jour pour refléter vos changements
2. Les nouvelles fonctionnalités sont documentées dans les fichiers README appropriés
3. Tout changement d'API est reflété dans la documentation du serveur
4. La documentation suit le guide de style dans `/docs/DOC_STYLE_GUIDE.md`
@@ -1,278 +0,0 @@
# Évaluation
Ce guide fournit un aperçu de la façon d'intégrer votre propre benchmark d'évaluation dans le framework OpenHands.
## Configuration de l'environnement et configuration du LLM
Veuillez suivre les instructions [ici](https://github.com/All-Hands-AI/OpenHands/blob/main/Development.md) pour configurer votre environnement de développement local.
OpenHands en mode développement utilise `config.toml` pour suivre la plupart des configurations.
Voici un exemple de fichier de configuration que vous pouvez utiliser pour définir et utiliser plusieurs LLM :
```toml
[llm]
# IMPORTANT: ajoutez votre clé API ici et définissez le modèle que vous souhaitez évaluer
model = "claude-3-5-sonnet-20241022"
api_key = "sk-XXX"
[llm.eval_gpt4_1106_preview_llm]
model = "gpt-4-1106-preview"
api_key = "XXX"
temperature = 0.0
[llm.eval_some_openai_compatible_model_llm]
model = "openai/MODEL_NAME"
base_url = "https://OPENAI_COMPATIBLE_URL/v1"
api_key = "XXX"
temperature = 0.0
```
## Comment utiliser OpenHands en ligne de commande
OpenHands peut être exécuté depuis la ligne de commande en utilisant le format suivant :
```bash
poetry run python ./openhands/core/main.py \
-i <max_iterations> \
-t "<task_description>" \
-c <agent_class> \
-l <llm_config>
```
Par exemple :
```bash
poetry run python ./openhands/core/main.py \
-i 10 \
-t "Write me a bash script that prints hello world." \
-c CodeActAgent \
-l llm
```
Cette commande exécute OpenHands avec :
- Un maximum de 10 itérations
- La description de tâche spécifiée
- Utilisant le CodeActAgent
- Avec la configuration LLM définie dans la section `llm` de votre fichier `config.toml`
## Comment fonctionne OpenHands
Le point d'entrée principal d'OpenHands se trouve dans `openhands/core/main.py`. Voici un flux simplifié de son fonctionnement :
1. Analyser les arguments de ligne de commande et charger la configuration
2. Créer un environnement d'exécution en utilisant `create_runtime()`
3. Initialiser l'agent spécifié
4. Exécuter le contrôleur en utilisant `run_controller()`, qui :
- Attache le runtime à l'agent
- Exécute la tâche de l'agent
- Renvoie un état final une fois terminé
La fonction `run_controller()` est le cœur de l'exécution d'OpenHands. Elle gère l'interaction entre l'agent, le runtime et la tâche, en gérant des éléments comme la simulation d'entrée utilisateur et le traitement des événements.
## Façon la plus simple de commencer : Explorer les benchmarks existants
Nous vous encourageons à examiner les différents benchmarks d'évaluation disponibles dans le [répertoire `evaluation/benchmarks/`](https://github.com/All-Hands-AI/OpenHands/blob/main/evaluation/benchmarks) de notre dépôt.
Pour intégrer votre propre benchmark, nous vous suggérons de commencer par celui qui ressemble le plus à vos besoins. Cette approche peut considérablement simplifier votre processus d'intégration, vous permettant de vous appuyer sur des structures existantes et de les adapter à vos exigences spécifiques.
## Comment créer un workflow d'évaluation
Pour créer un workflow d'évaluation pour votre benchmark, suivez ces étapes :
1. Importez les utilitaires OpenHands pertinents :
```python
import openhands.agenthub
from evaluation.utils.shared import (
EvalMetadata,
EvalOutput,
make_metadata,
prepare_dataset,
reset_logger_for_multiprocessing,
run_evaluation,
)
from openhands.controller.state.state import State
from openhands.core.config import (
AppConfig,
SandboxConfig,
get_llm_config_arg,
parse_arguments,
)
from openhands.core.logger import openhands_logger as logger
from openhands.core.main import create_runtime, run_controller
from openhands.events.action import CmdRunAction
from openhands.events.observation import CmdOutputObservation, ErrorObservation
from openhands.runtime.runtime import Runtime
```
2. Créez une configuration :
```python
def get_config(instance: pd.Series, metadata: EvalMetadata) -> AppConfig:
config = AppConfig(
default_agent=metadata.agent_class,
runtime='docker',
max_iterations=metadata.max_iterations,
sandbox=SandboxConfig(
base_container_image='your_container_image',
enable_auto_lint=True,
timeout=300,
),
)
config.set_llm_config(metadata.llm_config)
return config
```
3. Initialisez le runtime et configurez l'environnement d'évaluation :
```python
def initialize_runtime(runtime: Runtime, instance: pd.Series):
# Configurez votre environnement d'évaluation ici
# Par exemple, définir des variables d'environnement, préparer des fichiers, etc.
pass
```
4. Créez une fonction pour traiter chaque instance :
```python
from openhands.utils.async_utils import call_async_from_sync
def process_instance(instance: pd.Series, metadata: EvalMetadata) -> EvalOutput:
config = get_config(instance, metadata)
runtime = create_runtime(config)
call_async_from_sync(runtime.connect)
initialize_runtime(runtime, instance)
instruction = get_instruction(instance, metadata)
state = run_controller(
config=config,
task_str=instruction,
runtime=runtime,
fake_user_response_fn=your_user_response_function,
)
# Évaluez les actions de l'agent
evaluation_result = await evaluate_agent_actions(runtime, instance)
return EvalOutput(
instance_id=instance.instance_id,
instruction=instruction,
test_result=evaluation_result,
metadata=metadata,
history=compatibility_for_eval_history_pairs(state.history),
metrics=state.metrics.get() if state.metrics else None,
error=state.last_error if state and state.last_error else None,
)
```
5. Exécutez l'évaluation :
```python
metadata = make_metadata(llm_config, dataset_name, agent_class, max_iterations, eval_note, eval_output_dir)
output_file = os.path.join(metadata.eval_output_dir, 'output.jsonl')
instances = prepare_dataset(your_dataset, output_file, eval_n_limit)
await run_evaluation(
instances,
metadata,
output_file,
num_workers,
process_instance
)
```
Ce workflow configure la configuration, initialise l'environnement d'exécution, traite chaque instance en exécutant l'agent et en évaluant ses actions, puis collecte les résultats dans un objet `EvalOutput`. La fonction `run_evaluation` gère la parallélisation et le suivi de la progression.
N'oubliez pas de personnaliser les fonctions `get_instruction`, `your_user_response_function` et `evaluate_agent_actions` selon les exigences spécifiques de votre benchmark.
En suivant cette structure, vous pouvez créer un workflow d'évaluation robuste pour votre benchmark dans le framework OpenHands.
## Comprendre la fonction `user_response_fn`
La fonction `user_response_fn` est un composant crucial dans le workflow d'évaluation d'OpenHands. Elle simule l'interaction utilisateur avec l'agent, permettant des réponses automatisées pendant le processus d'évaluation. Cette fonction est particulièrement utile lorsque vous souhaitez fournir des réponses cohérentes et prédéfinies aux requêtes ou actions de l'agent.
### Workflow et interaction
Le workflow correct pour gérer les actions et la fonction `user_response_fn` est le suivant :
1. L'agent reçoit une tâche et commence à la traiter
2. L'agent émet une Action
3. Si l'Action est exécutable (par exemple, CmdRunAction, IPythonRunCellAction) :
- Le Runtime traite l'Action
- Le Runtime renvoie une Observation
4. Si l'Action n'est pas exécutable (généralement une MessageAction) :
- La fonction `user_response_fn` est appelée
- Elle renvoie une réponse utilisateur simulée
5. L'agent reçoit soit l'Observation, soit la réponse simulée
6. Les étapes 2 à 5 se répètent jusqu'à ce que la tâche soit terminée ou que le nombre maximum d'itérations soit atteint
Voici une représentation visuelle plus précise :
```
[Agent]
|
v
[Émet Action]
|
v
[L'Action est-elle exécutable ?]
/ \
Oui Non
| |
v v
[Runtime] [user_response_fn]
| |
v v
[Renvoie Observation] [Réponse simulée]
\ /
\ /
v v
[L'agent reçoit le feedback]
|
v
[Continue ou termine la tâche]
```
Dans ce workflow :
- Les actions exécutables (comme l'exécution de commandes ou de code) sont gérées directement par le Runtime
- Les actions non exécutables (généralement lorsque l'agent veut communiquer ou demander des clarifications) sont gérées par la fonction `user_response_fn`
- L'agent traite ensuite le feedback, qu'il s'agisse d'une Observation du Runtime ou d'une réponse simulée de la fonction `user_response_fn`
Cette approche permet une gestion automatisée des actions concrètes et des interactions utilisateur simulées, ce qui la rend adaptée aux scénarios d'évaluation où vous souhaitez tester la capacité de l'agent à accomplir des tâches avec une intervention humaine minimale.
### Exemple d'implémentation
Voici un exemple de fonction `user_response_fn` utilisée dans l'évaluation SWE-Bench :
```python
def codeact_user_response(state: State | None) -> str:
msg = (
'Please continue working on the task on whatever approach you think is suitable.\n'
'If you think you have solved the task, please first send your answer to user through message and then <execute_bash> exit </execute_bash>.\n'
'IMPORTANT: YOU SHOULD NEVER ASK FOR HUMAN HELP.\n'
)
if state and state.history:
# check if the agent has tried to talk to the user 3 times, if so, let the agent know it can give up
user_msgs = [
event
for event in state.history
if isinstance(event, MessageAction) and event.source == 'user'
]
if len(user_msgs) >= 2:
# let the agent know that it can give up when it has tried 3 times
return (
msg
+ 'If you want to give up, run: <execute_bash> exit </execute_bash>.\n'
)
return msg
```
Cette fonction fait ce qui suit :
1. Fournit un message standard encourageant l'agent à continuer à travailler
2. Vérifie combien de fois l'agent a tenté de communiquer avec l'utilisateur
3. Si l'agent a fait plusieurs tentatives, elle lui fournit une option pour abandonner
En utilisant cette fonction, vous pouvez assurer un comportement cohérent à travers plusieurs séries d'évaluations et empêcher l'agent de rester bloqué en attendant une entrée humaine.
@@ -1,51 +0,0 @@
# Utilisation de l'Action GitHub OpenHands
Ce guide explique comment utiliser l'Action GitHub OpenHands dans vos propres projets.
## Utilisation de l'Action dans le Dépôt OpenHands
Pour utiliser l'Action GitHub OpenHands dans un dépôt, vous pouvez :
1. Créer une issue dans le dépôt.
2. Ajouter l'étiquette `fix-me` à l'issue ou laisser un commentaire sur l'issue commençant par `@openhands-agent`.
L'action se déclenchera automatiquement et tentera de résoudre l'issue.
## Installation de l'Action dans un Nouveau Dépôt
Pour installer l'Action GitHub OpenHands dans votre propre dépôt, suivez
le [README du Résolveur OpenHands](https://github.com/All-Hands-AI/OpenHands/blob/main/openhands/resolver/README.md).
## Conseils d'Utilisation
### Résolution itérative
1. Créez une issue dans le dépôt.
2. Ajoutez l'étiquette `fix-me` à l'issue, ou laissez un commentaire commençant par `@openhands-agent`.
3. Examinez la tentative de résolution de l'issue en vérifiant la pull request.
4. Donnez votre feedback via des commentaires généraux, des commentaires de révision ou des commentaires en ligne.
5. Ajoutez l'étiquette `fix-me` à la pull request, ou répondez à un commentaire spécifique en commençant par `@openhands-agent`.
### Étiquette versus Macro
- Étiquette (`fix-me`) : Demande à OpenHands de traiter **l'ensemble** de l'issue ou de la pull request.
- Macro (`@openhands-agent`) : Demande à OpenHands de considérer uniquement la description de l'issue/pull request et **le commentaire spécifique**.
## Paramètres Avancés
### Ajouter des paramètres personnalisés au dépôt
Vous pouvez fournir des instructions personnalisées pour OpenHands en suivant le [README du résolveur](https://github.com/All-Hands-AI/OpenHands/blob/main/openhands/resolver/README.md#providing-custom-instructions).
### Configurations personnalisées
Le résolveur GitHub vérifiera automatiquement les [secrets du dépôt](https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions?tool=webui#creating-secrets-for-a-repository) valides ou les [variables du dépôt](https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/store-information-in-variables#creating-configuration-variables-for-a-repository) pour personnaliser son comportement.
Les options de personnalisation que vous pouvez définir sont :
| **Nom de l'attribut** | **Type** | **Objectif** | **Exemple** |
| -------------------------------- | -------- | --------------------------------------------------------------------------------------------------- | -------------------------------------------------- |
| `LLM_MODEL` | Variable | Définir le LLM à utiliser avec OpenHands | `LLM_MODEL="anthropic/claude-3-5-sonnet-20241022"` |
| `OPENHANDS_MAX_ITER` | Variable | Définir la limite maximale d'itérations de l'agent | `OPENHANDS_MAX_ITER=10` |
| `OPENHANDS_MACRO` | Variable | Personnaliser la macro par défaut pour invoquer le résolveur | `OPENHANDS_MACRO=@resolveit` |
| `OPENHANDS_BASE_CONTAINER_IMAGE` | Variable | Sandbox personnalisé ([en savoir plus](https://docs.all-hands.dev/modules/usage/how-to/custom-sandbox-guide)) | `OPENHANDS_BASE_CONTAINER_IMAGE="custom_image"` |
| `TARGET_BRANCH` | Variable | Fusionner vers une branche autre que `main` | `TARGET_BRANCH="dev"` |
@@ -1,142 +0,0 @@
# Mode GUI
OpenHands fournit un mode d'Interface Graphique Utilisateur (GUI) pour interagir avec l'assistant IA.
## Installation et Configuration
1. Suivez les instructions d'installation pour installer OpenHands.
2. Après avoir exécuté la commande, accédez à OpenHands à [http://localhost:3000](http://localhost:3000).
## Interagir avec l'interface graphique
### Configuration initiale
1. Lors du premier lancement, vous verrez une fenêtre de paramètres.
2. Sélectionnez un `Fournisseur LLM` et un `Modèle LLM` dans les menus déroulants. Si le modèle requis n'existe pas dans la liste,
sélectionnez `voir les paramètres avancés`. Ensuite, activez les options `Avancées` et saisissez-le avec le préfixe correct dans la
zone de texte `Modèle personnalisé`.
3. Entrez la `Clé API` correspondante pour le fournisseur choisi.
4. Cliquez sur `Enregistrer les modifications` pour appliquer les paramètres.
### Jetons de contrôle de version
OpenHands prend en charge plusieurs fournisseurs de contrôle de version. Vous pouvez configurer des jetons pour plusieurs fournisseurs simultanément.
#### Configuration du jeton GitHub
OpenHands exporte automatiquement un `GITHUB_TOKEN` vers l'environnement shell s'il est fourni :
<details>
<summary>Configuration d'un jeton GitHub</summary>
1. **Générer un jeton d'accès personnel (PAT)** :
- Sur GitHub, allez dans Paramètres > Paramètres développeur > Jetons d'accès personnels > Jetons (classique).
- **Nouveau jeton (classique)**
- Portées requises :
- `repo` (Contrôle complet des dépôts privés)
- **Jetons à portée précise**
- Tous les dépôts (Vous pouvez sélectionner des dépôts spécifiques, mais cela affectera les résultats de recherche)
- Autorisations minimales (Sélectionnez `Meta Data = Lecture seule` pour la recherche, `Pull Requests = Lecture et écriture` et `Content = Lecture et écriture` pour la création de branches)
2. **Entrer le jeton dans OpenHands** :
- Cliquez sur le bouton Paramètres (icône d'engrenage).
- Collez votre jeton dans le champ `Jeton GitHub`.
- Cliquez sur `Enregistrer` pour appliquer les modifications.
</details>
<details>
<summary>Politiques de jetons organisationnels</summary>
Si vous travaillez avec des dépôts organisationnels, une configuration supplémentaire peut être nécessaire :
1. **Vérifier les exigences de l'organisation** :
- Les administrateurs de l'organisation peuvent imposer des politiques de jetons spécifiques.
- Certaines organisations exigent que les jetons soient créés avec SSO activé.
- Consultez les [paramètres de politique de jetons](https://docs.github.com/en/organizations/managing-programmatic-access-to-your-organization/setting-a-personal-access-token-policy-for-your-organization) de votre organisation.
2. **Vérifier l'accès à l'organisation** :
- Accédez à vos paramètres de jeton sur GitHub.
- Recherchez l'organisation sous `Accès à l'organisation`.
- Si nécessaire, cliquez sur `Activer SSO` à côté de votre organisation.
- Complétez le processus d'autorisation SSO.
</details>
<details>
<summary>Dépannage</summary>
Problèmes courants et solutions :
- **Jeton non reconnu** :
- Assurez-vous que le jeton est correctement enregistré dans les paramètres.
- Vérifiez que le jeton n'a pas expiré.
- Vérifiez que le jeton dispose des portées requises.
- Essayez de régénérer le jeton.
- **Accès à l'organisation refusé** :
- Vérifiez si SSO est requis mais non activé.
- Vérifiez l'appartenance à l'organisation.
- Contactez l'administrateur de l'organisation si les politiques de jetons bloquent l'accès.
- **Vérification du fonctionnement du jeton** :
- L'application affichera une coche verte si le jeton est valide.
- Essayez d'accéder à un dépôt pour confirmer les autorisations.
- Vérifiez la console du navigateur pour tout message d'erreur.
</details>
#### Configuration du jeton GitLab
OpenHands exporte automatiquement un `GITLAB_TOKEN` vers l'environnement shell s'il est fourni :
<details>
<summary>Configuration d'un jeton GitLab</summary>
1. **Générer un jeton d'accès personnel (PAT)** :
- Sur GitLab, allez dans Paramètres utilisateur > Jetons d'accès.
- Créez un nouveau jeton avec les portées suivantes :
- `api` (Accès API)
- `read_user` (Lire les informations utilisateur)
- `read_repository` (Lire le dépôt)
- `write_repository` (Écrire dans le dépôt)
- Définissez une date d'expiration ou laissez-la vide pour un jeton sans expiration.
2. **Entrer le jeton dans OpenHands** :
- Cliquez sur le bouton Paramètres (icône d'engrenage).
- Collez votre jeton dans le champ `Jeton GitLab`.
- Entrez l'URL de votre instance GitLab si vous utilisez GitLab auto-hébergé.
- Cliquez sur `Enregistrer` pour appliquer les modifications.
</details>
<details>
<summary>Dépannage</summary>
Problèmes courants et solutions :
- **Jeton non reconnu** :
- Assurez-vous que le jeton est correctement enregistré dans les paramètres.
- Vérifiez que le jeton n'a pas expiré.
- Vérifiez que le jeton dispose des portées requises.
- Pour les instances auto-hébergées, vérifiez l'URL correcte de l'instance.
- **Accès refusé** :
- Vérifiez les autorisations d'accès au projet.
- Vérifiez si le jeton dispose des portées nécessaires.
- Pour les dépôts de groupe/organisation, assurez-vous d'avoir un accès approprié.
</details>
### Paramètres avancés
1. Dans la page Paramètres, activez les options `Avancées` pour accéder aux paramètres supplémentaires.
2. Utilisez la zone de texte `Modèle personnalisé` pour saisir manuellement un modèle s'il n'est pas dans la liste.
3. Spécifiez une `URL de base` si requis par votre fournisseur LLM.
### Interagir avec l'IA
1. Tapez votre requête dans la zone de saisie.
2. Cliquez sur le bouton d'envoi ou appuyez sur Entrée pour soumettre votre message.
3. L'IA traitera votre saisie et fournira une réponse dans la fenêtre de discussion.
4. Vous pouvez poursuivre la conversation en posant des questions complémentaires ou en fournissant des informations supplémentaires.
## Conseils pour une utilisation efficace
- Soyez précis dans vos demandes pour obtenir les réponses les plus précises et utiles, comme décrit dans les [meilleures pratiques de prompt](../prompting/prompting-best-practices).
- Utilisez l'un des modèles recommandés, comme décrit dans la [section LLMs](usage/llms/llms.md).
N'oubliez pas que le mode GUI d'OpenHands est conçu pour rendre votre interaction avec l'assistant IA aussi fluide et intuitive
que possible. N'hésitez pas à explorer ses fonctionnalités pour maximiser votre productivité.
@@ -1,59 +0,0 @@
# Mode Headless
Vous pouvez exécuter OpenHands avec une seule commande, sans démarrer l'application web.
Cela facilite l'écriture de scripts et l'automatisation des tâches avec OpenHands.
C'est différent du [Mode CLI](cli-mode), qui est interactif et plus adapté au développement actif.
## Avec Python
Pour exécuter OpenHands en mode headless avec Python :
1. Assurez-vous d'avoir suivi les [instructions de configuration pour le développement](https://github.com/All-Hands-AI/OpenHands/blob/main/Development.md).
2. Exécutez la commande suivante :
```bash
poetry run python -m openhands.core.main -t "write a bash script that prints hi"
```
Vous devrez vous assurer de définir votre modèle, clé API et autres paramètres via des variables d'environnement
[ou le fichier `config.toml`](https://github.com/All-Hands-AI/OpenHands/blob/main/config.template.toml).
## Avec Docker
Pour exécuter OpenHands en mode Headless avec Docker :
1. Définissez les variables d'environnement suivantes dans votre terminal :
- `SANDBOX_VOLUMES` pour spécifier le répertoire auquel OpenHands doit accéder (Ex : `export SANDBOX_VOLUMES=$(pwd)/workspace:/workspace:rw`).
- L'agent travaille dans `/workspace` par défaut, donc montez votre répertoire de projet à cet emplacement si vous souhaitez que l'agent modifie des fichiers.
- Pour les données en lecture seule, utilisez un chemin de montage différent (Ex : `export SANDBOX_VOLUMES=$(pwd)/workspace:/workspace:rw,/path/to/large/dataset:/data:ro`).
- `LLM_MODEL` pour le modèle à utiliser (Ex : `export LLM_MODEL="anthropic/claude-3-5-sonnet-20241022"`).
- `LLM_API_KEY` pour la clé API (Ex : `export LLM_API_KEY="sk_test_12345"`).
2. Exécutez la commande Docker suivante :
```bash
docker run -it \
--pull=always \
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.38-nikolaik \
-e SANDBOX_USER_ID=$(id -u) \
-e SANDBOX_VOLUMES=$SANDBOX_VOLUMES \
-e LLM_API_KEY=$LLM_API_KEY \
-e LLM_MODEL=$LLM_MODEL \
-e LOG_ALL_EVENTS=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands-state:/.openhands-state \
--add-host host.docker.internal:host-gateway \
--name openhands-app-$(date +%Y%m%d%H%M%S) \
docker.all-hands.dev/all-hands-ai/openhands:0.38 \
python -m openhands.core.main -t "write a bash script that prints hi"
```
Le paramètre `-e SANDBOX_USER_ID=$(id -u)` est transmis à la commande Docker pour s'assurer que l'utilisateur du sandbox correspond aux permissions de l'utilisateur hôte. Cela empêche l'agent de créer des fichiers appartenant à root dans l'espace de travail monté.
## Configurations avancées du mode Headless
Pour voir toutes les options de configuration disponibles pour le mode headless, exécutez la commande Python avec l'option `--help`.
### Journaux supplémentaires
Pour que le mode headless enregistre toutes les actions de l'agent, exécutez dans le terminal : `export LOG_ALL_EVENTS=true`
@@ -1,18 +0,0 @@
# Persistance des données de session
Avec l'installation standard, les données de session sont stockées en mémoire. Actuellement, si le service OpenHands est redémarré,
les sessions précédentes deviennent invalides (un nouveau secret est généré) et ne sont donc pas récupérables.
## Comment persister les données de session
### Workflow de développement
Dans le fichier `config.toml`, spécifiez ce qui suit :
```
[core]
...
file_store="local"
file_store_path="/absolute/path/to/openhands/cache/directory"
jwt_secret="secretpass"
```
@@ -1,121 +0,0 @@
# Exécution d'OpenHands
## Configuration système requise
- MacOS avec [support Docker Desktop](https://docs.docker.com/desktop/setup/install/mac-install/#system-requirements)
- Linux
- Windows avec [WSL](https://learn.microsoft.com/en-us/windows/wsl/install) et [support Docker Desktop](https://docs.docker.com/desktop/setup/install/windows-install/#system-requirements)
Un système avec un processeur moderne et un minimum de **4 Go de RAM** est recommandé pour exécuter OpenHands.
## Prérequis
<details>
<summary>MacOS</summary>
**Docker Desktop**
1. [Installer Docker Desktop sur Mac](https://docs.docker.com/desktop/setup/install/mac-install).
2. Ouvrez Docker Desktop, allez dans `Settings > Advanced` et assurez-vous que `Allow the default Docker socket to be used` est activé.
</details>
<details>
<summary>Linux</summary>
:::note
Testé avec Ubuntu 22.04.
:::
**Docker Desktop**
1. [Installer Docker Desktop sur Linux](https://docs.docker.com/desktop/setup/install/linux/).
</details>
<details>
<summary>Windows</summary>
**WSL**
1. [Installer WSL](https://learn.microsoft.com/en-us/windows/wsl/install).
2. Exécutez `wsl --version` dans powershell et confirmez `Default Version: 2`.
**Docker Desktop**
1. [Installer Docker Desktop sur Windows](https://docs.docker.com/desktop/setup/install/windows-install).
2. Ouvrez Docker Desktop, allez dans `Settings` et confirmez les points suivants :
- General: `Use the WSL 2 based engine` est activé.
- Resources > WSL Integration: `Enable integration with my default WSL distro` est activé.
:::note
La commande docker ci-dessous pour démarrer l'application doit être exécutée dans le terminal WSL.
:::
</details>
## Démarrer l'application
La façon la plus simple d'exécuter OpenHands est dans Docker.
```bash
docker pull docker.all-hands.dev/all-hands-ai/runtime:0.38-nikolaik
docker run -it --rm --pull=always \
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.38-nikolaik \
-e LOG_ALL_EVENTS=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands-state:/.openhands-state \
-p 3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands-app \
docker.all-hands.dev/all-hands-ai/openhands:0.38
```
Vous trouverez OpenHands en cours d'exécution à l'adresse http://localhost:3000 !
Vous pouvez également [connecter OpenHands à votre système de fichiers local](https://docs.all-hands.dev/modules/usage/runtimes/docker#connecting-to-your-filesystem),
exécuter OpenHands en [mode headless](https://docs.all-hands.dev/modules/usage/how-to/headless-mode) scriptable,
interagir avec lui via une [CLI conviviale](https://docs.all-hands.dev/modules/usage/how-to/cli-mode),
ou l'exécuter sur des problèmes étiquetés avec [une action GitHub](https://docs.all-hands.dev/modules/usage/how-to/github-action).
## Configuration
Après avoir lancé OpenHands, vous **devez** sélectionner un `LLM Provider` et un `LLM Model` et saisir une `API Key` correspondante.
Cela peut être fait lors de la fenêtre contextuelle des paramètres initiaux ou en sélectionnant le bouton `Settings`
(icône d'engrenage) dans l'interface utilisateur.
Si le modèle requis n'existe pas dans la liste, vous pouvez activer les options `Advanced` et le saisir manuellement avec le préfixe correct
dans la zone de texte `Custom Model`.
Les options `Advanced` vous permettent également de spécifier une `Base URL` si nécessaire.
### Obtenir une clé API
OpenHands nécessite une clé API pour accéder à la plupart des modèles de langage. Voici comment obtenir une clé API auprès des fournisseurs recommandés :
#### Anthropic (Claude)
1. [Créez un compte Anthropic](https://console.anthropic.com/).
2. [Générez une clé API](https://console.anthropic.com/settings/keys).
3. [Configurez la facturation](https://console.anthropic.com/settings/billing).
Envisagez de définir des limites d'utilisation pour contrôler les coûts.
#### OpenAI
1. [Créez un compte OpenAI](https://platform.openai.com/).
2. [Générez une clé API](https://platform.openai.com/api-keys).
3. [Configurez la facturation](https://platform.openai.com/account/billing/overview).
Vous êtes maintenant prêt à [commencer avec OpenHands](./getting-started).
## Versions
La [commande docker ci-dessus](./installation#start-the-app) extrait la version stable la plus récente d'OpenHands. Vous avez également d'autres options :
- Pour une version spécifique, remplacez $VERSION dans `openhands:$VERSION` et `runtime:$VERSION` par le numéro de version.
Nous utilisons SemVer, donc `0.9` pointera automatiquement vers la dernière version `0.9.x`, et `0` pointera vers la dernière version `0.x.x`.
- Pour la version de développement la plus à jour, remplacez $VERSION dans `openhands:$VERSION` et `runtime:$VERSION` par `main`.
Cette version est instable et est recommandée uniquement à des fins de test ou de développement.
Pour le flux de travail de développement, consultez [Development.md](https://github.com/All-Hands-AI/OpenHands/blob/main/Development.md).
Vous rencontrez des problèmes ? Consultez notre [Guide de dépannage](https://docs.all-hands.dev/modules/usage/troubleshooting).
@@ -1,109 +0,0 @@
---
sidebar_position: 1
---
# 💻 OpenHands
OpenHands est un **ingénieur logiciel IA autonome** capable d'exécuter des tâches d'ingénierie complexes et de collaborer activement avec les utilisateurs sur des projets de développement logiciel.
Ce projet est entièrement open-source, vous pouvez donc l'utiliser et le modifier comme bon vous semble.
:::tip
Explorez le code source d'OpenHands sur [GitHub](https://github.com/All-Hands-AI/OpenHands) ou rejoignez l'une de nos communautés !
<a href="https://github.com/All-Hands-AI/OpenHands/graphs/contributors">
<img
src="https://img.shields.io/github/contributors/All-Hands-AI/OpenHands?style=for-the-badge"
alt="Contributors"
/>
</a>
<a href="https://github.com/All-Hands-AI/OpenHands/network/members">
<img
src="https://img.shields.io/github/forks/All-Hands-AI/OpenHands?style=for-the-badge"
alt="Forks"
/>
</a>
<a href="https://github.com/All-Hands-AI/OpenHands/stargazers">
<img
src="https://img.shields.io/github/stars/All-Hands-AI/OpenHands?style=for-the-badge"
alt="Stargazers"
/>
</a>
<a href="https://github.com/All-Hands-AI/OpenHands/issues">
<img
src="https://img.shields.io/github/issues/All-Hands-AI/OpenHands?style=for-the-badge"
alt="Issues"
/>
</a>
<br></br>
<a href="https://github.com/All-Hands-AI/OpenHands/blob/main/LICENSE">
<img
src="https://img.shields.io/github/license/All-Hands-AI/OpenHands?style=for-the-badge"
alt="MIT License"
/>
</a>
<br></br>
<a href="https://join.slack.com/t/openhands-ai/shared_invite/zt-34zm4j0gj-Qz5kRHoca8DFCbqXPS~f_A">
<img
src="https://img.shields.io/badge/Slack-Join%20Us-red?logo=slack&logoColor=white&style=for-the-badge"
alt="Join our Slack community"
/>
</a>
<a href="https://discord.gg/ESHStjSjD4">
<img
src="https://img.shields.io/badge/Discord-Join%20Us-purple?logo=discord&logoColor=white&style=for-the-badge"
alt="Join our Discord community"
/>
</a>
:::
## 🛠️ Pour commencer
La manière la plus simple d'exécuter OpenHands est à l'intérieur d'un conteneur Docker. Il fonctionne mieux avec la version la plus récente de Docker, `26.0.0`.
Vous devez utiliser Linux, Mac OS ou WSL sur Windows.
Pour démarrer OpenHands dans un conteneur docker, exécutez les commandes suivantes dans votre terminal :
:::warning
Lorsque vous exécutez la commande suivante, les fichiers dans `./workspace` peuvent être modifiés ou supprimés.
:::
```bash
WORKSPACE_BASE=$(pwd)/workspace
docker run -it \
--pull=always \
-e SANDBOX_USER_ID=$(id -u) \
-e WORKSPACE_MOUNT_PATH=$WORKSPACE_BASE \
-v $WORKSPACE_BASE:/opt/workspace_base \
-v /var/run/docker.sock:/var/run/docker.sock \
-p 3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands-app-$(date +%Y%m%d%H%M%S) \
ghcr.io/all-hands-ai/openhands:main
```
Vous trouverez OpenHands fonctionnant à l'adresse [http://localhost:3000](http://localhost:3000) avec accès à `./workspace`. Pour qu'OpenHands fonctionne sur votre code, placez-le dans `./workspace`.
OpenHands n'aura accès qu'à ce dossier de workspace. Le reste de votre système ne sera pas affecté car il s'exécute dans un bac à sable sécurisé de docker.
:::tip
Si vous souhaitez utiliser la version **(instable !)** la plus récente, vous pouvez utiliser `ghcr.io/all-hands-ai/openhands:main` comme image (dernière ligne).
:::
Pour le workflow de développement, consultez [Development.md](https://github.com/All-Hands-AI/OpenHands/blob/main/Development.md).
Avez-vous des problèmes ? Consultez notre [Guide de dépannage](https://docs.all-hands.dev/modules/usage/troubleshooting).
:::warning
OpenHands est actuellement en cours de développement, mais vous pouvez déjà exécuter la version alpha pour voir le système de bout en bout en action.
:::
[contributors-shield]: https://img.shields.io/github/contributors/All-Hands-AI/OpenHands?style=for-the-badge
[contributors-url]: https://github.com/All-Hands-AI/OpenHands/graphs/contributors
[forks-shield]: https://img.shields.io/github/forks/All-Hands-AI/OpenHands?style=for-the-badge
[forks-url]: https://github.com/All-Hands-AI/OpenHands/network/members
[stars-shield]: https://img.shields.io/github/stars/All-Hands-AI/OpenHands?style=for-the-badge
[stars-url]: https://github.com/All-Hands-AI/OpenHands/stargazers
[issues-shield]: https://img.shields.io/github/issues/All-Hands-AI/OpenHands?style=for-the-badge
[issues-url]: https://github.com/All-Hands-AI/OpenHands/issues
[license-shield]: https://img.shields.io/github/license/All-Hands-AI/OpenHands?style=for-the-badge
[license-url]: https://github.com/All-Hands-AI/OpenHands/blob/main/LICENSE
@@ -1,29 +0,0 @@
# Aperçu des fonctionnalités d'OpenHands
![aperçu](/img/oh-features.png)
### Panneau de discussion
- Affiche la conversation entre l'utilisateur et OpenHands.
- OpenHands explique ses actions dans ce panneau.
### Modifications
- Montre les modifications de fichiers effectuées par OpenHands.
### VS Code
- VS Code intégré pour parcourir et modifier des fichiers.
- Peut également être utilisé pour télécharger et importer des fichiers.
### Terminal
- Un espace permettant à OpenHands et aux utilisateurs d'exécuter des commandes terminal.
### Jupyter
- Affiche toutes les commandes Python exécutées par OpenHands.
- Particulièrement utile lors de l'utilisation d'OpenHands pour des tâches de visualisation de données.
### Application
- Affiche le serveur web lorsqu'OpenHands exécute une application.
- Les utilisateurs peuvent interagir avec l'application en cours d'exécution.
### Navigateur
- Utilisé par OpenHands pour naviguer sur des sites web.
- Le navigateur n'est pas interactif.
@@ -1,41 +0,0 @@
# Azure
OpenHands utilise LiteLLM pour effectuer des appels aux modèles de chat d'Azure. Vous pouvez trouver leur documentation sur l'utilisation d'Azure comme fournisseur [ici](https://docs.litellm.ai/docs/providers/azure).
## Configuration d'Azure OpenAI
Lors de l'exécution d'OpenHands, vous devrez définir la variable d'environnement suivante en utilisant `-e` dans la
[commande docker run](../installation#running-openhands) :
```
LLM_API_VERSION="<api-version>" # ex. "2023-05-15"
```
Exemple :
```bash
docker run -it --pull=always \
-e LLM_API_VERSION="2023-05-15"
...
```
Ensuite, dans les paramètres de l'interface OpenHands :
:::note
Vous aurez besoin du nom de déploiement ChatGPT qui peut être trouvé sur la page des déploiements dans Azure. Il est référencé comme
&lt;deployment-name&gt; ci-dessous.
:::
1. Activez les options `Advanced`.
2. Définissez les éléments suivants :
- `Custom Model` à azure/&lt;deployment-name&gt;
- `Base URL` à votre URL de base de l'API Azure (ex. `https://example-endpoint.openai.azure.com`)
- `API Key` à votre clé API Azure
### Configuration d'Azure OpenAI
Lors de l'exécution d'OpenHands, définissez la variable d'environnement suivante en utilisant `-e` dans la
[commande docker run](../installation#running-openhands) :
```
LLM_API_VERSION="<api-version>" # ex. "2024-02-15-preview"
```
@@ -1,37 +0,0 @@
# Azure OpenAI LLM
## Complétion
OpenHands utilise LiteLLM pour les appels de complétion. Vous pouvez trouver leur documentation sur Azure [ici](https://docs.litellm.ai/docs/providers/azure)
### Configurations openai Azure
Lors de l'exécution de l'image Docker OpenHands, vous devrez définir les variables d'environnement suivantes en utilisant `-e` :
```
LLM_BASE_URL="<azure-api-base-url>" # e.g. "https://openai-gpt-4-test-v-1.openai.azure.com/"
LLM_API_KEY="<azure-api-key>"
LLM_MODEL="azure/<your-gpt-deployment-name>"
LLM_API_VERSION = "<api-version>" # e.g. "2024-02-15-preview"
```
:::note
Vous pouvez trouver le nom de votre déploiement ChatGPT sur la page des déploiements sur Azure. Par défaut ou initialement, il pourrait être le même que le nom du modèle de chat (par exemple 'GPT4-1106-preview'), mais il n'est pas obligé de l'être. Exécutez OpenHands, et une fois chargé dans le navigateur, allez dans Paramètres et définissez le modèle comme suit : "azure/&lt;your-actual-gpt-deployment-name&gt;". Si ce n'est pas dans la liste, entrez votre propre texte et enregistrez-le.
:::
## Embeddings
OpenHands utilise llama-index pour les embeddings. Vous pouvez trouver leur documentation sur Azure [ici](https://docs.llamaindex.ai/en/stable/api_reference/embeddings/azure_openai/)
### Configurations openai Azure
Le modèle utilisé pour les embeddings Azure OpenAI est "text-embedding-ada-002".
Vous avez besoin du nom de déploiement correct pour ce modèle dans votre compte Azure.
Lors de l'exécution d'OpenHands dans Docker, définissez les variables d'environnement suivantes en utilisant `-e` :
```
LLM_EMBEDDING_MODEL="azureopenai"
LLM_EMBEDDING_DEPLOYMENT_NAME = "<your-embedding-deployment-name>" # e.g. "TextEmbedding...<etc>"
LLM_API_VERSION = "<api-version>" # e.g. "2024-02-15-preview"
```
@@ -1,136 +0,0 @@
# Configurations LLM personnalisées
OpenHands permet de définir plusieurs configurations LLM nommées dans votre fichier `config.toml`. Cette fonctionnalité vous permet d'utiliser différentes configurations LLM pour différents usages, comme utiliser un modèle moins coûteux pour des tâches qui ne nécessitent pas de réponses de haute qualité, ou utiliser différents modèles avec différents paramètres pour des agents spécifiques.
## Comment ça fonctionne
Les configurations LLM nommées sont définies dans le fichier `config.toml` en utilisant des sections qui commencent par `llm.`. Par exemple :
```toml
# Configuration LLM par défaut
[llm]
model = "gpt-4"
api_key = "your-api-key"
temperature = 0.0
# Configuration LLM personnalisée pour un modèle moins cher
[llm.gpt3]
model = "gpt-3.5-turbo"
api_key = "your-api-key"
temperature = 0.2
# Une autre configuration personnalisée avec différents paramètres
[llm.high-creativity]
model = "gpt-4"
api_key = "your-api-key"
temperature = 0.8
top_p = 0.9
```
Chaque configuration nommée hérite de tous les paramètres de la section `[llm]` par défaut et peut remplacer n'importe lequel de ces paramètres. Vous pouvez définir autant de configurations personnalisées que nécessaire.
## Utilisation des configurations personnalisées
### Avec les agents
Vous pouvez spécifier quelle configuration LLM un agent doit utiliser en définissant le paramètre `llm_config` dans la section de configuration de l'agent :
```toml
[agent.RepoExplorerAgent]
# Utiliser la configuration GPT-3 moins chère pour cet agent
llm_config = 'gpt3'
[agent.CodeWriterAgent]
# Utiliser la configuration haute créativité pour cet agent
llm_config = 'high-creativity'
```
### Options de configuration
Chaque configuration LLM nommée prend en charge toutes les mêmes options que la configuration LLM par défaut. Celles-ci incluent :
- Sélection du modèle (`model`)
- Configuration de l'API (`api_key`, `base_url`, etc.)
- Paramètres du modèle (`temperature`, `top_p`, etc.)
- Paramètres de nouvelle tentative (`num_retries`, `retry_multiplier`, etc.)
- Limites de tokens (`max_input_tokens`, `max_output_tokens`)
- Et toutes les autres options de configuration LLM
Pour une liste complète des options disponibles, consultez la section Configuration LLM dans la documentation [Options de configuration](../configuration-options).
## Cas d'utilisation
Les configurations LLM personnalisées sont particulièrement utiles dans plusieurs scénarios :
- **Optimisation des coûts** : Utilisez des modèles moins chers pour des tâches qui ne nécessitent pas de réponses de haute qualité, comme l'exploration de dépôts ou les opérations simples sur les fichiers.
- **Réglage spécifique aux tâches** : Configurez différentes valeurs de température et de top_p pour des tâches qui nécessitent différents niveaux de créativité ou de déterminisme.
- **Différents fournisseurs** : Utilisez différents fournisseurs LLM ou points d'accès API pour différentes tâches.
- **Tests et développement** : Passez facilement d'une configuration de modèle à une autre pendant le développement et les tests.
## Exemple : Optimisation des coûts
Un exemple pratique d'utilisation de configurations LLM personnalisées pour optimiser les coûts :
```toml
# Configuration par défaut utilisant GPT-4 pour des réponses de haute qualité
[llm]
model = "gpt-4"
api_key = "your-api-key"
temperature = 0.0
# Configuration moins chère pour l'exploration de dépôts
[llm.repo-explorer]
model = "gpt-3.5-turbo"
temperature = 0.2
# Configuration pour la génération de code
[llm.code-gen]
model = "gpt-4"
temperature = 0.0
max_output_tokens = 2000
[agent.RepoExplorerAgent]
llm_config = 'repo-explorer'
[agent.CodeWriterAgent]
llm_config = 'code-gen'
```
Dans cet exemple :
- L'exploration de dépôts utilise un modèle moins cher puisqu'il s'agit principalement de comprendre et de naviguer dans le code
- La génération de code utilise GPT-4 avec une limite de tokens plus élevée pour générer des blocs de code plus grands
- La configuration par défaut reste disponible pour d'autres tâches
# Configurations personnalisées avec des noms réservés
OpenHands peut utiliser des configurations LLM personnalisées nommées avec des noms réservés, pour des cas d'utilisation spécifiques. Si vous spécifiez le modèle et d'autres paramètres sous les noms réservés, OpenHands les chargera et les utilisera pour un objectif spécifique. À ce jour, une telle configuration est implémentée : l'éditeur de brouillon.
## Configuration de l'éditeur de brouillon
La configuration `draft_editor` est un groupe de paramètres que vous pouvez fournir pour spécifier le modèle à utiliser pour l'ébauche préliminaire des modifications de code, pour toutes les tâches qui impliquent l'édition et le raffinement du code. Vous devez la fournir sous la section `[llm.draft_editor]`.
Par exemple, vous pouvez définir dans `config.toml` un éditeur de brouillon comme ceci :
```toml
[llm.draft_editor]
model = "gpt-4"
temperature = 0.2
top_p = 0.95
presence_penalty = 0.0
frequency_penalty = 0.0
```
Cette configuration :
- Utilise GPT-4 pour des modifications et suggestions de haute qualité
- Définit une température basse (0,2) pour maintenir la cohérence tout en permettant une certaine flexibilité
- Utilise une valeur top_p élevée (0,95) pour considérer un large éventail d'options de tokens
- Désactive les pénalités de présence et de fréquence pour maintenir l'accent sur les modifications spécifiques nécessaires
Utilisez cette configuration lorsque vous souhaitez qu'un LLM ébauche des modifications avant de les effectuer. En général, cela peut être utile pour :
- Examiner et suggérer des améliorations de code
- Affiner le contenu existant tout en conservant son sens fondamental
- Apporter des modifications précises et ciblées au code ou au texte
:::note
Les configurations LLM personnalisées ne sont disponibles que lorsque vous utilisez OpenHands en mode développement, via `main.py` ou `cli.py`. Lors de l'exécution via `docker run`, veuillez utiliser les options de configuration standard.
:::

Some files were not shown because too many files have changed in this diff Show More