Skip to Content

Terminal Sandbox

격리된 샌드박스 환경에서 코드를 실행하고 명령을 수행할 수 있습니다. 각 채팅방마다 독립적인 샌드박스가 생성되며, 안전하게 코드를 테스트하고 데이터를 처리할 수 있습니다.

주요 기능

  • Python, JavaScript, Go 코드 실행
  • 쉘 명령어 실행
  • 파일 생성 및 저장
  • 결과 파일 다운로드

기본 정보

인증 방식

별도의 인증이 필요하지 않습니다.

지원 범위

Terminal Sandbox는 AI Hub 채팅에서만 사용할 수 있습니다. 3rd-party MCP 클라이언트에서는 지원되지 않습니다.

샌드박스 특징

작업 디렉토리

  • 홈 디렉토리는 /workspace입니다.
  • /workspace에 생성된 파일은 세션 동안 유지됩니다.
  • /workspace 외부의 파일은 실행마다 초기화됩니다.

세션 관리

  • 채팅방별로 독립적인 샌드박스가 생성됩니다.
  • 10분 동안 요청이 없으면 샌드박스가 자동으로 초기화됩니다.
  • 세션이 유지되는 동안 파일과 데이터는 보존됩니다.

지원하는 MCP 도구

execute_code

격리된 샌드박스 환경에서 코드를 실행합니다.

지원 언어:

  • Python (3.12)
  • JavaScript (Node.js 23.11)
  • Go (1.24)

입력 파라미터:

  • code (필수): 실행할 코드
  • language (필수): 프로그래밍 언어 (python, javascript, go)
  • libraries (선택): 설치할 라이브러리 목록 (Python의 경우 pip, JavaScript의 경우 npm)
  • timeout (선택): 실행 제한 시간 (초, 기본값: 30)

반환 정보:

  • 실행 결과 (stdout)
  • 에러 메시지 (stderr)
  • 종료 코드
  • 실행 시간

execute_command

격리된 샌드박스 환경에서 쉘 명령어를 실행합니다.

입력 파라미터:

  • command (필수): 실행할 쉘 명령어
  • timeout (선택): 실행 제한 시간 (초, 기본값: 30)

반환 정보:

  • 실행 결과 (stdout)
  • 에러 메시지 (stderr)
  • 종료 코드
  • 실행 시간

upload_files

AI Hub 채팅에 업로드된 파일을 샌드박스의 /workspace/files 디렉토리로 가져옵니다.

입력 파라미터:

  • file_ids (필수): 업로드한 파일의 ID 목록

export_file

샌드박스에서 생성한 파일이나 디렉토리를 다운로드 가능한 URL로 내보냅니다.

입력 파라미터:

  • file_path (필수): 내보낼 파일 또는 디렉토리 경로 (예: /workspace/report.csv)

특징:

  • 디렉토리는 자동으로 ZIP 파일로 압축됩니다.
  • 반환된 URL은 마크다운 링크 형식으로 제공됩니다.
  • URL 유효 기간은 10분입니다.

사용 예시

Python으로 데이터 분석

사용자 입력:

다음 제품 데이터를 pandas로 분석하고 CSV 파일로 저장해줘: - Laptop: 가격 1200달러, 재고 15개 - Mouse: 가격 25달러, 재고 50개 - Keyboard: 가격 75달러, 재고 30개 - Monitor: 가격 350달러, 재고 20개 평균 가격과 총 재고 가치도 계산해줘.

LLM이 execute_code 도구를 사용하여 다음과 유사한 코드를 생성하고 실행합니다:

import pandas as pd # 데이터 생성 data = { 'Product': ['Laptop', 'Mouse', 'Keyboard', 'Monitor'], 'Price': [1200, 25, 75, 350], 'Stock': [15, 50, 30, 20] } df = pd.DataFrame(data) # 분석 수행 print(f"평균 가격: ${df['Price'].mean():.2f}") print(f"재고 가치: ${(df['Price'] * df['Stock']).sum():,}") # CSV로 저장 df.to_csv('/workspace/products.csv', index=False) print("\nCSV 파일이 생성되었습니다.")

그 다음 export_file 도구로 생성된 CSV 파일을 다운로드 링크로 제공합니다.

JavaScript로 JSON 처리

사용자 입력:

다음 사용자 데이터에서 active가 true인 사용자만 필터링해서 JSON 파일로 저장해줘: - Alice (ID: 1, active: true) - Bob (ID: 2, active: false) - Charlie (ID: 3, active: true)

LLM이 execute_code 도구를 사용하여 다음과 유사한 코드를 생성하고 실행합니다:

const fs = require('fs'); // 사용자 데이터 const users = [ { id: 1, name: 'Alice', active: true }, { id: 2, name: 'Bob', active: false }, { id: 3, name: 'Charlie', active: true } ]; // 활성 사용자만 필터링 const activeUsers = users.filter(user => user.active); // 파일로 저장 fs.writeFileSync( '/workspace/active_users.json', JSON.stringify(activeUsers, null, 2) ); console.log(`활성 사용자 ${activeUsers.length}명 저장 완료`);

쉘 명령어로 텍스트 파일 분석

사용자 입력:

/workspace/server.log 파일을 만들고 다음 내용을 추가해줘: 2025-12-02 10:15:23 INFO Server started 2025-12-02 10:16:45 ERROR Database connection failed 2025-12-02 10:17:12 INFO Request processed 2025-12-02 10:18:33 ERROR Timeout exception 2025-12-02 10:19:01 INFO User logged in 그리고 ERROR가 포함된 라인만 추출해서 errors.txt로 저장해줘.

LLM이 execute_command 도구를 사용하여 다음과 유사한 명령을 실행합니다:

# 로그 파일 생성 cat > /workspace/server.log << 'EOF' 2025-12-02 10:15:23 INFO Server started 2025-12-02 10:16:45 ERROR Database connection failed 2025-12-02 10:17:12 INFO Request processed 2025-12-02 10:18:33 ERROR Timeout exception 2025-12-02 10:19:01 INFO User logged in EOF # ERROR 포함 라인 추출 grep "ERROR" /workspace/server.log > /workspace/errors.txt # 결과 확인 cat /workspace/errors.txt

여러 언어 조합 사용

사용자 입력:

프로젝트 진행률을 계산해줘. 전체 1000건 중 850건이 완료됐어. Python으로 데이터를 JSON으로 저장하고, Go로 완료율을 계산해서 리포트 파일로 만들어줘.

LLM이 다음과 유사한 방식으로 단계별 실행을 진행합니다:

1단계: Python으로 데이터 저장

import json data = {'total': 1000, 'completed': 850} with open('/workspace/data.json', 'w') as f: json.dump(data, f) print(f"데이터 저장 완료: {data}")

2단계: Go로 리포트 생성

package main import ( "encoding/json" "fmt" "os" ) func main() { // JSON 파일 읽기 data, _ := os.ReadFile("/workspace/data.json") var result map[string]int json.Unmarshal(data, &result) // 완료율 계산 percentage := float64(result["completed"]) / float64(result["total"]) * 100 report := fmt.Sprintf("프로젝트 진행률\n전체: %d\n완료: %d\n완료율: %.1f%%\n", result["total"], result["completed"], percentage) // 리포트 파일 저장 os.WriteFile("/workspace/report.txt", []byte(report), 0644) fmt.Print(report) }

주의사항

보안

  • 샌드박스는 격리된 환경이지만, 민감한 데이터 처리 시 주의하세요.
  • API 키나 비밀번호를 코드에 직접 작성하지 마세요.

세션 관리

  • 10분 동안 요청이 없으면 샌드박스가 초기화되어 모든 파일이 삭제됩니다.
  • 중요한 결과물은 export_file 도구로 다운로드하세요.

리소스 제한

  • 샌드박스는 제한된 CPU와 메모리를 사용합니다.
  • 대용량 데이터 처리나 장시간 실행되는 작업은 제한될 수 있습니다.

파일 저장 위치

  • 반드시 /workspace 디렉토리에 파일을 저장하세요.
  • 다른 위치의 파일은 실행 후 사라질 수 있습니다.

네트워크 제한

  • 외부 네트워크 접근은 라이브러리 설치 목적으로만 제한적으로 허용됩니다.
  • Python: pypi.org, files.pythonhosted.org
  • JavaScript: registry.npmjs.org, nodejs.org
  • Go: proxy.golang.org, sum.golang.org, index.golang.org
  • API 호출, 웹 스크래핑 등 외부 서비스 접근은 불가능합니다.

라이브러리 설치

  • Python: pandas, numpy, requests 등 일반적인 라이브러리 설치 가능
  • 일부 시스템 의존성이 필요한 라이브러리는 설치되지 않을 수 있습니다. (예: matplotlib)
  • JavaScript: npm 패키지 설치 가능하나 네이티브 모듈은 제한될 수 있음
Last updated on