Repository: https://github.com/strands-agents/sdk-typescript Stars: 699 | Forks: 103 | License: Apache-2.0 語言: TypeScript | NPM:
@strands-agents/sdk官網: https://strandsagents.com Tags: agents, ai, autonomous-agents, bedrock, genai, llm, mcp, multi-agent-systems, openai, opentelemetry, typescript, javascript, strands-agents
注意: 此 repo 已 archived,TypeScript SDK 已遷移至 strands-agents/harness-sdk monorepo 的
strands-ts/目錄。本教學內容基於遷移前的完整原始碼,API 與架構仍然有效。
1. 專案概覽 (Project Overview)
1.1 這是什麼
Strands Agents SDK TypeScript 是一套以 model-driven (模型驅動) 方式建構 AI Agent 的開源框架。由 AWS 團隊開發維護,屬於 Strands Agents 生態系的核心組件之一。它讓開發者只需數行程式碼,就能建立從簡單助手到複雜多 Agent 工作流的各種 AI 應用。
1.2 核心特色
| 特色 | 說明 |
|---|---|
| 輕量靈活 | 簡單的 Agent loop (代理迴圈),同時支援 Node.js 與 Browser (瀏覽器) 環境 |
| Type-Safe Tools (型別安全工具) | 以 Zod Schema 定義工具,自動推斷型別與驗證輸入 |
| Structured Output (結構化輸出) | 用 Zod Schema 約束 LLM 回應格式,驗證失敗自動重試 |
| Model Agnostic (模型無關) | 原生支援 Amazon Bedrock、OpenAI、Google Gemini、Anthropic、Vercel AI SDK,可擴充自訂 Provider |
| MCP 原生整合 | 內建 Model Context Protocol (MCP) Client,可直接連接外部 MCP Server |
| Streaming (串流) | 即時串流回應,提供 AsyncGenerator 介面 |
| Multi-Agent Orchestration (多 Agent 編排) | 內建 Graph (有向圖) 與 Swarm (群集) 兩種協作模式 |
| A2A Protocol (Agent-to-Agent 協定) | 支援跨進程 / 跨服務的 Agent 間通訊 |
| Session Management (會話管理) | Snapshot 機制,支援 File / S3 Storage,可跨重啟恢復對話狀態 |
| OpenTelemetry 整合 | 內建 Trace 與 Metrics,可匯出至 OTLP Collector |
1.3 誰適合使用
- 正在使用 TypeScript/Node.js 開發 AI 應用的團隊
- 需要與 AWS Bedrock 深度整合的企業用戶
- 想要 type-safe 的 Agent 開發體驗的開發者
- 需要 multi-agent orchestration (多代理編排) 的複雜應用場景
1.4 在生態系中的定位
此 SDK 是 Strands Agents 生態系的 TypeScript 核心引擎,與 Python SDK 功能對齊,同時提供 TypeScript 原生的型別安全優勢。它是建構上層應用(如 Agent Builder、MCP Server)的基礎。
2. 核心架構 (Core Architecture)
2.1 Agent Loop (代理迴圈) 架構
Strands Agents 的核心是一個 model-driven agent loop:Agent 收到使用者輸入後,將訊息送給 Model Provider,Model 決定是否需要呼叫 Tool,若需要就執行 Tool 並將結果回傳 Model,如此反覆直到 Model 決定輸出最終回應。
flowchart TD
A[User Input
使用者輸入] --> B[Agent]
B --> C{Model Provider
模型供應商}
C -->|需要工具| D[Tool Registry
工具註冊表]
D --> E[Tool Execution
工具執行]
E -->|Tool Result
工具結果| C
C -->|最終回應| F[AgentResult]
F --> G[Hooks / Plugins
生命週期掛勾]
G --> H[Output
輸出]
subgraph Conversation Manager
I[Messages History
訊息歷史]
J[Sliding Window
滑動視窗]
K[Summarizing
摘要壓縮]
end
B --> I
I --> J
I --> K
subgraph Model Providers
L[Amazon Bedrock]
M[OpenAI]
N[Google Gemini]
O[Anthropic Direct]
P[Vercel AI SDK]
end
C --> L
C --> M
C --> N
C --> O
C --> P
style A fill:#e1f5fe
style F fill:#c8e6c9
style B fill:#fff3e0
2.2 模組分層架構
SDK 的原始碼分為多個清楚的模組層:
graph TB
subgraph "Application Layer 應用層"
APP[Agent 類別]
MULTI[Multi-Agent
Graph / Swarm]
A2A[A2A Protocol
跨服務通訊]
end
subgraph "Core Layer 核心層"
TOOLS[Tool System
FunctionTool / ZodTool / MCP]
HOOKS[Hooks & Events
生命週期事件]
PLUGINS[Plugin System
插件系統]
INTERV[Interventions
介入處理]
CONV[Conversation Manager
對話管理]
SESSION[Session Manager
會話持久化]
end
subgraph "Model Layer 模型層"
MODEL[Model 抽象基類]
BEDROCK[BedrockModel]
OPENAI[OpenAIModel]
GOOGLE[GoogleModel]
ANTHROPIC[AnthropicModel]
VERCEL[VercelModel]
end
subgraph "Infrastructure Layer 基礎設施層"
STREAM[Streaming Events
串流事件]
RETRY[Retry Strategy
重試策略]
SANDBOX[Sandbox
Posix / Docker / SSH]
TELEMETRY[Telemetry
OpenTelemetry]
STATE[StateStore
狀態儲存]
LOG[Logging
日誌系統]
end
subgraph "Vended 內建擴充"
VT[Vended Tools
Bash / FileEditor / HTTP / Notebook]
VP[Vended Plugins
Skills / ContextOffloader / Goal]
VI[Vended Interventions
HITL / Steering]
end
APP --> TOOLS
APP --> HOOKS
APP --> CONV
APP --> MODEL
MULTI --> APP
A2A --> APP
TOOLS --> STREAM
HOOKS --> PLUGINS
PLUGINS --> INTERV
SESSION --> STATE
MODEL --> STREAM
MODEL --> RETRY
APP --> VT
APP --> VP
APP --> VI
style APP fill:#ff9800,color:#fff
style MULTI fill:#ff9800,color:#fff
style A2A fill:#ff9800,color:#fff
style MODEL fill:#2196f3,color:#fff
style BEDROCK fill:#2196f3,color:#fff
2.3 原始碼目錄結構
1strands-ts/src/
2├── agent/ # Agent 核心邏輯
3│ ├── agent.ts # Agent 類別主體(>800 行)
4│ ├── agent-as-tool.ts # Agent 作為 Tool 的包裝
5│ ├── tool-caller.ts # Tool 呼叫代理
6│ ├── printer.ts # 串流輸出印刷
7│ └── snapshot.ts # Agent 快照
8├── models/ # Model Provider 實作
9│ ├── model.ts # 抽象基類 Model<T>
10│ ├── bedrock.ts # Amazon Bedrock
11│ ├── anthropic.ts # Anthropic 直連
12│ ├── openai/ # OpenAI(Chat + Responses API)
13│ ├── google/ # Google Gemini
14│ ├── vercel.ts # Vercel AI SDK
15│ ├── streaming.ts # 串流事件定義
16│ └── defaults.ts # 模型預設參數
17├── tools/ # Tool 系統
18│ ├── tool.ts # Tool 抽象基類
19│ ├── function-tool.ts # FunctionTool(原始 JSON Schema)
20│ ├── zod-tool.ts # ZodTool(Zod Schema 自動轉換)
21│ ├── tool-factory.ts # tool() 工廠函式
22│ ├── mcp-tool.ts # MCP Tool 包裝
23│ └── structured-output-tool.ts # 結構化輸出工具
24├── multiagent/ # 多 Agent 編排
25│ ├── graph.ts # Graph DAG 執行引擎
26│ ├── swarm.ts # Swarm 動態路由引擎
27│ ├── nodes.ts # AgentNode / MultiAgentNode
28│ ├── edge.ts # Edge 條件路由
29│ └── state.ts # 多 Agent 狀態管理
30├── a2a/ # Agent-to-Agent 協定
31│ ├── a2a-agent.ts # 遠端 A2A Agent 包裝
32│ ├── server.ts # A2A Server
33│ └── express-server.ts # Express 整合
34├── hooks/ # 生命週期 Hook 系統
35│ ├── events.ts # 20+ 事件類別
36│ └── registry.ts # Hook 註冊表
37├── conversation-manager/ # 對話管理策略
38│ ├── sliding-window-*.ts # 滑動視窗(預設)
39│ └── summarizing-*.ts # 摘要壓縮
40├── session/ # 會話持久化
41│ ├── session-manager.ts # 會話管理器
42│ ├── file-storage.ts # 檔案系統儲存
43│ └── s3-storage.ts # AWS S3 儲存
44├── vended-tools/ # 內建工具
45│ ├── bash/ # Shell 執行
46│ ├── file-editor/ # 檔案編輯
47│ ├── http-request/ # HTTP 請求
48│ └── notebook/ # 筆記本
49├── vended-plugins/ # 內建插件
50│ ├── skills/ # Agent Skills
51│ ├── context-offloader/ # Context 卸載
52│ └── goal/ # 目標判斷
53├── vended-interventions/ # 內建介入
54│ ├── hitl/ # Human-in-the-Loop
55│ └── steering/ # 行為引導
56├── sandbox/ # 沙箱執行環境
57│ ├── posix-shell.ts # POSIX Shell
58│ ├── docker.ts # Docker 容器
59│ └── ssh.ts # SSH 遠端
60├── telemetry/ # OpenTelemetry 整合
61├── retry/ # 重試策略
62└── interventions/ # 介入框架
3. 安裝與設定 (Installation & Setup)
3.1 前置需求
| 項目 | 最低版本 | 說明 |
|---|---|---|
| Node.js | 20.0.0+ | 執行環境,使用 nvm 管理版本 |
| npm | 8+ | 套件管理 |
| TypeScript | 5.0+ | 建議但非必須(可用 tsx 直接執行 .ts) |
3.2 安裝 SDK
1# 建立新專案
2mkdir my-agent && cd my-agent
3npm init -y
4
5# 安裝核心 SDK
6npm install @strands-agents/sdk
7
8# 安裝 Zod(用於 type-safe tool 定義)
9npm install zod
3.3 設定 Model Provider
方案 A:Amazon Bedrock(預設)
Bedrock 是預設的 Model Provider,需要設定 AWS 認證:
1# 方法 1:AWS CLI profile
2aws configure
3
4# 方法 2:環境變數
5export AWS_ACCESS_KEY_ID="your-access-key"
6export AWS_SECRET_ACCESS_KEY="your-secret-key"
7export AWS_REGION="us-east-1"
同時需要在 AWS Console 中啟用 Claude Sonnet 4 的 Model Access。
方案 B:OpenAI
1# 安裝 OpenAI peer dependency
2npm install openai
3
4# 設定 API Key
5export OPENAI_API_KEY="sk-..."
方案 C:Google Gemini
1# 安裝 Google GenAI peer dependency
2npm install @google/genai
3
4# 設定 API Key
5export GOOGLE_API_KEY="..."
方案 D:Anthropic 直連
1# 安裝 Anthropic peer dependency
2npm install @anthropic-ai/sdk
3
4# 設定 API Key
5export ANTHROPIC_API_KEY="sk-ant-..."
3.4 TypeScript 設定
1// tsconfig.json
2{
3 "compilerOptions": {
4 "target": "ES2022",
5 "module": "NodeNext",
6 "moduleResolution": "NodeNext",
7 "strict": true,
8 "esModuleInterop": true,
9 "outDir": "./dist",
10 "rootDir": "./src"
11 },
12 "include": ["src/**/*"]
13}
1// package.json 中加入
2{
3 "type": "module",
4 "scripts": {
5 "start": "tsx src/index.ts",
6 "build": "tsc"
7 }
8}
3.5 驗證安裝
1// src/index.ts
2import { Agent } from '@strands-agents/sdk'
3
4const agent = new Agent()
5const result = await agent.invoke('Hello! What is 2 + 2?')
6console.log(result.toString())
1npx tsx src/index.ts
4. 使用方式與程式碼範例 (Usage & Code Examples)
4.1 範例一:基本 Agent 搭配自訂 Tool
這是最基本的使用模式 — 建立一個帶有自訂工具的 Agent。
1import { Agent, tool } from '@strands-agents/sdk'
2import { z } from 'zod'
3
4// 1. 用 Zod Schema 定義 Tool 的輸入格式
5// z.object() 定義物件結構,z.string().describe() 加上描述讓 LLM 知道每個欄位的用途
6const weatherTool = tool({
7 name: 'get_weather', // Tool 名稱,LLM 會用此名稱呼叫
8 description: 'Get current weather for a city', // Tool 描述,幫助 LLM 判斷何時使用
9 inputSchema: z.object({
10 city: z.string().describe('City name, e.g., "Taipei"'),
11 unit: z.enum(['celsius', 'fahrenheit']) // 限定只能選這兩個值
12 .default('celsius')
13 .describe('Temperature unit'),
14 }),
15 // 2. callback 的 input 參數已自動推斷型別為 { city: string; unit: 'celsius' | 'fahrenheit' }
16 callback: (input) => {
17 // 實際應用中這裡會呼叫真正的天氣 API
18 return `${input.city}: 28°C, sunny`
19 },
20})
21
22// 3. 建立 Agent,將 Tool 注入
23const agent = new Agent({
24 systemPrompt: 'You are a helpful weather assistant. Always use the get_weather tool.',
25 tools: [weatherTool],
26})
27
28// 4. 呼叫 Agent — 它會自動判斷是否需要使用 Tool
29const result = await agent.invoke('What is the weather in Taipei?')
30console.log(result.toString())
31// Agent 會呼叫 get_weather({ city: "Taipei", unit: "celsius" })
32// 然後用工具結果組合成自然語言回答
重點說明:
- 第 1 段:
tool()工廠函式 (factory function) 會將 Zod Schema 自動轉換為 JSON Schema,供 LLM 理解工具的輸入格式 - 第 2 段:TypeScript 會自動推斷
input的型別,提供完整的 IDE 自動補全 - 第 3 段:
tools陣列支援巢狀結構(Tool | McpClient | Agent | ToolList)[],也可以直接傳入其他 Agent(會自動包成 Tool) - 第 4 段:
invoke()回傳AgentResult,包含完整的 messages、stop reason、metrics 等
4.2 範例二:Structured Output (結構化輸出)
使用 Zod Schema 讓 LLM 回傳嚴格符合格式的 JSON,驗證失敗會自動重試。
1import { Agent, StructuredOutputError } from '@strands-agents/sdk'
2import { z } from 'zod'
3
4// 1. 定義期望的輸出 Schema
5const MeetingSchema = z.object({
6 title: z.string().describe('Meeting title'),
7 date: z.string().describe('Meeting date in ISO 8601 format'),
8 attendees: z.array(z.object({
9 name: z.string(),
10 role: z.string(),
11 })).describe('List of attendees'),
12 actionItems: z.array(z.string()).describe('Action items from the meeting'),
13 priority: z.enum(['low', 'medium', 'high']).describe('Meeting priority'),
14})
15
16// 2. 建立 Agent 時傳入 structuredOutputSchema
17const agent = new Agent({
18 structuredOutputSchema: MeetingSchema,
19})
20
21// 3. invoke 後取得型別安全的結構化輸出
22try {
23 const result = await agent.invoke(
24 'Parse this: Team standup on June 18th with Alice (PM) and Bob (Dev). ' +
25 'Action items: update roadmap, fix CI pipeline. High priority.'
26 )
27
28 // result.structuredOutput 的型別已自動推斷
29 const meeting = result.structuredOutput
30 console.log(meeting.title) // "Team Standup"
31 console.log(meeting.date) // "2026-06-18"
32 console.log(meeting.attendees) // [{ name: "Alice", role: "PM" }, ...]
33 console.log(meeting.priority) // "high"
34} catch (error) {
35 // 4. 多次重試後仍驗證失敗,拋出 StructuredOutputError
36 if (error instanceof StructuredOutputError) {
37 console.error('LLM output validation failed:', error.message)
38 }
39}
重點說明:
- SDK 內部會建立一個隱藏的
structured_outputTool,讓 LLM 透過 Tool Use 機制回傳結構化資料 - 如果 LLM 回傳的資料不符合 Schema,SDK 會自動將 Zod 的驗證錯誤訊息回傳給 LLM 要求修正
result.structuredOutput的型別完全由 Zod Schema 推斷,無需手動as斷言
4.3 範例三:Multi-Agent Graph (多 Agent 有向圖)
Graph 模式讓你定義確定性的執行計畫 — Agent 作為 DAG (Directed Acyclic Graph; 有向無環圖) 中的節點,邊 (Edge) 控制執行順序。
1import { Agent, BedrockModel, Graph } from '@strands-agents/sdk'
2
3const model = new BedrockModel({ maxTokens: 2048 })
4
5// 1. 定義三個專業 Agent
6const researcher = new Agent({
7 model,
8 id: 'researcher', // 必須提供 unique ID
9 systemPrompt: 'Research the topic thoroughly. Provide key facts and data points.',
10})
11
12const analyst = new Agent({
13 model,
14 id: 'analyst',
15 systemPrompt: 'Analyze the research findings. Identify trends and insights.',
16})
17
18const writer = new Agent({
19 model,
20 id: 'writer',
21 systemPrompt: 'Write a polished summary combining all inputs into a clear report.',
22})
23
24// 2. 建立 Graph,定義節點與邊
25const graph = new Graph({
26 nodes: [researcher, analyst, writer],
27 edges: [
28 // researcher 與 analyst 的結果都會流入 writer
29 ['researcher', 'writer'],
30 ['analyst', 'writer'],
31 ],
32 // 未指定 sources,自動偵測:researcher 和 analyst 沒有 incoming edge → 成為 source
33})
34
35// 3. 執行 — researcher 和 analyst 會並行執行,writer 等待兩者完成後才啟動
36const result = await graph.invoke('AI agents in healthcare')
37
38console.log('Status:', result.status) // 'complete'
39console.log('Node results:', result.results.length) // 3
40// 每個 NodeResult 包含:nodeId, status, content, metrics 等
41for (const nodeResult of result.results) {
42 console.log(`${nodeResult.nodeId}: ${nodeResult.status}`)
43}
執行流程:
- Graph 自動偵測
researcher和analyst為 source node(沒有 incoming edge) - 兩者並行執行(可用
maxConcurrency限制並行數) writer等待researcher和analyst都完成後才啟動writer的 input 會自動包含前兩個節點的 output content
與 Python SDK 的差異:
- TypeScript 用 AND 語義:所有 incoming edge 都滿足才執行
- Python 用 OR 語義:任一 incoming edge 滿足就執行
- TypeScript Node 預設 stateless(每次 snapshot/restore)
4.4 範例四:MCP 整合 + Streaming
將外部 MCP Server 的 Tool 注入 Agent,並以串流方式即時接收回應事件。
1import { Agent, McpClient } from '@strands-agents/sdk'
2import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'
3
4// 1. 建立 MCP Client,連接到本地 MCP Server
5const docTools = new McpClient({
6 transport: new StdioClientTransport({
7 command: 'uvx',
8 args: ['awslabs.aws-documentation-mcp-server@latest'],
9 }),
10})
11
12// 2. 將 MCP Client 直接作為 Tool Source 傳入
13// Agent 會自動列舉 MCP Server 上的所有 Tool
14const agent = new Agent({
15 systemPrompt: 'You are an AWS expert. Use MCP tools to look up documentation.',
16 tools: [docTools],
17})
18
19// 3. 使用 streaming API — agent.stream() 回傳 AsyncGenerator
20console.log('=== Streaming Response ===')
21for await (const event of agent.stream('How do I set up a VPC?')) {
22 switch (event.type) {
23 // 4. 每個事件有明確的 type discriminator (型別鑑別器)
24 case 'contentBlockEvent':
25 // 文字生成事件
26 if (event.contentBlock.type === 'textBlock') {
27 process.stdout.write(event.contentBlock.text)
28 }
29 break
30 case 'beforeToolCallEvent':
31 // Tool 呼叫前事件 — 可用於 logging 或 UI 顯示
32 console.log(`\n[Calling tool: ${event.toolUse.name}]`)
33 break
34 case 'toolResultEvent':
35 // Tool 回傳結果事件
36 console.log(`[Tool result received]`)
37 break
38 }
39}
40
41// 5. 使用完畢記得斷開 MCP 連線
42await docTools.disconnect()
重點說明:
McpClient可直接放入tools陣列,Agent 會在初始化時自動列舉 (list) MCP Server 上的所有 Toolstream()回傳的AsyncGenerator會 yield 20+ 種事件型別,涵蓋整個 Agent loop 生命週期- 事件型別包含:
beforeInvocationEvent,beforeModelCallEvent,contentBlockEvent,beforeToolCallEvent,afterToolCallEvent,toolResultEvent,agentResultEvent等 - 最終的
AgentResult是 generator 的 return value,可透過for await ... of後再取得
5. 進階功能 (Advanced Features)
5.1 Swarm 動態路由
與 Graph 的確定性路由不同,Swarm 讓 Agent 自己決定要將工作交給哪個 Agent。
1import { Agent, BedrockModel, Swarm } from '@strands-agents/sdk'
2
3const model = new BedrockModel({ maxTokens: 1024 })
4
5const triage = new Agent({
6 model, id: 'triage',
7 description: 'Classifies requests and routes to the right specialist.',
8 systemPrompt: 'Classify the request. Hand off to billing or technical as appropriate.',
9})
10
11const billing = new Agent({
12 model, id: 'billing',
13 description: 'Handles billing, invoices, and payment questions.',
14 systemPrompt: 'Answer billing questions. Produce a final response.',
15})
16
17const technical = new Agent({
18 model, id: 'technical',
19 description: 'Handles technical support and troubleshooting.',
20 systemPrompt: 'Answer technical questions. Produce a final response.',
21})
22
23const swarm = new Swarm({
24 nodes: [triage, billing, technical],
25 start: 'triage', // 起始節點
26 maxSteps: 4, // 防止無限迴圈
27})
28
29const result = await swarm.invoke('I was charged twice for my subscription')
30// triage 會判斷這是帳單問題,自動 handoff 給 billing
5.2 Hooks 生命週期事件系統
SDK 提供超過 20 種生命週期事件,可用於監控、logging、修改行為。
1import { Agent, BeforeToolCallEvent, AfterToolCallEvent, HookOrder } from '@strands-agents/sdk'
2
3const agent = new Agent({ tools: [/* ... */] })
4
5// 註冊 Hook — 在每次 Tool 呼叫前後執行
6agent.on(BeforeToolCallEvent, async (event) => {
7 console.log(`[Hook] About to call tool: ${event.toolUse.name}`)
8 console.log(`[Hook] Input:`, JSON.stringify(event.toolUse.input))
9
10 // 可以修改 event 來影響行為
11 // event.cancel = true // 取消此次 Tool 呼叫
12}, { order: HookOrder.EARLY })
13
14agent.on(AfterToolCallEvent, async (event) => {
15 console.log(`[Hook] Tool ${event.toolUse.name} completed`)
16 // event.result 包含 Tool 的執行結果
17})
18
19// Hook 清理 — on() 回傳 cleanup 函式
20const cleanup = agent.on(BeforeToolCallEvent, async (event) => { /* ... */ })
21cleanup() // 移除此 Hook
可用事件類別:
| 事件分類 | 事件名稱 | 說明 |
|---|---|---|
| 生命週期 | InitializedEvent | Agent 建構完成 |
| 生命週期 | BeforeInvocationEvent / AfterInvocationEvent | 每次 invoke 前後 |
| 模型 | BeforeModelCallEvent / AfterModelCallEvent | Model API 呼叫前後 |
| 工具 | BeforeToolCallEvent / AfterToolCallEvent | 單一 Tool 呼叫前後 |
| 工具批次 | BeforeToolsEvent / AfterToolsEvent | 一輪所有 Tool 處理前後 |
| 串流 | ModelStreamUpdateEvent | Model 串流的每個 chunk |
| 串流 | ToolStreamUpdateEvent | Tool 串流的每個 chunk |
| 資料 | ContentBlockEvent | 每個 content block 完成 |
| 資料 | MessageAddedEvent | 訊息加入歷史 |
| 結果 | AgentResultEvent | Agent 最終結果 |
| 中斷 | InterruptEvent | Agent 被中斷 |
5.3 Session Management (會話管理)
支援跨重啟的對話狀態持久化:
1import { Agent, SessionManager, FileStorage } from '@strands-agents/sdk'
2
3// 建立 Session Manager — 預設使用檔案系統儲存
4const sessionManager = new SessionManager({
5 storage: {
6 snapshot: new FileStorage({ baseDir: './sessions' }),
7 },
8 sessionId: 'my-session-001',
9 saveLatestOn: 'invocation', // 每次 invoke 完自動存檔
10})
11
12// Agent 綁定 SessionManager — 會自動 restore 上次的對話狀態
13const agent = new Agent({
14 sessionManager,
15 systemPrompt: 'You are a helpful assistant with memory.',
16})
17
18// 第一次執行
19await agent.invoke('My name is Alice')
20
21// 即使重啟程式,下次建立同樣 sessionId 的 Agent 時
22// 會自動載入上次的對話歷史,Agent 會「記得」使用者叫 Alice
儲存策略 (SaveLatestStrategy):
'invocation':每次invoke()完成後存檔(預設,平衡耐久性與 I/O)'message':每次加入訊息就存檔(最耐久,I/O 最高)'trigger':只在自訂 trigger 觸發時存檔
5.4 Conversation Manager (對話管理)
管理 Context Window (上下文視窗) 溢位問題:
1import {
2 Agent,
3 SlidingWindowConversationManager,
4 SummarizingConversationManager,
5} from '@strands-agents/sdk'
6
7// 方案 A:滑動視窗 — 保留最近 N 則訊息(預設 40)
8const agentA = new Agent({
9 conversationManager: new SlidingWindowConversationManager({
10 windowSize: 20, // 只保留最近 20 則訊息
11 }),
12})
13
14// 方案 B:摘要壓縮 — 超過上限時用 LLM 摘要舊訊息
15const agentB = new Agent({
16 conversationManager: new SummarizingConversationManager({
17 // 當 token 數接近 context window 上限時觸發摘要
18 }),
19})
5.5 Retry Strategy (重試策略)
內建指數退避重試,可自訂:
1import { Agent, DefaultModelRetryStrategy, ExponentialBackoff } from '@strands-agents/sdk'
2
3const agent = new Agent({
4 retryStrategy: new DefaultModelRetryStrategy({
5 maxRetries: 3,
6 backoff: new ExponentialBackoff({
7 baseMs: 1000, // 起始等待 1 秒
8 maxMs: 30000, // 最長等待 30 秒
9 }),
10 }),
11})
5.6 Agent-to-Agent (A2A) Protocol
透過 HTTP 與遠端 Agent 通訊,支援跨進程 / 跨服務部署:
1import { A2AAgent } from '@strands-agents/sdk/a2a'
2
3// Client 端:連接遠端 A2A Agent
4const remoteAgent = new A2AAgent({
5 url: 'http://localhost:9000',
6})
7
8const result = await remoteAgent.invoke('Analyze this dataset')
9console.log(result.toString())
10
11// remoteAgent 實作 InvokableAgent 介面
12// 可直接用在 Graph / Swarm 的 nodes 陣列中
5.7 Sandbox (沙箱) 執行環境
提供安全的程式碼執行環境:
1import { PosixShellSandbox } from '@strands-agents/sdk/sandbox'
2
3const sandbox = new PosixShellSandbox()
4const result = await sandbox.execute({
5 command: 'echo "Hello from sandbox"',
6 timeout: 5000,
7})
8console.log(result.stdout) // "Hello from sandbox"
支援三種 Sandbox Backend:
- PosixShellSandbox:本地 shell(開發用)
- DockerSandbox:Docker 容器(隔離執行)
- SSHSandbox:SSH 遠端(分散式部署)
5.8 Vended Plugins (內建插件)
1// Skills Plugin — 讓 Agent 具備技能框架
2import { SkillsPlugin } from '@strands-agents/sdk/vended-plugins/skills'
3
4// Goal Plugin — 自動判斷 Agent 是否達成目標
5import { GoalPlugin } from '@strands-agents/sdk/vended-plugins/goal'
6
7// Context Offloader — 自動將過長的 context 卸載到外部儲存
8import { ContextOffloaderPlugin } from '@strands-agents/sdk/vended-plugins/context-offloader'
6. Agent 可呼叫性分析 (Agent Callability)
6.1 作為 CLI 工具
SDK 本身不提供 CLI,但 monorepo 中的 strandly 是開發用 CLI:
1# strandly — monorepo 開發 CLI(非終端使用者工具)
2strandly setup # 安裝工具鏈
3strandly build # 編譯
4strandly test # 執行測試
如需 CLI Agent,可搭配 strands-agents/agent-builder 使用,或使用 vended bash tool 自建。
6.2 作為 MCP Client
SDK 內建 McpClient,可直接連接任何 MCP Server:
1import { McpClient } from '@strands-agents/sdk'
2// 支援 Stdio / SSE / Streamable HTTP 傳輸
6.3 作為 A2A Server
可將 Agent 部署為 HTTP Server,讓其他 Agent 透過 A2A Protocol 呼叫:
1import { A2AServer } from '@strands-agents/sdk/a2a'
2import { A2AExpressServer } from '@strands-agents/sdk/a2a/express'
6.4 作為 npm 套件 API
主要使用方式 — import 後在 TypeScript/JavaScript 中使用:
1import { Agent, tool, BedrockModel, Graph, Swarm, McpClient } from '@strands-agents/sdk'
6.5 可呼叫性總結
| 介面 | 支援 | 說明 |
|---|---|---|
| npm API | 完整支援 | 主要使用方式 |
| MCP Client | 完整支援 | 內建 McpClient |
| A2A Server | 完整支援 | 內建 HTTP Server |
| CLI | 間接支援 | 需搭配 Agent Builder 或自建 |
| Browser | 完整支援 | ESM Bundle 可用於瀏覽器 |
| REST API | 間接支援 | 需自行用 Express 包裝 |
7. 與生態系的關係 (Ecosystem Relationships)
7.1 Strands Agents 組織概覽
Strands Agents 組織共有 13 個 repo,形成完整的 Agent 開發平台:
| Repo | 角色 | 與 SDK TypeScript 的關係 |
|---|---|---|
| harness-sdk | 統一 monorepo(Python + TypeScript) | sdk-typescript 已遷入此 repo 的 strands-ts/ |
| sdk-typescript (本 repo) | TypeScript SDK(已 archived) | 核心引擎,所有上層應用的基礎 |
| tools | 官方 Tool 集合 | SDK 的 tools 陣列可載入這些 Tool |
| samples | 範例程式碼 | 展示 SDK 的各種使用方式 |
| agent-builder | 互動式 Agent 建構器 | 基於 SDK 建構的終端 Agent |
| mcp-server | Strands 文件 MCP Server | 讓 AI coding 助手查詢 Strands 文件 |
| docs | 官方文件 | SDK 的完整文件站 |
| evals | 評估框架 | 測量 Agent 品質的工具 |
| shell | 安全 Shell 工具 | 提供沙箱化的 shell 執行環境 |
| agent-sop | 自然語言工作流 | 用自然語言定義多步驟 Agent 流程 |
| devtools | CI/CD 共用工具 | GitHub Actions 與 workflow |
| extension-template | 擴充套件模板 | 開發自訂 Tool / Plugin 的模板 |
| .github | 組織設定 | GitHub 組織層級的設定 |
7.2 依賴關係
1sdk-typescript (core engine)
2├── tools (official tools) → 透過 npm 或直接引用
3├── samples (examples) → 展示 SDK 用法
4├── agent-builder (terminal agent) → import SDK 建構互動式 Agent
5├── mcp-server (docs server) → Agent 可連接的 MCP Server
6├── evals (evaluation) → 測量 SDK 建構的 Agent 品質
7├── shell (sandbox) → SDK 的 Sandbox 模組可使用
8└── agent-sop (workflows) → 在 SDK Agent 上層定義 SOP
7.3 與 Python SDK 的關係
TypeScript SDK 與 Python SDK 設計理念一致,API 命名對齊,但有若干刻意的差異:
| 面向 | TypeScript SDK | Python SDK |
|---|---|---|
| Tool 定義 | Zod Schema(自動型別推斷) | Pydantic 或 dict |
| Graph 依賴語義 | AND(所有 incoming edge 滿足) | OR(任一滿足) |
| Graph 排程 | 個別 node 就緒即啟動 | 批次排程 |
| Node 狀態 | 預設 stateless | 預設累積狀態 |
| Node 失敗處理 | 產生 FAILED result,其他路徑繼續 | 拋出 exception(fail-fast) |
| Structured Output | Zod Schema + 自動重試 | Pydantic |
| WASM Bridge | 有 strands-py-wasm 可在 Python 中呼叫 TS Agent | N/A |
8. 優缺點分析 (Strengths & Limitations)
8.1 優點
| 優點 | 說明 |
|---|---|
| 型別安全 | Zod Schema 提供完整的 compile-time + runtime 型別檢查,DX 極佳 |
| Model Agnostic | 5 個 Model Provider + 可擴充,不綁定特定供應商 |
| MCP 原生 | 不需額外套件,直接支援 MCP Protocol |
| Multi-Agent | 內建 Graph + Swarm 兩種模式,涵蓋確定性與動態路由 |
| 事件系統完整 | 20+ 種生命週期事件,可深度客製化 Agent 行為 |
| Session 持久化 | 內建 Snapshot 機制,支援 File / S3 儲存 |
| Browser 支援 | 同一套 SDK 可在 Node.js 和瀏覽器中使用 |
| A2A Protocol | 跨進程 Agent 通訊,適合微服務架構 |
| AWS 深度整合 | Bedrock 作為預設 Provider,S3 Storage 等 AWS 服務原生支援 |
8.2 限制
| 限制 | 說明 |
|---|---|
| AWS 預設偏向 | 預設 Bedrock,其他 Provider 需額外安裝 peer dependency |
| Repo 已 archived | 已遷入 harness-sdk monorepo,新開發者可能混淆 |
| 學習曲線 | 事件系統、Plugin、Intervention 三套擴充機制,概念較多 |
| Zod 強綁定 | Tool 定義強依賴 Zod,若團隊偏好其他驗證庫需轉換 |
| 社群早期 | 相較 LangChain.js 等成熟框架,社群資源較少 |
| 文件分散 | 部分進階功能(如 Vended Plugins)文件不夠完整 |
| Peer Dependency 多 | 可選功能多,peer dependency 列表長,初始設定需判斷安裝哪些 |
8.3 與競品比較
| 面向 | Strands Agents TS | LangChain.js | Vercel AI SDK |
|---|---|---|---|
| 定位 | Agent Framework | Chain + Agent Framework | AI UI Library |
| Type Safety | Zod-first | 部分支援 | Zod 支援 |
| Multi-Agent | Graph + Swarm + A2A | LangGraph | 無內建 |
| MCP | 內建 | 需外掛 | 部分支援 |
| Model Provider | 5+ 內建 | 20+ 內建 | 10+ 內建 |
| AWS 整合 | 原生深度 | 基本 | 基本 |
| Bundle Size | 中等 | 較大 | 較小 |
9. 實戰應用場景 (Real-world Use Cases)
9.1 場景一:企業客服分流系統
使用 Swarm 模式建立客服分流系統,讓 triage Agent 自動判斷問題類型並路由到專業 Agent:
1const swarm = new Swarm({
2 nodes: [triageAgent, billingAgent, technicalAgent, returnAgent],
3 start: 'triage',
4 maxSteps: 6,
5})
6
7// 搭配 SessionManager 實現跨 session 的對話記憶
8// 搭配 HITL Intervention 讓人工客服可隨時接管
適用情境:電商客服、SaaS 技術支援、金融諮詢分流
9.2 場景二:研究報告自動生成管線
使用 Graph 模式定義確定性的研究管線:
1const graph = new Graph({
2 nodes: [
3 dataCollector, // 蒐集資料(搭配 HTTP Tool + MCP)
4 factChecker, // 事實查核
5 statistician, // 統計分析
6 reportWriter, // 報告撰寫
7 reviewer, // 品質審查
8 ],
9 edges: [
10 ['dataCollector', 'factChecker'],
11 ['dataCollector', 'statistician'],
12 ['factChecker', 'reportWriter'],
13 ['statistician', 'reportWriter'],
14 ['reportWriter', 'reviewer'],
15 ],
16})
17// dataCollector → factChecker 和 statistician 並行 → reportWriter → reviewer
適用情境:市場研究報告、競品分析、文獻回顧
9.3 場景三:DevOps 自動化 Agent
搭配 Vended Tools(Bash + FileEditor + HTTP)建立 DevOps Agent:
1import { Agent, tool } from '@strands-agents/sdk'
2import { BashTool } from '@strands-agents/sdk/vended-tools/bash'
3import { FileEditorTool } from '@strands-agents/sdk/vended-tools/file-editor'
4import { HttpRequestTool } from '@strands-agents/sdk/vended-tools/http-request'
5
6const devopsAgent = new Agent({
7 systemPrompt: `You are a DevOps agent. You can:
8 - Run shell commands to check system status
9 - Edit configuration files
10 - Make HTTP requests to monitoring APIs
11 Always explain what you are doing before executing commands.`,
12 tools: [new BashTool(), new FileEditorTool(), new HttpRequestTool()],
13})
14
15// 搭配 PosixShellSandbox 或 DockerSandbox 提供安全執行環境
16await devopsAgent.invoke('Check if nginx is running and restart if needed')
適用情境:伺服器監控、CI/CD 管線維護、基礎設施自動化
附錄:快速參考
常用 Import
1// 核心
2import { Agent, tool, BedrockModel } from '@strands-agents/sdk'
3
4// Model Providers
5import { OpenAIModel } from '@strands-agents/sdk/models/openai'
6import { GoogleModel } from '@strands-agents/sdk/models/google'
7import { AnthropicModel } from '@strands-agents/sdk/models/anthropic'
8
9// Multi-Agent
10import { Graph, Swarm } from '@strands-agents/sdk/multiagent'
11
12// A2A
13import { A2AAgent, A2AServer } from '@strands-agents/sdk/a2a'
14
15// Session
16import { SessionManager, FileStorage } from '@strands-agents/sdk'
17
18// Telemetry
19import { AgentTrace, AgentMetrics } from '@strands-agents/sdk/telemetry'
20
21// Vended Tools
22import { BashTool } from '@strands-agents/sdk/vended-tools/bash'
23import { FileEditorTool } from '@strands-agents/sdk/vended-tools/file-editor'
24import { HttpRequestTool } from '@strands-agents/sdk/vended-tools/http-request'
25import { NotebookTool } from '@strands-agents/sdk/vended-tools/notebook'
26
27// Sandbox
28import { PosixShellSandbox } from '@strands-agents/sdk/sandbox'
29
30// Zod(peer dependency)
31import { z } from 'zod'
錯誤處理
1import {
2 ModelError, // 模型呼叫錯誤
3 ContextWindowOverflowError, // Context Window 溢位
4 MaxTokensError, // 達到 Max Tokens 限制
5 StructuredOutputError, // 結構化輸出驗證失敗
6 ConcurrentInvocationError, // 並行呼叫衝突
7 ModelThrottledError, // 模型被限流
8 ToolValidationError, // Tool 輸入驗證失敗
9 ToolNotFoundError, // Tool 不存在
10} from '@strands-agents/sdk'
Comments