บริการแซนด์บ็อกซ์ E2B และระบบคลาวด์
E2B SDK, Daytona และ API แซนด์บ็อกซ์ที่มีการจัดการสำหรับเอเจนต์แปลโค้ด
บริการแซนด์บ็อกซ์ E2B และระบบคลาวด์ เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
E2B คืออะไร
อีทูบี (สภาพแวดล้อมสำหรับสร้าง) คือบริการแซนด์บ็อกซ์บนคลาวด์ที่ออกแบบมาโดยเฉพาะสำหรับเอเจนต์ AI ที่ทำงานกับโค้ด บริการนี้มอบสภาพแวดล้อมที่ปลอดภัยและแยกออกจากกัน ซึ่งเข้าถึงได้ผ่าน SDK ของไพธอน/JS ที่เรียบง่าย โดยไม่ต้องจัดการด็อกเกอร์หรือ VM ด้วยตนเอง
แซนด์บ็อกซ์แต่ละชุดเป็น microVM ของไฟร์แครกเกอร์บนคลาวด์ของอีทูบี
# Install the SDK
# pip install e2b-code-interpreter
from e2b_code_interpreter import Sandbox
sandbox = Sandbox() # creates a new cloud sandbox
print('Sandbox ID:', sandbox.sandbox_id)การเรียกใช้โค้ดในแซนด์บ็อกซ์
วัตถุ Sandbox มีเมธอด run_code() ที่เรียกใช้ไพธอนและส่งคืนเอาต์พุตแบบมีโครงสร้าง ซึ่งรวมถึงเอาต์พุตมาตรฐาน ข้อผิดพลาดมาตรฐาน และวัตถุแสดงผลแบบหลากหลาย เช่น แผนภูมิและดาต้าเฟรม
from e2b_code_interpreter import Sandbox
with Sandbox() as sandbox:
result = sandbox.run_code('print(2 ** 10)')
print(result.logs.stdout) # ['1024']
print(result.error) # None if no errorการจัดการข้อผิดพลาดและข้อยกเว้น
หากโค้ดทำให้เกิดข้อยกเว้น result.error จะมีข้อมูลการติดตามย้อนกลับ แซนด์บ็อกซ์เองยังคงทำงานอยู่ คุณจึงสามารถส่งโค้ดติดตามผลเพื่อแก้ไขข้อผิดพลาดได้
from e2b_code_interpreter import Sandbox
with Sandbox() as sandbox:
result = sandbox.run_code('1 / 0')
if result.error:
print('Error name:', result.error.name) # ZeroDivisionError
print('Traceback:', result.error.traceback)
else:
print(result.logs.stdout)การอัปโหลดไฟล์ไปยังแซนด์บ็อกซ์
ใช้ sandbox.files.write() เพื่ออัปโหลดไฟล์ข้อมูล (CSV เจสัน และรูปภาพ) ไปยังระบบไฟล์ของแซนด์บ็อกซ์ก่อนเรียกใช้โค้ดวิเคราะห์
from e2b_code_interpreter import Sandbox
csv_content = 'name,score\nAlice,95\nBob,87\nCarol,92'
with Sandbox() as sandbox:
sandbox.files.write('/home/user/data.csv', csv_content.encode())
result = sandbox.run_code(
'import csv\n'
'rows = list(csv.DictReader(open("/home/user/data.csv")))\n'
'print([r["name"] for r in rows])'
)
print(result.logs.stdout) # ["['Alice', 'Bob', 'Carol']"]การดาวน์โหลดไฟล์จากแซนด์บ็อกซ์
หลังจากการคำนวณ ให้ดึงไฟล์เอาต์พุต เช่น รายงาน แผนภูมิ และข้อมูลที่ประมวลผลแล้ว ด้วย sandbox.files.read() ไฟล์จะถูกส่งคืนเป็นไบต์
from e2b_code_interpreter import Sandbox
import json
with Sandbox() as sandbox:
sandbox.run_code(
'import json\n'
'result = {"mean": 91.3, "max": 95}\n'
'json.dump(result, open("/home/user/output.json", "w"))'
)
data = sandbox.files.read('/home/user/output.json')
parsed = json.loads(data)
print(parsed) # {'mean': 91.3, 'max': 95}การติดตั้งแพ็กเกจขณะทำงาน
แซนด์บ็อกซ์ของอีทูบีติดตั้งไพธอนไว้ล่วงหน้าแล้ว ให้ติดตั้งแพ็กเกจเพิ่มเติมด้วย run_code() โดยเรียกใช้คำสั่งตัวจัดการแพ็กเกจ จากนั้นจึงใช้แพ็กเกจนั้นในการเรียกครั้งถัด ๆ ไปภายในเซสชันแซนด์บ็อกซ์เดียวกัน
from e2b_code_interpreter import Sandbox
with Sandbox() as sandbox:
# Install pandas inside the sandbox
sandbox.run_code('import subprocess; subprocess.run(["pip", "install", "pandas", "-q"])')
# Now use pandas
result = sandbox.run_code(
'import pandas as pd\n'
'df = pd.DataFrame({"x": [1,2,3], "y": [4,5,6]})\n'
'print(df.describe())'
)
print(result.logs.stdout)แซนด์บ็อกซ์แบบคงอยู่เทียบกับแบบชั่วคราว
อีทูบีรองรับโหมดวงจรชีวิตของแซนด์บ็อกซ์สองแบบ:
- ชั่วคราว: แซนด์บ็อกซ์จะถูกทำลายเมื่อบล็อก
withสิ้นสุด ใช้สำหรับการเรียกใช้โค้ดเพียงครั้งเดียว - คงอยู่: แซนด์บ็อกซ์ยังทำงานต่อเนื่องข้ามคำขอหลายครั้ง ใช้เมื่อสถานะต้องสะสมต่อเนื่องระหว่างรอบการทำงานของเอเจนต์
from e2b_code_interpreter import Sandbox
# Ephemeral (default context manager)
with Sandbox() as sb:
sb.run_code('x = 42')
# Sandbox destroyed here
# Persistent: keep alive for N seconds
sb = Sandbox(timeout=300) # keep alive 5 minutes
try:
sb.run_code('import numpy as np') # expensive import cached
sb.run_code('arr = np.arange(1000)')
result = sb.run_code('print(arr.mean())')
print(result.logs.stdout)
finally:
sb.kill() # explicit cleanupการเชื่อมต่อกับแซนด์บ็อกซ์ที่กำลังทำงานอยู่ใหม่
หากกระบวนการของเอเจนต์เริ่มต้นใหม่ หรือมีการส่งรหัสแซนด์บ็อกซ์ไปยังบริการอื่น คุณสามารถเชื่อมต่อกับแซนด์บ็อกซ์ที่มีอยู่เดิมใหม่โดยใช้ ID ของแซนด์บ็อกซ์ได้โดยไม่สูญเสียสถานะ
from e2b_code_interpreter import Sandbox
# First session
sb1 = Sandbox(timeout=300)
sb1.run_code('accumulated_data = []')
sandbox_id = sb1.sandbox_id
print('Created:', sandbox_id)
# Later — different process, same sandbox
sb2 = Sandbox.connect(sandbox_id)
result = sb2.run_code('accumulated_data.append(1); print(accumulated_data)')
print(result.logs.stdout) # '[1]' — state preserved
sb2.kill()รูปแบบค่าบริการของอีทูบี
อีทูบีคิดค่าบริการตาม วินาทีที่แซนด์บ็อกซ์ทำงาน ซึ่งหมายถึงเวลาที่แซนด์บ็อกซ์ยังทำงานอยู่ ไม่ใช่เฉพาะเวลาที่โค้ดกำลังทำงาน ปัจจัยสำคัญในการคิดค่าบริการมีดังนี้:
- เวลาที่ไม่ได้ใช้งานยังมีค่าใช้จ่าย หากแซนด์บ็อกซ์เป็นแบบคงอยู่
- แซนด์บ็อกซ์แบบชั่วคราวจะคิดค่าบริการตั้งแต่สร้างจนถึงทำลาย
- การส่งข้อมูลออกผ่านเครือข่ายอาจมีค่าบริการแยกต่างหาก
- ใช้
timeoutเพื่อกำหนดเวลายุติการทำงานโดยอัตโนมัติ
# Cost-optimization patterns:
# 1. Use short timeouts for one-shot executions
with Sandbox(timeout=60) as sb:
result = sb.run_code('print("done")')
# Auto-kills after 60s if not killed first
# 2. Kill immediately after use
sb = Sandbox()
try:
sb.run_code('process_data()')
finally:
sb.kill() # don't wait for timeout
# 3. Share one sandbox across multiple agent steps
# instead of creating a new one per stepการใช้อีทูบีในลูปของเอเจนต์
ในเอเจนต์ที่ทำงานหลายรอบ ให้สร้างแซนด์บ็อกซ์เพียงครั้งเดียวและส่ง ID ของแซนด์บ็อกซ์ต่อไปในลูป โค้ดแต่ละส่วนที่ LLM สร้างขึ้นจะทำงานในเซสชันเดียวกัน ดังนั้นตัวแปรและแพ็กเกจที่ติดตั้งไว้จึงคงอยู่ข้ามรอบการทำงาน
from e2b_code_interpreter import Sandbox
import openai
client = openai.OpenAI(api_key='YOUR_OPENAI_KEY')
def run_agent(user_question: str):
with Sandbox(timeout=120) as sb:
messages = [{'role': 'user', 'content': user_question}]
for _ in range(5): # max 5 turns
resp = client.chat.completions.create(
model='gpt-4o', messages=messages,
tools=[{'type': 'function', 'function': {
'name': 'run_python',
'description': 'Execute Python in a secure sandbox',
'parameters': {'type': 'object',
'properties': {'code': {'type': 'string'}},
'required': ['code']}
}}]
)
msg = resp.choices[0].message
if msg.tool_calls:
code = eval(msg.tool_calls[0].function.arguments)['code']
result = sb.run_code(code)
messages.append({'role': 'tool',
'tool_call_id': msg.tool_calls[0].id,
'content': str(result.logs.stdout)})
else:
return msg.contentบริการแซนด์บ็อกซ์บนคลาวด์ทางเลือก
อีทูบีไม่ใช่ตัวเลือกเดียว ยังมีบริการแซนด์บ็อกซ์บนคลาวด์อื่น ๆ ได้แก่:
- โมดัล: แซนด์บ็อกซ์ GPU/CPU แบบไร้เซิร์ฟเวอร์ และอิมเมจด็อกเกอร์ที่กำหนดเอง
- AWS Lambda: การแยกการทำงานต่อการเรียกใช้หนึ่งครั้ง (ใช้ไฟร์แครกเกอร์อยู่เบื้องหลัง)
- ส่วนติดต่อโปรแกรมประยุกต์ตัวแปลโค้ด: แซนด์บ็อกซ์ในตัวของ OpenAI สำหรับเครื่องมือ ChatGPT
- เดย์โทนา: แซนด์บ็อกซ์สำหรับการพัฒนาที่ผสานรวมกับกิต
ตัวแปรจะเป็นอย่างไรเมื่อแซนด์บ็อกซ์อีทูบีแบบชั่วคราวออกจากตัวจัดการบริบท
การทำความเข้าใจวงจรชีวิตของแซนด์บ็อกซ์มีความสำคัญอย่างยิ่งต่อการตัดสินใจว่าจะใช้แซนด์บ็อกซ์แบบชั่วคราวหรือแบบคงอยู่ในการสนทนาของเอเจนต์ที่ทำงานหลายรอบ
สรุปแซนด์บ็อกซ์บนคลาวด์ของอีทูบี
อีทูบีมี SDK ที่เรียบง่ายสำหรับแซนด์บ็อกซ์ microVM ของไฟร์แครกเกอร์ที่ทำงานบนคลาวด์ รูปแบบสำคัญ ได้แก่ แซนด์บ็อกซ์ แบบชั่วคราวสำหรับโค้ดที่ทำงานครั้งเดียว แซนด์บ็อกซ์ แบบคงอยู่สำหรับเอเจนต์ที่ทำงานหลายรอบ การ อัปโหลด/ดาวน์โหลดไฟล์สำหรับนำข้อมูลเข้าและออก และการ เชื่อมต่อใหม่ด้วย IDสำหรับเวิร์กโฟลว์ข้ามบริการ
ควรยุติแซนด์บ็อกซ์อย่างชัดเจนเสมอ เพื่อหลีกเลี่ยงค่าบริการที่ไม่จำเป็น
คำถามที่พบบ่อย
บทเรียน “บริการแซนด์บ็อกซ์ E2B และระบบคลาวด์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “บริการแซนด์บ็อกซ์ E2B และระบบคลาวด์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “บริการแซนด์บ็อกซ์ E2B และระบบคลาวด์”
E2B SDK, Daytona และ API แซนด์บ็อกซ์ที่มีการจัดการสำหรับเอเจนต์แปลโค้ด คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “บริการแซนด์บ็อกซ์ E2B และระบบคลาวด์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม
ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- แซนด์บ็อกซ์เอเจนต์บน Docker
- การแยก VM สำหรับเอเจนต์รันโค้ดความปลอดภัยสูง
- บริการแซนด์บ็อกซ์ E2B และระบบคลาวด์
- นโยบายความปลอดภัยสำหรับการเรียกใช้โค้ด