{"id":678093,"date":"2026-02-05T11:04:31","date_gmt":"2026-02-05T10:04:31","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=ai&#038;p=678093"},"modified":"2026-02-05T15:00:33","modified_gmt":"2026-02-05T14:00:33","slug":"building-ai-agents-in-kotlin-part-2-a-deeper-dive-into-tools","status":"publish","type":"ai","link":"https:\/\/blog.jetbrains.com\/ko\/ai\/2026\/02\/building-ai-agents-in-kotlin-part-2-a-deeper-dive-into-tools\/","title":{"rendered":"Kotlin\uc73c\ub85c AI \uc5d0\uc774\uc804\ud2b8 \uad6c\ucd95\ud558\uae30 \u2013 2\ubd80: \ub3c4\uad6c\uc5d0 \ub300\ud55c \uc2ec\uce35 \ud0d0\uad6c"},"content":{"rendered":"<p><a href=\"https:\/\/blog.jetbrains.com\/ko\/ai\/2026\/02\/building-ai-agents-in-kotlin-part-1-a-minimal-coding-agent\/\">\uc774\uc804 \uae00<\/a>\uc5d0\uc11c\ub294 \ubaa9\ub85d\ud654, \uc77d\uae30, \uc4f0\uae30, \ud3b8\uc9d1 \uae30\ub2a5\uc744 \uac16\ucd98 \uae30\ubcf8\uc801\uc778 \ucf54\ub529 \uc5d0\uc774\uc804\ud2b8\ub97c \uc5b4\ub5bb\uac8c \uad6c\ucd95\ud558\ub294\uc9c0 \uc0b4\ud3b4\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \uc624\ub298\uc740 <a href=\"https:\/\/www.jetbrains.com\/koog\/\" target=\"_blank\" rel=\"noopener\">Koog<\/a> \ud504\ub808\uc784\uc6cc\ud06c\uc5d0\uc11c \ucd94\uac00 \ub3c4\uad6c\ub97c \ub9cc\ub4e4\uc5b4 \uc5d0\uc774\uc804\ud2b8\uc758 \uae30\ub2a5\uc744 <a href=\"https:\/\/github.com\/JetBrains\/koog\/tree\/develop\/examples\/code-agent\/step-02-add-execution-tool\" target=\"_blank\" rel=\"noopener\">\ud655\uc7a5\ud558\ub294 \ubc29\ubc95<\/a>\uc5d0 \ub300\ud574 \uc790\uc138\ud788 \uc0b4\ud3b4\ubd05\ub2c8\ub2e4. \uc77c\ub840\ub85c, <code>ExecuteShellCommandTool<\/code>\uc744 \uad6c\ucd95\ud558\uc5ec, \uc5d0\uc774\uc804\ud2b8\uac00 \ucf54\ub4dc\ub97c \uc2e4\ud589\ud558\uace0 \uc2e4\uc81c \uc5d4\uc9c0\ub2c8\uc5b4\ub9c1\uc5d0 \uc0ac\uc6a9\ub418\ub294 \ud53c\ub4dc\ubc31 \ub8e8\ud504(\ucf54\ub4dc \uc2e4\ud589, \uc2e4\ud328 \uad00\ucc30, \uc2e4\uc81c \ucd9c\ub825\uc744 \uae30\ubc18\uc73c\ub85c \ucf54\ub4dc \uac1c\uc120)\ub97c \uc885\ub8cc\ud558\ub3c4\ub85d \ud6c8\ub828\ud569\ub2c8\ub2e4.<\/p>\n<p>LLM\uc740 \ubb38\ubc95 \uc624\ub958\ub97c \ud53c\ud558\ub294 \ub370\uc5d0\ub294 \ube44\uad50\uc801 \uac15\ud558\uc9c0\ub9cc, \ud1b5\ud569 \ub2e8\uacc4\uc5d0\uc11c\ub294 \uc5b4\ub824\uc6c0\uc744 \uacaa\ub294 \uacbd\uc6b0\uac00 \ub9ce\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294 \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\uac70\ub098, import\ub97c \ub204\ub77d\ud558\uac70\ub098, \uc778\ud130\ud398\uc774\uc2a4\ub97c \ubd80\ubd84\uc801\uc73c\ub85c\ub9cc \uad6c\ud604\ud558\ub294 \uc2dd\uc785\ub2c8\ub2e4. \ucf54\ub4dc\ub97c \uc989\uc2dc \ucef4\ud30c\uc77c\ud558\uace0 \uc2e4\ud589\ud558\ub294 \uc804\ud1b5\uc801\uc778 \uc811\uadfc \ubc29\uc2dd\uc744 \ud1b5\ud574 \uc774\ub7ec\ud55c \ubb38\uc81c\ub97c \ube60\ub974\uac8c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc5ec\uae30\uc5d0 \uc57d\uac04\uc758 \ud504\ub86c\ud504\ud2b8\ub97c \ub354\ud558\uba74 LLM\uc5d0\uc11c \uc774\ub7ec\ud55c \ub3d9\uc791\uc744 \uac80\uc99d\ud558\uae30 \uc704\ud55c \uc18c\uaddc\ubaa8 \ud14c\uc2a4\ud2b8\ub97c \uc9c1\uc811 \uc2e4\ud589\ud558\ub3c4\ub85d \uc720\ub3c4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uadf8\ub807\ub2e4\uba74 \uc774\ub7f0 \ub3c4\uad6c\ub294 \uc5b4\ub5bb\uac8c \ub9cc\ub4e4 \uc218 \uc788\uc744\uae4c\uc694? \uae30\ubcf8\uc801\uc778 \ubd80\ubd84\ubd80\ud130 \uc2dc\uc791\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h2 class=\"wp-block-heading\">Koog \ub3c4\uad6c \uad6c\uc870<\/h2>\n<p>\uac00\uc7a5 \uba3c\uc800 \ucd94\uc0c1 <a href=\"https:\/\/docs.koog.ai\/class-based-tools\/\" target=\"_blank\" rel=\"noopener\">\ud074\ub798\uc2a4<\/a>\uc778 <code>ai.koog.agents.core.tools.Tool<\/code>\uc744 \uc0c1\uc18d\ud558\uc5ec \uad6c\ud604\uc744 \uc2dc\uc791\ud569\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ub3c4\uad6c \uac1c\ubc1c\uc5d0 \ud544\uc694\ud55c \ud575\uc2ec \uc694\uc18c\ub97c \ub2e4\uc74c\uacfc \uac19\uc774 \uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<ol>\n<li><strong>\uc774\ub984<\/strong>: \uc800\ud76c \ud300\uc740 \uc774\ub984 \uc55e\ub4a4\uc5d0 \ubc11\uc904\uc744 \ub450 \uac1c \ubd99\uc774\ub294 <code>snake_casing<\/code> \uaddc\uce59\uc744 \ub530\ub985\ub2c8\ub2e4. \ubb3c\ub860 \uc774\ub294 \uac1c\uc778\uc801\uc778 \ucde8\ud5a5\uc758 \ubb38\uc81c\uc785\ub2c8\ub2e4.<\/li>\n<li><strong>\uc124\uba85<\/strong>: \uc774 \ud544\ub4dc\ub294 LLM\uc744 \uc704\ud55c \uc8fc\uc694 \ubb38\uc11c \uc5ed\ud560\uc744 \ud558\uba70, \ud574\ub2f9 \ub3c4\uad6c\uc758 \uae30\ub2a5\uacfc \ud638\ucd9c \uc774\uc720\ub97c \uc124\uba85\ud569\ub2c8\ub2e4.<\/li>\n<li><code>Args<\/code><strong> \ud074\ub798\uc2a4<\/strong>: \uc774 \ud074\ub798\uc2a4\ub294 \ub3c4\uad6c\ub97c \ud638\ucd9c\ud560 \ub54c LLM\uc774 \ud544\uc694\ub85c \ud558\uac70\ub098 \uc81c\uacf5\ud560 \uc218 \uc788\ub294 \ub9e4\uac1c\ubcc0\uc218\ub97c \uc815\uc758\ud569\ub2c8\ub2e4.<\/li>\n<li><code>Result<\/code><strong> \ud074\ub798\uc2a4<\/strong>: \uc774 \ud074\ub798\uc2a4\ub294 LLM\uc5d0 \uc804\ub2ec\ub420 \uba54\uc2dc\uc9c0\ub85c \uc11c\uc2dd\uc774 \uc9c0\uc815\ub418\ub294 \ub370\uc774\ud130\ub97c \uc815\uc758\ud569\ub2c8\ub2e4. LLM\uc774 \uc77d\uc744 \uc218 \uc788\ub3c4\ub85d \ub370\uc774\ud130\ub97c \ubb38\uc790\uc5f4 \uc11c\uc2dd\uc73c\ub85c \uc9c0\uc815\ud558\ub294 <code>textForLLM()<\/code> \ud568\uc218\ub97c \ud3ec\ud568\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <code>Result<\/code> \ud074\ub798\uc2a4\ub294 \uae30\ubcf8\uc801\uc73c\ub85c \uac1c\ubc1c\uc790\uc758 \ud3b8\uc758\ub97c \uc704\ud55c \uac83\uc73c\ub85c, \uc774\ub97c \ud1b5\ud574 \ub3c4\uad6c \uacb0\uacfc\ub97c \ub85c\uadf8\uc5d0 \uae30\ub85d\ud558\uac70\ub098 UI\uc5d0\uc11c \ub80c\ub354\ub9c1\ud558\uae30\uac00 \ub354 \uc26c\uc6cc\uc9d1\ub2c8\ub2e4. \uc5d0\uc774\uc804\ud2b8 \uc790\uccb4\uc5d0\ub294 \uc11c\uc2dd\uc774 \uc9c0\uc815\ub41c \ubb38\uc790\uc5f4\ub9cc \ud544\uc694\ud569\ub2c8\ub2e4.<\/li>\n<li><code>Execute()<\/code><strong> \uba54\uc11c\ub4dc<\/strong>: \uc774 \uba54\uc11c\ub4dc\ub294 Args\uc758 \uc778\uc2a4\ud134\uc2a4\ub97c \uc785\ub825\uc73c\ub85c \ubc1b\uc544 <code>Result<\/code> \uc778\uc2a4\ud134\uc2a4\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4. LLM\uc774 \ub3c4\uad6c\ub97c \ud638\ucd9c\ud560 \ub54c\uc758 \ucc98\ub9ac \ub85c\uc9c1\uc744 \uc815\uc758\ud569\ub2c8\ub2e4.<\/li>\n<\/ol>\n<p>\uc774\ub7ec\ud55c \uad6c\uc131 \uc694\uc18c\ub294 \uad6c\ucd95\ud560 \ub300\uc0c1\uc774 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ucee4\ub125\ud130\ub4e0, API \ud074\ub77c\uc774\uc5b8\ud2b8\ub4e0, \uc624\ub298 \uc0b4\ud3b4\ubcfc \uc178 \uba85\ub839 \uc2e4\ud589\uae30\ub4e0 \uc0c1\uad00\uc5c6\uc774 \ubaa8\ub4e0 Koog \ub3c4\uad6c\uc758 \uae30\ucd08\uac00 \ub429\ub2c8\ub2e4. \uc774\uc81c \uc774\ub7ec\ud55c \uc6d0\uce59\uc774 \uc2e4\uc81c\ub85c \uc5b4\ub5bb\uac8c \uc791\ub3d9\ud558\ub294\uc9c0 <code>ExecuteShellCommandTool<\/code>\uc744 \uad6c\ud604\ud574 \ud655\uc778\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h3 class=\"wp-block-heading\"><strong>\uc548\uc804\uc131 \ud655\ubcf4\ub97c \uc704\ud55c \uace0\ub824 \uc0ac\ud56d<\/strong><\/h3>\n<p><code>ExecuteShellCommandTool<\/code>\uc758 \uad6c\uccb4\uc801\uc778 \ub0b4\uc6a9\uc73c\ub85c \ub4e4\uc5b4\uac00\uae30 \uc804\uc5d0, \uba87 \uac00\uc9c0 \ud575\uc2ec\uc801\uc778 \uc548\uc804 \uace0\ub824 \uc0ac\ud56d\uc744 \uba3c\uc800 \uc9da\uace0 \ub118\uc5b4\uac08 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>LLM\uc740 \uc758\ub3c4\uc801\uc73c\ub85c \ubb38\uc81c\ub97c \uc77c\uc73c\ud0a4\ub294 \uc545\uc758\uc801 \ud589\uc704\uc790\ub294 \uc544\ub2c8\uc9c0\ub9cc, \uac04\ud639 \uc608\uae30\uce58 \ubabb\ud55c \uc2e4\uc218\ub85c \uc778\ud574 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c LLM\uc5d0 \uba85\ub839\uc904 \uc2e4\ud589 \uad8c\ud55c\uc744 \ubd80\uc5ec\ud55c\ub2e4\uba74, \uadf8\uc5d0 \ub530\ub978 \uc2e4\uc218\ub294 \uc2ec\uac01\ud55c \uacb0\uacfc\ub97c \ucd08\ub798\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud558\uc9c0\ub9cc \uaca9\ub9ac\ub41c \ud658\uacbd\uc5d0\uc11c \uba85\ub839\uc5b4 \uc2e4\ud589\uc744 \uc0cc\ub4dc\ubc15\uc2f1\ud558\uac70\ub098 \uba85\ub839\uc5b4\uc5d0 \ubd80\uc5ec\ud558\ub294 \uad8c\ud55c\uc744 \uc81c\ud55c\ud558\ub294 \ub4f1, \uc774 \uc704\ud5d8\uc744 \uc644\ud654\ud558\ub294 \uba87 \uac00\uc9c0 \ubc29\ubc95\uc774 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\ub9cc \uc774\ub7ec\ud55c \ubc29\uc2dd\uc740 \uad6c\ud604\uc774 \uc0c1\ub2f9\ud788 \ubcf5\uc7a1\ud560 \uc218 \uc788\uc73c\ub2c8, \uc5ec\uae30\uc11c\ub294 \uc2e4\uc81c \ub3c4\uad6c\ub97c \ub9cc\ub4dc\ub294 \ub370 \uc911\uc810\uc744 \ub450\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub7ec\ud55c \uc810\uc744 \uc5fc\ub450\uc5d0 \ub450\uace0, \uac00\uc7a5 \uac04\ub2e8\ud55c \uc704\ud5d8 \uc644\ud654 \uc804\ub7b5\uc744 \ub450 \uac00\uc9c0 \uc18c\uac1c\ud574 \ub4dc\ub9bd\ub2c8\ub2e4.<\/p>\n<ol>\n<li>\ubaa8\ub4e0 \uba85\ub839\uc5b4\uc5d0 \ub300\ud55c <strong>\uba85\ub839\uc5b4 \uc2e4\ud589 \ud655\uc778<\/strong>. LLM\uc774 \uc2e4\ud589\ud558\ub824\ub294 \ubaa8\ub4e0 \uba85\ub839\uc5b4\ub97c \uc7a0\uc2dc \uc2dc\uac04\uc744 \ub0b4\uc5b4 \uac80\ud1a0\ud558\ub294 \uac83\uc740 \uac00\uc7a5 \uc548\uc804\ud55c \uc635\uc158\uc774 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e8, \uc5d0\uc774\uc804\ud2b8\uc758 \uc790\uc728\uc131\uc740 \uc2ec\uac01\ud558\uac8c \uc81c\ud55c\ub429\ub2c8\ub2e4.<\/li>\n<li><strong><em>Brave<\/em><\/strong><strong> \ubaa8\ub4dc<\/strong>: \ubaa8\ub4e0 \uba85\ub839\uc5b4\uac00 \uc790\ub3d9\uc73c\ub85c \uc2b9\uc778\ub418\ub294 \ubaa8\ub4dc\uc785\ub2c8\ub2e4. \uc774 \ubaa8\ub4dc\ub294 \uc801\uc808\ud788 \uc0cc\ub4dc\ubc15\uc2f1\ub418\uc9c0 \uc54a\uc740 \uacbd\uc6b0 \uc791\uc5c5 \uc911\uc778 \uc2dc\uc2a4\ud15c\uc5d0 \uc704\ud5d8\uc744 \ucd08\ub798\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc5ec\uae30\uc11c\ub294 \uc790\uccb4 \ubca4\uce58\ub9c8\ud06c \ub0b4\ubd80\uc5d0\uc11c\ub9cc \uc774\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc601\ud5a5 \uc5c6\uc774 \ud30c\uae30\ud560 \uc218 \uc788\ub294 \uaca9\ub9ac\ub41c \ud658\uacbd\uc5d0\uc11c \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/li>\n<\/ol>\n<h2 class=\"wp-block-heading\"><strong><code>ExecuteShellCommandTool<\/code><\/strong> \uad6c\ud604<\/h2>\n<div class=\"slider slider-full\">\n<div class=\"slider__slide\"><a href=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/11\/DSGN-24422-01_Exec-tool.png\"><br \/><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/11\/DSGN-24422-01_Exec-tool.png\" alt=\"\" \/><br \/><\/a><\/div>\n<div class=\"slider__slide\"><a href=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/11\/DSGN-24422-02_Data-flow.png\"><br \/><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/11\/DSGN-24422-02_Data-flow.png\" alt=\"\" \/><br \/><\/a><\/div>\n<div class=\"slider__slide\"><a href=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/11\/DSGN-24422-03_Confirmation-handler.png\"><br \/><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/11\/DSGN-24422-03_Confirmation-handler.png\" alt=\"\" \/><br \/><\/a><\/div>\n<div class=\"slider__slide\"><a href=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/11\/DSGN-24422-04_Executor.png\"><br \/><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/11\/DSGN-24422-04_Executor.png\" alt=\"\" \/><br \/><\/a><\/div>\n<\/div>\n<p><a href=\"https:\/\/github.com\/JetBrains\/koog\/blob\/develop\/agents\/agents-ext\/src\/commonMain\/kotlin\/ai\/koog\/agents\/ext\/tool\/shell\/ExecuteShellCommandTool.kt\" target=\"_blank\" rel=\"noopener\"><code>ExecuteShellCommandTool<\/code><\/a>\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc131 \uc694\uc18c\ub85c \uc774\ub8e8\uc5b4\uc9d1\ub2c8\ub2e4.<\/p>\n<ol>\n<li><strong>\uc774\ub984<\/strong>: <code>__execute_shell_command__<\/code>.<\/li>\n<li><strong>\uc124\uba85<\/strong>: \u201c\uc178 \uba85\ub839\uc5b4\ub97c \uc2e4\ud589\ud558\uace0 \uadf8 \ucd9c\ub825\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4\u201d \ub4f1<\/li>\n<li><code>Args<\/code> <strong>\ud074\ub798\uc2a4<\/strong>: <code>command<\/code>, <code>timeoutSeconds<\/code>, <code>workingDirectory<\/code><\/li>\n<li><code>Result<\/code><strong> \ud074\ub798\uc2a4<\/strong>: <code>output<\/code>, <code>exitCode<\/code>, <code>command<\/code>(\ub2e4\uc18c \uc758\uc678\uc77c \uc218 \uc788\uc9c0\ub9cc, \uc5b4\ub5a4 \uba85\ub839\uc5b4\uac00 \uc2e4\ud589\ub418\uc5c8\ub294\uc9c0\ub97c \ub85c\uadf8\ub098 UI\uc5d0 \ubcf4\uace0\ud558\uae30\uc5d0 \ud3b8\ub9ac\ud569\ub2c8\ub2e4).<\/li>\n<li><code>Execute()<\/code><strong> \uba54\uc11c\ub4dc<\/strong>: \uc2e4\ud589 \ud655\uc778\uc744 \uc694\uccad\ud55c \ub4a4, \uba85\ub839\uc5b4\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4(\uad6c\ud604 \uc138\ubd80 \uc0ac\ud56d\uc740 \uc544\ub798\uc5d0\uc11c \uc790\uc138\ud788 \uc0b4\ud3b4\ubd05\ub2c8\ub2e4).<\/li>\n<\/ol>\n<h2 class=\"wp-block-heading\"><code>Execute()<\/code><strong> \uba54\uc11c\ub4dc \uad6c\ud604<\/strong><\/h2>\n<p>\uc774\uc81c execute() \uba54\uc11c\ub4dc\ub97c \uc5b4\ub5bb\uac8c \uad6c\ud604\ud558\ub294\uc9c0 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \ud575\uc2ec \ub85c\uc9c1\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \ud5ec\ud37c \uba54\uc11c\ub4dc\uc5d0 \uc704\uc784\ud558\uc5ec \uba54\uc11c\ub4dc\ub97c \ub2e8\uc21c\ud558\uac8c \uc720\uc9c0\ud569\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">override suspend fun execute(args: Args): Result = when (\n        val confirmation = confirmationHandler.requestConfirmation(args)\n    ) {\n        is ShellCommandConfirmation.Approved -&gt; try {\n            val result = executor.execute(\n                args.command, args.workingDirectory, args.timeoutSeconds\n            )\n            Result(args.command, result.exitCode, result.output)\n        } catch (e: CancellationException) {\n            throw e\n        } catch (e: Exception) {\n            Result(\n               args.command, null, \"Failed to execute command: ${e.message}\"\n            )\n        }\n\n        is ShellCommandConfirmation.Denied -&gt;\n            Result(\n                args.command, null, \n                \"Command execution denied with user response: ${confirmation.userResponse}\"\n            )\n    }<\/pre>\n<p>\ud750\ub984\uc740 \ub2e8\uc21c\ud569\ub2c8\ub2e4. \uba85\ub839\uc5b4 \uc2e4\ud589\uc5d0 \ub300\ud574 \uc0ac\uc6a9\uc790 \ud655\uc778\uc744 \uc694\uccad\ud558\uace0, \uba85\ub839\uc5b4 \uc2e4\ud589\uae30\ub97c \ud1b5\ud574 \uc2b9\uc778\ub418\uba74 \uc2e4\ud589\ud558\uba70, \uc2b9\uc778\ub418\uc9c0 \uc54a\uc73c\uba74 \uac70\ubd80 \uba54\uc2dc\uc9c0\ub97c LLM\uc5d0 \ubc18\ud658\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub97c \ud1b5\ud574 \uc608\uc678\ub97c \ud3ec\ucc29\ud558\uace0 \uc624\ub958 \uba54\uc2dc\uc9c0\ub97c LLM\uc5d0 \uc804\ub2ec\ud560 \uc218 \uc788\uc73c\uba70, LLM\uc774 \uc811\uadfc \ubc29\uc2dd\uc744 \uc870\uc815\ud558\uac70\ub098 \ub300\uc548\uc744 \uc2dc\ub3c4\ud558\ub3c4\ub85d \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3 class=\"wp-block-heading\"><code>ConfirmationHandler<\/code> \uad6c\uc131<\/h3>\n<p><code>ConfirmationHandler<\/code>\ub294 <code>ExecuteShellCommandTool<\/code>\uc744 \uc0dd\uc131\ud560 \ub54c \uad6c\uc131\ud560 \uc218 \uc788\uc73c\uba70, \ub2e4\uc591\ud55c \uad6c\ud604\uc744 \ud5c8\uc6a9\ud569\ub2c8\ub2e4. \ud604\uc7ac\ub294 \ub2e4\uc74c\uc758 <a href=\"https:\/\/github.com\/JetBrains\/koog\/blob\/develop\/agents\/agents-ext\/src\/commonMain\/kotlin\/ai\/koog\/agents\/ext\/tool\/shell\/ShellCommandConfirmationHandlers.kt\" target=\"_blank\" rel=\"noopener\">\ub450 \uac00\uc9c0<\/a>\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<ol>\n<li><code>PrintShellCommandConfirmationHandler<\/code>: \uba85\ub839\uc904\uc744 \ud1b5\ud574 \uc0ac\uc6a9\uc790\uc5d0\uac8c \ud655\uc778 \uba54\uc2dc\uc9c0\ub97c \ud45c\uc2dc\ud569\ub2c8\ub2e4.<\/li>\n<li><code>BraveModeConfirmationHandler<\/code>: \ubaa8\ub4e0 \uc694\uccad\uc744 \uc790\ub3d9\uc73c\ub85c \uc2b9\uc778\ud569\ub2c8\ub2e4.<\/li>\n<\/ol>\n<p>\ub450 \ubc88\uc9f8 \uad6c\ud604\uc740 \uc544\ubb34 \uc870\uac74 \uc5c6\uc774 \uc2b9\uc778\ub9cc \uc218\ud589\ud558\uc9c0\ub9cc, \uccab \ubc88\uc9f8 \uad6c\ud604\uc5d0\ub294 \uba87 \uac00\uc9c0 \ud765\ubbf8\ub85c\uc6b4 \ud2b9\uc9d5\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">override suspend fun requestConfirmation(\n        args: ExecuteShellCommandTool.Args\n    ): ShellCommandConfirmation {\n        println(\"Agent wants to execute: ${args.command}\")\n        args.workingDirectory?.let { println(\"In: $it\") }\n        println(\"Timeout: ${args.timeoutSeconds}s\")\n        print(\"Confirm (y \/ n \/ reason-for-denying): \")\n\n        val userResponse = readln().lowercase()\n        return when (userResponse) {\n            \"y\", \"yes\" -&gt; ShellCommandConfirmation.Approved\n            else -&gt; ShellCommandConfirmation.Denied(userResponse)\n        }\n    }<\/pre>\n<p>\uc0ac\uc6a9\uc790\ub294 \uc138 \uac00\uc9c0 \uc635\uc158(\uc2b9\uc778, \uac70\ubd80, \uc0ac\uc720\ub97c \ud3ec\ud568\ud55c \uac70\ubd80)\uc73c\ub85c \uc778\uc2dd\ud558\uc9c0\ub9cc, \uc2e4\uc81c \uad6c\ud604\uc0c1 \ub450 \uac00\uc9c0 \uac70\ubd80 \uc720\ud615\uc740 \ub3d9\uc77c\ud558\uac8c \ucc98\ub9ac\ub429\ub2c8\ub2e4. \ub450 \uc720\ud615 \ubaa8\ub450 LLM\uc73c\ub85c \ubc18\ud658\ub418\uba70, LLM\uc774 \uac01 \uc720\ud615\uc744 \uc801\uc808\ud558\uac8c \ud574\uc11d\ud558\uace0 \ucc98\ub9ac\ud569\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-660074\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/11\/demo-exec-print-confirmation.gif\" alt=\"\" width=\"396\" height=\"366\" \/><\/figure>\n<h3 class=\"wp-block-heading\"><code>CommandExecutor<\/code> \uad6c\uc131<\/h3>\n<p><code>ConfirmationHandler<\/code>\uc640 \ub9c8\ucc2c\uac00\uc9c0\ub85c <code>CommandExecutor<\/code> \uc5ed\uc2dc \uad6c\uc131 \uac00\ub2a5\ud558\uc9c0\ub9cc, \ud604\uc7ac\ub294 JVM \uad6c\ud604\ub9cc \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774\ub860\uc801\uc73c\ub85c\ub294 Android, iOS, WebAssembly \ubc0f \uae30\ud0c0 \ud50c\ub7ab\ud3fc\uc6a9 \uad6c\ud604\uc744 \uc0dd\uc131\ud560 \uc218 \uc788\uc9c0\ub9cc, \uba85\ud655\ud55c \uc218\uc694\uac00 \uc5c6\ub2e4\uba74 \ub2f9\ubd84\uac04\uc740 \ubcf4\ub958\ud569\ub2c8\ub2e4.<\/p>\n<h2 class=\"wp-block-heading\">\uc2dc\uac04 \ucd08\uacfc \ucc98\ub9ac \ubc29\ubc95<\/h2>\n<p>\uc0ac\uc6a9\ud558\ub294 \ud50c\ub7ab\ud3fc\uacfc \uad00\uacc4\uc5c6\uc774 <code>CommandExecutor<\/code>\uc758 \ud55c \uac00\uc9c0 \uce21\uba74, \uc989 \uc2dc\uac04 \ucd08\uacfc \ucc98\ub9ac\ub294 \ud2b9\ubcc4\ud55c \uc8fc\uc758\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \ud604\uc7ac \uad6c\ud604\uc73c\ub85c\ub294 \uc5d0\uc774\uc804\ud2b8\uac00 \uc7a5\uc2dc\uac04 \uc2e4\ud589\ub418\ub294 \uba85\ub839\uc5b4\ub97c \uc911\ub2e8\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc0ac\uc6a9\uc790\ub294 \ub54c\ub54c\ub85c \uc870\uae09\ud574\uc838\uc11c \uc2e4\ud589\uc744 \ucde8\uc18c\ud558\uae30 \uc704\ud574 \ubb34\uc758\uc2dd\uc801\uc73c\ub85c <em>Ctrl+C<\/em>\ub97c \ub204\ub974\uae30\ub3c4 \ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc774\ub7ec\ud55c \ub3d9\uc791\uc740 \uc5d0\uc774\uc804\ud2b8\uac00 \uba40\ud2f0\uc2a4\ub808\ub4dc \ud658\uacbd\uc5d0\uc11c \uc0ac\uc6a9\uc790\uc758 &#8216;\uc870\uae09\ud568&#8217;\uc744 \uc774\ud574\ud560 \uac83\uc774\ub77c\uace0 \uac00\uc815\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc0c1\ud669\uc5d0\uc11c\ub294 \ub354 \uac04\ub2e8\ud558\uba70 \uc9c1\uad00\uc801\uc778 \ub354 \ub098\uc740 \ub300\uc548\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>LLM\uc5d0\uac8c \ucd5c\ub300 \uc2e4\ud589 \uc2dc\uac04\uc744 \uba85\uc2dc\ud558\ub3c4\ub85d \uc694\uad6c\ud558\uba74 \uc774 \ud55c\ub3c4\ub97c \ucd08\uacfc\ud558\ub294 \uba85\ub839\uc5b4\ub97c <a href=\"https:\/\/github.com\/JetBrains\/koog\/blob\/develop\/agents\/agents-ext\/src\/jvmMain\/kotlin\/ai\/koog\/agents\/ext\/tool\/shell\/JvmShellCommandExecutor.kt\" target=\"_blank\" rel=\"noopener\">\uc548\uc804\ud558\uac8c \uc911\ub2e8<\/a>\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc2dc\uac04 \ucd08\uacfc \uac12\uc740 \uc0ac\uc6a9\uc790\uc5d0\uac8c \ud45c\uc2dc\ub418\uba70, \uc694\uccad\ub41c \uae30\uac04\uc774 \ube44\ud569\ub9ac\uc801\uc774\uac70\ub098 \uacfc\ub3c4\ud574 \ubcf4\uc77c \uacbd\uc6b0 \uc0ac\uc6a9\uc790\uac00 \uc2e4\ud589\uc744 \uac70\ubd80\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud504\ub85c\uc138\uc2a4\ub97c \ub2e8\uc21c\ud788 \uc885\ub8cc\ud558\uace0 \uc77c\ubc18\uc801\uc778 \uc2dc\uac04 \ucd08\uacfc \uba54\uc2dc\uc9c0\ub97c \ubc18\ud658\ud558\ub294 \ub300\uc2e0, \ucd5c\ub300\ud55c \ub9ce\uc740 \ucd9c\ub825\uc744 \ubcf4\uc874\ud558\ub294 \uac83\uc744 \ubaa9\ud45c\ub85c \ud574\uc57c \ud569\ub2c8\ub2e4. \ubd88\uc644\uc804\ud55c \uacb0\uacfc\ub77c\ub3c4 LLM\uc774 \uc720\uc6a9\ud55c \uc815\ubcf4\ub97c \ucd94\ucd9c\ud560 \uc218\ub3c4 \uc788\uace0, \ucd5c\uc18c\ud55c \uc2dc\uac04 \ucd08\uacfc\uac00 \ubc1c\uc0dd\ud55c \uc0c1\ud669\uc744 \uc774\ud574\ud558\ub294 \ub370 \ub3c4\uc6c0\uc774 \ub420 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \uc2e0\uc911\ud558\uac8c \uad6c\ud604\ud558\uba74 \ub2e4\uc74c\uc744 \uc5bb\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">val stdoutJob = launch {\n    process.inputStream.bufferedReader().useLines { lines -&gt;\n        try {\n            lines.forEach { stdoutBuilder.appendLine(it) }\n        } catch (_: IOException) {\n            \/\/ Ignore IO exception if the stream is closed and silently stop stream collection\n        }\n    }\n}\n\nval isCompleted = withTimeoutOrNull(timeoutSeconds * 1000L) {\n    process.onExit().await()\n} != null\n\nif (!isCompleted) {\n    process.destroyForcibly()\n}\n\nstdoutJob.join()<\/pre>\n<h2 class=\"wp-block-heading\"><strong>\uc5d0\uc774\uc804\ud2b8 \uc218\uc900\uc758 \ubcc0\uacbd \uc0ac\ud56d<\/strong><\/h2>\n<p>\uc5d0\uc774\uc804\ud2b8 \uc218\uc900\uc5d0\uc11c <a href=\"https:\/\/github.com\/JetBrains\/koog\/blob\/develop\/examples\/code-agent\/step-02-add-execution-tool\/src\/main\/kotlin\/Main.kt\" target=\"_blank\" rel=\"noopener\">\uc218\uc815 \uc0ac\ud56d\uc740 \ub9e4\uc6b0 \ubbf8\ubbf8\ud55c \uc218\uc900<\/a>\uc774\uba70, \uc2e4\uc81c \ubc18\uc601\ub41c \ucf54\ub4dc\ub294 \ub2e8 10\uc5ec \uc904\uc5d0 \ubd88\uacfc\ud569\ub2c8\ub2e4. diff\uc5d0\uc11c \ubcfc \uc218 \uc788\ub4ef\uc774, \uc774\ub7ec\ud55c \uc5c5\ub370\uc774\ud2b8\uc758 \ub300\ubd80\ubd84\uc740 \uc2dc\uc2a4\ud15c \ud504\ub86c\ud504\ud2b8\ub97c \ud655\uc7a5\ud558\ub294 \uac83\uacfc \uad00\ub828\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-660085\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/11\/Screenshot-2025-11-18-at-14.47.35.png\" alt=\"\" width=\"1913\" height=\"1001\" \/><\/figure>\n<p>\ub2e8\uc21c\ud788 \ub3c4\uad6c\ub97c \ucd94\uac00\ud574 \ubcc0\uacbd \ubc94\uc704\ub97c \ucd5c\uc18c\ud654\ud560 \uc218\ub3c4 \uc788\uc5c8\uc73c\ub098, \uc5d0\uc774\uc804\ud2b8\uc758 \uc131\ub2a5\uc744 \ud55c\uce35 \ub354 \ub04c\uc5b4\uc62c\ub9ac\uae30 \uc704\ud574 \uc815\uad50\ud55c \ucd5c\uc801\ud654 \uc791\uc5c5\uc744 \ub450 \uac00\uc9c0 \ub354 \ubcd1\ud589\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<h3 class=\"wp-block-heading\"><strong>A) <code>BRAVE_MODE<\/code> \ud1a0\uae00<\/strong><\/h3>\n<p>\uc774 \ud1a0\uae00\uc758 \uad6c\ud604\uc740 \ube44\uad50\uc801 \ub2e8\uc21c\ud558\uba70, BRAVE_MODE \ud658\uacbd \ubcc0\uc218\ub97c \ud655\uc778\ud558\uae30\ub9cc \ud558\uba74 \ub429\ub2c8\ub2e4. \uc9c1\uc811 \uad6c\ud604\ud558\ub294 \uacfc\uc815\uc774 \uc5bc\ub9c8\ub098 \uac04\ub2e8\ud55c\uc9c0 \ubcf4\uc5ec \ub4dc\ub9ac\uae30 \uc704\ud574, <em>Brave<\/em> \ubaa8\ub4dc ConfirmationHandler\uc5d0 \ub78c\ub2e4(lambda) \ud568\uc218\ub97c \uc801\uc6a9\ud574 \ubcf4\uc558\uc2b5\ub2c8\ub2e4. \ubb3c\ub860 \uc55e\uc11c \uc18c\uac1c\ud574 \ub4dc\ub9b0 <code>BraveModeConfirmationHandler<\/code>\ub97c \uadf8\ub300\ub85c \ud65c\uc6a9\ud558\uc154\ub3c4 \ubb34\ubc29\ud569\ub2c8\ub2e4.\u00a0<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">fun createExecuteShellCommandToolFromEnv(): ExecuteShellCommandTool {\n    return if (System.getenv(\"BRAVE_MODE\")?.lowercase() == \"true\") {\n        ExecuteShellCommandTool(JvmShellCommandExecutor()) {\n            _ -&gt; ShellCommandConfirmation.Approved \n        }\n    } else {\n        ExecuteShellCommandTool(\n            JvmShellCommandExecutor(), \n            PrintShellCommandConfirmationHandler(),\n        )\n    }\n}<\/pre>\n<h3 class=\"wp-block-heading\"><strong>B) \ud504\ub86c\ud504\ud2b8 \ub0b4 &#8216;\uc644\ub8cc\uc758 \uc815\uc758&#8217; \uac1c\uc120<\/strong><\/h3>\n<p>LLM\uc774 \ucf54\ub4dc \uc2e4\ud589\uc774\ub77c\ub294 \uc0c8\ub85c\uc6b4 \uae30\ub2a5\uc744 \ud6a8\uacfc\uc801\uc73c\ub85c \ud65c\uc6a9\ud558\ub3c4\ub85d, \ud14c\uc2a4\ud2b8 \uc791\uc131\uacfc \uc2e4\ud589\uc744 \uac15\ud558\uac8c \uc720\ub3c4\ud558\ub294 &#8216;\uc644\ub8cc\uc758 \uc815\uc758&#8217;\ub97c \ud504\ub86c\ud504\ud2b8\uc5d0 \ucd94\uac00\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"kotlin\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\"\"\"\n... \/\/ Previous prompt from step 01\n\nProduction-ready means verified to work\u2014your changes must be proven correct and not introduce regressions.\n\nYou have shell access to execute commands and run tests. Use this to work with executable feedback instead of assumptions. Establish what correct behavior looks like through tests, then iterate your implementation until tests pass. Validate that existing functionality remains intact. Production-ready means proven through green tests\u2014that's your definition of done.\n\"\"\"<\/pre>\n<p>\uc774\uc81c \ub2e4 \ub410\uc2b5\ub2c8\ub2e4. \ucd5c\uc18c\ud55c\uc758 \ubcc0\uacbd\uc73c\ub85c <code>ExecuteShellCommandTool<\/code> \uad6c\uc131 \uc694\uc18c\ub97c \uc644\uc131\ud558\uace0, \uc774\ub97c \uc5d0\uc774\uc804\ud2b8\uc5d0 \ud1b5\ud569\ud588\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc5ec\uae30\uc11c \uac00\uc7a5 \uc911\uc694\ud55c \uc9c8\ubb38\uc774 \ub0a8\uc558\uc2b5\ub2c8\ub2e4. \uacfc\uc5f0 \uc774\ub7ec\ud55c \ubcc0\ud654\uac00 \uc2e4\uc9c8\uc801\uc778 \uc131\ub2a5 \ud5a5\uc0c1\uc73c\ub85c \uc774\uc5b4\uc84c\uc744\uae4c\uc694?<\/p>\n<h2 class=\"wp-block-heading\">\ubca4\uce58\ub9c8\ud06c \ud14c\uc2a4\ud2b8 \uacb0\uacfc<\/h2>\n<p>SWE-bench-verified \ub370\uc774\ud130 \uc138\ud2b8 \uc218\ud589 \uacb0\uacfc, \uc131\ub2a5 \uac1c\uc120 \ud6a8\uacfc\uac00 \ud655\uc778\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc131\uacf5 \uc0ac\ub840\uac00 249\/500\uac74(50%)\uc5d0\uc11c 279\/500\uac74(56%)\uc73c\ub85c \ub298\uc5b4\ub098\uba70 \uc5d0\uc774\uc804\ud2b8\uc758 \uc131\ub2a5 \ud5a5\uc0c1\uc774 \ud655\uc778\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ud604\uc7ac \ub9ac\ub354\ubcf4\ub4dc \uc810\uc218\uac00 70% \ub0b4\uc678\uc784\uc744 \uac10\uc548\ud560 \ub54c, \uc774\ubc88 \uacb0\uacfc\ub294 \uc5d0\uc774\uc804\ud2b8\uc5d0\uac8c \ucf54\ub4dc \uc2e4\ud589 \ubc0f \uac80\uc99d \uad8c\ud55c\uc744 \ubd80\uc5ec\ud558\ub294 \ubc29\uc2dd\uc774 \uc62c\ubc14\ub978 \ubc1c\uc804 \ubc29\ud5a5\uc784\uc744 \uc99d\uba85\ud574 \uc90d\ub2c8\ub2e4. \ub2e4\ub9cc \uc5d0\uc774\uc804\ud2b8\uac00 \uc5b4\ub5a4 \uc9c0\uc810\uc5d0\uc11c \uace0\uc804\ud558\uace0 \uc788\ub294\uc9c0, \ub2e4\uc74c \ub2e8\uacc4\uc5d0\uc11c \ubb34\uc5c7\uc744 \ubcf4\uc644\ud574\uc57c \ud560\uc9c0 \ud30c\uc545\ud558\uae30 \uc704\ud574\uc11c\ub294 \ub3d9\uc791\uc5d0 \ub300\ud55c \uac00\uc2dc\uc131 \uac1c\uc120\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \ubc14\ub85c \uadf8 \uc9c0\uc810\uc5d0\uc11c \ub85c\uae45\uc774 \uc911\uc694\ud574\uc9d1\ub2c8\ub2e4.<\/p>\n<h2 class=\"wp-block-heading\">\uacb0\ub860: Koog\uc5d0\uc11c \ub3c4\uad6c \uad6c\ucd95\ud558\uae30<\/h2>\n<p>\uc774 \uae00\uc5d0\uc11c\ub294 Koog\uc758 \ub3c4\uad6c \uad6c\uc870\uac00 \uc5b4\ub5bb\uac8c \uc791\ub3d9\ud558\ub294\uc9c0 \uc0b4\ud3b4\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \ubaa8\ub4e0 \ub3c4\uad6c\uc5d0\ub294 \uc774\ub984, \uc124\uba85, <code>execute()<\/code> \uba54\uc11c\ub4dc\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \ub610\ud55c, <code>ExecuteShellCommandTool<\/code>\uc744 <code>ConfirmationHandler<\/code>\uc640 <code>CommandExecutor<\/code> \uad6c\uc131 \uc694\uc18c\ub97c \ud1b5\ud574 \uad6c\uc131 \uac00\ub2a5\ud558\uac8c \uc124\uacc4\ud558\uc600\uace0 \ubcf5\uc7a1\ud55c \ub85c\uc9c1\uc744 \uad50\uccb4 \uac00\ub2a5\ud55c \uad6c\ud604\uc73c\ub85c \uc704\uc784\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec \ub4dc\ub838\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub7ec\ud55c \ub3d9\uc77c\ud55c \ud328\ud134\uc740 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ucee4\ub125\ud130, API \ud074\ub77c\uc774\uc5b8\ud2b8, \ud30c\uc77c \ud504\ub85c\uc138\uc11c \ub610\ub294 \uc0ac\uc6a9\uc790 \uc815\uc758 \ud1b5\ud569 \ub4f1 \uad6c\ucd95\ud558\uace0\uc790 \ud558\ub294 \uc5b4\ub5a4 \ub3c4\uad6c\uc5d0\ub3c4 \uc801\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud504\ub808\uc784\uc6cc\ud06c\ub294 LLM \ucee4\ubba4\ub2c8\ucf00\uc774\uc158\uc744 \uc704\ud55c \uad6c\uc870\ub97c \uc81c\uacf5\ud558\uace0 \uc0ac\uc6a9\uc790\ub294 \uad6c\uccb4\uc801\uc778 \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\ub294 \ubc29\uc2dd\uc785\ub2c8\ub2e4.\u00a0<\/p>\n<p>\ub2e4\uc74c \uae00\uc5d0\uc11c\ub294 \uc5d0\uc774\uc804\ud2b8\uc758 \ub3d9\uc791\uc744 \uc774\ud574\ud558\uace0 \uac1c\uc120\ud558\ub294 \ub370 \ud544\uc694\ud55c \uac00\uc2dc\uc131\uc744 \ud655\ubcf4\ud558\uae30 \uc704\ud574 \uc5d0\uc774\uc804\ud2b8\uc5d0 \ub85c\uae45\uacfc \ucd94\uc801\uc744 \ucd94\uac00\ud558\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubd05\ub2c8\ub2e4. \ubc18\ubcf5 \ucc98\ub9ac\ub97c \uc704\ud574\uc11c\ub294 \uc5d0\uc774\uc804\ud2b8\uc758 \uc758\uc0ac\uacb0\uc815 \ubc29\uc2dd\uc744 \ud30c\uc545\ud574\uc57c \ud558\uba70, \uc801\uc808\ud55c \uad00\ucc30 \uac00\ub2a5\uc131 \ub3c4\uad6c\ub294 \uc5d0\uc774\uc804\ud2b8 \uc790\uccb4\uc5d0 \uc81c\uacf5\ud558\ub294 \ub3c4\uad6c\ub9cc\ud07c \uc911\uc694\ud569\ub2c8\ub2e4.<\/p>\n<p><em>\uac8c\uc2dc\ubb3c \uc6d0\ubb38 \uc791\uc131\uc790<\/em><\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/11\/picture_cropped-1.jpg\" width=\"200\" height=\"200\" alt=\"Bruno Lannoo\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                            <h4>Bruno Lannoo<\/h4>\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1191,"featured_media":678545,"comment_status":"closed","ping_status":"closed","template":"","categories":[4113,2347],"tags":[6847,8724],"cross-post-tag":[6355],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/ai\/678093"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/ai"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/types\/ai"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/users\/1191"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/comments?post=678093"}],"version-history":[{"count":4,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/ai\/678093\/revisions"}],"predecessor-version":[{"id":678568,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/ai\/678093\/revisions\/678568"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media\/678545"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media?parent=678093"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/categories?post=678093"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/tags?post=678093"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/cross-post-tag?post=678093"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}