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.js20.0.0+執行環境,使用 nvm 管理版本
npm8+套件管理
TypeScript5.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_output Tool,讓 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}

執行流程

  1. Graph 自動偵測 researcheranalyst 為 source node(沒有 incoming edge)
  2. 兩者並行執行(可用 maxConcurrency 限制並行數)
  3. writer 等待 researcheranalyst 都完成後才啟動
  4. 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 上的所有 Tool
  • stream() 回傳的 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

可用事件類別

事件分類事件名稱說明
生命週期InitializedEventAgent 建構完成
生命週期BeforeInvocationEvent / AfterInvocationEvent每次 invoke 前後
模型BeforeModelCallEvent / AfterModelCallEventModel API 呼叫前後
工具BeforeToolCallEvent / AfterToolCallEvent單一 Tool 呼叫前後
工具批次BeforeToolsEvent / AfterToolsEvent一輪所有 Tool 處理前後
串流ModelStreamUpdateEventModel 串流的每個 chunk
串流ToolStreamUpdateEventTool 串流的每個 chunk
資料ContentBlockEvent每個 content block 完成
資料MessageAddedEvent訊息加入歷史
結果AgentResultEventAgent 最終結果
中斷InterruptEventAgent 被中斷

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-serverStrands 文件 MCP Server讓 AI coding 助手查詢 Strands 文件
docs官方文件SDK 的完整文件站
evals評估框架測量 Agent 品質的工具
shell安全 Shell 工具提供沙箱化的 shell 執行環境
agent-sop自然語言工作流用自然語言定義多步驟 Agent 流程
devtoolsCI/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 SDKPython SDK
Tool 定義Zod Schema(自動型別推斷)Pydantic 或 dict
Graph 依賴語義AND(所有 incoming edge 滿足)OR(任一滿足)
Graph 排程個別 node 就緒即啟動批次排程
Node 狀態預設 stateless預設累積狀態
Node 失敗處理產生 FAILED result,其他路徑繼續拋出 exception(fail-fast)
Structured OutputZod Schema + 自動重試Pydantic
WASM Bridgestrands-py-wasm 可在 Python 中呼叫 TS AgentN/A

8. 優缺點分析 (Strengths & Limitations)

8.1 優點

優點說明
型別安全Zod Schema 提供完整的 compile-time + runtime 型別檢查,DX 極佳
Model Agnostic5 個 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 TSLangChain.jsVercel AI SDK
定位Agent FrameworkChain + Agent FrameworkAI UI Library
Type SafetyZod-first部分支援Zod 支援
Multi-AgentGraph + Swarm + A2ALangGraph無內建
MCP內建需外掛部分支援
Model Provider5+ 內建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'

相關資源