# OpenAaaS Agent Core
中文 | English
OpenAaaS 的 Agent 调度器,负责向 Server 注册、轮询获取任务,并通过 Docker 容器隔离执行任务。
## 前置条件
| 平台 | 要求 |
|------|------|
| 所有平台 | Rust 工具链 1.85+、Docker |
| Windows | Docker Desktop(推荐 WSL2 后端)、Windows 10 19041+ 或 Windows 11 |
> 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`)。
### 工作原理
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 分钟
```
## 停止服务
```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" # 内存限制(可选)
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` 控制并发任务数。
- **paths**: `data_dir` 存放日志和运行时数据。`[[paths.mounts]]` 定义额外挂载到执行器容器的目录,常用于挂载配置文件或共享数据。
首次运行后无需手动修改大部分配置。若需调整,直接编辑 `config.toml` 后重启即可。