diff --git a/docs/source/ko/_toctree.yml b/docs/source/ko/_toctree.yml
index ddd73e71b..31741b4b5 100644
--- a/docs/source/ko/_toctree.yml
+++ b/docs/source/ko/_toctree.yml
@@ -14,8 +14,8 @@
# title: ๐ Inspect your agent runs using telemetry
# - local: tutorials/tools
# title: ๐ ๏ธ Tools - in-depth guide
-# - local: tutorials/secure_code_execution
-# title: ๐ก๏ธ Secure code execution
+ - local: tutorials/secure_code_execution
+ title: ๐ก๏ธ ์์ ํ ์ฝ๋ ์คํ
- local: tutorials/memory
title: ๐ ์์ด์ ํธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
- title: Conceptual guides
diff --git a/docs/source/ko/tutorials/secure_code_execution.md b/docs/source/ko/tutorials/secure_code_execution.md
new file mode 100644
index 000000000..5bd07c948
--- /dev/null
+++ b/docs/source/ko/tutorials/secure_code_execution.md
@@ -0,0 +1,470 @@
+# ์์ ํ ์ฝ๋ ์คํ[[secure-code-execution]]
+
+[[open-in-colab]]
+
+> [!TIP]
+> ์์ด์ ํธ ๋น๋์ ์ต์ํ์ง ์์ผ์๋ค๋ฉด, ๋จผ์ [์์ด์ ํธ ์๊ฐ](../conceptual_guides/intro_agents)์ [smolagents ๊ฐ์ด๋ ํฌ์ด](../guided_tour)๋ฅผ ์ฝ์ด๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
+
+### ์ฝ๋ ์์ด์ ํธ[[code-agents]]
+
+[์ฌ๋ฌ](https://huggingface.co/papers/2402.01030) [์ฐ๊ตฌ](https://huggingface.co/papers/2411.01747) [๋
ผ๋ฌธ](https://huggingface.co/papers/2401.00812)์ ๋ฐ๋ฅด๋ฉด, LLM์ด ์์ ์ ํ๋(๋๊ตฌ ํธ์ถ)์ ์ฝ๋๋ก ์์ฑํ๊ฒ ํ๋ ๊ฒ์ด ํ์ฌ์ ํ์ค ๋๊ตฌ ํธ์ถ ํ์๋ณด๋ค ํจ์ฌ ๋ ํจ๊ณผ์ ์ด๋ผ๊ณ ํฉ๋๋ค. ํ์ฌ ์
๊ณ ํ์ค์ โ๋๊ตฌ ์ด๋ฆ๊ณผ ์ฌ์ฉํ ์ธ์๋ฅผ JSON ํํ๋ก ๊ธฐ์ ํ๋โ ๋ค์ํ ๋ณํ ๋ฐฉ์์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.
+
+์ ์ฝ๋๊ฐ ๋ ๋์๊น์? ์ฐ๋ฆฌ๋ ์ปดํจํฐ๊ฐ ์ํํ๋ ์์
์ ์ ํํํ๊ธฐ ์ํด ํน๋ณํ ์ฝ๋ ์ธ์ด๋ฅผ ๋ง๋ค์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ง์ฝ JSON ์ค๋ํซ์ด ๋ ๋์ ๋ฐฉ๋ฒ์ด์๋ค๋ฉด, ์ด ํจํค์ง๋ JSON์ผ๋ก ์์ฑ๋์ ๊ฒ์ด๊ณ , ์๋ง ์
๋ง๊ฐ ์ฐ๋ฆฌ๋ฅผ ๋น์์์ ๊ฒ๋๋ค.
+
+์ฝ๋๋ ์ปดํจํฐ์์์ ์์
์ ํํํ๋ ๋ ๋์ ๋ฐฉ๋ฒ์ผ ๋ฟ์
๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ด ์์ต๋๋ค.
+- **๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ:** ํ์ด์ฌ ํจ์๋ฅผ ์ ์ํ๋ ๊ฒ์ฒ๋ผ JSON ์์
์ ์ค์ฒฉํ๊ฑฐ๋ ๋์ค์ ์ฌ์ฌ์ฉํ JSON ์์
์ธํธ๋ฅผ ์ ์ํ ์ ์์๊น์?
+- **๊ฐ์ฒด ๊ด๋ฆฌ:** `generate_image`์ ๊ฐ์ ์์
์ ์ถ๋ ฅ์ JSON์ ์ด๋ป๊ฒ ์ ์ฅํ ์ ์์๊น์?
+- **์ผ๋ฐ์ฑ:** ์ฝ๋๋ ์ปดํจํฐ๊ฐ ํ ์ ์๋ ๋ชจ๋ ๊ฒ์ ๊ฐ๋จํ๊ฒ ํํํ๋๋ก ๋ง๋ค์ด์ก์ต๋๋ค.
+- **LLM ํ๋ จ ์ฝํผ์ค์์์ ํํ:** LLM ํ๋ จ ์ฝํผ์ค์ ์ด๋ฏธ ์๋ง์ ์์ง์ ์์
์ด ํฌํจ๋์ด ์๋ค๋ ํ๋์ ์ถ๋ณต์ ํ์ฉํ์ง ์์ ์ด์ ๊ฐ ์์๊น์?
+
+์ด๋ [Executable Code Actions Elicit Better LLM Agents](https://huggingface.co/papers/2402.01030)์์ ๊ฐ์ ธ์จ ์๋ ๊ทธ๋ฆผ์ ์ ๋ํ๋ ์์ต๋๋ค.
+
+
+
+์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ฝ๋ ์์ด์ ํธ(์ด ๊ฒฝ์ฐ์๋ ํ์ด์ฌ ์์ด์ ํธ)๋ฅผ ์ ์ํ๋ ๋ฐ ์ค์ ์ ๋๋ ์ด์ ์
๋๋ค. ์ด๋ ๊ณง ์์ ํ ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํด ๋ ๋ง์ ๋
ธ๋ ฅ์ด ํ์ํจ์ ์๋ฏธํ์ต๋๋ค.
+
+### ๋ก์ปฌ ์ฝ๋ ์คํ??[[local-code-execution]]
+
+๊ธฐ๋ณธ์ ์ผ๋ก `CodeAgent`๋ LLM์ด ์์ฑํ ์ฝ๋๋ฅผ ์ฌ์ฉ์์ ํ๊ฒฝ์์ ์คํํฉ๋๋ค.
+
+์ด๋ ๋ณธ์ง์ ์ผ๋ก ์ํํ๋ฉฐ, LLM์ด ์์ฑํ ์ฝ๋๋ ์ฌ์ฉ์์ ํ๊ฒฝ์ ์์์ํฌ ์ ์์ต๋๋ค.
+
+์
์ฑ ์ฝ๋ ์คํ์ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๋ฐ์ํ ์ ์์ต๋๋ค.
+- **๋จ์ LLM ์ค๋ฅ:** LLM์ ์์ง ์๋ฒฝํ์ง ์์ผ๋ฉฐ ๋์์ ์ฃผ๋ ค๋ ๊ณผ์ ์์ ์๋์น ์๊ฒ ํด๋ก์ด ๋ช
๋ น์ด๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ํ์ ๋ฎ์ง๋ง LLM์ด ์ ์ฌ์ ์ผ๋ก ์ํํ ์ฝ๋๋ฅผ ์คํํ๋ ค ์๋ํ ์ฌ๋ก๊ฐ ์ค์ ๋ก ๊ด์ฐฐ๋ ๋ฐ ์์ต๋๋ค.
+- **๊ณต๊ธ๋ง ๊ณต๊ฒฉ:** ์ ๋ขฐํ ์ ์๊ฑฐ๋ ์์๋ LLM์ ์คํํ๋ฉด ์์คํ
์ด ์ ํดํ ์ฝ๋ ์์ฑ์ ๋
ธ์ถ๋ ์ ์์ต๋๋ค. ์์ ํ ์ถ๋ก ์ธํ๋ผ์์ ์ ์๋ ค์ง ๋ชจ๋ธ์ ์ฌ์ฉํ ๋ ์ด ์ํ์ ๋งค์ฐ ๋ฎ์ง๋ง, ์ด๋ก ์ ์ธ ๊ฐ๋ฅ์ฑ์ ๋จ์ ์์ต๋๋ค.
+- **ํ๋กฌํํธ ์ธ์ ์
:** ์น์ ํ์ํ๋ ์์ด์ ํธ๊ฐ ์ ํดํ ์ง์นจ์ด ํฌํจ๋ ์
์ฑ ์น์ฌ์ดํธ์ ๋๋ฌํด ์์ด์ ํธ์ ๋ฉ๋ชจ๋ฆฌ์ ๊ณต๊ฒฉ์ ์ฃผ์
ํ ์ ์์ต๋๋ค.
+- **๊ณต๊ฐ์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ ์์ด์ ํธ ์
์ฉ:** ๋์ค์๊ฒ ๋
ธ์ถ๋ ์์ด์ ํธ๋ ์
์์ ์ธ ํ์์์ ์ํด ์
์ฉ๋์ด ์ ํดํ ์ฝ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๊ณต๊ฒฉ์๋ ์์ด์ ํธ์ ์คํ ๋ฅ๋ ฅ์ ์
์ฉํ๊ธฐ ์ํด ์ ๋์ ์ธ ์
๋ ฅ์ ๋ง๋ค์ด ์๋ํ์ง ์์ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
+์
์ฑ ์ฝ๋๊ฐ ์ฐ๋ฐ์ ์ด๋ ์๋์ ์ด๋ ์คํ๋๋ฉด ํ์ผ ์์คํ
์ด ์์๋๊ณ , ๋ก์ปฌ ๋๋ ํด๋ผ์ฐ๋ ๋ฆฌ์์ค๊ฐ ์
์ฉ๋๋ฉฐ, API ์๋น์ค๊ฐ ๋จ์ฉ๋๊ณ , ์ฌ์ง์ด ๋คํธ์ํฌ ๋ณด์๊น์ง ์ํ๋ฐ์ ์ ์์ต๋๋ค.
+
+[์์ด์ ์ ์คํํธ๋ผ](../conceptual_guides/intro_agents)์์ ์ฝ๋ ์์ด์ ํธ๋ ๋ค๋ฅธ ๋ ์์ด์ ํธ์ ์ธ ์ค์ ์ ๋นํด ์์คํ
๋ด์์ LLM์๊ฒ ํจ์ฌ ๋ ๋์ ์์ค์ ์์ด์ ์๋ฅผ ๋ถ์ฌํ๋ค๊ณ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ณง ๋ ๋์ ์์ค์ ์ํ์ ์๋ฐํฉ๋๋ค.
+
+๋ฐ๋ผ์ ๋ณด์์ ๊ฐ๋ณํ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
+
+๋ ๊ฐ๋ ฅํ ๋ณด์์ ์ํด, ์ค์ ๋น์ฉ์ ๋ค์ ๋์ง๋ง ๋ณด๋ค ๋์ ์์ค์ ๋ณดํธ๋ฅผ ์ ๊ณตํ๋ ๋ค์ํ ์กฐ์น๋ฅผ ์ ์ํฉ๋๋ค.
+
+์ด๋ค ํด๊ฒฐ์ฑ
๋ 100% ์์ ํ์ง ์๋ค๋ ์ ์ ๋ช
์ฌํ์๊ธฐ ๋ฐ๋๋๋ค.
+
+
+
+### ๋ก์ปฌ ํ์ด์ฌ ์คํ๊ธฐ[[our-local-python-executor]]
+
+์ฒซ ๋ฒ์งธ ๋ณด์ ๊ณ์ธต์ ์ถ๊ฐํ๊ธฐ ์ํด, ์ผ๋ฐ ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ์์ `smolagents`์ ์ฝ๋ ์คํ๊ฐ ์คํ๋์ง ์์ต๋๋ค.
+์ฐ๋ฆฌ๋ ๋ ์์ ํ `LocalPythonExecutor`๋ฅผ ์ฒ์๋ถํฐ ๋ค์ ๊ตฌ์ถํ์ต๋๋ค.
+
+์ ํํ ๋งํ๋ฉด, ์ด ์ธํฐํ๋ฆฌํฐ๋ ์ฝ๋์์ ์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ(AST)๋ฅผ ๊ฐ์ ธ์์ ์ด๋ฅผ ์ฐ์ฐ ๋จ์๋ก ์คํํ๋ฉฐ ํญ์ ํน์ ๊ท์น์ ๋ฐ๋ฅด๋๋ก ํฉ๋๋ค
+- ๊ธฐ๋ณธ์ ์ผ๋ก, ์ฌ์ฉ์๊ฐ ์น์ธ ๋ชฉ๋ก์ ๋ช
์์ ์ผ๋ก ์ถ๊ฐํ์ง ์๋ ํ import๋ ํ์ฉ๋์ง ์์ต๋๋ค.
+- ๋ํ, ํ์ ๋ชจ๋์ ๋ํ ์ ๊ทผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด ์์ผ๋ฉฐ, ๊ฐ ํ์ ๋ชจ๋๋ import ๋ชฉ๋ก์์ ๋ช
์์ ์ผ๋ก ์น์ธ๋์ด์ผ ํฉ๋๋ค. ๋๋ ์๋ฅผ ๋ค์ด `numpy.*`๋ฅผ ์ ๋ฌํ์ฌ `numpy`์ `numpy.random` ๋๋ `numpy.a.b`์ ๊ฐ์ ๋ชจ๋ ํ์ ํจํค์ง๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
+ - `random`๊ณผ ๊ฐ์ด ๊ฒ๋ณด๊ธฐ์ ๋ฌดํดํด ๋ณด์ด๋ ์ผ๋ถ ํจํค์ง๋ `random._os`์์์ฒ๋ผ ์ ์ฌ์ ์ผ๋ก ์ ํดํ ํ์ ๋ชจ๋์ ๋ํ ์ ๊ทผ์ ํ์ฉํ ์ ์๋ค๋ ์ ์ ์ ์ํ์ธ์.
+- ์ฒ๋ฆฌ๋๋ ๊ธฐ๋ณธ ์ฐ์ฐ์ ์ด ํ์๋ ๋ฌดํ ๋ฃจํ์ ๋ฆฌ์์ค ํฝ์ฐฝ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ํ๋ฉ๋๋ค.
+- ์ฌ์ฉ์ ์ ์ ์ธํฐํ๋ฆฌํฐ์ ๋ช
์์ ์ผ๋ก ์ ์๋์ง ์์ ๋ชจ๋ ์ฐ์ฐ์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.
+
+๋ค์๊ณผ ๊ฐ์ด ์ด๋ฌํ ์์ ์ฅ์น๋ฅผ ์ํํด ๋ณผ ์ ์์ต๋๋ค.
+
+```py
+from smolagents.local_python_executor import LocalPythonExecutor
+
+# ์ฌ์ฉ์ ์ ์ ์คํ๊ธฐ ์ค์ , "numpy" ํจํค์ง ์น์ธ
+custom_executor = LocalPythonExecutor(["numpy"])
+
+# ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๊ฐ๋
์ฑ์ด ์ข๊ฒ ์ถ๋ ฅํ๋ ์ ํธ๋ฆฌํฐ
+def run_capture_exception(command: str):
+ try:
+ custom_executor(harmful_command)
+ except Exception as e:
+ print("ERROR:\n", e)
+
+# ์ ์๋์ง ์์ ๋ช
๋ น์ด๋ ์๋ํ์ง ์์
+harmful_command="!echo Bad command"
+run_capture_exception(harmful_command)
+# >>> ERROR: invalid syntax (, line 1)
+
+
+# os์ ๊ฐ์ import๋ `additional_authorized_imports`์ ๋ช
์์ ์ผ๋ก ์ถ๊ฐ๋์ง ์๋ ํ ์ํ๋์ง ์์
+harmful_command="import os; exit_code = os.system('echo Bad command')"
+run_capture_exception(harmful_command)
+# >>> ERROR: Code execution failed at line 'import os' due to: InterpreterError: Import of os is not allowed. Authorized imports are: ['statistics', 'numpy', 'itertools', 'time', 'queue', 'collections', 'math', 'random', 're', 'datetime', 'stat', 'unicodedata']
+
+# ์น์ธ๋ import์์๋ ์ ์ฌ์ ์ผ๋ก ์ ํดํ ํจํค์ง๋ import๋์ง ์์
+harmful_command="import random; random._os.system('echo Bad command')"
+run_capture_exception(harmful_command)
+# >>> ERROR: Code execution failed at line 'random._os.system('echo Bad command')' due to: InterpreterError: Forbidden access to module: os
+
+# ๋ฌดํ ๋ฃจํ๋ N๋ฒ์ ์ฐ์ฐ ํ ์ค๋จ๋จ
+harmful_command="""
+while True:
+ pass
+"""
+run_capture_exception(harmful_command)
+# >>> ERROR: Code execution failed at line 'while True: pass' due to: InterpreterError: Maximum number of 1000000 iterations in While loop exceeded
+```
+
+์ด๋ฌํ ์์ ์ฅ์น ๋๋ถ์ ์ธํฐํ๋ฆฌํฐ๋ ๋ ์์ ํ๊ฒ ์คํํ ์ ์์ต๋๋ค.
+๋ค์ํ ์ฌ์ฉ ์ฌ๋ก์์ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์ง๋ง ์ฌ์ฉ์ ํ๊ฒฝ์ ์ด๋ ํ ์์๋ ๊ด์ฐฐ๋์ง ์์์ต๋๋ค.
+
+> [!WARNING]
+> ๋ก์ปฌ ํ์ด์ฌ ์๋๋ฐ์ค ํ๊ฒฝ์ ๋ณธ์ง์ ์ผ๋ก ์์ ํ ์์ ์ฑ์ ๋ณด์ฅํ ์ ์๋ค๋ ์ ์ ์ธ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ ํฌ ์ธํฐํ๋ฆฌํฐ๋ ํ์ค ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ๋ณด๋ค ์์ ์ฑ์ด ํฌ๊ฒ ํฅ์๋์์ง๋ง, ์์ง๊ฐ ํ๊ณ ํ ๊ณต๊ฒฉ์๋ ์
์์ ์ผ๋ก ๋ฏธ์ธ ์กฐ์ ๋ LLM์ด ์ทจ์ฝ์ ์ ์ฐพ์ ์ฌ์ฉ์ ํ๊ฒฝ์ ํผํด๋ฅผ ์ค ๊ฐ๋ฅ์ฑ์ ์ฌ์ ํ ์กด์ฌํฉ๋๋ค.
+>
+> ์๋ฅผ ๋ค์ด, `Pillow`์ ๊ฐ์ ํจํค์ง๊ฐ ์ด๋ฏธ์ง๋ฅผ ์ฒ๋ฆฌํ๋๋ก ํ์ฉํ ๊ฒฝ์ฐ, LLM์ ํ๋ ๋๋ผ์ด๋ธ๋ฅผ ๊ฐ๋ ์ฑ์ธ ์์ฒ ๊ฐ์ ๋์ฉ๋ ์ด๋ฏธ์ง ํ์ผ์ ์์ฑํ๋ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ๋ค๋ฅธ ๊ณ ๊ธ ํ์ถ ๊ธฐ์ ์ ์น์ธ๋ ํจํค์ง์ ๋ ๊น์ ์ทจ์ฝ์ ์ ์
์ฉํ ์ ์์ต๋๋ค.
+>
+> LLM์ด ์์ฑํ ์ฝ๋๋ฅผ ๋ก์ปฌ ํ๊ฒฝ์์ ์คํํ๋ ๊ฒ์ ํญ์ ์ํ์ ๋ดํฌํฉ๋๋ค. ์ง์ ์ผ๋ก ๊ฐ๋ ฅํ ๋ณด์ ๊ฒฉ๋ฆฌ๋ฅผ ํตํด LLM ์์ฑ ์ฝ๋๋ฅผ ์คํํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์๋์ ์์ธํ ์ค๋ช
๋ E2B๋ Docker์ ๊ฐ์ ์๊ฒฉ ์คํ ์ต์
์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
+
+์ ๋ขฐํ ์ ์๋ ์ถ๋ก ์ ๊ณต์
์ฒด์ ์ ์๋ ค์ง LLM์ ์ฌ์ฉํ ๋ ์
์์ ์ธ ๊ณต๊ฒฉ์ ์ํ์ ๋ฎ์ง๋ง 0์ ์๋๋๋ค.
+๋ณด์ ์์ค์ด ๋์ ์ ํ๋ฆฌ์ผ์ด์
์ด๋ ์ ๋ขฐ๋๊ฐ ๋ฎ์ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์๊ฒฉ ์คํ ์๋๋ฐ์ค ์ฌ์ฉ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
+
+## ์์ ํ ์ฝ๋ ์คํ์ ์ํ ์๋๋ฐ์ค ์ ๊ทผ ๋ฐฉ์[[sandbox-approaches-for-secure-code-execution]]
+
+์ฝ๋๋ฅผ ์คํํ๋ AI ์์ด์ ํธ๋ก ์์
ํ ๋ ๋ณด์์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. smolagents์์ ์ฝ๋ ์คํ์ ์๋๋ฐ์ฑํ๋ ๋ฐ์๋ ๋ ๊ฐ์ง ์ฃผ์ ์ ๊ทผ ๋ฐฉ์์ด ์์ผ๋ฉฐ, ๊ฐ๊ฐ ๋ค๋ฅธ ๋ณด์ ์์ฑ๊ณผ ๊ธฐ๋ฅ์ ๊ฐ์ง๋๋ค:
+
+
+
+
+1. **๊ฐ๋ณ ์ฝ๋ ์ค๋ํซ์ ์๋๋ฐ์ค์์ ์คํ**: ์ด ์ ๊ทผ ๋ฐฉ์(๋ค์ด์ด๊ทธ๋จ ์ผ์ชฝ)์ ์์ด์ ํธ๊ฐ ์์ฑํ ํ์ด์ฌ ์ฝ๋ ์ค๋ํซ๋ง ์๋๋ฐ์ค์์ ์คํํ๊ณ ๋๋จธ์ง ์์ด์ ํธ ์์คํ
์ ๋ก์ปฌ ํ๊ฒฝ์ ์ ์งํฉ๋๋ค. `executor_type="e2b"`, `executor_type="modal"` ๋๋
+`executor_type="docker"`๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ํ๊ธฐ๊ฐ ๋ ๊ฐ๋จํ์ง๋ง, ๋ค์ค ์์ด์ ํธ๋ฅผ ์ง์ํ์ง ์์ผ๋ฉฐ ์ฌ์ ํ ํ๊ฒฝ๊ณผ ์๋๋ฐ์ค ๊ฐ์ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค.
+
+2. **์ ์ฒด ์์ด์ ํธ ์์คํ
์ ์๋๋ฐ์ค์์ ์คํ**: ์ด ์ ๊ทผ ๋ฐฉ์(๋ค์ด์ด๊ทธ๋จ ์ค๋ฅธ์ชฝ)์ ์์ด์ ํธ, ๋ชจ๋ธ, ๋๊ตฌ๋ฅผ ํฌํจํ ์ ์ฒด ์์ด์ ํธ ์์คํ
์ ์๋๋ฐ์ค ํ๊ฒฝ ๋ด์์ ์คํํฉ๋๋ค. ์ด๋ ๋ ๋์ ๊ฒฉ๋ฆฌ๋ฅผ ์ ๊ณตํ์ง๋ง ๋ ๋ง์ ์๋ ์ค์ ์ด ํ์ํ๋ฉฐ, ๋ฏผ๊ฐํ ์๊ฒฉ ์ฆ๋ช
(API ํค ๋ฑ)์ ์๋๋ฐ์ค ํ๊ฒฝ์ผ๋ก ์ ๋ฌํด์ผ ํ ์ ์์ต๋๋ค.
+
+์ด ๊ฐ์ด๋์์๋ ์์ด์ ํธ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํด ๋ ๊ฐ์ง ์ ํ์ ์๋๋ฐ์ค ์ ๊ทผ ๋ฐฉ์์ ์ค์ ํ๊ณ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํฉ๋๋ค.
+
+### E2B ์ค์ [[e2b-setup]]
+
+#### ์ค์น[[installation]]
+
+1. [e2b.dev](https://e2b.dev)์์ E2B ๊ณ์ ์ ์์ฑํฉ๋๋ค.
+2. ํ์ํ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค:
+```bash
+pip install 'smolagents[e2b]'
+```
+
+#### E2B์์ ์์ด์ ํธ ์คํํ๊ธฐ: ๋น ๋ฅธ ์์[[running-your-agent-in-e2b-quick-start]]
+
+E2B ์๋๋ฐ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์์ด์ ํธ ์ด๊ธฐํ์ `executor_type="e2b"`๋ฅผ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค:
+
+```py
+from smolagents import InferenceClientModel, CodeAgent
+
+with CodeAgent(model=InferenceClientModel(), tools=[], executor_type="e2b") as agent:
+ agent.run("100๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ์๋ ค์ค ์ ์๋์?")
+```
+
+> [!TIP]
+> ์์ด์ ํธ๋ฅผ ์ปจํ
์คํธ ๊ด๋ฆฌ์(`with` ๋ฌธ)๋ก ์ฌ์ฉํ๋ฉด ์์ด์ ํธ๊ฐ ์์
์ ์๋ฃํ ์งํ E2B ์๋๋ฐ์ค๊ฐ ์์ ํด์ ๋ฐ ์ ๋ฆฌ๊ฐ ์๋์ผ๋ก ์ํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
+> ๋๋ ์์ด์ ํธ์ `cleanup()` ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ํธ์ถํ ์๋ ์์ต๋๋ค.
+
+์ด ์๋ฃจ์
์ ๊ฐ `agent.run()` ์์ ์ ์์ด์ ํธ ์ํ๋ฅผ ์๋ฒ๋ก ๋ณด๋
๋๋ค.
+๊ทธ๋ฐ ๋ค์ ๋ก์ปฌ ํ๊ฒฝ์์ ๋ชจ๋ธ์ด ํธ์ถ๋์ง๋ง, ์์ฑ๋ ์ฝ๋๋ ์คํ์ ์ํด ์๋๋ฐ์ค๋ก ์ ์ก๋๊ณ ์ถ๋ ฅ๋ง ๋ฐํ๋ฉ๋๋ค.
+
+์ด๋ ์๋ ๊ทธ๋ฆผ์ ์ค๋ช
๋์ด ์์ต๋๋ค.
+
+
+
+
+
+ํ์ง๋ง [๊ด๋ฆฌํ ์์ด์ ํธ](../examples/multiagents)์ ๋ํ ๋ชจ๋ ํธ์ถ์ ๋ชจ๋ธ ํธ์ถ์ ํ์๋ก ํ๋๋ฐ, ๋น๋ฐ ์ ๋ณด๋ฅผ ์๊ฒฉ ์๋๋ฐ์ค๋ก ์ ์กํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ธ ํธ์ถ์ ์๊ฒฉ ์ฆ๋ช
์ด ๋ถ์กฑํ๊ฒ ๋ฉ๋๋ค.
+๋ฐ๋ผ์ ์ด ์๋ฃจ์
์ ๋ ๋ณต์กํ ๋ค์ค ์์ด์ ํธ ์ค์ ์์๋ ์์ง ์๋ํ์ง ์์ต๋๋ค.
+
+#### E2B์์ ์์ด์ ํธ ์คํํ๊ธฐ: ๋ค์ค ์์ด์ ํธ[[running-your-agent-in-e2b-multi-agents]]
+
+E2B ์๋๋ฐ์ค์์ ๋ค์ค ์์ด์ ํธ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด E2B ๋ด์์ ์์ด์ ํธ๋ฅผ ์์ ํ ์คํํด์ผ ํฉ๋๋ค.
+
+๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
+
+```python
+from e2b_code_interpreter import Sandbox
+import os
+
+# ์๋๋ฐ์ค ์์ฑ
+sandbox = Sandbox()
+
+# ํ์ํ ํจํค์ง ์ค์น
+sandbox.commands.run("pip install smolagents")
+
+def run_code_raise_errors(sandbox, code: str, verbose: bool = False) -> str:
+ execution = sandbox.run_code(
+ code,
+ envs={'HF_TOKEN': os.getenv('HF_TOKEN')}
+ )
+ if execution.error:
+ execution_logs = "\n".join([str(log) for log in execution.logs.stdout])
+ logs = execution_logs
+ logs += execution.error.traceback
+ raise ValueError(logs)
+ return "\n".join([str(log) for log in execution.logs.stdout])
+
+# ์์ด์ ํธ ์ ํ๋ฆฌ์ผ์ด์
์ ์
+agent_code = """
+import os
+from smolagents import CodeAgent, InferenceClientModel
+
+# ์์ด์ ํธ ์ด๊ธฐํ
+agent = CodeAgent(
+ model=InferenceClientModel(token=os.getenv("HF_TOKEN"), provider="together"),
+ tools=[],
+ name="coder_agent",
+ description="์ด ์์ด์ ํธ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ ค์ด ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค."
+)
+
+manager_agent = CodeAgent(
+ model=InferenceClientModel(token=os.getenv("HF_TOKEN"), provider="together"),
+ tools=[],
+ managed_agents=[agent],
+)
+
+# ์์ด์ ํธ ์คํ
+response = manager_agent.run("20๋ฒ์งธ ํผ๋ณด๋์น ์๋ ๋ฌด์์ธ๊ฐ์?")
+print(response)
+"""
+
+# ์๋๋ฐ์ค์์ ์์ด์ ํธ ์ฝ๋ ์คํ
+execution_logs = run_code_raise_errors(sandbox, agent_code)
+print(execution_logs)
+```
+
+### Modal ์ค์ [[modal-setup]]
+
+#### ์ค์น[[installation]]
+
+1. [modal.com](https://modal.com/signup)์์ Modal ๊ณ์ ์ ์์ฑํฉ๋๋ค.
+2. ํ์ํ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค:
+```bash
+pip install 'smolagents[modal]'
+```
+
+#### Modal์์ ์์ด์ ํธ ์คํํ๊ธฐ: ๋น ๋ฅธ ์์[[running-your-agent-in-modal-quick-start]]
+
+Modal ์๋๋ฐ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์์ด์ ํธ ์ด๊ธฐํ์ `executor_type="modal"`์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค:
+
+```py
+from smolagents import InferenceClientModel, CodeAgent
+
+with CodeAgent(model=InferenceClientModel(), tools=[], executor_type="modal") as agent:
+ agent.run("42๋ฒ์งธ ํผ๋ณด๋์น ์๋ ๋ฌด์์ธ๊ฐ์?")
+```
+
+> [!TIP]
+> ์์ด์ ํธ๋ฅผ ์ปจํ
์คํธ ๊ด๋ฆฌ์(`with` ๋ฌธ)๋ก ์ฌ์ฉํ๋ฉด ์์ด์ ํธ๊ฐ ์์
์ ์๋ฃํ ์งํ Modal ์๋๋ฐ์ค๊ฐ ์ ๋ฆฌ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
+> ๋๋ ์์ด์ ํธ์ `cleanup()` ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ํธ์ถํ ์๋ ์์ต๋๋ค.
+
+`InferenceClientModel`์์ ์์ฑ๋ ์์ด์ ํธ ์ํ์ ์ฝ๋๋ Modal ์๋๋ฐ์ค๋ก ์ ์ก๋์ด ์์ ํ๊ฒ ์ฝ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค.
+
+### Docker ์ค์ [[docker-setup]]
+
+#### ์ค์น[[installation]]
+
+1. [์์คํ
์ Docker ์ค์นํ๊ธฐ](https://docs.docker.com/get-started/get-docker/)
+2. ํ์ํ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค.
+```bash
+pip install 'smolagents[docker]'
+```
+
+#### Docker์์ ์์ด์ ํธ ์คํํ๊ธฐ: ๋น ๋ฅธ ์์[[running-your-agent-in-docker-quick-start]]
+
+์์ E2B ์๋๋ฐ์ค์ ์ ์ฌํ๊ฒ, Docker๋ฅผ ๋น ๋ฅด๊ฒ ์์ํ๋ ค๋ฉด ์์ด์ ํธ ์ด๊ธฐํ์ `executor_type="docker"`๋ฅผ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
+
+```py
+from smolagents import InferenceClientModel, CodeAgent
+
+with CodeAgent(model=InferenceClientModel(), tools=[], executor_type="docker") as agent:
+ agent.run("100๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ์๋ ค์ค ์ ์๋์?")
+```
+
+> [!TIP]
+> ์์ด์ ํธ๋ฅผ ์ปจํ
์คํธ ๊ด๋ฆฌ์(`with` ๋ฌธ)๋ก ์ฌ์ฉํ๋ฉด ์์ด์ ํธ๊ฐ ์์
์ ์๋ฃํ ์งํ Docker ์ปจํ
์ด๋๊ฐ ์ ๋ฆฌ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
+> ๋๋ ์์ด์ ํธ์ `cleanup()` ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ํธ์ถํ ์๋ ์์ต๋๋ค.
+
+#### ๊ณ ๊ธ Docker ์ฌ์ฉ๋ฒ[[advanced-docker-usage]]
+
+Docker์์ ๋ค์ค ์์ด์ ํธ ์์คํ
์ ์คํํ๋ ค๋ฉด ์๋๋ฐ์ค์ ์ฌ์ฉ์ ์ ์ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
+
+Dockerfile์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
+
+```dockerfile
+FROM python:3.10-bullseye
+
+# ๋น๋ ์์กด์ฑ ์ค์น
+RUN apt-get update && \
+ apt-get install -y --no-install-recommends \
+ build-essential \
+ python3-dev && \
+ pip install --no-cache-dir --upgrade pip && \
+ pip install --no-cache-dir smolagents && \
+ apt-get clean && \
+ rm -rf /var/lib/apt/lists/*
+
+# ์์
๋๋ ํฐ๋ฆฌ ์ค์
+WORKDIR /app
+
+# ์ ํ๋ ๊ถํ์ผ๋ก ์คํ
+USER nobody
+
+# ๊ธฐ๋ณธ ๋ช
๋ น์ด
+CMD ["python", "-c", "print('Container ready')"]
+```
+
+์ฝ๋๋ฅผ ์คํํ ์๋๋ฐ์ค ๊ด๋ฆฌ์๋ฅผ ์์ฑํฉ๋๋ค.
+
+```python
+import docker
+import os
+from typing import Optional
+
+class DockerSandbox:
+ def __init__(self):
+ self.client = docker.from_env()
+ self.container = None
+
+ def create_container(self):
+ try:
+ image, build_logs = self.client.images.build(
+ path=".",
+ tag="agent-sandbox",
+ rm=True,
+ forcerm=True,
+ buildargs={},
+ # decode=True
+ )
+ except docker.errors.BuildError as e:
+ print("Build error logs:")
+ for log in e.build_log:
+ if 'stream' in log:
+ print(log['stream'].strip())
+ raise
+
+ # ๋ณด์ ์ ์ฝ ์กฐ๊ฑด๊ณผ ์ ์ ํ ๋ก๊น
์ผ๋ก ์ปจํ
์ด๋ ์์ฑ
+ self.container = self.client.containers.run(
+ "agent-sandbox",
+ command="tail -f /dev/null", # ์ปจํ
์ด๋๋ฅผ ๊ณ์ ์คํ ์ํ๋ก ์ ์ง
+ detach=True,
+ tty=True,
+ mem_limit="512m",
+ cpu_quota=50000,
+ pids_limit=100,
+ security_opt=["no-new-privileges"],
+ cap_drop=["ALL"],
+ environment={
+ "HF_TOKEN": os.getenv("HF_TOKEN")
+ },
+ )
+
+ def run_code(self, code: str) -> Optional[str]:
+ if not self.container:
+ self.create_container()
+
+ # ์ปจํ
์ด๋์์ ์ฝ๋ ์คํ
+ exec_result = self.container.exec_run(
+ cmd=["python", "-c", code],
+ user="nobody"
+ )
+
+ # ๋ชจ๋ ์ถ๋ ฅ ์์ง
+ return exec_result.output.decode() if exec_result.output else None
+
+
+ def cleanup(self):
+ if self.container:
+ try:
+ self.container.stop()
+ except docker.errors.NotFound:
+ # ์ปจํ
์ด๋๊ฐ ์ด๋ฏธ ์ ๊ฑฐ๋จ, ์์๋ ๋์
+ pass
+ except Exception as e:
+ print(f"Error during cleanup: {e}")
+ finally:
+ self.container = None # ์ฐธ์กฐ ์ ๊ฑฐ
+
+# ์ฌ์ฉ ์์:
+sandbox = DockerSandbox()
+
+try:
+ # ์์ด์ ํธ ์ฝ๋ ์ ์
+ agent_code = """
+import os
+from smolagents import CodeAgent, InferenceClientModel
+
+# ์์ด์ ํธ ์ด๊ธฐํ
+agent = CodeAgent(
+ model=InferenceClientModel(token=os.getenv("HF_TOKEN"), provider="together"),
+ tools=[]
+)
+
+# ์์ด์ ํธ ์คํ
+response = agent.run("20๋ฒ์งธ ํผ๋ณด๋์น ์๋ ๋ฌด์์ธ๊ฐ์?")
+print(response)
+"""
+
+ # ์๋๋ฐ์ค์์ ์ฝ๋ ์คํ
+ output = sandbox.run_code(agent_code)
+ print(output)
+
+finally:
+ sandbox.cleanup()
+```
+
+### WebAssembly ์ค์ [[webassembly-setup]]
+
+WebAssembly(Wasm)๋ ์ฝ๋๋ฅผ ์์ ํ ์๋๋ฐ์ค ํ๊ฒฝ์์ ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฐ์ด๋๋ฆฌ ๋ช
๋ น์ด ํ์์
๋๋ค.
+๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ฉฐ ์์ ํ๊ฒ ์ค๊ณ๋์ด ์ ์ฌ์ ์ผ๋ก ์ ๋ขฐํ ์ ์๋ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ์ ํ์
๋๋ค.
+
+`WasmExecutor`๋ [Pyodide](https://pyodide.org/)์ [Deno](https://docs.deno.com/)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
+
+#### ์ค์น[[installation]]
+
+1. [์์คํ
์ Deno ์ค์นํ๊ธฐ](https://docs.deno.com/runtime/getting_started/installation/)
+
+#### WebAssembly์์ ์์ด์ ํธ ์คํํ๊ธฐ: ๋น ๋ฅธ ์์[[running-your-agent-in-webassembly-quick-start]]
+
+๋ค์๊ณผ ๊ฐ์ด ์์ด์ ํธ ์ด๊ธฐํ์ `executor_type="wasm"`์ ์ ๋ฌํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
+```py
+from smolagents import InferenceClientModel, CodeAgent
+
+agent = CodeAgent(model=InferenceClientModel(), tools=[], executor_type="wasm")
+
+agent.run("100๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ์๋ ค์ค ์ ์๋์?")
+```
+
+### ์๋๋ฐ์ค ๋ชจ๋ฒ ์ฌ๋ก[[best-practices-for-sandboxes]]
+
+์ด๋ฌํ ํต์ฌ ์ฌ๋ก๋ E2B์ Docker ์๋๋ฐ์ค ๋ชจ๋์ ์ ์ฉ๋ฉ๋๋ค.
+
+- ๋ฆฌ์์ค ๊ด๋ฆฌ
+ - ๋ฉ๋ชจ๋ฆฌ ๋ฐ CPU ์ ํ ์ค์
+ - ์คํ ์๊ฐ ์ด๊ณผ ๊ตฌํ
+ - ๋ฆฌ์์ค ์ฌ์ฉ๋ ๋ชจ๋ํฐ๋ง
+- ๋ณด์
+ - ์ต์ํ์ ๊ถํ์ผ๋ก ์คํ
+ - ๋ถํ์ํ ๋คํธ์ํฌ ์ ๊ทผ ๋นํ์ฑํ
+ - ๋น๋ฐ ์ ๋ณด์ ํ๊ฒฝ ๋ณ์ ์ฌ์ฉ
+- ํ๊ฒฝ
+ - ์์กด์ฑ์ ์ต์ํ์ผ๋ก ์ ์ง
+ - ๊ณ ์ ๋ ํจํค์ง ๋ฒ์ ์ฌ์ฉ
+ - ๊ธฐ๋ณธ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ ๊ธฐ์ ์ผ๋ก ์
๋ฐ์ดํธ
+
+- ์ ๋ฆฌ
+ - ํนํ Docker ์ปจํ
์ด๋์ ๊ฒฝ์ฐ, ๋ฆฌ์์ค๋ฅผ ์ก์๋จน๋ ๋๋กฑ๊ฑฐ๋ฆฌ๋(dangling) ์ปจํ
์ด๋๊ฐ ์๊ธฐ์ง ์๋๋ก ํญ์ ์ ์ ํ ๋ฆฌ์์ค ์ ๋ฆฌ๋ฅผ ๋ณด์ฅํด์ผ ํฉ๋๋ค.
+
+โจ ์ด๋ฌํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๊ณ ์ ์ ํ ์ ๋ฆฌ ์ ์ฐจ๋ฅผ ๊ตฌํํจ์ผ๋ก์จ, ์์ด์ ํธ๊ฐ ์๋๋ฐ์ค ํ๊ฒฝ์์ ์์ ํ๊ณ ํจ์จ์ ์ผ๋ก ์คํ๋๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค.
+
+## ๋ณด์ ์ ๊ทผ ๋ฐฉ์ ๋น๊ต[[comparing-security-approaches]]
+
+์์ ๋ค์ด์ด๊ทธ๋จ์์ ์ค๋ช
ํ๋ฏ์ด, ๋ ์๋๋ฐ์ฑ ์ ๊ทผ ๋ฐฉ์์ ์๋ก ๋ค๋ฅธ ๋ณด์์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค.
+
+### ์ ๊ทผ ๋ฐฉ์ 1: ์ฝ๋ ์ค๋ํซ๋ง ์๋๋ฐ์ค์์ ์คํ[[approach-1-running-just-the-code-snippets-in-a-sandbox]]
+- **์ฅ์ **:
+ - ๊ฐ๋จํ ํ๋ผ๋ฏธํฐ(`executor_type="e2b"` ๋๋ `executor_type="docker"`)๋ก ์ค์ ํ๊ธฐ ๋ ์ฝ์ต๋๋ค.
+ - API ํค๋ฅผ ์๋๋ฐ์ค๋ก ์ ์กํ ํ์๊ฐ ์์ต๋๋ค.
+ - ๋ก์ปฌ ํ๊ฒฝ์ ๋ ์ ๋ณดํธํฉ๋๋ค.
+- **๋จ์ **:
+ - ๋ค์ค ์์ด์ ํธ(๊ด๋ฆฌํ ์์ด์ ํธ)๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
+ - ์ฌ์ ํ ํ๊ฒฝ๊ณผ ์๋๋ฐ์ค ๊ฐ์ ์ํ๋ฅผ ์ ์กํด์ผ ํฉ๋๋ค.
+ - ํน์ ์ฝ๋ ์คํ์ ์ ํ๋ฉ๋๋ค.
+
+### ์ ๊ทผ ๋ฐฉ์ 2: ์ ์ฒด ์์ด์ ํธ ์์คํ
์ ์๋๋ฐ์ค์์ ์คํ[[approach-2-running-the-entire-agentic-system-in-a-sandbox]]
+- **์ฅ์ **:
+ - ๋ค์ค ์์ด์ ํธ๋ฅผ ์ง์ํฉ๋๋ค.
+ - ์ ์ฒด ์์ด์ ํธ ์์คํ
์ ์๋ฒฝํ๊ฒ ๊ฒฉ๋ฆฌํฉ๋๋ค.
+ - ๋ณต์กํ ์์ด์ ํธ ์ํคํ
์ฒ์ ๋ ์ ์ฐํฉ๋๋ค.
+- **๋จ์ **:
+ - ๋ ๋ง์ ์๋ ์ค์ ์ด ํ์ํฉ๋๋ค.
+ - ๋ฏผ๊ฐํ API ํค๋ฅผ ์๋๋ฐ์ค๋ก ์ ์กํด์ผ ํ ์ ์์ต๋๋ค.
+ - ๋ ๋ณต์กํ ์์
์ผ๋ก ์ธํด ์ ์ฌ์ ์ผ๋ก ๋ ๋์ ์ง์ฐ ์๊ฐ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
+
+๋ณด์ ์๊ตฌ ์ฌํญ๊ณผ ์ ํ๋ฆฌ์ผ์ด์
์ ์๊ตฌ ์ฌํญ ์ฌ์ด์์ ๊ฐ์ฅ ๊ท ํ์ด ์ ๋ง๋ ์ ๊ทผ ๋ฐฉ์์ ์ ํํ์ธ์. ๋ ๊ฐ๋จํ ์์ด์ ํธ ์ํคํ
์ฒ๋ฅผ ๊ฐ์ง ๋๋ถ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ, ์ ๊ทผ ๋ฐฉ์ 1์ด ๋ณด์๊ณผ ์ฌ์ฉ ํธ์์ฑ ์ฌ์ด์ ์ข์ ๊ท ํ์ ์ ๊ณตํฉ๋๋ค. ์์ ํ ๊ฒฉ๋ฆฌ๊ฐ ํ์ํ ๋ ๋ณต์กํ ๋ค์ค ์์ด์ ํธ ์์คํ
์ ๊ฒฝ์ฐ, ์ค์ ์ด ๋ ๋ณต์กํ์ง๋ง ์ ๊ทผ ๋ฐฉ์ 2๊ฐ ๋ ๋์ ๋ณด์์ ๋ณด์ฅํฉ๋๋ค.
\ No newline at end of file