本文介紹使用 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,且使用者識別碼、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。