為什麼使用 Claude Code SDK?

Claude Code SDK 提供了建構生產就緒代理所需的所有構建塊:

  • 優化的 Claude 整合:自動提示快取和 效能優化
  • 豐富的工具生態系統:檔案操作、程式碼執行、網路搜尋和 MCP 擴展性
  • 進階權限:對代理能力的細粒度控制
  • 生產必需品:內建錯誤處理、會話管理和 監控

您可以使用 SDK 建構什麼?

以下是您可以建立的一些範例代理類型:

編程代理:

  • 診斷和修復生產問題的 SRE 代理
  • 審核程式碼漏洞的安全審查機器人
  • 分類事件的值班工程助理
  • 執行風格和最佳實踐的程式碼審查代理

商業代理:

  • 審查合約和合規性的法律助理
  • 分析報告和預測的財務顧問
  • 解決技術問題的客戶支援代理
  • 為行銷團隊提供內容創作助理

SDK 目前提供 TypeScript 和 Python 版本,並具有用於快速原型設計的命令列介面 (CLI)。

快速開始

在 5 分鐘內讓您的第一個代理運行:

1

安裝 SDK

從 NPM 安裝 @anthropic-ai/claude-code

npm install -g @anthropic-ai/claude-code
2

設定您的 API 金鑰

Anthropic Console 取得您的 API 金鑰並設定 ANTHROPIC_API_KEY 環境變數:

export ANTHROPIC_API_KEY="your-api-key-here"
3

建立您的第一個代理

建立以下範例代理之一:

# 建立一個簡單的法律助理
claude -p "審查此合約條款的潛在問題:'當事人同意承擔無限責任...'" \
  --append-system-prompt "您是法律助理。識別風險並建議改進。"
4

執行代理

將上述命令直接複製並貼上到您的終端機中。

上述每個範例都會建立一個工作代理,該代理將:

  • 使用 Claude 的推理能力分析提示
  • 規劃解決問題的多步驟方法
  • 使用檔案操作、bash 命令和網路搜尋等工具執行動作
  • 根據分析提供可行的建議

核心用法

概述

Claude Code SDK 允許您從應用程式中以非互動模式與 Claude Code 介面。

先決條件

  • Node.js 18+
  • 來自 NPM 的 @anthropic-ai/claude-code

基本用法

Claude Code 的主要命令列介面是 claude 命令。使用 --print(或 -p)標誌以非互動模式執行並列印最終結果:

claude -p "分析系統效能" \
  --append-system-prompt "您是效能工程師" \
  --allowedTools "Bash,Read,WebSearch" \
  --permission-mode acceptEdits \
  --cwd /path/to/project

配置

SDK 利用 Claude Code 中可用的所有 CLI 選項。以下是 SDK 用法的關鍵選項:

標誌描述範例
--print, -p以非互動模式執行claude -p "query"
--output-format指定輸出格式(textjsonstream-jsonclaude -p --output-format json
--resume, -r透過會話 ID 恢復對話claude --resume abc123
--continue, -c繼續最近的對話claude --continue
--verbose啟用詳細記錄claude --verbose
--append-system-prompt附加到系統提示(僅與 --print 一起使用)claude --append-system-prompt "自訂指令"
--allowedTools允許工具的空格分隔清單,或

允許工具的逗號分隔清單字串
claude --allowedTools mcp__slack mcp__filesystem

claude --allowedTools "Bash(npm install),mcp__filesystem"
--disallowedTools拒絕工具的空格分隔清單,或

拒絕工具的逗號分隔清單字串
claude --disallowedTools mcp__splunk mcp__github

claude --disallowedTools "Bash(git commit),mcp__github"
--mcp-config從 JSON 檔案載入 MCP 伺服器claude --mcp-config servers.json
--permission-prompt-tool用於處理權限提示的 MCP 工具(僅與 --print 一起使用)claude --permission-prompt-tool mcp__auth__prompt

有關 CLI 選項和功能的完整清單,請參閱 CLI 參考 文件。

身份驗證

Anthropic API 金鑰

對於基本身份驗證,從 Anthropic Console 取得 Anthropic API 金鑰並設定 ANTHROPIC_API_KEY 環境變數,如 快速開始 中所示。

第三方 API 憑證

SDK 也支援透過第三方 API 提供者進行身份驗證:

  • Amazon Bedrock:設定 CLAUDE_CODE_USE_BEDROCK=1 環境變數並配置 AWS 憑證
  • Google Vertex AI:設定 CLAUDE_CODE_USE_VERTEX=1 環境變數並配置 Google Cloud 憑證

有關第三方提供者的詳細配置說明,請參閱 Amazon BedrockGoogle Vertex AI 文件。

多輪對話

對於多輪對話,您可以恢復對話或從最近的會話繼續:

# 繼續最近的對話
claude --continue "現在重構這個以獲得更好的效能"

# 透過會話 ID 恢復特定對話
claude --resume 550e8400-e29b-41d4-a716-446655440000 "更新測試"

# 以非互動模式恢復
claude --resume 550e8400-e29b-41d4-a716-446655440000 "修復所有 linting 問題" --no-interactive

使用計劃模式

計劃模式允許 Claude 在不進行修改的情況下分析程式碼,對程式碼審查和規劃變更很有用。

claude -p "審查此程式碼" --permission-mode plan

計劃模式限制編輯、檔案建立和命令執行。詳情請參閱 權限模式

自訂系統提示

系統提示定義您的代理的角色、專業知識和行為。這是您指定要建構什麼類型代理的地方:

# SRE 事件回應代理
claude -p "API 已關閉,調查" \
  --append-system-prompt "您是 SRE 專家。系統性地診斷問題並提供可行的解決方案。"

# 法律文件審查代理  
claude -p "審查此合約" \
  --append-system-prompt "您是企業律師。識別風險,建議改進,並確保合規性。"

# 附加到預設系統提示
claude -p "重構此函數" \
  --append-system-prompt "始終包含全面的錯誤處理和單元測試。"

進階用法

透過 MCP 的自訂工具

模型上下文協定 (MCP) 讓您為代理提供自訂工具和能力。這對於建構需要特定領域整合的專業代理至關重要。

範例代理工具配置:

{
  "mcpServers": {
    "slack": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-slack"],
      "env": {"SLACK_TOKEN": "your-slack-token"}
    },
    "jira": {
      "command": "npx", 
      "args": ["-y", "@modelcontextprotocol/server-jira"],
      "env": {"JIRA_TOKEN": "your-jira-token"}
    },
    "database": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres"],
      "env": {"DB_CONNECTION_STRING": "your-db-url"}
    }
  }
}

用法範例:

# 帶有監控工具的 SRE 代理
claude -p "調查付款服務中斷" \
  --mcp-config sre-tools.json \
  --allowedTools "mcp__datadog,mcp__pagerduty,mcp__kubernetes" \
  --append-system-prompt "您是 SRE。使用監控資料診斷問題。"

# 帶有 CRM 存取的客戶支援代理
claude -p "協助解決客戶票證 #12345" \
  --mcp-config support-tools.json \
  --allowedTools "mcp__zendesk,mcp__stripe,mcp__user_db" \
  --append-system-prompt "您是技術支援專家。"

使用 MCP 工具時,您必須使用 --allowedTools 標誌明確允許它們。MCP 工具名稱遵循 mcp__<serverName>__<toolName> 模式,其中:

  • serverName 是來自您的 MCP 配置檔案的金鑰
  • toolName 是該伺服器提供的特定工具

這種安全措施確保 MCP 工具只有在明確允許時才會被使用。

如果您只指定伺服器名稱(即 mcp__<serverName>),該伺服器的所有工具都將被允許。

不支援萬用字元模式(例如 mcp__go*)。

自訂權限提示工具

可選地,使用 --permission-prompt-tool 傳入一個 MCP 工具,我們將使用它來檢查使用者是否授予模型調用給定工具的權限。當模型調用工具時,會發生以下情況:

  1. 我們首先檢查權限設定:所有 settings.json 檔案,以及傳入 SDK 的 --allowedTools--disallowedTools;如果其中一個允許或拒絕工具調用,我們就繼續進行工具調用
  2. 否則,我們調用您在 --permission-prompt-tool 中提供的 MCP 工具

--permission-prompt-tool MCP 工具會傳遞工具名稱和輸入,並且必須返回帶有結果的 JSON 字串化有效負載。有效負載必須是以下之一:

// 允許工具調用
{
  "behavior": "allow",
  "updatedInput": {...}, // 更新的輸入,或只是返回原始輸入
}

// 拒絕工具調用
{
  "behavior": "deny",
  "message": "..." // 解釋為什麼權限被拒絕的人類可讀字串
}

實作範例:

# 與您的 MCP 伺服器配置一起使用
claude -p "分析並修復安全問題" \
  --permission-prompt-tool mcp__security__approval_prompt \
  --mcp-config security-tools.json \
  --allowedTools "Read,Grep" \
  --disallowedTools "Bash(rm*),Write"

# 使用自訂權限規則
claude -p "重構程式碼庫" \
  --permission-prompt-tool mcp__custom__permission_check \
  --mcp-config custom-config.json \
  --output-format json

使用注意事項:

  • 使用 updatedInput 告訴模型權限提示改變了其輸入;否則,將 updatedInput 設定為原始輸入,如上例所示。例如,如果工具向使用者顯示檔案編輯差異並讓他們手動編輯差異,權限提示工具應該返回該更新的編輯。
  • 有效負載必須是 JSON 字串化的

輸出格式

SDK 支援多種輸出格式:

文字輸出(預設)

claude -p "解釋檔案 src/components/Header.tsx"
# 輸出:這是一個 React 元件顯示...

JSON 輸出

返回包含元資料的結構化資料:

claude -p "資料層如何工作?" --output-format json

回應格式:

{
  "type": "result",
  "subtype": "success",
  "total_cost_usd": 0.003,
  "is_error": false,
  "duration_ms": 1234,
  "duration_api_ms": 800,
  "num_turns": 6,
  "result": "回應文字在這裡...",
  "session_id": "abc123"
}

串流 JSON 輸出

在收到每個訊息時串流:

$ claude -p "建構應用程式" --output-format stream-json

每個對話都以初始 init 系統訊息開始,接著是使用者和助理訊息清單,最後是帶有統計資料的最終 result 系統訊息。每個訊息都作為單獨的 JSON 物件發出。

訊息架構

從 JSON API 返回的訊息根據以下架構嚴格類型化:

type SDKMessage =
  // 助理訊息
  | {
      type: "assistant";
      message: Message; // 來自 Anthropic SDK
      session_id: string;
    }

  // 使用者訊息
  | {
      type: "user";
      message: MessageParam; // 來自 Anthropic SDK
      session_id: string;
    }

  // 作為最後一個訊息發出
  | {
      type: "result";
      subtype: "success";
      duration_ms: float;
      duration_api_ms: float;
      is_error: boolean;
      num_turns: int;
      result: string;
      session_id: string;
      total_cost_usd: float;
    }

  // 當我們達到最大輪數時作為最後一個訊息發出
  | {
      type: "result";
      subtype: "error_max_turns" | "error_during_execution";
      duration_ms: float;
      duration_api_ms: float;
      is_error: boolean;
      num_turns: int;
      session_id: string;
      total_cost_usd: float;
    }

  // 在對話開始時作為第一個訊息發出
  | {
      type: "system";
      subtype: "init";
      apiKeySource: string;
      cwd: string;
      session_id: string;
      tools: string[];
      mcp_servers: {
        name: string;
        status: string;
      }[];
      model: string;
      permissionMode: "default" | "acceptEdits" | "bypassPermissions" | "plan";
    };

我們很快將以 JSONSchema 相容格式發布這些類型。我們對主要 Claude Code 套件使用語義版本控制來傳達此格式的重大變更。

MessageMessageParam 類型在 Anthropic SDK 中可用。例如,請參閱 Anthropic TypeScriptPython SDK。

輸入格式

SDK 支援多種輸入格式:

文字輸入(預設)

# 直接參數
claude -p "解釋此程式碼"

# 從 stdin
echo "解釋此程式碼" | claude -p

串流 JSON 輸入

透過 stdin 提供的訊息串流,其中每個訊息代表一個使用者輪次。這允許多輪對話而無需重新啟動 claude 二進位檔案,並允許在模型處理請求時向模型提供指導。

每個訊息都是一個 JSON ‘使用者訊息’ 物件,遵循與輸出訊息架構相同的格式。訊息使用 jsonl 格式格式化,其中每行輸入都是一個完整的 JSON 物件。串流 JSON 輸入需要 -p--output-format stream-json

目前這僅限於純文字使用者訊息。

$ echo '{"type":"user","message":{"role":"user","content":[{"type":"text","text":"解釋此程式碼"}]}}' | claude -p --output-format=stream-json --input-format=stream-json --verbose

代理整合範例

SRE 事件回應機器人

#!/bin/bash

# 自動化事件回應代理
investigate_incident() {
    local incident_description="$1"
    local severity="${2:-medium}"
    
    claude -p "事件:$incident_description(嚴重性:$severity)" \
      --append-system-prompt "您是 SRE 專家。診斷問題,評估影響,並提供立即行動項目。" \
      --output-format json \
      --allowedTools "Bash,Read,WebSearch,mcp__datadog" \
      --mcp-config monitoring-tools.json
}

# 用法
investigate_incident "付款 API 返回 500 錯誤" "high"

自動化安全審查

# 拉取請求的安全審計代理
audit_pr() {
    local pr_number="$1"
    
    gh pr diff "$pr_number" | claude -p \
      --append-system-prompt "您是安全工程師。審查此 PR 的漏洞、不安全模式和合規問題。" \
      --output-format json \
      --allowedTools "Read,Grep,WebSearch"
}

# 用法並儲存到檔案
audit_pr 123 > security-report.json

多輪法律助理

# 帶有會話持久性的法律文件審查
session_id=$(claude -p "開始法律審查會話" --output-format json | jq -r '.session_id')

# 分多個步驟審查合約
claude -p --resume "$session_id" "審查 contract.pdf 的責任條款"
claude -p --resume "$session_id" "檢查 GDPR 要求的合規性" 
claude -p --resume "$session_id" "生成風險的執行摘要"

Python 特定最佳實踐

關鍵模式

import asyncio
from claude_code_sdk import ClaudeSDKClient, ClaudeCodeOptions

# 始終使用上下文管理器
async with ClaudeSDKClient() as client:
    await client.query("分析此程式碼")
    async for msg in client.receive_response():
        # 處理串流訊息
        pass

# 同時執行多個代理
async with ClaudeSDKClient() as reviewer, ClaudeSDKClient() as tester:
    await asyncio.gather(
        reviewer.query("審查 main.py"),
        tester.query("為 main.py 編寫測試")
    )

# 錯誤處理
from claude_code_sdk import CLINotFoundError, ProcessError

try:
    async with ClaudeSDKClient() as client:
        # 您的程式碼在這裡
        pass
except CLINotFoundError:
    print("安裝 CLI:npm install -g @anthropic-ai/claude-code")
except ProcessError as e:
    print(f"處理錯誤:{e}")

# 收集帶有元資料的完整回應
async def get_response(client, prompt):
    await client.query(prompt)
    text = []
    async for msg in client.receive_response():
        if hasattr(msg, 'content'):
            for block in msg.content:
                if hasattr(block, 'text'):
                    text.append(block.text)
        if type(msg).__name__ == "ResultMessage":
            return {'text': ''.join(text), 'cost': msg.total_cost_usd}

IPython/Jupyter 提示

# 在 Jupyter 中,直接在單元格中使用 await
client = ClaudeSDKClient()
await client.connect()
await client.query("分析 data.csv")
async for msg in client.receive_response():
    print(msg)
await client.disconnect()

# 建立可重複使用的輔助函數
async def stream_print(client, prompt):
    await client.query(prompt)
    async for msg in client.receive_response():
        if hasattr(msg, 'content'):
            for block in msg.content:
                if hasattr(block, 'text'):
                    print(block.text, end='', flush=True)

最佳實踐

  • 使用 JSON 輸出格式 進行程式化回應解析:

    # 使用 jq 解析 JSON 回應
    result=$(claude -p "生成程式碼" --output-format json)
    code=$(echo "$result" | jq -r '.result')
    cost=$(echo "$result" | jq -r '.cost_usd')
    
  • 優雅地處理錯誤 - 檢查退出碼和 stderr:

    if ! claude -p "$prompt" 2>error.log; then
        echo "發生錯誤:" >&2
        cat error.log >&2
        exit 1
    fi
    
  • 使用會話管理 在多輪對話中維護上下文

  • 考慮超時 對於長時間執行的操作:

    timeout 300 claude -p "$complex_prompt" || echo "5 分鐘後超時"
    
  • 尊重速率限制 在進行多個請求時,在調用之間新增延遲

相關資源