本文介绍使用 JavaScript 或 TypeScript 调用 AgentCore 模型、MCP、Skill、记忆和凭证,以及通过框架构建 Agent 服务的方法。云端资源示例在 AgentCore 托管环境中运行,自定义资源示例由应用提供连接配置。
前提条件
-
已开通 AgentCore,并创建 Workspace。具体操作,请参见管理 Workspace。
-
已根据需要在 Agent 所属的 Workspace 中准备资源,并确认 Agent 具有相应访问权限。
-
使用云端资源的示例在 AgentCore 托管的应用运行环境中执行。SDK 从运行环境获取访问配置,无需在业务代码中填写平台访问密钥。
本文使用以下示例资源名称。请替换为您实际创建的资源名称。
|
资源 |
示例值 |
使用场景 |
|
模型连接 |
|
调用模型。请参见管理模型。 |
|
模型 |
|
必须已配置在所选模型连接中。框架工具示例还要求模型支持工具调用。 |
|
MCP 服务 |
|
调用工具。请参见管理 MCP 工具。 |
|
Skill |
|
使用已启用且有已发布版本的 Skill。请参见管理 Skill。 |
|
MemoryStore |
|
使用记忆功能时需要。 |
|
凭证 |
|
按需创建 API Key 凭证或 MCP Header 凭证。具体操作,请参见管理凭证。 |
只调用模型时,无需创建 MCP、Skill、MemoryStore 或额外凭证。
安装 SDK
基础 SDK 支持 Node.js 20.3 及以上版本。本文的 LangChain 服务示例使用 Node.js 22.22 及以上版本。
npm install alibabacloud-agentcore-sdk@0.1.2
框架依赖需要单独安装。本文 LangChain 示例使用以下依赖:
npm install langchain@^1 @langchain/core@^1 @langchain/langgraph@^1 @langchain/openai@^1 zod@^4
npm install --save-dev tsx typescript @types/node
本文示例使用 Node.js SDK 0.1.2。
调用云端模型
在代码中指定模型连接名称和模型名称。SDK 根据当前 Agent 所属的 Workspace 查找模型连接,无需手动拼接模型访问地址。
import { AgentCore } from 'alibabacloud-agentcore-sdk';
const core = AgentCore.auto();
try {
const model = await core.model('my-model-connection', { model: 'qwen3.8-max' });
const response = await model.completion(
[{ role: 'user', content: '用一句话介绍杭州。' }],
{ temperature: 0.2 },
);
console.log(response);
} finally {
await core.close();
}
|
参数 |
说明 |
|
|
模型连接的名称,不是模型名称,也不是模型连接 ID。 |
|
|
该连接中已配置的模型名称。 |
|
|
本次生成使用的参数。是否支持及取值范围以实际模型为准。 |
流式输出
在前述 Core 生命周期内,用以下代码替换普通调用。普通调用和流式调用是两次独立请求,按需选择一种。
for await (const chunk of model.stream([{ role: 'user', content: '用一句话介绍杭州。' }])) {
console.log(chunk);
}
说明:返回数据结构由模型连接协议决定。Anthropic 模型返回其对应协议的数据结构,不应使用choices解析。OpenAI/v1 连接可使用responses()和responsesStream()。实际模型必须支持 Responses API;SDK 不会在调用失败时自动切换为 Chat Completions。当前托管模型客户端不提供 Embedding 调用。自定义模型客户端的embedding()仅适用于支持向量生成的服务和模型。
使用 MCP 工具
以下片段在已创建的 core 生命周期内执行。获取工具列表只用于发现工具,不会执行工具。
const mcp = await core.mcp('my-mcp');
const availableTools = await mcp.listTools();
for (const tool of availableTools) {
console.log(tool.name, tool.description, tool.parameters);
}
// 替换为该 MCP 实际提供的工具名称和参数。
const result = await mcp.callTool('<工具名称>', { '<参数名称>': '<参数值>' });
如需让模型选择并执行工具,请使用后文的框架集成示例。模型调用本身不会自动执行 MCP 工具。
使用 Skill
Skill 包含任务说明和可选的辅助文件或脚本。加载 Skill 后,通过框架适配器将其接入 Agent。
const skill = await core.skills.managed('my-skill', '1.0.0');
console.log(skill.name, skill.version);
1.0.0 必须是该 Skill 已发布的版本。省略版本时使用平台解析出的默认版本。需要固定应用行为时,建议显式指定版本。
重要:加载 Skill 不等于执行 Skill。Skill 工具可能执行包内脚本或命令,仅使用可信来源的 Skill。不需要命令执行能力时,在应用运行环境中设置 ALLOW_EXECUTE_COMMAND=false。Skill 执行所需的程序和依赖仍需包含在应用运行环境中。
使用记忆
MemoryStore 用于保存和检索长期记忆。它与模型输入的对话历史是不同的能力:检索到记忆后,需要由业务代码或框架适配器将其作为参考信息提供给模型。
写入和检索记忆
以下片段在已创建的 core 生命周期内执行。示例会写入数据,请使用适合验证的 MemoryStore。
const store = core.memoryStore('my-memory');
await store.addMemories({
scope: { userId: 'example-user', sessionId: 'example-session' },
text: '用户喜欢简短的中文回答。',
});
const result = await store.searchMemories('用户有哪些回答偏好?', {
scope: { userId: 'example-user' },
topK: 5,
});
for (const hit of result.memories) {
console.log(hit.memory.content.text);
}
|
参数 |
说明 |
|
|
业务用户的逻辑标识。用于按用户组织记忆。 |
|
|
Agent 的逻辑标识。可按业务定义,不要求每次调用都提供。 |
|
|
会话标识。写入时可标记记忆来源;检索时传入则限定到该会话。 |
|
|
检索返回的结果数量上限。 |
使用时注意:
-
MemoryStore 所属的 Workspace 来自 Core 的资源上下文,通常无需在每次记忆调用时重复传入。
-
写入时,三个范围字段均可省略,未传字段归入服务端默认范围;查询时,未传字段不限制该维度。多用户应用应显式传入所需范围,避免检索到不应共享的记忆。
-
跨会话使用用户偏好时,通常按用户写入,检索时不限定
sessionId。 -
范围字段应由可信的业务上下文提供,不应让模型任意生成或修改。它们用于逻辑分区,不是访问凭证或权限校验的替代品。
-
新写入的记忆可能需要一定时间才能检索到。不要因为首次查询为空,就反复写入相同内容。
-
查询会话消息使用
listMemorySessionMessages();需要会话 ID,且用户 ID、Agent ID 至少提供一个。
接入框架执行流程
框架适配器可在模型执行前检索记忆,并按配置在执行后写回。仅接入模型或工具适配器不会自动启用记忆。
|
框架 |
入口 |
|
LangChain |
|
|
LangGraph |
|
|
Google ADK |
|
|
Mastra |
|
表中的入口均以 alibabacloud-agentcore-sdk/ 为前缀。各框架的生命周期不同,记忆写入应接入对应的中间件、节点或会话保存接口,不要把整段历史在每个模型调用后重复提交。
使用凭证和 MCP Header
获取托管凭证
在平台创建凭证并授权后,可按名称读取。以下片段在 core 生命周期内执行。
const credential = await core.credentials.get('my-api-key');
const apiKey = credential.value; // 交给需要该凭证的客户端,不要输出。
const headerCredential = await core.credentials.get('my-mcp-header');
const headers = headerCredential.asHeaders();
API Key 凭证使用 value,MCP Header 凭证使用 asHeaders()。不要把凭证值写入源代码、日志或对外响应。
为 MCP 绑定凭证
const mcp = await core.mcp('my-mcp', {
credentialName: 'my-mcp-header',
headers: { 'x-business-id': 'my-app' },
});
credentialName 和 headers 均可省略。绑定的 MCP Header 凭证必须允许应用到该 MCP。
重要:headers是客户端级固定配置,作用于 MCP 握手、工具发现和工具调用,不是每次请求的用户身份参数。不要在共享客户端上修改 Header 来切换用户。Header 名称大小写不敏感。平台 Header、凭证 Header、自定义 Header 发生冲突时会报错,不进行覆盖;不能覆盖Authorization等平台认证字段,也不能手动设置Host、Mcp-Session-Id等协议字段。SDK 不会自动复制全部入站 Header。
接入自定义资源
自有模型、MCP 服务和随应用分发的 Skill 无需注册为平台资源。以下配置由应用自己提供,示例中的环境变量不是 SDK 自动读取的配置项。
import { AgentCore } from 'alibabacloud-agentcore-sdk';
const core = new AgentCore();
try {
const model = core.directModel({
provider: 'openai',
model: process.env.CUSTOM_MODEL_NAME!,
baseURL: process.env.CUSTOM_MODEL_BASE_URL!,
apiKey: process.env.CUSTOM_MODEL_API_KEY!,
});
console.log(await model.completion([{ role: 'user', content: '你好' }]));
const mcp = core.directMCP({ url: process.env.CUSTOM_MCP_URL! });
console.log((await mcp.listTools()).map(tool => tool.name));
const skills = await core.skills.local('./skills');
console.log(skills.map(skill => skill.name));
} finally {
await core.close();
}
|
配置 |
说明 |
|
|
自有服务支持的模型名称。 |
|
|
模型 API Base URL。OpenAI 兼容服务通常包含 |
|
|
模型服务的 API Key。通过运行环境或密钥管理方式提供。 |
|
|
MCP 服务的完整访问地址。默认使用 Streamable HTTP;SSE 服务需显式设置 |
|
|
随应用分发的 Skill 目录。单个 Skill 应包含 |
直连 MCP 需要鉴权时,可通过 headersProvider 提供 Header;stdio 传输不使用 HTTP Header。
使用 LangChain 构建 Agent 服务
以下示例将云端模型、MCP 和 Skill 接入 LangChain,并通过 AgentCoreServer 提供服务。使用前请准备 my-model-connection、my-mcp、my-skill,并按前文安装框架依赖。
示例处理最新一条用户文本,未实现对话历史存储。多轮会话应由应用或框架维护历史和检查点。
保存为 app.ts。在应用的 package.json 中设置 "type": "module"。
import { createAgent } from 'langchain';
import { HumanMessage } from '@langchain/core/messages';
import { AgentCore } from 'alibabacloud-agentcore-sdk';
import { AgentCoreServer } from 'alibabacloud-agentcore-sdk/server';
import {
AgentCoreConverter, model, tools, skillTools,
} from 'alibabacloud-agentcore-sdk/integrations/langchain';
const core = AgentCore.auto({ logger: console });
async function buildAgent() {
const client = await core.model('my-model-connection', { model: 'qwen3.8-max' });
const mcp = await core.mcp('my-mcp');
const skill = await core.skills.managed('my-skill');
return createAgent({
model: await model(client),
tools: [...tools(await mcp.listTools()), ...skillTools([skill])],
systemPrompt: '使用工具完成请求,不要编造工具执行结果。',
});
}
let agent: Awaited<ReturnType<typeof buildAgent>>;
const server = new AgentCoreServer({
logger: console,
startup: async () => {
try { agent = await buildAgent(); }
catch (error) { await core.close(); throw error; }
},
shutdown: () => core.close(),
readiness: () => agent !== undefined,
invoke: async function* (request) {
const message = request.messages.at(-1);
if (message?.role !== 'user' || typeof message.content !== 'string') {
throw new Error('本示例仅支持用户文本消息');
}
const events = agent.streamEvents(
{ messages: [new HumanMessage(message.content)] },
{ version: 'v2', signal: request.signal },
);
yield* new AgentCoreConverter().stream(events);
},
});
await server.start({ port: 9000, hostname: '0.0.0.0' });
for (const signal of ['SIGINT', 'SIGTERM'] as const) {
process.once(signal, () => {
void server.close().catch(error => {
console.error(error);
process.exitCode = 1;
});
});
}
在应用运行环境中使用以下启动命令,并确保已安装 tsx:
npx tsx app.ts
部署配置
将应用代码及依赖打包并部署到 AgentCore。运行环境需包含前述 SDK 和框架依赖;如使用容器镜像,应在构建镜像时安装依赖。
|
配置 |
本文示例值 |
|
监听地址 |
|
|
服务端口 |
|
|
Node.js 启动命令 |
|
|
存活检查 |
|
|
就绪检查 |
|
平台配置的端口应与应用实际监听端口一致。SDK 不执行代码上传、镜像构建或应用部署。
调用 Agent 服务
将下面的 https://<agent-endpoint> 替换为应用实际访问地址,并按应用的访问要求补充认证信息。该地址是 Agent 应用地址,不是模型供应商地址。
AG-UI
curl -N 'https://<agent-endpoint>/ag-ui/agent' \
-H 'Content-Type: application/json' \
-d '{
"threadId": "example-thread-1",
"runId": "example-run-1",
"messages": [{"id": "message-1", "role": "user", "content": "查看可用 Skill,并按其说明完成一个示范。"}],
"state": {},
"tools": [ ],
"context": [ ],
"forwardedProps": {}
}'
每次运行使用新的 runId。同一对话可以复用 threadId,但它不会让上述示例自动保存历史。请求中的 tools: [ ] 不会禁用 Agent 代码中已配置的工具。
正常执行以 RUN_STARTED 开始,以 RUN_FINISHED 结束。发生工具调用时,会输出工具调用和结果事件,并通过相同的 toolCallId 关联。是否调用工具由模型和任务决定。运行失败时输出 RUN_ERROR。
OpenAI Chat Completions
curl -N 'https://<agent-endpoint>/openai/v1/chat/completions' \
-H 'Content-Type: application/json' \
-d '{
"model": "agentcore",
"messages": [{"role": "user", "content": "你好"}],
"stream": true
}'
流式响应以 [DONE] 结束。将 stream 改为 false 可获取单个 JSON 响应。
model 是 OpenAI 请求格式中的必填字段。本示例始终使用应用代码指定的模型连接,不会根据这个字段自动切换下游模型。查询应用的协议模型列表可使用 GET /openai/v1/models,该列表不是 Workspace 的模型目录。
协议选择
|
内容 |
AG-UI |
OpenAI Chat Completions |
|
文本输出 |
支持。 |
支持。 |
|
多条消息边界 |
保留文本消息的开始、内容和结束事件。 |
同一次 completion 的文本聚合到一条 assistant 消息。 |
|
工具调用 |
输出工具调用事件,保留调用 ID。 |
输出 |
|
工具结果 |
输出独立的工具结果事件。 |
不提供独立的工具结果响应事件。 |
|
适用场景 |
展示 Agent 多步执行过程、工具调用与结果。 |
接入使用 Chat Completions 格式的客户端。 |
两种协议的 SSE 在输出空闲 15 秒后发送心跳注释。心跳不是模型输出,也不表示业务执行已经完成。
重要:框架服务示例已在服务端执行工具。客户端不要将收到的工具调用轨迹再执行一次。需要完整执行过程时,应将框架完整事件流交给 AgentCoreConverter,不要只提取文本。每个请求创建独立转换器。转换器保留结构化消息边界和工具关联,不通过正文猜测消息类型。
其他框架集成
|
框架 |
入口 |
|
LangChain |
|
|
LangGraph |
|
|
Google ADK |
|
|
Mastra |
|
|
AI SDK 6 |
|
表中的入口均以 alibabacloud-agentcore-sdk/ 为前缀。上述框架入口也提供执行事件转换器,输入应使用对应框架的完整事件流。例如 LangChain/LangGraph 使用 streamEvents(..., {version: 'v2'}),AI SDK 使用 fullStream 而非 textStream。
不同框架的事件输入和输出时机不同,不应直接复用另一框架的事件处理方式。
常见问题
找不到模型连接、MCP 或 Skill,如何排查?
检查应用所在 Workspace、资源名称和访问权限。模型连接名称与模型名称是两个参数;Skill 还需要检查是否已启用、所选版本是否已发布。不要用另一 Workspace 的资源 ID 替代名称。
为什么加载了 MCP 和 Skill,模型仍没有调用工具?
listTools() 和 Skill 加载只完成资源准备。还需将工具交给 Agent 框架,并选择支持工具调用的模型。即使已配置工具,简单问题也可能不需要调用工具。
为什么首次检索不到刚写入的记忆?
记忆处理和可检索状态可能存在延迟。先检查写入是否成功及读写范围是否一致,稍后重新查询,不要直接重放写入操作。
相同会话 ID 是否会自动恢复历史?
不会。AgentCoreServer 负责协议接入,不替应用持久化对话历史。由应用或框架管理会话状态;长期记忆不能替代完整的会话历史或框架检查点。
必须使用 AgentCoreServer 吗?
不必。可以在现有 Web 服务或 Agent 执行器中使用模型、MCP、Skill、Memory 和凭证接口。使用 AgentCoreServer 只是复用其协议封装,不是调用云端资源的前提。
浏览器跨域访问失败,如何处理?
SDK 默认不放开跨域。由应用或接入网关按实际前端来源配置 CORS。不要将允许所有来源作为使用敏感凭证接口的默认配置。
如何记录排障日志?
可使用 AgentCore.auto({ logger: console }),并为 AgentCoreServer 配置 logger: console。保留错误堆栈、请求 ID 和失败操作,避免输出访问密钥、完整 Header 或用户敏感内容。
应用生命周期内复用 Core,退出时关闭。调用 await core.close() 关闭资源。不要在每次 HTTP 请求结束后关闭其他请求仍在使用的共享 Core。