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
npx lagune read agent --lang javascript --pattern 'query({ prompt })' # => uncapped
npx lagune read agent --lang javascript --pattern 'query({ prompt, options: { maxTurns: 5 } })' # => safe
npx lagune read agent --lang python --pattern 'AgentExecutor(agent=a, max_iterations=None)' # => uncapped
ทุกบรรทัดใต้ 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 ทำได้ ให้ถือว่านี่เป็นพื้นฐานที่หนักแน่น ไม่ใช่รายการที่ครบถ้วน
hook ตัดสินเฉพาะเรื่องขีดจำกัด: การจำกัดขอบเขตความสามารถ การปะปนระดับความน่าเชื่อถือ และการตรวจสอบสิทธิ์ เป็นเรื่องที่ต้องใช้วิจารณญาณ ซึ่ง ความรู้เฉพาะทาง llm ยังคงดูแลอยู่
คำถามที่พบบ่อย
เอเจนต์ที่ไม่มีขีดจำกัดอาจถูกชักนำให้เกิดการเรียกซ้ำ ค่าใช้จ่าย หรือการยกระดับผ่าน prompt injection อย่างไม่มีขอบเขต การกำหนด maxTurns/maxBudgetUsd/stopWhen/signal ช่วยจำกัดไว้ได้ และ hook agent จะชี้ว่าการเรียก runtime query ที่ไม่ได้กำหนดค่าใดเลยเป็นปัญหา
