mda CLI 用于测试和部署代码优先的 Managed Deep Agents。它包含在 managed-deepagents 的 npm 和 Python 包中。
托管深度代理目前处于私有测试阶段,仅在LangSmith Cloud的美国区域提供。加入等待列表以申请访问权限。
安装
安装用于编写代理的语言的相应包。两个包都暴露了mda 二进制文件。对于 npm,可以全局安装或使用 npm exec 运行二进制文件。
pip install --pre managed-deepagents 会安装 mda CLI。由 mda init 生成的 Python 项目有自己的 pyproject.toml;在进行本地开发或部署之前,请在该项目中运行 uv sync 以安装项目依赖项。
TypeScript 包提供了代理、身份验证、连接器、通道、计划任务和沙箱的编写 API。Python 包提供了相同的功能接口(使用蛇形命名法),并额外提供了 mda 控制台脚本。
身份验证
mda deploy 按以下顺序读取 API 密钥:
LANGGRAPH_HOST_API_KEYLANGSMITH_API_KEYLANGCHAIN_API_KEY
.env 文件中读取这些值,然后从进程环境中读取。如果在交互式终端中未找到密钥,mda deploy 将提示输入 LangSmith API 密钥并将其保存到项目 .env 文件中。
.env
LANGSMITH_TENANT_ID 或向 mda deploy 传递 --tenant-id 参数。
LangSmith API 密钥用于验证部署。代理的模型提供商在运行时也需要凭据。在 .env 中设置提供商密钥,在 shell 中导出它,或将其配置为 LangSmith 工作区密钥。例如,openai:gpt-5.5 需要 OPENAI_API_KEY。
mda deploy 会将非保留的 .env 条目(例如 OPENAI_API_KEY、MCP 令牌和自定义工具凭据)作为托管部署密钥进行转发。保留的平台变量(包括 LANGSMITH_API_KEY、LANGGRAPH_HOST_API_KEY、LANGCHAIN_API_KEY 和 LANGSMITH_TENANT_ID)用于 CLI 身份验证和部署路由,但不会作为用户管理的部署密钥上传。
命令概览
初始化项目
使用mda init 创建新的项目目录:
该命令根据当前目录检测语言:
项目模板创建:
评估项目
使用mda evals 来搭建 Harbor 风格的任务并编译 Harbor 交接。Harbor 运行这些试验:
mda evals compile 标志:
关于任务布局、验证器、身份验证夹具以及运行 Harbor 的详细信息,请参阅 评估。
本地开发
使用mda dev 编译项目并运行本地 LangGraph 开发服务器:
mda dev 编译到 .mda/build,然后从该目录启动特定语言的 LangGraph 开发服务器:
对于 Python 项目,请在运行
mda dev 前安装 uv。CLI 会自动解析本地 LangGraph 开发服务器,因此您无需自己安装 langgraph-cli[inmem]。
当配置了沙箱时,mda dev 会尝试使用配置的提供商。如果提供商凭据不可用或提供商创建失败,它会回退到本地临时目录沙箱,并打印所选的路径。
对于本地开发,mda dev 会将项目 .env 文件暂存到 .mda/build/.env,以便 LangGraph 可以加载模型提供商密钥和连接器令牌。
部署项目
使用mda deploy 编译项目并将其部署到 LangSmith:
部署运行以下步骤:
- 验证项目目录并加载代理入口文件。
- 解析 LangSmith API 密钥和可选的租户 ID。
- 收集非保留的
.env值作为托管部署密钥。 - 验证模型提供商 API 密钥是否可从
.env、shell 环境或 LangSmith 工作区密钥获取。 - 将部署拥有的上下文同步到 Context Hub。
- 将项目编译到
.mda/build并提取可选的schedules/声明。 - 按名称创建或查找一个 LangSmith 托管部署。
- 归档构建、上传并触发远程构建。
- 轮询修订版本直到其状态变为
DEPLOYED,除非设置了--no-wait。 - 为计划任务协调托管的 LangSmith cron 作业,除非设置了
--no-wait。
项目文件参考
Managed Deep Agents 项目使用代码优先的布局:agent.py、agent.ts 或 agent.tsx。它必须导出一个使用 define_deep_agent 或 defineDeepAgent 创建的、名为 agent 的定义。tools/ 和 middleware/ 文件夹是常规做法,并非特殊的注册表:托管的智能代理将普通项目文件组织在内,因此代理导入的任何本地模块都能正常工作。当这些文件夹存在时,命令行工具会将剩余文件视为托管的系统提示(instructions.md)、身份标识(identity.*)、连接器(connectors/**)、消息通道(channels/**)、定时任务(schedules/**)、技能(skills/**)、沙箱配置(sandbox/)以及本地 Harbor 评测任务(evals/)。
只需要项目根目录下的 agent.ts、agent.tsx 或 agent.py。CLI 按此顺序检测第一个可用的入口文件。
代理入口
代理入口必须导出一个命名的agent 定义,该定义使用 define_deep_agent 或 defineDeepAgent 创建。有关最小示例,请参阅 快速入门。
该定义接受 Deep Agents 的 createDeepAgent 配置接口,但托管的密钥除外。设置托管密钥会导致错误。
自定义工具和中间件
将项目拥有的工具和中间件放在本地模块中(例如tools/ 和 middleware/),从代理入口导入它们,并通过 tools 和 middleware 字段传递。CLI 会将这些文件复制到编译后的构建中,而不会重写它们。
有关示例,请参阅 自定义工具 和 自定义中间件。
身份验证
可以选择从项目根目录下的identity.ts 或 identity.py 导出一个命名的 identity 声明,该文件使用 defineIdentity / define_identity(或 .preset(...))创建。
如果存在,mda 会生成自定义身份验证处理程序,将其注入编译后的应用程序,并根据该声明限定线程、内存和存储访问范围。没有身份验证的项目保留之前的编译输出。关于预设、入口模式、访客令牌和 runtime.identity,请参阅 身份验证。
指令
将系统提示词放在项目根目录代理入口文件旁边的instructions.md 中。
mda dev 会将提示词嵌入生成的入口中。mda deploy 将提示词同步到 Context Hub,部署的运行时会从那里读取它。
技能
将部署拥有的技能放在项目根目录代理入口文件旁边的skills/ 下。部署会将 skills/** 下的每个 UTF-8 文件同步到 Context Hub,并删除不再存在于本地的陈旧已部署技能。
记忆
托管的记忆与已部署的指令和技能位于同一个 Context Hub 仓库中。运行时将一个限定范围的树重新挂载为/memories/user/(热路径 /memories/user/AGENTS.md 加上可选的冷文件)以及可选的组织事实作为 /memories/org/(只读)。部署会在需要时播种代理记忆,并同步 instructions.md 和 skills/**,但不会覆盖现有的 Context Hub memories/** 文件。关于热/冷分层、身份重新挂载、组织记忆和 disableMemory,请参阅 记忆。
连接器
将连接器声明为connectors/ 下的模块。发现机制与名称无关:每个文件都是一个连接器模块(会忽略包的 __init__.py 文件)。
- MCP:
connectors/mcp.ts或connectors/mcp.py必须导出一个命名的mcp声明。支持远程http和sse服务器;stdio 会被拒绝。如果存在,mda会注入@langchain/mcp-adapters或langchain-mcp-adapters,并将加载的 MCP 工具附加到自定义工具中。 - GitHub:
connectors/github.ts或connectors/github.py声明仓库检出、GitHub CLI 安装和托管沙箱的凭据注入。 - LangSmith:
connectors/langsmith.ts或connectors/langsmith.py为不受信任的调用者声明受限制的 LangSmith 功能。需要 身份验证。浏览器端永远不会收到LANGSMITH_API_KEY。
通道
将消息通道声明为channels/ 下的模块。每个文件导出一个命名的 channel(例如 defineSlackChannel / defineGitHubChannel)。文件主干部分成为通道名称,并在 Agent Server 上挂载 POST /channels/{name}/events。通道需要根 身份验证 声明。
- Slack:
channels/slack.ts或channels/slack.py。部署会预检SLACK_SIGNING_SECRET和SLACK_BOT_TOKEN(来自通道清单的requiredEnv)。 - GitHub:
channels/github.ts或channels/github.py,包含有序的handlers(on、prompt、可选的repositories/autoReply)。部署会预检GITHUB_WEBHOOK_SECRET、GITHUB_APP_ID、GITHUB_APP_PRIVATE_KEY和GITHUB_INSTALLATION_ID。
计划任务
在schedules/ 下声明托管的 cron 计划任务。每个直接子计划任务文件必须从 defineSchedule(...) 或 define_schedule(...) 导出一个命名的 schedule 声明。
部署从静态字面量、数组、对象和顶层字面量常量中提取计划任务声明。计划任务可以通过 deliver_to / deliverTo 将其最终响应发送到配置的 Slack 通道。部署状态达到 DEPLOYED 后,mda deploy 会将现有的托管 LangSmith cron 作业替换为当前的本地计划任务声明。有关示例和约束,请参阅 计划任务。
沙箱
要配置托管沙箱,请从 TypeScript 的sandbox/index.ts 或 Python 的 sandbox/__init__.py 导出 sandbox。作用域默认为每个线程一个沙箱;scope: "agent" 表示在代理进程中共享一个。如果存在 sandbox/setup.sh,则在配置新的托管沙箱时运行一次。
有关配置示例和生命周期行为,请参阅 配置沙箱。
评估
将 Harbor 风格的评估任务放在evals/ 下。每个任务目录包括 instruction.md、task.toml、一个 environment/ 镜像和一个 tests/test.sh 验证器。当项目声明了 身份验证 时,每个任务还需要 identity.json。
mda init 会在 evals/ 下搭建起始评估任务。对于现有项目,使用 mda evals init。使用 mda evals compile 编译 Harbor 交接,然后用 Harbor 运行试验。工件位于 .mda/evals/ 下,并且不属于部署归档的一部分。关于完整工作流,请参阅 评估。
忽略的路径
项目加载器会跳过以下目录:.env 和 .env.* 文件。mda dev 仅将根目录下的 .env 暂存到 .mda/build/.env 用于本地开发;部署仍然会将非保留的 .env 条目作为托管密钥转发,而不是归档该文件。
代理定义参考
define_deep_agent 和 defineDeepAgent 接受完整的 Deep Agents create_deep_agent 配置接口,但托管的密钥除外。设置作者拥有的字段以配置行为。
作者设置的字段
托管的字段
托管运行时负责管理backend、store、checkpointer、memory、skills 以及系统提示词。请勿在代理定义中设置这些字段。
有关完整字段列表,请参阅代理定义参考。
故障排除
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

