วิธีเขียน AGENTS.md สำหรับทีมพัฒนา API

Ashley Innocent

Ashley Innocent

29 April 2026

วิธีเขียน AGENTS.md สำหรับทีมพัฒนา API

เอเจนต์เขียนโค้ดจะอ่านรีโพของคุณก่อนที่จะเขียนโค้ด และไฟล์แรกที่พวกเขาอ่านคือ AGENTS.md นี่คือข้อตกลงเปิดที่ Codex CLI, Cursor, Aider, OpenHands และเครื่องมืออื่นๆ อีกมากมายที่เพิ่มขึ้นเรื่อยๆ ได้ตกลงร่วมกัน เพื่อให้ไฟล์บริบทเดียวสามารถใช้ได้กับเอเจนต์ทุกตัว สำหรับทีมพัฒนา API ไฟล์นี้คือความแตกต่างระหว่างเอเจนต์ที่รันการทดสอบที่ถูกต้องกับเซิร์ฟเวอร์โลคัลจริง กับเอเจนต์ที่สร้างเอนด์พอยต์ปลอมและส่งมอบไคลเอนต์ที่เสียหาย

คู่มือนี้จะอธิบายว่า AGENTS.md คืออะไร ทำไมทีม API ควรปฏิบัติต่อมันเหมือนโค้ดสำหรับใช้งานจริง ส่วนที่สำคัญสำหรับรีโพที่เน้น OpenAPI ตัวอย่างที่เป็นรูปธรรม และวิธีทำให้มันอัปเดตอยู่เสมอเมื่อ API พัฒนาขึ้น เราจะจับคู่มันกับ Apidog ในตอนท้าย เพื่อให้ขั้นตอนการทดสอบสัญญาของเอเจนต์ยังคงอิงกับสเปกจริง

ปุ่ม

สรุปโดยย่อ

AGENTS.md คืออะไรกันแน่

AGENTS.md คือไฟล์ Markdown ที่คุณคอมมิตไว้ที่ root ของ Repository เอเจนต์เขียนโค้ดจะมองหาไฟล์นี้เมื่อเริ่มทำงานกับโค้ดเบส และถือว่าเนื้อหาของมันเป็นข้อมูลสรุปที่มีอำนาจเกี่ยวกับวิธีการทำงานของโปรเจกต์ ข้อตกลงนี้เริ่มต้นขึ้นภายใน Codex CLI ของ OpenAI และได้รับการเผยแพร่เป็นมาตรฐานเปิด เพื่อให้เครื่องมืออื่นๆ สามารถอ่านไฟล์เดียวกันได้ ปัจจุบัน Codex CLI, Cursor, Aider, Claude Code, OpenHands, Sourcegraph Cody และเอเจนต์ขนาดเล็กอีกหลายตัวล้วนอ่านไฟล์นี้ได้

สามสิ่งที่ทำให้มันมีประโยชน์:

  1. ไฟล์เดียว ใช้ได้ทุกเอเจนต์. คุณเขียนบริบทเพียงครั้งเดียว แล้วเอเจนต์ทุกตัวในชุดเครื่องมือของทีมก็สามารถนำไปใช้ได้ ไม่มีการตั้งค่าที่แตกต่างกันไปในแต่ละเครื่องมือ
  2. Markdown ธรรมดา. ไม่มี DSL, ไม่มี Schema, ไม่มีขั้นตอนการ Build วิศวกรแก้ไขได้เหมือนเอกสารอื่นๆ
  3. อยู่ข้างโค้ดที่อธิบาย. เมื่อสคริปต์ Build เปลี่ยนแปลง ไฟล์นี้ก็จะเปลี่ยนใน PR เดียวกัน Diff ทำให้การเปลี่ยนแปลงนี้มองเห็นได้สำหรับผู้ตรวจสอบและสำหรับเอเจนต์

คู่หูที่ใกล้เคียงที่สุดคือ CLAUDE.md ซึ่ง Claude Code ของ Anthropic อ่าน รูปแบบทั้งสองมีความทับซ้อนกันอย่างมาก; หลายโปรเจกต์จะเก็บไฟล์ AGENTS.md ที่ symlinked ไปยัง CLAUDE.md เพื่อให้เครื่องมือทั้งสองทำงานได้โดยไม่ต้องตั้งค่าเพิ่มเติม ทีม Codex และ Anthropic ได้ประกาศความสอดคล้องกันในการรักษารูปแบบให้เข้ากันได้ต่อไปในอนาคต

ทำไมทีมพัฒนา API ถึงต้องการมันมากกว่าทีมอื่นๆ

ทีม API อยู่ในจุดที่ซับซ้อน: โค้ดมีขนาดเล็ก สัญญามีขนาดใหญ่ และผลที่ตามมาจากการทำผิดพลาดไม่ว่าจะเป็นส่วนใดก็สามารถเห็นได้จากไคลเอนต์ปลายน้ำทุกราย เอเจนต์ที่ไม่รู้ว่าสเปกอยู่ที่ openapi.yaml จะเขียนประเภทใหม่จากรูปแบบการตอบกลับที่จำได้จากข้อมูลการฝึกอบรม เอเจนต์ที่ไม่รู้คำสั่งทดสอบสัญญาจะคอมมิตโค้ดที่คอมไพล์ได้แต่ทำให้ไคลเอนต์ SDK pipeline เสียหาย

ไฟล์ AGENTS.md ที่เขียนมาอย่างดีสำหรับรีโพ API จะทำสี่สิ่งนี้:

เมื่อไฟล์ทำสี่สิ่งนี้ได้ ผลลัพธ์ของเอเจนต์ก็จะดูไม่เหมือนนักพัฒนาจูเนียร์ที่ข้าม README ไป แต่จะดูเหมือนเพื่อนร่วมทีมแทน

โครงสร้างที่ใช้งานได้ดีสำหรับรีโพ API

AGENTS.md ไม่มี schema ที่บังคับใช้ ชุมชนได้ตกลงใช้บางส่วนที่ปรากฏอยู่ในไฟล์ที่ปรับแต่งมาอย่างดีเกือบทุกไฟล์ สำหรับทีม API ลำดับด้านล่างนี้ถือเป็นค่าเริ่มต้นที่ดี

1. สรุปโปรเจกต์ (3-5 บรรทัด)

ระบุว่า API ทำอะไร ผู้ใช้งานเป็นใคร และเซิร์ฟเวอร์รันด้วยภาษาและเฟรมเวิร์กอะไร ทำให้เป็นข้อเท็จจริง

# โปรเจกต์: Payments API

บริการชำระเงินภายในสำหรับผลิตภัณฑ์ Acme ลูกค้าคือมือถือ เว็บ และแบ็กเอนด์ของพาร์ทเนอร์
เซิร์ฟเวอร์ใช้ Go 1.23 บน Echo, Postgres 17 สำหรับการจัดเก็บข้อมูล และ Redis-backed idempotency layer

บล็อกนี้บอกเอเจนต์ว่าควรใช้ภาษาใดเป็นค่าเริ่มต้น ควรปฏิบัติตามสำนวนแบบใด และไคลเอนต์ใดจะเสียหายหากส่งมอบรูปแบบการตอบกลับที่ไม่ถูกต้อง

2. คำสั่งเริ่มต้นอย่างรวดเร็ว

ห้าถึงสิบคำสั่งที่เอเจนต์จะรันอย่างต่อเนื่อง ใส่คำสั่งเสมอ ห้ามลิงก์ไปยัง Wiki

## คำสั่ง

| วัตถุประสงค์ | คำสั่ง |
|--------|---------|
| ติดตั้ง Dependencies | `make deps` |
| รันเซิร์ฟเวอร์โลคัล | `make dev` (ผูกกับ 127.0.0.1:8080) |
| รัน Unit Tests | `make test` |
| รัน Contract Tests กับ mock โลคัล | `make contract` |
| Lint | `make lint` |
| สร้าง Clients ใหม่จาก spec | `make codegen` |
| ใช้ Migrations | `make migrate` |

หากคำสั่งต้องการ env var ในการทำงาน ให้ใส่ชื่อ env var ไว้ข้างๆ เอเจนต์เก่งในการ export ตัวแปร; แต่ไม่เก่งในการเดา

3. ส่วน OpenAPI / GraphQL spec

นี่คือส่วนที่มีค่ามากที่สุดในรีโพ API บอกเอเจนต์ว่าสเปกอยู่ที่ไหน สเปกเกี่ยวข้องกับโค้ดที่สร้างขึ้นอย่างไร และการแก้ไขจะไหลไปในทิศทางใด

## แหล่งข้อมูลที่เชื่อถือได้

- สเปกอยู่ที่ `apis/payments/openapi.yaml`
- Clients ที่สร้างขึ้นอยู่ใน `gen/clients/{go,ts,python}` และห้ามแก้ไขด้วยมือ
- Pipeline การสร้างคือ `make codegen` รันหลังจากทุกการเปลี่ยนแปลงสเปก
  และคอมมิต clients ที่สร้างใหม่ใน PR เดียวกัน
- การเปลี่ยนแปลงสเปกไหลเวียน: สเปก -> `make codegen` -> การอัปเดต server handler ->
  contract tests -> จัดส่ง

บล็อกนี้เพียงอย่างเดียวก็ช่วยกำจัดข้อผิดพลาดประเภทหนึ่งที่เอเจนต์แก้ไขไคลเอนต์ที่สร้างขึ้นเพื่อ “แก้ไข” ประเภทที่ไม่ตรงกัน จากนั้นการรัน codegen ครั้งถัดไปจะลบการเปลี่ยนแปลงออก และ build ก็จะเสียหายอย่างลึกลับในอีกสองวันต่อมา

4. การเชื่อมต่อ Mock Server และ Apidog

หากคุณรัน mock server (ซึ่งคุณควรทำ) ให้ตั้งชื่อพวกมัน ระบุ URL, สเปกที่พวกมันอ่าน และวิธีการเริ่มทำงาน

## เซิร์ฟเวอร์โลคัล

- เซิร์ฟเวอร์จริง: `make dev` -> `http://127.0.0.1:8080`
- Apidog mock server: `make mock` -> `http://127.0.0.1:4010`
- mock จะอ่านจาก `openapi.yaml` เดียวกัน และเล่นตัวอย่างที่บันทึกไว้
  จาก Apidog collection ที่ `apis/payments/apidog/` ซ้ำ

นี่คือจุดที่ Apidog เข้ามามีบทบาทในไฟล์ Mock server, สเปก และตัวอย่างคำขอที่บันทึกไว้ร่วมกันสร้างสัญญาที่เอเจนต์สามารถรันได้โดยไม่ต้องสิ้นเปลืองการเรียกใช้บนแบ็กเอนด์จริง จับคู่กับ คู่มือการทดสอบ API โดยไม่ต้องใช้ Postman สำหรับเวิร์กโฟลว์พื้นฐาน

5. การยืนยันตัวตนและความลับ

บอกเอเจนต์ว่า API ยืนยันตัวตนอย่างไร และ env var ตัวใดเก็บอะไรอยู่ ห้ามใส่ความลับจริงลงในไฟล์เด็ดขาด

## การยืนยันตัวตน

- Production ใช้ OAuth 2 client credentials ที่ออกโดย Auth0
- การพัฒนาในเครื่องใช้ dev token แบบคงที่; export `DEV_TOKEN` จาก `.env.local`
- Apidog collection ใช้ชื่อ env var เดียวกัน เพื่อให้ mock และ
  real client ทำงานเหมือนกัน
- Tokens ห้ามคอมมิต; `.env.local` อยู่ใน `.gitignore`

6. กลยุทธ์การทดสอบ

จัดลำดับชั้นการทดสอบ เอเจนต์จะรันตามลำดับที่คุณระบุไว้

## การทดสอบ

1. `make test` สำหรับ unit tests รวดเร็ว รันทุกครั้งที่มีการเปลี่ยนแปลง
2. `make contract` สำหรับ OpenAPI contract tests กับ mock รันก่อน
   ที่จะรวมการเปลี่ยนแปลงสเปกใดๆ
3. `make integration` สำหรับ end-to-end tests กับเซิร์ฟเวอร์โลคัลที่มี
   Postgres จริง รันก่อนรวมเข้า main
4. Staging soak รันทุกคืนผ่าน GitHub Actions; ไม่ใช่คำสั่งโลคัล

7. รายการที่ห้ามแก้ไข

โค้ดที่สร้างขึ้น, dependencies ที่ถูกจัดหามา (vendored dependencies) และ migrations มักจะอยู่ในส่วนนี้

## ห้ามแก้ไขด้วยมือ

- `gen/**` (สร้างใหม่โดย `make codegen`)
- `vendor/**` (จัดการโดย `go mod vendor`)
- `migrations/*.up.sql` ที่เกินกว่า migration แรกที่ยังไม่ได้ใช้
- ชื่อฟิลด์ schema ใน `apis/payments/openapi.yaml` โดยไม่ได้รับการอนุมัติจากเจ้าของ

8. รูปแบบมาตรฐาน

สามถึงห้ากฎ หากมากกว่านั้นเอเจนต์จะเลือกกฎที่ผิด

## ข้อตกลง

- Error จะคืนค่า RFC 7807 problem JSON; ไม่ใช่สตริงเปล่า
- ใช้ snake_case ใน JSON, camelCase ใน Go, PascalCase ใน TS clients
  Codegen จัดการการแมปให้
- Idempotency keys จำเป็นสำหรับ POST endpoints ทั้งหมดที่สร้างทรัพยากร
- ทุก endpoint ใหม่ต้องมีการทดสอบสัญญาที่ครอบคลุมทั้งพาธ 200 และ 4xx

ตัวอย่างที่เป็นรูปธรรม: ไฟล์ 90 บรรทัดที่ทำงานได้จริง

สิ่งล่อใจคือการเขียน 800 บรรทัด จงต้านทานมัน ไฟล์ด้านล่างครอบคลุมบริการ API จริงใน Markdown 90 บรรทัด และเพียงพอสำหรับเอเจนต์หลักใดๆ ที่จะทำงานได้อย่างมีประสิทธิภาพ

# โปรเจกต์: Payments API

บริการชำระเงินภายในสำหรับผลิตภัณฑ์ Acme ใช้ Go 1.23, Echo,
Postgres 17, Redis สำหรับ idempotency ผู้ใช้งานคือมือถือ, เว็บ,
และแบ็กเอนด์ของพาร์ทเนอร์

## คำสั่ง

| วัตถุประสงค์ | คำสั่ง |
|--------|---------|
| ติดตั้ง | `make deps` |
| รันเซิร์ฟเวอร์ | `make dev` |
| Unit tests | `make test` |
| Contract tests | `make contract` |
| Lint | `make lint` |
| สร้าง Clients ใหม่ | `make codegen` |
| Migrate DB | `make migrate` |

## แหล่งข้อมูลที่เชื่อถือได้

- สเปก: `apis/payments/openapi.yaml`
- Clients ที่สร้างขึ้น: `gen/clients/{go,ts,python}` (ห้ามแก้ไข)
- ขั้นตอนการแก้ไข: สเปก -> `make codegen` -> handler -> contract tests -> จัดส่ง

## เซิร์ฟเวอร์โลคัล

- เซิร์ฟเวอร์จริง: `make dev` (`http://127.0.0.1:8080`)
- Apidog mock: `make mock` (`http://127.0.0.1:4010`)
- Apidog collection: `apis/payments/apidog/`

## การยืนยันตัวตน

- Production: Auth0 OAuth 2 client credentials
- การพัฒนาในเครื่อง: `DEV_TOKEN` แบบคงที่จาก `.env.local`

## ลำดับการทดสอบ

1. `make test`
2. `make contract`
3. `make integration`

## ห้ามแก้ไขด้วยมือ

- `gen/**`, `vendor/**`
- Migrations ที่ใช้แล้วใน `migrations/`
- ชื่อฟิลด์สเปกโดยไม่ได้รับการอนุมัติจากเจ้าของ

## ข้อตกลง

- RFC 7807 problem JSON สำหรับข้อผิดพลาด
- snake_case JSON, codegen จัดการการแมปภาษา
- Idempotency keys จำเป็นสำหรับการสร้างด้วย POST
- ทุก endpoint ใหม่มาพร้อมกับการทดสอบสัญญา

เท่านี้ก็เพียงพอแล้ว เพิ่มส่วนต่างๆ ก็ต่อเมื่อเอเจนต์ทำผิดพลาดแบบเดิมซ้ำสองครั้ง

การทำให้ไฟล์อัปเดตอยู่เสมอ

ไฟล์ AGENTS.md ที่ล้าสมัยนั้นแย่กว่าไม่มีไฟล์เลย เอเจนต์จะเชื่อมันและส่งมอบโค้ดตามคำสั่ง Build ที่ใช้งานไม่ได้อีกต่อไป

สามนิสัยที่ช่วยให้มันอัปเดตอยู่เสมอ:

  1. ปฏิบัติต่อมันเหมือนโค้ดสำหรับใช้งานจริง. การเปลี่ยนแปลงต้องผ่านการรีวิวแบบเดียวกับ PR อื่นๆ ผู้รีวิวจะตรวจสอบว่ารายการคำสั่งตรงกับ Makefile จริง
  2. เชื่อมต่อเข้ากับ CI. สคริปต์สั้นๆ ที่แยกวิเคราะห์ตารางคำสั่งและรันแต่ละคำสั่งบน fresh checkout จะช่วยตรวจจับการเปลี่ยนแปลงได้อย่างรวดเร็ว ทีมส่วนใหญ่เขียนสิ่งนี้ใน Bash ประมาณ 30 บรรทัด
  3. อัปเดตมันใน PR เดียวกัน. เมื่อคุณเพิ่มคำสั่งทดสอบใหม่ อย่าสัญญาว่าจะอัปเดต AGENTS.md ทีหลัง อัปเดตมันตอนนี้เลย ค่าใช้จ่ายคือสองนาที; ค่าใช้จ่ายของการข้ามคือความสับสนของเอเจนต์สองสัปดาห์

Apidog ในฐานะสัญญาสำหรับการรันสำหรับ AGENTS.md ของคุณ

AGENTS.md ให้บริบทกับเอเจนต์ OpenAPI spec ให้สัญญา Apidog ทำหน้าที่เชื่อมโยงทั้งสอง: มันอ่านสเปก รัน mock โลคัลที่ URL ที่ระบุใน AGENTS.md เล่นตัวอย่างคำขอที่บันทึกไว้สำหรับการทดสอบซ้ำ และให้เอเจนต์เห็นการตอบกลับจริงโดยไม่ต้องสิ้นเปลืองเครดิตกับแบ็กเอนด์ที่ใช้งานจริง

รูปแบบที่ใช้งานได้:

สำหรับการเจาะลึกเวิร์กโฟลว์ Apidog mock กับ API จริง คู่มือ DeepSeek V4 API ครอบคลุมรูปแบบเดียวกันที่นำไปใช้กับ model API แทน service API

ข้อผิดพลาดทั่วไปที่ทีม API มักทำ

หลังจากตรวจสอบไฟล์เหล่านี้หลายสิบไฟล์ ปัญหาห้าประการเดิมๆ ก็ปรากฏขึ้น:

  1. ลิงก์แทนการแสดงรายการ. “ดู Wiki สำหรับคำสั่ง Build” เอเจนต์ไม่ได้เรียกดู Wiki ใส่อินไลน์คำสั่งลงไป
  2. ภาษาที่เน้นการตลาด. “แพลตฟอร์ม API ระดับโลกของเราช่วยเสริมพลัง…” เอเจนต์ไม่ต้องการการนำเสนอ บอกข้อเท็จจริงไปเลย
  3. คำสั่งที่ล้าสมัย. คำสั่งที่ใช้งานไม่ได้ในเดือนมีนาคมยังคงอยู่ในไฟล์ในเดือนเมษายน เชื่อมต่อ CI เพื่อตรวจจับสิ่งนี้
  4. ขาดส่วนของสเปก. นี่คือบล็อกที่มีประโยชน์ที่สุด ควรใส่ไว้เสมอ
  5. ไม่มีรายการห้ามแก้ไข. เอเจนต์แก้ไขโค้ดที่สร้างขึ้น การรัน codegen ครั้งถัดไปจะลบการแก้ไข Build เสียหาย ทำซ้ำ

หากคุณต้องการเริ่มต้นจากพื้นฐาน ให้คัดลอกตัวอย่างด้านบนลงในรีโพของคุณ แก้ไขสรุปโปรเจกต์ และปรับตารางคำสั่ง คุณสามารถส่งมอบไฟล์ที่ใช้งานได้ภายใน 20 นาที

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

AGENTS.md เหมือนกับ CLAUDE.md หรือไม่?รูปแบบเข้ากันได้ ทีมส่วนใหญ่จะเก็บไฟล์ใดไฟล์หนึ่งเป็นแหล่งข้อมูลที่เชื่อถือได้และทำ symlink อีกไฟล์หนึ่ง Anthropic และ OpenAI ได้ตกลงร่วมกันในการรักษารูปแบบให้สามารถทำงานร่วมกันได้

ฉันควรวางไฟล์ไว้ที่ไหน? ควรวางไว้ที่ root ของรีโพเสมอ เอเจนต์บางตัวยังอ่านไฟล์ AGENTS.md ที่ซ้อนกันในไดเรกทอรีย่อยได้ ซึ่งมีประโยชน์สำหรับ monorepos เริ่มต้นด้วยไฟล์ระดับ root เพียงไฟล์เดียว และเพิ่มไฟล์ในไดเรกทอรีย่อยเมื่อไฟล์ระดับ root ไฟล์เดียวเริ่มยาวเกินไป

ควรมีความยาวเท่าไร? 200 ถึง 400 บรรทัดคือจุดที่เหมาะสม หากยาวกว่านั้นเอเจนต์จะเริ่มข้ามส่วนต่างๆ หากคุณต้องการรายละเอียดเพิ่มเติม ให้ลิงก์ไปยังเอกสารแยกต่างหากพร้อมสรุปแบบหนึ่งบรรทัด

ฉันควรใส่ตัวอย่างโค้ดหรือไม่? ตัวอย่างสั้นๆ ได้ ตัวอย่างยาวๆ ไม่ได้ เก็บตัวอย่างเต็มไว้สำหรับการทดสอบ; เอเจนต์ก็อ่านการทดสอบด้วยเช่นกัน คู่มือ GPT-5.5 free Codex ครอบคลุมวิธีการที่ Codex ใช้ตัวอย่างการทดสอบเป็นสัญญาณเพิ่มเติมโดยเฉพาะ

เอเจนต์อ่านไฟล์ซ้ำทุกครั้งที่ทำงานหรือไม่? เอเจนต์ส่วนใหญ่อ่านไฟล์เมื่อเริ่มต้นเซสชันและแคชไว้ บางตัวอ่านซ้ำหลังจากมีการเปลี่ยนแปลงไฟล์ขนาดใหญ่ หากคุณแก้ไขครั้งใหญ่ การรีสตาร์ทเซสชันเอเจนต์คือวิธีที่ปลอดภัยที่สุด

ฉันจะทดสอบได้อย่างไรว่าไฟล์ของฉันทำงานได้? รันเซสชันเอเจนต์ใหม่โดยไม่มีบริบทอื่น ให้งานเล็กๆ น้อยๆ แก่เอเจนต์ (“เพิ่มการตอบกลับ 422 ไปยัง POST /payments”) และดูว่ามันทำอะไร หากมันอ่านสเปก รัน `make codegen` และเขียนการทดสอบสัญญา ไฟล์นั้นก็กำลังทำงานตามที่ตั้งใจไว้

ฝึกการออกแบบ API แบบ Design-first ใน Apidog

ค้นพบวิธีที่ง่ายขึ้นในการสร้างและใช้ API