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

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

Canonical: https://lagune.ai/th-TH/docs/hooks/agent
ภาษา: th-TH
ต้นฉบับ: https://lagune.ai/docs/hooks/agent
อัปเดตล่าสุด: 2026-11-07

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

## การรัน

**สแกนโค้ดเบส**

```bash
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
```

**ตรวจการเรียกใช้หนึ่งครั้ง**

```bash
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` เอง:

```bash
npx lagune write add --ignore test/fixtures --checker agent
```

```json
{
  "checkers": {
    "agent": { "gitignore": false, "ignore": ["test/fixtures"] }
  }
}
```

[กำหนดค่า hook](https://lagune.ai/th-TH/docs/hooks/configure) อธิบายการตั้งค่าทั้งหมด

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

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

**เคล็ดลับ**

hook ตัดสินเฉพาะเรื่องขีดจำกัด: การจำกัดขอบเขตความสามารถ การปะปนระดับความน่าเชื่อถือ และการตรวจสอบสิทธิ์ เป็นเรื่องที่ต้องใช้วิจารณญาณ ซึ่ง [ความรู้เฉพาะทาง `llm`](https://lagune.ai/th-TH/docs/catalog) ยังคงดูแลอยู่

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

### ทำไมต้องจำกัด loop ของเอเจนต์

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