ข้ามไปยังเนื้อหา
Google ADK เผยสูตร 'agent ที่อยู่ได้เป็นสัปดาห์' — durable state machine + persistent session + event-driven webhook แทนการพยายาม stuff conversation history เข้า context
เครื่องมือนักพัฒนา

Google ADK เผยสูตร 'agent ที่อยู่ได้เป็นสัปดาห์' — durable state machine + persistent session + event-driven webhook แทนการพยายาม stuff conversation history เข้า context

อ่าน 6 นาที ที่มา: Google Developers Blog

วันอังคารที่ 12 พ.ค. 2026 ทีม Google Developers ปล่อย tutorial ใหม่ — “Build Long-running AI agents that pause, resume, and never lose context with ADK” — เขียนโดย Shubham Saboo (Senior AI Product Manager) และ Eric Dong (Developer Relations Engineer) เนื้อหายาว ครอบคลุมตั้งแต่ architecture pattern, code snippet ภาษา Python, จนถึง deploy command บน Vertex AI Agent Runtime

ประเด็นใหญ่: ส่วนใหญ่ของ agent tutorial วันนี้หยุดอยู่แค่ stateless chatbot — ลูป conversation ที่ลืมทุกอย่างทันทีที่ container restart แต่ workflow จริงในองค์กรไม่ทำงานแบบนั้น HR onboarding ใช้เวลา 2 อาทิตย์, invoice dispute หยุดรอ vendor reply เป็นวัน ๆ, sales sequence ลากข้าม touchpoint หลายเดือน — มี idle time ยาวที่ stateless agent ไม่รอด

ทำไม stateless agent พังกับ workflow จริง

โพสต์ระบุ failure mode 3 ตัวที่เกิดเมื่อพยายามดัน conversation history ของ 2 อาทิตย์เข้า prompt:

  1. Prompt context pollution — history หลายร้อย turn ทำให้ irrelevant chatter + tool output เก่า + instruction ซ้ำท่วม model จน confuse ว่าตอนนี้อยู่ step ไหน
  2. Token cost explosion — replay full 2-week history ทุก inference call เผางบ token เร็วมาก ส่วนใหญ่ของ turn ไม่เกี่ยวกับ decision ปัจจุบัน
  3. Reasoning hallucination on resume — เมื่อ agent หยุด 3 วันรอ document signature แล้วกลับมา resume model มักจะ “จำ” intermediate step ที่ไม่เคยเกิด เช่น สมมติว่า approval ผ่านแล้วทั้งที่ยังไม่เคยอนุมัติ

วิธีแก้ — ตามทีม ADK — ไม่ใช่ context window ใหญ่ขึ้น แต่เป็น architecture ที่ state ของ agent ชัดเจน, durable, decoupled จาก chat history

3 shift ที่แยก production agent จาก demo chatbot

โพสต์เสนอ pattern 3 ชั้น:

1. Durable state schema — แทนที่จะ dump raw JSON ลง vector DB ให้ define explicit step enum:

class OnboardingStep:
    START = "START"
    WELCOME_SENT = "WELCOME_SENT"
    DOCUMENTS_SIGNED = "DOCUMENTS_SIGNED"
    IT_PROVISIONED = "IT_PROVISIONED"
    HARDWARE_DELIVERED = "HARDWARE_DELIVERED"
    COMPLETED = "COMPLETED"

agent อ่าน {current_step}, {new_hire_details}, {pending_signals} ตรงจาก session state เข้า system instruction — model ไม่ต้อง infer step จาก chat history

2. Persistent session ผ่าน DatabaseSessionService — swap in-memory ทิ้ง ใช้ SQLite local (sqlite+aiosqlite:///sessions.db) หรือ Cloud SQL บน production:

session_service_uri = "sqlite+aiosqlite:///sessions.db"
app = get_fast_api_app(
    agents_dir=AGENT_DIR,
    web=True,
    session_service_uri=session_service_uri,
)

ทุกครั้งที่ tool เขียน ToolContext.state จะถูก checkpoint อัตโนมัติ — kill container กลางทาง restart มาแล้ว resume ที่ checkpoint ถูกต้อง บน Cloud Run ที่ scale-to-zero ระหว่าง idle ก็ทำงานได้

3. Event-driven dormancy gate ผ่าน webhook — ไม่ใช้ active polling หรือ blocked thread expose FastAPI endpoint ที่ external system ยิงเมื่อ event เกิดจริง:

@app.post("/webhooks/document_signed")
async def trigger_document_signed_webhook(payload: WebhookPayload):
    await resume_handler.receive_signed_documents_callback(
        user_id=payload.user_id, session_id=payload.session_id
    )

ใน resume_handler มี key mechanism: state_delta ที่ apply state transition ก่อน inference call ถัดไป:

async for event in self.runner.run_async(
    user_id=user_id,
    session_id=session_id,
    new_message=types.Content(...),
    state_delta={
        "current_step": OnboardingStep.DOCUMENTS_SIGNED,
        "pending_signals": [],
    },
):
    ...

model ตื่นมาเห็น current_step = DOCUMENTS_SIGNED ใน system prompt ทันที — รู้ว่าต้อง delegate IT provisioning ไป sub-agent โดยไม่ต้อง replay history

Multi-agent delegation ลด prompt bloat

แทน monolithic prompt ที่อัด tool ทั้งหมด tutorial แยก it_agent ออกเป็น sub-agent มี prompt + tool ของตัวเอง:

it_agent = Agent(
    name="it_agent",
    model=Gemini(model="gemini-3.1-flash-lite"),
    instruction="""You are an IT Provisioning Agent...""",
    tools=[provision_software_accounts],
)

root_agent = Agent(
    name="hr_onboarding_coordinator",
    model=Gemini(model="gemini-3.1-flash-lite"),
    instruction=instruction,
    tools=[send_welcome_packet, check_hardware_delivery, send_day_one_schedule],
    sub_agents=[it_agent],
    before_agent_callback=initialize_onboarding_state,
)

before_agent_callback รัน initialize_onboarding_state ครั้งแรกที่ user คุยกับ agent — set default ทุกตัวก่อน inference

ทั้ง root agent และ it_agent ใช้ Gemini 3.1 Flash-Lite เป็น default — สอดคล้องกับ GA ของ Gemini 3.1 Flash-Lite ที่ Google ปล่อยใน Vertex AI Agent Platform เมื่อ 9 พ.ค.

Golden eval สำหรับทดสอบ idle time

ส่วนสำคัญที่หลายคนข้าม — โพสต์เสนอ ADK evaluation set ที่ simulate idle time โดย pre-seed state ทำให้ test “agent รอ 48 ชม. แล้ว resume จะ remember ชื่อ new hire ไหม” รันใน CI ได้ในไม่กี่วินาที test เคสที่โชว์: agent ใน WELCOME_SENT ปฏิเสธคำขอ “ข้าม document signing แล้ว provision ก่อน” — ต้องตอบ “waiting for the employee to sign” และไม่เรียก tool ใด ๆ

รันด้วยคำสั่ง:

.venv/bin/adk eval ./app tests/eval/evalsets/idle_time_delay_eval.json \
  --config_file_path tests/eval/eval_config.json

Deploy ขึ้น Agent Runtime

ส่วน production: wrap ด้วย AgentEngineApp(AdkApp) แล้วรัน agents-cli deploy ที่จะจัดการ session persistence, auto-scaling (รวม scale-to-zero), Cloud Trace integration ให้เอง — code เดียวกันที่รันบน SQLite local รันบน managed cloud storage โดยไม่ต้องแก้

source code เปิดให้ clone ที่ GoogleCloudPlatform/generative-ai

มุมมอง AI Curator

โพสต์นี้สำคัญกว่าที่หน้าตาเป็น “tutorial” เพราะมันคือ คำตอบของ Google ต่อ Microsoft Agent Framework + Anthropic Managed Agents ที่ทั้งคู่ shipped pattern คล้าย ๆ กันในช่วง 1-2 เดือนที่ผ่านมา:

Microsoft ใช้ Durable Workflow ผ่าน Microsoft Agent Framework + Durable Task Framework (.NET background) — pattern เดียวกัน: checkpoint + resume + event-driven step Anthropic เปิด Managed Agents beta + Claude Skills/Plugins ที่ Anthropic managed infra หยุดและปลุกได้เอง pattern เดียวกัน ทั้งสาม vendor มาถึง conclusion ตรงกัน: AI agent คือ background process, ไม่ใช่ chat session

สำหรับ developer ไทย 3 สิ่งที่ควรเริ่ม:

  1. เลิกเขียน agent ใหม่บน stateless pattern ถ้า workflow มี idle time > 5 นาที state machine + persistent session คือ default ไม่ใช่ “optimization ทีหลัง” — refactor ทีหลังแพงกว่าทำตั้งแต่ต้นมาก
  2. เลือก SDK ตาม cloud lock-in ที่ยอมรับได้ ADK + Agent Runtime lock เข้า Vertex AI; Agent Framework lock เข้า Foundry; Anthropic Managed Agents lock เข้า Claude API ทั้งสาม pattern API คล้ายกัน แต่ migration cost ไม่ใช่ศูนย์ — startup ไทยที่ run agent ใน production เริ่มต้องเลือก primary cloud จริงจังแล้ว ไม่ใช่ multi-cloud แบบลอย ๆ
  3. Eval framework ที่ simulate idle time = de-risk การ ship จริง สิ่งที่ Google สอนใน tutorial นี้ — pre-seed state แล้ว assert behavior — เป็น regression test pattern ที่ทีม Thai SaaS ที่ใช้ agent ใน production ขาดมาตลอด ตั้งแต่วันนี้ควรเริ่มเขียน golden eval ทุก workflow ก่อน deploy

แหล่งข่าว:

บทความนี้เรียบเรียงจากแหล่งข่าวต้นทาง — Google Developers Blog

เนื้อหาบน blog นี้สร้างโดย AI โดยมีการกำกับบรรณาธิการจากมนุษย์

อ่านเพิ่มในหมวด เครื่องมือนักพัฒนา

Betelgeuse รัน Qwen3.8 Flash Next ขนาด 68GB บน RTX 3060 กับแรม 16GB ส่วน Basalt วัดให้เห็นว่าเอนจินที่เร่งด้วยแฟล็กลัดทำให้โมเดลลืมของ
เครื่องมือนักพัฒนา

Betelgeuse รัน Qwen3.8 Flash Next ขนาด 68GB บน RTX 3060 กับแรม 16GB ส่วน Basalt วัดให้เห็นว่าเอนจินที่เร่งด้วยแฟล็กลัดทำให้โมเดลลืมของ

Betelgeuse ฟอร์ก llama.cpp ที่เปิดเมื่อ 31 ต.ค. ดึง expert จาก NVMe เข้า VRAM ตามต้องการ อ้าง 22 tok/s แบบไม่ทิ้ง expert แต่ README เตือนเองว่ายังทดลองและตัวเลขมาจากคนละรอบ วันเดียวกันผู้พัฒนา Basalt เผยผลวัดว่าแฟล็กเร่งความเร็วทำคุณภาพ Q8 ตกไปใกล้ Q2

· อ่าน 5 นาที
กฎห้ามโคลนเกมของ Claude Code เริ่มกระทบงานจริง บริษัทรับทำเกมกระดานร้องงานลูกค้าหยุด แต่รายงานหลายชิ้นปนกับตัวกรองไซเบอร์คนละเรื่อง
เครื่องมือนักพัฒนา

กฎห้ามโคลนเกมของ Claude Code เริ่มกระทบงานจริง บริษัทรับทำเกมกระดานร้องงานลูกค้าหยุด แต่รายงานหลายชิ้นปนกับตัวกรองไซเบอร์คนละเรื่อง

ต่อจากที่เราพบกฎนี้ในไบนารี Claude Code ผู้ใช้เริ่มรายงานว่างานเชิงพาณิชย์ถูกปฏิเสธ และ Tom's Hardware กับ Mashable หยิบไปรายงาน แต่เมื่อไล่ issue ที่อ้างถึง พบว่าหลายรายการเกิดก่อนกฎจะมา จึงน่าจะเป็นตัวกรองด้านไซเบอร์ ส่วน Anthropic ยังไม่ชี้แจง

· อ่าน 4 นาที
Claude Code ส่ง transcript ของ background agent ให้โมเดลทุก ~30 วินาทีเพื่อเขียนสถานะ 3–5 คำ ผู้วัดรายงานกินราว 16% และยังปิดแบบทางการไม่ได้
เครื่องมือนักพัฒนา

Claude Code ส่ง transcript ของ background agent ให้โมเดลทุก ~30 วินาทีเพื่อเขียนสถานะ 3–5 คำ ผู้วัดรายงานกินราว 16% และยังปิดแบบทางการไม่ได้

รายงานอิสระพบว่าฟีเจอร์ agent_summary ของ Claude Code ส่ง transcript เต็มของ background agent ไปถามสถานะทุก ~30 วินาที คิดเป็น 16.4% ของค่าใช้จ่ายในระบบของผู้วัด Issue เปิดมาตั้งแต่ ส.ค. ยังไม่มีสวิตช์ปิดที่รองรับ เราตรวจพบโค้ดนี้ใน 2.1.314 และพบกฎใหม่เรื่องเกมที่ไม่อยู่ใน changelog

· อ่าน 4 นาที