对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs 菜单

调用代理

在本指南中,您可以学习;了解如何调用MongoDB Atlas助手引擎上已部署的代理。本指南展示了如何调用API 、从CLI调用代理、将自定义标头转发到代理以及恢复暂停的执行。

要生成这些请求使用的API密钥或服务帐户凭证,请参阅管理API密钥和服务帐户。

调用API是客户端用来调用已部署代理的API 。 Atlas Agent Engine 会代表代理公开这些端点,因此您的代理代码无需定义任何HTTP路由或启动 Web服务器。

要调用代理,请向 /api/v1/projects/{project_id}/workspaces/{workspace_id}/invoke API端点发送 POST请求。响应返回执行结果和执行状态。平台在 X-Session-ID 响应标头中返回会话ID 。

以下 curl示例就使用了这些占位符:

  • $API_KEY:您的Atlas Agent Engine API密钥

  • $PROJECT_ID:您的项目ID

  • $WORKSPACE_ID:您的工作区ID

选择首选语言对应的标签页,查看示例请求:

curl -s "https://agentengine.mongodb.com/api/v1/projects/$PROJECT_ID/workspaces/$WORKSPACE_ID/invoke" \
-X POST \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"message": "Hello, agent!"}'
import httpx
response = httpx.post(
f"https://agentengine.mongodb.com/api/v1/projects/{project_id}/workspaces/{workspace_id}/invoke",
headers={"Authorization": f"Bearer {api_key}"},
json={"message": "Hello, agent!"},
timeout=60.0,
)
result = response.json()

响应输出类似于以下内容:

{
"success": true,
"response": "<agent output>",
"execution_id": "string",
"status": "completed"
}

如果暂停执行以供人工查看,则响应还包括 suspend_reason 和 suspend_context 字段。要学习;了解更多信息,请参阅《人在环》指南中的暂停、查看和恢复生命周期。

要在代理生成后流输出,请向 /api/v1/projects/{project_id}/workspaces/{workspace_id}/invokeStream API端点发送 POST请求。平台以服务器发送事件 (SSE) 帧流的形式返回响应。流保持连接打开状态,直到运行完成或失败。

每个 SSE 框架都以 data: 前缀开头,并包含一个JSON对象。以下示例显示了流媒体帧的格式:

data: {"chunk_type": "text", "content": "Hello, agent!", "metadata": {}, "execution_id": "string"}

帧可以包含以下字段:

字段
说明

chunk_type

标识数据块的类型。以下部分列出了可能的值。

content

数据数据块有效负载。对于 text 数据段,该字段保存代理生成的输出的增量。

metadata

描述数据块的结构化元数据。

execution_id

标识生成该数据块的执行。当执行ID可用时,平台会包含此字段。

下表描述了流可以承载的数据块类型:

数据段类型
说明

text

代理生成的输出的增量。

step

工具在执行过程中发出的进度更新。

subagent_start

标记子代理执行的开始。仅当禁用护栏时,平台才会发出此数据块。

subagent_end

标记子代理执行的结束。仅当禁用护栏时,平台才会发出此数据块。

done

运行完成后标记流的结束。

error

运行失败后标记流的结束。该帧还包含错误消息。

如果运行失败,该流会发送一个包含错误消息的 error数据块。然后,该流将关闭。

如果您在 agent.yaml文件中将 features.use_custom_parser 标志设立为 true,流仅携带代理的输出解析器或其 emit_custom_event() 调用生成的自定义事件。平台将每个自定义事件作为单个 data: 框架转发,因此该框架准确包含代理发出的JSON对象。该流不包含 text、step 或 done 帧等标准数据段,并且会在运行完成时关闭。

该平台仅在 invokeStream 端点上传递自定义事件。同步 invoke 端点将返回代理的最终输出。

如果未启用此功能标志,则流将使用本节前面所述的数据块格式。该流不传递自定义事件,代理代码中的 emit_custom_event() 调用会引发错误。

Atlas Agent Engine 还公开以下API端点,用于流媒体、轮询、恢复和停止执行:

方法和路径
用途

POST /api/v1/projects/{project_id}/workspaces/{workspace_id}/invokeStream

使用 Server-Sent Events 协议在生成代理输出时以增量方式流式传输该输出。

GET /api/v1/projects/{project_id}/executions/{execution_id}?workspace_id={workspace_id}

轮询执行状态和结果。

POST /api/v1/projects/{project_id}/executions/{execution_id}/resume?workspace_id={workspace_id}

恢复暂停的执行。请求正文包含审核者的决定。要学习;了解更多信息,请参阅《人机交互指南》中的“使用API” 。

POST /api/v1/projects/{project_id}/executions/{execution_id}/cancel?workspace_id={workspace_id}

POST /api/v1/projects/{project_id}/executions/{execution_id}/interrupt?workspace_id={workspace_id}

每个 executions/** 端点都需要 workspace_id查询参数。网关使用此值将请求路由到所属工作区的编排引擎。

注意

取消或中断已达到最终状态的执行是幂等的。请求响应报告请求未进行任何更改。

执行会在 pending、running、completed 或 error 状态之间切换。

如果执行暂停以进行人工查看,则它会在完成之前经历其他状态。要学习;了解暂停和恢复生命周期,请参阅“人在环”指南中的暂停、查看和恢复生命周期。

如果取消执行,它将进入 cancelled 状态。此状态不同于 completed 和 error,因此API和用户界面客户端可以区分故意停止的执行和已完成或失败的执行。要学习;了解更多信息,请参阅取消会话。

Atlas Agent Engine 不会自动伸缩代理部署。 agent.yaml文件中的 scaling.replicas字段设置固定的沙箱数量,每个会话在其生命周期内保留一个代理沙箱和一个工具沙箱。因此,该字段设置部署可以同时提供服务的会话数。

scaling.replicas字段接受从 1 到 512 之间的值,如果省略,则默认为 4。当每个沙箱都被保留时,新的调用请求将失败并显示 pool full 错误。

512 并发沙箱限制适用于业务流程引擎,其范围仅限于一个项目,并且可以为多个代理提供服务。项目中所有代理的 scaling.replicas 值计入相同的上限。要运行的沙箱数量超过一个项目允许的数量,请将代理分布在多个项目中。

为防止调用请求耗尽池,请在请求之间重复使用会话 ID。股票会话ID的请求会重复使用一个预留,但省略会话ID的请求会使用一对新的沙箱。会话ID 的长度必须为 1 到 128 个字符,可以包含字母、数字、下划线 (_) 和连字符 (-)。在 agentengine invoke 命令的 --session 选项或API请求的 X-Session-ID 标头中传递会话ID 。

如果您的调用请求需要按会话隔离性,则无法重复使用会话ID。要同时为更多会话提供服务,请增加 scaling.replicas 值,或减少 scaling.agent_idle_ttl_seconds 和 scaling.tool_idle_ttl_seconds 值,以便空闲会话更快发布其沙箱。

由于Atlas助手引擎会在构建时对 scaling 值进行快照,因此您必须再次构建并部署代理才能使更改生效。要学习;了解有关这些字段的更多信息,请参阅代理合同参考。要查看公开预览版期间应用的所有限制,请参阅MongoDB Atlas助手引擎限制。

在本节中,您可以学习;了解如何将自定义HTTP 头部(例如用户 ID)从应用程序传递到在Atlas助手引擎上运行的代理。然后,您的代理可以使用 get_current_custom_headers() 方法在运行时读取这些标头。

在调用或恢复请求, API Gateway 通过执行以下步骤处理带有前缀 X-Mdb-Agent-Engine-Custom- 的HTTP 头部:

  1. API网关提取标头。

  2. 网关去掉前缀,并将标头名称小写。示例,X-Mdb-Agent-Engine-Custom-Authorization 变为 authorization。

  3. 网关将标头作为字典转发给代理。

标头通过执行管道在内存中转发,从不持久保存到数据库,并在执行完成时被管道丢弃。

注意

Atlas Agent Engine 不会保留自定义标头。您的应用程序必须根据每个请求(包括恢复请求)重新发送这些消息。

下表显示了自定义标头的限制:

Limit
值

自定义标头的最大数量

50

每个标头的最大大小

8 KiB

将 X-Mdb-Agent-Engine-Custom- 前缀标头添加到您的调用请求。 API网关会在代理收到前缀之前将其去掉。

以下示例使用与调用API示例相同的占位符。它们还为您要转发的自定义标头使用占位符。

选择首选语言的标签页,查看带有自定义标头的调用请求:

curl -s "https://agentengine.mongodb.com/api/v1/projects/$PROJECT_ID/workspaces/$WORKSPACE_ID/invoke" \
-X POST \
-H "Authorization: Bearer $API_KEY" \
-H "X-Mdb-Agent-Engine-Custom-Authorization: my-user-id" \
-H "X-Mdb-Agent-Engine-Custom-Tenant-Id: acme-corp" \
-H "Content-Type: application/json" \
-d '{"message": "Hello, agent!"}'
import httpx
response = httpx.post(
f"https://agentengine.mongodb.com/api/v1/projects/{project_id}/workspaces/{workspace_id}/invoke",
headers={
"Authorization": f"Bearer {api_key}",
"X-Mdb-Agent-Engine-Custom-Authorization": "my-user-id",
"X-Mdb-Agent-Engine-Custom-Tenant-Id": "acme-corp",
},
json={"message": "Hello, agent!"},
)

运行上述代码后,代理会收到以下字典:

{"authorization": "my-user-id", "tenant-id": "acme-corp"}

使用任何工具内 agent_engine_runner_shared 的 get_current_custom_headers() 方法访问权限API网关转发给代理的标头。以下Python代码展示了如何使用 get_current_custom_headers()访问权限转发的标头:

from agent_engine_sdk_langgraph import App
from agent_engine_runner_shared import get_current_custom_headers
app = App(app_name="My Agent")
@app.tool(is_local=True)
def call_external_api(query: str) -> str:
"""Call an external API using the caller's user ID."""
headers = get_current_custom_headers()
user_id = headers.get("authorization", "")
tenant = headers.get("tenant-id", "")
response = httpx.get(
"https://api.example.com/data",
headers={"Authorization": user_id, "X-Tenant-Id": tenant},
params={"q": query},
)
return response.text

get_current_custom_headers() 方法返回一个 dict[str, str]。如果网关未发送任何自定义标头,该方法将返回一个空字典。

转发自定义标头也适用于恢复请求。由于Atlas助手引擎不会保留自定义标头,因此在恢复暂停的执行时,您必须重新发送相同的 X-Mdb-Agent-Engine-Custom- 标头。有关转发自定义标头的恢复请求示例,请参阅《Human-in-the-Loop》指南中的“使用API” 。

取消客户端的请求只会关闭您一侧的连接。该执行将在服务器上保持运行,直到您通过Atlas助手引擎将其停止。

Atlas Agent Engine 提供以下方法来停止已在运行的工作:

要取消正在进行的执行,请向 /api/v1/projects/{project_id}/executions/{execution_id}/cancel 端点发送 POST请求并设立workspace_id查询参数。该请求不带正文。

选择您的首选语言的标签页,查看取消执行的示例:

curl -X POST "https://agentengine.mongodb.com/api/v1/projects/$PROJECT_ID/executions/$EXECUTION_ID/cancel?workspace_id=$WORKSPACE_ID" \
-H "Authorization: Bearer $API_KEY"
import httpx
response = httpx.post(
f"https://agentengine.mongodb.com/api/v1/projects/{project_id}/executions/{execution_id}/cancel",
params={"workspace_id": workspace_id},
headers={"Authorization": f"Bearer {api_key}"},
)

响应输出类似于以下内容:

{
"execution_id": "string",
"cancelled": true,
"status": "cancelled"
}

cancelled字段报告此请求是否将执行状态设立为 cancelled。对于 cancelled 执行,字段值为 true;当请求由于已达到最终状态而未转换执行时,字段值为 false,包括先前请求中的 cancelled。当字段值为 false 时,status字段会报告记录的终端状态。

取消执行时, Atlas助手引擎会执行以下操作:

  • 取消正在进行的工具或 LLM 调用,拆除会话的代理沙箱和工具沙箱,并释放容量插槽。新的执行可以重复使用该槽。

  • 取消同一会话上的所有其他实时执行,包括作为目标执行子项的深度代理和代理到代理执行。

  • 结束打开的响应流,而不是让流保持打开状态直到超时。

  • 对取消之前会话所累积的运行时间进行计费。

注意

您无法恢复已取消的执行。要向代理发送另一条消息,请再次调用代理。该请求会启动新的执行,而不是恢复已取消的执行。

您还可以从 Playground用户界面停止运行,而不是调用 cancel API端点。从 Playground 停止运行与取消会话具有相同的效果。要学习;了解更多信息,请参阅取消会话。

要从 Playground 停止运行,请执行以下步骤:

1

Go您部署的 Playground用户界面URL 。

2

在运行过程中,单击聊天栏中的红色停止按钮以打开确认对话框。

3

在对话框中,单击 Stop run。这会停止运行并释放会话的计算资源。

中断工具或 LLM 调用仅会停止该调用。会话保持活动状态,代理从中断的结果中继续运行。当单个呼叫卡住或不需要并且您不想取消整个会话时,请中断呼叫。

要中断调用,请向 /api/v1/projects/{project_id}/executions/{execution_id}/interrupt API端点发送 POST请求。该请求采用以下参数:

Parameter
类型
必需
说明

workspace_id

查询参数

是

拥有执行的工作区。 Atlas Agent Engine 使用此值将中断请求路由到该工作区的编排引擎。如果省略此参数,请求将失败,并显示 400 错误消息。

step_number

正文字段

No

对中断的单次调用的执行步骤。如果省略此字段, Atlas助手引擎会中断每个正在进行的调用。

选择您的首选语言的标签页,查看中断工具或 LLM 调用的示例:

curl -X POST "https://agentengine.mongodb.com/api/v1/projects/$PROJECT_ID/executions/$EXECUTION_ID/interrupt?workspace_id=$WORKSPACE_ID" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"step_number": 12}'
import httpx
response = httpx.post(
f"https://agentengine.mongodb.com/api/v1/projects/{project_id}/executions/{execution_id}/interrupt",
params={"workspace_id": workspace_id},
headers={"Authorization": f"Bearer {api_key}"},
json={"step_number": 12},
)

响应输出类似于以下内容:

{
"execution_id": "string",
"interrupted": true,
"interrupted_steps": [ 12 ],
"pending": false,
"outcome": "aborted"
}

outcome字段描述中断请求的结果并返回以下值之一:

值
说明

aborted

Atlas Agent Engine 已停止进行中的呼叫。 interrupted_steps字段列出了它停止的步骤。

armed

由于没有进行中的调用,因此Atlas助手引擎会将中断请求应用于执行的下一个工具或 LLM 调用。 pending字段是 true。

already_armed

已存在未过期的准备中断请求。 Atlas Agent Engine 没有延长其有效期。

noop_terminal

执行已达到终止状态。

noop

您提供的 step_number 值与动态调用不匹配。 Atlas Agent Engine 不准备中断请求。

中断调用是幂等的,不会更改执行状态。如果您中断步骤中的每个调用,则代理会结束该回合而不是重试调用。如果在一个步骤中仅中断部分调用,代理将正常继续。

注意

Atlas Agent Engine 可以中断 I/O 密集型调用,例如 LLM 调用或网络工具调用。但是,运行 CPU 密集型本地计算的工具可能在完成之前不会停止。

会话会保留其代理沙箱和工具沙箱,直到空闲超时时间到期。如果将会话标记为已完成,则代理可以立即发布该计算,而不是等待超时。

选择首选语言的标签页,查看代理将会话标记为已完成的示例:

status = app.finish_session()
const status = app.finishSession();

当前回合继续运行并返回结果。轮次完成后, Atlas助手引擎会取消任何活动的子助手执行并释放会话的 Pod。

该方法返回以下值之一:

Python
Typescript
说明

REQUESTED

requested

Atlas Agent Engine 已接受请求。

ALREADY_REQUESTED

already_requested

代理已请求Atlas助手引擎完成此会话。

UNAVAILABLE

unavailable

没有要完成的会话。当您在代理运行之外(例如从本地脚本或工具沙箱)调用该方法时,或者在回合结束后,该方法会返回此值。

当没有要完成的会话时,该方法不会引发错误或异常。

暂停以供人工查看或失败的轮次会保留其资源,以便您可以恢复和诊断它。该会话回退到空闲超时时间。要学习;了解有关空闲超时的更多信息,请参阅池已满错误。

agentengine invoke 命令从终端调用已部署的代理,而无需编写任何HTTP客户端代码。默认从当前目录的 .agentengine/state.json文件读取工作区。

如果您在交互式终端中运行该命令而不显示任何消息,则会启动一个流媒体聊天会话,并跨轮重复使用返回的会话ID 。在此交互模式下,当代理暂停调用以进行人工参与 (HITL)查看, CLI会自动显示内联查看提示。

agentengine invoke [message] [flags]
agentengine invoke --file <path> [flags]

下表描述了可用标志:

标记
说明

--stream

--session <id>

要恢复或轮流重复使用的对话会话ID 。

--user-id <id>

--file <path>

从文件而不是位置参数中读取消息。

--payload <json>

JSON元数据对象与消息一起转发到代理。您必须指定有效的JSON对象。此标志可以与 --file 或位置消息参数结合使用。

--resume <json>

JSON resume_map,用于继续暂停的会话。需要 --session。此标志与位置消息、--file 和 stdin 输入互斥。

--json

输出原始JSON,包括会话ID和流式传输数据段。

--workspace

(仅限 Monorepo)按名称调用特定工作区。

--workspace-id <id>

平台工作区ID,绕过本地工作区解析。

--project-id <id>

平台项目ID。

--org-id <id>

组织ID。

--base-url <url>

平台API基本URL。

--context <name>

来自 .agentengine/state.json 的命名本地上下文。不能与 --workspace-id、--project-id、--org-id 或 --base-url 同时使用。

--timeout <duration>

等待每个调用请求的最长时间。默认值为 10m。

重要

服务帐户内存身份

当服务帐户调用已部署的代理时, Atlas Agent Engine 会使用服务帐户自己的身份作为运行时内存身份。平台会忽略调用请求或 agentengine invoke --user-id 标志提供的任何最终用户 user_id 值。

自动轮流记录、提取、合并和 app.memory 操作会使用此已解析身份。因此,通过同一服务帐户进行身份验证的调用股票一个内存用户作用域。

此限制仅适用于服务帐户调用的已部署代理。独立运行的、项目范围的内存服务不受影响。此服务继续接受来自调用者的显式 user_id 和 session_id 值。

要按最终用户隔离内存,请从应用程序中调用独立运行内存服务,并将显式 user_id 和 session_id 值传递给每个调用。要学习;了解更多信息,请参阅使用独立内存服务。

以下命令使用一条消息调用代理:

agentengine invoke "What can you do?"

以下命令在生成代理响应时流式传输响应:

agentengine invoke --stream "Draft a release note"

以下命令可恢复或继续命名会话:

agentengine invoke --session my-session "Follow up question"

以下命令从文件中读取消息并输出原始JSON:

cat prompt.txt | agentengine invoke --json

在交互模式下运行agentengine invoke 时,您可以使用以下命令之一管理轮次之间的有效负载:

输入
行为

/payload <json>

将当前有效负载设置为给定的JSON对象。 CLI将有效负载与后续的每条消息一起转发,直到您将其清除。

/payload

以JSON格式显示当前有效负载,如果未设立有效负载,则打印 (no payload set)。

/payload clear

清除当前有效负载。

当代理在交互模式下暂停以进行人工参与环路 (HITL)查看, CLI会打印暂停上下文并提示您做出内联决策。要学习;了解CLI如何显示查看提示以及如何恢复执行,请参阅《人机交互指南》中的使用CLI 。

调用代理后,您可以监控代理的性能和活动。要学习;了解更多信息,请参阅监控器指南。