- Codex CLI ถูกออกแบบให้เป็น เอเจนต์ที่ทำการเปลี่ยนแปลงซอฟต์แวร์คุณภาพสูงได้อย่างปลอดภัยและมีประสิทธิภาพ ในสภาพแวดล้อมโลคัล
- โครงสร้างหลักอย่าง ลูปเอเจนต์ (agent loop) เชื่อมโยงอินพุตของผู้ใช้ การอนุมานของโมเดล และการเรียกใช้เครื่องมือแบบวนซ้ำ เพื่อทำงานที่มีความหมาย
- ระหว่างกระบวนการลูป การประกอบพรอมป์ต์, การจัดการ context window, การแคชพรอมป์ต์ ทำหน้าที่เป็นองค์ประกอบสำคัญด้านประสิทธิภาพและความเสถียร
- Codex สื่อสารกับโมเดลผ่าน Responses API โดยแต่ละคำขอประกอบด้วย JSON payload แบบสมบูรณ์ จึงคงการทำงานแบบ stateless
- โครงสร้างนี้ทำให้สามารถรองรับความสามารถขั้นสูงอย่าง Zero Data Retention (ZDR), การแคชพรอมป์ต์, การบีบอัดอัตโนมัติ (compaction) และเป็นรากฐานของการออกแบบเอเจนต์ขนาดใหญ่
ภาพรวมของลูปเอเจนต์ Codex
- Codex CLI ทำงานโดยมี โครงสร้างลูปที่ประสานปฏิสัมพันธ์ระหว่างผู้ใช้ โมเดล และเครื่องมือ เป็นแกนกลาง
- รับอินพุตจากผู้ใช้แล้วประกอบเป็น พรอมป์ต์ (prompt) เพื่อส่งให้โมเดล
- หากโมเดลสร้างคำตอบหรือร้องขอ การเรียกใช้เครื่องมือ (tool call) เอเจนต์จะดำเนินการตามนั้นและเพิ่มผลลัพธ์กลับเข้าไปในพรอมป์ต์อีกครั้ง
- เมื่อโมเดลไม่เรียกใช้เครื่องมือเพิ่มเติมแล้วและสร้าง ข้อความ assistant หนึ่งเทิร์นก็จะสิ้นสุดลง
- แต่ละเทิร์นเป็นส่วนหนึ่งของ บทสนทนา (conversation) โดยข้อความก่อนหน้าและประวัติการเรียกใช้เครื่องมือทั้งหมดจะถูกรวมไว้ในพรอมป์ต์ของคำขอถัดไป
- เนื่องจากความยาวของพรอมป์ต์ได้รับผลกระทบจากข้อจำกัดของ context window ของโมเดล Codex จึงต้องจัดการส่วนนี้อย่างเหมาะสม
โครงสร้างการสื่อสารระหว่าง Responses API กับ Codex
- Codex CLI ส่งคำขอ HTTP ไปยัง Responses API เพื่อทำ model inference
- API endpoint จะแตกต่างกันตามการตั้งค่า และสามารถใช้ได้ทั้งในสภาพแวดล้อม OpenAI, ChatGPT, Azure และแบบโลคัล (LM Studio, Ollama เป็นต้น)
- คำขอ API ประกอบด้วย JSON payload โดยฟิลด์หลักมีดังนี้
- ข้อความ system/developer: ตั้งค่าบริบทพื้นฐานของโมเดล
- instructions: รายการเครื่องมือที่โมเดลสามารถเรียกใช้ได้
- tools: คำจำกัดความของเครื่องมือที่ Codex CLI, Responses API และผู้ใช้ (เช่น MCP server) จัดเตรียมไว้
- input: รายการข้อความที่รวมประวัติบทสนทนาและข้อมูลสภาพแวดล้อม
- Codex จะอ่านการตั้งค่า
~/.codex/config.toml รวมถึง AGENTS.md และไฟล์ skills ภายในโปรเจ็กต์ เพื่อ แทรกคำสั่งของผู้ใช้และข้อมูลสภาพแวดล้อมโดยอัตโนมัติ
การประกอบพรอมป์ต์และการจัดการอีเวนต์
- Codex จัดโครงสร้างแต่ละข้อความเป็นอ็อบเจ็กต์ JSON (
type, role, content) แล้วส่งไปยัง Responses API
- เซิร์ฟเวอร์จะ สร้างโมเดลพรอมป์ต์ จาก JSON นี้ และส่งคำตอบกลับมาเป็นสตรีม SSE (Server-Sent Events)
- อีเวนต์
response.output_text.delta ใช้สำหรับเอาต์พุตแบบสตรีมมิง
- อีเวนต์
response.output_item.added จะถูกเพิ่มเข้าไปใน input ของคำขอถัดไปเพื่อให้ลูปดำเนินต่อ
- ระบบถูกออกแบบให้พรอมป์ต์ก่อนหน้าเป็น prefix ที่ตรงกันอย่างแม่นยำ ของพรอมป์ต์ใหม่ เพื่อให้สามารถใช้ การแคชพรอมป์ต์ (prompt caching) ได้
การเพิ่มประสิทธิภาพ: การแคชและการออกแบบแบบ stateless
- Codex ไม่ใช้
previous_response_id จึงคงโครงสร้างคำขอแบบ stateless อย่างสมบูรณ์
- สิ่งนี้ช่วยให้รองรับลูกค้าแบบ Zero Data Retention (ZDR) และลดการเก็บรักษาข้อมูลให้เหลือน้อยที่สุด
- การแคชพรอมป์ต์นำ prefix เดิมกลับมาใช้ซ้ำเพื่อ ทำให้ต้นทุนการ sampling เป็นเชิงเส้น (linear)
- การ cache hit จะเกิดขึ้นเฉพาะเมื่อ prefix ตรงกันอย่างแม่นยำ เท่านั้น
- การเปลี่ยนรายการเครื่องมือ โมเดล การตั้งค่า sandbox หรือ working directory จะทำให้เกิด cache miss
- การเปลี่ยนแปลงแบบไดนามิกของเครื่องมือ MCP อาจทำให้สูญเสียแคชได้ ดังนั้น Codex จึง สะท้อนการเปลี่ยนแปลงผ่านวิธีการแทรกข้อความใหม่
การจัดการ context window และการบีบอัดอัตโนมัติ (compaction)
- เมื่อบทสนทนายาวขึ้น จะมีการทำ การบีบอัดบทสนทนา (compaction) เพื่อป้องกันไม่ให้เกิน context window
- ในช่วงแรกใช้คำสั่ง
/compact เพื่อสรุปด้วยตนเอง แต่ปัจจุบันใช้ endpoint /responses/compact ของ Responses API แบบอัตโนมัติ
- endpoint นี้จะส่งคืน รายการ
type=compaction และ encrypted_content ที่เข้ารหัสไว้ เพื่อคงความเข้าใจของโมเดล
- เมื่อเกินค่า auto_compact_limit Codex จะทำการบีบอัดโดยอัตโนมัติเพื่อรักษาความต่อเนื่องของบทสนทนา
บทสรุปและทิศทางต่อไป
- ลูปเอเจนต์ของ Codex คือโครงสร้างแกนกลางที่ผสาน model inference, การเรียกใช้เครื่องมือ, การแคช, การจัดการบริบท เข้าด้วยกัน
- โครงสร้างนี้ทำให้สามารถออกแบบเอเจนต์ที่ ประสิทธิภาพสูง เป็นแบบ stateless และเน้นความปลอดภัย ได้
- ในโพสต์ถัดไปจะกล่าวถึงโครงสร้างภายในของ Codex เพิ่มเติม เช่น สถาปัตยกรรม CLI, การอิมพลีเมนต์การใช้เครื่องมือ, โมเดล sandboxing
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
สิ่งที่ดีที่สุดของโพสต์บล็อกนี้คือมันไม่น่าแปลกใจเลยแม้แต่น้อย เพราะ Codex CLI เป็นโอเพนซอร์ส จึงสามารถดูภายในได้โดยไม่ต้องทำรีเวิร์สเอนจิเนียริง
การสื่อสารของ Eric Traut (นักพัฒนาที่มีชื่อเสียงจาก Pyright) ก็ดีเยี่ยมมาก เขามีส่วนร่วมกับ issues และ PR อย่างแข็งขัน
GitHub repository
ฉันเองก็มีส่วนช่วยปรับปรุง CLI ไปบางอย่าง และคอยตามดูรีลีสกับ PR อย่างต่อเนื่องเพื่อขยายความรู้
ประเด็นที่น่าสนใจคือส่วนที่การบีบอัด (compaction) ถูกทำเป็น “ข้อความเข้ารหัสที่เก็บความเข้าใจโดยนัยของโมเดลเอาไว้”
เมื่อ Codex เกิน auto_compact_limit มันจะใช้เอนด์พอยต์นี้โดยอัตโนมัติเพื่อลดบริบทการสนทนาอย่างมีประสิทธิภาพ
สิ่งที่ทำให้ฉันแปลกใจตอนดูภายในของ Codex คือ reasoning token จะถูกเก็บไว้ใน agent tool-calling loop แต่จะถูกลบทิ้งทุกครั้งที่เปลี่ยนเป็น user turn ใหม่
เพราะงั้นมันจึงรักษาบริบทต่อเนื่องข้ามหลาย turn ได้ แต่ก็อาจทำให้บริบทบางส่วนหายไปในระหว่างคำขอของผู้ใช้ที่เกี่ยวข้องกัน
ฉันเลยให้โมเดลบันทึกความคืบหน้า แผน หรือรายละเอียดการดีบักลงในไฟล์ Markdown เพื่อให้ทำหน้าที่เหมือน snapshot ระหว่างหลาย context window
GitHub repository
สิ่งที่ฉันอยากได้จาก Codex มากที่สุดคือฟีเจอร์ checkpoint แบบสไตล์ Copilot มี issue ที่เกี่ยวข้องอยู่หลายอันบน GitHub (#2788, #3585) แต่ดูเหมือนจะยังไม่ใช่ลำดับความสำคัญของทีม
ฉันสงสัยว่าเวลารวบรวมคำสั่งของผู้ใช้ใน agent loop พวกเขาจัดการ การรักษาคอนเท็กซ์ ในบทสนทนาหลาย turn อย่างไร และเคยลองใช้เทคนิคที่ปรับแบบไดนามิกเมื่อความต้องการของผู้ใช้เปลี่ยนไปหรือไม่
ฉันชอบ Codex แต่รู้สึกว่ามัน ช้ากว่า เว็บอินเทอร์เฟซ ChatGPT เวลาโยนไอเดียโต้ตอบกันเร็ว ๆ ฉันยังรู้สึกว่าการคัดลอกวางบนเว็บมีประสิทธิภาพกว่า
Codex มักเริ่มไปแก้โค้ดผิดจุด ทำให้ feedback loop ช้าและน่าหงุดหงิด แต่ตอนที่มันทำงานดี มันก็ดีมาก หวังว่าสักวันจะเร็วได้เหมือนเว็บและยังทำงานโลคัลได้ด้วย
ไม่ได้ใหม่เป็นพิเศษ แต่ก็ยังเป็นบทความที่มีคุณค่า อยากให้ใน coding CLI แบบ agentic สามารถ สะท้อน (reflect) วนลูปหรือประวัติย้อนหลังได้ง่ายกว่านี้ ฉันเคยลองใช้วิธี query ประวัติแชตผ่าน MCP แต่ต้องระบุชัดเจนถึงจะใช้ได้ เลยไม่ค่อยสะดวก การเรียนรู้อย่างต่อเนื่องน่าจะช่วยแก้ปัญหานี้ได้
พฤติกรรมแบบนี้สังเกตได้ผ่าน OTEL telemetry เช่นกัน ฉันใช้ headless codex exec บ่อย แต่การรองรับ telemetry ในตัวมีน้อย เลยดีบักได้ยาก
เพราะงั้นฉันจึงทำ codex-plus ขึ้นมาใช้เอง มันสะท้อนอินเทอร์เฟซ codex exec ตรง ๆ และสร้างอยู่บน TypeScript SDK จากนั้นหลังรันเสร็จก็ส่ง session log ไปยัง remote OpenTelemetry collector เพื่อให้วิเคราะห์ผ่าน codex-plus-log-viewer ได้
ส่วนที่อธิบายเรื่อง skill ให้ความรู้สึกแปลก ๆ
ลิงก์ไปยังโค้ดที่เกี่ยวข้อง
ฉันสงสัยว่าทำไมไม่เปิดเผยไฟล์โดยตรงไปเลย แต่กลับให้โมเดลร้องขอเหมือนไฟล์ทั่วไป
ฉันเคยสงสัยว่ามีใครใช้ Codex CLI แบบจริงจังบ้างไหม ฉันเคยใช้ VSCode Codex extension, Gemini CLI และ Claude Code CLI ซึ่งทั้งหมด ประสิทธิภาพแย่มาก
แต่ Codex CLI ตัวใหม่ที่ทำด้วย Rust นั้นแรงมาก UX ก็ยอดเยี่ยม และรายละเอียดเล็ก ๆ อย่างคีย์ลัดก็ทำมาดี Theo บอกว่า “ควรโฟกัสที่การปรับปรุงโมเดลมากกว่าการ optimize CLI” แต่พอได้ใช้แล้วฉันไม่เห็นด้วยเลย
บทความที่เกี่ยวข้อง: Scribe Swebench Benchmark