本文介紹使用 Python 調用 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 支援 Python 3.10 及以上版本。本文的 LangChain 服務樣本使用 Python 3.11 及以上版本。
pip install alibabacloud-agentcore-sdk==0.1.1
使用 MCP、HTTP 服務、憑證或框架組成時,按需安裝擴充依賴:
pip install "alibabacloud-agentcore-sdk[mcp,server,credentials,langchain]==0.1.1"
|
擴充依賴 |
用途 |
|
|
串連 MCP 服務。 |
|
|
使用 AgentCoreServer。 |
|
|
讀取託管憑證、綁定 MCP Header 憑證。 |
|
|
對應框架組成。 |
|
|
AgentScope 2.x 整合,需要 Python 3.11 及以上版本。 |
|
|
對應框架組成。架構本身可能有額外的 Python 版本要求。 |
Python 的安裝包名為 alibabacloud-agentcore-sdk,代碼中的匯入名稱為 agentcore。
本文樣本使用 Python SDK 0.1.1。後續版本請參見 PyPI。
調用雲端模型
在代碼中指定模型串連名稱和模型名稱。SDK 根據當前 Agent 所屬的 Workspace 尋找模型串連,無需手動拼接模型訪問地址。
import asyncio
from agentcore import AsyncAgentCore
async def main():
async with AsyncAgentCore.auto() as core:
model = await core.model("my-model-connection", model="qwen3.8-max")
response = await model.invoke(
[{"role": "user", "content": "用一句話介紹杭州。"}],
temperature=0.2,
)
print(response["choices"][0]["message"]["content"])
asyncio.run(main())
|
參數 |
說明 |
|
|
模型串連的名稱,不是模型名稱,也不是模型串連 ID。 |
|
|
該串連中已配置的模型名稱。 |
|
|
本次產生使用的參數。是否支援及取值範圍以實際模型為準。 |
流式輸出
在前述 Core 生命週期內,用以下代碼替換普通調用。普通調用和流式調用是兩次獨立請求,按需選擇一種。
async for chunk in model.stream([{"role": "user", "content": "用一句話介紹杭州。"}]):
for choice in chunk.get("choices", [ ]):
print(choice.get("delta", {}).get("content") or "", end="", flush=True)
說明:上述文本解析樣本適用於 OpenAI/v1 協議。Anthropic 模型返回其對應協議的資料結構,不應使用choices解析。OpenAI/v1 串連可使用responses()和responses_stream()。實際模型必須支援 Responses API;SDK 不會在調用失敗時自動切換為 Chat Completions。當前託管模型用戶端不提供 Embedding 調用。自訂模型用戶端的embedding()僅適用於支援向量產生的服務和模型。
使用 MCP 工具
以下片段在已建立的 core 生命週期內執行。擷取工具列表只用於發現工具,不會執行工具。
mcp = await core.mcp("my-mcp")
available_tools = await mcp.list_tools()
for tool in available_tools:
print(tool.name, tool.description, tool.parameters)
# 替換為該 MCP 實際提供的工具名稱和參數。
result = await mcp.call_tool("<工具名稱>", {"<參數名稱>": "<參數值>"})
如需讓模型選擇並執行工具,請使用後文的框架組成樣本。模型調用本身不會自動執行 MCP 工具。
使用 Skill
Skill 包含任務說明和可選的輔助檔案或指令碼。載入 Skill 後,通過架構適配器將其接入 Agent。
skill = await core.skills.managed("my-skill", version="1.0.0")
print(skill.name, skill.version)
1.0.0 必須是該 Skill 發行的版本。省略版本時使用平台解析出的預設版本。需要固定應用行為時,建議顯式指定版本。
重要:載入 Skill 不等於執行 Skill。Skill 工具可能執行包內指令碼或命令,僅使用可信來源的 Skill。不需要命令執行能力時,在應用運行環境中設定 ALLOW_EXECUTE_COMMAND=false。Skill 執行所需的程式和依賴仍需包含在應用運行環境中。
使用記憶
MemoryStore 用於儲存和檢索長期記憶。它與模型輸入的對話歷史是不同的能力:檢索到記憶後,需要由業務代碼或架構適配器將其作為參考資訊提供給模型。
寫入和檢索記憶
以下片段在已建立的 core 生命週期內執行。樣本會寫入資料,請使用適合驗證的 MemoryStore。
from agentcore.memory import MemoryScope
store = core.memory_store("my-memory")
await store.add_memories(
scope=MemoryScope(user_id="example-user", session_id="example-session"),
text="使用者喜歡簡短的中文回答。",
)
result = await store.search_memories(
"使用者有哪些回答偏好?",
scope=MemoryScope(user_id="example-user"),
top_k=5,
)
for hit in result.memories:
print(hit.memory.content.text)
|
參數 |
說明 |
|
|
業務使用者的邏輯標識。用於按使用者組織記憶。 |
|
|
Agent 的邏輯標識。可按業務定義,不要求每次調用都提供。 |
|
|
會話標識。寫入時可標記記憶來源;檢索時傳入則限定到該會話。 |
|
|
檢索返回的結果數量上限。 |
使用時注意:
-
MemoryStore 所屬的 Workspace 來自 Core 的資源上下文,通常無需在每次記憶調用時重複傳入。
-
寫入時,三個範圍欄位均可省略,未傳欄位歸入服務端預設範圍;查詢時,未傳欄位不限制該維度。多使用者應用應顯式傳入所需範圍,避免檢索到不應共用的記憶。
-
跨會話使用使用者偏好時,通常按使用者寫入,檢索時不限定
session_id。 -
範圍欄位應由可信的業務上下文提供,不應讓模型任意產生或修改。它們用於邏輯分區,不是訪問憑證或許可權校正的替代品。
-
新寫入的記憶可能需要一定時間才能檢索到。不要因為首次查詢為空白,就反覆寫入相同內容。
-
查詢會話訊息使用
list_memory_session_messages();需要會話 ID,且使用者識別碼、Agent ID 至少提供一個。
接入架構執行流程
架構適配器可在模型執行前檢索記憶,並按配置在執行後寫回。僅接入模型或工具適配器不會自動啟用記憶。
|
架構 |
入口 |
|
LangChain |
|
|
LangGraph |
|
|
AgentScope 2.x |
|
|
Google ADK |
|
|
PydanticAI |
|
|
CrewAI |
|
各架構的生命週期不同,記憶寫入應接入對應的中介軟體、節點或會話儲存介面,不要把整段歷史在每個模型調用後重複提交。
使用憑證和 MCP Header
擷取託管憑證
在平台建立憑證並授權後,可按名稱讀取。以下片段在 core 生命週期內執行。
credential = await core.credentials.get("my-api-key")
api_key = credential.value # 交給需要該憑證的用戶端,不要輸出。
header_credential = await core.credentials.get("my-mcp-header")
headers = header_credential.as_headers()
API Key 憑證使用 value,MCP Header 憑證使用 as_headers()。不要把憑證值寫入原始碼、日誌或對外響應。
為 MCP 綁定憑證
mcp = await core.mcp(
"my-mcp",
credential_name="my-mcp-header",
headers={"x-business-id": "my-app"},
)
credential_name 和 headers 均可省略。綁定的 MCP Header 憑證必須允許應用到該 MCP。
重要:headers是用戶端級固定配置,作用於 MCP 握手、工具發現和工具調用,不是每次請求的使用者身份參數。不要在共用用戶端上修改 Header 來切換使用者。Header 名稱大小寫不敏感。平台 Header、憑證 Header、自訂 Header 發生衝突時會報錯,不進行覆蓋;不能覆蓋Authorization等平台認證欄位,也不能手動設定Host、Mcp-Session-Id等協議欄位。SDK 不會自動複製全部入站 Header。
接入自訂資源
自有模型、MCP 服務和隨應用分發的 Skill 無需註冊為平台資源。以下配置由應用自己提供,樣本中的環境變數不是 SDK 自動讀取的配置項。
import asyncio
import os
from agentcore import AsyncAgentCore
async def main():
async with AsyncAgentCore() as core:
model = core.direct_model(
provider="openai",
model=os.environ["CUSTOM_MODEL_NAME"],
base_url=os.environ["CUSTOM_MODEL_BASE_URL"],
api_key=os.environ["CUSTOM_MODEL_API_KEY"],
)
response = await model.invoke([{"role": "user", "content": "你好"}])
print(response["choices"][0]["message"]["content"])
mcp = core.direct_mcp(url=os.environ["CUSTOM_MCP_URL"])
print([tool.name for tool in await mcp.list_tools()])
skills = await core.skills.local("./skills")
print([skill.name for skill in skills])
asyncio.run(main())
|
配置 |
說明 |
|
|
自有服務支援的模型名稱。 |
|
|
模型 API Base URL。OpenAI 相容服務通常包含 |
|
|
模型服務的 API Key。通過運行環境或密鑰管理方式提供。 |
|
|
MCP 服務的完整訪問地址。預設使用 Streamable HTTP;SSE 服務需顯式設定 |
|
|
隨應用分發的 Skill 目錄。單個 Skill 應包含 |
直連 MCP 需要鑒權時,可通過 headers_provider 提供 Header;stdio 傳輸不使用 HTTP Header。
使用 LangChain 構建 Agent 服務
以下樣本將雲端模型、MCP 和 Skill 接入 LangChain,並通過 AgentCoreServer 提供服務。使用前請準備 my-model-connection、my-mcp、my-skill,並按前文安裝架構依賴。
樣本處理最新一條使用者文本,未實現對話歷史儲存。多輪會話應由應用或架構維護歷史和檢查點。
儲存為 app.py:
import logging
from langchain.agents import create_agent
from langchain_core.messages import HumanMessage
from agentcore import AsyncAgentCore
from agentcore.integrations.langchain import AgentCoreConverter, model, skill_tools, tools
from agentcore.server import AgentCoreServer
logging.basicConfig(level=logging.INFO)
core = None
chat = None
agent = None
async def shutdown():
try:
if chat is not None:
await chat.root_async_client.close()
chat.root_client.close()
finally:
if core is not None:
await core.aclose()
async def startup():
global core, chat, agent
core = AsyncAgentCore.auto()
try:
mcp = await core.mcp("my-mcp")
skill = await core.skills.managed("my-skill")
chat = model("my-model-connection", model_name="qwen3.8-max")
agent = create_agent(
model=chat,
tools=[*tools(await mcp.list_tools()), *skill_tools([skill])],
system_prompt="使用工具完成請求,不要編造工具執行結果。",
)
except Exception:
logging.exception("Agent 初始化失敗")
await shutdown()
raise
server = AgentCoreServer(
startup=startup,
shutdown=shutdown,
readiness=lambda: agent is not None,
)
@server.invoke
async def invoke(request, context):
if not request.messages:
raise ValueError("請提供使用者訊息")
message = request.messages[-1]
if message.role.value != "user" or not isinstance(message.content, str):
raise ValueError("本樣本僅支援使用者簡訊")
events = agent.astream_events(
{"messages": [HumanMessage(content=message.content)]},
version="v2",
)
async for event in AgentCoreConverter().stream(events):
yield event
在應用運行環境中使用以下啟動命令:
uvicorn app:server --host 0.0.0.0 --port 9000
樣本按 OpenAI/v1 模型串連編寫,關閉邏輯也對應該樣本的 LangChain OpenAI 用戶端。
部署配置
將應用代碼及依賴打包並部署到 AgentCore。運行環境需包含前述 SDK 和架構依賴;如使用容器鏡像,應在構建鏡像時安裝依賴。
|
配置 |
本文樣本值 |
|
監聽地址 |
|
|
服務連接埠 |
|
|
Python 啟動命令 |
|
|
存活檢查 |
|
|
就緒檢查 |
|
平台配置的連接埠應與應用實際監聽連接埠一致。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 |
|
|
AgentScope 2.x |
|
|
Google ADK |
|
|
PydanticAI |
|
|
CrewAI |
|
上述架構入口也提供執行事件轉換器,輸入應使用對應架構的完整事件流。例如 LangChain/LangGraph 使用 astream_events(version="v2")。
CrewAI 完整事件入口需要 CrewAI 1.15.20 及以上版本;其軌跡在執行完成後輸出,不是逐 Token 即時輸出。不同架構的事件輸入和輸出時機不同,不應直接複用另一架構的事件處理方式。
常見問題
找不到模型串連、MCP 或 Skill,如何排查?
檢查應用所在 Workspace、資源名稱和存取權限。模型串連名稱與模型名稱是兩個參數;Skill 還需要檢查是否已啟用、所選版本是否發行。不要用另一 Workspace 的資源 ID 替代名稱。
為什麼載入了 MCP 和 Skill,模型仍沒有調用工具?
list_tools() 和 Skill 載入只完成資源準備。還需將工具交給 Agent 架構,並選擇支援工具調用的模型。即使已組態工具,簡單問題也可能不需要調用工具。
為什麼首次檢索不到剛寫入的記憶?
記憶處理和可檢索狀態可能存在延遲。先檢查寫入是否成功及讀寫範圍是否一致,稍後重新查詢,不要直接重放寫入操作。
相同會話 ID 是否會自動回復歷史?
不會。AgentCoreServer 負責協議接入,不替應用持久化對話歷史。由應用或架構管理工作階段狀態;長期記憶不能替代完整的會話歷史或架構檢查點。
必須使用 AgentCoreServer 嗎?
不必。可以在現有 Web 服務或 Agent 執行器中使用模型、MCP、Skill、Memory 和憑證介面。使用 AgentCoreServer 只是複用其協議封裝,不是調用雲端資源的前提。
瀏覽器跨域訪問失敗,如何處理?
SDK 預設不放開跨域。由應用或接入網關按實際前端來源配置 CORS。不要將允許所有來源作為使用敏感憑證介面的預設配置。
如何記錄排障日誌?
可通過 logging.basicConfig(level=logging.INFO) 開啟日誌。保留錯誤堆棧、請求 ID 和失敗操作,避免輸出存取金鑰、完整 Header 或使用者敏感內容。
應用生命週期內複用 Core,退出時關閉。推薦使用非同步上下文管理器,或調用 await core.aclose()。不要在每次 HTTP 要求結束後關閉其他請求仍在使用的共用 Core。