feat: python_eval 다중파일 다운로드 루틴 가이드 — 순차수신+타임아웃 재시도+이어받기, 폴더 구조 평평하게

SO-101 워크숍 실측: 모델이 전부 한 번에 받으려다 전체가 타임아웃으로 물러나고,
GitHub 미러 구조(stls/STL/SO101/... 식)를 그대로 따와 폴더가 산만해짐.
- 순차 다운로드(파일당 requests.get timeout=15 + try/except 1회 재시도)
- 도구 timeout 60 권장, 남으면 다음 턴에서 이어받기
- 워크숍은 workshop/<프로젝트id>/stl/ 아래 평평하게, 서브폴더는 부품군 하나까지만

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
kim
2026-09-23 13:13:17 +09:00
co-authored by Claude Code
parent f89b61f15f
commit c13a688e17
2 changed files with 2 additions and 2 deletions
+1 -1
View File
@@ -1358,7 +1358,7 @@ export function createBuildTools(isOrchestrationSkillEnabled: () => boolean) {
type: 'function',
function: {
name: 'python_eval',
description: 'Execute Python code in the workspace directory. Returns stdout/stderr. Useful for math, data analysis, CSV/JSON processing, and scripting tasks. 폴더 생성(os.makedirs)은 허용됨(삭제·이름변경만 차단). 웹에서 파일 내려받기: urllib.request/requests로 raw.githubusercontent.com 등의 직접 URL에서 받고, 받은 파일 개수를 실제로 세어 보고할 것 — 기대 개수보다 적으면 성공이 아니라 실패. GitHub 저장소 파일은 추측 경로 대신 GitHub API로 먼저 확인: https://api.github.com/repos/{owner}/{repo}/git/trees/{branch}?recursive=1',
description: 'Execute Python code in the workspace directory. Returns stdout/stderr. Useful for math, data analysis, CSV/JSON processing, and scripting tasks. 폴더 생성(os.makedirs)은 허용됨(삭제·이름변경만 차단). 웹에서 파일 내려받기: urllib.request/requests로 raw.githubusercontent.com 등의 직접 URL에서 받고, 받은 파일 개수를 실제로 세어 보고할 것 — 기대 개수보다 적으면 성공이 아니라 실패. GitHub 저장소 파일은 추측 경로 대신 GitHub API로 먼저 확인: https://api.github.com/repos/{owner}/{repo}/git/trees/{branch}?recursive=1. 여러 파일 받기 루틴: 한꺼번에 몰아서 하지 말고 순차(파일 하나씩 requests.get(url, timeout=15)) + try/except로 타임아웃/연결오류를 잡아 파일당 1회 재시도, 도구 timeout은 60으로 올릴 것. 그래도 남은 파일은 다음 턴(또는 다음 호출)에서 이어받을 것 — 전부 한 번에 받으려다 전체가 타임아웃으로 물러나는 패턴이 실측됨. 폴더 구조: GitHub 저장소 미러를 그대로 따오지 말 것 — 워크숍 프로젝트는 workshop/<프로젝트id>/stl/ 아래 평평하게 저장하고, 굳이 나눈다면 부품군(예: Leader/Follower) 서브폴더 하나까지만.',
parameters: {
type: 'object', required: ['code'],
properties: {
+1 -1
View File
@@ -34,7 +34,7 @@ const BLOCKED: RegExp[] = [
export const pythonEvalTool = {
name: 'python_eval',
description: 'Execute Python code and return stdout/stderr. Runs in the workspace directory. Useful for math, data analysis, CSV/JSON processing, and scripting tasks. Standard library and installed packages (numpy, pandas, etc.) are available. 폴더 생성(os.makedirs)은 허용됨(삭제·이름변경만 차단). 웹에서 파일 내려받기: urllib.request/requests로 raw.githubusercontent.com 등의 직접 URL에서 받고, 받은 파일 개수를 실제로 세어 보고할 것 — 기대 개수보다 적으면 성공이 아니라 실패. GitHub 저장소 파일은 추측 경로 대신 GitHub API로 먼저 확인: https://api.github.com/repos/{owner}/{repo}/git/trees/{branch}?recursive=1',
description: 'Execute Python code and return stdout/stderr. Runs in the workspace directory. Useful for math, data analysis, CSV/JSON processing, and scripting tasks. Standard library and installed packages (numpy, pandas, etc.) are available. 폴더 생성(os.makedirs)은 허용됨(삭제·이름변경만 차단). 웹에서 파일 내려받기: urllib.request/requests로 raw.githubusercontent.com 등의 직접 URL에서 받고, 받은 파일 개수를 실제로 세어 보고할 것 — 기대 개수보다 적으면 성공이 아니라 실패. GitHub 저장소 파일은 추측 경로 대신 GitHub API로 먼저 확인: https://api.github.com/repos/{owner}/{repo}/git/trees/{branch}?recursive=1. 여러 파일 받기 루틴: 한꺼번에 몰아서 하지 말고 순차(파일 하나씩 requests.get(url, timeout=15)) + try/except로 타임아웃/연결오류를 잡아 파일당 1회 재시도, 도구 timeout은 60으로 올릴 것. 그래도 남은 파일은 다음 턴(또는 다음 호출)에서 이어받을 것 — 전부 한 번에 받으려다 전체가 타임아웃으로 물러나는 패턴이 실측됨. 폴더 구조: GitHub 저장소 미러를 그대로 따오지 말 것 — 워크숍 프로젝트는 workshop/<프로젝트id>/stl/ 아래 평평하게 저장하고, 굳이 나눈다면 부품군(예: Leader/Follower) 서브폴더 하나까지만.',
schema: {
code: 'Python code to execute',
timeout: 'Execution timeout in seconds (default: 15, max: 60)',