diff --git a/agentscope-sandbox.md b/agentscope-sandbox.md index 1143c83..6c5ac61 100644 --- a/agentscope-sandbox.md +++ b/agentscope-sandbox.md @@ -34,10 +34,7 @@ BackendBase (exec_shell / read_file / write_file) └─ 内置工具 Bash/Read/Write/Edit/Grep/Glob 透明落到沙箱内 ``` -关键设计: - -- **容器内 MCP Gateway**:宿主机通过 `GatewayClient` + `backend.exec_shell` 驱动网关(一般不依赖宿主机到沙箱的端口映射)。 -- **WorkspaceManager**:`PER_AGENT` / `PER_SESSION` / `PER_USER`,空闲 TTL 驱逐;云后端可按 metadata/label 跨节点重连。 +关键设计:通过 MCP 网关收敛文件系统相关 tool 的访问,采用空闲 TTL 驱逐的方案释放沙箱资源。 ### agentscope-java @@ -52,18 +49,15 @@ SandboxFilesystemSpec.toSandboxContext(hostWorkspaceRoot) │ ▼ SandboxLifecycleHook - PreCall → SandboxManager.acquire → Sandbox.start() (四分支恢复) + PreCall → SandboxManager.acquire → Sandbox.start() PostCall → Sandbox.stop() (tar 快照) → persist state → release │ ▼ SandboxBackedFilesystem + ShellExecuteTool - └─ 文件工具 / execute 全部转发到沙箱 + └─ 文件工具 / execute ``` -关键设计: - -- **生命周期管理**:每次推理前后自动 acquire/start/stop,适合多租户与快照恢复。 -- **快照与沙箱解耦**:换 Docker/K8s/E2B 不影响 `LocalSnapshotSpec` / `RedisSnapshotSpec` / `OssSnapshotSpec` 的选择。启动时把宿主 `AGENTS.md`、`skills/`、`subagents/`、`knowledge/` 等打 tar 注入沙箱,按内容 SHA-256 增量跳过。 +关键设计:在ReAct生命周期内,通过 hook 机制(2.0版本叫中间件)start、stop 沙箱。 ## Docker沙箱双端对照表 @@ -79,121 +73,21 @@ SandboxBackedFilesystem + ShellExecuteTool | 资源限制 | 较弱(构造参数少) | memory / cpu / ports / network | | 水平扩展 | 不适合 | 需外置快照/状态存储 | -关键:agentscope 通过 HTTP API 端点和 Docker 引擎交互,agentscope-java 通过 cli 与 Docker 引擎交互。明显 agentscope 的设计更靠谱一些,因为通过 HTTP API 端点交互,有2个好处: +### 优点 -- agentscope 实例本身可以容器化部署,而 agentscope-java 必需在宿主机用 `java -jar` 运行,因为它需要在宿主机上执行 `docker run` 命令。 -- 通过 HTTP API 端点 agentscope 可以控制远程服务器上的 Docker 容器。 +- agentscope: + - 通过 HTTP API 与 Docker 引擎交互,除了与本机 Docker 引擎交互之外,还可以访问远程服务器上的 Docker 引擎。 + - 自动构建镜像,且可以随着依赖库的增删不断迭代 Dockerfile。 +- agentscope-java: + - 每次 call 的时候都会在 start/stop/snapshot 生成 tar 包快照。 + - 隔离级别更贴近多租户场景(SESSION/USER/AGENT/GLOBAL)覆盖多租户常见模型。 -### agentscope +### 弊端 -#### 实现原理 - -1. **镜像构建(内容哈希缓存)** - - `prepare_build_context()` 渲染 Dockerfile,打包 gateway 脚本、`requirements.txt`、glob helper。 - - Tag 形如 `agentscope-workspace:<12hex>`,对 Dockerfile + COPY 文件做 SHA-256;本地已有则跳过 build。 - - 默认基础镜像 `python:3.11-slim`,镜像内预装 gateway venv + agentscope(Docker 路径**不做**首次 bootstrap)。 - - 可选 `node_version` 从官方 Node slim 镜像拷贝 `node`/`npm`(供 npx MCP)。 - -2. **容器启动** - - 通过 **aiodocker** `containers.create_or_replace`。 - - `Cmd: ["sleep", "infinity"]`,工作目录 `/workspace`。 - - Label:`agentscope.workspace=true`、`agentscope.workspace.id=`。 - - **Gateway 端口仅容器内监听,不做 host port 映射**;宿主经 `DockerBackend.exec` 访问。 - -3. **持久化** - - 可选 `host_workdir` bind-mount → `/workspace`(`is_persistent`)。 - - 无 mount 则为 ephemeral 容器文件系统。 - - Linux 上 teardown 时尝试 `chown` 把 bind-mount 文件所有权还给宿主用户。 - -4. **I/O 原语(`DockerBackend`)** - - `exec_shell`:容器 `exec` API,直传 argv(无中间 shell,需要时包 `sh -c`)。 - - `read_file` / `write_file`:`get_archive` / `put_archive`(tar)。 - -5. **服务侧** - - `DockerWorkspaceManager`:`basedir` 下为每个 workspace 建宿主目录并 bind-mount;TTL sweeper 回收空闲容器。 - -#### 使用限制 - -| 限制 | 说明 | -| --- | --- | -| 依赖 Docker daemon | 需本机/远端可达的 Docker Engine + aiodocker | -| 基础镜像须含 `python3` | Gateway 与工具链假设 Python 可用 | -| **单节点** | 官方文档明确:Docker/Local/Bubblewrap 不适配水平扩容;跨节点请用 E2B/Daytona/OpenSandbox/K8s | -| 首次镜像构建成本 | 缓存未命中时 build 较慢;构建失败需解读 docker stream 日志 | -| 无细粒度 CPU/内存 API | 构造参数侧重镜像与环境变量,资源限额不如 Java Spec 直接 | -| Linux bind-mount 权限 | 容器内 root 写文件可能留下错误 uid;框架仅在 teardown 做 chown 尽力修复 | - -#### 好处 - -- 镜像内预置 gateway,**冷启动无需 apt/uv/pip bootstrap**(对比 E2B/K8s/OpenSandbox)。 -- 内容哈希镜像缓存,Dockerfile 不变则秒级复用。 -- Workspace 长期存活,MCP / skills / sessions 与服务模型一致。 -- Bind-mount 可把工作区落在宿主磁盘,便于调试与备份。 -- 与 `WorkspaceManager` 隔离策略(PER_AGENT 等)无缝衔接。 - -#### 弊端 - -- 强依赖本机 Docker,水平扩展与多副本亲和困难。 -- 常驻 `sleep infinity` 容器占用资源,依赖 TTL 清扫。 -- Gateway 健康检查失败时排查需看容器内日志路径。 -- 与 Java 版相比,缺少一等公民的「跨 call tar 快照后端」抽象。 - -### agentscope-java - -#### 实现原理 - -1. **配置层(Spec)** - Fluent API:`image`、`workspaceRoot`(默认 `/workspace`)、`memorySizeBytes`、`cpuCount`、`exposedPorts`、`network`、`environment`、`additionalRunArgs`、`snapshotSpec`、`workspaceSpec`。 - -2. **创建与客户端** - - `DockerSandboxClient.create(...)` 生成 `DockerSandboxState`(sessionId、镜像、资源参数、快照句柄)。 - - **不引入 docker-java**:一律 `docker run` / `exec` / `inspect` / `stop` / `rm` CLI。 - - 要求宿主 `PATH` 上有 `docker`,且 daemon 可达。 - -3. **容器命令** - ```text - docker run -d --name agentscope-sandbox- - [--memory] [--cpus] [-p] [--network=none|...] [-v bind...] - sh -c "while :; do sleep 3600; done" - ``` - - 默认 **`--network=none`**(未配置 network 时),比 Python 版更偏「默认断网隔离」。 - - 支持 `WorkspaceSpec` 中的 `BindMountEntry` → `-v host:container:ro|rw`。 - - `exec`:`docker exec -w sh -c `。 - -4. **工作区 tar 快照** - - Persist:`docker exec tar -cf - -C /workspace .`(并对 bind-mount 路径 `--exclude`)。 - - Hydrate:`docker exec -i tar -xf - -C /workspace`。 - - `AbstractBaseSandbox` **四分支恢复**:容器是否仍保留目录 × 是否有可恢复快照。 - -5. **编排** - - `start()`:确保容器 running → 四分支初始化 → workspace projection。 - - `stop()`:写快照,**容器可继续跑**。 - - `shutdown()`:自管容器则 `docker stop` + `docker rm --force`。 - -#### 使用限制 - -| 限制 | 说明 | -| --- | --- | -| 依赖 Docker CLI | 无嵌入式 Engine API;Windows/远程 Docker 场景需确保 CLI 行为一致 | -| 默认无网络 | `network` 未设时为 `none`;需要拉包/访问外网必须显式配置 | -| 镜像需自备 | 不像 Python 那样自动构建含 gateway 的专用镜像;由用户指定(如 `ubuntu:24.04`) | -| 输出截断 | stdout/stderr 单流约 512KB 上限 | -| 并发语义 | 同一 IsolationScope 并发 call 可起多个容器,stop 时 **last-write-wins** 覆盖快照 | -| 多副本 | 本地 Docker + 本地快照会成单点;生产需 Redis/OSS 快照 + 分布式 `AgentStateStore` | -| AgentRun/K8s 等扩展 | Docker 在 harness 核心;其它后端在 extension 模块,需单独依赖 | - -#### 好处 - -- **零额外 Java Docker 库依赖**,部署简单。 -- 资源限额(CPU/内存)、端口、网络、额外 run args 一等配置。 -- 快照体系成熟,可跨 call / 跨副本恢复 `node_modules` 等重状态。 -- Workspace projection 把静态资产与运行态分离,宿主改 skills 可增量注入。 -- `IsolationScope`(SESSION/USER/AGENT/GLOBAL)覆盖多租户 SaaS 常见模型。 -- `executionGuard` 可对 AGENT/GLOBAL 做串行化,缓解快照互踩。 - -#### 弊端 - -- 每次 call 的 start/stop/snapshot 有固定开销(尤其大工作区 tar)。 -- CLI 进程模型:高并发时大量 `docker exec` 子进程与线程池开销。 -- 无内置 MCP Gateway;MCP 走 Harness 侧 `tools.json` 注册,与沙箱内进程模型不同。 -- 默认断网 + 裸镜像,冷启动后常需 agent 自己装依赖(靠快照摊销)。 +- agentscope: + - 文件沙箱的生命周期过长,强依赖 TTL 清扫。 + - 工作区没有快照或副本能力,可以自行开发。 +- agentscope-java: + - 随着工作区目录越来越大,会导致快照越来越慢(tar命令)可以自定义这个逻辑规避。 + - 没有 agentscope 那样不断迭代镜像的能力,需要人工干预(私以为自动迭代沙箱镜像是个伪需求) + - 若隔离级别会 session 级别,每个 session 都会被拉起一个容器(要控制一台服务器的会话总数量) \ No newline at end of file diff --git a/feat.md b/feat.md index c2ba5dd..2bf984f 100644 --- a/feat.md +++ b/feat.md @@ -1,25 +1,49 @@ -# 任务目标 + # 任务目标 + + 看下"E:\gitlab\mis-qas\mis-modules\mis-certification\src\main\java\com\lcfc\certification\tool\ChatResponseUtil.java"文件里"executeAgent"方法,Agent运行时没有收集到MCP工具调用的信息,但实际上过程中存在MCP的工具调用,数据库表最新的数据: -分析下面两个框架对于 Workspace 文件系统,是如何集成不同类型的沙箱(重点是Docker)以及实现原理、使用限制、好处和弊端,已markdown格式输出一份报告,写入到文件:"E:\synology\tmp\msg.md"。 + ```json + { + "id": "2082645289369387010", + "project_id": "1", + "update_time": "2026-07-30 09:51:45", + "user_num": "1", + "user_id": [ + "7" + ], + "chat_num": "1", + "input_token": "29712", + "output_token": "1562", + "kb_doc_use_info": [ + { + "kbId": "certification-kb-id", + "docIds": [ + "NB产品CB认证SOP V1.0", + "Green Project Execution SOP", + "认证跨学科关联知识 for EU", + "Cert RFQ V5.2" + ] + } + ], + "call_mcp_tool_count": "0", + "call_skill_count": "0", + "mcp_use_info": null, + "skill_use_info": null, + "user_dislike_count": null, + "user_feedback_count": null +} +``` -- agentscope:v2.0.5 -- agentscope-java:v2.0.0 +我从接口响应的 EventStream 中观察到如下几个片段,确认是有的,比如"downloadCertificationReport"。 -## Github源码 +```text +{"userMessageId":null,"node":"_AGENT_MODEL_","agent":"subgraph_certification_query_agent","tokenUsage":{"promptTokens":6281,"completionTokens":46,"totalTokens":6327,"nativeUsage":{"completion_tokens":46,"prompt_tokens":6281,"total_tokens":6327}},"message":{"messageType":"tool-request","content":"","metadata":{"role":"ASSISTANT","messageType":"ASSISTANT","refusal":"","finishReason":"TOOL_CALLS","index":0,"annotations":[],"id":"chatcmpl-b3c97996f78b0739","reasoningContent":""},"toolCalls":[{"id":"call_083c6a92a3964accade8272c","type":"function","name":"downloadCertificationReport","arguments":"{\"certItem\": \"BIS\", \"modelCode\": \"MY55B\"}"}]},"toolMessages":null,"chunk":"","kbDocContext":null} -| 沙箱类型 | agentscope | agentscope-java | -| --- | --- | --- | -| Docker | https://github.com/agentscope-ai/agentscope/blob/v2.0.5/src/agentscope/workspace/_docker/_docker_workspace.py | https://github.com/agentscope-ai/agentscope-java/blob/v2.0.0/agentscope-harness/src/main/java/io/agentscope/harness/agent/sandbox/impl/docker/DockerFilesystemSpec.java | -| Kubernetes | https://github.com/agentscope-ai/agentscope/blob/v2.0.5/src/agentscope/workspace/_k8s/_k8s_workspace.py | https://github.com/agentscope-ai/agentscope-java/blob/v2.0.0/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-kubernetes/src/main/java/io/agentscope/extensions/sandbox/kubernetes/KubernetesFilesystemSpec.java | -| e2b | https://github.com/agentscope-ai/agentscope/blob/v2.0.5/src/agentscope/workspace/_e2b/_e2b_workspace.py | https://github.com/agentscope-ai/agentscope-java/blob/v2.0.0/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-e2b/src/main/java/io/agentscope/extensions/sandbox/e2b/E2bFilesystemSpec.java | -| Daytona | https://github.com/agentscope-ai/agentscope/blob/v2.0.5/src/agentscope/workspace/_daytona/_daytona_workspace.py | https://github.com/agentscope-ai/agentscope-java/blob/v2.0.0/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-daytona/src/main/java/io/agentscope/extensions/sandbox/daytona/DaytonaFilesystemSpec.java | -| AgentRun | 暂未支持 | https://github.com/agentscope-ai/agentscope-java/blob/v2.0.0/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-agentrun/src/main/java/io/agentscope/extensions/sandbox/agentrun/AgentRunFilesystemSpec.java | -| OpenSandbox | https://github.com/agentscope-ai/agentscope/blob/v2.0.5/src/agentscope/workspace/_opensandbox/_opensandbox_workspace.py | 暂未支持 | +{"userMessageId":null,"node":"_AGENT_TOOL_","agent":"subgraph_certification_query_agent","tokenUsage":null,"message":{"messageType":"tool","content":"","metadata":{"messageType":"TOOL"},"responses":[{"id":"call_083c6a92a3964accade8272c","name":"downloadCertificationReport","responseData":"[{\"text\":\"\\\"MCP调用成功,生成认证报告下载地址:,此地址有时效性https://misqasoss.lcfuturecenter.com:9000/extractdata/extractdata/2026/07/30/7680d1f6bfe24efe8f72b308ff019662.zip?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260730T024643Z&X-Amz-SignedHeaders=host&X-Amz-Credential=mirror%2F20260730%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Expires=604800&X-Amz-Signature=7ba16bb31d3d40babe878e965625e94a6c358464231934ca5c2b4f5989307ff4\\\"\"}]"}]},"toolMessages":null,"chunk":"","kbDocContext":null} +{"userMessageId":null,"node":"_AGENT_MODEL_","agent":"subgraph_certification_query_agent","tokenUsage":{"promptTokens":6612,"completionTokens":46,"totalTokens":6658,"nativeUsage":{"completion_tokens":46,"prompt_tokens":6612,"total_tokens":6658}},"message":{"messageType":"tool-request","content":"","metadata":{"role":"ASSISTANT","messageType":"ASSISTANT","refusal":"","finishReason":"TOOL_CALLS","index":0,"annotations":[],"id":"chatcmpl-b953f4568b860563","reasoningContent":""},"toolCalls":[{"id":"call_85a2100b1adc4790bb7b2bb9","type":"function","name":"downloadCertificationReport","arguments":"{\"certItem\": \"BIS\", \"modelCode\": \"MY55B\"}"}]},"toolMessages":null,"chunk":"","kbDocContext":null} -## 其他参考资料 +{"userMessageId":null,"node":"_AGENT_TOOL_","agent":"subgraph_certification_query_agent","tokenUsage":null,"message":{"messageType":"tool","content":"","metadata":{"messageType":"TOOL"},"responses":[{"id":"call_85a2100b1adc4790bb7b2bb9","name":"downloadCertificationReport","responseData":"[{\"text\":\"\\\"MCP调用成功,生成认证报告下载地址:,此地址有时效性https://misqasoss.lcfuturecenter.com:9000/extractdata/extractdata/2026/07/30/e9a0b939a16e4d0584d8b8454f23be88.zip?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260730T024640Z&X-Amz-SignedHeaders=host&X-Amz-Credential=mirror%2F20260730%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Expires=604800&X-Amz-Signature=bab54b68da0b765da8da964c164ec1de063ecacb11820c15b53d376c362e2686\\\"\"}]"}]},"toolMessages":null,"chunk":"","kbDocContext":null} +``` -- agentscope-java 官方文档对于文件系统的介绍:https://java.agentscope.io/v2/zh/docs/harness/filesystem.html -- agentscope 官方文档对于Workspace的介绍:https://docs.agentscope.io/versions/2.0.5/zh/deploy/workspace-manager -- OpenSandbox Github:https://github.com/opensandbox-group/OpenSandbox -- OpenSandbox 官方文档:https://open-sandbox.ai/getting-started \ No newline at end of file +请根据上述内容分析问题原因,修复bug。 \ No newline at end of file diff --git a/mis-qwpaw.md b/mis-qwpaw.md index 328ddcf..bab0cbd 100644 --- a/mis-qwpaw.md +++ b/mis-qwpaw.md @@ -9,13 +9,18 @@ | 沙箱隔离 (Sandbox) | ❌ | ✅ | **新增**:OS 内核级 Shell 执行隔离 | | 访问策略 (Access Policy) | ❌ | ✅ | **新增**:声明式 allow/deny/ask 策略引擎 | -## 已经做的一些安全加固 +## 已经做的安全加固 - 操作系统层面,已启用 SE Linux 的 Enforcing 模式。其 MAC(Mandatory Access Control)防御机制,可以遏制传统 DAC 机制下被恶意攻击,提权到 root 劫持系统控制权。在 MAC 机制下,权限受限于访问策略,而非文件所有者或用户。即便是 root 权限启动的进程,也必须遵守规则,无法绕过。 -- QwenPaw Linux 的实例运行在 Docker 容器中而非直接运行在宿主机,通过目录挂载的方式,将运行时生成的文件、数据持久化至宿主机上。宿主机磁盘目录不删除的前提下,容器实例宕机、重启数据不会丢失。还可以通过2种方案定期备份数据目录: - - 1、每天定时全量备份数据目录,生成压缩包上传至OSS。 - - 2、将数据目录挂载到NAS [点此查看方案明细](https://git.jkwlstv.cn/doc/container/src/branch/main/nas-to-nfs-linux-docker.md) +- QwenPaw Linux 的实例运行在 Docker 容器中而非直接运行在宿主机,通过目录挂载的方式,将运行时生成的文件、数据持久化至宿主机上。宿主机磁盘目录不删除的前提下,容器实例宕机、重启数据不会丢失。 + +## 还能做的安全防护 + +- 定期备份数据目录: + - 方案一、每天定时全量备份数据目录,生成压缩包上传至OSS。 + - 方案二、将数据目录挂载到NAS [点此查看方案明细](https://git.jkwlstv.cn/doc/container/src/branch/main/nas-to-nfs-linux-docker.md) - 除此之外,还能把 Docker 也启用 SE Linux 更精细的控制文件访问权限。 +- [点击跳转查看 agentscope、agentscope-java 对于容器沙箱的支持](./agentscope-sandbox.md) ## 工具守卫 (Tool Guard)