以编程方式使用文档

部署托管深度代理会创建或更新托管的代理资源,并同步包含指令、技能、子代理和工具配置的托管文件树。部署不会创建 LangSmith 部署。有关部署创建的内容的更多信息,请参阅 已创建的资源.

选择适合您任务的界面:

  • - CLI 适用于大多数设置。
  • - SDK 适用于 Python 或 TypeScript 自动化。
  • - REST API 当您需要直接控制请求负载时。

本页面涵盖完整的部署工作流程:项目文件、MCP 工具、子代理、后端、共享代理更新和 REST API。对于更快的引导式设置,请参阅 快速入门.

前提条件

在部署之前,请确保您已具备:

  • - 托管深度代理 私人测试版访问权限.
  • - A LangSmith API 密钥 对于具有私人测试版访问权限的工作区,导出为 LANGSMITH_API_KEY.
  • - 适合您界面的客户端: deepagents-cli 对于 CLI,使用 managed-deepagents (Python) 或 @langchain/managed-deepagents (TypeScript) SDK 用于 SDK 工作流,或使用 curl 等 HTTP 客户端用于 REST API。有关安装命令和版本要求,请参阅 安装客户端 快速入门中的内容。

使用 CLI 从项目文件部署

CLI 创建本地项目、验证文件、检查引用的 MCP 服务器,并将项目部署到托管深度代理。有关所有命令和项目文件规则,请参阅 CLI 参考.

创建项目

创建托管深度代理项目:

deepagents init my-agent
cd my-agent

该命令生成:

文件或目录用途
agent.json配置托管代理名称、模型、后端和可选目标
AGENTS.md定义代理指令。
tools.json从空目录开始。注册 MCP 服务器后添加 MCP 支持的工具。
skills/example-skill/包含可编辑或删除的示例技能。
subagents/researcher/包含可编辑或删除的示例子代理。
.gitignore排除本地环境文件。

您也可以添加:

文件或目录用途
skills/<name>/包含代理可以使用的其他技能。
subagents/<name>/包含用于委托工作的其他子代理定义。

生成的 agent.json 使用可读的本地 CLI 格式:

{
  "name": "my-agent",
  "description": "A managed deep agent.",
  "model": "openai:gpt-5.5",
  "backend": {
    "type": "state"
  }
}

编辑 AGENTS.md 来定义代理的行为。部署同步到托管文件树的完整项目布局是:

my-agent/
  agent.json                       # Agent metadata, model, and backend
  AGENTS.md                        # Main agent instructions (system prompt)
  tools.json                       # Optional: MCP-backed tools
  skills/<name>/SKILL.md           # Optional: reusable procedures
  subagents/<name>/agent.json      # Optional: delegated worker metadata
  subagents/<name>/AGENTS.md       # Optional: delegated worker instructions
  subagents/<name>/tools.json      # Optional: subagent-scoped MCP tools

deepagents init 生成一个空的 tools.json、一个示例 技能和一个示例 子代理 以便在您注册 MCP 服务器之前初始部署成功。编辑或删除示例以适配您的代理。部署读取项目中的每个文件并将树同步到 Context Hub 代理仓库中。关于完整的字段参考,请参阅 CLI 参考.

添加 MCP 工具

要允许代理调用 MCP 工具, 注册 MCP 服务器 一次用于工作区,然后添加工具条目到项目 tools.json中。工具条目通过 URL 引用已注册的服务器。

注册服务器后,列出其工具并打印可粘贴的 tools.json snippet:

deepagents mcp-servers tools <id|name|url>

deepagents mcp-servers add 命令还会在注册后尝试列出工具。传递 --no-tools 当您想跳过该发现步骤时。

{
  "tools": [
    {
      "name": "example_tool",
      "mcp_server_url": "https://example.com/mcp",
      "mcp_server_name": "my-tools",
      "display_name": "example_tool"
    }
  ],
  "interrupt_config": {
    "https://example.com/mcp::example_tool": true
  }
}

每个工具需要 namemcp_server_url。该 mcp_server_namedisplay_name 字段是可选的。使用可选的 interrupt_config 对象来要求工具运行前的人工批准。按以下方式对每个条目进行键控 "{mcp_server_url}::{tool_name}" 并将其设置为 true.

部署在发送请求前验证引用的 MCP 服务器 URL。如果服务器 URL 未注册,部署会失败并提示添加它。关于服务器设置和 OAuth,请参阅 连接工具.

添加子代理

子代理是主代理可以为专注任务调用的委托工作者。添加一个 subagents/ 目录到项目根目录,然后为每个子代理创建一个目录。每个子代理目录需要一个 agent.json 和一个 AGENTS.md,并且可以包含自己的 tools.jsonskills/。子代理名称来自其目录名称。

my-agent/
  agent.json
  AGENTS.md
  subagents/
    researcher/
      agent.json
      AGENTS.md
      tools.json                   # Optional: subagent-scoped MCP tools
      skills/                      # Optional: subagent-local skills

子代理 agent.json 支持可选的 descriptionmodel:

{
  "description": "Researches a topic and returns concise findings with citations.",
  "model": "openai:gpt-5.5"
}

用于新项目。为了兼容性,遗留的 model 键在本地子代理文件中仍然有效,并且 REST API 子代理模式仍然使用 model_id 键仍在本地子代理文件中工作,REST API 子代理模式仍使用 model_id.

subagents/researcher/AGENTS.md:

# Researcher

Search for sources, take notes, and return concise findings with citations.

要赋予子代理其自身的 MCP 工具,请添加 subagents/researcher/tools.json 与项目级别相同的结构 tools.json。子代理名称不区分大小写地进行重复检查。

查看完整项目

工具和子代理位于外部 agent.json:工具位于 tools.json,子代理位于 subagents/ 目录。使用全部三个的项目结构如下:

research-assistant/
  agent.json
  AGENTS.md
  tools.json
  subagents/
    researcher/
      agent.json
      AGENTS.md
      tools.json

agent.json 专注于代理元数据、模型和后端:

{
  "name": "research-assistant",
  "description": "Research assistant that searches the web and delegates deep research.",
  "model": "openai:gpt-5.5",
  "backend": {
    "type": "state"
  }
}

AGENTS.md 定义主代理指令:

# Research assistant

You are a research assistant. Use the available tools to search for sources, and
delegate deep research to the `researcher` subagent. Return concise answers with
citations.

tools.json 引用主代理调用的工作区 MCP 服务器:

{
  "tools": [
    {
      "name": "web_search",
      "mcp_server_url": "https://example.com/mcp",
      "mcp_server_name": "my-tools"
    }
  ]
}

subagents/researcher/agent.json 设置子代理元数据和模型:

{
  "description": "Researches a topic and returns concise findings with citations.",
  "model": "openai:gpt-5.5"
}

subagents/researcher/AGENTS.md 定义子代理指令:

# Researcher

Search for sources, take notes, and return concise findings with citations.

subagents/researcher/tools.json 为子代理提供自己的 MCP 工具:

{
  "tools": [
    {
      "name": "web_search",
      "mcp_server_url": "https://example.com/mcp",
      "mcp_server_name": "my-tools"
    }
  ]
}

选择后端

CLI 生成的托管 Deep Agents 项目使用 state 后端位于 agent.json:

{
  "backend": {
    "type": "state"
  }
}

使用 LangSmith 沙盒 后端。当代理需要隔离环境执行代码、处理文件系统操作或运行长时间任务时使用。LangSmith 管理底层沙盒生命周期,而代理保持其线程或代理范围。

后端类型适用于
state不使用沙盒特定的后端行为。
sandboxsandbox_config.scope: "thread"将 LangSmith 沙盒资源限定到每个线程。
sandboxsandbox_config.scope: "agent"将 LangSmith 沙箱资源限定到代理。

在下面添加可选沙箱设置 backend in agent.json:

{
  "backend": {
    "type": "sandbox",
    "sandbox_config": {
      "scope": "thread",
      "policy_ids": ["policy-id"],
      "idle_ttl_seconds": 900,
      "delete_after_stop_seconds": 300
    }
  }
}

backend.sandbox_config 仅在以下情况有效 backend.type is sandbox。有关独立沙箱功能(如快照、服务 URL、权限、CLI 命令和 SDK 使用),请参阅 LangSmith 沙箱概述.

部署项目

部署本地项目:

deepagents deploy

要在部署前预览组装的负载和托管文件树,请运行 deepagents deploy --dry-run.

首次部署通过以下方式创建托管深度代理 /v1/deepagents/agents。后续部署使用本地部署状态更新同一远程代理。

成功后,CLI 打印代理名称、ID、简短修订版本、代理 URL 和部署后 MCP 健康检查:

Deployed: my-agent
  agent_id: e2de7a35-9dda-462b-b982-9e57051993bc
  revision: 13ac11f1
  https://smith.langchain.com/o/-/agents/e2de7a35-9dda-462b-b982-9e57051993bc
  health:   {'agent_id': '...', 'mcp_check': {'ok': True, 'servers': [{'url': 'https://example.com/mcp', 'ok': True}]}, ...}

以上 health 输出经过简化;它包含完整的 mcp_check 每个引用服务器的结果。 mcp_check.ok 的值为 True 确认代理可以访问其工具引用的 MCP 服务器。每次部署都会创建新的代理修订版本,即使托管文件没有更改,因为部署总是发送元数据更新。托管文件树本身仅在其内容发生变化时才会更改。

更新共享代理

对于共享仓库或有意更新现有托管深度代理,请设置目标代理的 agent_id in agent.json:

{
  "name": "my-agent",
  "agent_id": "agent-uuid",
  "model": "openai:gpt-5.5",
  "backend": {
    "type": "state"
  }
}

然后部署:

deepagents deploy

首次使用时,CLI 会在更新该远程代理之前要求您确认。要跳过确认,请传递 --yes:

deepagents deploy --yes

排查部署问题

症状原因和修复
部署失败并提示未注册的 MCP 服务器 URL某个工具引用了 tools.json 一个未在工作空间中注册的服务器。 请注册该服务器,然后重新部署。
mcp_check.ok is False 在部署输出中代理无法访问一个或多个被引用的 MCP 服务器。请在部署输出中找到失败的 URL servers,确认服务器正在运行且可访问,然后重新部署。
部署提示确认一个您未预期的更新agent.json 声明了一个 agent_id ,它指向一个现有的远程代理。继续之前请确认目标,或移除 agent_id 以创建新代理。
部署失败并提示 401 or 403LANGSMITH_API_KEY 缺失、无效或属于没有私有测试版访问权限的工作空间。请检查密钥并确认工作空间具有访问权限。

使用 SDK 或 API 创建或更新代理

将项目文件映射到 SDK 或 API 字段

创建和更新有效负载接受与 CLI 同步的相同项目结构。每个类型化字段映射到一个托管文件:

SDK 或 API 字段托管文件
name<br />description<br />model(SDK)<br />runtime.model.model_id(API)<br />backendagent.json
instructionsAGENTS.md
toolstools.json
subagents[]subagents/<name>/AGENTS.md 和可选的 subagents/<name>/tools.json
skills[]skills/<name>/SKILL.md 及支持文件
files任何未被类型化字段覆盖的路径

同时设置类型化字段和 files 条目来映射同一路径会返回 422 (例如, instructionsfiles["AGENTS.md"])。对于给定文件,请使用其中一个方式。完整的请求模式,请参阅 更新代理参考.

更新时,省略的字段将保持不变。嵌套结构化字段(如 tools, subagents, skillsextras )在包含时会被完整替换。

对请求进行身份验证和配置

对于 SDK 使用,请安装并配置 托管深度代理 SDK。对于直接 REST API 调用,请设置请求默认值:

API 请求需要 X-Api-Key header:

X-Api-Key: 

Python SDK 从环境变量中读取 LANGSMITH_API_KEY 。TypeScript SDK 使用显式 apiKey.

创建代理

使用与 CLI 在项目文件中维护的相同指令、工具、技能和子代理来创建代理:

REST API 将模型嵌套在 runtime.model.model_id下。SDK 和 CLI 使用顶级 model field.

Python SDK

from managed_deepagents import Client

with Client() as client:
    agent = client.agents.create(
        name="research-assistant",
        description="Research assistant that can search the web and summarize sources.",
        model="openai:gpt-5.5",
        backend={"type": "state"},
        instructions=(
            "You are a careful research assistant. Search for sources, "
            "keep notes, and return concise answers with citations."
        ),
        tools={
            "tools": [
                {
                    "name": "read_url_content",
                    "mcp_server_url": "https://example.com/mcp",
                    "mcp_server_name": "my-tools",
                }
            ],
            "interrupt_config": {
                "https://example.com/mcp::read_url_content": True,
            },
        },
        skills=[
            {
                "name": "summarize",
                "description": "Summarize long source documents.",
                "instructions": (
                    "# Summarize\n\n"
                    "Extract the main claims, supporting evidence, and open questions."
                ),
            }
        ],
        subagents=[
            {
                "name": "source-checker",
                "description": "Verify facts and source quality.",
                "model_id": "openai:gpt-5.5",
                "instructions": (
                    "Check whether cited sources support the draft answer. "
                    "Return a concise risk assessment."
                ),
            }
        ],
        include_files=True,
    )

agent_id = agent["id"]
print(f"Agent ID: {agent_id}")

该调用返回创建的代理。传递 include_files=True 也可返回托管文件树。

TypeScript SDK

const client = new Client();

const agent = await client.agents.create(
  {
    name: "research-assistant",
    description: "Research assistant that can search the web and summarize sources.",
    model: "openai:gpt-5.5",
    backend: { type: "state" },
    instructions:
      "You are a careful research assistant. Search for sources, keep notes, and return concise answers with citations.",
    tools: {
      tools: [
        {
          name: "read_url_content",
          mcp_server_url: "https://example.com/mcp",
          mcp_server_name: "my-tools",
        },
      ],
      interrupt_config: {
        "https://example.com/mcp::read_url_content": true,
      },
    },
    skills: [
      {
        name: "summarize",
        description: "Summarize long source documents.",
        instructions:
          "# Summarize\n\nExtract the main claims, supporting evidence, and open questions.",
      },
    ],
    subagents: [
      {
        name: "source-checker",
        description: "Verify facts and source quality.",
        model_id: "openai:gpt-5.5",
        instructions:
          "Check whether cited sources support the draft answer. Return a concise risk assessment.",
      },
    ],
  },
  { includeFiles: true },
);

console.log(`Agent ID: ${agent.id}`);

该调用返回创建的代理。传递 { includeFiles: true } 也可返回托管文件树。

cURL

curl --request POST \
  --url "$DEEPAGENTS_BASE_URL/agents" \
  --header "X-Api-Key: $LANGSMITH_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "research-assistant",
    "description": "Research assistant that can search the web and summarize sources.",
    "runtime": {
      "model": {
        "model_id": "openai:gpt-5.5"
      }
    },
    "backend": {
      "type": "state"
    },
    "instructions": "You are a careful research assistant. Search for sources, keep notes, and return concise answers with citations.",
    "tools": {
      "tools": [
        {
          "name": "read_url_content",
          "mcp_server_url": "https://example.com/mcp",
          "mcp_server_name": "my-tools"
        }
      ],
      "interrupt_config": {
        "https://example.com/mcp::read_url_content": true
      }
    },
    "skills": [
      {
        "name": "summarize",
        "description": "Summarize long source documents.",
        "instructions": "# Summarize\n\nExtract the main claims, supporting evidence, and open questions."
      }
    ],
    "subagents": [
      {
        "name": "source-checker",
        "description": "Verify facts and source quality.",
        "model_id": "openai:gpt-5.5",
        "instructions": "Check whether cited sources support the draft answer. Return a concise risk assessment."
      }
    ]
  }'

更新现有代理

更新代理时,只需包含您想要更改的字段。替换 <agent_id> 使用创建代理时返回的ID:

Python SDK

from managed_deepagents import Client

agent_id = "<agent_id>"

with Client() as client:
    agent = client.agents.update(
        agent_id,
        description="Research assistant with stricter citation rules.",
        instructions=(
            "You are a careful research assistant. Search for sources, "
            "keep notes, and cite every factual claim."
        ),
        tools={
            "tools": [
                {
                    "name": "read_url_content",
                    "mcp_server_url": "https://example.com/mcp",
                    "mcp_server_name": "my-tools",
                }
            ],
            "interrupt_config": {
                "https://example.com/mcp::read_url_content": True,
            },
        },
        include_files=True,
    )

print(agent.get("revision"))

TypeScript SDK

const client = new Client();

const agentId = "<agent_id>";

const agent = await client.agents.update(
  agentId,
  {
    description: "Research assistant with stricter citation rules.",
    instructions:
      "You are a careful research assistant. Search for sources, keep notes, and cite every factual claim.",
    tools: {
      tools: [
        {
          name: "read_url_content",
          mcp_server_url: "https://example.com/mcp",
          mcp_server_name: "my-tools",
        },
      ],
      interrupt_config: {
        "https://example.com/mcp::read_url_content": true,
      },
    },
  },
  { includeFiles: true },
);

console.log(agent.revision);

cURL

curl --request PATCH \
  --url "$DEEPAGENTS_BASE_URL/agents/<agent_id>?include_files=true" \
  --header "X-Api-Key: $LANGSMITH_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{
    "description": "Research assistant with stricter citation rules.",
    "instructions": "You are a careful research assistant. Search for sources, keep notes, and cite every factual claim.",
    "tools": {
      "tools": [
        {
          "name": "read_url_content",
          "mcp_server_url": "https://example.com/mcp",
          "mcp_server_name": "my-tools"
        }
      ],
      "interrupt_config": {
        "https://example.com/mcp::read_url_content": true
      }
    }
  }'

要在更新期间删除原始托管文件,请发送 deleted_paths,一个相对文件路径数组(例如, ["docs/old-notes.md"])。要删除结构化部分(如所有技能或子代理),请使用空列表发送该字段。

添加原始托管文件

使用顶级 files 来处理无法干净映射到 instructions, tools, skills, or subagents:

Python SDK

from managed_deepagents import Client

with Client() as client:
    agent = client.agents.update(
        "<agent_id>",
        files={
            "docs/research-style.md": "Prefer primary sources and note uncertainty.",
            "data/glossary.md": {"content": "# Glossary\n\nDefine domain terms here."},
        },
        include_files=True,
    )

TypeScript SDK

const client = new Client();

const agent = await client.agents.update(
  "<agent_id>",
  {
    files: {
      "docs/research-style.md": "Prefer primary sources and note uncertainty.",
      "data/glossary.md": { content: "# Glossary\n\nDefine domain terms here." },
    },
  },
  { includeFiles: true },
);

cURL

curl --request PATCH \
  --url "$DEEPAGENTS_BASE_URL/agents/<agent_id>?include_files=true" \
  --header "X-Api-Key: $LANGSMITH_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{
    "files": {
      "docs/research-style.md": {
        "content": "Prefer primary sources and note uncertainty."
      },
      "data/glossary.md": {
        "content": "# Glossary\n\nDefine domain terms here."
      }
    }
  }'

检查代理健康状态

创建或更新后,使用SDK或API检查代理的后端和工具健康状态:

Python SDK

from managed_deepagents import Client

with Client() as client:
    health = client.agents.health("<agent_id>")

print(health)

TypeScript SDK

const client = new Client();

const health = await client.agents.health("<agent_id>");

// JSON.stringify (not console.log(health)) so nested objects print in full:
// console.log uses util.inspect with depth 2, which collapses deeper values to
// "[Object]" — e.g. the entries inside mcp_check.servers.
console.log(JSON.stringify(health, null, 2));

cURL

curl --url "$DEEPAGENTS_BASE_URL/agents/<agent_id>/health" \
  --header "X-Api-Key: $LANGSMITH_API_KEY"

结果使用相同的 mcp_check 形状,如 部署输出中所示.

使用API管理代理生命周期

使用代理管理路由进行生命周期自动化:

任务路由
创建代理POST /v1/deepagents/agents
列出代理GET /v1/deepagents/agents
获取代理GET /v1/deepagents/agents/{agent_id}
更新代理PATCH /v1/deepagents/agents/{agent_id}
删除代理DELETE /v1/deepagents/agents/{agent_id}

后续步骤

创建或部署代理后, 运行它 通过创建线程并流式传输运行。