Overview
在本指南中,您可以学习;了解如何调用MongoDB Atlas助手引擎上已部署的代理。本指南展示了如何调用API 、从CLI调用代理、将自定义标头转发到代理以及恢复暂停的执行。
调用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"}
帧可以包含以下字段:
字段 | 说明 |
|---|---|
| |
| 数据数据块有效负载。对于 |
| 描述数据块的结构化元数据。 |
| 标识生成该数据块的执行。当执行ID可用时,平台会包含此字段。 |
数据段类型
下表描述了流可以承载的数据块类型:
数据段类型 | 说明 |
|---|---|
| 代理生成的输出的增量。 |
| 工具在执行过程中发出的进度更新。 |
| 标记子代理执行的开始。仅当禁用护栏时,平台才会发出此数据块。 |
| 标记子代理执行的结束。仅当禁用护栏时,平台才会发出此数据块。 |
| 运行完成后标记流的结束。 |
| 运行失败后标记流的结束。该帧还包含错误消息。 |
如果运行失败,该流会发送一个包含错误消息的 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端点,用于流媒体、轮询、恢复和停止执行:
方法和路径 | 用途 |
|---|---|
| 使用 Server-Sent Events 协议在生成代理输出时以增量方式流式传输该输出。 |
| 轮询执行状态和结果。 |
| |
| |
| 中断进行中的工具或 LLM 调用,而不结束会话。要学习;了解更多信息,请参阅中断工具或 LLM 调用。 |
每个 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 头部:
API网关提取标头。
网关去掉前缀,并将标头名称小写。示例,
X-Mdb-Agent-Engine-Custom-Authorization变为authorization。网关将标头作为字典转发给代理。
标头通过执行管道在内存中转发,从不持久保存到数据库,并在执行完成时被管道丢弃。
注意
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") 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 提供以下方法来停止已在运行的工作:
从 Playground用户界面停止运行。要学习;了解更多信息,请参阅停止 Playground 中的运行。
中断单个正在进行的工具或 LLM 调用,让代理继续运行。要学习;了解更多信息,请参阅中断工具或 LLM 调用。
取消会话
要取消正在进行的执行,请向 /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 中停止运行
您还可以从 Playground用户界面停止运行,而不是调用 cancel API端点。从 Playground 停止运行与取消会话具有相同的效果。要学习;了解更多信息,请参阅取消会话。
要从 Playground 停止运行,请执行以下步骤:
中断工具或 LLM 调用
中断工具或 LLM 调用仅会停止该调用。会话保持活动状态,代理从中断的结果中继续运行。当单个呼叫卡住或不需要并且您不想取消整个会话时,请中断呼叫。
要中断调用,请向 /api/v1/projects/{project_id}/executions/{execution_id}/interrupt API端点发送 POST请求。该请求采用以下参数:
Parameter | 类型 | 必需 | 说明 |
|---|---|---|---|
| 查询参数 | 是 | 拥有执行的工作区。 Atlas Agent Engine 使用此值将中断请求路由到该工作区的编排引擎。如果省略此参数,请求将失败,并显示 |
| 正文字段 | 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字段描述中断请求的结果并返回以下值之一:
值 | 说明 |
|---|---|
| Atlas Agent Engine 已停止进行中的呼叫。 |
| 由于没有进行中的调用,因此Atlas助手引擎会将中断请求应用于执行的下一个工具或 LLM 调用。 |
| 已存在未过期的准备中断请求。 Atlas Agent Engine 没有延长其有效期。 |
| 执行已达到终止状态。 |
| 您提供的 |
中断调用是幂等的,不会更改执行状态。如果您中断步骤中的每个调用,则代理会结束该回合而不是重试调用。如果在一个步骤中仅中断部分调用,代理将正常继续。
注意
Atlas Agent Engine 可以中断 I/O 密集型调用,例如 LLM 调用或网络工具调用。但是,运行 CPU 密集型本地计算的工具可能在完成之前不会停止。
通过代理将会话标记为已完成
会话会保留其代理沙箱和工具沙箱,直到空闲超时时间到期。如果将会话标记为已完成,则代理可以立即发布该计算,而不是等待超时。
选择首选语言的标签页,查看代理将会话标记为已完成的示例:
status = app.finish_session()
const status = app.finishSession();
当前回合继续运行并返回结果。轮次完成后, Atlas助手引擎会取消任何活动的子助手执行并释放会话的 Pod。
该方法返回以下值之一:
Python | Typescript | 说明 |
|---|---|---|
|
| Atlas Agent Engine 已接受请求。 |
|
| 代理已请求Atlas助手引擎完成此会话。 |
|
| 没有要完成的会话。当您在代理运行之外(例如从本地脚本或工具沙箱)调用该方法时,或者在回合结束后,该方法会返回此值。 |
当没有要完成的会话时,该方法不会引发错误或异常。
暂停以供人工查看或失败的轮次会保留其资源,以便您可以恢复和诊断它。该会话回退到空闲超时时间。要学习;了解有关空闲超时的更多信息,请参阅池已满错误。
从CLI调用代理
agentengine invoke 命令从终端调用已部署的代理,而无需编写任何HTTP客户端代码。默认从当前目录的 .agentengine/state.json文件读取工作区。
如果您在交互式终端中运行该命令而不显示任何消息,则会启动一个流媒体聊天会话,并跨轮重复使用返回的会话ID 。在此交互模式下,当代理暂停调用以进行人工参与 (HITL)查看, CLI会自动显示内联查看提示。
命令语法
agentengine invoke [message] [flags] agentengine invoke --file <path> [flags]
下表描述了可用标志:
标记 | 说明 |
|---|---|
| |
| 要恢复或轮流重复使用的对话会话ID 。 |
| 要传递给已部署代理的用户ID 。服务帐户调用者不能使用此标志来充当其他用户,如服务帐户内存身份说明中所述。 |
| 从文件而不是位置参数中读取消息。 |
| JSON元数据对象与消息一起转发到代理。您必须指定有效的JSON对象。此标志可以与 |
| JSON |
| 输出原始JSON,包括会话ID和流式传输数据段。 |
| (仅限 Monorepo)按名称调用特定工作区。 |
| 平台工作区ID,绕过本地工作区解析。 |
| 平台项目ID。 |
| 组织ID。 |
| 平台API基本URL。 |
| 来自 |
| 等待每个调用请求的最长时间。默认值为 |
重要
服务帐户内存身份
当服务帐户调用已部署的代理时, 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 时,您可以使用以下命令之一管理轮次之间的有效负载:
输入 | 行为 |
|---|---|
| 将当前有效负载设置为给定的JSON对象。 CLI将有效负载与后续的每条消息一起转发,直到您将其清除。 |
| 以JSON格式显示当前有效负载,如果未设立有效负载,则打印 |
| 清除当前有效负载。 |
交互式 HITL 审核
当代理在交互模式下暂停以进行人工参与环路 (HITL)查看, CLI会打印暂停上下文并提示您做出内联决策。要学习;了解CLI如何显示查看提示以及如何恢复执行,请参阅《人机交互指南》中的使用CLI 。