sandbaseai/managed-agents

GitHub: sandbaseai/managed-agents

一个开源的 CMA 兼容企业级 AI agent 运行时,提供本地多 Agent 系统运行、治理与可观测性所需的全套基础设施。

Stars: 196 | Forks: 9

# managed-agents **SandBase managed-agents 是面向企业 AI agent 的安全、本地优先的 runtime 层。** `managed-agents` 提供了用于 session、工具、审批、沙盒执行、memory、credential vaults、audit trails、可重放事件以及运维可见性的 runtime 基础设施,帮助团队将 AI agent 从演示阶段推向生产环境。它公开了与 Claude Managed Agents 兼容的 Console 和 `/v1` 资源 API,同时默认将 runtime 元数据保存在项目外部的 SQLite 中。 使用它可以构建和运行自托管 AI agent、本地开发者 agent、桌面端 agent runtime、支持 MCP 的 workflow 以及企业概念验证,而无需将您的 runtime 层绑定到单一模型提供商。 ## 为什么选择 managed-agents? Agent SDK 非常适合编写 agent 循环。但生产级 agent 需要更多内容:状态、session 历史记录、工具治理、沙盒边界、credential 处理、memory、可审计性,以及供人类检查发生了什么的 Console。 `managed-agents` 专注于该 runtime 层。它不是可视化的 workflow 构建器,也不是另一个模型 SDK。它是一个开源的控制平面,用于在本地或自托管环境中运行、观察和治理 AI agent。 ## 功能 - Claude Managed Agents 风格的 Console 和 `/v1` 资源 API - 基于 SQLite 的 agent、skill、session、environment、credential vault、memory store、API key 和文件元数据 - 可恢复的 Server-Sent Events,用于 session 时间线、调试、审计和重放 - 文件资源、memory store、credential vault 和 environment 模板 - 用于共享本地 runtime 的本地 API key 和 bearer-token 身份验证 - 可选的 `agents/*.yaml` 和 `skills/*/SKILL.md` seed/import 文件夹 - 支持本地、Docker 和自托管 sandbox provider - MCP 工具集、内置工具、权限策略和 skill 包 - 兼容 OpenAI、兼容 Ollama 和 Anthropic 的模型 adapter - 可选的 TypeScript 便捷 SDK,位于 `managed-agents/sdk` ## 常见用例 - 运行本地 Claude Managed Agents 风格的 Console 以进行 agent 开发 - 构建具有可审计 session 和工具调用的自托管企业 AI agent - 构建客户支持、事件响应、研究、数据分析和软件工程 agent 的原型 - 打包可重用的 agent 模板、MCP 连接器、权限策略和 skill 以用于现场部署 - 将 agent runtime 嵌入未来的桌面应用程序或私有内部平台中 ## 要求 - Node.js 22 或更高版本 - npm 10 或更高版本 - 已配置的模型供应商 API key 或本地兼容 OpenAI 的 endpoint Docker 是可选的,仅在您需要 Docker 支持的 sandbox 时才需要。 ## 安装 通过 `npx` 使用 CLI: ``` npx managed-agents init npx managed-agents start ``` 或者全局安装: ``` npm install -g managed-agents managed-agents init managed-agents start ``` 对于源码构建: ``` git clone git@github.com:sandbaseai/managed-agents.git cd managed-agents npm ci npm run build ``` 然后在源码检出目录之外创建并运行一个 agent 工作区: ``` mkdir ../my-agents cd ../my-agents node ../managed-agents/dist/index.js init node ../managed-agents/dist/index.js start ``` ## 运行工作区 创建一个工作区: ``` mkdir my-agents cd my-agents npx managed-agents init ``` 如果您是从源码检出运行的,请将 `npx managed-agents` 替换为 `node /path/to/managed-agents/dist/index.js`。 启动 runtime: ``` npx managed-agents start # source checkout: # node /path/to/managed-agents/dist/index.js start ``` 打开 Dashboard: ``` http://127.0.0.1:3000/dashboard ``` 打开 `Settings > Models` 并配置单一工作区模型供应商:vendor、可选的 base URL 和 API key。Dashboard 将 Settings V2 存储在用户数据目录下的 runtime SQLite 数据库中。使用 `model: default` 的 agent 将通过该配置的供应商运行;具体的模型 ID 仍然是 adapter 所有的实现细节。正常的本地使用不需要修改源码控制的文件。 API 可在以下地址访问: ``` http://127.0.0.1:3000/v1 ``` 在 Dashboard 中,打开 `Settings > API reference` 以查看 Claude 风格的开发者参考页面。它显示了活动的 base URL、身份验证模式、分组的 endpoint、参数描述、返回字段,以及根据您正在运行的 runtime 生成的可复制的 `curl` 和 TypeScript SDK 示例。 ## 工作区布局 ``` my-agents/ +-- agents/ # Optional seed agent definitions | +-- assistant.yaml +-- skills/ # Optional seed skill packages | +-- example-skill/ | +-- SKILL.md +-- managed-agents.config.yaml ``` 默认情况下,Runtime 状态存储在仓库外部: ``` ~/.managed-agents/-/ +-- data.db # SQLite metadata store +-- files/ # Uploaded file bytes +-- skills/ # Uploaded custom skill package assets +-- snapshots/ # Session workspace snapshots +-- sandbox/ # Local session workspaces ``` 设置 `MANAGED_AGENTS_HOME` 或传递 `--data-dir` 以覆盖此位置。 ## Agent 定义 Agent 使用以下 Claude Managed Agents 风格的结构。Console/API 会生成稳定的 `agent_...` ID。`name` 是人类可读的标签,而不是文件系统路径或唯一性键。 ``` name: Incident commander description: Triages alerts, opens incident tickets, and coordinates status updates. model: default system: |- You are an on-call incident commander. Be decisive, cite the evidence you used, and recommend rollback when confidence is high. mcp_servers: - name: sentry type: url url: https://mcp.sentry.dev/mcp - name: linear type: url url: https://mcp.linear.app/mcp tools: - type: agent_toolset_20260401 default_config: enabled: true permission_policy: type: always_ask configs: - name: read enabled: true - name: grep enabled: true - name: bash enabled: true permission_policy: type: always_ask - type: mcp_toolset mcp_server_name: sentry default_config: permission_policy: type: always_allow - type: mcp_toolset mcp_server_name: linear default_config: permission_policy: type: always_allow skills: - type: anthropic skill_id: pdf metadata: template: incident-commander ``` 在常规路径下使用 `model: default`。工作区的 Settings 页面会将该名称映射到配置的供应商,并且每个供应商的 adapter 拥有其默认的具体模型 ID。Runtime 设置存储在 runtime 数据目录下的 SQLite 中。当 API 客户端需要诸如 `speed` 之类的额外控制时,它们也可以发送模型配置对象。 ## Dashboard Dashboard 提供了一个本地 Console,用于: - 创建和编辑 agent - 启动 session 并查看记录 - 检查 session 调试事件 - 创建 environment - 管理 credential vault - 上传文件 - 创建和编辑 memory store - 上传 skill - 创建和归档本地 API key - 阅读有关 `/v1` endpoint、SDK 片段和 Skill 上传示例的内置 API 参考 - 查看 Settings 中的 model、循环引擎行为、存储、sandbox、API key、API 参考、日志和监控 - 重启 runtime 并从 Settings 中查看最近的结构化日志 在 Dashboard 中打开 `Settings > API reference` 可查看活动的 base URL、身份验证模式、核心服务 endpoint、可复制的 `curl` 示例、SDK 片段以及所需的 Skill 包结构。 ## CLI ``` managed-agents init managed-agents start --host 127.0.0.1 --port 3000 managed-agents list managed-agents reload managed-agents chat --message "hello" managed-agents template list managed-agents template install managed-agents template create ``` ## API 示例 创建一个 agent: ``` curl -X POST http://127.0.0.1:3000/v1/agents \ -H "Content-Type: application/json" \ -d '{ "name": "Incident commander", "description": "Triages alerts and coordinates incident response.", "model": "default", "system": "You are an on-call incident commander.", "tools": [{ "type": "agent_toolset_20260401" }], "metadata": { "template": "incident-commander" } }' ``` 响应包含用于 session 的稳定 `agent_...` ID。Agent 名称是显示标签;通过 Console/API 创建的 agent 会接收服务器生成的 ID,并且不依赖从名称派生的标识符。 创建一个 environment: ``` curl -X POST http://127.0.0.1:3000/v1/environments \ -H "Content-Type: application/json" \ -d '{ "name": "Default cloud", "config": { "type": "cloud", "networking": { "type": "limited", "allow_mcp_servers": true, "allow_package_managers": true, "allowed_hosts": ["api.github.com"] }, "packages": { "type": "packages", "pip": ["pytest"], "npm": ["typescript"] } } }' ``` 响应包含用于 session 的稳定 `env_...` ID。Environment 名称是显示标签,不需要唯一。 创建一个 memory store: ``` curl -X POST http://127.0.0.1:3000/v1/memory_stores \ -H "Content-Type: application/json" \ -d '{ "name": "Incident notes", "description": "Long-lived incident context and follow-up notes.", "metadata": { "team": "platform" } }' ``` 上传一个 Skill 包: ``` zip -r code-review-assistant.zip code-review-assistant curl -X POST http://127.0.0.1:3000/v1/skills \ -F "files=@code-review-assistant.zip" ``` 该归档文件必须包含一个顶层目录和一个根 `SKILL.md` 文件: ``` code-review-assistant/ +-- SKILL.md +-- references/ +-- checklist.md ``` `SKILL.md` 必须以包含 `name` 和 `description` 的 YAML frontmatter 开头。服务器会生成稳定的 `skill_...` ID;Skill 名称从包元数据中读取,然后可以附加到 agent 上: ``` skills: - type: custom skill_id: skill_... ``` Memory store 名称是供人类和提示使用的标签;它们不需要是唯一的。将 store 挂载到 session 中时,请使用返回的 `memstore_...` ID。 创建一个 credential vault 并添加一个 credential: ``` curl -X POST http://127.0.0.1:3000/v1/credential-vaults \ -H "Content-Type: application/json" \ -d '{ "name": "production-tools" }' curl -X POST http://127.0.0.1:3000/v1/credential-vaults/vlt_.../credentials \ -H "Content-Type: application/json" \ -d '{ "name": "github-token", "auth_type": "environment_variable", "variable_name": "GITHUB_TOKEN", "value": "ghp_example", "network": { "type": "limited", "allowed_hosts": ["api.github.com"] }, "injection_locations": ["request_headers"] }' ``` Credential 记录使用 `mcp_oauth`、`bearer_token` 或 `environment_variable` 作为 `auth_type` 值。Secret 值在静态存储时加密,绝不会通过列表或检索响应返回。 创建一个 session: ``` curl -X POST http://127.0.0.1:3000/v1/sessions \ -H "Content-Type: application/json" \ -d '{ "agent": "agent_...", "environment_id": "env_...", "title": "Sentry alert triage", "resources": [ { "type": "memory_store", "memory_store_id": "memstore_...", "access": "read_write", "instructions": "Use this store for incident timelines and decisions." } ] }' ``` 发送一个用户事件: ``` curl -X POST http://127.0.0.1:3000/v1/sessions/SESSION_ID/events \ -H "Content-Type: application/json" \ -d '{ "events": [ { "type": "user.message", "content": [{ "type": "text", "text": "Investigate SENTRY-123." }] } ] }' ``` 恢复事件流: ``` curl -N http://127.0.0.1:3000/v1/sessions/SESSION_ID/events/stream \ -H "Last-Event-ID: 42" ``` ## SDK 用法 公共 API 旨在遵循 Claude Managed Agents 的资源结构。当您的 SDK 支持 managed-agent beta 资源时,请使用 `baseURL` 将官方 Anthropic SDK 指向本地 runtime: ``` import Anthropic from '@anthropic-ai/sdk'; const client = new Anthropic({ apiKey: process.env.MANAGED_AGENTS_API_KEY ?? 'local-dev-key', baseURL: 'http://127.0.0.1:3000', }); const session = await client.beta.sessions.create({ agent: 'agent_...', environment_id: 'env_...', title: 'SDK smoke test', }); await client.beta.sessions.events.send(session.id, { events: [ { type: 'user.message', content: [{ type: 'text', text: 'Hello' }], }, ], }); ``` 对于仅限本地的辅助工具(例如消息流式传输的便捷方法),该包还导出了一个基于相同 HTTP API 的小型 TypeScript wrapper: ``` import { ManagedAgentsClient } from 'managed-agents/sdk'; const client = new ManagedAgentsClient({ baseUrl: 'http://127.0.0.1:3000', }); const session = await client.sessions.create({ agent: 'agent_...', environment_id: 'env_...', title: 'SDK smoke test', }); for await (const event of client.sessions.chat(session.id, 'Hello')) { if (event.type === 'agent.message_chunk') { process.stdout.write(event.delta ?? ''); } } ``` ## 身份验证 本地开发默认是开放的。当存在至少一个 API key 时,身份验证就会开启。您可以从 Console/API 创建托管密钥,或配置静态密钥: ``` export MANAGED_AGENTS_API_KEY=sk-local-example ``` 静态密钥也可以在 `managed-agents.config.yaml` 中配置: ``` api_keys: - ${MANAGED_AGENTS_API_KEY} ``` 通过 API 创建托管密钥: ``` curl -X POST http://127.0.0.1:3000/v1/api-keys \ -H "Content-Type: application/json" \ -d '{ "name": "Local Console" }' ``` 然后客户端发送: ``` Authorization: Bearer sk-local-example ``` ## 文档 - [安装说明](docs/installation.md) - [使用指南](docs/usage.md) - [API 参考](docs/api.md) - [技能](docs/skills.md) - [架构](docs/spec/architecture.md) - [技术设计](docs/spec/design.md) - [贡献指南](CONTRIBUTING.md) ## 项目关键词 `enterprise-ai-agents`, `ai-agent-runtime`, `managed-agents`, `claude-managed-agents`, `self-hosted-ai`, `local-first`, `mcp`, `sandboxed-execution`, `agent-memory`, `credential-vaults`, `audit-log`, `session-replay`, `typescript`, `sqlite` ## 开发 ``` npm ci npm run typecheck npm test npm run build ``` 在开发期间运行 runtime 和 Dashboard: ``` npm run dev npm run dev:console ``` Dashboard 的 `Settings > Logs` 页面可以重启由 CLI 管理的服务器,并显示当前的进程日志缓冲区。Runtime 配置组织在 `Settings > Models`、`Settings > Loop engine`、`Settings > Storage`、`Settings > Memory` 和 `Settings > Sandbox` 下。每个页面都会编辑同一个版本化的 Settings V2 文档,支持 Form 和 JSON 模式,并且可以在保存之前验证或测试本地功能。只有在更改后的候选配置成功通过验证后,才会启用保存功能;如果需要重启,则保存的设置将在重启后成为有效的 runtime 配置。相同的日志控制也可通过 `POST /v1/x/restart` 和 `GET /v1/x/logs` 使用。 ## 发布检查 在发布版本之前: ``` npm ci npm run typecheck npm test npm run build ``` 对示例项目进行冒烟测试: ``` cd examples/basic npx managed-agents start --config managed-agents.config.yaml --agents-dir agents --skills-dir skills ``` ## 许可证 [Apache-2.0](LICENSE)
标签:AI智能体, DLL 劫持, MCP, MITM代理, 企业级, 大语言模型, 本地部署, 自动化攻击, 请求拦截, 运行时