mirror of
https://github.com/All-Hands-AI/OpenHands.git
synced 2026-01-09 14:57:59 -05:00
feat: Add automatic translation updater script (#4608)
Co-authored-by: openhands <openhands@all-hands.dev>
This commit is contained in:
@@ -1,3 +1,3 @@
|
||||
# Python 文档
|
||||
|
||||
部署后文档将会显示在这里。
|
||||
部署后文档将显示在此处。
|
||||
|
||||
@@ -1,53 +1,49 @@
|
||||
---
|
||||
sidebar_position: 7
|
||||
---
|
||||
|
||||
# 📚 杂项
|
||||
# 📚 其他
|
||||
|
||||
## ⭐️ 研究策略
|
||||
|
||||
通过 LLM 完全复制生产级应用程序是一个复杂的任务。我们的策略包含以下几个方面:
|
||||
使用大语言模型完全复制生产级应用程序是一项复杂的工作。我们的策略包括:
|
||||
|
||||
1. **核心技术研究:** 专注于基础研究,以理解和改进代码生成和处理的技术方面。
|
||||
2. **专家能力:** 通过数据策划、训练方法等方式增强核心组件的有效性。
|
||||
3. **任务规划:** 开发错误检测、代码库管理和优化的能力。
|
||||
4. **评价:** 建立全面的评价指标,以更好地理解和改进我们的模型。
|
||||
1. **核心技术研究:** 专注于基础研究,以理解和改进代码生成和处理的技术方面
|
||||
2. **专业能力:** 通过数据管理、训练方法等提高核心组件的效率
|
||||
3. **任务规划:** 开发错误检测、代码库管理和优化的能力
|
||||
4. **评估:** 建立全面的评估指标,以更好地理解和改进我们的模型
|
||||
|
||||
## 🚧 默认代理
|
||||
|
||||
- 我们当前的默认代理是 CodeActAgent,具备生成代码和处理文件的能力。我们正在开发其他代理实现,包括 [SWE Agent](https://swe-agent.com/)。您可以[在这里阅读我们当前的代理集合](./agents)。
|
||||
我们当前的默认代理是 [CodeActAgent](agents),它能够生成代码并处理文件。
|
||||
|
||||
## 🤝 如何贡献
|
||||
|
||||
OpenHands 是一个社区驱动的项目,我们欢迎每个人的贡献。无论您是开发人员、研究人员,还是对用 AI 提升软件工程领域有兴趣,只要您愿意参与,我们都有很多方式可供选择:
|
||||
OpenHands 是一个社区驱动的项目,我们欢迎每个人的贡献。无论你是开发人员、研究人员,还是只是对用 AI 推进软件工程领域感兴趣,都有很多方式可以参与:
|
||||
|
||||
- **代码贡献:** 帮助我们开发核心功能、前端界面或沙箱解决方案。
|
||||
- **研究和评价:** 贡献您对 LLM 在软件工程领域理解的见解,参与评估模型,或提出改进建议。
|
||||
- **反馈和测试:** 使用 OpenHands 工具集,报告错误,建议功能,或提供可用性方面的反馈。
|
||||
- **代码贡献:** 帮助我们开发核心功能、前端界面或沙盒解决方案
|
||||
- **研究和评估:** 为我们对大语言模型在软件工程中的应用的理解做出贡献,参与模型评估或提出改进建议
|
||||
- **反馈和测试:** 使用 OpenHands 工具集,报告错误,提出功能建议或提供可用性反馈
|
||||
|
||||
详情请查阅[此文件](https://github.com/All-Hands-AI/OpenHands/blob/main/CONTRIBUTING.md)。
|
||||
有关详细信息,请查看[此文档](https://github.com/All-Hands-AI/OpenHands/blob/main/CONTRIBUTING.md)。
|
||||
|
||||
## 🤖 加入我们的社区
|
||||
|
||||
我们现在有一个 Slack 工作区,用于合作建设 OpenHands,还设有一个 Discord 服务器,用于讨论与该项目、LLM、代理等相关的任何事情。
|
||||
我们有 Slack 工作区用于协作构建 OpenHands,也有 Discord 服务器用于讨论任何相关的内容,例如此项目、大语言模型、代理等。
|
||||
|
||||
- [Slack 工作区](https://join.slack.com/t/opendevin/shared_invite/zt-2oikve2hu-UDxHeo8nsE69y6T7yFX_BA)
|
||||
- [Discord 服务器](https://discord.gg/ESHStjSjD4)
|
||||
|
||||
如果您愿意贡献,请随时加入我们的社区。让我们一起简化软件工程!
|
||||
如果你想做出贡献,欢迎加入我们的社区。让我们一起简化软件工程!
|
||||
|
||||
🐚 **少写代码,用 OpenHands 做更多的事情。**
|
||||
🐚 **用 OpenHands 写更少的代码,做更多的事。**
|
||||
|
||||
[](https://star-history.com/#All-Hands-AI/OpenHands&Date)
|
||||
|
||||
## 🛠️ 技术选型
|
||||
## 🛠️ 构建技术
|
||||
|
||||
OpenHands 使用了一系列强大的框架和库,提供了坚实的开发基础。以下是项目中使用的关键技术:
|
||||
OpenHands 使用强大的框架和库组合构建,为其开发提供了坚实的基础。以下是项目中使用的关键技术:
|
||||
|
||||
       
|
||||
|
||||
请注意,这些技术选型仍在进行中,随着项目的发展,可能会添加新的技术或移除现有的技术。我们努力采用最适合、最高效的工具,以增强 OpenHands 的能力。
|
||||
请注意,这些技术的选择正在进行中,随着项目的发展,可能会添加其他技术或删除现有技术。我们努力采用最合适和最有效的工具来增强 OpenHands 的功能。
|
||||
|
||||
## 📜 许可证
|
||||
|
||||
根据 MIT 许可证分发。详见[我们的许可证](https://github.com/All-Hands-AI/OpenHands/blob/main/LICENSE)了解更多信息。
|
||||
根据 MIT 许可证分发。有关更多信息,请参阅[我们的许可证](https://github.com/All-Hands-AI/OpenHands/blob/main/LICENSE)。
|
||||
|
||||
@@ -1,98 +1,23 @@
|
||||
---
|
||||
sidebar_position: 3
|
||||
---
|
||||
# 🧠 主代理和能力
|
||||
|
||||
# 🧠 Agents and Capabilities
|
||||
|
||||
## CodeAct Agent
|
||||
## CodeActAgent
|
||||
|
||||
### 描述
|
||||
|
||||
该Agent实现了CodeAct的思想([论文](https://arxiv.org/abs/2402.01030),[推特](https://twitter.com/xingyaow_/status/1754556835703751087)),将LLM agents的**行为**合并到一个统一的**代码**动作空间中,以实现_简化_和_性能_(详情见论文)。
|
||||
这个代理实现了 CodeAct 的思想([论文](https://arxiv.org/abs/2402.01030),[推文](https://twitter.com/xingyaow_/status/1754556835703751087)),将 LLM 代理的**行动**整合到一个统一的**代码**行动空间中,以实现_简单性_和_性能_。
|
||||
|
||||
概念理念如下图所示。在每个回合,Agent可以:
|
||||
概念思想如下图所示。在每一轮中,代理可以:
|
||||
|
||||
1. **对话**:用自然语言与人类交流,进行澄清、确认等。
|
||||
2. **CodeAct**:选择通过执行代码来完成任务
|
||||
1. **对话**:用自然语言与人类交流,以寻求澄清、确认等。
|
||||
2. **CodeAct**:选择通过执行代码来执行任务
|
||||
|
||||
- 执行任何有效的Linux `bash`命令
|
||||
- 使用[交互式Python解释器](https://ipython.org/)执行任何有效的 `Python`代码。这是通过`bash`命令模拟的,详细信息请参见插件系统。
|
||||
- 执行任何有效的 Linux `bash` 命令
|
||||
- 使用 [交互式 Python 解释器](https://ipython.org/) 执行任何有效的 `Python` 代码。这是通过 `bash` 命令模拟的,有关更多详细信息,请参阅下面的插件系统。
|
||||
|
||||

|
||||
|
||||
### 插件系统
|
||||
|
||||
为了使CodeAct agent在仅能访问`bash`动作空间时更强大,CodeAct agent利用了OpenHands的插件系统:
|
||||
|
||||
- [Jupyter插件](https://github.com/All-Hands-AI/OpenHands/tree/main/openhands/runtime/plugins/jupyter):通过bash命令实现IPython执行
|
||||
- [SWE-agent工具插件](https://github.com/All-Hands-AI/OpenHands/tree/main/openhands/runtime/plugins/swe_agent_commands):为软件开发任务引入的强大bash命令行工具,由[swe-agent](https://github.com/princeton-nlp/swe-agent)提供。
|
||||
|
||||
### 演示
|
||||
|
||||
https://github.com/All-Hands-AI/OpenHands/assets/38853559/f592a192-e86c-4f48-ad31-d69282d5f6ac
|
||||
|
||||
_CodeActAgent使用`gpt-4-turbo-2024-04-09`执行数据科学任务(线性回归)的示例_
|
||||
|
||||
### 动作
|
||||
|
||||
`Action`,
|
||||
`CmdRunAction`,
|
||||
`IPythonRunCellAction`,
|
||||
`AgentEchoAction`,
|
||||
`AgentFinishAction`,
|
||||
`AgentTalkAction`
|
||||
|
||||
### 观测
|
||||
|
||||
`CmdOutputObservation`,
|
||||
`IPythonRunCellObservation`,
|
||||
`AgentMessageObservation`,
|
||||
`UserMessageObservation`
|
||||
|
||||
### 方法
|
||||
|
||||
| 方法 | 描述 |
|
||||
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| `__init__` | 使用`llm`和一系列信息`list[Mapping[str, str]]`初始化Agent |
|
||||
| `step` | 使用CodeAct Agent执行一步操作,包括收集前一步的信息并提示模型执行命令。 |
|
||||
|
||||
### 进行中的工作 & 下一步
|
||||
|
||||
[] 支持Web浏览
|
||||
[] 完成CodeAct agent提交Github PR的工作流程
|
||||
|
||||
## Planner Agent
|
||||
|
||||
### 描述
|
||||
|
||||
Planner agent利用特殊的提示策略为解决问题创建长期计划。
|
||||
在每一步中,Agent会获得其先前的动作-观测对、当前任务以及基于上一次操作提供的提示。
|
||||
|
||||
### 动作
|
||||
|
||||
`NullAction`,
|
||||
`CmdRunAction`,
|
||||
`BrowseURLAction`,
|
||||
`GithubPushAction`,
|
||||
`FileReadAction`,
|
||||
`FileWriteAction`,
|
||||
`AgentThinkAction`,
|
||||
`AgentFinishAction`,
|
||||
`AgentSummarizeAction`,
|
||||
`AddTaskAction`,
|
||||
`ModifyTaskAction`
|
||||
|
||||
### 观测
|
||||
|
||||
`Observation`,
|
||||
`NullObservation`,
|
||||
`CmdOutputObservation`,
|
||||
`FileReadObservation`,
|
||||
`BrowserOutputObservation`
|
||||
|
||||
### 方法
|
||||
|
||||
| 方法 | 描述 |
|
||||
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `__init__` | 使用`llm`初始化Agent |
|
||||
| `step` | 检查当前步骤是否完成,如果是则返回`AgentFinishAction`。否则,创建计划提示并发送给模型进行推理,将结果作为下一步动作。 |
|
||||
_使用 `gpt-4-turbo-2024-04-09` 的 CodeActAgent 执行数据科学任务(线性回归)的示例_。
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
以下是翻译后的内容:
|
||||
|
||||
# 🏛️ 系统架构
|
||||
|
||||
<div style={{ textAlign: 'center' }}>
|
||||
<img src="https://github.com/All-Hands-AI/OpenHands/assets/16201837/97d747e3-29d8-4ccb-8d34-6ad1adb17f38" alt="OpenHands System Architecture Diagram Jul 4 2024" />
|
||||
<p><em>OpenHands 系统架构图 (2024年7月4日)</em></p>
|
||||
</div>
|
||||
|
||||
这是系统架构的高层次概述。系统分为两个主要组件:前端和后端。前端负责处理用户交互并显示结果。后端负责处理业务逻辑并执行代理。
|
||||
|
||||
# 前端架构 {#frontend-architecture-zh}
|
||||
|
||||

|
||||
|
||||
这个概述经过简化,只显示了主要组件及其交互。有关后端架构的更详细视图,请参阅下面的后端架构部分。
|
||||
|
||||
# 后端架构 {#backend-architecture-zh}
|
||||
|
||||
_**免责声明**:后端架构正在进行中,可能会发生变化。下图显示了基于图表页脚中显示的提交的后端当前架构。_
|
||||
|
||||

|
||||
|
||||
<details>
|
||||
<summary>更新此图表</summary>
|
||||
<div>
|
||||
后端架构图的生成是部分自动化的。
|
||||
该图是使用py2puml工具从代码中的类型提示生成的。然后手动审查、调整图表并导出为PNG和SVG格式。
|
||||
|
||||
## 先决条件
|
||||
|
||||
- 运行可执行openhands的python环境
|
||||
(根据存储库根目录中README.md文件中的说明)
|
||||
- 已安装[py2puml](https://github.com/lucsorel/py2puml)
|
||||
|
||||
## 步骤
|
||||
|
||||
1. 通过从存储库的根目录运行以下命令来自动生成图表:
|
||||
`py2puml openhands openhands > docs/architecture/backend_architecture.puml`
|
||||
|
||||
2. 在PlantUML编辑器中打开生成的文件,例如带有PlantUML扩展的Visual Studio Code或[PlantText](https://www.planttext.com/)
|
||||
|
||||
3. 审查生成的PUML,并对图表进行所有必要的调整(添加缺失的部分,修复错误,改进定位)。
|
||||
_py2puml根据代码中的类型提示创建图表,因此缺失或不正确的类型提示可能导致图表不完整或不正确。_
|
||||
|
||||
4. 审查新图表和以前图表之间的差异,并手动检查更改是否正确。
|
||||
_确保不要删除过去手动添加到图表中且仍然相关的部分。_
|
||||
|
||||
5. 将用于生成图表的提交的提交哈希添加到图表页脚。
|
||||
|
||||
6. 将图表导出为PNG和SVG文件,并替换`docs/architecture`目录中的现有图表。这可以使用(例如[PlantText](https://www.planttext.com/))完成
|
||||
|
||||
</div>
|
||||
</details>
|
||||
@@ -0,0 +1,131 @@
|
||||
以下是翻译后的内容:
|
||||
|
||||
# 📦 EventStream 运行时
|
||||
|
||||
OpenHands EventStream 运行时是实现 AI 代理操作安全灵活执行的核心组件。
|
||||
它使用 Docker 创建一个沙盒环境,可以安全地运行任意代码而不会危及主机系统。
|
||||
|
||||
## 为什么我们需要沙盒运行时?
|
||||
|
||||
OpenHands 需要在安全、隔离的环境中执行任意代码,原因如下:
|
||||
|
||||
1. 安全性:执行不受信任的代码可能会给主机系统带来重大风险。沙盒环境可以防止恶意代码访问或修改主机系统的资源
|
||||
2. 一致性:沙盒环境确保代码执行在不同机器和设置下保持一致,消除"在我的机器上可以工作"的问题
|
||||
3. 资源控制:沙盒允许更好地控制资源分配和使用,防止失控进程影响主机系统
|
||||
4. 隔离:不同的项目或用户可以在隔离的环境中工作,而不会相互干扰或影响主机系统
|
||||
5. 可重现性:沙盒环境使重现错误和问题变得更容易,因为执行环境是一致和可控的
|
||||
|
||||
## 运行时如何工作?
|
||||
|
||||
OpenHands 运行时系统使用 Docker 容器实现的客户端-服务器架构。以下是它的工作原理概述:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[用户提供的自定义 Docker 镜像] --> B[OpenHands 后端]
|
||||
B -->|构建| C[OH 运行时镜像]
|
||||
C -->|启动| D[Action 执行器]
|
||||
D -->|初始化| E[浏览器]
|
||||
D -->|初始化| F[Bash Shell]
|
||||
D -->|初始化| G[插件]
|
||||
G -->|初始化| L[Jupyter 服务器]
|
||||
|
||||
B -->|生成| H[代理]
|
||||
B -->|生成| I[EventStream]
|
||||
I <--->|通过 REST API
|
||||
执行 Action 获取 Observation
|
||||
| D
|
||||
|
||||
H -->|生成 Action| I
|
||||
I -->|获取 Observation| H
|
||||
|
||||
subgraph "Docker 容器"
|
||||
D
|
||||
E
|
||||
F
|
||||
G
|
||||
L
|
||||
end
|
||||
```
|
||||
|
||||
1. 用户输入:用户提供自定义基础 Docker 镜像
|
||||
2. 镜像构建:OpenHands 基于用户提供的镜像构建新的 Docker 镜像("OH 运行时镜像")。这个新镜像包含 OpenHands 特定的代码,主要是"运行时客户端"
|
||||
3. 容器启动:当 OpenHands 启动时,它使用 OH 运行时镜像启动一个 Docker 容器
|
||||
4. Action 执行服务器初始化:Action 执行服务器在容器内初始化一个 `ActionExecutor`,设置必要的组件,如 bash shell,并加载任何指定的插件
|
||||
5. 通信:OpenHands 后端(`openhands/runtime/impl/eventstream/eventstream_runtime.py`)通过 RESTful API 与 Action 执行服务器通信,发送 Action 并接收 Observation
|
||||
6. Action 执行:运行时客户端从后端接收 Action,在沙盒环境中执行它们,并将 Observation 发送回去
|
||||
7. Observation 返回:Action 执行服务器将执行结果作为 Observation 发送回 OpenHands 后端
|
||||
|
||||
客户端的作用:
|
||||
- 它充当 OpenHands 后端和沙盒环境之间的中介
|
||||
- 它在容器内安全地执行各种类型的 Action(shell 命令、文件操作、Python 代码等)
|
||||
- 它管理沙盒环境的状态,包括当前工作目录和加载的插件
|
||||
- 它格式化 Observation 并将其返回给后端,确保处理结果的接口一致
|
||||
|
||||
## OpenHands 如何构建和维护 OH 运行时镜像
|
||||
|
||||
OpenHands 构建和管理运行时镜像的方法确保了在为生产和开发环境创建和维护 Docker 镜像时的效率、一致性和灵活性。
|
||||
|
||||
如果你对更多细节感兴趣,可以查看[相关代码](https://github.com/All-Hands-AI/OpenHands/blob/main/openhands/runtime/utils/runtime_build.py)。
|
||||
|
||||
### 镜像标签系统
|
||||
|
||||
OpenHands 为其运行时镜像使用三标签系统,以平衡可重现性和灵活性。
|
||||
标签可以是以下 2 种格式之一:
|
||||
|
||||
- **版本标签**: `oh_v{openhands_version}_{base_image}` (例如: `oh_v0.9.9_nikolaik_s_python-nodejs_t_python3.12-nodejs22`)
|
||||
- **锁定标签**: `oh_v{openhands_version}_{16_digit_lock_hash}` (例如: `oh_v0.9.9_1234567890abcdef`)
|
||||
- **源码标签**: `oh_v{openhands_version}_{16_digit_lock_hash}_{16_digit_source_hash}`
|
||||
(例如: `oh_v0.9.9_1234567890abcdef_1234567890abcdef`)
|
||||
|
||||
#### 源码标签 - 最具体
|
||||
|
||||
这是源目录的目录哈希的 MD5 的前 16 位数字。这为 openhands 源码提供了一个哈希值。
|
||||
|
||||
#### 锁定标签
|
||||
|
||||
这个哈希由以下内容的 MD5 的前 16 位数字构建:
|
||||
- 构建镜像所基于的基础镜像的名称(例如: `nikolaik/python-nodejs:python3.12-nodejs22`)
|
||||
- 镜像中包含的 `pyproject.toml` 的内容
|
||||
- 镜像中包含的 `poetry.lock` 的内容
|
||||
|
||||
这实际上为 Openhands 的依赖项提供了一个独立于源代码的哈希值。
|
||||
|
||||
#### 版本标签 - 最通用
|
||||
|
||||
这个标签是 openhands 版本和基础镜像名称的串联(转换以适应标签标准)。
|
||||
|
||||
#### 构建过程
|
||||
|
||||
在生成镜像时...
|
||||
|
||||
- **无需重建**:OpenHands 首先检查是否存在具有相同**最具体源码标签**的镜像。如果存在这样的镜像,
|
||||
则不执行构建 - 使用现有镜像。
|
||||
- **最快重建**:OpenHands 接下来检查是否存在具有**通用锁定标签**的镜像。如果存在这样的镜像,
|
||||
OpenHands 会基于它构建一个新镜像,绕过所有安装步骤(如 `poetry install` 和
|
||||
`apt-get`),除了最后一个复制当前源代码的操作。新镜像仅使用**源码**标签。
|
||||
- **还行的重建**:如果**源码**和**锁定**标签都不存在,将基于**版本**标签镜像构建镜像。
|
||||
在版本标签镜像中,大多数依赖项应该已经安装,从而节省时间。
|
||||
- **最慢重建**:如果三个标签都不存在,则基于基础镜像构建全新的镜像
|
||||
(这是一个较慢的操作)。这个新镜像使用**源码**、**锁定**和**版本**标签。
|
||||
|
||||
这种标记方法允许 OpenHands 高效地管理开发和生产环境。
|
||||
|
||||
1. 相同的源代码和 Dockerfile 总是产生相同的镜像(通过基于哈希的标签)
|
||||
2. 当发生小的更改时,系统可以快速重建镜像(通过利用最近兼容的镜像)
|
||||
3. **锁定**标签(例如: `runtime:oh_v0.9.3_1234567890abcdef`)总是指向特定基础镜像、依赖项和 OpenHands 版本组合的最新构建
|
||||
|
||||
## 运行时插件系统
|
||||
|
||||
OpenHands 运行时支持一个插件系统,允许扩展功能和自定义运行时环境。插件在运行时客户端启动时初始化。
|
||||
|
||||
如果你想实现自己的插件,可以查看[这里的 Jupyter 插件示例](https://github.com/All-Hands-AI/OpenHands/blob/ecf4aed28b0cf7c18d4d8ff554883ba182fc6bdd/openhands/runtime/plugins/jupyter/__init__.py#L21-L55)。
|
||||
|
||||
*关于插件系统的更多细节仍在建设中 - 欢迎贡献!*
|
||||
|
||||
插件系统的关键方面:
|
||||
|
||||
1. 插件定义:插件被定义为继承自基础 `Plugin` 类的 Python 类
|
||||
2. 插件注册:可用的插件在 `ALL_PLUGINS` 字典中注册
|
||||
3. 插件规范:插件与 `Agent.sandbox_plugins: list[PluginRequirement]` 相关联。用户可以在初始化运行时时指定要加载的插件
|
||||
4. 初始化:插件在运行时客户端启动时异步初始化
|
||||
5. 使用:运行时客户端可以使用初始化的插件来扩展其功能(例如,用于运行 IPython 单元格的 JupyterPlugin)
|
||||
@@ -1,18 +1,39 @@
|
||||
---
|
||||
sidebar_position: 6
|
||||
---
|
||||
|
||||
# ✅ 提供反馈
|
||||
|
||||
在使用 OpenHands 时,你无疑会遇到一些情况,某些地方工作得很好,而另一些地方则可能不尽如人意。我们鼓励你在使用 OpenHands 时提供反馈,这不仅有助于开发团队改善应用,更为重要的是,可以创建一个开放的编码代理训练样例语料库——Share-OpenHands!
|
||||
在使用 OpenHands 时,您会遇到一些工作良好的情况,也会遇到一些不太理想的情况。我们鼓励您在使用 OpenHands 时提供反馈,以帮助向开发团队提供反馈,更重要的是,创建一个开放的编码智能体训练示例语料库——Share-OpenHands!
|
||||
|
||||
## 📝 如何提供反馈
|
||||
|
||||
提供反馈很简单!在使用 OpenHands 时,你可以在任意时刻按下点赞或点踩按钮。你将被要求提供你的电子邮件地址(例如,以便我们在需要进一步询问时联系你),你可以选择公开或私密地提供反馈。
|
||||
提供反馈很容易!当您在使用 OpenHands 时,您可以在交互的任何时候按下竖起大拇指或竖起大拇指按钮。系统会提示您提供电子邮件地址(例如,以便我们在需要询问任何后续问题时与您联系),您可以选择公开或私下提供反馈。
|
||||
|
||||
<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>
|
||||
|
||||
## 📜 数据许可与隐私
|
||||
## 📜 数据使用和隐私
|
||||
|
||||
* **公开** 数据将与 OpenHands 本身一样以 MIT 许可协议发布,并可被社区用来训练和测试模型。显然,你能够公开的反馈对整个社区来说更有价值,因此当你不涉及敏感信息时,我们鼓励你选择这个选项!
|
||||
* **私密** 数据将仅与 OpenHands 团队分享,用于改进 OpenHands。
|
||||
### 数据共享设置
|
||||
|
||||
在提交数据时,您可以选择公开或私下提交。
|
||||
|
||||
* **公开**数据将在 MIT 许可下发布,与 OpenHands 本身一样,社区可以使用这些数据来训练和测试模型。显然,您可以公开的反馈对整个社区来说会更有价值,因此当您不处理敏感信息时,我们鼓励您选择这个选项!
|
||||
* **私有**数据将仅与 OpenHands 团队共享,用于改进 OpenHands。
|
||||
|
||||
### 谁收集和存储数据?
|
||||
|
||||
数据由 [All Hands AI](https://all-hands.dev) 收集和存储,这是一家由 OpenHands 维护者创立的公司,旨在支持和改进 OpenHands。
|
||||
|
||||
### 公开数据将如何发布?
|
||||
|
||||
公开数据将在我们达到固定的里程碑时发布,例如 1,000 个公开示例、10,000 个公开示例等。
|
||||
届时,我们将遵循以下发布流程:
|
||||
|
||||
1. 所有提供公开反馈的人都将收到一封电子邮件,描述数据发布情况,并有机会选择退出。
|
||||
2. 负责数据发布的人员将对数据进行质量控制,删除低质量的反馈,删除提交者的电子邮件地址,并尝试删除任何敏感信息。
|
||||
3. 数据将通过 github 或 Hugging Face 等常用网站在 MIT 许可下公开发布。
|
||||
|
||||
### 如果我想删除我的数据怎么办?
|
||||
|
||||
对于 All Hands AI 服务器上的数据,我们很乐意根据要求删除它:
|
||||
|
||||
**一条数据:**如果您想删除一条数据,我们将很快添加一种机制,使用您在提交数据时显示在界面上的链接和密码来删除数据。
|
||||
|
||||
**所有数据:**如果您想删除所有数据,或者您没有在提交数据时收到的 ID 和密码,请从您最初提交数据时注册的电子邮件地址联系`contact@all-hands.dev`。
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
# OpenHands 入门指南
|
||||
|
||||
你已经[安装了 OpenHands](./installation)并且[设置了你的 LLM](./installation#setup)。接下来呢?
|
||||
|
||||
OpenHands 可以帮助你处理各种各样的工程任务。但这项技术仍然很新,我们还有很长的路要走,才能拥有无需任何指导就能承担大型、复杂工程任务的智能体。因此,了解智能体擅长什么,以及可能需要什么帮助非常重要。
|
||||
|
||||
## Hello World
|
||||
|
||||
你可能想尝试的第一件事是一个简单的 "hello world" 示例。这听起来可能比实际操作更复杂!
|
||||
|
||||
尝试提示智能体:
|
||||
> 请编写一个 bash 脚本 hello.sh,打印 "hello world!"
|
||||
|
||||
你会发现,智能体不仅编写了脚本,还设置了正确的权限并运行脚本来检查输出。
|
||||
|
||||
你可以继续提示智能体优化你的代码。这是一个与智能体合作的好方法。从简单开始,然后迭代。
|
||||
|
||||
> 请修改 hello.sh,使其接受一个名称作为第一个参数,但默认为 "world"
|
||||
|
||||
你也可以使用任何你需要的语言,尽管智能体可能需要花一些时间来设置环境!
|
||||
|
||||
> 请将 hello.sh 转换为 Ruby 脚本,并运行它
|
||||
|
||||
## 从头开始构建
|
||||
|
||||
智能体在 "绿地" 任务(不需要任何关于现有代码库的上下文的任务)上表现得非常出色,它们可以从头开始。
|
||||
|
||||
最好从一个简单的任务开始,然后迭代它。同时也最好尽可能具体地说明你想要什么,技术栈应该是什么等等。
|
||||
|
||||
例如,我们可以构建一个 TODO 应用:
|
||||
|
||||
> 请用 React 构建一个基本的 TODO 列表应用。它应该只有前端,所有状态都应该保存在 localStorage 中。
|
||||
|
||||
一旦骨架搭建好,我们就可以继续迭代应用:
|
||||
|
||||
> 请允许为每个任务添加一个可选的截止日期
|
||||
|
||||
就像普通开发一样,经常提交和推送代码是一个好习惯。这样,如果智能体偏离了轨道,你总是可以恢复到旧的状态。你可以让智能体为你提交和推送:
|
||||
|
||||
> 请提交更改并将其推送到一个名为 "feature/due-dates" 的新分支
|
||||
|
||||
## 添加新代码
|
||||
|
||||
OpenHands 也可以很好地向现有代码库添加新代码。
|
||||
|
||||
例如,你可以要求 OpenHands 向你的项目添加一个新的 GitHub action,用于检查你的代码。OpenHands 可能会查看你的代码库,看看它应该使用什么语言,然后它可以直接将一个新文件放入 `./github/workflows/lint.yml`
|
||||
|
||||
> 请添加一个 GitHub action 来检查此仓库中的代码
|
||||
|
||||
有些任务可能需要更多的上下文。虽然 OpenHands 可以使用 `ls` 和 `grep` 来搜索你的代码库,但提前提供上下文可以让它移动得更快、更准确。而且这会让你花费更少的 tokens!
|
||||
|
||||
> 请修改 ./backend/api/routes.js 以添加一个新路由,返回所有任务的列表
|
||||
|
||||
> 请在 ./frontend/components 目录中添加一个新的 React 组件,用于显示 Widgets 列表。它应该使用现有的 Widget 组件。
|
||||
|
||||
## 重构
|
||||
|
||||
OpenHands 在重构现有代码方面做得很好,尤其是小块的重构。你可能不想尝试重新设计整个代码库,但拆分长文件和函数、重命名变量等往往效果很好。
|
||||
|
||||
> 请重命名 ./app.go 中所有单字母变量
|
||||
|
||||
> 请在 widget.php 中将函数 `build_and_deploy_widgets` 拆分为两个函数:`build_widgets` 和 `deploy_widgets`
|
||||
|
||||
> 请将 ./api/routes.js 拆分为每个路由的单独文件
|
||||
|
||||
## Bug 修复
|
||||
|
||||
OpenHands 还可以帮助你跟踪和修复代码中的 bug。但是,正如任何开发人员都知道的那样,修复 bug 可能非常棘手,OpenHands 通常需要更多的上下文。如果你已经诊断出了 bug,但希望 OpenHands 来解决逻辑问题,这会有所帮助。
|
||||
|
||||
> 目前 `/subscribe` 端点中的 email 字段正在拒绝 .io 域名。请修复这个问题。
|
||||
|
||||
> ./app.py 中的 `search_widgets` 函数正在执行区分大小写的搜索。请使其不区分大小写。
|
||||
|
||||
在使用智能体修复 bug 时,进行测试驱动开发通常很有帮助。你可以要求智能体编写一个新的测试,然后迭代直到它修复了 bug:
|
||||
|
||||
> `hello` 函数在空字符串上崩溃。请编写一个测试来重现这个 bug,然后修复代码,使其通过测试。
|
||||
|
||||
## 更多
|
||||
|
||||
OpenHands 能够在几乎任何编码任务上提供帮助。但是需要一些练习才能充分利用它。请记住:
|
||||
* 保持任务简单
|
||||
* 尽可能具体
|
||||
* 提供尽可能多的上下文
|
||||
* 经常提交和推送
|
||||
|
||||
有关如何充分利用 OpenHands 的更多提示,请参阅[提示最佳实践](./prompting-best-practices)。
|
||||
@@ -0,0 +1,109 @@
|
||||
以下是翻译后的内容:
|
||||
|
||||
# 命令行模式
|
||||
|
||||
OpenHands 可以在交互式命令行模式下运行,允许用户通过命令行启动交互式会话。
|
||||
|
||||
这种模式不同于[无头模式](headless-mode),后者是非交互式的,更适合脚本编写。
|
||||
|
||||
## 使用 Python
|
||||
|
||||
要通过命令行启动交互式 OpenHands 会话,请按照以下步骤操作:
|
||||
|
||||
1. 确保你已按照[开发设置说明](https://github.com/All-Hands-AI/OpenHands/blob/main/Development.md)进行操作。
|
||||
|
||||
2. 运行以下命令:
|
||||
|
||||
```bash
|
||||
poetry run python -m openhands.core.cli
|
||||
```
|
||||
|
||||
该命令将启动一个交互式会话,你可以在其中输入任务并接收来自 OpenHands 的响应。
|
||||
|
||||
你需要确保通过环境变量[或 `config.toml` 文件](https://github.com/All-Hands-AI/OpenHands/blob/main/config.template.toml)设置你的模型、API 密钥和其他设置。
|
||||
|
||||
|
||||
## 使用 Docker
|
||||
|
||||
要在 Docker 中以命令行模式运行 OpenHands,请按照以下步骤操作:
|
||||
|
||||
1. 将 `WORKSPACE_BASE` 设置为你希望 OpenHands 编辑的目录:
|
||||
|
||||
```bash
|
||||
WORKSPACE_BASE=$(pwd)/workspace
|
||||
```
|
||||
|
||||
2. 将 `LLM_MODEL` 设置为你要使用的模型:
|
||||
|
||||
```bash
|
||||
LLM_MODEL="anthropic/claude-3-5-sonnet-20240620"
|
||||
```
|
||||
|
||||
3. 将 `LLM_API_KEY` 设置为你的 API 密钥:
|
||||
|
||||
```bash
|
||||
LLM_API_KEY="sk_test_12345"
|
||||
```
|
||||
|
||||
4. 运行以下 Docker 命令:
|
||||
|
||||
```bash
|
||||
docker run -it \
|
||||
--pull=always \
|
||||
-e SANDBOX_USER_ID=$(id -u) \
|
||||
-e WORKSPACE_MOUNT_PATH=$WORKSPACE_BASE \
|
||||
-e LLM_API_KEY=$LLM_API_KEY \
|
||||
-e LLM_MODEL=$LLM_MODEL \
|
||||
-v $WORKSPACE_BASE:/opt/workspace_base \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||
--add-host host.docker.internal:host-gateway \
|
||||
--name openhands-app-$(date +%Y%m%d%H%M%S) \
|
||||
ghcr.io/all-hands-ai/openhands:0.11 \
|
||||
python -m openhands.core.cli
|
||||
```
|
||||
|
||||
该命令将在 Docker 中启动一个交互式会话,你可以在其中输入任务并接收来自 OpenHands 的响应。
|
||||
|
||||
## 命令行命令和预期输出示例
|
||||
|
||||
以下是一些命令行命令及其预期输出的示例:
|
||||
|
||||
### 示例 1: 简单任务
|
||||
|
||||
```bash
|
||||
How can I help? >> Write a Python script that prints "Hello, World!"
|
||||
```
|
||||
|
||||
预期输出:
|
||||
|
||||
```bash
|
||||
🤖 Sure! Here is a Python script that prints "Hello, World!":
|
||||
|
||||
❯ print("Hello, World!")
|
||||
```
|
||||
|
||||
### 示例 2: Bash 命令
|
||||
|
||||
```bash
|
||||
How can I help? >> Create a directory named "test_dir"
|
||||
```
|
||||
|
||||
预期输出:
|
||||
|
||||
```bash
|
||||
🤖 Creating a directory named "test_dir":
|
||||
|
||||
❯ mkdir test_dir
|
||||
```
|
||||
|
||||
### 示例 3: 错误处理
|
||||
|
||||
```bash
|
||||
How can I help? >> Delete a non-existent file
|
||||
```
|
||||
|
||||
预期输出:
|
||||
|
||||
```bash
|
||||
🤖 An error occurred. Please try again.
|
||||
```
|
||||
@@ -0,0 +1,81 @@
|
||||
# 自定义沙箱
|
||||
|
||||
沙箱是代理执行任务的地方。代理不是直接在你的计算机上运行命令(这可能有风险),而是在 Docker 容器内运行。
|
||||
|
||||
默认的 OpenHands 沙箱(来自 [nikolaik/python-nodejs](https://hub.docker.com/r/nikolaik/python-nodejs) 的 `python-nodejs:python3.12-nodejs22`)预装了一些软件包,如 Python 和 Node.js,但可能需要默认安装其他软件。
|
||||
|
||||
你有两个自定义选项:
|
||||
|
||||
1. 使用已有的镜像,其中包含所需的软件。
|
||||
2. 创建你自己的自定义 Docker 镜像。
|
||||
|
||||
如果你选择第一个选项,可以跳过"创建你的 Docker 镜像"部分。
|
||||
|
||||
## 创建你的 Docker 镜像
|
||||
|
||||
要创建自定义 Docker 镜像,它必须基于 Debian。
|
||||
|
||||
例如,如果你想让 OpenHands 安装 `ruby`,创建一个包含以下内容的 `Dockerfile`:
|
||||
|
||||
```dockerfile
|
||||
FROM debian:latest
|
||||
|
||||
# Install required packages
|
||||
RUN apt-get update && apt-get install -y ruby
|
||||
```
|
||||
|
||||
将此文件保存在一个文件夹中。然后,通过在终端中导航到该文件夹并运行以下命令来构建你的 Docker 镜像(例如,名为 custom-image):
|
||||
|
||||
```bash
|
||||
docker build -t custom-image .
|
||||
```
|
||||
|
||||
这将生成一个名为 `custom-image` 的新镜像,该镜像将在 Docker 中可用。
|
||||
|
||||
> 请注意,在本文档描述的配置中,OpenHands 将以用户 "openhands" 的身份在沙箱内运行,因此通过 docker 文件安装的所有软件包应该对系统上的所有用户可用,而不仅仅是 root。
|
||||
|
||||
## 使用开发工作流
|
||||
|
||||
### 设置
|
||||
|
||||
首先,按照 [Development.md](https://github.com/All-Hands-AI/OpenHands/blob/main/Development.md) 中的说明确保你可以运行 OpenHands。
|
||||
|
||||
### 指定基础沙箱镜像
|
||||
|
||||
在 OpenHands 目录中的 `config.toml` 文件中,将 `sandbox_base_container_image` 设置为你要使用的镜像。这可以是你已经拉取的镜像或你构建的镜像:
|
||||
|
||||
```bash
|
||||
[core]
|
||||
...
|
||||
sandbox_base_container_image="custom-image"
|
||||
```
|
||||
|
||||
### 运行
|
||||
|
||||
通过在顶层目录中运行 ```make run``` 来运行 OpenHands。
|
||||
|
||||
## 技术解释
|
||||
|
||||
请参阅[运行时文档的自定义 docker 镜像部分](https://docs.all-hands.dev/modules/usage/architecture/runtime#advanced-how-openhands-builds-and-maintains-od-runtime-images)以获取更多详细信息。
|
||||
|
||||
## 故障排除/错误
|
||||
|
||||
### 错误:```useradd: UID 1000 is not unique```
|
||||
|
||||
如果你在控制台输出中看到此错误,是因为 OpenHands 试图在沙箱中创建 UID 为 1000 的 openhands 用户,但此 UID 已在镜像中使用(出于某种原因)。要解决此问题,请将 config.toml 文件中的 sandbox_user_id 字段更改为其他值:
|
||||
|
||||
```toml
|
||||
[core]
|
||||
workspace_base="./workspace"
|
||||
run_as_openhands=true
|
||||
sandbox_base_container_image="custom_image"
|
||||
sandbox_user_id="1001"
|
||||
```
|
||||
|
||||
### 端口使用错误
|
||||
|
||||
如果你看到有关端口正在使用或不可用的错误,请尝试删除所有正在运行的 Docker 容器(运行 `docker ps` 和 `docker rm` 相关容器),然后重新运行 ```make run```。
|
||||
|
||||
## 讨论
|
||||
|
||||
对于其他问题或疑问,请加入 [Slack](https://join.slack.com/t/opendevin/shared_invite/zt-2oikve2hu-UDxHeo8nsE69y6T7yFX_BA) 或 [Discord](https://discord.gg/ESHStjSjD4) 并提问!
|
||||
@@ -0,0 +1,73 @@
|
||||
以下是翻译后的内容:
|
||||
|
||||
# 调试
|
||||
|
||||
以下内容旨在作为开发目的下调试 OpenHands 的入门指南。
|
||||
|
||||
## 服务器 / VSCode
|
||||
|
||||
以下 `launch.json` 将允许调试 agent、controller 和 server 元素,但不包括 sandbox(它运行在 docker 内)。它将忽略 `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
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
可以指定更具体的调试配置,其中包括更多参数:
|
||||
|
||||
```
|
||||
...
|
||||
{
|
||||
"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
|
||||
}
|
||||
...
|
||||
```
|
||||
|
||||
上面代码片段中的值可以更新,例如:
|
||||
|
||||
* *t*: 任务
|
||||
* *d*: openhands 工作区目录
|
||||
* *c*: agent
|
||||
* *l*: LLM 配置 (在 config.toml 中预定义)
|
||||
* *n*: 会话名称 (例如 eventstream 名称)
|
||||
@@ -0,0 +1,278 @@
|
||||
# 评估
|
||||
|
||||
本指南概述了如何将您自己的评估基准集成到 OpenHands 框架中。
|
||||
|
||||
## 设置环境和 LLM 配置
|
||||
|
||||
请按照[此处](https://github.com/All-Hands-AI/OpenHands/blob/main/Development.md)的说明设置您的本地开发环境。
|
||||
开发模式下的 OpenHands 使用 `config.toml` 来跟踪大多数配置。
|
||||
|
||||
以下是一个示例配置文件,您可以使用它来定义和使用多个 LLM:
|
||||
|
||||
```toml
|
||||
[llm]
|
||||
# 重要:在此处添加您的 API 密钥,并将模型设置为您要评估的模型
|
||||
model = "claude-3-5-sonnet-20240620"
|
||||
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
|
||||
```
|
||||
|
||||
|
||||
## 如何在命令行中使用 OpenHands
|
||||
|
||||
可以使用以下格式从命令行运行 OpenHands:
|
||||
|
||||
```bash
|
||||
poetry run python ./openhands/core/main.py \
|
||||
-i <max_iterations> \
|
||||
-t "<task_description>" \
|
||||
-c <agent_class> \
|
||||
-l <llm_config>
|
||||
```
|
||||
|
||||
例如:
|
||||
|
||||
```bash
|
||||
poetry run python ./openhands/core/main.py \
|
||||
-i 10 \
|
||||
-t "Write me a bash script that prints hello world." \
|
||||
-c CodeActAgent \
|
||||
-l llm
|
||||
```
|
||||
|
||||
此命令使用以下参数运行 OpenHands:
|
||||
- 最大迭代次数为 10
|
||||
- 指定的任务描述
|
||||
- 使用 CodeActAgent
|
||||
- 使用 `config.toml` 文件的 `llm` 部分中定义的 LLM 配置
|
||||
|
||||
## OpenHands 如何工作
|
||||
|
||||
OpenHands 的主要入口点在 `openhands/core/main.py` 中。以下是它工作原理的简化流程:
|
||||
|
||||
1. 解析命令行参数并加载配置
|
||||
2. 使用 `create_runtime()` 创建运行时环境
|
||||
3. 初始化指定的代理
|
||||
4. 使用 `run_controller()` 运行控制器,它:
|
||||
- 将运行时附加到代理
|
||||
- 执行代理的任务
|
||||
- 完成后返回最终状态
|
||||
|
||||
`run_controller()` 函数是 OpenHands 执行的核心。它管理代理、运行时和任务之间的交互,处理用户输入模拟和事件处理等事项。
|
||||
|
||||
|
||||
## 入门最简单的方法:探索现有基准
|
||||
|
||||
我们鼓励您查看我们仓库的 [`evaluation/` 目录](https://github.com/All-Hands-AI/OpenHands/blob/main/evaluation)中提供的各种评估基准。
|
||||
|
||||
要集成您自己的基准,我们建议从最接近您需求的基准开始。这种方法可以显著简化您的集成过程,允许您在现有结构的基础上进行构建并使其适应您的特定要求。
|
||||
|
||||
## 如何创建评估工作流
|
||||
|
||||
|
||||
要为您的基准创建评估工作流,请按照以下步骤操作:
|
||||
|
||||
1. 导入相关的 OpenHands 实用程序:
|
||||
```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. 创建配置:
|
||||
```python
|
||||
def get_config(instance: pd.Series, metadata: EvalMetadata) -> AppConfig:
|
||||
config = AppConfig(
|
||||
default_agent=metadata.agent_class,
|
||||
runtime='eventstream',
|
||||
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. 初始化运行时并设置评估环境:
|
||||
```python
|
||||
def initialize_runtime(runtime: Runtime, instance: pd.Series):
|
||||
# 在此处设置您的评估环境
|
||||
# 例如,设置环境变量、准备文件等
|
||||
pass
|
||||
```
|
||||
|
||||
4. 创建一个函数来处理每个实例:
|
||||
```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,
|
||||
)
|
||||
|
||||
# 评估代理的操作
|
||||
evaluation_result = await evaluate_agent_actions(runtime, instance)
|
||||
|
||||
return EvalOutput(
|
||||
instance_id=instance.instance_id,
|
||||
instruction=instruction,
|
||||
test_result=evaluation_result,
|
||||
metadata=metadata,
|
||||
history=state.history.compatibility_for_eval_history_pairs(),
|
||||
metrics=state.metrics.get() if state.metrics else None,
|
||||
error=state.last_error if state and state.last_error else None,
|
||||
)
|
||||
```
|
||||
|
||||
5. 运行评估:
|
||||
```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
|
||||
)
|
||||
```
|
||||
|
||||
此工作流设置配置,初始化运行时环境,通过运行代理并评估其操作来处理每个实例,然后将结果收集到 `EvalOutput` 对象中。`run_evaluation` 函数处理并行化和进度跟踪。
|
||||
|
||||
请记住根据您特定的基准要求自定义 `get_instruction`、`your_user_response_function` 和 `evaluate_agent_actions` 函数。
|
||||
|
||||
通过遵循此结构,您可以在 OpenHands 框架内为您的基准创建强大的评估工作流。
|
||||
|
||||
|
||||
## 理解 `user_response_fn`
|
||||
|
||||
`user_response_fn` 是 OpenHands 评估工作流中的关键组件。它模拟用户与代理的交互,允许在评估过程中自动响应。当您想要为代理的查询或操作提供一致的、预定义的响应时,此函数特别有用。
|
||||
|
||||
|
||||
### 工作流和交互
|
||||
|
||||
处理操作和 `user_response_fn` 的正确工作流如下:
|
||||
|
||||
1. 代理接收任务并开始处理
|
||||
2. 代理发出操作
|
||||
3. 如果操作可执行(例如 CmdRunAction、IPythonRunCellAction):
|
||||
- 运行时处理操作
|
||||
- 运行时返回观察结果
|
||||
4. 如果操作不可执行(通常是 MessageAction):
|
||||
- 调用 `user_response_fn`
|
||||
- 它返回模拟的用户响应
|
||||
5. 代理接收观察结果或模拟响应
|
||||
6. 重复步骤 2-5,直到任务完成或达到最大迭代次数
|
||||
|
||||
以下是更准确的可视化表示:
|
||||
|
||||
```
|
||||
[代理]
|
||||
|
|
||||
v
|
||||
[发出操作]
|
||||
|
|
||||
v
|
||||
[操作是否可执行?]
|
||||
/ \
|
||||
是 否
|
||||
| |
|
||||
v v
|
||||
[运行时] [user_response_fn]
|
||||
| |
|
||||
v v
|
||||
[返回观察结果] [模拟响应]
|
||||
\ /
|
||||
\ /
|
||||
v v
|
||||
[代理接收反馈]
|
||||
|
|
||||
v
|
||||
[继续或完成任务]
|
||||
```
|
||||
|
||||
在此工作流中:
|
||||
|
||||
- 可执行的操作(如运行命令或执行代码)由运行时直接处理
|
||||
- 不可执行的操作(通常是当代理想要通信或寻求澄清时)由 `user_response_fn` 处理
|
||||
- 然后,代理处理反馈,无论是来自运行时的观察结果还是来自 `user_response_fn` 的模拟响应
|
||||
|
||||
这种方法允许自动处理具体操作和模拟用户交互,使其适用于您想要测试代理在最少人工干预的情况下完成任务的能力的评估场景。
|
||||
|
||||
### 示例实现
|
||||
|
||||
以下是 SWE-Bench 评估中使用的 `user_response_fn` 示例:
|
||||
|
||||
```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:
|
||||
# 检查代理是否已尝试与用户对话 3 次,如果是,让代理知道它可以放弃
|
||||
user_msgs = [
|
||||
event
|
||||
for event in state.history.get_events()
|
||||
if isinstance(event, MessageAction) and event.source == 'user'
|
||||
]
|
||||
if len(user_msgs) >= 2:
|
||||
# 让代理知道它在尝试 3 次后可以放弃
|
||||
return (
|
||||
msg
|
||||
+ 'If you want to give up, run: <execute_bash> exit </execute_bash>.\n'
|
||||
)
|
||||
return msg
|
||||
```
|
||||
|
||||
此函数执行以下操作:
|
||||
|
||||
1. 提供一条标准消息,鼓励代理继续工作
|
||||
2. 检查代理尝试与用户通信的次数
|
||||
3. 如果代理已多次尝试,它会提供放弃的选项
|
||||
|
||||
通过使用此函数,您可以确保在多次评估运行中保持一致的行为,并防止代理在等待人工输入时陷入困境。
|
||||
@@ -0,0 +1,15 @@
|
||||
# 使用 OpenHands GitHub Action
|
||||
|
||||
本指南解释了如何在 OpenHands 仓库内以及你自己的项目中使用 OpenHands GitHub Action。
|
||||
|
||||
## 在 OpenHands 仓库中使用 Action
|
||||
|
||||
要在 OpenHands 仓库中使用 OpenHands GitHub Action,OpenHands 维护者可以:
|
||||
|
||||
1. 在仓库中创建一个 issue。
|
||||
2. 为该 issue 添加 `fix-me` 标签。
|
||||
3. Action 将自动触发并尝试解决该 issue。
|
||||
|
||||
## 在新仓库中安装 Action
|
||||
|
||||
要在你自己的仓库中安装 OpenHands GitHub Action,请按照 [OpenHands Resolver 仓库中的说明](https://github.com/All-Hands-AI/OpenHands-resolver?tab=readme-ov-file#using-the-github-actions-workflow) 进行操作。
|
||||
@@ -0,0 +1,53 @@
|
||||
以下是翻译后的内容:
|
||||
|
||||
# 图形用户界面模式
|
||||
|
||||
## 简介
|
||||
|
||||
OpenHands 提供了一个用户友好的图形用户界面 (GUI) 模式,用于与 AI 助手进行交互。该模式提供了一种直观的方式来设置环境、管理设置以及与 AI 进行通信。
|
||||
|
||||
## 安装和设置
|
||||
|
||||
1. 按照[安装](../installation)指南中的说明安装 OpenHands。
|
||||
|
||||
2. 运行命令后,通过 [http://localhost:3000](http://localhost:3000) 访问 OpenHands。
|
||||
|
||||
## 与 GUI 交互
|
||||
|
||||
### 初始设置
|
||||
|
||||
1. 首次启动时,您将看到一个设置模态框。
|
||||
2. 从下拉菜单中选择一个 `LLM Provider` 和 `LLM Model`。
|
||||
3. 输入您选择的提供商对应的 `API Key`。
|
||||
4. 点击"保存"应用设置。
|
||||
|
||||
### 高级设置
|
||||
|
||||
1. 切换 `Advanced Options` 以访问其他设置。
|
||||
2. 如果列表中没有您需要的模型,请使用 `Custom Model` 文本框手动输入模型。
|
||||
3. 如果您的 LLM 提供商需要,请指定一个 `Base URL`。
|
||||
|
||||
### 主界面
|
||||
|
||||
主界面由几个关键组件组成:
|
||||
|
||||
1. **聊天窗口**:您可以查看与 AI 助手的对话历史记录的中心区域。
|
||||
2. **输入框**:位于屏幕底部,用于输入您要发送给 AI 的消息或命令。
|
||||
3. **发送按钮**:点击此按钮将您的消息发送给 AI。
|
||||
4. **设置按钮**:打开设置模态框的齿轮图标,允许您随时调整配置。
|
||||
5. **工作区面板**:显示工作区中的文件和文件夹,允许您导航和查看文件,或查看代理的过去命令或网页浏览历史记录。
|
||||
|
||||
### 与 AI 交互
|
||||
|
||||
1. 在输入框中输入您的问题、请求或任务描述。
|
||||
2. 点击发送按钮或按回车键提交您的消息。
|
||||
3. AI 将处理您的输入并在聊天窗口中提供响应。
|
||||
4. 您可以通过询问后续问题或提供额外信息来继续对话。
|
||||
|
||||
## 有效使用的提示
|
||||
|
||||
1. 在您的请求中要具体,以获得最准确和最有帮助的响应,如[提示最佳实践](../prompting-best-practices)中所述。
|
||||
2. 使用工作区面板探索您的项目结构。
|
||||
3. 使用[LLMs 部分](usage/llms/llms.md)中描述的推荐模型之一。
|
||||
|
||||
请记住,OpenHands 的 GUI 模式旨在使您与 AI 助手的交互尽可能流畅和直观。不要犹豫探索其功能以最大限度地提高您的工作效率。
|
||||
@@ -0,0 +1,59 @@
|
||||
以下是翻译后的内容:
|
||||
|
||||
# 无头模式
|
||||
|
||||
你可以使用单个命令运行 OpenHands,而无需启动 Web 应用程序。
|
||||
这使得使用 OpenHands 编写脚本和自动化任务变得很容易。
|
||||
|
||||
这与[CLI 模式](cli-mode)不同,后者是交互式的,更适合主动开发。
|
||||
|
||||
## 使用 Python
|
||||
|
||||
要在 Python 中以无头模式运行 OpenHands,
|
||||
[请按照开发设置说明](https://github.com/All-Hands-AI/OpenHands/blob/main/Development.md),
|
||||
然后运行:
|
||||
|
||||
```bash
|
||||
poetry run python -m openhands.core.main -t "write a bash script that prints hi"
|
||||
```
|
||||
|
||||
你需要确保通过环境变量
|
||||
[或 `config.toml` 文件](https://github.com/All-Hands-AI/OpenHands/blob/main/config.template.toml)
|
||||
设置你的模型、API 密钥和其他设置。
|
||||
|
||||
## 使用 Docker
|
||||
|
||||
1. 将 `WORKSPACE_BASE` 设置为你希望 OpenHands 编辑的目录:
|
||||
|
||||
```bash
|
||||
WORKSPACE_BASE=$(pwd)/workspace
|
||||
```
|
||||
|
||||
2. 将 `LLM_MODEL` 设置为你要使用的模型:
|
||||
|
||||
```bash
|
||||
LLM_MODEL="anthropic/claude-3-5-sonnet-20240620"
|
||||
```
|
||||
|
||||
3. 将 `LLM_API_KEY` 设置为你的 API 密钥:
|
||||
|
||||
```bash
|
||||
LLM_API_KEY="sk_test_12345"
|
||||
```
|
||||
|
||||
4. 运行以下 Docker 命令:
|
||||
|
||||
```bash
|
||||
docker run -it \
|
||||
--pull=always \
|
||||
-e SANDBOX_USER_ID=$(id -u) \
|
||||
-e WORKSPACE_MOUNT_PATH=$WORKSPACE_BASE \
|
||||
-e LLM_API_KEY=$LLM_API_KEY \
|
||||
-e LLM_MODEL=$LLM_MODEL \
|
||||
-v $WORKSPACE_BASE:/opt/workspace_base \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||
--add-host host.docker.internal:host-gateway \
|
||||
--name openhands-app-$(date +%Y%m%d%H%M%S) \
|
||||
ghcr.io/all-hands-ai/openhands:0.11 \
|
||||
python -m openhands.core.main -t "write a bash script that prints hi"
|
||||
```
|
||||
@@ -0,0 +1,343 @@
|
||||
以下是翻译后的内容:
|
||||
|
||||
# Kubernetes
|
||||
|
||||
在 Kubernetes 或 OpenShift 上运行 OpenHands 有不同的方式。本指南介绍了一种可能的方式:
|
||||
1. 作为集群管理员,创建一个 PV 将 workspace_base 数据和 docker 目录映射到 worker 节点上的 pod
|
||||
2. 创建一个 PVC 以便将这些 PV 挂载到 pod
|
||||
3. 创建一个包含两个容器的 pod:OpenHands 和 Sandbox 容器
|
||||
|
||||
## 上述示例的详细步骤
|
||||
|
||||
> 注意:确保首先使用适当的帐户登录到集群以执行每个步骤。创建 PV 需要集群管理员权限!
|
||||
|
||||
> 确保你对下面使用的 hostPath(即 /tmp/workspace)有读写权限
|
||||
|
||||
1. 创建 PV:
|
||||
集群管理员可以使用下面的示例 yaml 文件创建 PV。
|
||||
- workspace-pv.yaml
|
||||
|
||||
```yamlfile
|
||||
apiVersion: v1
|
||||
kind: PersistentVolume
|
||||
metadata:
|
||||
name: workspace-pv
|
||||
spec:
|
||||
capacity:
|
||||
storage: 2Gi
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
persistentVolumeReclaimPolicy: Retain
|
||||
hostPath:
|
||||
path: /tmp/workspace
|
||||
```
|
||||
|
||||
```bash
|
||||
# 应用 yaml 文件
|
||||
$ oc create -f workspace-pv.yaml
|
||||
persistentvolume/workspace-pv created
|
||||
|
||||
# 查看:
|
||||
$ oc get pv
|
||||
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
|
||||
workspace-pv 2Gi RWO Retain Available 7m23s
|
||||
```
|
||||
|
||||
- docker-pv.yaml
|
||||
|
||||
```yamlfile
|
||||
apiVersion: v1
|
||||
kind: PersistentVolume
|
||||
metadata:
|
||||
name: docker-pv
|
||||
spec:
|
||||
capacity:
|
||||
storage: 2Gi
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
persistentVolumeReclaimPolicy: Retain
|
||||
hostPath:
|
||||
path: /var/run/docker.sock
|
||||
```
|
||||
|
||||
```bash
|
||||
# 应用 yaml 文件
|
||||
$ oc create -f docker-pv.yaml
|
||||
persistentvolume/docker-pv created
|
||||
|
||||
# 查看:
|
||||
oc get pv
|
||||
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
|
||||
docker-pv 2Gi RWO Retain Available 6m55s
|
||||
workspace-pv 2Gi RWO Retain Available 7m23s
|
||||
```
|
||||
|
||||
2. 创建 PVC:
|
||||
下面是示例 PVC yaml 文件:
|
||||
|
||||
- workspace-pvc.yaml
|
||||
|
||||
```yamlfile
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: workspace-pvc
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 1Gi
|
||||
```
|
||||
|
||||
```bash
|
||||
# 创建 pvc
|
||||
$ oc create -f workspace-pvc.yaml
|
||||
persistentvolumeclaim/workspace-pvc created
|
||||
|
||||
# 查看
|
||||
$ oc get pvc
|
||||
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
|
||||
workspace-pvc Pending hcloud-volumes 4s
|
||||
|
||||
$ oc get events
|
||||
LAST SEEN TYPE REASON OBJECT MESSAGE
|
||||
8s Normal WaitForFirstConsumer persistentvolumeclaim/workspace-pvc waiting for first consumer to be created before binding
|
||||
```
|
||||
|
||||
- docker-pvc.yaml
|
||||
|
||||
```yamlfile
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: docker-pvc
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 1Gi
|
||||
```
|
||||
|
||||
```bash
|
||||
# 创建 pvc
|
||||
$ oc create -f docker-pvc.yaml
|
||||
persistentvolumeclaim/docker-pvc created
|
||||
|
||||
# 查看
|
||||
$ oc get pvc
|
||||
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
|
||||
docker-pvc Pending hcloud-volumes 4s
|
||||
workspace-pvc Pending hcloud-volumes 2m53s
|
||||
|
||||
$ oc get events
|
||||
LAST SEEN TYPE REASON OBJECT MESSAGE
|
||||
10s Normal WaitForFirstConsumer persistentvolumeclaim/docker-pvc waiting for first consumer to be created before binding
|
||||
10s Normal WaitForFirstConsumer persistentvolumeclaim/workspace-pvc waiting for first consumer to be created before binding
|
||||
```
|
||||
|
||||
3. 创建 pod yaml 文件:
|
||||
下面是示例 pod yaml 文件:
|
||||
|
||||
- pod.yaml
|
||||
|
||||
```yamlfile
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: openhands-app-2024
|
||||
labels:
|
||||
app: openhands-app-2024
|
||||
spec:
|
||||
containers:
|
||||
- name: openhands-app-2024
|
||||
image: ghcr.io/all-hands-ai/openhands:main
|
||||
env:
|
||||
- name: SANDBOX_USER_ID
|
||||
value: "1000"
|
||||
- name: WORKSPACE_MOUNT_PATH
|
||||
value: "/opt/workspace_base"
|
||||
volumeMounts:
|
||||
- name: workspace-volume
|
||||
mountPath: /opt/workspace_base
|
||||
- name: docker-sock
|
||||
mountPath: /var/run/docker.sock
|
||||
ports:
|
||||
- containerPort: 3000
|
||||
- name: openhands-sandbox-2024
|
||||
image: ghcr.io/all-hands-ai/sandbox:main
|
||||
ports:
|
||||
- containerPort: 51963
|
||||
command: ["/usr/sbin/sshd", "-D", "-p 51963", "-o", "PermitRootLogin=yes"]
|
||||
volumes:
|
||||
- name: workspace-volume
|
||||
persistentVolumeClaim:
|
||||
claimName: workspace-pvc
|
||||
- name: docker-sock
|
||||
persistentVolumeClaim:
|
||||
claimName: docker-pvc
|
||||
```
|
||||
|
||||
|
||||
```bash
|
||||
# 创建 pod
|
||||
$ oc create -f pod.yaml
|
||||
W0716 11:22:07.776271 107626 warnings.go:70] would violate PodSecurity "restricted:v1.24": allowPrivilegeEscalation != false (containers "openhands-app-2024", "openhands-sandbox-2024" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (containers "openhands-app-2024", "openhands-sandbox-2024" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or containers "openhands-app-2024", "openhands-sandbox-2024" must set securityContext.runAsNonRoot=true), seccompProfile (pod or containers "openhands-app-2024", "openhands-sandbox-2024" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
|
||||
pod/openhands-app-2024 created
|
||||
|
||||
# 上面的警告可以暂时忽略,因为我们不会修改 SCC 限制。
|
||||
|
||||
# 查看
|
||||
$ oc get pods
|
||||
NAME READY STATUS RESTARTS AGE
|
||||
openhands-app-2024 0/2 Pending 0 5s
|
||||
|
||||
$ oc get pods
|
||||
NAME READY STATUS RESTARTS AGE
|
||||
openhands-app-2024 0/2 ContainerCreating 0 15s
|
||||
|
||||
$ oc get events
|
||||
LAST SEEN TYPE REASON OBJECT MESSAGE
|
||||
38s Normal WaitForFirstConsumer persistentvolumeclaim/docker-pvc waiting for first consumer to be created before binding
|
||||
23s Normal ExternalProvisioning persistentvolumeclaim/docker-pvc waiting for a volume to be created, either by external provisioner "csi.hetzner.cloud" or manually created by system administrator
|
||||
27s Normal Provisioning persistentvolumeclaim/docker-pvc External provisioner is provisioning volume for claim "openhands/docker-pvc"
|
||||
17s Normal ProvisioningSucceeded persistentvolumeclaim/docker-pvc Successfully provisioned volume pvc-2b1d223a-1c8f-4990-8e3d-68061a9ae252
|
||||
16s Normal Scheduled pod/openhands-app-2024 Successfully assigned All-Hands-AI/OpenHands-app-2024 to worker1.hub.internal.blakane.com
|
||||
9s Normal SuccessfulAttachVolume pod/openhands-app-2024 AttachVolume.Attach succeeded for volume "pvc-2b1d223a-1c8f-4990-8e3d-68061a9ae252"
|
||||
9s Normal SuccessfulAttachVolume pod/openhands-app-2024 AttachVolume.Attach succeeded for volume "pvc-31f15b25-faad-4665-a25f-201a530379af"
|
||||
6s Normal AddedInterface pod/openhands-app-2024 Add eth0 [10.128.2.48/23] from openshift-sdn
|
||||
6s Normal Pulled pod/openhands-app-2024 Container image "ghcr.io/all-hands-ai/openhands:main" already present on machine
|
||||
6s Normal Created pod/openhands-app-2024 Created container openhands-app-2024
|
||||
6s Normal Started pod/openhands-app-2024 Started container openhands-app-2024
|
||||
6s Normal Pulled pod/openhands-app-2024 Container image "ghcr.io/all-hands-ai/sandbox:main" already present on machine
|
||||
5s Normal Created pod/openhands-app-2024 Created container openhands-sandbox-2024
|
||||
5s Normal Started pod/openhands-app-2024 Started container openhands-sandbox-2024
|
||||
83s Normal WaitForFirstConsumer persistentvolumeclaim/workspace-pvc waiting for first consumer to be created before binding
|
||||
27s Normal Provisioning persistentvolumeclaim/workspace-pvc External provisioner is provisioning volume for claim "openhands/workspace-pvc"
|
||||
17s Normal ProvisioningSucceeded persistentvolumeclaim/workspace-pvc Successfully provisioned volume pvc-31f15b25-faad-4665-a25f-201a530379af
|
||||
|
||||
$ oc get pods
|
||||
NAME READY STATUS RESTARTS AGE
|
||||
openhands-app-2024 2/2 Running 0 23s
|
||||
|
||||
$ oc get pvc
|
||||
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
|
||||
docker-pvc Bound pvc-2b1d223a-1c8f-4990-8e3d-68061a9ae252 10Gi RWO hcloud-volumes 10m
|
||||
workspace-pvc Bound pvc-31f15b25-faad-4665-a25f-201a530379af 10Gi RWO hcloud-volumes 13m
|
||||
|
||||
```
|
||||
|
||||
4. 创建一个 NodePort 服务。
|
||||
下面是示例服务创建命令:
|
||||
|
||||
```bash
|
||||
# 创建 NodePort 类型的服务
|
||||
$ oc create svc nodeport openhands-app-2024 --tcp=3000:3000
|
||||
service/openhands-app-2024 created
|
||||
|
||||
# 查看
|
||||
|
||||
$ oc get svc
|
||||
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
|
||||
openhands-app-2024 NodePort 172.30.225.42 <none> 3000:30495/TCP 4s
|
||||
|
||||
$ oc describe svc openhands-app-2024
|
||||
Name: openhands-app-2024
|
||||
Namespace: openhands
|
||||
Labels: app=openhands-app-2024
|
||||
Annotations: <none>
|
||||
Selector: app=openhands-app-2024
|
||||
Type: NodePort
|
||||
IP Family Policy: SingleStack
|
||||
IP Families: IPv4
|
||||
IP: 172.30.225.42
|
||||
IPs: 172.30.225.42
|
||||
Port: 3000-3000 3000/TCP
|
||||
TargetPort: 3000/TCP
|
||||
NodePort: 3000-3000 30495/TCP
|
||||
Endpoints: 10.128.2.48:3000
|
||||
Session Affinity: None
|
||||
External Traffic Policy: Cluster
|
||||
Events: <none>
|
||||
```
|
||||
|
||||
6. 连接到 OpenHands UI,配置 Agent,然后测试:
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## GCP GKE OpenHands 部署
|
||||
|
||||
**警告**:此部署授予 OpenHands 应用程序访问 Kubernetes docker socket 的权限,这会带来安全风险。请自行决定是否使用。
|
||||
1- 创建特权访问策略
|
||||
2- 创建 gke 凭证(可选)
|
||||
3- 创建 openhands 部署
|
||||
4- 验证和 UI 访问命令
|
||||
5- 排查 pod 以验证内部容器
|
||||
|
||||
1. 创建特权访问策略
|
||||
```bash
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
name: privileged-role
|
||||
rules:
|
||||
- apiGroups: [""]
|
||||
resources: ["pods"]
|
||||
verbs: ["create", "get", "list", "watch", "delete"]
|
||||
- apiGroups: ["apps"]
|
||||
resources: ["deployments"]
|
||||
verbs: ["create", "get", "list", "watch", "delete"]
|
||||
- apiGroups: [""]
|
||||
resources: ["pods/exec"]
|
||||
verbs: ["create"]
|
||||
- apiGroups: [""]
|
||||
resources: ["pods/log"]
|
||||
verbs: ["get"]
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
name: privileged-role-binding
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: privileged-role
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: default # 更改为你的服务帐户名称
|
||||
namespace: default
|
||||
```
|
||||
2. 创建 gke 凭证(可选)
|
||||
```bash
|
||||
kubectl create secret generic google-cloud-key \
|
||||
--from-file=key.json=/path/to/your/google-cloud-key.json
|
||||
```
|
||||
3. 创建 openhands 部署
|
||||
## 由于这是针对单个工作节点进行测试的,如果你有多个节点,请指定单个工作节点的标志
|
||||
|
||||
```bash
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: openhands-app-2024
|
||||
labels:
|
||||
app: openhands-app-2024
|
||||
spec:
|
||||
replicas: 1 # 你可以增加这个数字以获得多个副本
|
||||
selector:
|
||||
matchLabels:
|
||||
app: openhands-app-2024
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: openhands-app-2024
|
||||
spec:
|
||||
containers:
|
||||
- name: openhands-app-2024
|
||||
image: ghcr.io/all-hands-ai/openhands:main
|
||||
env:
|
||||
- name: SANDBOX_USER_ID
|
||||
value: "1000"
|
||||
- name: SANDBOX_API
|
||||
@@ -0,0 +1,58 @@
|
||||
# 安装
|
||||
|
||||
## 系统要求
|
||||
|
||||
* Docker 版本 26.0.0+ 或 Docker Desktop 4.31.0+。
|
||||
* 你必须使用 Linux 或 Mac OS。
|
||||
* 如果你使用的是 Windows,你必须使用 [WSL](https://learn.microsoft.com/en-us/windows/wsl/install)。
|
||||
|
||||
## 启动应用
|
||||
|
||||
在 Docker 中运行 OpenHands 是最简单的方式。你可以将下面的 `WORKSPACE_BASE` 更改为指向你想要修改的现有代码。
|
||||
|
||||
```bash
|
||||
export WORKSPACE_BASE=$(pwd)/workspace
|
||||
|
||||
docker pull ghcr.io/all-hands-ai/runtime:0.11-nikolaik
|
||||
|
||||
docker run -it --pull=always \
|
||||
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=ghcr.io/all-hands-ai/runtime:0.11-nikolaik \
|
||||
-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:0.11
|
||||
```
|
||||
|
||||
你也可以在可脚本化的[无头模式](https://docs.all-hands.dev/modules/usage/how-to/headless-mode)下运行 OpenHands,作为[交互式 CLI](https://docs.all-hands.dev/modules/usage/how-to/cli-mode),或使用 [OpenHands GitHub Action](https://docs.all-hands.dev/modules/usage/how-to/github-action)。
|
||||
|
||||
## 设置
|
||||
|
||||
运行上面的命令后,你会发现 OpenHands 运行在 [http://localhost:3000](http://localhost:3000)。
|
||||
|
||||
代理将可以访问 `./workspace` 文件夹来完成其工作。你可以将现有代码复制到这里,或在命令中更改 `WORKSPACE_BASE` 以指向现有文件夹。
|
||||
|
||||
启动 OpenHands 后,你会看到一个设置模态框。你**必须**选择一个 `LLM Provider` 和 `LLM Model`,并输入相应的 `API Key`。这些可以随时通过在 UI 中选择 `Settings` 按钮(齿轮图标)来更改。
|
||||
|
||||
如果所需的 `LLM Model` 不存在于列表中,你可以切换 `Advanced Options`,并在 `Custom Model` 文本框中使用正确的前缀手动输入它。`Advanced Options` 还允许你在需要时指定 `Base URL`。
|
||||
|
||||
<div style={{ display: 'flex', justifyContent: 'center', gap: '20px' }}>
|
||||
<img src="/img/settings-screenshot.png" alt="settings-modal" width="340" />
|
||||
<img src="/img/settings-advanced.png" alt="settings-modal" width="335" />
|
||||
</div>
|
||||
|
||||
## 版本
|
||||
|
||||
上面的命令拉取最新的 OpenHands 稳定版本。你还有其他选择:
|
||||
- 对于特定版本,使用 `ghcr.io/all-hands-ai/openhands:$VERSION`,将 $VERSION 替换为版本号。
|
||||
- 我们使用语义化版本,并发布主要、次要和补丁标签。因此,`0.9` 将自动指向最新的 `0.9.x` 版本,而 `0` 将指向最新的 `0.x.x` 版本。
|
||||
- 对于最新的开发版本,你可以使用 `ghcr.io/all-hands-ai/openhands:main`。此版本不稳定,仅建议用于测试或开发目的。
|
||||
|
||||
你可以根据稳定性要求和所需功能选择最适合你需求的标签。
|
||||
|
||||
有关开发工作流程,请参阅 [Development.md](https://github.com/All-Hands-AI/OpenHands/blob/main/Development.md)。
|
||||
|
||||
遇到问题了吗?查看我们的[故障排除指南](https://docs.all-hands.dev/modules/usage/troubleshooting)。
|
||||
@@ -0,0 +1,43 @@
|
||||
# Azure
|
||||
|
||||
OpenHands 使用 LiteLLM 调用 Azure 的聊天模型。你可以在[这里](https://docs.litellm.ai/docs/providers/azure)找到他们关于使用 Azure 作为提供商的文档。
|
||||
|
||||
## Azure OpenAI 配置
|
||||
|
||||
运行 OpenHands 时,你需要在 [docker run 命令](/modules/usage/installation#start-the-app)中使用 `-e` 设置以下环境变量:
|
||||
|
||||
```
|
||||
LLM_API_VERSION="<api-version>" # 例如 "2023-05-15"
|
||||
```
|
||||
|
||||
示例:
|
||||
```bash
|
||||
docker run -it --pull=always \
|
||||
-e LLM_API_VERSION="2023-05-15"
|
||||
...
|
||||
```
|
||||
|
||||
然后在 OpenHands UI 的设置中设置以下内容:
|
||||
|
||||
:::note
|
||||
你需要你的 ChatGPT 部署名称,可以在 Azure 的部署页面找到。下面将其称为 <deployment-name>。
|
||||
:::
|
||||
|
||||
* 启用 `Advanced Options`
|
||||
* 将 `Custom Model` 设置为 azure/<deployment-name>
|
||||
* 将 `Base URL` 设置为你的 Azure API 基础 URL(例如 `https://example-endpoint.openai.azure.com`)
|
||||
* 将 `API Key` 设置为你的 Azure API 密钥
|
||||
|
||||
## Embeddings
|
||||
|
||||
OpenHands 使用 llama-index 进行 embeddings。你可以在[这里](https://docs.llamaindex.ai/en/stable/api_reference/embeddings/azure_openai/)找到他们关于 Azure 的文档。
|
||||
|
||||
### Azure OpenAI 配置
|
||||
|
||||
运行 OpenHands 时,在 [docker run 命令](/modules/usage/installation#start-the-app)中使用 `-e` 设置以下环境变量:
|
||||
|
||||
```
|
||||
LLM_EMBEDDING_MODEL="azureopenai"
|
||||
LLM_EMBEDDING_DEPLOYMENT_NAME="<your-embedding-deployment-name>" # 例如 "TextEmbedding...<etc>"
|
||||
LLM_API_VERSION="<api-version>" # 例如 "2024-02-15-preview"
|
||||
```
|
||||
@@ -0,0 +1,29 @@
|
||||
# Google Gemini/Vertex
|
||||
|
||||
OpenHands 使用 LiteLLM 调用 Google 的聊天模型。你可以在以下文档中找到使用 Google 作为提供商的说明:
|
||||
|
||||
- [Gemini - Google AI Studio](https://docs.litellm.ai/docs/providers/gemini)
|
||||
- [VertexAI - Google Cloud Platform](https://docs.litellm.ai/docs/providers/vertex)
|
||||
|
||||
## Gemini - Google AI Studio 配置
|
||||
|
||||
运行 OpenHands 时,你需要在设置中设置以下内容:
|
||||
* 将 `LLM Provider` 设置为 `Gemini`
|
||||
* 将 `LLM Model` 设置为你将使用的模型。
|
||||
如果模型不在列表中,请切换 `Advanced Options`,并在 `Custom Model` 中输入(例如 gemini/<model-name> 如 `gemini/gemini-1.5-pro`)。
|
||||
* 将 `API Key` 设置为你的 Gemini API 密钥
|
||||
|
||||
## VertexAI - Google Cloud Platform 配置
|
||||
|
||||
要在运行 OpenHands 时通过 Google Cloud Platform 使用 Vertex AI,你需要使用 [docker run 命令](/modules/usage/installation#start-the-app) 中的 `-e` 设置以下环境变量:
|
||||
|
||||
```
|
||||
GOOGLE_APPLICATION_CREDENTIALS="<json-dump-of-gcp-service-account-json>"
|
||||
VERTEXAI_PROJECT="<your-gcp-project-id>"
|
||||
VERTEXAI_LOCATION="<your-gcp-location>"
|
||||
```
|
||||
|
||||
然后在设置中设置以下内容:
|
||||
* 将 `LLM Provider` 设置为 `VertexAI`
|
||||
* 将 `LLM Model` 设置为你将使用的模型。
|
||||
如果模型不在列表中,请切换 `Advanced Options`,并在 `Custom Model` 中输入(例如 vertex_ai/<model-name>)。
|
||||
@@ -0,0 +1,20 @@
|
||||
# Groq
|
||||
|
||||
OpenHands 使用 LiteLLM 在 Groq 上调用聊天模型。你可以在[这里](https://docs.litellm.ai/docs/providers/groq)找到他们关于使用 Groq 作为提供商的文档。
|
||||
|
||||
## 配置
|
||||
|
||||
在运行 OpenHands 时,你需要在设置中设置以下内容:
|
||||
* `LLM Provider` 设置为 `Groq`
|
||||
* `LLM Model` 设置为你将使用的模型。[访问此处查看 Groq 托管的模型列表](https://console.groq.com/docs/models)。如果模型不在列表中,切换 `Advanced Options`,并在 `Custom Model` 中输入它(例如 groq/<model-name> 如 `groq/llama3-70b-8192`)。
|
||||
* `API key` 设置为你的 Groq API 密钥。要查找或创建你的 Groq API 密钥,[请参见此处](https://console.groq.com/keys)。
|
||||
|
||||
|
||||
|
||||
## 使用 Groq 作为 OpenAI 兼容端点
|
||||
|
||||
Groq 的聊天完成端点[大部分与 OpenAI 兼容](https://console.groq.com/docs/openai)。因此,你可以像访问任何 OpenAI 兼容端点一样访问 Groq 模型。你可以在设置中设置以下内容:
|
||||
* 启用 `Advanced Options`
|
||||
* `Custom Model` 设置为前缀 `openai/` + 你将使用的模型(例如 `openai/llama3-70b-8192`)
|
||||
* `Base URL` 设置为 `https://api.groq.com/openai/v1`
|
||||
* `API Key` 设置为你的 Groq API 密钥
|
||||
@@ -1,46 +1,81 @@
|
||||
---
|
||||
sidebar_position: 2
|
||||
---
|
||||
# 🤖 LLM 后端
|
||||
|
||||
# 🤖 LLM 支持
|
||||
OpenHands 可以连接到 LiteLLM 支持的任何 LLM。但是,它需要一个强大的模型才能工作。
|
||||
|
||||
OpenHands 可以兼容任何 LLM 后端。
|
||||
关于所有可用 LM 提供商和模型的完整列表,请参阅
|
||||
[litellm 文档](https://docs.litellm.ai/docs/providers)。
|
||||
## 模型推荐
|
||||
|
||||
基于最近对编码任务的语言模型评估(使用 SWE-bench 数据集),我们可以为模型选择提供一些建议。完整的分析可以在[这篇博客文章](https://www.all-hands.dev/blog/evaluation-of-llms-as-coding-agents-on-swe-bench-at-30x-speed)中找到。
|
||||
|
||||
在选择模型时,需要同时考虑输出质量和相关成本。以下是调查结果的总结:
|
||||
|
||||
- Claude 3.5 Sonnet 是目前最好的,在 OpenHands 中使用默认 agent 可以达到 27% 的解决率。
|
||||
- GPT-4o 落后一些,而 o1-mini 的表现甚至比 GPT-4o 还要差一些。我们进行了一些分析,简单来说,o1 有时会"过度思考",在可以直接完成任务的情况下执行额外的环境配置任务。
|
||||
- 最后,最强大的开放模型是 Llama 3.1 405 B 和 deepseek-v2.5,它们表现得相当不错,甚至超过了一些封闭模型。
|
||||
|
||||
请参阅[完整文章](https://www.all-hands.dev/blog/evaluation-of-llms-as-coding-agents-on-swe-bench-at-30x-speed)以获取更多详细信息。
|
||||
|
||||
基于这些发现和社区反馈,以下模型已经验证可以与 OpenHands 很好地配合使用:
|
||||
|
||||
- claude-3-5-sonnet(推荐)
|
||||
- gpt-4 / gpt-4o
|
||||
- llama-3.1-405b
|
||||
- deepseek-v2.5
|
||||
|
||||
:::warning
|
||||
OpenHands 将向你配置的 LLM 发出许多提示。大多数这些 LLM 都是收费的——请务必设定支出限额并监控使用情况。
|
||||
OpenHands 将向您配置的 LLM 发出许多提示。这些 LLM 中的大多数都需要付费,因此请确保设置支出限制并监控使用情况。
|
||||
:::
|
||||
|
||||
`LLM_MODEL` 环境变量控制在编程交互中使用的模型。
|
||||
但在使用 OpenHands UI 时,你需要在设置窗口中选择你的模型(左下角的齿轮)。
|
||||
如果您已经成功地使用特定的未列出的 LLM 运行 OpenHands,请将它们添加到已验证列表中。我们也鼓励您提交 PR 分享您的设置过程,以帮助其他使用相同提供商和 LLM 的人!
|
||||
|
||||
某些 LLM 可能需要以下环境变量:
|
||||
有关可用提供商和模型的完整列表,请查阅 [litellm 文档](https://docs.litellm.ai/docs/providers)。
|
||||
|
||||
- `LLM_API_KEY`
|
||||
- `LLM_BASE_URL`
|
||||
:::note
|
||||
目前大多数本地和开源模型都没有那么强大。使用这些模型时,您可能会看到消息之间的长时间等待、响应不佳或有关 JSON 格式错误的错误。OpenHands 只能和驱动它的模型一样强大。但是,如果您确实找到了可以使用的模型,请将它们添加到上面的已验证列表中。
|
||||
:::
|
||||
|
||||
## LLM 配置
|
||||
|
||||
以下内容可以通过设置在 OpenHands UI 中设置:
|
||||
|
||||
- `LLM Provider`
|
||||
- `LLM Model`
|
||||
- `API Key`
|
||||
- `Base URL`(通过`Advanced Settings`)
|
||||
|
||||
有些设置可能对某些 LLM/提供商是必需的,但无法通过 UI 设置。相反,可以使用 `-e` 通过传递给 [docker run 命令](/modules/usage/installation#start-the-app)的环境变量来设置这些选项:
|
||||
|
||||
- `LLM_API_VERSION`
|
||||
- `LLM_EMBEDDING_MODEL`
|
||||
- `LLM_EMBEDDING_DEPLOYMENT_NAME`
|
||||
- `LLM_API_VERSION`
|
||||
- `LLM_DROP_PARAMS`
|
||||
- `LLM_DISABLE_VISION`
|
||||
- `LLM_CACHING_PROMPT`
|
||||
|
||||
我们有一些指南,介绍了如何使用特定模型提供商运行 OpenHands:
|
||||
我们有一些使用特定模型提供商运行 OpenHands 的指南:
|
||||
|
||||
- [ollama](llms/local-llms)
|
||||
- [Azure](llms/azure-llms)
|
||||
- [Google](llms/google-llms)
|
||||
- [Groq](llms/groq)
|
||||
- [OpenAI](llms/openai-llms)
|
||||
- [OpenRouter](llms/openrouter)
|
||||
|
||||
如果你使用其他提供商,我们鼓励你打开一个 PR 来分享你的配置!
|
||||
### API 重试和速率限制
|
||||
|
||||
## 关于替代模型的注意事项
|
||||
LLM 提供商通常有速率限制,有时非常低,可能需要重试。如果收到速率限制错误(429 错误代码)、API 连接错误或其他瞬时错误,OpenHands 将自动重试请求。
|
||||
|
||||
最好的模型是 GPT-4 和 Claude 3。目前的本地和开源模型
|
||||
远没有那么强大。当使用替代模型时,
|
||||
你可能会看到信息之间的长时间等待,
|
||||
糟糕的响应,或关于 JSON格式错误的错误。OpenHands
|
||||
的强大程度依赖于其驱动的模型——幸运的是,我们团队的人员
|
||||
正在积极致力于构建更好的开源模型!
|
||||
您可以根据正在使用的提供商的需要自定义这些选项。查看他们的文档,并设置以下环境变量来控制重试次数和重试之间的时间:
|
||||
|
||||
## API 重试和速率限制
|
||||
- `LLM_NUM_RETRIES`(默认为 8)
|
||||
- `LLM_RETRY_MIN_WAIT`(默认为 15 秒)
|
||||
- `LLM_RETRY_MAX_WAIT`(默认为 120 秒)
|
||||
- `LLM_RETRY_MULTIPLIER`(默认为 2)
|
||||
|
||||
一些 LLM 有速率限制,可能需要重试操作。OpenHands 会在收到 429 错误或 API 连接错误时自动重试请求。
|
||||
你可以设置 `LLM_NUM_RETRIES`,`LLM_RETRY_MIN_WAIT`,`LLM_RETRY_MAX_WAIT` 环境变量来控制重试次数和重试之间的时间。
|
||||
默认情况下,`LLM_NUM_RETRIES` 为 8,`LLM_RETRY_MIN_WAIT` 和 `LLM_RETRY_MAX_WAIT` 分别为 15 秒和 120 秒。
|
||||
如果您在开发模式下运行 OpenHands,也可以在 `config.toml` 文件中设置这些选项:
|
||||
|
||||
```toml
|
||||
[llm]
|
||||
num_retries = 8
|
||||
retry_min_wait = 15
|
||||
retry_max_wait = 120
|
||||
retry_multiplier = 2
|
||||
```
|
||||
|
||||
@@ -0,0 +1,216 @@
|
||||
# 使用 Ollama 的本地 LLM
|
||||
|
||||
:::warning
|
||||
使用本地 LLM 时,OpenHands 可能会有功能限制。
|
||||
:::
|
||||
|
||||
确保你已经启动并运行了 Ollama 服务器。
|
||||
详细的启动说明,请参考[这里](https://github.com/ollama/ollama)。
|
||||
|
||||
本指南假设你已经使用 `ollama serve` 启动了 ollama。如果你以不同的方式运行 ollama(例如在 docker 内),则可能需要修改说明。请注意,如果你正在运行 WSL,默认的 ollama 配置会阻止来自 docker 容器的请求。请参阅[这里](#configuring-ollama-service-wsl-zh)。
|
||||
|
||||
## 拉取模型
|
||||
|
||||
Ollama 模型名称可以在[这里](https://ollama.com/library)找到。对于一个小例子,你可以使用
|
||||
`codellama:7b` 模型。更大的模型通常会有更好的表现。
|
||||
|
||||
```bash
|
||||
ollama pull codellama:7b
|
||||
```
|
||||
|
||||
你可以像这样检查已下载的模型:
|
||||
|
||||
```bash
|
||||
~$ ollama list
|
||||
NAME ID SIZE MODIFIED
|
||||
codellama:7b 8fdf8f752f6e 3.8 GB 6 weeks ago
|
||||
mistral:7b-instruct-v0.2-q4_K_M eb14864c7427 4.4 GB 2 weeks ago
|
||||
starcoder2:latest f67ae0f64584 1.7 GB 19 hours ago
|
||||
```
|
||||
|
||||
## 使用 Docker 运行 OpenHands
|
||||
|
||||
### 启动 OpenHands
|
||||
使用[这里](../getting-started)的说明,使用 Docker 启动 OpenHands。
|
||||
但在运行 `docker run` 时,你需要添加一些额外的参数:
|
||||
|
||||
```bash
|
||||
--add-host host.docker.internal:host-gateway \
|
||||
-e LLM_OLLAMA_BASE_URL="http://host.docker.internal:11434" \
|
||||
```
|
||||
|
||||
LLM_OLLAMA_BASE_URL 是可选的。如果设置了,它将用于在 UI 中显示可用的已安装模型。
|
||||
|
||||
示例:
|
||||
|
||||
```bash
|
||||
# 你希望 OpenHands 修改的目录。必须是绝对路径!
|
||||
export WORKSPACE_BASE=$(pwd)/workspace
|
||||
|
||||
docker run \
|
||||
-it \
|
||||
--pull=always \
|
||||
--add-host host.docker.internal:host-gateway \
|
||||
-e SANDBOX_USER_ID=$(id -u) \
|
||||
-e LLM_OLLAMA_BASE_URL="http://host.docker.internal:11434" \
|
||||
-e WORKSPACE_MOUNT_PATH=$WORKSPACE_BASE \
|
||||
-v $WORKSPACE_BASE:/opt/workspace_base \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||
-p 3000:3000 \
|
||||
ghcr.io/all-hands-ai/openhands:main
|
||||
```
|
||||
|
||||
现在你应该可以连接到 `http://localhost:3000/` 了。
|
||||
|
||||
### 配置 Web 应用程序
|
||||
|
||||
在运行 `openhands` 时,你需要在 OpenHands UI 的设置中设置以下内容:
|
||||
- 模型设置为 "ollama/<model-name>"
|
||||
- 基础 URL 设置为 `http://host.docker.internal:11434`
|
||||
- API 密钥是可选的,你可以使用任何字符串,例如 `ollama`。
|
||||
|
||||
|
||||
## 在开发模式下运行 OpenHands
|
||||
|
||||
### 从源代码构建
|
||||
|
||||
使用 [Development.md](https://github.com/All-Hands-AI/OpenHands/blob/main/Development.md) 中的说明来构建 OpenHands。
|
||||
通过运行 `make setup-config` 确保 `config.toml` 存在,它将为你创建一个。在 `config.toml` 中,输入以下内容:
|
||||
|
||||
```
|
||||
[core]
|
||||
workspace_base="./workspace"
|
||||
|
||||
[llm]
|
||||
embedding_model="local"
|
||||
ollama_base_url="http://localhost:11434"
|
||||
|
||||
```
|
||||
|
||||
完成!现在你可以通过 `make run` 启动 OpenHands。你现在应该可以连接到 `http://localhost:3000/` 了。
|
||||
|
||||
### 配置 Web 应用程序
|
||||
|
||||
在 OpenHands UI 中,点击左下角的设置齿轮。
|
||||
然后在 `Model` 输入框中,输入 `ollama/codellama:7b`,或者你之前拉取的模型名称。
|
||||
如果它没有出现在下拉菜单中,启用 `Advanced Settings` 并输入。请注意:你需要 `ollama list` 列出的模型名称,带有 `ollama/` 前缀。
|
||||
|
||||
在 API Key 字段中,输入 `ollama` 或任何值,因为你不需要特定的密钥。
|
||||
|
||||
在 Base URL 字段中,输入 `http://localhost:11434`。
|
||||
|
||||
现在你已经准备好了!
|
||||
|
||||
## 配置 ollama 服务(WSL){#configuring-ollama-service-wsl-zh}
|
||||
|
||||
WSL 中 ollama 的默认配置只服务于 localhost。这意味着你无法从 docker 容器中访问它。例如,它不能与 OpenHands 一起工作。首先让我们测试 ollama 是否正确运行。
|
||||
|
||||
```bash
|
||||
ollama list # 获取已安装模型的列表
|
||||
curl http://localhost:11434/api/generate -d '{"model":"[NAME]","prompt":"hi"}'
|
||||
#例如 curl http://localhost:11434/api/generate -d '{"model":"codellama:7b","prompt":"hi"}'
|
||||
#例如 curl http://localhost:11434/api/generate -d '{"model":"codellama","prompt":"hi"}' #如果只有一个,标签是可选的
|
||||
```
|
||||
|
||||
完成后,测试它是否允许"外部"请求,例如来自 docker 容器内部的请求。
|
||||
|
||||
```bash
|
||||
docker ps # 获取正在运行的 docker 容器列表,为了最准确的测试,选择 OpenHands 沙箱容器。
|
||||
docker exec [CONTAINER ID] curl http://host.docker.internal:11434/api/generate -d '{"model":"[NAME]","prompt":"hi"}'
|
||||
#例如 docker exec cd9cc82f7a11 curl http://host.docker.internal:11434/api/generate -d '{"model":"codellama","prompt":"hi"}'
|
||||
```
|
||||
|
||||
## 修复它
|
||||
|
||||
现在让我们让它工作。使用 sudo 权限编辑 /etc/systemd/system/ollama.service。(路径可能因 Linux 发行版而异)
|
||||
|
||||
```bash
|
||||
sudo vi /etc/systemd/system/ollama.service
|
||||
```
|
||||
|
||||
或
|
||||
|
||||
```bash
|
||||
sudo nano /etc/systemd/system/ollama.service
|
||||
```
|
||||
|
||||
在 [Service] 括号中添加这些行
|
||||
|
||||
```
|
||||
Environment="OLLAMA_HOST=0.0.0.0:11434"
|
||||
Environment="OLLAMA_ORIGINS=*"
|
||||
```
|
||||
|
||||
然后保存,重新加载配置并重启服务。
|
||||
|
||||
```bash
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl restart ollama
|
||||
```
|
||||
|
||||
最后测试 ollama 是否可以从容器内访问
|
||||
|
||||
```bash
|
||||
ollama list # 获取已安装模型的列表
|
||||
docker ps # 获取正在运行的 docker 容器列表,为了最准确的测试,选择 OpenHands 沙箱容器。
|
||||
docker exec [CONTAINER ID] curl http://host.docker.internal:11434/api/generate -d '{"model":"[NAME]","prompt":"hi"}'
|
||||
```
|
||||
|
||||
|
||||
# 使用 LM Studio 的本地 LLM
|
||||
|
||||
设置 LM Studio 的步骤:
|
||||
1. 打开 LM Studio
|
||||
2. 转到 Local Server 选项卡。
|
||||
3. 点击 "Start Server" 按钮。
|
||||
4. 从下拉菜单中选择要使用的模型。
|
||||
|
||||
|
||||
设置以下配置:
|
||||
```bash
|
||||
LLM_MODEL="openai/lmstudio"
|
||||
LLM_BASE_URL="http://localhost:1234/v1"
|
||||
CUSTOM_LLM_PROVIDER="openai"
|
||||
```
|
||||
|
||||
### Docker
|
||||
|
||||
```bash
|
||||
docker run \
|
||||
-it \
|
||||
--pull=always \
|
||||
-e SANDBOX_USER_ID=$(id -u) \
|
||||
-e LLM_MODEL="openai/lmstudio" \
|
||||
-e LLM_BASE_URL="http://host.docker.internal:1234/v1" \
|
||||
-e CUSTOM_LLM_PROVIDER="openai" \
|
||||
-e WORKSPACE_MOUNT_PATH=$WORKSPACE_BASE \
|
||||
-v $WORKSPACE_BASE:/opt/workspace_base \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||
-p 3000:3000 \
|
||||
ghcr.io/all-hands-ai/openhands:main
|
||||
```
|
||||
|
||||
现在你应该可以连接到 `http://localhost:3000/` 了。
|
||||
|
||||
在开发环境中,你可以在 `config.toml` 文件中设置以下配置:
|
||||
|
||||
```
|
||||
[core]
|
||||
workspace_base="./workspace"
|
||||
|
||||
[llm]
|
||||
model="openai/lmstudio"
|
||||
base_url="http://localhost:1234/v1"
|
||||
custom_llm_provider="openai"
|
||||
```
|
||||
|
||||
完成!现在你可以通过 `make run` 启动 OpenHands,无需 Docker。你现在应该可以连接到 `http://localhost:3000/` 了。
|
||||
|
||||
# 注意
|
||||
|
||||
对于 WSL,在 cmd 中运行以下命令以将网络模式设置为镜像:
|
||||
|
||||
```
|
||||
python -c "print('[wsl2]\nnetworkingMode=mirrored',file=open(r'%UserProfile%\.wslconfig','w'))"
|
||||
wsl --shutdown
|
||||
```
|
||||
@@ -0,0 +1,24 @@
|
||||
# OpenAI
|
||||
|
||||
OpenHands 使用 LiteLLM 调用 OpenAI 的聊天模型。你可以在[这里](https://docs.litellm.ai/docs/providers/openai)找到他们关于使用 OpenAI 作为提供商的文档。
|
||||
|
||||
## 配置
|
||||
|
||||
运行 OpenHands 时,你需要在设置中设置以下内容:
|
||||
* `LLM Provider` 设置为 `OpenAI`
|
||||
* `LLM Model` 设置为你将使用的模型。
|
||||
[访问此处查看 LiteLLM 支持的 OpenAI 模型的完整列表。](https://docs.litellm.ai/docs/providers/openai#openai-chat-completion-models)
|
||||
如果模型不在列表中,请切换 `Advanced Options`,并在 `Custom Model` 中输入它(例如 openai/<model-name> 如 `openai/gpt-4o`)。
|
||||
* `API Key` 设置为你的 OpenAI API 密钥。要查找或创建你的 OpenAI 项目 API 密钥,[请参阅此处](https://platform.openai.com/api-keys)。
|
||||
|
||||
## 使用 OpenAI 兼容端点
|
||||
|
||||
就像 OpenAI 聊天补全一样,我们使用 LiteLLM 进行 OpenAI 兼容端点。你可以在[这里](https://docs.litellm.ai/docs/providers/openai_compatible)找到他们关于此主题的完整文档。
|
||||
|
||||
## 使用 OpenAI 代理
|
||||
|
||||
如果你使用 OpenAI 代理,你需要在设置中设置以下内容:
|
||||
* 启用 `Advanced Options`
|
||||
* `Custom Model` 设置为 openai/<model-name>(例如 `openai/gpt-4o` 或 openai/<proxy-prefix>/<model-name>)
|
||||
* `Base URL` 设置为你的 OpenAI 代理的 URL
|
||||
* `API Key` 设置为你的 OpenAI API 密钥
|
||||
@@ -0,0 +1,14 @@
|
||||
以下是翻译后的内容:
|
||||
|
||||
# OpenRouter
|
||||
|
||||
OpenHands 使用 LiteLLM 调用 OpenRouter 上的聊天模型。你可以在[这里](https://docs.litellm.ai/docs/providers/openrouter)找到他们关于使用 OpenRouter 作为提供者的文档。
|
||||
|
||||
## 配置
|
||||
|
||||
运行 OpenHands 时,你需要在设置中设置以下内容:
|
||||
* `LLM Provider` 设置为 `OpenRouter`
|
||||
* `LLM Model` 设置为你将使用的模型。
|
||||
[访问此处查看 OpenRouter 模型的完整列表](https://openrouter.ai/models)。
|
||||
如果模型不在列表中,请切换 `Advanced Options`,并在 `Custom Model` 中输入(例如 openrouter/<model-name> 如 `openrouter/anthropic/claude-3.5-sonnet`)。
|
||||
* `API Key` 设置为你的 OpenRouter API 密钥。
|
||||
@@ -0,0 +1,43 @@
|
||||
以下是翻译后的内容:
|
||||
|
||||
# 提示最佳实践
|
||||
|
||||
在使用 OpenHands AI 软件开发者时,提供清晰有效的提示至关重要。本指南概述了创建提示的最佳实践,以产生最准确和最有用的响应。
|
||||
|
||||
## 好的提示的特点
|
||||
|
||||
好的提示是:
|
||||
|
||||
1. **具体的**: 它们准确解释应该添加什么功能或需要修复什么错误。
|
||||
2. **位置特定的**: 如果已知,它们解释了应该修改代码库中的哪些位置。
|
||||
3. **适当范围的**: 它们应该是单个功能的大小,通常不超过100行代码。
|
||||
|
||||
## 示例
|
||||
|
||||
### 好的提示示例
|
||||
|
||||
1. "在 `utils/math_operations.py` 中添加一个函数 `calculate_average`,它接受一个数字列表作为输入并返回它们的平均值。"
|
||||
|
||||
2. "修复 `frontend/src/components/UserProfile.tsx` 中第42行发生的 TypeError。错误表明我们试图访问 undefined 的属性。"
|
||||
|
||||
3. "为注册表单中的电子邮件字段实现输入验证。更新 `frontend/src/components/RegistrationForm.tsx` 以在提交之前检查电子邮件是否为有效格式。"
|
||||
|
||||
### 不好的提示示例
|
||||
|
||||
1. "让代码更好。"(太模糊,不具体)
|
||||
|
||||
2. "重写整个后端以使用不同的框架。"(范围不合适)
|
||||
|
||||
3. "用户身份验证中有一个错误。你能找到并修复它吗?"(缺乏具体性和位置信息)
|
||||
|
||||
## 有效提示的技巧
|
||||
|
||||
1. 尽可能具体地说明期望的结果或要解决的问题。
|
||||
2. 提供上下文,包括相关的文件路径和行号(如果可用)。
|
||||
3. 将大型任务分解为更小、更易管理的提示。
|
||||
4. 包括任何相关的错误消息或日志。
|
||||
5. 如果从上下文中不明显,请指定编程语言或框架。
|
||||
|
||||
请记住,您的提示越精确和信息量大,AI 就越能帮助您开发或修改 OpenHands 软件。
|
||||
|
||||
有关更多有用提示的示例,请参阅 [OpenHands 入门](./getting-started)。
|
||||
@@ -1,97 +1,51 @@
|
||||
---
|
||||
sidebar_position: 5
|
||||
---
|
||||
以下是翻译后的内容:
|
||||
|
||||
# 🚧 故障排除
|
||||
|
||||
以下是用户经常报告的一些错误信息。
|
||||
|
||||
我们将努力使安装过程更加简单,并改善这些错误信息。不过,现在您可以在下面找到您的错误信息,并查看是否有任何解决方法。
|
||||
|
||||
对于这些错误信息,**都已经有相关的报告**。请不要打开新的报告——只需在现有的报告中发表评论即可。
|
||||
|
||||
如果您发现更多信息或者一个解决方法,请提交一个 *PR* 来添加细节到这个文件中。
|
||||
有一些错误信息经常被用户报告。我们会尽量让安装过程更简单,但目前您可以在下面查找您的错误信息,看看是否有任何解决方法。如果您找到了更多关于这些问题的信息或解决方法,请提交一个 *PR* 来添加详细信息到这个文件。
|
||||
|
||||
:::tip
|
||||
如果您在 Windows 上运行并遇到问题,请查看我们的[Windows (WSL) 用户指南](troubleshooting/windows)。
|
||||
OpenHands 仅通过 [WSL](https://learn.microsoft.com/en-us/windows/wsl/install) 支持 Windows。
|
||||
请确保在您的 WSL 终端内运行所有命令。
|
||||
查看 [Windows 用户的 WSL 注意事项](troubleshooting/windows) 以获取一些故障排除指南。
|
||||
:::
|
||||
|
||||
## 无法连接到 Docker
|
||||
## 常见问题
|
||||
|
||||
[GitHub 问题](https://github.com/All-Hands-AI/OpenHands/issues/1226)
|
||||
* [无法连接到 Docker](#unable-to-connect-to-docker)
|
||||
* [404 资源未找到](#404-resource-not-found)
|
||||
* [`make build` 在安装包时卡住](#make-build-getting-stuck-on-package-installations)
|
||||
* [会话没有恢复](#sessions-are-not-restored)
|
||||
|
||||
### 症状
|
||||
### 无法连接到 Docker
|
||||
|
||||
[GitHub Issue](https://github.com/All-Hands-AI/OpenHands/issues/1226)
|
||||
|
||||
**症状**
|
||||
|
||||
```bash
|
||||
创建控制器时出错。请检查 Docker 是否正在运行,并访问 `https://docs.all-hands.dev/modules/usage/troubleshooting` 获取更多调试信息。
|
||||
Error creating controller. Please check Docker is running and visit `https://docs.all-hands.dev/modules/usage/troubleshooting` for more debugging information.
|
||||
```
|
||||
|
||||
```bash
|
||||
docker.errors.DockerException: 获取服务器 API 版本时出错: ('连接中止。', FileNotFoundError(2, '没有这样的文件或目录'))
|
||||
docker.errors.DockerException: Error while fetching server API version: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))
|
||||
```
|
||||
|
||||
### 详情
|
||||
**详情**
|
||||
|
||||
OpenHands 使用 Docker 容器来安全地完成工作,而不会破坏您的机器。
|
||||
OpenHands 使用 Docker 容器来安全地工作,而不会潜在地破坏您的机器。
|
||||
|
||||
### 解决方法
|
||||
**解决方法**
|
||||
|
||||
* 运行 `docker ps` 以确保 Docker 正在运行
|
||||
* 确保您不需要使用 `sudo` 运行 Docker [请参见此处](https://www.baeldung.com/linux/docker-run-without-sudo)
|
||||
* 如果您使用的是 Mac,请检查[权限要求](https://docs.docker.com/desktop/mac/permission-requirements/) ,特别是考虑在 Docker Desktop 的 `Settings > Advanced` 下启用 `Allow the default Docker socket to be used`。
|
||||
* 另外,升级您的 Docker 到最新版本,选择 `Check for Updates`
|
||||
* 运行 `docker ps` 以确保 docker 正在运行
|
||||
* 确保您不需要 `sudo` 来运行 docker [参见此处](https://www.baeldung.com/linux/docker-run-without-sudo)
|
||||
* 如果您在 Mac 上,请检查 [权限要求](https://docs.docker.com/desktop/mac/permission-requirements/),特别是考虑在 Docker Desktop 的 `Settings > Advanced` 下启用 `Allow the default Docker socket to be used`。
|
||||
* 此外,在 `Check for Updates` 下将您的 Docker 升级到最新版本
|
||||
|
||||
## 无法连接到 DockerSSHBox
|
||||
---
|
||||
### `404 资源未找到`
|
||||
|
||||
[GitHub 问题](https://github.com/All-Hands-AI/OpenHands/issues/1156)
|
||||
|
||||
### 症状
|
||||
|
||||
```python
|
||||
self.shell = DockerSSHBox(
|
||||
...
|
||||
pexpect.pxssh.ExceptionPxssh: Could not establish connection to host
|
||||
```
|
||||
|
||||
### 详情
|
||||
|
||||
默认情况下,OpenHands 使用 SSH 连接到一个运行中的容器。在某些机器上,尤其是 Windows,这似乎会失败。
|
||||
|
||||
### 解决方法
|
||||
|
||||
* 重新启动您的计算机(有时会有用)
|
||||
* 确保拥有最新版本的 WSL 和 Docker
|
||||
* 检查您的 WSL 分发版也已更新
|
||||
* 尝试[此重新安装指南](https://github.com/All-Hands-AI/OpenHands/issues/1156#issuecomment-2064549427)
|
||||
|
||||
## 无法连接到 LLM
|
||||
|
||||
[GitHub 问题](https://github.com/All-Hands-AI/OpenHands/issues/1208)
|
||||
|
||||
### 症状
|
||||
|
||||
```python
|
||||
File "/app/.venv/lib/python3.12/site-packages/openai/_exceptions.py", line 81, in __init__
|
||||
super().__init__(message, response.request, body=body)
|
||||
^^^^^^^^^^^^^^^^
|
||||
AttributeError: 'NoneType' object has no attribute 'request'
|
||||
```
|
||||
|
||||
### 详情
|
||||
|
||||
[GitHub 问题](https://github.com/All-Hands-AI/OpenHands/issues?q=is%3Aissue+is%3Aopen+404)
|
||||
|
||||
这通常发生在本地 LLM 设置中,当 OpenHands 无法连接到 LLM 服务器时。请参阅我们的 [本地 LLM 指南](llms/local-llms) 以获取更多信息。
|
||||
|
||||
### 解决方法
|
||||
|
||||
* 检查您的 `config.toml` 文件中 "llm" 部分的 `base_url` 是否正确(如果存在)
|
||||
* 检查 Ollama(或您使用的其他 LLM)是否正常运行
|
||||
* 确保在 Docker 中运行时使用 `--add-host host.docker.internal:host-gateway`
|
||||
|
||||
## `404 Resource not found 资源未找到`
|
||||
|
||||
### 症状
|
||||
**症状**
|
||||
|
||||
```python
|
||||
Traceback (most recent call last):
|
||||
@@ -117,29 +71,29 @@ Traceback (most recent call last):
|
||||
openai.NotFoundError: Error code: 404 - {'error': {'code': '404', 'message': 'Resource not found'}}
|
||||
```
|
||||
|
||||
### 详情
|
||||
**详情**
|
||||
|
||||
当 LiteLLM(我们用于连接不同 LLM 提供商的库)找不到您要连接的 API 端点时,会发生这种情况。最常见的情况是 Azure 或 Ollama 用户。
|
||||
当 LiteLLM(我们用于连接不同 LLM 提供商的库)找不到您尝试连接的 API 端点时,就会发生这种情况。这种情况最常发生在 Azure 或 ollama 用户身上。
|
||||
|
||||
### 解决方法
|
||||
**解决方法**
|
||||
|
||||
* 检查您是否正确设置了 `LLM_BASE_URL`
|
||||
* 检查模型是否正确设置,基于 [LiteLLM 文档](https://docs.litellm.ai/docs/providers)
|
||||
* 如果您在 UI 中运行,请确保在设置模式中设置 `model`
|
||||
* 如果您通过 main.py 运行,请确保在环境变量/配置中设置 `LLM_MODEL`
|
||||
* 确保遵循了您的 LLM 提供商的任何特殊说明
|
||||
* [Ollama](/zh-Hans/modules/usage/llms/local-llms)
|
||||
* [Azure](/zh-Hans/modules/usage/llms/azure-llms)
|
||||
* [Google](/zh-Hans/modules/usage/llms/google-llms)
|
||||
* 确保您的 API 密钥正确无误
|
||||
* 尝试使用 `curl` 连接到 LLM
|
||||
* 尝试[直接通过 LiteLLM 连接](https://github.com/BerriAI/litellm)来测试您的设置
|
||||
* 根据 [LiteLLM 文档](https://docs.litellm.ai/docs/providers) 检查模型是否设置正确
|
||||
* 如果您在 UI 内运行,请确保在设置模态框中设置 `model`
|
||||
* 如果您在无头模式下运行(通过 main.py),请确保在您的 env/config 中设置 `LLM_MODEL`
|
||||
* 确保您已遵循 LLM 提供商的任何特殊说明
|
||||
* [Azure](/modules/usage/llms/azure-llms)
|
||||
* [Google](/modules/usage/llms/google-llms)
|
||||
* 确保您的 API 密钥正确
|
||||
* 看看您是否可以使用 `curl` 连接到 LLM
|
||||
* 尝试 [直接通过 LiteLLM 连接](https://github.com/BerriAI/litellm) 以测试您的设置
|
||||
|
||||
## `make build` 在安装包时卡住
|
||||
---
|
||||
### `make build` 在安装包时卡住
|
||||
|
||||
### 症状
|
||||
**症状**
|
||||
|
||||
安装包时卡在 `Pending...`,没有任何错误信息:
|
||||
包安装在 `Pending...` 处卡住,没有任何错误信息:
|
||||
|
||||
```bash
|
||||
Package operations: 286 installs, 0 updates, 0 removals
|
||||
@@ -151,42 +105,44 @@ Package operations: 286 installs, 0 updates, 0 removals
|
||||
- Installing typing-extensions (4.11.0): Pending...
|
||||
```
|
||||
|
||||
### 详情
|
||||
**详情**
|
||||
|
||||
在极少数情况下,`make build` 在安装包时似乎会卡住,没有任何错误信息。
|
||||
在极少数情况下,`make build` 可能会在安装包时看似卡住,没有任何错误信息。
|
||||
|
||||
### 解决方法
|
||||
**解决方法**
|
||||
|
||||
* 包管理器 Poetry 可能会错过用于查找凭据的配置设置(keyring)。
|
||||
包安装程序 Poetry 可能缺少一个配置设置,用于查找凭据的位置(keyring)。
|
||||
|
||||
### 解决方法
|
||||
|
||||
首先使用 `env` 检查是否存在 `PYTHON_KEYRING_BACKEND` 的值。如果不存在,运行以下命令将其设置为已知值,然后重试构建:
|
||||
首先用 `env` 检查是否存在 `PYTHON_KEYRING_BACKEND` 的值。
|
||||
如果没有,运行下面的命令将其设置为一个已知值,然后重试构建:
|
||||
|
||||
```bash
|
||||
export PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring
|
||||
```
|
||||
|
||||
## 会话未恢复
|
||||
---
|
||||
### 会话没有恢复
|
||||
|
||||
### 症状
|
||||
**症状**
|
||||
|
||||
通常情况下,当打开 UI 时,OpenHands 会询问是否要恢复或开始新会话。但点击“恢复”仍然会开始一个全新的聊天。
|
||||
OpenHands 通常在打开 UI 时询问是恢复还是开始新会话。
|
||||
但是点击"恢复"仍然会开始一个全新的聊天。
|
||||
|
||||
### 详情
|
||||
**详情**
|
||||
|
||||
按今天的标准安装,会话数据存储在内存中。目前,如果 OpenHands 的服务重启,以前的会话将失效(生成一个新秘密),因此无法恢复。
|
||||
截至目前,使用标准安装,会话数据存储在内存中。
|
||||
目前,如果 OpenHands 的服务重新启动,之前的会话会变得无效(生成一个新的密钥),因此无法恢复。
|
||||
|
||||
### 解决方法
|
||||
**解决方法**
|
||||
|
||||
* 通过编辑 OpenHands 根文件夹中的 `config.toml` 文件,更改配置以使会话持久化,指定一个 `file_store` 和一个绝对路径的 `file_store_path`:
|
||||
* 通过编辑 `config.toml` 文件(在 OpenHands 的根文件夹中)来更改配置,使会话持久化,指定一个 `file_store` 和一个绝对的 `file_store_path`:
|
||||
|
||||
```toml
|
||||
file_store="local"
|
||||
file_store_path="/absolute/path/to/openhands/cache/directory"
|
||||
```
|
||||
|
||||
* 在您的 .bashrc 中添加一个固定的 JWT 秘密,如下所示,以便以前的会话 ID 可以被接受。
|
||||
* 在您的 .bashrc 中添加一个固定的 jwt 密钥,如下所示,这样之前的会话 id 应该可以保持被接受。
|
||||
|
||||
```bash
|
||||
EXPORT JWT_SECRET=A_CONST_VALUE
|
||||
|
||||
@@ -1,68 +1,58 @@
|
||||
# Windows 和 WSL 用户须知
|
||||
以下是翻译后的内容:
|
||||
|
||||
OpenHands 仅支持通过 [WSL](https://learn.microsoft.com/en-us/windows/wsl/install) 在 Windows 上运行。
|
||||
请确保在 WSL 终端内运行所有命令。
|
||||
# 针对 Windows 上 WSL 用户的注意事项
|
||||
|
||||
OpenHands 仅通过 [WSL](https://learn.microsoft.com/en-us/windows/wsl/install) 支持 Windows。
|
||||
请确保在您的 WSL 终端内运行所有命令。
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 错误:在此 WSL 2 发行版中找不到 'docker'。
|
||||
### 建议: 不要以 root 用户身份运行
|
||||
|
||||
如果您使用的是 Docker Desktop,请确保在 WSL 内部调用任何 docker 命令之前启动它。
|
||||
Docker 还需要启用 WSL 集成选项。
|
||||
出于安全原因,强烈建议不要以 root 用户身份运行 OpenHands,而是以具有非零 UID 的用户身份运行。
|
||||
|
||||
### 建议:不要以 root 用户身份运行
|
||||
参考:
|
||||
|
||||
出于安全原因,非常建议不要以 root 用户身份运行 OpenHands,而是使用 UID 非零的用户身份运行。
|
||||
此外,当以 root 身份运行时,不支持持久化沙箱,并且在启动 OpenHands 时可能会出现相应消息。
|
||||
|
||||
参考资料:
|
||||
|
||||
* [为什么以 root 登录是不好的](https://askubuntu.com/questions/16178/why-is-it-bad-to-log-in-as-root)
|
||||
* [为什么以 root 身份登录不好](https://askubuntu.com/questions/16178/why-is-it-bad-to-log-in-as-root)
|
||||
* [在 WSL 中设置默认用户](https://www.tenforums.com/tutorials/128152-set-default-user-windows-subsystem-linux-distro-windows-10-a.html#option2)
|
||||
关于第二个参考资料的小提示:对于 Ubuntu 用户,该命令实际上可能是 "ubuntupreview" 而不是 "ubuntu"。
|
||||
关于第二个参考的提示:对于 Ubuntu 用户,命令实际上可能是 "ubuntupreview" 而不是 "ubuntu"。
|
||||
|
||||
### 创建 openhands 用户失败
|
||||
---
|
||||
### 错误: 在此 WSL 2 发行版中找不到 'docker'。
|
||||
|
||||
如果您在设置过程中遇到以下错误:
|
||||
|
||||
```sh
|
||||
Exception: Failed to create openhands user in sandbox: 'useradd: UID 0 is not unique'
|
||||
```
|
||||
|
||||
您可以通过运行以下命令解决:
|
||||
|
||||
```sh
|
||||
export SANDBOX_USER_ID=1000
|
||||
```
|
||||
如果您正在使用 Docker Desktop,请确保在从 WSL 内部调用任何 docker 命令之前启动它。
|
||||
Docker 还需要激活 WSL 集成选项。
|
||||
|
||||
---
|
||||
### Poetry 安装
|
||||
|
||||
* 如果在构建过程中安装 Poetry 后仍然面临运行 Poetry 的问题,您可能需要将其二进制路径添加到您的环境变量:
|
||||
* 如果您在构建过程中安装 Poetry 后仍然面临运行 Poetry 的问题,您可能需要将其二进制路径添加到环境中:
|
||||
|
||||
```sh
|
||||
export PATH="$HOME/.local/bin:$PATH"
|
||||
```
|
||||
|
||||
* 如果 make build 停止并出现如下错误:
|
||||
* 如果 make build 在如下错误上停止:
|
||||
|
||||
```sh
|
||||
ModuleNotFoundError: no module named <module-name>
|
||||
```
|
||||
|
||||
这可能是 Poetry 缓存的问题。
|
||||
尝试运行以下两个命令:
|
||||
尝试依次运行这两个命令:
|
||||
|
||||
```sh
|
||||
rm -r ~/.cache/pypoetry
|
||||
make build
|
||||
```
|
||||
|
||||
---
|
||||
### NoneType 对象没有属性 'request'
|
||||
|
||||
如果您在执行 `make run` 时遇到与网络相关的问题,例如 `NoneType object has no attribute 'request'`,您可能需要配置您的 WSL2 网络设置。请按照以下步骤操作:
|
||||
如果您在执行 `make run` 时遇到与网络相关的问题,例如 `NoneType 对象没有属性 'request'`,您可能需要配置 WSL2 网络设置。请按照以下步骤操作:
|
||||
|
||||
* 打开或创建位于 Windows 主机机器上的 `C:\Users\%username%\.wslconfig` 文件。
|
||||
* 向 `.wslconfig` 文件添加以下配置:
|
||||
* 在 Windows 主机上打开或创建位于 `C:\Users\%username%\.wslconfig` 的 `.wslconfig` 文件。
|
||||
* 将以下配置添加到 `.wslconfig` 文件中:
|
||||
|
||||
```sh
|
||||
[wsl2]
|
||||
@@ -71,6 +61,6 @@ localhostForwarding=true
|
||||
```
|
||||
|
||||
* 保存 `.wslconfig` 文件。
|
||||
* 通过退出所有正在运行的 WSL2 实例并在命令提示符或终端中执行 `wsl --shutdown` 命令,完全重启 WSL2。
|
||||
* 重新启动 WSL 后,尝试再次执行 `make run`。
|
||||
网络问题应该已经解决。
|
||||
* 通过退出任何正在运行的 WSL2 实例并在命令提示符或终端中执行 `wsl --shutdown` 命令来完全重启 WSL2。
|
||||
* 重新启动 WSL 后,再次尝试执行 `make run`。
|
||||
网络问题应该得到解决。
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
以下是翻译后的内容:
|
||||
|
||||
# ⬆️ 升级指南
|
||||
|
||||
## 0.8.0 (2024-07-13)
|
||||
|
||||
### 配置中的重大变更
|
||||
|
||||
在此版本中,我们对后端配置引入了一些重大变更。如果你只通过前端(Web GUI)使用OpenHands,则无需处理任何事情。
|
||||
|
||||
以下是配置中重大变更的列表。它们仅适用于通过 `main.py` 使用 OpenHands CLI 的用户。更多详情,请参阅 [#2756](https://github.com/All-Hands-AI/OpenHands/pull/2756)。
|
||||
|
||||
#### 从 main.py 中移除 --model-name 选项
|
||||
|
||||
请注意,`--model-name` 或 `-m` 选项已不再存在。你应该在 `config.toml` 中设置 LLM 配置,或通过环境变量进行设置。
|
||||
|
||||
#### LLM 配置组必须是 'llm' 的子组
|
||||
|
||||
在 0.8 版本之前,你可以在 `config.toml` 中为 LLM 配置使用任意名称,例如:
|
||||
|
||||
```toml
|
||||
[gpt-4o]
|
||||
model="gpt-4o"
|
||||
api_key="<your_api_key>"
|
||||
```
|
||||
|
||||
然后使用 `--llm-config` CLI 参数按名称指定所需的 LLM 配置组。这已不再有效。相反,配置组必须位于 `llm` 组下,例如:
|
||||
|
||||
```toml
|
||||
[llm.gpt-4o]
|
||||
model="gpt-4o"
|
||||
api_key="<your_api_key>"
|
||||
```
|
||||
|
||||
如果你有一个名为 `llm` 的配置组,则无需更改它,它将被用作默认的 LLM 配置组。
|
||||
|
||||
#### 'agent' 组不再包含 'name' 字段
|
||||
|
||||
在 0.8 版本之前,你可能有或没有一个名为 `agent` 的配置组,如下所示:
|
||||
|
||||
```toml
|
||||
[agent]
|
||||
name="CodeActAgent"
|
||||
memory_max_threads=2
|
||||
```
|
||||
|
||||
请注意,`name` 字段现已被移除。相反,你应该在 `core` 组下放置 `default_agent` 字段,例如:
|
||||
|
||||
```toml
|
||||
[core]
|
||||
# 其他配置
|
||||
default_agent='CodeActAgent'
|
||||
|
||||
[agent]
|
||||
llm_config='llm'
|
||||
memory_max_threads=2
|
||||
|
||||
[agent.CodeActAgent]
|
||||
llm_config='gpt-4o'
|
||||
```
|
||||
|
||||
请注意,与 `llm` 子组类似,你也可以定义 `agent` 子组。此外,代理可以与特定的 LLM 配置组相关联。更多详情,请参阅 `config.template.toml` 中的示例。
|
||||
Reference in New Issue
Block a user