Browse Source

合并到 0.18.0

mrh 11 months ago
parent
commit
b2387426b6
9 changed files with 160 additions and 58 deletions
  1. 4 5
      .env
  2. 1 1
      .gitmodules
  3. 3 2
      Dockerfile
  4. 1 1
      OpenHands
  5. 99 3
      dev.md
  6. 7 15
      docker-compose.yaml
  7. 18 8
      readme.md
  8. 1 1
      users/u1/.env
  9. 26 22
      代码架构.md

+ 4 - 5
.env

@@ -6,11 +6,10 @@ OPENAI_API_KEY="sk-NscqaCD1PfVm7soEF3C3E6297bE14d7fB595Be8f17F39aFf"
 OPENAI_API_BASE="https://aiapi.magong.site/v1"
 DEBUG=true
 LOG_ALL_EVENTS=true
-SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.17-nikolaik
+SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.18-nikolaik
 # SANDBOX_RUNTIME_CONTAINER_IMAGE=all-hands-code-server:0.16-nikolaik
-SANDBOX_USER_ID=1000
-WORKSPACE_MOUNT_PATH=/home/mrh/program/openhands/testm/excel_tool
-# WORKSPACE_MOUNT_PATH=/home/mrh/program/openhands/OpenHands
-VSCODE_HOST=sv-v2
+# WORKSPACE_MOUNT_PATH=/home/mrh/program/openhands/testm/excel_tool
+WORKSPACE_MOUNT_PATH=/home/mrh/program/openhands/OpenHands
+VSCODE_HOST=sv-v2.magong.site
 # VSCODE_PORT=9806
 # FILE_STORE_PATH=/home/mrh/program/openhands/cache/file_store

+ 1 - 1
.gitmodules

@@ -1,3 +1,3 @@
 [submodule "OpenHands"]
 	path = OpenHands
-	url = ssh://git@gogs.sv-v.magong.site:10022/ai/OpenHands.git
+	url = ssh://git@gogs.magong.site:10022/ai/OpenHands.git

+ 3 - 2
Dockerfile

@@ -1,5 +1,5 @@
 # 使用现有的镜像作为基础镜像
-FROM docker.all-hands.dev/all-hands-ai/runtime:0.16-nikolaik
+FROM docker.all-hands.dev/all-hands-ai/runtime:0.17-nikolaik
 
 # 设置代理服务器
 ENV http_proxy=http://192.168.2.11:1881
@@ -8,7 +8,8 @@ ENV no_proxy=localhost,127.0.0.1
 
 # 安装 code-server
 RUN curl -fsSL https://code-server.dev/install.sh | sh
-COPY ./src/code-server-plugins.py /openhands/code/openhands/runtime/plugins/vscode/__init__.py
+COPY OpenHands/openhands/runtime/plugins/vscode/__init__.py /openhands/code/openhands/runtime/plugins/vscode/__init__.py
+COPY OpenHands/openhands/runtime/impl/eventstream/eventstream_runtime.py /openhands/code/openhands/runtime/impl/eventstream/eventstream_runtime.py
 # 清除代理设置(可选)
 ENV http_proxy=
 ENV https_proxy=

+ 1 - 1
OpenHands

@@ -1 +1 @@
-Subproject commit 642e962f89c4450d840369161860160750e9227b
+Subproject commit d3f569f815a6925a5ed6cde3a27a329958faa929

+ 99 - 3
dev.md

@@ -1,35 +1,131 @@
+# 代码开发
+```shell
+version: '3.8'
+
+services:
+  openhands-app:
+    image: docker.all-hands.dev/all-hands-ai/openhands:0.17
+    container_name: openhands-app-u1
+    volumes:
+      - /etc/localtime:/etc/localtime:ro
+      - ./config.toml:/app/config.toml
+      - .env:/app/.env
+      - ${WORKSPACE_MOUNT_PATH}:${WORKSPACE_MOUNT_PATH}
+      - /var/run/docker.sock:/var/run/docker.sock
+      - ./app/logs:/app/logs
+      - /home/mrh/program/openhands/OpenHands/openhands:/app/openhands
+      # - /home/mrh/program/openhands/OpenHands/openhands/runtime/impl/eventstream/eventstream_runtime.py:/app/openhands/runtime/impl/eventstream/eventstream_runtime.py
+      # - /home/mrh/program/openhands/OpenHands/openhands/server/listen_socket.py:/app/openhands/server/listen_socket.py
+      -  /home/mrh/program/busybox-x86_64:/usr/local/bin/busybox
+    extra_hosts:
+      # 记得关闭防火墙,或者 sudo ufw allow from  172.0.0.0/8
+      - "host.docker.internal:host-gateway"
+    # network_mode: "bridge"
+    ports:
+      - "3001:3000"
+    # command: python
+    stdin_open: true
+    tty: true
+
+```
+
+# git 仓库分支
+
+## 合并官方仓库
+```shell
+cd OpenHands
+git pull
+git push gogs --tags
+git push gogs --all
+git reset --hard tags/0.17.0
+git branch
+# 切换到我的分支
+git checkout my-change
+# 拉取最新代码
+# 合入官方版本到我的分支
+git merge 0.18.0
+```
+
+## 提交主仓库和子仓库
+
+
+
 # Runtime
 
 ## 命令行
 ```shell
 # 创建环境
 /openhands/micromamba/bin/micromamba create --prefix ./myenv python=3.12
+
+# 激活环境前需要先初始化
+/openhands/micromamba/bin/micromamba activate ./myenv
+
+'micromamba' is running as a subprocess and can't modify the parent shell.
+Thus you must initialize your shell before using activate and deactivate.
+
+To initialize the current bash shell, run:
+    $ eval "$(micromamba shell hook --shell bash)"
+and then activate or deactivate with:
+    $ micromamba activate
+To automatically initialize all future (bash) shells, run:
+    $ micromamba shell init --shell bash --root-prefix=~/.local/share/mamba
+If your shell was already initialized, reinitialize your shell with:
+    $ micromamba shell reinit --shell bash
+Otherwise, this may be an issue. In the meantime you can run commands. See:
+    $ micromamba run --help
+
+Supported shells are {bash, zsh, csh, posix, xonsh, cmd.exe, powershell, fish, nu}.
+critical libmamba Shell not initialized
 ```
 
 ## 构建自己的 Runtime 镜像
 ```shell
 sudo docker build -t all-hands-code-server:0.16-nikolaik .
-
+sudo docker build -t all-hands-code-server:0.17-nikolaik .
 ```
 
 ## 修改自己的 Runtime 镜像
 
 
 
-### 修改源文件
+### dockerfile 修改源文件
 ```shell
 MOUNT_REPO=/home/mrh/program/openhands/OpenHands;APP_REPO=/openhands/code;dk rm -f csruntime;
-dk run --name csruntime -it -v ${MOUNT_REPO}:${MOUNT_REPO} -e MOUNT_REPO=${MOUNT_REPO} -e APP_REPO=${APP_REPO} all-hands-code-server:0.16-nikolaik bash
+dk run --name csruntime -it -v ${MOUNT_REPO}:${MOUNT_REPO} -e MOUNT_REPO=${MOUNT_REPO} -e APP_REPO=${APP_REPO} -p 9806:9806 all-hands-code-server:0.16-nikolaik bash
 cp ${MOUNT_REPO}/openhands/runtime/plugins/vscode/__init__.py ${APP_REPO}/openhands/runtime/plugins/vscode/__init__.py
 exit
+docker start csruntime
 docker exec -it csruntime bash
+code-server --bind-addr 0.0.0.0:9806 --auth none
+# 在浏览器中安装插件
 # 提交并覆盖
 docker commit csruntime all-hands-code-server:0.16-nikolaik
 ```
 
 ## code-server
+```shell
+MOUNT_REPO=/home/mrh/program/openhands/testm;EXTENSIONS_DIR=/home/mrh/program/openhands/testm/extensions;dk rm -f csruntime;
+dk run --name csruntime -it -v ${MOUNT_REPO}:${MOUNT_REPO} -v ${EXTENSIONS_DIR}:/root/.local/share/code-server/extensions/ -e MOUNT_REPO=${MOUNT_REPO}  -p 9806:9806 all-hands-code-server:0.16-nikolaik bash
+# exit
+# docker start csruntime
+# docker exec -it csruntime bash
+# 不需要指定插件路径,已经默认挂载到 /root/.local/share/code-server/ 
+code-server --bind-addr 0.0.0.0:9806 --auth none 
+# code-server --bind-addr 0.0.0.0:9806 --auth none --extensions-dir ${EXTENSIONS_DIR}
+
+# 访问浏览器code-server,手动安装 python 、 Chinese 、 vue 等插件。
+# 显示中文: https://code.visualstudio.com/docs/getstarted/locales
+中文插件配置文件路径 /root/.local/share/code-server/User/argv.json
+
+docker cp csruntime:/root /home/mrh/program/openhands/testm/runtime-code-server/
+# code-server --bind-addr 0.0.0.0:9806 --auth none --extensions-dir /root/.local/share/code-server/extensions/ --user-data-dir /root/.local/share/code-server/
+code-server --bind-addr 0.0.0.0:9806 --auth none --user-data-dir /root/.local/share/code-server/
+```
 
 ```shell
 # 插件路径
 file:///home/openhands/.local/share/code-server/extensions
+
+# ssl 路径 caddy
+/home/mrh/program/caddy/data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/sv-v2.magong.site
 ```

+ 7 - 15
docker-compose.yaml

@@ -2,27 +2,19 @@ version: '3.8'
 
 services:
   openhands-app:
-    image: docker.all-hands.dev/all-hands-ai/openhands:0.17
+    image: docker.all-hands.dev/all-hands-ai/openhands:0.18
     container_name: openhands-app
     env_file:
       - .env
-    # environment:
-    #   - LLM_BASE_URL=${LLM_BASE_URL}
-    #   - LLM_API_KEY=${LLM_API_KEY:-default_value}
-    #   - LLM_MODEL=${LLM_MODEL:- openai/deepseek-coder}
-    #   - LOG_ALL_EVENTS=${LLM_API_KEY:-true}
-    #   - SANDBOX_RUNTIME_CONTAINER_IMAGE=${SANDBOX_RUNTIME_CONTAINER_IMAGE}
-      # - SANDBOX_USER_ID=${SANDBOX_USER_ID}
-    #   - VSCODE_HOST=${VSCODE_HOST}
-    #   - VSCODE_PORT=${VSCODE_PORT}
-    #   - WORKSPACE_MOUNT_PATH=${WORKSPACE_MOUNT_PATH}
-    #   - DEBUG=${DEBUG:-false}
-    #   - /home/mrh/program/openhands/.env:/app/.env
     volumes:
+      - /etc/localtime:/etc/localtime:ro
+      - ./src/config.toml:/app/config.toml
+      - /home/mrh/program/openhands/OpenHands/openhands:/app/openhands
+      - /home/mrh/program/openhands/.env:/app/.env
       - ${WORKSPACE_MOUNT_PATH}:${WORKSPACE_MOUNT_PATH}
       - /var/run/docker.sock:/var/run/docker.sock
-      - /home/mrh/program/openhands/OpenHands/config.toml:/app/config.toml
-      - /home/mrh/.openhands-state:/.openhands-state
+      # - /home/mrh/.openhands-state:/.openhands-state
+      - /home/mrh/program/openhands/testm/logs:/app/logs
       # - /home/mrh/program/openhands/OpenHands/openhands/runtime/impl/eventstream/eventstream_runtime.py:/app/openhands/runtime/impl/eventstream/eventstream_runtime.py
       # - /home/mrh/program/openhands/OpenHands/openhands/server/listen_socket.py:/app/openhands/server/listen_socket.py
       # - ${FILE_STORE_PATH}:/mydata/file_store

+ 18 - 8
readme.md

@@ -7,6 +7,8 @@ export LLM_BASE_URL="http://10.0.0.3:3000/v1";
 export LLM_BASE_URL="https:aiapi.magong.site/v1";
 export LLM_API_KEY="sk-NscqaCD1PfVm7soEF3C3E6297bE14d7fB595Be8f17F39aFf";
 export LLM_MODEL="openai/deepseek-coder";
+export LLM_MODEL="openai/qwen-plus";
+export LLM_MODEL="openai/glm-4-flash";
 # 可以自定义修改挂载路径
 # export WORKSPACE_MOUNT_PATH="/"
 python -m openhands.core.cli
@@ -14,9 +16,9 @@ python -m openhands.core.cli
 # 需要关闭警告提示: if litellm.suppress_debug_info is False:
 # 不能这样设置:  export LLM_MODEL="deepseek-coder";
 
-export HOSTED_VLLM_API_BASE="http://10.0.0.3:3000/v1";
+export HOSTED_VLLM_API_BASE="https://aiapi.magong.site/v1";
 export HOSTED_VLLM_API_KEY="sk-NscqaCD1PfVm7soEF3C3E6297bE14d7fB595Be8f17F39aFf";
-export LLM_MODEL="hosted_vllm/deepseek-coder"
+export LLM_MODEL="hosted_vllm/glm-4-flash"
 ```
 
 ### WEB UI
@@ -111,13 +113,21 @@ export LLM_API_KEY="sk-NscqaCD1PfVm7soEF3C3E6297bE14d7fB595Be8f17F39aFf";
 
 ```
 
-### 固定 Runtime
+### Runtime
+
+#### 为什么要在容器中运行 EventStreamRuntime
+通常,在一个项目中,开发环境是固定的。例如 openhands 固定用到 python == 3.11 、git 、 yarn==1.12 、 nodejs=8.9 、固定的 user和 env,此后,不会经常安装新的软件。
+
+openhands 项目主要针对自己本身进行开发,也就是说,一个项目对应着一个私有容器的镜像环境。任何人都可以使用 openhands 相同的镜像作为共同协作开发,避免不同用户因为环境不同而导致的难以调试问题。
+
+如果你有自己的项目,你可能用的是完全不同的开发环境,你需要自定义自己的 Runtime 镜像。
+
+如果你要分发给不同的用户使用,不同用户又有不同的私有环境,不同的用户甚至不需要协作开发。那么使用 EventStreamRuntime 可能不适合这种场景。
+
+#### 固定 runtime 容器名
+参考 cli 模式可以看出,它每次启动都会生成 openhands-runtime-cli 的容器名,因为 sid 被固定了
 ```shell
-# docker-compose 挂载  - /home/mrh/program/openhands/OpenHands/config.toml:/app/config.toml
-[core]
-workspace_base="./workspace"
-# 设置 jwt 秘钥后,就能自动生成 token 固定 runtime 容器
-jwt_secret = "123"
+OpenHands/openhands/core/cli.py
 ```
 
 如果要修改挂载路径,需要删除容器,再重新启动。

+ 1 - 1
users/u1/.env

@@ -10,7 +10,7 @@ DEBUG=true
 WORKSPACE_MOUNT_PATH=/home/u1
 # WORKSPACE_MOUNT_PATH=/home/mrh/program/openhands/OpenHands
 FILE_STORE_PATH=/home/u1/.openhands/file_store
-VSCODE_HOST=sv-v2
+VSCODE_HOST=sv-v2.magong.site
 # VSCODE_PORT=9806
 CODE_SERVER_DATA_PATH=/home/u1/.local/share/code-server
 

+ 26 - 22
代码架构.md

@@ -27,7 +27,7 @@ uvicorn openhands.server.listen:app --host 0.0.0.0 --port 3000
 尝试连接到之前的容器,如果之前保留了会话,可根据容器名连接: `async def connect(self):` , `await call_sync_from_async(self._attach_to_container)`
 如果容器不存在,则初始化一个新容器: `await call_sync_from_async(self._init_container)`
 容器名来自前缀+sid `self.container_name = CONTAINER_NAME_PREFIX + sid` ,sid 来自 `listen.py` 会话或者 jwt_token `sid = get_sid_from_token(jwt_token, config.jwt_secret)` `sid = str(uuid.uuid4())`
-> ./openhands/runtime/impl/eventstream/eventstream_runtime.py
+> ./openhands/runtime/impl/docker/docker_runtime.py
 > ./openhands/server/listen.py
 
 在 runtime 内部,`python -u -m openhands.runtime.action_execution_server` 用 api server 来操作文件
@@ -44,25 +44,7 @@ port 地址是 port_mapping 在文件 `eventstream_runtime.py`中 `self.containe
 `self.container = self.docker_client.containers.run`
 > OpenHands/openhands/runtime/action_execution_server.py
 
-### 文件修改
-```shell
-# 从 docker 容器 openhands-app 内复制到宿主机
-docker cp openhands-app:/app/openhands/core/cli.py /home/mrh/program/openhands
-docker cp openhands-app:/app/openhands/core/cli.py ./openhands/core/cli.py
-# 切换到指定版本
-git checkout 0.15.0
-# 挂载
-      - ./openhands/core/cli.py:/app/openhands/core/cli.py
-
-python -m openhands.core.cli
-
-# ./openhands/server/listen.py
-# ./containers/app/Dockerfile
-uvicorn openhands.server.listen:app --host 0.0.0.0 --port 3000
 
-# eventstream_runtime.py:234
-
-```
 
 ## vscode
 route:
@@ -70,7 +52,7 @@ http://sv-v2:3000/api/vscode-url
 
 ### vscode 访问地址
 ```python
-# ./openhands/runtime/impl/eventstream/eventstream_runtime.py
+# ./openhands/runtime/impl/docker/docker_runtime.py
 # VSCODE_HOST=sv-v2
                 vscode_host = os.environ.get('VSCODE_HOST', "localhost")
                 self._vscode_url = f'http://{vscode_host}:{self._host_port + 1}/?tkn={response_json["token"]}&folder={self.config.workspace_mount_path_in_sandbox}'
@@ -84,7 +66,29 @@ cd ~/program/openhands/testm
 docker run -it --init -p 9806:3000 -v "$(pwd):/home/workspace:cached" gitpod/openvscode-server
 ```
 
-## 构建自己的 Runtime 镜像
+## 自定义 Runtime 镜像
+
+### 文件修改
+```shell
+# 从 docker 容器 openhands-app 内复制到宿主机
+docker cp openhands-app:/app/openhands/core/cli.py /home/mrh/program/openhands
+docker cp openhands-app:/app/openhands/core/cli.py ./openhands/core/cli.py
+# 切换到指定版本
+git checkout 0.15.0
+# 挂载
+      - ./openhands/core/cli.py:/app/openhands/core/cli.py
+
+python -m openhands.core.cli
+
+# ./openhands/server/listen.py
+# ./containers/app/Dockerfile
+uvicorn openhands.server.listen:app --host 0.0.0.0 --port 3000
+
+# eventstream_runtime.py:234
+
+```
+
+### 构建自己的 Runtime 镜像
 
 🎈 手动构建
 
@@ -108,7 +112,7 @@ docker run -it --init -p 9806:3000 -v "$(pwd):/home/workspace:cached" gitpod/ope
 🎈 启动时,如不存在则自动构建
 
 启动时,`if self.runtime_container_image is None` 会运行 EventStreamRuntime build_runtime_image 构建 runtime 镜像
-> ./openhands/runtime/impl/eventstream/eventstream_runtime.py
+> ./openhands/runtime/impl/docker/docker_runtime.py
 > ./openhands/runtime/utils/runtime_build.py
 > ./openhands/runtime/utils/runtime_templates/Dockerfile.j2