Hook

Hook agent: ตรวจหา loop ของเอเจนต์ที่ไม่มีขีดจำกัด

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

hook agent ชี้ว่าเป็นปัญหาเมื่อพบ runtime ของเอเจนต์ที่วน loop โดยไม่มีขีดจำกัดจำนวนรอบ งบประมาณ หรือเวลา ซึ่งเป็นช่องโหว่ที่ปล่อยให้เอเจนต์ทำงานเองจนควบคุมไม่ได้ และเปลี่ยนอินพุตที่จงใจสร้างขึ้นให้กลายเป็นค่าใช้จ่ายที่ไม่มีขอบเขต หรือการยกระดับผ่าน prompt injection hook นี้ เข้าใจภาษา และครอบคลุมสองระบบนิเวศของเฟรมเวิร์กเอเจนต์: JavaScript (runtime query ของ agent SDK ของ Claude) และ Python (LangChain, LangGraph, CrewAI และ OpenAI Agents) hook นี้คือเอนจินแบบ deterministic เบื้องหลัง ความรู้เฉพาะทาง llm ซึ่งคุณรันเองได้ในโหมด scan หรือ check

การรัน​

npx lagune read agent # scans the whole project
npx lagune read agent --dir src/ai # scans a directory
npx lagune read agent --file chat.ts # scans a single file

ทุกบรรทัดใต้ Uncapped agent loops found ในไฟล์ที่ import agent SDK คือหนึ่งในสองกรณี: runtime query ของ agent SDK ของ Claude ที่เรียกโดยไม่มีขีดจำกัดจำนวนรอบ งบประมาณ หรือเวลา (JavaScript ซึ่งไม่มีขีดจำกัดโดยค่าเริ่มต้น) หรือการลบขีดจำกัดเริ่มต้นของเฟรมเวิร์กอย่างชัดเจน เช่น max_iterations=None / max_turns=None (Python ซึ่งมีขีดจำกัดโดยค่าเริ่มต้น) ทั้งสองกรณีทำให้จบการทำงานด้วย exit code ที่ไม่ใช่ศูนย์ ส่วน generateText/streamText ของ Vercel AI SDK ทำงานเพียงขั้นเดียวโดยค่าเริ่มต้น (stopWhen: stepCountIs(1)) การเรียกแบบไม่ตั้งค่าใด ๆ จึงวน loop ไม่ได้ และ hook ไม่ชี้ว่าเป็นปัญหา นอกจากนี้ hook ไม่มีวันเข้าใจผิดว่า db.query(...) ธรรมดาเป็นการเรียกเอเจนต์ การรันที่ไม่พบปัญหาจะพิมพ์ no uncapped agent loops found

วิธีอ่านผลตัดสิน​

ผลตัดสินความหมาย
uncappedการเรียก runtime query ที่ไม่มีขีดจำกัด (JS) หรือการลบขีดจำกัดอย่างชัดเจน (=None, Py)
safeการเรียก query ที่กำหนดขีดจำกัด การสร้างผลแบบขั้นเดียว หรือการเรียกเฟรมเวิร์กที่มีขีดจำกัดโดยค่าเริ่มต้น
invalidโค้ดตัวอย่างไม่มีการเรียกเอเจนต์ที่ระบุได้ให้ตัดสิน

ตัวเลือก CLI​

ตัวเลือกค่าคำอธิบาย
--patternโค้ดตัวอย่างตรวจการเรียกใช้หนึ่งครั้ง ใส่ซ้ำเพื่อตรวจหลายครั้ง โดยได้ผลตัดสินบรรทัดละหนึ่งรายการ
--langภาษาจำเป็นเมื่อใช้ --pattern: javascript หรือ python
--dirไดเรกทอรีจำกัดการสแกนไว้ที่ไดเรกทอรีเดียว ใช้ซ้ำได้และใช้ร่วมกับ --file ได้
--fileไฟล์จำกัดการสแกนไว้ที่ไฟล์เดียว ใช้ซ้ำได้และใช้ร่วมกับ --dir ได้

หากไม่ระบุตัวเลือก hook จะสแกนทั้งโปรเจกต์ --pattern ต้องใช้คู่กับ --lang และใช้ร่วมกับ --dir หรือ --file ไม่ได้

เลือกสิ่งที่จะสแกน​

hook นี้ข้ามสิ่งที่ Git ละเว้นไว้ หากต้องการข้ามมากกว่านั้น หรือต้องการสแกนสิ่งที่ Git ละเว้นไว้ ให้กำหนดการตั้งค่าเฉพาะของ agent เอง:

npx lagune write add --ignore test/fixtures --checker agent
{
"checkers": {
"agent": { "gitignore": false, "ignore": ["test/fixtures"] }
}
}

กำหนดค่า hook อธิบายการตั้งค่าทั้งหมด

ตรวจให้ได้มากที่สุด แต่ไม่ครบทุกกรณี

loop ของเอเจนต์ที่เขียนขึ้นเองในภาษาใดก็ตาม อยู่นอกเหนือสิ่งที่การสแกนแบบ static ทำได้ ให้ถือว่านี่เป็นพื้นฐานที่หนักแน่น ไม่ใช่รายการที่ครบถ้วน

tip

hook ตัดสินเฉพาะเรื่องขีดจำกัด: การจำกัดขอบเขตความสามารถ การปะปนระดับความน่าเชื่อถือ และการตรวจสอบสิทธิ์ เป็นเรื่องที่ต้องใช้วิจารณญาณ ซึ่ง ความรู้เฉพาะทาง llm ยังคงดูแลอยู่

คำถามที่พบบ่อย

เอเจนต์ที่ไม่มีขีดจำกัดอาจถูกชักนำให้เกิดการเรียกซ้ำ ค่าใช้จ่าย หรือการยกระดับผ่าน prompt injection อย่างไม่มีขอบเขต การกำหนด maxTurns/maxBudgetUsd/stopWhen/signal ช่วยจำกัดไว้ได้ และ hook agent จะชี้ว่าการเรียก runtime query ที่ไม่ได้กำหนดค่าใดเลยเป็นปัญหา