# OpenAaaS Agent Core

中文 | English

OpenAaaS 的 Agent 调度器,负责向 Server 注册、轮询获取任务,并通过 Docker 容器隔离执行任务。 ## 前置条件 | 平台 | 要求 | |------|------| | 所有平台 | Rust 工具链 1.85+、Docker | | Windows | Docker Desktop(推荐 WSL2 后端)、Windows 10 19041+ 或 Windows 11 | | GPU 挂载(可选) | NVIDIA 显卡与驱动;Linux 需安装 nvidia-container-toolkit,详见 [GPU 挂载](#gpu-挂载可选) | > Windows 用户如不熟悉 Docker Desktop 配置,建议直接参考下方 [Windows 部署](#windows-部署) 小节。 ## 编译安装 ```bash cd agent-core cargo build --release ``` 编译产物为 `target/release/agent-core`(Windows 上为 `target/release/agent-core.exe`)。 ## 执行器镜像 Agent Core 通过 Docker 容器隔离执行任务,因此需要提前准备一个 Docker 镜像作为执行器。 交互契约很简单:**Agent Core 把 `task.json` 和输入文件挂进容器,容器执行完把结果文件写到 workspace**。Agent Core 不关心容器内部怎么实现,只要满足这个协议即可。 `executor-example/` 目录提供了一个**示例镜像**(基于 node + python3,恰好用 pi-coding-agent 作为执行逻辑),用来演示这个交互过程。你可以直接基于它修改,也可以完全从零构建自己的镜像。详见 `executor-example/README.md`。 构建示例镜像: ```bash cd executor-example docker build -t open-aaas-executor:latest . ``` > 镜像名需要与 `config.toml` 中的 `executor.image` 保持一致(默认值为 `open-aaas-executor:latest`)。 > 如需 GPU 挂载,镜像需自带 CUDA 运行库(如基于 `nvidia/cuda` 镜像构建);agent-core 只负责挂载 GPU 设备,不提供 CUDA 环境。详见 [GPU 挂载](#gpu-挂载可选)。 ### 工作原理 1. Agent Core 从 Server 轮询获取任务。 2. 在本地为任务创建 workspace 目录,写入 `task.json`,下载输入文件到 `input/`。 3. 通过 `docker run` 启动容器,挂载 workspace 到容器的 `/workspace`。 4. 容器读取 `/workspace/task.json`,执行任务,将结果文件写入 workspace。 5. 容器退出后,Agent Core 扫描 workspace 下文件(排除 `task.json` 和 `input/`),作为输出上报 Server。 ## 命令用法 ```bash agent-core [OPTIONS] ``` ### 全局选项 | 选项 | 说明 | |------|------| | `--config ` | 指定配置文件路径,默认读取当前目录的 `config.toml` | ### 子命令 | 命令 | 说明 | |------|------| | `init` | 在当前目录生成默认 `config.toml` | | `register --token [--name ]` | 向 Server 注册,获取 service_id 和 api_key | | `run [--interactive]` | 前台运行调度器。`--interactive` 表示未注册时进入交互式注册 | | `run-detached` | 后台运行调度器 | | `stop` | 停止后台调度器 | | `status` | 查看调度器状态 | ## Windows 部署 ### 推荐方式:WSL2 内运行(最顺畅) 在 WSL2 Ubuntu 中操作可获得与 Linux 完全一致的原生体验: 1. 安装 [WSL2](https://docs.microsoft.com/zh-cn/windows/wsl/install) 并启动 Ubuntu 发行版。 2. 在 Docker Desktop 中启用 **Settings → Resources → WSL Integration → Enable integration with my default WSL distro**。 3. 在 WSL2 终端内克隆代码,按本文后续 Linux 步骤执行即可(`cargo build --release`、构建镜像等)。 > > **WSL2 路径提示:** 在 WSL2 终端内编辑 `config.toml` 时,`[[paths.mounts]]` 中的 `host` 路径必须使用 Linux 格式(如 `/mnt/c/Users/xxx/share` 或 WSL 内部路径 `/home/xxx/share`),不能使用 Windows 格式 `C:\...`,否则挂载会失败。 ### 备选方式:原生 Windows + Docker Desktop 如不方便使用 WSL2,也可直接在 PowerShell / CMD 中运行: 1. 安装 [Docker Desktop](https://www.docker.com/products/docker-desktop/)。 2. 在 Docker Desktop 设置中启用 **Use the WSL 2 based engine**(性能更好)。 3. 构建 executor 镜像(PowerShell 中路径分隔符用 `./` 即可): ```powershell cd executor-example docker build -t open-aaas-executor:latest . ``` 4. 后续命令使用 `.\agent-core.exe` 替代 `./agent-core`。 > 原生 Windows 下,`config.toml` 中的 `host` 路径可使用 `C:/path/to/dir`(推荐)或 `C:\\path\\to\\dir` 或 `./relative/path` 格式,Docker Desktop 均可正确解析。 --- ## 首次使用 ### 1. 初始化配置 ```bash ./agent-core init ``` > **Windows(原生):** 直接运行 `.\agent-core.exe init`(PowerShell 推荐,CMD 可直接用 `agent-core.exe init`)。 在当前目录生成默认 `config.toml`。 ### 2. 编辑配置 打开 `config.toml`,修改 Server 地址: ```toml [server] base_url = "http://127.0.0.1:8080" # 改成你的 Server 地址 ``` > **Windows 路径提示:** `[[paths.mounts]]` 中的 `host` 路径在 Windows 上可以是 `C:/path/to/dir`(推荐)或 `C:\\path\\to\\dir` 或 `./relative/path` 格式,Docker Desktop 都能正确挂载。 ### 3. 注册 从 Server 获取注册 token 后执行: ```bash ./agent-core register --token rt_xxx --name my-agent ``` > **Windows(原生):** `.\agent-core.exe register --token rt_xxx --name my-agent` 注册成功后,`service_id` 和 `api_key` 会自动写入 `config.toml`。 ### 4. 运行 前台运行: ```bash ./agent-core run ``` > **Windows(原生):** `.\agent-core.exe run` 首次启动会交互式确认 Server URL 和数据目录(默认 `./data`),随后开始轮询任务。 如果当前目录已有完整配置且已注册,会直接启动,不再询问。 ## 前台运行 ```bash ./agent-core run ``` > **Windows(原生):** 使用 `.\agent-core.exe run`。 启动后向 Server 轮询获取任务、发送心跳,并通过 Docker 执行器运行任务。按 `Ctrl+C` 或发送 `SIGTERM` 可优雅关闭。 未注册且带有 `--interactive` 时,会交互式询问 token 并完成注册: ```bash ./agent-core run --interactive ``` ## 后台运行 ```bash ./agent-core run-detached ``` - Linux/macOS:通过 `nohup` 后台运行,日志输出到 `{data_dir}/agent.log` - Windows:通过 `cmd /C start /B` 后台运行 > **Windows(原生):** 使用 `.\agent-core.exe run-detached`。 后台启动后会写入 pidfile,用于后续管理和状态查询。 ## 查看状态 ```bash ./agent-core status ``` > **Windows(原生):** 使用 `.\agent-core.exe status`。 输出示例: ``` OpenAaaS Agent 状态 ==================== 配置文件: /path/to/config.toml 数据目录: /path/to/data Server URL: http://127.0.0.1:8080 轮询间隔: 5 秒 注册状态: 已注册 Service ID: svc_xxx Agent 名称: my-agent 执行器配置: 镜像: open-aaas-executor:latest 容量: 2 超时: 0 分钟 宿主机访问: 已关闭 GPU: 未开启 ``` ## 停止服务 ```bash ./agent-core stop ``` > **Windows(原生):** 使用 `.\agent-core.exe stop`。 向后台进程发送 `SIGTERM`,等待最多 5 秒优雅退出;超时则发送 `SIGKILL` 强制终止,并清理 pidfile。 ## 配置文件说明 `config.toml` 完整示例: ```toml [server] base_url = "http://127.0.0.1:8080" # Server 地址 poll_interval_secs = 5 # 轮询间隔(秒) use_system_proxy = false # 是否使用系统代理 [agent] service_id = "svc-xxx" # 注册后自动填充 api_key = "ak_xxx" # 注册后自动填充 name = "agent-core" # Agent 名称 [executor] executor_type = "standard" # 执行器类型:standard / bash / python / custom image = "open-aaas-executor:latest" # Docker 镜像 capacity = 2 # 并发任务数 timeout_minutes = 0 # 任务超时(分钟),0 表示不限制 # memory_limit = "4g" # 内存限制(可选) # enable_host_access = false # 允许容器访问宿主机服务(需 Docker 20.10+,默认 false) # gpu.vendor = "nvidia" # GPU 厂商(v1 仅支持 nvidia;amd / intel 预留,默认关闭) # gpu.devices = "all" # 挂载的 GPU:"all" 或 "0,1" 等索引列表 working_dir = "/workspace" # 容器内工作目录 # script_path = "/workspace/run.sh" # 脚本路径(bash/python 类型用) custom_entrypoint = ["/bin/sh"] # 自定义 ENTRYPOINT(custom 类型) custom_args = ["-c", "echo hi"] # 自定义参数(custom 类型) [paths] data_dir = "./data" # 数据目录 [[paths.mounts]] host = "./share/kimi-config" # 宿主机路径(相对或绝对) container = "/shared/kimi-config" # 容器内路径 readonly = true # 是否只读 ``` ### 配置项说明 - **server**: 连接 Server 的相关配置,`base_url` 必填。 - **agent**: `service_id` 和 `api_key` 由 `register` 命令自动填充,无需手动填写。 - **executor**: 任务执行器配置。`executor_type` 支持 `standard`(容器默认 ENTRYPOINT)、`bash`、`python`、`custom`;`capacity` 控制并发任务数;`enable_host_access`(默认 `false`)设为 `true` 后容器可通过 `host.docker.internal` 访问宿主机服务,需 Docker 20.10+。安全提示:开启后容器可访问宿主机上监听 `0.0.0.0` 的所有服务,仅建议管理员在配置文件中显式开启。提示:Docker Desktop(macOS / Windows)与 OrbStack 等桌面运行时已内置 `host.docker.internal` 解析,开启此功能冗余但无害;仅 Linux 原生 Docker Engine 需要开启。`gpu.vendor` / `gpu.devices` 配置 GPU 挂载(默认关闭,v1 仅支持 nvidia),详见 [GPU 挂载](#gpu-挂载可选)。 - **paths**: `data_dir` 存放日志和运行时数据。`[[paths.mounts]]` 定义额外挂载到执行器容器的目录,常用于挂载配置文件或共享数据。 首次运行后无需手动修改大部分配置。若需调整,直接编辑 `config.toml` 后重启即可。 ## GPU 挂载(可选) v1 支持将 NVIDIA GPU 挂载进任务容器(通过 `docker run --gpus` 参数),默认关闭。在 `config.toml` 的 `[executor]` 节配置: ```toml [executor] gpu.vendor = "nvidia" # v1 仅支持 nvidia;amd / intel 为预留值,配置了也不会生成 GPU 参数 gpu.devices = "all" # 挂载全部 GPU;也可按索引指定,如 "0,1" ``` 开启后所有任务容器都会获得 GPU 访问权,`status` 命令会显示当前 GPU 配置。`gpu.devices` 仅支持缺省、`"all"` 或逗号分隔的数字索引(空白按 `"all"` 处理);含空格、分号、字母或空段(如 `"0;;1"`)的非法值会在配置加载时报错,拒绝启动。 ### 平台支持 | 平台 | 支持情况 | |------|----------| | Linux | 原生支持,需安装 nvidia-container-toolkit | | Windows(WSL2) | 支持 NVIDIA GPU,在 Windows 侧安装 NVIDIA 驱动即可 | | Windows(原生 Docker Desktop) | 不支持,配置了会启动报错,请改用 WSL2 后端 | | macOS | 不支持,配置了会启动报错 | 启动时 agent-core 会执行 GPU 预检:macOS 与 Windows 原生配置 GPU 会直接报错退出;Linux / WSL2 下未检测到 nvidia runtime 或 `docker info` 执行失败时仅警告,不阻断启动。 ### 安装 nvidia-container-toolkit(Linux) Debian / Ubuntu(apt): ```bash curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list sudo apt-get update sudo apt-get install -y nvidia-container-toolkit ``` RHEL / Fedora(dnf): ```bash curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo sudo dnf install -y nvidia-container-toolkit ``` 安装后配置 Docker runtime 并重启 Docker: ```bash sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker ``` > WSL2 用户使用 Docker Desktop 时无需在 WSL 内安装 toolkit,在 Windows 侧安装 NVIDIA 驱动并启用 WSL2 后端即可;在 WSL2 内运行原生 Docker Engine 则按上述 Linux 步骤安装。 ### 安全与调度提示 - GPU 挂载属于准特权硬件访问:开启后所有任务容器都能访问 GPU,任务间不做隔离,仅建议在可信任务场景由管理员显式开启。 - GPU 不参与 `capacity` 调度计数。GPU 节点应根据显存容量自行把 `capacity` 设为可承载的并发数,避免多任务争抢显存。 - 同一台机器需要混跑 CPU 与 GPU 任务时,建议运行两个 agent-core 实例:一个开启 GPU,一个关闭 GPU,分开接任务。 - 执行器镜像需自带 CUDA 运行库(如基于 `nvidia/cuda` 镜像构建);agent-core 只负责挂载 GPU 设备,不提供 CUDA 环境。