info-claude-agent-sdk-ai-agent-python-typescript

กลุ่มผู้อ่าน: นักพัฒนาซอฟต์แวร์ ผู้สอน และผู้เริ่มพัฒนาระบบ Agentic AI

Claude Agent SDK เป็นชุดพัฒนาของ Anthropic สำหรับนำความสามารถของ Claude Code มาใช้ภายในโปรแกรม Python หรือ TypeScript ผู้พัฒนากำหนดงาน เครื่องมือ สิทธิ์ และวิธีรับผลลัพธ์ ส่วน SDK จัดการวงจรที่เอเจนต์เลือกใช้เครื่องมือ รับผล และทำงานต่อจนเสร็จหรือถึงเงื่อนไขหยุด [1][2]

ตัวอย่างงานคืออ่านโค้ดเพื่อหาบั๊ก สร้างกรณีทดสอบ วิเคราะห์เอกสาร หรือเชื่อมต่อ API ภายในองค์กร ผู้พัฒนารันกระบวนการของ Agent SDK ในสภาพแวดล้อมที่ตนดูแล เช่น เครื่องพัฒนา คอนเทนเนอร์ หรือ worker ของระบบ

#1. Claude Agent SDK คืออะไร

การสร้างเอเจนต์ต้องมีองค์ประกอบมากกว่าการส่ง prompt ให้โมเดล ระบบต้องจัดการว่าเครื่องมือใดใช้ได้ จะรันเครื่องมืออย่างไร จะส่งผลกลับให้โมเดลเมื่อใด และจะหยุดการทำงานด้วยเงื่อนไขใด

Agent SDK มีเครื่องมือและ agent loop ของ Claude Code ให้ใช้ พร้อมการจัดการบริบท การอนุญาตใช้เครื่องมือ hooks และ sessions เราจึงเขียนโปรแกรมเพื่อควบคุมเอเจนต์ในระดับงานได้ [1]

ชื่อเดิมที่อาจพบในบทความเก่าคือ Claude Code SDK โดยชื่อแพ็กเกจปัจจุบันคือ [3]

ภาษา แพ็กเกจ วิธี import
Python claude-agent-sdk from claude_agent_sdk import query
TypeScript / JavaScript @anthropic-ai/claude-agent-sdk import { query } from "@anthropic-ai/claude-agent-sdk"

SDK ทำงานร่วมกับ Claude Code runtime บนเครื่องที่รันโปรแกรม ขณะที่การประมวลผลโมเดลใช้บริการ Claude ที่ตั้งค่าไว้ การติดตั้ง SDK จึงไม่ได้ทำให้โมเดลทำงานออฟไลน์

#2. เลือกใช้ SDK แบบใด

สิ่งที่ต้องการ เครื่องมือที่เหมาะ ความรับผิดชอบหลักของผู้พัฒนา
ส่งข้อความให้ Claude และรับคำตอบผ่าน API Claude Client SDK เช่น anthropic ออกแบบ application flow และการเชื่อมเครื่องมือ
ใช้เอเจนต์ช่วยพัฒนาโปรแกรมในเทอร์มินัล Claude Code CLI สั่งงานและตรวจผลระหว่างพัฒนา
ฝังเอเจนต์ของ Claude Code ในแอป Claude Agent SDK ดูแล process, workspace, สิทธิ์ และการเชื่อมระบบ
ใช้โครงสร้างพื้นฐานเอเจนต์ที่ Anthropic จัดการ Claude Managed Agents กำหนดเอเจนต์และเชื่อมกับบริการที่โฮสต์ให้

Client SDK เข้าถึง API โดยตรง และมีตัวช่วยบางส่วน เช่น tool runner ตามความสามารถของแต่ละ SDK ส่วน Agent SDK เตรียมเครื่องมือของ Claude Code และวงจรการทำงานมาให้แล้ว [1]

สำหรับระบบตรวจโค้ดตามคำขอของผู้ใช้ แนวทางหนึ่งคือให้เว็บแอปรับงาน ส่งงานเข้า queue แล้วให้ worker ที่ใช้ Agent SDK ตรวจ workspace ของงานนั้น

#3. Agent loop ทำงานอย่างไร

หนึ่งคำสั่ง query() สามารถทำงานหลายรอบได้ เช่น อ่านไฟล์หนึ่งครั้ง ค้นหาโค้ดที่เกี่ยวข้อง แล้วอ่านรายละเอียดเพิ่มเติม ก่อนส่งรายงาน [2]

flowchart TD
    A["งานและข้อกำหนด"] --> B["Claude ประเมินข้อมูล"]
    B --> C{"ต้องใช้เครื่องมือหรือไม่"}
    C -->|ต้องใช้| D["ตรวจสิทธิ์และเรียกเครื่องมือ"]
    D --> E["รับผลการทำงาน"]
    E --> B
    C -->|ไม่ต้องใช้| F["ส่งผลลัพธ์"]

ผู้พัฒนารับ message stream ระหว่างเอเจนต์ทำงานได้ เช่น ข้อความที่เอเจนต์ส่งออก การเรียกเครื่องมือ และผลลัพธ์สุดท้าย โดยข้อความที่แสดงให้ผู้ใช้ดูควรเป็นความคืบหน้า หลักฐาน และผลการทำงาน

ข้อแตกต่างที่ควรเข้าใจ: การเขียน async for เพื่ออ่านข้อความจาก SDK ไม่ได้หมายความว่าเราต้องเขียน agent loop ใหม่เอง SDK เป็นผู้ประสานการเรียกเครื่องมือและส่งผลกลับให้โมเดล

#4. ความสามารถสำคัญ

ความสามารถ ประโยชน์ ตัวอย่างงาน
Built-in tools อ่าน ค้นหา เขียน แก้ไขไฟล์ และรันคำสั่งตามสิทธิ์ ตรวจโค้ดและแก้บั๊ก
Sessions ต่อบทสนทนาและกลับมาทำงานเดิม วิเคราะห์โค้ดแล้วถามรายละเอียดต่อ
Hooks รันโค้ดตรวจสอบหรือบันทึกเหตุการณ์ บันทึกชื่อเครื่องมือและเวลาที่ใช้
MCP / custom tools เชื่อมข้อมูลและฟังก์ชันของระบบ อ่านข้อมูลบั๊กจากบริการภายใน
Subagents มอบงานย่อยให้เอเจนต์เฉพาะด้าน แยกตรวจตรรกะกับออกแบบกรณีทดสอบ
Structured output คืนข้อมูลตาม schema ส่งรายงานเข้า dashboard
Skills ใช้ชุดคำแนะนำและทรัพยากรที่นำกลับมาใช้ได้ ใช้มาตรฐานการรีวิวของทีม

ความสามารถเหล่านี้ประกอบกันเป็นระบบได้ แต่ควรเริ่มจากงานเล็กที่ตรวจผลได้ชัดเจน แล้วเพิ่มส่วนขยายตามความจำเป็น [1]

#5. Workshop: ตรวจบั๊กในโค้ดคำนวณค่าจัดส่ง

เราจะสร้างเอเจนต์ให้อ่านไฟล์ตัวอย่าง ตรวจเงื่อนไข และอธิบายบั๊กพร้อมกรณีทดสอบ โดยเปิดเฉพาะเครื่องมืออ่านและค้นหา

#5.1 เตรียม Python

เอกสาร Quickstart ระบุ Python 3.10 ขึ้นไป ตัวอย่างนี้ใช้ virtual environment [4]

macOS / Linux:

mkdir claude-agent-lab
cd claude-agent-lab
python3 -m venv .venv
source .venv/bin/activate
python -m pip install claude-agent-sdk
mkdir workspace

Windows PowerShell:

mkdir claude-agent-lab
cd claude-agent-lab
py -m venv .venv
.venv\Scripts\Activate.ps1
python -m pip install claude-agent-sdk
mkdir workspace

หาก PowerShell ปิดกั้น activation script สามารถใช้ Set-ExecutionPolicy -Scope Process RemoteSigned สำหรับ process ปัจจุบันตามคำแนะนำใน Quickstart

แพ็กเกจของทั้งสองภาษาส่วนใหญ่มี native Claude Code binary มาด้วย จึงมักไม่ต้องติดตั้ง CLI แยก อย่างไรก็ตาม Python source distribution บางแพลตฟอร์ม หรือ npm ที่ข้าม optional dependencies อาจไม่มี binary ให้ตรวจหมายเหตุการติดตั้งในเอกสาร [4]

#5.2 ตั้ง API key

สร้าง key ที่ Claude Platform แล้วกำหนดให้ process ที่รันเอเจนต์

macOS / Linux:

export ANTHROPIC_API_KEY="ใส่คีย์ของคุณในเครื่อง"

Windows PowerShell:

$env:ANTHROPIC_API_KEY="ใส่คีย์ของคุณในเครื่อง"

SDK อ่าน environment variable ของ process และ ไม่ได้โหลดไฟล์ .env ให้อัตโนมัติ หากใช้ไฟล์ดังกล่าวต้องโหลดเองก่อนเรียก SDK บทความนี้ใช้ API key และไม่ต้องนำคีย์มาใส่ในไฟล์โค้ด [4]

#5.3 สร้างโค้ดสำหรับตรวจสอบ

สร้างไฟล์ workspace/shipping.py:

def shipping_fee(order_total: float, weight_kg: float) -> float:
    """Orders from 1,000 baht ship free; weight must be positive."""
    if order_total > 1000:
        return 0.0
    return 25.0 + weight_kg * 10.0

ข้อกำหนดของฟังก์ชันใน Workshop นี้คือ

  1. ยอดสั่งซื้อตั้งแต่ 1,000 บาทขึ้นไป ค่าจัดส่งเป็นศูนย์
  2. น้ำหนักต้องมากกว่าศูนย์เสมอ แม้คำสั่งซื้อเข้าเงื่อนไขส่งฟรี
  3. น้ำหนักไม่ถูกต้องต้องเกิด ValueError
  4. เมื่อยอดต่ำกว่า 1,000 บาท ค่าจัดส่งเท่ากับ 25 + 10 × น้ำหนัก

โค้ดตั้งใจให้มีปัญหาสองกลุ่ม ได้แก่ boundary ที่ 1,000 บาท และการไม่ตรวจสอบน้ำหนัก

#5.4 สร้างเอเจนต์ Python

สร้าง agent.py ไว้ข้างโฟลเดอร์ workspace:

import asyncio
from pathlib import Path

from claude_agent_sdk import (
    AssistantMessage,
    ClaudeAgentOptions,
    ClaudeSDKError,
    ResultMessage,
    TextBlock,
    ToolUseBlock,
    query,
)

READ_TOOLS = ["Read", "Glob", "Grep"]
WORKSPACE = Path(__file__).resolve().parent / "workspace"

TASK = """
Read shipping.py and review it against these requirements:
- Orders with order_total >= 1000 have zero shipping fee.
- weight_kg must be positive, including for free-shipping orders.
- Invalid weight raises ValueError.
- Other orders pay 25 + 10 * weight_kg.

Report in Thai: the defect, evidence with line numbers,
a reproducing input, expected behavior, and a suggested fix.
Suggest test cases. Do not edit files or claim to have run tests.
"""

async def main() -> None:
    if not (WORKSPACE / "shipping.py").is_file():
        raise SystemExit("Create workspace/shipping.py first.")

    options = ClaudeAgentOptions(
        cwd=str(WORKSPACE),
        tools=READ_TOOLS,
        allowed_tools=READ_TOOLS,
        disallowed_tools=["Bash", "Write", "Edit", "NotebookEdit", "Agent"],
        permission_mode="dontAsk",
        setting_sources=[],
        max_turns=8,
        max_budget_usd=0.50,
    )
    final_result = None

    try:
        async for event in query(prompt=TASK, options=options):
            if isinstance(event, AssistantMessage):
                for item in event.content:
                    if isinstance(item, TextBlock):
                        print(item.text)
                    elif isinstance(item, ToolUseBlock):
                        print(f"[tool] {item.name}")
            elif isinstance(event, ResultMessage):
                final_result = event
    except ClaudeSDKError as exc:
        raise SystemExit(f"Agent failed: {exc}") from exc

    if final_result is None:
        raise SystemExit("Agent ended without a result.")

    reason = getattr(final_result, "terminal_reason", None)
    if (
        final_result.is_error
        or final_result.subtype != "success"
        or reason not in (None, "completed")
    ):
        raise SystemExit(
            f"Incomplete run: {final_result.subtype}; reason={reason}"
        )

    print(f"Session: {final_result.session_id}")
    print(f"Estimated USD: {final_result.total_cost_usd}")

if __name__ == "__main__":
    asyncio.run(main())

เรียกใช้:

python agent.py

API สำคัญคือ query() สำหรับเริ่มงาน และ ClaudeAgentOptions สำหรับกำหนดการทำงาน เรากรองข้อความเพื่อแสดงเฉพาะข้อความและชื่อเครื่องมือ แล้วตรวจผลสุดท้ายก่อนถือว่างานสำเร็จ [5]

tools กำหนดชุด built-in tools ที่เปิดให้โมเดลเห็น ส่วน allowed_tools กำหนดการอนุมัติล่วงหน้า ตัวอย่างปิด Bash และเครื่องมือแก้ไฟล์ซ้ำอย่างชัดเจน ขณะที่ setting_sources=[] ใช้ปิดการโหลดการตั้งค่าจาก filesystem สำหรับบทเรียนนี้ [5][6]

การตั้ง cwd ระบุ working directory ไม่ได้สร้างขอบเขต filesystem แบบ sandbox หากนำไปตรวจ repository ที่ไม่น่าเชื่อถือหรือให้บริการหลายผู้ใช้ ควรจำกัดไฟล์ที่ mount ให้ worker เข้าถึงได้จริงด้วย [14]

#5.5 สิ่งที่ควรตรวจพบ

ตารางนี้เป็นคำตอบอ้างอิงสำหรับตรวจรายงาน ไม่ใช่ log จากการรันโมเดล

Input พฤติกรรมของโค้ดเดิม พฤติกรรมตามข้อกำหนด
shipping_fee(1000, 2) คืน 45.0 คืน 0.0
shipping_fee(500, 0) คืน 25.0 เกิด ValueError
shipping_fee(500, -1) คืน 15.0 เกิด ValueError
shipping_fee(1500, 0) คืน 0.0 เกิด ValueError
shipping_fee(500, 2) คืน 45.0 คืน 45.0

คำแนะนำที่คาดหวังคือตรวจน้ำหนักก่อนตรวจเงื่อนไขส่งฟรี และเปลี่ยนเงื่อนไขยอดสั่งซื้อเป็น >= 1000

เอเจนต์ตัวอย่างไม่มีเครื่องมือรันคำสั่ง รายงานจึงควรแยก “ข้อค้นพบจากการอ่านโค้ด” กับ “ผลการทดสอบที่รันจริง” ให้ชัดเจน

#6. ตัวอย่าง TypeScript

ติดตั้งในโปรเจกต์ใหม่:

npm init -y
npm pkg set type=module
npm install @anthropic-ai/claude-agent-sdk
npm install --save-dev tsx

ใช้ workspace/shipping.py เดียวกับ Workshop และตั้ง ANTHROPIC_API_KEY ตามหัวข้อก่อนหน้า สร้าง agent.ts:

import { resolve } from "node:path";
import { query } from "@anthropic-ai/claude-agent-sdk";

let completed = false;

try {
  for await (const event of query({
    prompt:
      "Read shipping.py. Review the 1000-baht boundary and positive-weight " +
      "validation. Explain defects and proposed tests in Thai. Do not edit files.",
    options: {
      cwd: resolve("workspace"),
      tools: ["Read", "Glob", "Grep"],
      allowedTools: ["Read", "Glob", "Grep"],
      disallowedTools: ["Bash", "Write", "Edit", "NotebookEdit", "Agent"],
      permissionMode: "dontAsk",
      settingSources: [],
      maxTurns: 8,
      maxBudgetUsd: 0.5
    }
  })) {
    if (event.type === "result") {
      completed =
        event.subtype === "success" &&
        !event.is_error &&
        (event.terminal_reason == null || event.terminal_reason === "completed");
      console.log(event);
    }
  }
  if (!completed) process.exitCode = 1;
} catch (error) {
  console.error(error);
  process.exitCode = 1;
}

รันจากโฟลเดอร์โปรเจกต์:

npx tsx agent.ts

Python ใช้ชื่อ option แบบ snake_case ส่วน TypeScript ใช้ camelCase หากโปรเจกต์เดิมใช้ CommonJS สามารถใช้ชื่อ agent.mts ตามคำแนะนำ Quickstart เพื่อเรียก top-level await แบบ ES module [4]

#7. ส่งรายงานเป็น JSON ด้วย Structured Output

เมื่อต้องนำผลไปเก็บฐานข้อมูลหรือแสดงใน dashboard ควรกำหนด schema แทนการแยกข้อความจากรายงานด้วย regex

ตัวอย่างส่วนกำหนดค่า Python ต่อไปนี้ใช้ร่วมกับ query() แบบใน Workshop โดยให้แอปอ่าน ResultMessage.structured_output [7]

from claude_agent_sdk import ClaudeAgentOptions

review_schema = {
    "type": "object",
    "properties": {
        "summary": {"type": "string"},
        "findings": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "line": {"type": "integer"},
                    "problem": {"type": "string"},
                    "test_input": {"type": "string"},
                    "expected": {"type": "string"},
                },
                "required": ["line", "problem", "test_input", "expected"],
                "additionalProperties": False,
            },
        },
    },
    "required": ["summary", "findings"],
    "additionalProperties": False,
}

json_options = ClaudeAgentOptions(
    cwd="workspace",
    tools=["Read", "Glob", "Grep"],
    allowed_tools=["Read", "Glob", "Grep"],
    permission_mode="dontAsk",
    setting_sources=[],
    max_turns=10,
    max_budget_usd=0.50,
    output_format={"type": "json_schema", "schema": review_schema},
)

เปลี่ยน options=options ใน Workshop เป็น options=json_options แล้วอ่านข้อมูลหลังตรวจสถานะสำเร็จ:

# Place after the successful-result checks in main().
if final_result.structured_output is None:
    raise SystemExit("The run produced no structured report.")
print(final_result.structured_output)

ข้อควรเข้าใจคือ schema ช่วยตรวจรูปแบบข้อมูล ส่วนความถูกต้องของบั๊กและเลขบรรทัดยังต้องตรวจจากหลักฐาน หากได้สถานะสำเร็จแต่ไม่มี structured_output แอปควรถือว่ารายงานยังไม่พร้อมใช้งาน [7]

#8. เชื่อมฟังก์ชันของระบบด้วย Custom Tools และ MCP

Custom tool ใช้เมื่อเอเจนต์ต้องเรียกความสามารถที่เราควบคุม เช่น อ่านข้อกำหนดจากบริการภายใน ส่วน MCP เป็นมาตรฐานเชื่อมเครื่องมือและแหล่งข้อมูล โดย Agent SDK รองรับทั้ง in-process MCP server และการเชื่อม MCP server ภายนอก [8][9]

ตัวอย่างนี้สร้างเครื่องมือคืนข้อกำหนดค่าจัดส่งแบบคงที่เพื่อให้เห็นโครงสร้าง:

from claude_agent_sdk import tool, create_sdk_mcp_server, ClaudeAgentOptions

@tool(
    "shipping_policy",
    "Read the shipping rules used for code review.",
    {},
)
async def shipping_policy(args):
    policy = (
        "Positive weight is required for every order. "
        "Orders from 1000 baht ship free. "
        "Other orders pay 25 + 10 * weight_kg."
    )
    return {"content": [{"type": "text", "text": policy}]}

policy_server = create_sdk_mcp_server(
    name="shipping-policy",
    version="1.0.0",
    tools=[shipping_policy],
)

policy_options = ClaudeAgentOptions(
    tools=[],
    mcp_servers={"policy": policy_server},
    allowed_tools=["mcp__policy__shipping_policy"],
    permission_mode="dontAsk",
    setting_sources=[],
    max_turns=4,
    max_budget_usd=0.25,
)

ใช้ policy_options กับ query() และ prompt เช่น “เรียก shipping_policy แล้วสรุปข้อกำหนดภาษาไทย” ตัวอย่างนี้เป็นส่วนประกอบ ต้องวางในโปรแกรมที่มี async entry point เช่นเดียวกับ Workshop

ชื่อเครื่องมือที่เอเจนต์ใช้ประกอบด้วยชื่อ server key และชื่อ tool ในรูป mcp__policy__shipping_policy โดย tools=[] ปิด built-in tools ส่วนเครื่องมือ MCP ที่ตั้งค่าไว้ยังเปิดให้เรียกได้ [8]

เมื่อนำไปเชื่อม API จริง ควรตรวจ input และสิทธิ์ใน tool handler อีกชั้น เช่นให้เครื่องมืออ่านข้อมูลได้เฉพาะ project ที่ผู้ใช้ปัจจุบันมีสิทธิ์

#9. แบ่งงานด้วย Subagents

Subagent เหมาะกับงานย่อยที่มีเป้าหมายชัดเจน เช่น ผู้ตรวจตรรกะกับผู้ออกแบบกรณีทดสอบ แต่ละตัวมี instructions และชุดเครื่องมือของตนเอง การเรียก subagent ใช้เครื่องมือ Agent ในเอกสารปัจจุบัน [10]

ตัวอย่างส่วนกำหนดค่า:

from claude_agent_sdk import AgentDefinition, ClaudeAgentOptions

team_options = ClaudeAgentOptions(
    cwd="workspace",
    tools=["Read", "Glob", "Grep", "Agent"],
    allowed_tools=["Read", "Glob", "Grep", "Agent"],
    permission_mode="dontAsk",
    setting_sources=[],
    max_turns=12,
    max_budget_usd=1.00,
    agents={
        "logic-reviewer": AgentDefinition(
            description="Inspect shipping calculations and boundary conditions.",
            prompt="Review shipping.py and report defects with evidence.",
            tools=["Read", "Glob", "Grep"],
        ),
        "test-designer": AgentDefinition(
            description="Propose boundary and invalid-input tests.",
            prompt="Read shipping.py and propose tests. Do not run or write tests.",
            tools=["Read", "Glob", "Grep"],
        ),
    },
)

ใช้ prompt ระบุให้มอบงานตรวจตรรกะแก่ logic-reviewer และออกแบบกรณีทดสอบแก่ test-designer แล้วรวมรายงาน

การประกาศหลาย subagents ไม่ได้บังคับให้ทุกตัวถูกเรียกหรือทำงานพร้อมกัน ต้องตรวจ tool events เพื่อยืนยันการมอบงาน และวัดคุณภาพ เทียบกับการใช้เอเจนต์ตัวเดียวก่อนเพิ่มจำนวนเอเจนต์

#10. Skills, Hooks และ Sessions ต่างกันอย่างไร

องค์ประกอบ หน้าที่ ตัวอย่างการใช้
Skill ชุดคำแนะนำและทรัพยากรสำหรับงานเฉพาะ มาตรฐานรายงานบั๊กของทีม
Hook callback ที่ทำงานเมื่อเกิดเหตุการณ์ บันทึกก่อนและหลังเรียกเครื่องมือ
Session ประวัติข้อความ การเรียกเครื่องมือ และผลลัพธ์ กลับมาถามต่อจากรายงานเดิม
Subagent เอเจนต์ที่รับงานย่อย ตรวจเงื่อนไขทางธุรกิจ

Skill ของโปรเจกต์เก็บเป็นไฟล์ เช่น .claude/skills/qa-review/SKILL.md และขึ้นกับ setting_sources ที่ใช้ค้นหา skill หากตั้ง tools เป็นรายการเองและต้องการใช้ skills ให้รวม "Skill" ในรายการด้วย [11]

ตัวอย่างตั้งค่าชัดเจน:

from claude_agent_sdk import ClaudeAgentOptions

skill_options = ClaudeAgentOptions(
    cwd="workspace",
    setting_sources=["project"],
    skills=["qa-review"],
    tools=["Read", "Glob", "Grep", "Skill"],
    allowed_tools=["Read", "Glob", "Grep", "Skill"],
    permission_mode="dontAsk",
)

ให้สร้าง skill ที่ workspace/.claude/skills/qa-review/SKILL.md ก่อนใช้ ตัวอย่าง Workshop หลักตั้ง setting_sources=[] จึงไม่โหลด skill ของโปรเจกต์

Hooks ใช้ตรวจหรือบันทึกพฤติกรรม เช่น PreToolUse, PostToolUse และ PostToolUseFailure ควรบันทึก metadata ที่จำเป็น และหลีกเลี่ยงการเก็บคีย์หรือข้อมูลลับจาก tool input ลง log [12]

Sessions ใช้สานต่องาน สำหรับ Python เลือก ClaudeSDKClient เมื่อต้องสนทนาหลายครั้งใน process เดียว หรือเก็บ session_id แล้วส่ง resume เมื่อกลับมาทำงานภายหลัง ในแอปหลายผู้ใช้ควรผูก session ID กับเจ้าของงานอย่างชัดเจน [13]

Session เก็บบริบทสนทนา ส่วนการ fork session ไม่ได้คัดลอกหรือย้อนคืนไฟล์ใน workspace หากต้องการแยกการแก้ไขโค้ดให้ใช้ workspace หรือ Git worktree ที่แยกกัน

#11. การกำหนดสิทธิ์ที่มักเข้าใจผิด

allowed_tools=["Read"] หมายถึงอนุมัติเครื่องมือ Read ล่วงหน้า ไม่ได้หมายความว่าเครื่องมืออื่นถูกปิดทั้งหมด [6]

การตั้งค่า ความหมาย
tools กำหนด built-in tools ที่เปิดให้โมเดลใช้
allowed_tools อนุมัติเครื่องมือหรือกฎที่ระบุล่วงหน้า
disallowed_tools ปฏิเสธเครื่องมือหรือกฎที่ระบุ
permission_mode="dontAsk" ปฏิเสธการเรียกที่ต้องขออนุมัติ แทนการถาม
permission_mode="acceptEdits" อนุมัติการแก้ไฟล์ตามพฤติกรรมของโหมด
can_use_tool callback จัดการคำขอที่เข้าสู่ขั้นตอนอนุมัติของแอป

แม้ใช้ dontAsk การเรียกบางประเภทที่ไม่ต้องขออนุมัติแต่แรกยังทำงานได้ จึงควรกำหนดชุดเครื่องมือและข้อห้ามให้ตรงกับงาน และใช้ขอบเขต filesystem หรือ container เมื่อต้องจำกัดทรัพยากรจริง [6][14]

เมื่อพัฒนาต่อเป็นเอเจนต์แก้โค้ด ค่อยเพิ่ม Edit หรือ Write และกำหนดขั้นตอนตรวจ diff สำหรับการรันทดสอบให้เลือกเครื่องมือที่จำกัดคำสั่งได้ หรือออกแบบ approval callback ให้เหมาะกับงาน

#12. ค่าใช้จ่ายและเงื่อนไขหยุด

การสั่งเอเจนต์หนึ่งครั้งอาจใช้โมเดลหลายรอบ จึงควรเก็บทั้งคุณภาพผลลัพธ์ จำนวนรอบ เวลา และค่าใช้จ่าย

ตัวอย่างใช้ max_turns และ max_budget_usd โดยค่าหลังเป็นเกณฑ์หยุดตาม ค่าใช้จ่ายที่ SDK ประเมินฝั่ง client การใช้จริงอาจผ่านค่าที่กำหนดก่อนหยุด จึงไม่ใช่เพดานเรียกเก็บเงินแบบตายตัว [15]

สิ่งที่บันทึก ใช้ตัดสินใจ
session_id ผูกผลกับงานและทำงานต่อ
num_turns ดูความซับซ้อนและปัญหาวนซ้ำ
total_cost_usd ติดตามค่าใช้จ่ายโดยประมาณ
subtype, is_error, terminal_reason แยกงานสำเร็จ ข้อผิดพลาด และการหยุดกลางทาง
ผลการตรวจข้อค้นพบ ประเมินประโยชน์ของเอเจนต์

สำหรับ session ที่ resume ค่าใช้จ่ายที่รายงานอาจรวมยอดก่อนหน้า อย่ารวมยอดสะสมทุกครั้งซ้ำกันโดยตรง ส่วนการรายงาน token ของเอเจนต์หลักกับ subagents มีขอบเขตต่างกัน ให้ใช้เอกสาร cost tracking ประกอบ [15]

#13. จาก Workshop สู่ระบบใช้งานจริง

ตัวอย่างการออกแบบต่อไปนี้เป็นข้อเสนอของผู้เขียน:

flowchart TD
    U["ผู้ใช้ส่งงาน"] --> Q["API และคิวงาน"]
    Q --> W["Worker ที่ใช้ Agent SDK"]
    W --> S["Workspace ของงาน"]
    W --> T["เครื่องมือที่กำหนดสิทธิ์"]
    W --> R["รายงานและหลักฐาน"]
    R --> V["ผู้ใช้ตรวจผล"]

ให้หนึ่งงานมี workspace ของตนเอง เลือกไฟล์ที่เอเจนต์เข้าถึงได้ และเก็บผลแบบมีโครงสร้าง หากเป้าหมายเป็นการสร้าง patch ควรเก็บ diff กับผลทดสอบก่อนส่งให้ตรวจอนุมัติ ส่วนระบบที่อ่านไฟล์อย่างเดียวสามารถ mount โค้ดเป็น read-only ได้ [14]

งานด้าน Software Engineering ที่นำไปทดลองต่อได้ เช่น

  • Code Review: บั๊กที่มีหลักฐาน เลขบรรทัด และวิธีทำซ้ำ
  • Test Design: กรณีทดสอบจากข้อกำหนดและ boundary conditions
  • Test Failure Analysis: เชื่อม failing test กับโค้ดที่เกี่ยวข้อง
  • Bug Triage: สรุปรายงานบั๊กและข้อมูลที่ยังขาด
  • Documentation: อธิบาย API จากโค้ดและเอกสารในโปรเจกต์

หากทำเป็นงานวิจัย ควรแยกชุดพัฒนาและชุดประเมิน ใช้ข้อกำหนดเดียวกันระหว่างระบบ และวัดอย่างน้อยอัตรางานสำเร็จ ความแม่นยำของข้อค้นพบ เวลา และต้นทุนต่อหนึ่งงาน การเพิ่ม subagents ควรพิสูจน์ว่าคุณภาพหรือเวลาที่ได้คุ้มกับต้นทุนที่เพิ่มขึ้น

#14. แก้ปัญหาที่พบบ่อย

อาการ สิ่งที่ควรตรวจ
Authentication ล้มเหลว process ปัจจุบันมี ANTHROPIC_API_KEY หรือไม่ และ key ใช้งานได้หรือไม่
มี .env แต่ยังไม่พบ key โหลดไฟล์เข้า environment ก่อนเริ่ม SDK
ไม่พบ Claude Code binary วิธีติดตั้งแพ็กเกจมี bundled binary หรือไม่ แล้วตรวจ cli_path เมื่อใช้ Python
ค้นหาไฟล์ไม่เจอ ค่า cwd และตำแหน่งไฟล์ตัวอย่าง
ถูกปฏิเสธการใช้เครื่องมือ tools, allow/deny rules, permission mode และ hooks
ไม่พบ skill ตำแหน่ง SKILL.md, setting_sources, skills และเครื่องมือ Skill
ได้ success แต่ผลใช้ไม่ได้ ตรวจ is_error, terminal_reason และ structured_output เมื่อใช้ schema
หยุดก่อนรายงานเสร็จ จำนวนรอบ งบประมาณที่ประเมิน และข้อผิดพลาดของ runtime

รายละเอียด API เปลี่ยนได้ ควรทดสอบเวอร์ชันที่จะใช้จริงแล้วเก็บ dependency lockfile บทความนี้ไม่ระบุหมายเลขแพ็กเกจว่าเป็น “เวอร์ชันล่าสุด”

#15. ขอบเขตการตรวจสอบตัวอย่าง

บทความอ้างอิงชื่อแพ็กเกจและ API จากเอกสารทางการ ณ วันที่ระบุ และตรวจไวยากรณ์ของตัวอย่าง Python แล้ว แต่ไม่ได้รันคำขอ Claude API จริงหรือยืนยันผลลัพธ์โมเดลด้วย API key

ตารางข้อผิดพลาดใน Workshop คำนวณจากโค้ดตัวอย่าง ส่วนรายงานที่เอเจนต์สร้างอาจแตกต่างกัน จึงควรใช้ตารางดังกล่าวเป็นเกณฑ์ตรวจผลก่อนพัฒนาต่อ

#เอกสารอ้างอิง

  1. Anthropic — Agent SDK overview
  2. Anthropic — How the agent loop works
  3. Anthropic — Migrate to Claude Agent SDK
  4. Anthropic — Agent SDK Quickstart
  5. Anthropic — Python SDK reference
  6. Anthropic — Configure permissions
  7. Anthropic — Structured outputs
  8. Anthropic — Give Claude custom tools
  9. Anthropic — Connect to external tools with MCP
  10. Anthropic — Subagents in the SDK
  11. Anthropic — Extend agents with skills
  12. Anthropic — Intercept and control behavior with hooks
  13. Anthropic — Work with sessions
  14. Anthropic — Securely deploying AI agents
  15. Anthropic — Track cost and usage

แหล่งโค้ดสำหรับติดตามการเปลี่ยนแปลง: