Files
beaver_project/app-instance
steven_li 4b0bf65ace ```
feat(engine): 优化智能体循环中的助手消息处理逻辑

- 在没有工具调用时才添加助手消息到上下文
- 确保工具调用响应正确添加到消息上下文中
- 修复了消息构建的条件逻辑

fix(cron): 改进定时任务调度的时间解析功能

- 添加正则表达式导入用于时间显示解析
- 实现从显示文本中提取毫秒间隔的功能
- 增强整数转换的安全性,避免类型错误
- 优化定时任务配置的解析逻辑

feat(outlook): 增强Outlook集成的功能和稳定性

- 将默认超时时间从10秒增加到180秒
- 为状态检查函数添加可选的验证参数
- 串行执行邮件概览获取操作而非并行
- 改进连接状态验证逻辑

feat(channel): 添加设备名称作为会话标识的选项

- 为终端WebSocket适配器添加新的配置选项
- 实现基于设备名称生成会话对等ID的功能
- 记录原始对等ID和设备名称的元数据
- 支持从设备名称创建会话对等ID

feat(skills): 完善技能学习评估系统和进度跟踪

- 在应用启动时自动调度待评估的技能草稿
- 为技能评估工作创建独立的循环工厂
- 实现异步技能评估任务的取消和清理机制
- 添加技能评估进度报告和状态跟踪功能
- 扩展会话列表API以包含更多详细信息
- 防止对不存在的会话进行操作
- 优化技能草稿提交和评估的业务逻辑

perf(skills): 提升技能评估的并发性能

- 实现并行技能案例评估以提高效率
- 添加最大并行案例数的环境变量控制
- 实现实时评估进度更新和回调机制
- 优化评估过程中的资源管理和同步

refactor(services): 创建隔离的智能体循环实例

- 添加创建独立智能体循环的工厂方法
- 确保新循环继承运行时服务配置
- 支持技能评估等需要隔离环境的场景
```
2026-06-15 14:48:16 +08:00
..
```
2026-06-15 14:48:16 +08:00
```
2026-06-15 14:48:16 +08:00
2026-03-13 16:40:08 +08:00
```
2026-06-09 14:23:37 +08:00
2026-03-13 16:40:08 +08:00
2026-03-13 16:40:08 +08:00

app-instance

单实例应用单元:

  • 一个 Docker 容器里同时运行前端、后端和 Nginx 反代
  • 前端走 /
  • 后端 API 走 /api
  • WebSocket 走 /ws

关键文件

  • Dockerfile
    • 统一镜像构建入口
  • entrypoint.sh
    • 容器内启动前端、后端、Nginx
  • create-instance.sh
    • 创建实例目录、生成配置、启动容器、写注册表
  • remove-instance.sh
    • 删除容器、移除注册表、可选清理实例目录
  • list-instances.sh
    • 查看当前注册实例
  • instance-registry.py
    • 维护 runtime/registry/instances.json

注册表

默认注册表路径:

runtime/registry/instances.json

每条记录至少包含:

  • instance_id
  • instance_slug
  • container_name
  • host_port
  • public_url
  • instance_root
  • image_name

常用命令

1. 构建镜像

docker build -t beaver/app-instance:latest .

2. 创建实例

./create-instance.sh \
  --image beaver/app-instance:latest \
  --instance-id demo-001 \
  --auth-username admin \
  --auth-password 123456 \
  --api-key 'your-api-key'

可选参数:

  • --host-port
  • --public-url
  • --username
  • --email
  • --instance-host
  • --authz-base-url
  • --backend-id
  • --client-id
  • --client-secret
  • --network
  • --host-bind-ip
  • --initial-skills-dir
  • --skip-initial-skills
  • --build
  • --replace

3. 查看实例

./list-instances.sh
./list-instances.sh --json

4. 删除实例

./remove-instance.sh --instance-id demo-001

如果要把实例目录也一并清掉:

./remove-instance.sh --instance-id demo-001 --purge-data

目录约定

默认实例数据目录:

runtime/instances/<instance-slug>/

其中会生成:

runtime/instances/<instance-slug>/
└── beaver-home
    ├── config.json
    ├── web_auth_users.json
    └── workspace/

这个目录是单用户 sandbox 的配置与数据边界。容器内会把它挂到:

/root/.beaver/

并设置:

BEAVER_CONFIG_PATH=/root/.beaver/config.json
BEAVER_WORKSPACE=/root/.beaver/workspace

所以模型 provider/api_key/api_base/model 配一次即可Web / channel 请求不需要、也不应该携带 API Key。

create-instance.sh 默认会把仓库根目录的 skills/ 非覆盖式复制到实例 workspace并把同一个目录只读挂载到实例容器的 /opt/app/initial-skillsentrypoint.sh 每次启动都会用该目录补齐缺失的 published 初始 skills已有 skill 目录不会被覆盖index 只做并集追加。

当前状态

这层已经支持:

  • 统一镜像构建
  • 镜像内安装并启动新的 beaver 后端
  • 实例创建
  • 实例删除
  • 实例列表
  • 基于注册表的端口分配
  • 为 deploy-control / router-proxy 记录用户名和实例 host

生产注意

  • 实例容器的宿主机端口默认只绑定 127.0.0.1
  • 外部访问应统一走 router-proxy
  • 如果你确实要把单个实例端口直接暴露到公网,再显式传 --host-bind-ip 0.0.0.0
  • 使用共享 external-connector sidecar 时,每个实例容器都必须带自己的内部回调地址: EXTERNAL_CONNECTOR_CALLBACK_BASE_URL=http://<app-instance-container-name>:8080
  • 通过 create-instance.sh --network <docker-network> 创建实例时,脚本会默认使用 http://<container-name>:8080 作为回调地址;生产部署也可以用 --external-connector-callback-base-url <url> 显式覆盖
  • BEAVER_BRIDGE_BASE_URL 只作为 sidecar 的旧连接或兜底地址;多实例部署不能依赖它路由所有入站事件

下一步可以继续接:

  • portal 调用创建实例
  • URL 分配和反向代理
  • 实例续期 / 停用 / 启用