- แซนด์บ็อกซ์น้ำหนักเบาสำหรับการรันโค้ดของเอเจนต์ AI ให้ความเร็วในการเริ่มต้น เร็วกว่า 100 เท่า เมื่อเทียบกับคอนเทนเนอร์ และมีประสิทธิภาพการใช้หน่วยความจำดีกว่า 10–100 เท่า
- สร้างบน เทคโนโลยี isolate ของเอนจิน V8 JavaScript เริ่มทำงานได้ภายในไม่กี่มิลลิวินาทีและใช้หน่วยความจำเพียงไม่กี่เมกะไบต์ จึงสามารถสร้างและทิ้งแซนด์บ็อกซ์ใหม่ได้ในทุกคำขอ
- ใช้แนวทาง Code Mode ที่เอเจนต์ เขียนและรันโค้ด TypeScript ได้โดยตรง แทนการเรียกใช้เครื่องมือ ช่วยลดการใช้โทเค็นได้สูงสุด 81%
- มีไลบรารีด้านความปลอดภัยและยูทิลิตี เช่น การกรอง HTTP, credential injection, ระบบไฟล์เสมือน เป็นต้น เพื่อสร้าง ecosystem สำหรับการพัฒนาเอเจนต์
- เป็นการเปลี่ยนผ่านโครงสร้างพื้นฐานที่ก้าวข้ามข้อจำกัดด้านต้นทุน ความหน่วง และการขยายตัวของแซนด์บ็อกซ์แบบคอนเทนเนอร์ ทำให้ บริการเอเจนต์ระดับผู้บริโภคจำนวนมาก เป็นไปได้
เบื้องหลัง: ปัญหาความปลอดภัยของการรันโค้ดเอเจนต์
- หากเอเจนต์ (หรือเซิร์ฟเวอร์ MCP) ต้องรันโค้ดที่ AI สร้างขึ้นสด ๆ โค้ดนั้นต้องทำงานอยู่ในสภาพแวดล้อมที่ปลอดภัย
- หากรันตรงในแอปด้วย
eval() ผู้ใช้ไม่หวังดีอาจแทรกช่องโหว่ผ่าน prompt injection ได้
- จึงจำเป็นต้องมี แซนด์บ็อกซ์ที่แยกออกจากกัน จากทั้งตัวแอปพลิเคชันและโลกภายนอก และอนุญาตเฉพาะความสามารถบางอย่างที่โค้ดต้องเข้าถึงเท่านั้น
ข้อจำกัดของแนวทางคอนเทนเนอร์แบบเดิม
- ปัจจุบันอุตสาหกรรมส่วนใหญ่ใช้ คอนเทนเนอร์ บน Linux เป็นแซนด์บ็อกซ์
- คอนเทนเนอร์ใช้เวลาบูตหลายร้อยมิลลิวินาที และต้องใช้หน่วยความจำ หลายร้อยเมกะไบต์ ในการทำงาน
- เพื่อหลีกเลี่ยงความหน่วง จึงต้องคงสถานะวอร์ม (warm) ไว้ และหากนำคอนเทนเนอร์เดิมกลับมาใช้กับหลายงาน ความปลอดภัยก็จะลดลง
- ในระดับ ผู้บริโภคจำนวนมาก ที่ผู้ใช้ปลายทางทุกคนมีเอเจนต์ของตัวเอง และแต่ละเอเจนต์เขียนโค้ดได้ คอนเทนเนอร์เพียงอย่างเดียวไม่เพียงพอ
Dynamic Worker Loader: แซนด์บ็อกซ์น้ำหนักเบา
- API ที่ทำให้ Cloudflare Worker สามารถ ระบุโค้ดขณะรันไทม์เพื่อสร้าง Worker ใหม่ขึ้นมาแบบทันทีภายในแซนด์บ็อกซ์ของตัวเอง
- ถูกเปิดตัวเป็นฟีเจอร์ทดลองในโพสต์ Code Mode เมื่อเดือนกันยายนที่ผ่านมา และตอนนี้ เปิดเบตาให้ผู้ใช้ Workers แบบชำระเงินทุกคน
- ตอนสร้าง Worker สามารถกำหนดโค้ดผ่าน
compatibilityDate, mainModule, modules, ส่ง RPC stub ผ่าน env และใช้ globalOutbound เพื่อบล็อกหรือดักจับการเข้าถึงอินเทอร์เน็ตได้
เร็วกว่า 100 เท่า
- Dynamic Workers ใช้ V8 isolate ซึ่งเป็นกลไก sandboxing เดียวกับที่ Cloudflare Workers ใช้งานมาตลอด 8 ปี
- isolate คืออินสแตนซ์ของ เอนจินรัน JavaScript V8 เดียวกับที่ Google Chrome ใช้
- เริ่มต้นได้ใน ไม่กี่มิลลิวินาที และใช้หน่วยความจำเพียง ไม่กี่เมกะไบต์ จึงเร็วกว่าและประหยัดหน่วยความจำกว่าคอนเทนเนอร์อย่างมาก ประมาณ 100 เท่า และ 10–100 เท่าตามลำดับ
- จึงสามารถสร้าง isolate ใหม่สำหรับทุกคำขอของผู้ใช้ รันโค้ดหนึ่งชิ้น แล้วทิ้งได้ทันที
การขยายตัวแบบไร้ขีดจำกัด
- ผู้ให้บริการแซนด์บ็อกซ์แบบคอนเทนเนอร์จำนวนมากมักกำหนดข้อจำกัดเรื่อง จำนวนแซนด์บ็อกซ์ที่รันพร้อมกันทั่วโลก และความเร็วในการสร้าง
- Dynamic Worker Loader เป็น API ของเทคโนโลยีเดียวกับที่ใช้ขับเคลื่อนแพลตฟอร์มอยู่แล้ว จึงไม่มีข้อจำกัดแบบนั้น
- รองรับการประมวลผล หนึ่งล้านคำขอต่อวินาที พร้อมกับโหลดแซนด์บ็อกซ์ Dynamic Worker แยกต่อคำขอเพื่อรันพร้อมกันได้
หน่วงแทบเป็นศูนย์
- Dynamic Workers แบบใช้ครั้งเดียวมักรันอยู่บน เครื่องเดียวกันและเธรดเดียวกัน กับ Worker ที่สร้างมัน
- ไม่จำเป็นต้องสื่อสารข้ามโลกเพื่อหาแซนด์บ็อกซ์ที่วอร์มไว้ล่วงหน้า แต่รันได้ทันที ณ จุดที่คำขอมาถึง
- รองรับใน หลายร้อยโลเกชันทั่วโลก ของ Cloudflare
สภาพแวดล้อมรันเฉพาะ JavaScript
- ข้อจำกัดเดียวเมื่อเทียบกับคอนเทนเนอร์คือ เอเจนต์ต้อง เขียน JavaScript
- แม้ Workers จะรองรับ Python และ WebAssembly ในทางเทคนิคด้วย แต่สำหรับโค้ดชิ้นเล็ก ๆ ที่เอเจนต์สร้างสด JavaScript โหลดและรันได้เร็วกว่าอย่างมาก
- LLM เชี่ยวชาญภาษาหลักทั้งหมดอยู่แล้ว และมี ข้อมูลฝึกของ JavaScript จำนวนมหาศาล
- ด้วยธรรมชาติของเว็บ JavaScript จึงเป็น ภาษาที่ถูกออกแบบมาเพื่อการทำ sandboxing
API เครื่องมือที่นิยามด้วย TypeScript
- MCP นิยามเพียงสคีมาการเรียกเครื่องมือแบบแบน ส่วน OpenAPI ใช้แทน REST API แต่ทั้งตัวสคีมาและโค้ดเรียกใช้งานล้วนยืดยาว
- สำหรับ API ที่เปิดให้ JavaScript ใช้งานได้ TypeScript คือคำตอบที่เหมาะที่สุดเพียงหนึ่งเดียว
- อินเทอร์เฟซ TypeScript สามารถอธิบาย API ได้อย่างแม่นยำโดยใช้ โทเค็นน้อยกว่ามาก เมื่อเทียบกับสเปก OpenAPI เดียวกัน
- Workers Runtime จะตั้งค่า Cap'n Web RPC bridge ระหว่างแซนด์บ็อกซ์กับโค้ดโฮสต์ให้อัตโนมัติ ทำให้เอเจนต์เรียก API ได้เหมือนเป็นไลบรารีภายในเครื่อง
การกรอง HTTP และ credential injection
- ใช้ตัวเลือก
globalOutbound เพื่อ ลงทะเบียน callback สำหรับคำขอ HTTP ทั้งหมด ทำการตรวจสอบ เขียนใหม่ ใส่คีย์ยืนยันตัวตน หรือบล็อกคำขอได้
- credential injection (token injection): เมื่อเอเจนต์ส่งคำขอ HTTP ไปยังบริการที่ต้องยืนยันตัวตน ระบบจะเติม credential ลงในคำขอขาออกโดยที่ตัวเอเจนต์เองไม่รู้ความลับนั้น
- มีประโยชน์เมื่อ API ที่รู้จักกันดีอยู่ในข้อมูลฝึกของเอเจนต์ หรือเมื่อรันไลบรารีที่อิง REST API ภายในแซนด์บ็อกซ์
- แต่หากไม่มีข้อกำหนดเรื่องความเข้ากันได้ อินเทอร์เฟซ TypeScript RPC เหนือกว่า HTTP: ใช้โทเค็นน้อยกว่า โค้ดเรียกกระชับกว่า และจำกัดพื้นผิวของ API ได้แม่นยำกว่า
สถาปัตยกรรมความปลอดภัยที่ผ่านการพิสูจน์แล้ว
- แซนด์บ็อกซ์แบบ isolate มี พื้นผิวการโจมตีที่ซับซ้อนกว่า ฮาร์ดแวร์เวอร์ชวลแมชชีน และบั๊กด้านความปลอดภัยของ V8 ก็เกิดบ่อยกว่าของไฮเปอร์ไวเซอร์ทั่วไป
- Cloudflare มีประสบการณ์ในการดูแลความปลอดภัยของแพลตฟอร์มแบบ isolate มาราว 10 ปี
- สามารถนำแพตช์ความปลอดภัยของ V8 ขึ้นโปรดักชันได้ภายในไม่กี่ชั่วโมง เร็วกว่า Chrome
- ใช้ แซนด์บ็อกซ์ชั้นที่สอง แบบปรับแต่งเอง และระบบกั้น tenant แบบไดนามิกตามการประเมินความเสี่ยง
- ขยายการป้องกันของ V8 sandbox ด้วยฟีเจอร์ฮาร์ดแวร์อย่าง MPK
- ร่วมมือกับ TU Graz พัฒนาเทคนิคป้องกันใหม่ ๆ เช่น การป้องกัน Spectre
- มีระบบสแกนและบล็อกแพตเทิร์นอันตรายโดยอัตโนมัติ รวมถึงเพิ่มระดับการ sandboxing ตามความเหมาะสม
ไลบรารีช่วยเหลือ
Code Mode (@cloudflare/codemode)
- ไลบรารีที่ทำให้การนำโค้ดที่โมเดลสร้างมารันกับเครื่องมือ AI ผ่าน Dynamic Workers เป็นเรื่องง่าย
- แกนหลักคือ
DynamicWorkerExecutor() ซึ่งจัดการปัญหาการฟอร์แมตทั่วไปผ่านการปรับโค้ดให้เป็นมาตรฐาน และเข้าถึง fetcher ของ globalOutbound ได้โดยตรง
codeMcpServer({ server, executor }) ห่อ MCP Server เดิมแล้วแทนพื้นผิวของเครื่องมือด้วยเครื่องมือเดียวชื่อ code()
openApiMcpServer({ spec, executor, request }) รับสเปก OpenAPI และ executor แล้ว สร้าง MCP Server แบบสมบูรณ์อัตโนมัติ ที่มีเครื่องมือ search() และ execute()
การบันเดิล (@cloudflare/worker-bundler)
- สร้าง โมดูลที่บันเดิลล่วงหน้า ตามที่ Dynamic Workers ต้องการ
- หากให้ไฟล์ซอร์สและ
package.json ระบบจะ resolve dependency จาก npm, บันเดิลด้วย esbuild และคืนค่า module map ที่ Worker Loader คาดหวัง
- รองรับ แอปแบบฟูลสแตก ผ่าน
createApp ที่บันเดิลทั้งเซิร์ฟเวอร์ Worker, JavaScript ฝั่งไคลเอนต์ และ static asset ไปพร้อมกัน
- มีการเสิร์ฟ asset ในตัวที่จัดการ content type, ETag และการทำ SPA routing
การจัดการไฟล์ (@cloudflare/shell)
- มอบ ระบบไฟล์เสมือน ให้เอเจนต์ภายใน Dynamic Worker
- ใช้เมธอดแบบมีชนิดข้อมูลของอ็อบเจ็กต์
state เพื่ออ่าน เขียน ค้นหา แทนที่ diff, glob, query/update JSON, archive และอื่น ๆ
- พื้นที่จัดเก็บสำรองไว้ใน Workspace แบบคงทน (SQLite + R2) ทำให้ไฟล์คงอยู่ข้ามการรันได้
- งานขนาดใหญ่ เช่น
searchFiles, replaceInFiles, planEdits ช่วย ลด RPC round-trip ให้ต่ำสุด — เรียกครั้งเดียวแทนการวนทีละไฟล์
- การเขียนแบบแบตช์เป็น ทรานแซกชัน โดยปริยาย: หากมีรายการใดล้มเหลว การเขียนก่อนหน้าจะถูก rollback อัตโนมัติ
- มี TypeScript type declaration ที่พรีบิลต์ไว้แล้วและเทมเพลต system prompt ให้พร้อม
กรณีการใช้งาน
การใช้งาน Code Mode
- แทนที่จะเรียกเครื่องมือแบบลำดับขั้น เอเจนต์สามารถ เขียนฟังก์ชัน TypeScript เพียงตัวเดียว เพื่อเชื่อมการเรียกหลาย API แล้วรันใน Dynamic Worker ก่อนส่งกลับเฉพาะผลลัพธ์สุดท้าย
- เนื่องจากมีเพียงผลลัพธ์ ไม่ใช่ขั้นตอนกลาง ที่เข้าสู่ context window จึง ลดทั้งความหน่วงและการใช้โทเค็น
- Cloudflare MCP server ถูกสร้างด้วยแนวทางนี้ โดยเปิดให้เข้าถึง Cloudflare API ทั้งหมดด้วย เพียง 2 เครื่องมือ (search, execute) และใช้ไม่ถึง 1,000 โทเค็น
สร้างระบบอัตโนมัติแบบกำหนดเอง
- Zite กำลังสร้างแพลตฟอร์มแอปที่ผู้ใช้โต้ตอบผ่านอินเทอร์เฟซแชต
- LLM เขียน TypeScript อยู่เบื้องหลังเพื่อ สร้างแอป CRUD, เชื่อมต่อ Stripe, Airtable, Google Calendar และรันตรรกะฝั่งแบ็กเอนด์
- แต่ละระบบอัตโนมัติจะรันใน Dynamic Worker ของตัวเอง และเข้าถึงได้เฉพาะ บริการและไลบรารีที่จำเป็นต่อ endpoint นั้นเท่านั้น
- Antony Toron, CTO ของ Zite กล่าวว่าเป็น "ชั้นการรันที่ทันที แยกขาด และปลอดภัย" ซึ่งให้ประสิทธิภาพด้านความเร็วและการรองรับไลบรารีดีที่สุดในทุกแพลตฟอร์มที่พวกเขา benchmark และปัจจุบันรองรับคำขอรันงานหลายล้านครั้งต่อวัน
การรันแอปพลิเคชันที่ AI สร้าง
- นำไปใช้สร้างแพลตฟอร์มที่ให้ AI สร้างแอปพลิเคชันเต็มรูปแบบ
- แต่ละแอปจะถูก สร้างแบบ on-demand และเก็บไว้ใน cold storage จนกว่าจะถูกเรียกอีกครั้ง
- เวลาเริ่มต้นที่รวดเร็วช่วยให้ พรีวิวการเปลี่ยนแปลง ระหว่างการพัฒนาอย่างต่อเนื่องทำได้ง่าย
- สามารถบล็อกหรือดักจับคำขอเครือข่ายจากโค้ดที่สร้างขึ้น เพื่อรับประกัน การรันแอปที่ AI สร้างอย่างปลอดภัย
ราคา
- Workers ที่โหลดแบบไดนามิกคิดค่าบริการ $0.002 ตามจำนวน Worker ที่โหลดไม่ซ้ำต่อวัน (ยังไม่รวมค่า CPU time และค่าคำขอของ Workers ปกติ)
- สำหรับกรณีใช้งาน AI-generated "Code Mode" ซึ่ง Worker ทั้งหมดเป็น แบบใช้ครั้งเดียว จึงคิด $0.002 ต่อการโหลด และโดยทั่วไปถือว่าเล็กน้อยเมื่อเทียบกับต้นทุน inference สำหรับการสร้างโค้ด
- ยกเว้นค่าบริการ $0.002 ในช่วงเบตา
ยังไม่มีความคิดเห็น