CCA · Foundations

จัดการ session ด้วย resume, fork และเริ่มใหม่พร้อมสรุป

แนวคิด

session คือประวัติการสนทนาที่ SDK สะสมไว้ระหว่าง agent ทำงาน มันมีทั้ง prompt, ทุก tool call, ทุกผลลัพธ์ และทุกคำตอบ SDK เขียนลงดิสก์อัตโนมัติ เราจึงกลับมาต่อได้ภายหลัง การจัดการ session มีสามท่าหลักที่ควรแยกให้ออก คือ continue, resume และ fork

resume ใช้เมื่ออยากกลับไปต่อ session เดิมที่เจาะจง โดยส่ง session ID ที่เก็บไว้เข้า option resume agent จะมีบริบทเดิมครบ ทั้งไฟล์ที่อ่านไปแล้วและการตัดสินใจที่ทำไปแล้ว ใน CLI ทำท่าเดียวกันด้วย flag --resume ตามด้วยชื่อ session ส่วน continue ต่างตรงที่หาsession ล่าสุดในไดเรกทอรีให้เอง โดยไม่ต้องเก็บ ID

fork ต่างจากทั้งคู่ มันสร้าง session ใหม่ที่เริ่มด้วยสำเนาประวัติของต้นฉบับ แล้วแตกแขนงออกไป ต้นฉบับยังคงเดิมไม่เปลี่ยน ใน SDK ทำผ่าน fork_session (Python) หรือ forkSession (TypeScript) fork เหมาะกับการลองแนวทางที่ต่างออกไปโดยไม่เสียเส้นเดิม เช่น เปรียบเทียบสองกลยุทธ์การเทสต์จากฐานวิเคราะห์ codebase เดียวกัน

ทำไมสำคัญ

จุดตัดสินใจสำคัญคือเลือกระหว่าง resume กับการเริ่ม session ใหม่พร้อมสรุปที่ฉีดเข้าไป resume ดีเมื่อบริบทเดิมยังใช้ได้เกือบทั้งหมด แต่ถ้าผล tool เดิมล้าสมัยไปแล้ว เช่น ไฟล์ถูกแก้หลังจากนั้น การ resume กับผลเก่าที่ค้างอาจทำให้ agent ทำงานบนข้อมูลที่ไม่จริง

ในกรณีเช่นนี้ การเริ่ม session ใหม่แล้วใส่สรุปที่มีโครงสร้างเข้าไปในprompt มักน่าเชื่อถือกว่าการ resume กับผลลัพธ์ที่ค้างและล้าสมัย เอกสารเองแนะนำว่าให้จับผลลัพธ์ที่ต้องการ เช่น ผลวิเคราะห์ การตัดสินใจ หรือ diff เก็บเป็น state ของแอป แล้วส่งเข้า session ใหม่ ซึ่งทนทานกว่าการขนไฟล์ transcript ไปมา

อีกกรณีที่ resume ยังเหมาะคือเมื่อบริบทส่วนใหญ่ยังถูกต้อง เพียงมีบางไฟล์เปลี่ยน ทางที่ดีคือแจ้ง session ที่ resume ให้รู้ว่าไฟล์ใดเปลี่ยนไป เพื่อให้มันวิเคราะห์เฉพาะจุดนั้นใหม่ ไม่ต้องสำรวจใหม่ทั้งหมด

ตัวอย่าง

# resume: กลับไปต่อ session เดิมด้วย ID ที่เก็บไว้
async for msg in query(prompt="ทำ refactor ที่เสนอไว้ต่อ",
                       options=ClaudeAgentOptions(resume=session_id)):
    ...

# fork: แตกแขนงลองอีกแนว ต้นฉบับไม่กระทบ
async for msg in query(prompt="ลองแนว OAuth2 แทน JWT",
                       options=ClaudeAgentOptions(resume=session_id,
                                                  fork_session=True)):
    forked_id = msg.session_id  # ID ใหม่ คนละอันกับต้นฉบับ

เช็คความเข้าใจ

fork_session ต่างจาก resume อย่างไร

เมื่อผล tool เดิมล้าสมัยไปแล้ว เช่น ไฟล์ถูกแก้หลังจากนั้น ควรทำอย่างไร

อ่านต่อ