SpyBara
Go Premium

agent-sdk/agent-loop.md 2026-06-09 06:34 UTC to 2026-06-10 23:57 UTC

67 added, 23 removed.

2026
Sat 13 04:59 Fri 12 22:00 Thu 11 23:01 Wed 10 23:57 Tue 9 06:34 Mon 8 06:52 Sat 6 06:24 Fri 5 06:45 Thu 4 06:52 Wed 3 06:53 Tue 2 06:51

์—์ด์ „ํŠธ ๋ฃจํ”„์˜ ์ž‘๋™ ์›๋ฆฌ

๋ฉ”์‹œ์ง€ ์ƒ๋ช…์ฃผ๊ธฐ, ๋„๊ตฌ ์‹คํ–‰, ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ, ๊ทธ๋ฆฌ๊ณ  SDK ์—์ด์ „ํŠธ๋ฅผ ๊ตฌ๋™ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

Agent SDK๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Claude Code์˜ ์ž์œจ ์—์ด์ „ํŠธ ๋ฃจํ”„๋ฅผ ์ž์‹ ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ž„๋ฒ ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SDK๋Š” ๋„๊ตฌ, ๊ถŒํ•œ, ๋น„์šฉ ์ œํ•œ, ์ถœ๋ ฅ์— ๋Œ€ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์˜ ์ œ์–ด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋…๋ฆฝํ˜• ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Claude Code CLI๋ฅผ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์—์ด์ „ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด SDK๋Š” Claude Code๋ฅผ ๊ตฌ๋™ํ•˜๋Š” ๋™์ผํ•œ ์‹คํ–‰ ๋ฃจํ”„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค: Claude๊ฐ€ ํ”„๋กฌํ”„ํŠธ๋ฅผ ํ‰๊ฐ€ํ•˜๊ณ , ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๊ณ , ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€์—์„œ๋Š” ํ•ด๋‹น ๋ฃจํ”„ ๋‚ด์—์„œ ๋ฌด์—‡์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์„ค๋ช…ํ•˜๋ฏ€๋กœ ์—์ด์ „ํŠธ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ตฌ์ถ•, ๋””๋ฒ„๊ทธ ๋ฐ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฃจํ”„ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ

๋ชจ๋“  ์—์ด์ „ํŠธ ์„ธ์…˜์€ ๋™์ผํ•œ ์ฃผ๊ธฐ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค:

์—์ด์ „ํŠธ ๋ฃจํ”„: ํ”„๋กฌํ”„ํŠธ ์ž…๋ ฅ, Claude ํ‰๊ฐ€, ๋„๊ตฌ ํ˜ธ์ถœ ๋˜๋Š” ์ตœ์ข… ๋‹ต๋ณ€์œผ๋กœ ๋ถ„๊ธฐ
  1. ํ”„๋กฌํ”„ํŠธ ์ˆ˜์‹ . Claude๊ฐ€ ํ”„๋กฌํ”„ํŠธ, ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ, ๋„๊ตฌ ์ •์˜, ๋Œ€ํ™” ๊ธฐ๋ก๊ณผ ํ•จ๊ป˜ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. SDK๋Š” ์„ธ์…˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ์„œ๋ธŒํƒ€์ž… "init"์ด ์žˆ๋Š” SystemMessage๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. ํ‰๊ฐ€ ๋ฐ ์‘๋‹ต. Claude๊ฐ€ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ํ‰๊ฐ€ํ•˜๊ณ  ์ง„ํ–‰ ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋กœ ์‘๋‹ตํ•˜๊ฑฐ๋‚˜, ํ•˜๋‚˜ ์ด์ƒ์˜ ๋„๊ตฌ ํ˜ธ์ถœ์„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜, ๋‘˜ ๋‹ค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SDK๋Š” ํ…์ŠคํŠธ์™€ ๋„๊ตฌ ํ˜ธ์ถœ ์š”์ฒญ์„ ํฌํ•จํ•˜๋Š” AssistantMessage๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  3. ๋„๊ตฌ ์‹คํ–‰. SDK๊ฐ€ ์š”์ฒญ๋œ ๊ฐ ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋„๊ตฌ ๊ฒฐ๊ณผ ์„ธํŠธ๊ฐ€ ๋‹ค์Œ ๊ฒฐ์ •์„ ์œ„ํ•ด Claude์—๊ฒŒ ๋‹ค์‹œ ํ”ผ๋“œ๋ฐฑ๋ฉ๋‹ˆ๋‹ค. hooks๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„๊ตฌ ํ˜ธ์ถœ์„ ์‹คํ–‰ ์ „์— ๊ฐ€๋กœ์ฑ„๊ณ , ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜, ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ๋ฐ˜๋ณต. 2๋‹จ๊ณ„์™€ 3๋‹จ๊ณ„๊ฐ€ ์ฃผ๊ธฐ๋กœ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์ „์ฒด ์ฃผ๊ธฐ๋Š” ํ•œ ํ„ด์ž…๋‹ˆ๋‹ค. Claude๋Š” ๋„๊ตฌ ํ˜ธ์ถœ์ด ์—†๋Š” ์‘๋‹ต์„ ์ƒ์„ฑํ•  ๋•Œ๊นŒ์ง€ ๋„๊ตฌ๋ฅผ ๊ณ„์† ํ˜ธ์ถœํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  5. ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜. SDK๋Š” ํ…์ŠคํŠธ ์‘๋‹ต(๋„๊ตฌ ํ˜ธ์ถœ ์—†์Œ)์ด ์žˆ๋Š” ์ตœ์ข… AssistantMessage๋ฅผ ์ƒ์„ฑํ•œ ํ›„, ์ตœ์ข… ํ…์ŠคํŠธ, ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰, ๋น„์šฉ, ์„ธ์…˜ ID๊ฐ€ ์žˆ๋Š” ResultMessage๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์งˆ๋ฌธ("์—ฌ๊ธฐ ์–ด๋–ค ํŒŒ์ผ์ด ์žˆ๋‚˜์š”?")์€ Glob์„ ํ˜ธ์ถœํ•˜๊ณ  ๊ฒฐ๊ณผ๋กœ ์‘๋‹ตํ•˜๋Š” ํ•œ๋‘ ํ„ด์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์ž‘์—…("auth ๋ชจ๋“ˆ์„ ๋ฆฌํŒฉํ† ๋งํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์„ธ์š”")์€ ๋งŽ์€ ํ„ด์— ๊ฑธ์ณ ์ˆ˜์‹ญ ๊ฐœ์˜ ๋„๊ตฌ ํ˜ธ์ถœ์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒŒ์ผ์„ ์ฝ๊ณ , ์ฝ”๋“œ๋ฅผ ํŽธ์ง‘ํ•˜๊ณ , ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ, Claude๊ฐ€ ๊ฐ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ„ด๊ณผ ๋ฉ”์‹œ์ง€

ํ„ด์€ ๋ฃจํ”„ ๋‚ด์˜ ํ•œ ์™•๋ณต์ž…๋‹ˆ๋‹ค: Claude๊ฐ€ ๋„๊ตฌ ํ˜ธ์ถœ์„ ํฌํ•จํ•˜๋Š” ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๊ณ , SDK๊ฐ€ ํ•ด๋‹น ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๊ฒฐ๊ณผ๊ฐ€ ์ž๋™์œผ๋กœ Claude์—๊ฒŒ ๋‹ค์‹œ ํ”ผ๋“œ๋ฐฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ์— ์ œ์–ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Claude๊ฐ€ ๋„๊ตฌ ํ˜ธ์ถœ์ด ์—†๋Š” ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•  ๋•Œ๊นŒ์ง€ ํ„ด์ด ๊ณ„์†๋˜๋ฉฐ, ์ด ์‹œ์ ์—์„œ ๋ฃจํ”„๊ฐ€ ๋๋‚˜๊ณ  ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

ํ”„๋กฌํ”„ํŠธ "auth.ts์˜ ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ ์ˆ˜์ •"์— ๋Œ€ํ•œ ์ „์ฒด ์„ธ์…˜์ด ์–ด๋–ป๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์ƒ๊ฐํ•ด ๋ด…์‹œ๋‹ค.

๋จผ์ € SDK๊ฐ€ ํ”„๋กฌํ”„ํŠธ๋ฅผ Claude์—๊ฒŒ ๋ณด๋‚ด๊ณ  ์„ธ์…˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” SystemMessage๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฃจํ”„๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค:

  1. ํ„ด 1: Claude๊ฐ€ Bash๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ npm test๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. SDK๋Š” ๋„๊ตฌ ํ˜ธ์ถœ์ด ์žˆ๋Š” AssistantMessage๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ช…๋ น์„ ์‹คํ–‰ํ•œ ํ›„, ์ถœ๋ ฅ(3๊ฐœ ์‹คํŒจ)์ด ์žˆ๋Š” UserMessage๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. ํ„ด 2: Claude๊ฐ€ auth.ts์™€ auth.test.ts์—์„œ Read๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. SDK๊ฐ€ ํŒŒ์ผ ๋‚ด์šฉ์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  AssistantMessage๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  3. ํ„ด 3: Claude๊ฐ€ Edit๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ auth.ts๋ฅผ ์ˆ˜์ •ํ•œ ํ›„, Bash๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ npm test๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. 3๊ฐœ ํ…Œ์ŠคํŠธ ๋ชจ๋‘ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. SDK๋Š” AssistantMessage๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  4. ์ตœ์ข… ํ„ด: Claude๊ฐ€ ๋„๊ตฌ ํ˜ธ์ถœ์ด ์—†๋Š” ํ…์ŠคํŠธ ์ „์šฉ ์‘๋‹ต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค: "auth ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ–ˆ๊ณ , 3๊ฐœ ํ…Œ์ŠคํŠธ ๋ชจ๋‘ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค." SDK๋Š” ์ด ํ…์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ์ตœ์ข… AssistantMessage๋ฅผ ์ƒ์„ฑํ•œ ํ›„, ๋น„์šฉ ๋ฐ ์‚ฌ์šฉ๋Ÿ‰์ด ์žˆ๋Š” ResultMessage๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” 4ํ„ด์ด์—ˆ์Šต๋‹ˆ๋‹ค: ๋„๊ตฌ ํ˜ธ์ถœ์ด ์žˆ๋Š” 3ํ„ด, ์ตœ์ข… ํ…์ŠคํŠธ ์ „์šฉ ์‘๋‹ต 1ํ„ด.

max_turns / maxTurns๋กœ ๋ฃจํ”„๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๋„๊ตฌ ์‚ฌ์šฉ ํ„ด๋งŒ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ ๋ฃจํ”„์—์„œ max_turns=2๋Š” ํŽธ์ง‘ ๋‹จ๊ณ„ ์ „์— ์ค‘์ง€ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. max_budget_usd / maxBudgetUsd๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ถœ ์ž„๊ณ„๊ฐ’์— ๋”ฐ๋ผ ํ„ด์„ ์ œํ•œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œํ•œ์ด ์—†์œผ๋ฉด Claude๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ฃจํ”„๊ฐ€ ์‹คํ–‰๋˜๋ฉฐ, ์ด๋Š” ์ž˜ ์ •์˜๋œ ์ž‘์—…์—๋Š” ๊ดœ์ฐฎ์ง€๋งŒ ๊ฐœ๋ฐฉํ˜• ํ”„๋กฌํ”„ํŠธ("์ด ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฐœ์„ ํ•˜์„ธ์š”")์—์„œ๋Š” ์˜ค๋ž˜ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์‚ฐ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ํ”„๋กœ๋•์…˜ ์—์ด์ „ํŠธ์— ์ข‹์€ ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค. ์˜ต์…˜ ์ฐธ์กฐ๋Š” ์•„๋ž˜์˜ ํ„ด๊ณผ ์˜ˆ์‚ฐ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฉ”์‹œ์ง€ ํƒ€์ž…

๋ฃจํ”„๊ฐ€ ์‹คํ–‰๋˜๋ฉด SDK๋Š” ๋ฉ”์‹œ์ง€ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ฉ”์‹œ์ง€๋Š” ๋ฃจํ”„์˜ ์–ด๋А ๋‹จ๊ณ„์—์„œ ์™”๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” ํƒ€์ž…์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. 5๊ฐ€์ง€ ํ•ต์‹ฌ ํƒ€์ž…์€:

  • SystemMessage: ์„ธ์…˜ ์ƒ๋ช…์ฃผ๊ธฐ ์ด๋ฒคํŠธ. subtype ํ•„๋“œ๊ฐ€ ์ด๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค: "init"์€ ์ฒซ ๋ฒˆ์งธ ๋ฉ”์‹œ์ง€(์„ธ์…˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ)์ด๊ณ , "compact_boundary"๋Š” ์••์ถ• ํ›„์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. TypeScript์—์„œ ์••์ถ• ๊ฒฝ๊ณ„๋Š” SDKSystemMessage์˜ ์„œ๋ธŒํƒ€์ž…์ด ์•„๋‹ˆ๋ผ ์ž์ฒด SDKCompactBoundaryMessage ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
  • AssistantMessage: ์ตœ์ข… ํ…์ŠคํŠธ ์ „์šฉ ์‘๋‹ต์„ ํฌํ•จํ•˜์—ฌ ๊ฐ Claude ์‘๋‹ต ํ›„์— ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ„ด์˜ ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ  ๋ธ”๋ก๊ณผ ๋„๊ตฌ ํ˜ธ์ถœ ๋ธ”๋ก์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • UserMessage: ๊ฐ ๋„๊ตฌ ์‹คํ–‰ ํ›„ Claude์—๊ฒŒ ๋‹ค์‹œ ์ „์†ก๋˜๋Š” ๋„๊ตฌ ๊ฒฐ๊ณผ ์ฝ˜ํ…์ธ ์™€ ํ•จ๊ป˜ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋ฃจํ”„ ์ค‘๊ฐ„์— ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋Œ€ํ•ด์„œ๋„ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • StreamEvent: ๋ถ€๋ถ„ ๋ฉ”์‹œ์ง€๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ์—๋งŒ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์›๋ณธ API ์ŠคํŠธ๋ฆฌ๋ฐ ์ด๋ฒคํŠธ(ํ…์ŠคํŠธ ๋ธํƒ€, ๋„๊ตฌ ์ž…๋ ฅ ์ฒญํฌ)๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆผ ์‘๋‹ต์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • ResultMessage: ์—์ด์ „ํŠธ ๋ฃจํ”„์˜ ๋์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ข… ํ…์ŠคํŠธ ๊ฒฐ๊ณผ, ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰, ๋น„์šฉ, ์„ธ์…˜ ID๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. subtype ํ•„๋“œ๋ฅผ ํ™•์ธํ•˜์—ฌ ์ž‘์—…์ด ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ๋˜๋Š” ์ œํ•œ์— ๋„๋‹ฌํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. prompt_suggestion๊ณผ ๊ฐ™์€ ์†Œ์ˆ˜์˜ ํ›„ํ–‰ ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ๊ฐ€ ์ดํ›„์— ๋„์ฐฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฒฐ๊ณผ์—์„œ ์ค‘๋‹จํ•˜์ง€ ๋ง๊ณ  ์ŠคํŠธ๋ฆผ์„ ์™„๋ฃŒ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ด 5๊ฐ€์ง€ ํƒ€์ž…์€ ๋‘ SDK ๋ชจ๋‘์—์„œ ์ „์ฒด ์—์ด์ „ํŠธ ๋ฃจํ”„ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค. TypeScript SDK๋Š” ๋˜ํ•œ ์ถ”๊ฐ€ ๊ด€์ฐฐ์„ฑ ์ด๋ฒคํŠธ(hook ์ด๋ฒคํŠธ, ๋„๊ตฌ ์ง„ํ–‰, ์†๋„ ์ œํ•œ, ์ž‘์—… ์•Œ๋ฆผ)๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ถ”๊ฐ€ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ๋ฃจํ”„๋ฅผ ๊ตฌ๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Python ๋ฉ”์‹œ์ง€ ํƒ€์ž… ์ฐธ์กฐ์™€ TypeScript ๋ฉ”์‹œ์ง€ ํƒ€์ž… ์ฐธ์กฐ์—์„œ ์ „์ฒด ๋ชฉ๋ก์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ

์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์‹œ์ง€๋Š” ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค:

  • ์ตœ์ข… ๊ฒฐ๊ณผ๋งŒ: ResultMessage๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ถœ๋ ฅ, ๋น„์šฉ, ์ž‘์—…์ด ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ๋˜๋Š” ์ œํ•œ์— ๋„๋‹ฌํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ง„ํ–‰ ์ƒํ™ฉ ์—…๋ฐ์ดํŠธ: AssistantMessage๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ Claude๊ฐ€ ๊ฐ ํ„ด์—์„œ ๋ฌด์—‡์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€, ์–ด๋–ค ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆฌ๋ฐ: ๋ถ€๋ถ„ ๋ฉ”์‹œ์ง€๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ(include_partial_messages Python, includePartialMessages TypeScript) ์‹ค์‹œ๊ฐ„์œผ๋กœ StreamEvent ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆผ ์‘๋‹ต์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฉ”์‹œ์ง€ ํƒ€์ž…์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ SDK์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค:

  • Python: claude_agent_sdk์—์„œ ๊ฐ€์ ธ์˜จ ํด๋ž˜์Šค์— ๋Œ€ํ•ด isinstance()๋กœ ๋ฉ”์‹œ์ง€ ํƒ€์ž…์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: isinstance(message, ResultMessage)).
  • TypeScript: type ๋ฌธ์ž์—ด ํ•„๋“œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: message.type === "result"). AssistantMessage์™€ UserMessage๋Š” ์›๋ณธ API ๋ฉ”์‹œ์ง€๋ฅผ .message ํ•„๋“œ์— ๋ž˜ํ•‘ํ•˜๋ฏ€๋กœ ์ฝ˜ํ…์ธ  ๋ธ”๋ก์€ message.content๊ฐ€ ์•„๋‹ˆ๋ผ message.message.content์— ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ์ œ: ๋ฉ”์‹œ์ง€ ํƒ€์ž… ํ™•์ธ ๋ฐ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ
from claude_agent_sdk import query, AssistantMessage, ResultMessage

async for message in query(prompt="Summarize this project"):
if isinstance(message, AssistantMessage):
print(f"Turn completed: {len(message.content)} content blocks")
if isinstance(message, ResultMessage):
if message.subtype == "success":
print(message.result)
else:
print(f"Stopped: {message.subtype}")

๋„๊ตฌ ์‹คํ–‰

๋„๊ตฌ๋Š” ์—์ด์ „ํŠธ์—๊ฒŒ ์กฐ์น˜๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ๊ฐ€ ์—†์œผ๋ฉด Claude๋Š” ํ…์ŠคํŠธ๋กœ๋งŒ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Claude๋Š” ํŒŒ์ผ์„ ์ฝ๊ณ , ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ , ์ฝ”๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ , ์™ธ๋ถ€ ์„œ๋น„์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด์žฅ ๋„๊ตฌ

SDK๋Š” Claude Code๋ฅผ ๊ตฌ๋™ํ•˜๋Š” ๋™์ผํ•œ ๋„๊ตฌ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:

์นดํ…Œ๊ณ ๋ฆฌ ๋„๊ตฌ ๊ธฐ๋Šฅ
ํŒŒ์ผ ์ž‘์—… Read, Edit, Write ํŒŒ์ผ ์ฝ๊ธฐ, ์ˆ˜์ •, ์ƒ์„ฑ
๊ฒ€์ƒ‰ Glob, Grep ํŒจํ„ด์œผ๋กœ ํŒŒ์ผ ์ฐพ๊ธฐ, ์ •๊ทœ์‹์œผ๋กœ ์ฝ˜ํ…์ธ  ๊ฒ€์ƒ‰
์‹คํ–‰ Bash ์…ธ ๋ช…๋ น, ์Šคํฌ๋ฆฝํŠธ, git ์ž‘์—… ์‹คํ–‰
์›น WebSearch, WebFetch ์›น ๊ฒ€์ƒ‰, ํŽ˜์ด์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ํŒŒ์‹ฑ
๊ฒ€์ƒ‰ ToolSearch ๋ชจ๋“  ๋„๊ตฌ๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•˜๋Š” ๋Œ€์‹  ํ•„์š”์— ๋”ฐ๋ผ ๋„๊ตฌ๋ฅผ ๋™์ ์œผ๋กœ ์ฐพ๊ณ  ๋กœ๋“œ
์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ Agent, Skill, AskUserQuestion, TaskCreate, TaskUpdate ์„œ๋ธŒ์—์ด์ „ํŠธ ์ƒ์„ฑ, ์Šคํ‚ฌ ํ˜ธ์ถœ, ์‚ฌ์šฉ์ž์—๊ฒŒ ์งˆ๋ฌธ, ์ž‘์—… ์ถ”์ 

๋‚ด์žฅ ๋„๊ตฌ ์™ธ์—๋„ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

๋„๊ตฌ ๊ถŒํ•œ

Claude๋Š” ์ž‘์—…์— ๋”ฐ๋ผ ํ˜ธ์ถœํ•  ๋„๊ตฌ๋ฅผ ๊ฒฐ์ •ํ•˜์ง€๋งŒ, ํ•ด๋‹น ํ˜ธ์ถœ์ด ์‹คํ–‰๋˜๋„๋ก ํ—ˆ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ๋„๊ตฌ๋ฅผ ์ž๋™ ์Šน์ธํ•˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ๋„๊ตฌ๋ฅผ ์™„์ „ํžˆ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜, ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ์Šน์ธ์„ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 3๊ฐ€์ง€ ์˜ต์…˜์ด ํ•จ๊ป˜ ์ž‘๋™ํ•˜์—ฌ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค:

  • allowed_tools / allowedTools ๋‚˜์—ด๋œ ๋„๊ตฌ๋ฅผ ์ž๋™ ์Šน์ธํ•ฉ๋‹ˆ๋‹ค. ["Read", "Glob", "Grep"]์ด ํ—ˆ์šฉ๋œ ๋„๊ตฌ ๋ชฉ๋ก์— ์žˆ๋Š” ์ฝ๊ธฐ ์ „์šฉ ์—์ด์ „ํŠธ๋Š” ํ”„๋กฌํ”„ํŠธ ์—†์ด ํ•ด๋‹น ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์—ด๋˜์ง€ ์•Š์€ ๋„๊ตฌ๋Š” ์—ฌ์ „ํžˆ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • disallowed_tools / disallowedTools ๋‹ค๋ฅธ ์„ค์ •์— ๊ด€๊ณ„์—†์ด ๋‚˜์—ด๋œ ๋„๊ตฌ๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ๊ทœ์น™์ด ํ™•์ธ๋˜๋Š” ์ˆœ์„œ๋Š” ๊ถŒํ•œ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • permission_mode / permissionMode ํ—ˆ์šฉ ๋˜๋Š” ๊ฑฐ๋ถ€ ๊ทœ์น™์œผ๋กœ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ๋„๊ตฌ์— ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“œ๋Š” ๊ถŒํ•œ ๋ชจ๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

"Bash(npm *)" ๊ฐ™์€ ๊ทœ์น™์œผ๋กœ ๊ฐœ๋ณ„ ๋„๊ตฌ์˜ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๊ทœ์น™ ๊ตฌ๋ฌธ์€ ๊ถŒํ•œ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋„๊ตฌ๊ฐ€ ๊ฑฐ๋ถ€๋˜๋ฉด Claude๋Š” ๋„๊ตฌ ๊ฒฐ๊ณผ๋กœ ๊ฑฐ๋ถ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‹œ๋„ํ•˜๊ฑฐ๋‚˜ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

๋ณ‘๋ ฌ ๋„๊ตฌ ์‹คํ–‰

Claude๊ฐ€ ๋‹จ์ผ ํ„ด์—์„œ ์—ฌ๋Ÿฌ ๋„๊ตฌ ํ˜ธ์ถœ์„ ์š”์ฒญํ•˜๋ฉด ๋‘ SDK ๋ชจ๋‘ ๋„๊ตฌ์— ๋”ฐ๋ผ ๋™์‹œ ๋˜๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์ „์šฉ ๋„๊ตฌ(Read, Glob, Grep, ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ํ‘œ์‹œ๋œ MCP ๋„๊ตฌ)๋Š” ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋„๊ตฌ(Edit, Write, Bash)๋Š” ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ๋„๊ตฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆœ์ฐจ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๋„๊ตฌ์— ๋Œ€ํ•ด ๋ณ‘๋ ฌ ์‹คํ–‰์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ์ฃผ์„์—์„œ readOnlyHint๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. TypeScript์™€ Python SDK ๋ชจ๋‘ MCP SDK์˜ ์ด ํ•„๋“œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฃจํ”„ ์‹คํ–‰ ๋ฐฉ์‹ ์ œ์–ด

๋ฃจํ”„๊ฐ€ ์ทจํ•˜๋Š” ํ„ด ์ˆ˜, ๋น„์šฉ, Claude๊ฐ€ ์ถ”๋ก ํ•˜๋Š” ๊นŠ์ด, ๋„๊ตฌ๊ฐ€ ์‹คํ–‰ ์ „์— ์Šน์ธ์„ ์š”๊ตฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์€ ClaudeAgentOptions(Python) / Options(TypeScript)์˜ ํ•„๋“œ์ž…๋‹ˆ๋‹ค.

ํ„ด๊ณผ ์˜ˆ์‚ฐ

์˜ต์…˜ ์ œ์–ด ๋Œ€์ƒ ๊ธฐ๋ณธ๊ฐ’
์ตœ๋Œ€ ํ„ด(max_turns / maxTurns) ์ตœ๋Œ€ ๋„๊ตฌ ์‚ฌ์šฉ ์™•๋ณต ์ œํ•œ ์—†์Œ
์ตœ๋Œ€ ์˜ˆ์‚ฐ(max_budget_usd / maxBudgetUsd) ์ค‘์ง€ ์ „ ์ตœ๋Œ€ ๋น„์šฉ ์ œํ•œ ์—†์Œ

์ œํ•œ ์ค‘ ํ•˜๋‚˜์— ๋„๋‹ฌํ•˜๋ฉด SDK๋Š” ํ•ด๋‹น ์˜ค๋ฅ˜ ์„œ๋ธŒํƒ€์ž…(error_max_turns ๋˜๋Š” error_max_budget_usd)์ด ์žˆ๋Š” ResultMessage๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„œ๋ธŒํƒ€์ž…์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜๊ณ , ๊ตฌ๋ฌธ์€ ClaudeAgentOptions / Options๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋…ธ๋ ฅ ์ˆ˜์ค€

effort ์˜ต์…˜์€ Claude๊ฐ€ ์ ์šฉํ•˜๋Š” ์ถ”๋ก ์˜ ์–‘์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ๋‚ฎ์€ ๋…ธ๋ ฅ ์ˆ˜์ค€์€ ํ„ด๋‹น ๋” ์ ์€ ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๊ณ  ๋น„์šฉ์„ ์ค„์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ชจ๋ธ์ด ๋…ธ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์–ด๋–ค ๋ชจ๋ธ์ด ์ง€์›ํ•˜๋Š”์ง€๋Š” ๋…ธ๋ ฅ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ˆ˜์ค€ ๋™์ž‘ ์ ํ•ฉํ•œ ๊ฒฝ์šฐ
"low" ์ตœ์†Œ ์ถ”๋ก , ๋น ๋ฅธ ์‘๋‹ต ํŒŒ์ผ ์กฐํšŒ, ๋””๋ ‰ํ† ๋ฆฌ ๋‚˜์—ด
"medium" ๊ท ํ˜• ์žกํžŒ ์ถ”๋ก  ์ผ์ƒ์ ์ธ ํŽธ์ง‘, ํ‘œ์ค€ ์ž‘์—…
"high" ์ฒ ์ €ํ•œ ๋ถ„์„ ๋ฆฌํŒฉํ† ๋ง, ๋””๋ฒ„๊น…
"xhigh" ํ™•์žฅ๋œ ์ถ”๋ก  ๊นŠ์ด ์ฝ”๋”ฉ ๋ฐ ์—์ด์ „ํŠธ ์ž‘์—…; Opus 4.7์—์„œ ๊ถŒ์žฅ
"max" ์ตœ๋Œ€ ์ถ”๋ก  ๊นŠ์ด ๊นŠ์€ ๋ถ„์„์ด ํ•„์š”ํ•œ ๋‹ค๋‹จ๊ณ„ ๋ฌธ์ œ

effort๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด Python SDK๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘๊ณ  ๋ชจ๋ธ์˜ ๊ธฐ๋ณธ ๋™์ž‘์œผ๋กœ ๋ฏธ๋ฃน๋‹ˆ๋‹ค. TypeScript SDK๋Š” ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ "high"๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•˜๊ณ  ์ž˜ ์ •์˜๋œ ์ž‘์—…(ํŒŒ์ผ ๋‚˜์—ด ๋˜๋Š” ๋‹จ์ผ grep ์‹คํ–‰)์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์—์ด์ „ํŠธ์˜ ๊ฒฝ์šฐ ๋น„์šฉ๊ณผ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋‚ฎ์€ ๋…ธ๋ ฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์„ธ์…˜์— ๋Œ€ํ•ด ์ตœ์ƒ์œ„ query() ์˜ต์…˜์—์„œ effort๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, AgentDefinition์˜ effort ํ•„๋“œ๋กœ ์„œ๋ธŒ์—์ด์ „ํŠธ๋‹น ์„ค์ •ํ•˜์—ฌ ์„ธ์…˜ ์ˆ˜์ค€์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ถŒํ•œ ๋ชจ๋“œ

๊ถŒํ•œ ๋ชจ๋“œ ์˜ต์…˜(Python์˜ permission_mode, TypeScript์˜ permissionMode)์€ ์—์ด์ „ํŠธ๊ฐ€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์Šน์ธ์„ ์š”์ฒญํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค:

๋ชจ๋“œ ๋™์ž‘
"default" ํ—ˆ์šฉ ๊ทœ์น™์œผ๋กœ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ๋„๊ตฌ๋Š” ์Šน์ธ ์ฝœ๋ฐฑ์„ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค; ์ฝœ๋ฐฑ์ด ์—†์œผ๋ฉด ๊ฑฐ๋ถ€
"acceptEdits" ํŒŒ์ผ ํŽธ์ง‘ ๋ฐ ์ผ๋ฐ˜์ ์ธ ํŒŒ์ผ์‹œ์Šคํ…œ ๋ช…๋ น(mkdir, touch, mv, cp ๋“ฑ)์„ ์ž๋™ ์Šน์ธํ•ฉ๋‹ˆ๋‹ค; ๋‹ค๋ฅธ Bash ๋ช…๋ น์€ ๊ธฐ๋ณธ ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค
"plan" ์ฝ๊ธฐ ์ „์šฉ ๋„๊ตฌ ์‹คํ–‰; Claude๋Š” ์†Œ์Šค ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜์ง€ ์•Š๊ณ  ํƒ์ƒ‰ํ•˜๊ณ  ๊ณ„ํš์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
"dontAsk" ์ ˆ๋Œ€ ํ”„๋กฌํ”„ํŠธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ถŒํ•œ ๊ทœ์น™์œผ๋กœ ์‚ฌ์ „ ์Šน์ธ๋œ ๋„๊ตฌ๊ฐ€ ์‹คํ–‰๋˜๊ณ , ๋‚˜๋จธ์ง€๋Š” ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค
"auto"(TypeScript๋งŒ) ๋ชจ๋ธ ๋ถ„๋ฅ˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๋„๊ตฌ ํ˜ธ์ถœ์„ ์Šน์ธํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์šฉ์„ฑ ๋ฐ ๋™์ž‘์€ ์ž๋™ ๋ชจ๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”
"bypassPermissions" ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋“  ํ—ˆ์šฉ๋œ ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. Unix์—์„œ ๋ฃจํŠธ๋กœ ์‹คํ–‰ํ•  ๋•Œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ์˜ ์กฐ์น˜๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ์‹œ์Šคํ…œ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์—†๋Š” ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค

๋Œ€ํ™”ํ˜• ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ "default"๋ฅผ ๋„๊ตฌ ์Šน์ธ ์ฝœ๋ฐฑ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์Šน์ธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ๋จธ์‹ ์˜ ์ž์œจ ์—์ด์ „ํŠธ์˜ ๊ฒฝ์šฐ "acceptEdits"๋Š” ํŒŒ์ผ ํŽธ์ง‘ ๋ฐ ์ผ๋ฐ˜์ ์ธ ํŒŒ์ผ์‹œ์Šคํ…œ ๋ช…๋ น(mkdir, touch, mv, cp ๋“ฑ)์„ ์ž๋™ ์Šน์ธํ•˜๋ฉด์„œ ๋‹ค๋ฅธ Bash ๋ช…๋ น์„ ํ—ˆ์šฉ ๊ทœ์น™ ๋’ค์— ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. CI, ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” ๊ธฐํƒ€ ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์— ๋Œ€ํ•ด "bypassPermissions"๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์„ธ๋ถ€ ์ •๋ณด๋Š” ๊ถŒํ•œ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ชจ๋ธ

model์„ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด SDK๋Š” Claude Code์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด๋Š” ์ธ์ฆ ๋ฐฉ๋ฒ• ๋ฐ ๊ตฌ๋…์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํŠน์ • ๋ชจ๋ธ์„ ๊ณ ์ •ํ•˜๊ฑฐ๋‚˜ ๋” ๋น ๋ฅด๊ณ  ์ €๋ ดํ•œ ์—์ด์ „ํŠธ๋ฅผ ์œ„ํ•ด ๋” ์ž‘์€ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: model="claude-sonnet-4-6"). ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ID๋Š” ๋ชจ๋ธ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ

์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ๋Š” ์„ธ์…˜ ์ค‘์— Claude๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด ์ •๋ณด๋Ÿ‰์ž…๋‹ˆ๋‹ค. ์„ธ์…˜ ๋‚ด์˜ ํ„ด ์‚ฌ์ด์— ์žฌ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ๋ˆ„์ ๋ฉ๋‹ˆ๋‹ค: ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ, ๋„๊ตฌ ์ •์˜, ๋Œ€ํ™” ๊ธฐ๋ก, ๋„๊ตฌ ์ž…๋ ฅ, ๋„๊ตฌ ์ถœ๋ ฅ. ํ„ด ์ „์ฒด์—์„œ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜๋Š” ์ฝ˜ํ…์ธ (์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ, ๋„๊ตฌ ์ •์˜, CLAUDE.md)๋Š” ์ž๋™์œผ๋กœ ํ”„๋กฌํ”„ํŠธ ์บ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ˜๋ณต๋œ ์ ‘๋‘์‚ฌ์— ๋Œ€ํ•œ ๋น„์šฉ๊ณผ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์ค„์ž…๋‹ˆ๋‹ค.

์ปจํ…์ŠคํŠธ๋ฅผ ์†Œ๋น„ํ•˜๋Š” ๊ฒƒ

SDK์—์„œ ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ปจํ…์ŠคํŠธ์— ์–ด๋–ป๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

์†Œ์Šค ๋กœ๋“œ ์‹œ๊ธฐ ์˜ํ–ฅ
์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ๋ชจ๋“  ์š”์ฒญ ์ž‘์€ ๊ณ ์ • ๋น„์šฉ, ํ•ญ์ƒ ์กด์žฌ
CLAUDE.md ํŒŒ์ผ ์„ธ์…˜ ์‹œ์ž‘, settingSources๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ์š”์ฒญ์—์„œ ์ „์ฒด ์ฝ˜ํ…์ธ (ํ”„๋กฌํ”„ํŠธ ์บ์‹œ๋˜๋ฏ€๋กœ ์ฒซ ๋ฒˆ์งธ ์š”์ฒญ๋งŒ ์ „์ฒด ๋น„์šฉ ์ง€๋ถˆ)
๋„๊ตฌ ์ •์˜ ๋ชจ๋“  ์š”์ฒญ; MCP ์Šคํ‚ค๋งˆ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์—ฐ๋จ ๊ธฐ๋ณธ ์ œ๊ณต ๋„๊ตฌ ์Šคํ‚ค๋งˆ๋Š” ๋ชจ๋“  ์š”์ฒญ์—์„œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ ๊ฒ€์ƒ‰์€ ๊ธฐ๋ณธ์ ์œผ๋กœ MCP ๋„๊ตฌ ์Šคํ‚ค๋งˆ๋ฅผ ์ง€์—ฐ์‹œํ‚ค๋ฉฐ, Vertex AI ๋˜๋Š” ๋น„์ž์‚ฌ ANTHROPIC_BASE_URL์—์„œ ์‚ฌ์ „ ๋กœ๋“œ๋กœ ํด๋ฐฑํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋งคํŠธ๋ฆญ์Šค๋Š” ๋„๊ตฌ ๊ฒ€์ƒ‰ ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”
๋Œ€ํ™” ๊ธฐ๋ก ํ„ด์— ๊ฑธ์ณ ๋ˆ„์  ๊ฐ ํ„ด์œผ๋กœ ์ฆ๊ฐ€: ํ”„๋กฌํ”„ํŠธ, ์‘๋‹ต, ๋„๊ตฌ ์ž…๋ ฅ, ๋„๊ตฌ ์ถœ๋ ฅ
์Šคํ‚ฌ ์„ค๋ช… ์„ธ์…˜ ์‹œ์ž‘, ์„ค์ • ์†Œ์Šค๋ฅผ ํ†ตํ•ด ์งง์€ ์š”์•ฝ; ์ „์ฒด ์ฝ˜ํ…์ธ ๋Š” ํ˜ธ์ถœ๋  ๋•Œ๋งŒ ๋กœ๋“œ

ํฐ ๋„๊ตฌ ์ถœ๋ ฅ์€ ์ƒ๋‹นํ•œ ์ปจํ…์ŠคํŠธ๋ฅผ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค. ํฐ ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ ์ž์„ธํ•œ ์ถœ๋ ฅ์ด ์žˆ๋Š” ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹จ์ผ ํ„ด์—์„œ ์ˆ˜์ฒœ ๊ฐœ์˜ ํ† ํฐ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ๋Š” ํ„ด์— ๊ฑธ์ณ ๋ˆ„์ ๋˜๋ฏ€๋กœ ๋งŽ์€ ๋„๊ตฌ ํ˜ธ์ถœ์ด ์žˆ๋Š” ๋” ๊ธด ์„ธ์…˜์€ ์งง์€ ์„ธ์…˜๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.

์ž๋™ ์••์ถ•

์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ๊ฐ€ ์ œํ•œ์— ๊ฐ€๊นŒ์›Œ์ง€๋ฉด SDK๋Š” ์ž๋™์œผ๋กœ ๋Œ€ํ™”๋ฅผ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค: ๋” ์˜ค๋ž˜๋œ ๊ธฐ๋ก์„ ์š”์•ฝํ•˜์—ฌ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๊ณ , ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ๊ตํ™˜๊ณผ ์ฃผ์š” ๊ฒฐ์ •์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. SDK๋Š” ์ด๊ฒƒ์ด ๋ฐœ์ƒํ•  ๋•Œ ์ŠคํŠธ๋ฆผ์—์„œ type: "system"๊ณผ subtype: "compact_boundary"๊ฐ€ ์žˆ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค(Python์—์„œ๋Š” SystemMessage; TypeScript์—์„œ๋Š” ๋ณ„๋„์˜ SDKCompactBoundaryMessage ํƒ€์ž…).

์••์ถ•์€ ๋” ์˜ค๋ž˜๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์š”์•ฝ์œผ๋กœ ๋ฐ”๊พธ๋ฏ€๋กœ ๋Œ€ํ™” ์ดˆ๊ธฐ์˜ ํŠน์ • ์ง€์นจ์ด ๋ณด์กด๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์†์ ์ธ ๊ทœ์น™์€ ์ดˆ๊ธฐ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ CLAUDE.md์— ์†ํ•ฉ๋‹ˆ๋‹ค(settingSources๋ฅผ ํ†ตํ•ด ๋กœ๋“œ๋จ). CLAUDE.md ์ฝ˜ํ…์ธ ๋Š” ๋ชจ๋“  ์š”์ฒญ์—์„œ ๋‹ค์‹œ ์ฃผ์ž…๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์••์ถ• ๋™์ž‘์„ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • CLAUDE.md์˜ ์š”์•ฝ ์ง€์นจ: ์••์ถ•๊ธฐ๋Š” ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์ฒ˜๋Ÿผ CLAUDE.md๋ฅผ ์ฝ์œผ๋ฏ€๋กœ ์š”์•ฝํ•  ๋•Œ ๋ณด์กดํ•  ๋‚ด์šฉ์„ ์•Œ๋ ค์ฃผ๋Š” ์„น์…˜์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„น์…˜ ํ—ค๋”๋Š” ์ž์œ  ํ˜•์‹์ž…๋‹ˆ๋‹ค(๋งค์ง ๋ฌธ์ž์—ด์ด ์•„๋‹˜); ์••์ถ•๊ธฐ๋Š” ์˜๋„์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • PreCompact hook: ์••์ถ• ์ „์— ์‚ฌ์šฉ์ž ์ •์˜ ๋กœ์ง์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ์ „์ฒด ๊ธฐ๋ก์„ ๋ณด๊ด€). hook์€ trigger ํ•„๋“œ(manual ๋˜๋Š” auto)๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. hooks๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
  • ์ˆ˜๋™ ์••์ถ•: /compact๋ฅผ ํ”„๋กฌํ”„ํŠธ ๋ฌธ์ž์—ด๋กœ ๋ณด๋‚ด ํ•„์š”์— ๋”ฐ๋ผ ์••์ถ•์„ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์œผ๋กœ ์ „์†ก๋œ ๋ช…๋ น์€ SDK ์ž…๋ ฅ์ด๋ฉฐ, CLI ์ „์šฉ ๋ฐ”๋กœ ๊ฐ€๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. SDK์˜ ์Šฌ๋ž˜์‹œ ๋ช…๋ น์„ ์ฐธ์กฐํ•˜์„ธ์š”.
์˜ˆ์ œ: CLAUDE.md์˜ ์š”์•ฝ ์ง€์นจ

ํ”„๋กœ์ ํŠธ์˜ CLAUDE.md์— ์„น์…˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์••์ถ•๊ธฐ์— ๋ณด์กดํ•  ๋‚ด์šฉ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ํ—ค๋” ์ด๋ฆ„์€ ํŠน๋ณ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค; ๋ช…ํ™•ํ•œ ๋ ˆ์ด๋ธ”์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

# ์š”์•ฝ ์ง€์นจ

์ด ๋Œ€ํ™”๋ฅผ ์š”์•ฝํ•  ๋•Œ ํ•ญ์ƒ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค:
- ํ˜„์žฌ ์ž‘์—… ๋ชฉํ‘œ ๋ฐ ์ˆ˜์šฉ ๊ธฐ์ค€
- ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•œ ํŒŒ์ผ ๊ฒฝ๋กœ
- ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ๋ฐ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€
- ๊ฒฐ์ • ๋ฐ ๊ทธ ๋’ค์˜ ์ถ”๋ก 

์ปจํ…์ŠคํŠธ ํšจ์œจ์„ฑ ์œ ์ง€

์žฅ๊ธฐ ์‹คํ–‰ ์—์ด์ „ํŠธ๋ฅผ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ „๋žต:

  • ์„œ๋ธŒ์ž‘์—…์— ์„œ๋ธŒ์—์ด์ „ํŠธ ์‚ฌ์šฉ. ๊ฐ ์„œ๋ธŒ์—์ด์ „ํŠธ๋Š” ์ƒˆ๋กœ์šด ๋Œ€ํ™”๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค(์ด์ „ ๋ฉ”์‹œ์ง€ ๊ธฐ๋ก ์—†์Œ, ์ž์‹ ์˜ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ๋ฐ CLAUDE.md ๊ฐ™์€ ํ”„๋กœ์ ํŠธ ์ˆ˜์ค€ ์ปจํ…์ŠคํŠธ๋Š” ๋กœ๋“œํ•จ). ๋ถ€๋ชจ์˜ ํ„ด์„ ๋ณด์ง€ ์•Š์œผ๋ฉฐ, ์ตœ์ข… ์‘๋‹ต๋งŒ ๋„๊ตฌ ๊ฒฐ๊ณผ๋กœ ๋ถ€๋ชจ์—๊ฒŒ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ฃผ ์—์ด์ „ํŠธ์˜ ์ปจํ…์ŠคํŠธ๋Š” ์ „์ฒด ์„œ๋ธŒ์ž‘์—… ๊ธฐ๋ก์ด ์•„๋‹ˆ๋ผ ํ•ด๋‹น ์š”์•ฝ์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ธŒ์—์ด์ „ํŠธ๊ฐ€ ์ƒ์†ํ•˜๋Š” ๊ฒƒ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  • ๋„๊ตฌ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋„๊ตฌ ์ •์˜๋Š” ์ปจํ…์ŠคํŠธ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. AgentDefinition์˜ tools ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ธŒ์—์ด์ „ํŠธ๋ฅผ ํ•„์š”ํ•œ ์ตœ์†Œ ์„ธํŠธ๋กœ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • MCP ์„œ๋ฒ„ ๋น„์šฉ์„ ์ฃผ์‹œํ•ฉ๋‹ˆ๋‹ค. MCP ๋„๊ตฌ ๊ฒ€์ƒ‰์€ ๊ธฐ๋ณธ์ ์œผ๋กœ MCP ๋„๊ตฌ ์Šคํ‚ค๋งˆ๋ฅผ ์ง€์—ฐ์‹œํ‚ค๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ ๊ฒ€์ƒ‰์ด ๊บผ์ ธ ์žˆ๊ฑฐ๋‚˜, Vertex AI์— ์žˆ๊ฑฐ๋‚˜, ๋น„์ž์‚ฌ ANTHROPIC_BASE_URL ๋’ค์— ์žˆ์œผ๋ฉด ๊ฐ MCP ์„œ๋ฒ„๋Š” ๋ชจ๋“  ๋„๊ตฌ ์Šคํ‚ค๋งˆ๋ฅผ ๋ชจ๋“  ์š”์ฒญ์— ์ถ”๊ฐ€ํ•˜๋ฏ€๋กœ ๋งŽ์€ ๋„๊ตฌ๊ฐ€ ์žˆ๋Š” ๋ช‡ ๊ฐœ์˜ ์„œ๋ฒ„๋Š” ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์ƒ๋‹นํ•œ ์ปจํ…์ŠคํŠธ๋ฅผ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ผ์ƒ์ ์ธ ์ž‘์—…์— ๋‚ฎ์€ ๋…ธ๋ ฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋‚˜์—ดํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ์—์ด์ „ํŠธ์˜ ๊ฒฝ์šฐ ๋…ธ๋ ฅ์„ "low"๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ๋น„์šฉ์„ ์ค„์ž…๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ๋ณ„ ์ปจํ…์ŠคํŠธ ๋น„์šฉ์˜ ์ž์„ธํ•œ ๋ถ„์„์€ ์ปจํ…์ŠคํŠธ ๋น„์šฉ ์ดํ•ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์„ธ์…˜ ๋ฐ ์—ฐ์†์„ฑ

SDK์™€์˜ ๊ฐ ์ƒํ˜ธ์ž‘์šฉ์€ ์„ธ์…˜์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. ResultMessage.session_id์—์„œ ์„ธ์…˜ ID๋ฅผ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค(๋‘ SDK ๋ชจ๋‘์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ). TypeScript SDK๋Š” ๋˜ํ•œ init SystemMessage์˜ ์ง์ ‘ ํ•„๋“œ๋กœ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค; Python์—์„œ๋Š” SystemMessage.data์— ์ค‘์ฒฉ๋ฉ๋‹ˆ๋‹ค.

์žฌ๊ฐœํ•  ๋•Œ ์ด์ „ ํ„ด์˜ ์ „์ฒด ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ณต์›๋ฉ๋‹ˆ๋‹ค: ์ฝ์€ ํŒŒ์ผ, ์ˆ˜ํ–‰๋œ ๋ถ„์„, ์ทจํ•œ ์กฐ์น˜. ์›๋ณธ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ๋ถ„๊ธฐํ•˜๊ธฐ ์œ„ํ•ด ์„ธ์…˜์„ ํฌํฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฌ๊ฐœ, ๊ณ„์†, ํฌํฌ ํŒจํ„ด์˜ ์ „์ฒด ๊ฐ€์ด๋“œ๋Š” ์„ธ์…˜ ๊ด€๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ

๋ฃจํ”„๊ฐ€ ๋๋‚˜๋ฉด ResultMessage๋Š” ๋ฌด์—‡์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ์•Œ๋ ค์ฃผ๊ณ  ์ถœ๋ ฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. subtype ํ•„๋“œ(๋‘ SDK ๋ชจ๋‘์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)๋Š” ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ์ฃผ์š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ ์„œ๋ธŒํƒ€์ž… ๋ฌด์—‡์ด ์ผ์–ด๋‚ฌ๋Š”๊ฐ€ result ํ•„๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ?
success Claude๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘์—…์„ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค ์˜ˆ
error_max_turns ์™„๋ฃŒ ์ „์— maxTurns ์ œํ•œ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค ์•„๋‹ˆ์˜ค
error_max_budget_usd ์™„๋ฃŒ ์ „์— maxBudgetUsd ์ œํ•œ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค ์•„๋‹ˆ์˜ค
error_during_execution ์˜ค๋ฅ˜๊ฐ€ ๋ฃจํ”„๋ฅผ ์ค‘๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: API ์‹คํŒจ ๋˜๋Š” ์ทจ์†Œ๋œ ์š”์ฒญ) ์•„๋‹ˆ์˜ค
error_max_structured_output_retries ๊ตฌ์กฐํ™”๋œ ์ถœ๋ ฅ ๊ฒ€์ฆ์ด ๊ตฌ์„ฑ๋œ ์žฌ์‹œ๋„ ์ œํ•œ ํ›„ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค ์•„๋‹ˆ์˜ค

result ํ•„๋“œ(์ตœ์ข… ํ…์ŠคํŠธ ์ถœ๋ ฅ)๋Š” success ๋ณ€ํ˜•์—๋งŒ ์กด์žฌํ•˜๋ฏ€๋กœ ํ•ญ์ƒ ์ฝ๊ธฐ ์ „์— ์„œ๋ธŒํƒ€์ž…์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒฐ๊ณผ ์„œ๋ธŒํƒ€์ž…์€ total_cost_usd, usage, num_turns, session_id๋ฅผ ์ „๋‹ฌํ•˜๋ฏ€๋กœ ๋น„์šฉ์„ ์ถ”์ ํ•˜๊ณ  ์˜ค๋ฅ˜ ํ›„์—๋„ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Python์—์„œ total_cost_usd์™€ usage๋Š” ์„ ํƒ์ ์œผ๋กœ ์ž…๋ ฅ๋˜๋ฉฐ ์ผ๋ถ€ ์˜ค๋ฅ˜ ๊ฒฝ๋กœ์—์„œ None์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ˜•์‹์„ ์ง€์ •ํ•˜๊ธฐ ์ „์— ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. usage ํ•„๋“œ ํ•ด์„์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋Š” ๋น„์šฉ ๋ฐ ์‚ฌ์šฉ๋Ÿ‰ ์ถ”์ ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ฒฐ๊ณผ๋Š” ๋˜ํ•œ ๋ชจ๋ธ์ด ์ตœ์ข… ํ„ด์—์„œ ์ƒ์„ฑ์„ ์ค‘์ง€ํ•œ ์ด์œ ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” stop_reason ํ•„๋“œ(TypeScript์—์„œ string | null, Python์—์„œ str | None)๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฐ’์€ end_turn(๋ชจ๋ธ์ด ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋จ), max_tokens(์ถœ๋ ฅ ํ† ํฐ ์ œํ•œ์— ๋„๋‹ฌํ•จ), refusal(๋ชจ๋ธ์ด ์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•จ)์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ ์„œ๋ธŒํƒ€์ž…์—์„œ stop_reason์€ ๋ฃจํ”„๊ฐ€ ๋๋‚˜๊ธฐ ์ „์˜ ๋งˆ์ง€๋ง‰ ์–ด์‹œ์Šคํ„ดํŠธ ์‘๋‹ต์˜ ๊ฐ’์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ถ€๋ฅผ ๊ฐ์ง€ํ•˜๋ ค๋ฉด stop_reason === "refusal"(TypeScript) ๋˜๋Š” stop_reason == "refusal"(Python)์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ํƒ€์ž…์€ SDKResultMessage(TypeScript) ๋˜๋Š” ResultMessage(Python)์„ ์ฐธ์กฐํ•˜์„ธ์š”.

Hooks

Hooks๋Š” ๋ฃจํ”„์˜ ํŠน์ • ์ง€์ ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ฝœ๋ฐฑ์ž…๋‹ˆ๋‹ค: ๋„๊ตฌ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „, ๋ฐ˜ํ™˜๋œ ํ›„, ์—์ด์ „ํŠธ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ ๋“ฑ. ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ผ๋ถ€ hooks๋Š”:

Hook ๋ฐœ์ƒ ์‹œ๊ธฐ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ
PreToolUse ๋„๊ตฌ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „ ์ž…๋ ฅ ๊ฒ€์ฆ, ์œ„ํ—˜ํ•œ ๋ช…๋ น ์ฐจ๋‹จ
PostToolUse ๋„๊ตฌ๊ฐ€ ๋ฐ˜ํ™˜๋œ ํ›„ ์ถœ๋ ฅ ๊ฐ์‚ฌ, ๋ถ€์ž‘์šฉ ํŠธ๋ฆฌ๊ฑฐ
UserPromptSubmit ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์ „์†ก๋  ๋•Œ ํ”„๋กฌํ”„ํŠธ์— ์ถ”๊ฐ€ ์ปจํ…์ŠคํŠธ ์ฃผ์ž…
Stop ์—์ด์ „ํŠธ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ ๊ฒฐ๊ณผ ๊ฒ€์ฆ, ์„ธ์…˜ ์ƒํƒœ ์ €์žฅ
SubagentStart / SubagentStop ์„œ๋ธŒ์—์ด์ „ํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์™„๋ฃŒ๋  ๋•Œ ๋ณ‘๋ ฌ ์ž‘์—… ๊ฒฐ๊ณผ ์ถ”์  ๋ฐ ์ง‘๊ณ„
PreCompact ์ปจํ…์ŠคํŠธ ์••์ถ• ์ „ ์š”์•ฝ ์ „์— ์ „์ฒด ๊ธฐ๋ก ๋ณด๊ด€

Hooks๋Š” ์—์ด์ „ํŠธ์˜ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ ๋‚ด๊ฐ€ ์•„๋‹ˆ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ ์ปจํ…์ŠคํŠธ๋ฅผ ์†Œ๋น„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Hooks๋Š” ๋˜ํ•œ ๋ฃจํ”„๋ฅผ ๋‹จ๋ฝ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ๋„๊ตฌ ํ˜ธ์ถœ์„ ๊ฑฐ๋ถ€ํ•˜๋Š” PreToolUse hook์€ ์‹คํ–‰์„ ๋ฐฉ์ง€ํ•˜๊ณ  Claude๋Š” ๊ฑฐ๋ถ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋Œ€์‹  ๋ฐ›์Šต๋‹ˆ๋‹ค.

๋‘ SDK ๋ชจ๋‘ ์œ„์˜ ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. TypeScript SDK๋Š” Python์ด ์•„์ง ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ถ”๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์ด๋ฒคํŠธ ๋ชฉ๋ก, SDK๋ณ„ ๊ฐ€์šฉ์„ฑ, ์ „์ฒด ์ฝœ๋ฐฑ API๋Š” hooks๋กœ ์‹คํ–‰ ์ œ์–ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ชจ๋‘ ํ•จ๊ป˜ ์‚ฌ์šฉ

์ด ์˜ˆ์ œ๋Š” ์ด ํŽ˜์ด์ง€์˜ ์ฃผ์š” ๊ฐœ๋…์„ ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋‹จ์ผ ์—์ด์ „ํŠธ๋กœ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋œ ๋„๊ตฌ(์ž๋™ ์Šน์ธ๋˜๋ฏ€๋กœ ์—์ด์ „ํŠธ๊ฐ€ ์ž์œจ์ ์œผ๋กœ ์‹คํ–‰๋จ), ํ”„๋กœ์ ํŠธ ์„ค์ •, ํ„ด ๋ฐ ์ถ”๋ก  ๋…ธ๋ ฅ์— ๋Œ€ํ•œ ์•ˆ์ „ ์ œํ•œ์œผ๋กœ ์—์ด์ „ํŠธ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํ”„๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์ž ์žฌ์  ์žฌ๊ฐœ๋ฅผ ์œ„ํ•ด ์„ธ์…˜ ID๋ฅผ ์บก์ฒ˜ํ•˜๊ณ , ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ด ๋น„์šฉ์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.

import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage


async def run_agent():
session_id = None

async for message in query(
prompt="Find and fix the bug causing test failures in the auth module",
options=ClaudeAgentOptions(
allowed_tools=[
"Read",
"Edit",
"Bash",
"Glob",
"Grep",
],  # Listing tools here auto-approves them (no prompting)
setting_sources=[
"project"
],  # Load CLAUDE.md, skills, hooks from current directory
max_turns=30,  # Prevent runaway sessions
effort="high",  # Thorough reasoning for complex debugging
),
):
# Handle the final result
if isinstance(message, ResultMessage):
session_id = message.session_id  # Save for potential resumption

if message.subtype == "success":
print(f"Done: {message.result}")
elif message.subtype == "error_max_turns":
# Agent ran out of turns. Resume with a higher limit.
print(f"Hit turn limit. Resume session {session_id} to continue.")
elif message.subtype == "error_max_budget_usd":
print("Hit budget limit.")
else:
print(f"Stopped: {message.subtype}")
if message.total_cost_usd is not None:
print(f"Cost: ${message.total_cost_usd:.4f}")


asyncio.run(run_agent())

๋‹ค์Œ ๋‹จ๊ณ„

์ด์ œ ๋ฃจํ”„๋ฅผ ์ดํ•ดํ–ˆ์œผ๋ฏ€๋กœ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์— ๋”ฐ๋ผ ๋‹ค์Œ ์œ„์น˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค:

  • ์•„์ง ์—์ด์ „ํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์•˜๋‚˜์š”? ๋น ๋ฅธ ์‹œ์ž‘์œผ๋กœ ์‹œ์ž‘ํ•˜์—ฌ SDK๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๋์—์„œ ๋๊นŒ์ง€ ์‹คํ–‰๋˜๋Š” ์ „์ฒด ์˜ˆ์ œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋กœ์ ํŠธ์— ์—ฐ๊ฒฐํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‚˜์š”? CLAUDE.md, ์Šคํ‚ฌ, ํŒŒ์ผ์‹œ์Šคํ…œ hooks ๋กœ๋“œํ•˜์—ฌ ์—์ด์ „ํŠธ๊ฐ€ ํ”„๋กœ์ ํŠธ ๊ทœ์น™์„ ์ž๋™์œผ๋กœ ๋”ฐ๋ฅด๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€ํ™”ํ˜• UI๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์žˆ๋‚˜์š”? ์ŠคํŠธ๋ฆฌ๋ฐ์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ ๋ฃจํ”„๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ๋ผ์ด๋ธŒ ํ…์ŠคํŠธ ๋ฐ ๋„๊ตฌ ํ˜ธ์ถœ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • ์—์ด์ „ํŠธ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋” ์—„๊ฒฉํ•œ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•˜์‹ ๊ฐ€์š”? ๊ถŒํ•œ์œผ๋กœ ๋„๊ตฌ ์ ‘๊ทผ์„ ์ž ๊ทธ๊ณ , hooks๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ ์ „์— ๋„๊ตฌ ํ˜ธ์ถœ์„ ๊ฐ์‚ฌ, ์ฐจ๋‹จ ๋˜๋Š” ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์žฅ๊ธฐ ๋˜๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋‚˜์š”? ๊ฒฉ๋ฆฌ๋œ ์ž‘์—…์„ ์„œ๋ธŒ์—์ด์ „ํŠธ๋กœ ์˜คํ”„๋กœ๋“œํ•˜์—ฌ ์ฃผ ์ปจํ…์ŠคํŠธ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์—์ด์ „ํŠธ ๋ฃจํ”„์˜ ๋” ๊ด‘๋ฒ”์œ„ํ•œ ๊ฐœ๋…์  ๊ทธ๋ฆผ(SDK ํŠน์ •์ด ์•„๋‹˜)์€ Claude Code์˜ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.