์ธ์ ์ผ๋ก ์์ ํ๊ธฐ
์ธ์ ์ด ์์ด์ ํธ ๋ํ ๊ธฐ๋ก์ ์ด๋ป๊ฒ ์ ์งํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด์ ์คํ์ผ๋ก ๋์๊ฐ๊ธฐ ์ํด continue, resume, fork๋ฅผ ์ธ์ ์ฌ์ฉํ ์ง์ ๋ํด ์์๋ด ๋๋ค.
์ธ์ ์ ์์ด์ ํธ๊ฐ ์์ ํ๋ ๋์ SDK๊ฐ ๋์ ํ๋ ๋ํ ๊ธฐ๋ก์ ๋๋ค. ์ฌ๊ธฐ์๋ ํ๋กฌํํธ, ์์ด์ ํธ๊ฐ ์ํํ ๋ชจ๋ ๋๊ตฌ ํธ์ถ, ๋ชจ๋ ๋๊ตฌ ๊ฒฐ๊ณผ, ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์๋ต์ด ํฌํจ๋ฉ๋๋ค. SDK๋ ์ด๋ฅผ ์๋์ผ๋ก ๋์คํฌ์ ๊ธฐ๋กํ๋ฏ๋ก ๋์ค์ ๋์์ฌ ์ ์์ต๋๋ค.
์ธ์ ์ผ๋ก ๋์๊ฐ๋ค๋ ๊ฒ์ ์์ด์ ํธ๊ฐ ์ด์ ์ ์ ์ฒด ์ปจํ ์คํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ์๋ฏธ์ ๋๋ค. ์ด๋ฏธ ์ฝ์ ํ์ผ, ์ด๋ฏธ ์ํํ ๋ถ์, ์ด๋ฏธ ๋ด๋ฆฐ ๊ฒฐ์ ๋ค์ด ๋ชจ๋ ์์ต๋๋ค. ํ์ ์ง๋ฌธ์ ํ ์ ์๊ณ , ์ค๋จ์์ ๋ณต๊ตฌํ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์๋ํ๊ธฐ ์ํด ๋ถ๊ธฐํ ์ ์์ต๋๋ค.
์ธ์ ์ ๋ํ๋ฅผ ์ ์งํ๋ฉฐ, ํ์ผ ์์คํ ์ ์ ์งํ์ง ์์ต๋๋ค. ์์ด์ ํธ๊ฐ ์ํํ ํ์ผ ๋ณ๊ฒฝ ์ฌํญ์ ์ค๋ ์ทํ๊ณ ๋๋๋ฆฌ๋ ค๋ฉด ํ์ผ ์ฒดํฌํฌ์ธํ ์ ์ฌ์ฉํ์ธ์.
์ด ๊ฐ์ด๋์์๋ ์ฑ์ ๋ง๋ ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ ํํ๋ ๋ฐฉ๋ฒ, ์ธ์
์ ์๋์ผ๋ก ์ถ์ ํ๋ SDK ์ธํฐํ์ด์ค, ์ธ์
ID๋ฅผ ์บก์ฒํ๊ณ resume ๋ฐ fork๋ฅผ ์๋์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ํธ์คํธ ๊ฐ์ ์ธ์
์ ์ฌ๊ฐํ ๋ ์์์ผ ํ ์ฌํญ์ ๋ค๋ฃน๋๋ค.
์ ๊ทผ ๋ฐฉ์ ์ ํํ๊ธฐ
ํ์ํ ์ธ์
์ฒ๋ฆฌ์ ์์ ์ ํ๋ฆฌ์ผ์ด์
์ ํํ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ์ธ์
๊ด๋ฆฌ๋ ์ปจํ
์คํธ๋ฅผ ๊ณต์ ํด์ผ ํ๋ ์ฌ๋ฌ ํ๋กฌํํธ๋ฅผ ๋ณด๋ผ ๋ ์ค์ํฉ๋๋ค. ๋จ์ผ query() ํธ์ถ ๋ด์์ ์์ด์ ํธ๋ ์ด๋ฏธ ํ์ํ ๋งํผ ๋ง์ ํด์ ์ํํ๋ฉฐ, ๊ถํ ํ๋กฌํํธ์ AskUserQuestion์ ๋ฃจํ ๋ด์์ ์ฒ๋ฆฌ๋ฉ๋๋ค (ํธ์ถ์ ์ข
๋ฃํ์ง ์์ต๋๋ค).
| ๊ตฌ์ถ ์ค์ธ ๊ฒ | ์ฌ์ฉํ ๊ฒ |
|---|---|
| ์ผํ์ฑ ์์ : ๋จ์ผ ํ๋กฌํํธ, ํ์ ์์ | ์ถ๊ฐ ์์
์์. ๋จ์ผ query() ํธ์ถ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. |
| ํ ํ๋ก์ธ์ค ๋ด์์ ๋ค์ค ํด ์ฑํ | ClaudeSDKClient (Python) ๋๋ continue: true (TypeScript). SDK๊ฐ ID ์ฒ๋ฆฌ ์์ด ์ธ์
์ ์ถ์ ํฉ๋๋ค. |
| ํ๋ก์ธ์ค ์ฌ์์ ํ ์ค๋จํ ์ง์ ์์ ๊ณ์ํ๊ธฐ | continue_conversation=True (Python) / continue: true (TypeScript). ๋๋ ํ ๋ฆฌ์ ๊ฐ์ฅ ์ต๊ทผ ์ธ์
์ ์ฌ๊ฐํ๋ฉฐ, ID๊ฐ ํ์ํ์ง ์์ต๋๋ค. |
| ํน์ ๊ณผ๊ฑฐ ์ธ์ ์ฌ๊ฐํ๊ธฐ (๊ฐ์ฅ ์ต๊ทผ์ด ์๋) | ์ธ์
ID๋ฅผ ์บก์ฒํ๊ณ resume์ ์ ๋ฌํฉ๋๋ค. |
| ์๋ณธ์ ์์ง ์๊ณ ๋์ฒด ์ ๊ทผ ๋ฐฉ์ ์๋ํ๊ธฐ | ์ธ์ ์ ํฌํฌํฉ๋๋ค. |
| ์ํ ๋น์ ์ฅ ์์ , ๋์คํฌ์ ์๋ฌด๊ฒ๋ ๊ธฐ๋กํ๊ณ ์ถ์ง ์์ (TypeScript๋ง ํด๋น) | persistSession: false๋ฅผ ์ค์ ํฉ๋๋ค. ์ธ์
์ ํธ์ถ ๊ธฐ๊ฐ ๋์๋ง ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํฉ๋๋ค. Python์ ํญ์ ๋์คํฌ์ ์ ์งํฉ๋๋ค. |
Continue, resume, fork
Continue, resume, fork๋ query()์ ์ค์ ํ๋ ์ต์
ํ๋์
๋๋ค (Python์ ClaudeAgentOptions, TypeScript์ Options).
Continue์ resume์ ๋ชจ๋ ๊ธฐ์กด ์ธ์ ์ ์ ํํ๊ณ ์ฌ๊ธฐ์ ์ถ๊ฐํฉ๋๋ค. ์ฐจ์ด์ ์ ํด๋น ์ธ์ ์ ์ฐพ๋ ๋ฐฉ์์ ๋๋ค:
- Continue๋ ํ์ฌ ๋๋ ํ ๋ฆฌ์ ๊ฐ์ฅ ์ต๊ทผ ์ธ์ ์ ์ฐพ์ต๋๋ค. ์๋ฌด๊ฒ๋ ์ถ์ ํ ํ์๊ฐ ์์ต๋๋ค. ์ฑ์ด ํ ๋ฒ์ ํ๋์ ๋ํ๋ฅผ ์คํํ ๋ ์ ์๋ํฉ๋๋ค.
- Resume์ ํน์ ์ธ์ ID๋ฅผ ์ฌ์ฉํฉ๋๋ค. ID๋ฅผ ์ถ์ ํฉ๋๋ค. ์ฌ๋ฌ ์ธ์ ์ด ์์ ๋ (์: ๋ค์ค ์ฌ์ฉ์ ์ฑ์ ์ฌ์ฉ์๋น ํ๋) ๋๋ ๊ฐ์ฅ ์ต๊ทผ์ด ์๋ ์ธ์ ์ผ๋ก ๋์๊ฐ๊ณ ์ถ์ ๋ ํ์ํฉ๋๋ค.
Fork๋ ๋ค๋ฆ ๋๋ค: ์๋ณธ์ ๊ธฐ๋ก ๋ณต์ฌ๋ณธ์ผ๋ก ์์ํ๋ ์ ์ธ์ ์ ๋ง๋ญ๋๋ค. ์๋ณธ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๋ค๋ฅธ ๋ฐฉํฅ์ ์๋ํ๋ฉด์ ๋์๊ฐ ์ ์๋ ์ต์ ์ ์ ์งํ๋ ค๋ฉด fork๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์๋ ์ธ์ ๊ด๋ฆฌ
๋ SDK ๋ชจ๋ ํธ์ถ ๊ฐ์ ์ธ์ ์ํ๋ฅผ ์ถ์ ํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ฏ๋ก ID๋ฅผ ์๋์ผ๋ก ์ ๋ฌํ ํ์๊ฐ ์์ต๋๋ค. ๋จ์ผ ํ๋ก์ธ์ค ๋ด์์ ๋ค์ค ํด ๋ํ์ ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Python: ClaudeSDKClient
ClaudeSDKClient๋ ์ธ์
ID๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. client.query()์ ๋ํ ๊ฐ ํธ์ถ์ ์๋์ผ๋ก ๋์ผํ ์ธ์
์ ๊ณ์ํฉ๋๋ค. client.receive_response()๋ฅผ ํธ์ถํ์ฌ ํ์ฌ ์ฟผ๋ฆฌ์ ๋ฉ์์ง๋ฅผ ๋ฐ๋ณตํฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ ๋น๋๊ธฐ ์ปจํ
์คํธ ๊ด๋ฆฌ์๋ก ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ด ์์ ๋ ๋์ผํ client์ ๋ํด ๋ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค. ์ฒซ ๋ฒ์งธ๋ ์์ด์ ํธ์๊ฒ ๋ชจ๋์ ๋ถ์ํ๋๋ก ์์ฒญํ๊ณ , ๋ ๋ฒ์งธ๋ ํด๋น ๋ชจ๋์ ๋ฆฌํฉํ ๋งํ๋๋ก ์์ฒญํฉ๋๋ค. ๋ ํธ์ถ ๋ชจ๋ ๋์ผํ ํด๋ผ์ด์ธํธ ์ธ์คํด์ค๋ฅผ ํต๊ณผํ๋ฏ๋ก ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ๋ ๋ช
์์ ์ธ resume ๋๋ ์ธ์
ID ์์ด ์ฒซ ๋ฒ์งธ์ ์ ์ฒด ์ปจํ
์คํธ๋ฅผ ๊ฐ์ง๋๋ค:
import asyncio
from claude_agent_sdk import (
ClaudeSDKClient,
ClaudeAgentOptions,
AssistantMessage,
ResultMessage,
TextBlock,
)
def print_response(message):
"""Print only the human-readable parts of a message."""
if isinstance(message, AssistantMessage):
for block in message.content:
if isinstance(block, TextBlock):
print(block.text)
elif isinstance(message, ResultMessage):
cost = (
f"${message.total_cost_usd:.4f}"
if message.total_cost_usd is not None
else "N/A"
)
print(f"[done: {message.subtype}, cost: {cost}]")
async def main():
options = ClaudeAgentOptions(
allowed_tools=["Read", "Edit", "Glob", "Grep"],
)
async with ClaudeSDKClient(options=options) as client:
# First query: client captures the session ID internally
await client.query("Analyze the auth module")
async for message in client.receive_response():
print_response(message)
# Second query: automatically continues the same session
await client.query("Now refactor it to use JWT")
async for message in client.receive_response():
print_response(message)
asyncio.run(main())
Python SDK ์ฐธ์กฐ์์ ClaudeSDKClient์ ๋
๋ฆฝํ query() ํจ์๋ฅผ ์ธ์ ์ฌ์ฉํ ์ง์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ํ์ธํ์ธ์.
TypeScript: continue: true
์์ ์ ์ธ TypeScript SDK (์ด ๋ฌธ์ ์ ์ฒด์์ ์ฌ์ฉ๋๋ query() ํจ์, ๋๋๋ก V1์ด๋ผ๊ณ ๋ถ๋ฆผ)๋ Python์ ClaudeSDKClient์ ๊ฐ์ ์ธ์
๋ณด์ ํด๋ผ์ด์ธํธ ๊ฐ์ฒด๊ฐ ์์ต๋๋ค. ๋์ ๊ฐ ํ์ query() ํธ์ถ์์ continue: true๋ฅผ ์ ๋ฌํ๋ฉด SDK๊ฐ ํ์ฌ ๋๋ ํ ๋ฆฌ์ ๊ฐ์ฅ ์ต๊ทผ ์ธ์
์ ์ฐพ์ ์ฌ๊ฐํฉ๋๋ค. ID ์ถ์ ์ด ํ์ํ์ง ์์ต๋๋ค.
์ด ์์ ๋ ๋ ๊ฐ์ ๋ณ๋ query() ํธ์ถ์ ์ํํฉ๋๋ค. ์ฒซ ๋ฒ์งธ๋ ์ ์ธ์
์ ๋ง๋ค๊ณ , ๋ ๋ฒ์งธ๋ continue: true๋ฅผ ์ค์ ํ์ฌ SDK๊ฐ ๋์คํฌ์ ๊ฐ์ฅ ์ต๊ทผ ์ธ์
์ ์ฐพ์ ์ฌ๊ฐํ๋๋ก ์ง์ํฉ๋๋ค. ์์ด์ ํธ๋ ์ฒซ ๋ฒ์งธ ํธ์ถ์ ์ ์ฒด ์ปจํ
์คํธ๋ฅผ ๊ฐ์ง๋๋ค:
import { query } from "@anthropic-ai/claude-agent-sdk";
// First query: creates a new session
for await (const message of query({
prompt: "Analyze the auth module",
options: { allowedTools: ["Read", "Glob", "Grep"] }
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}
// Second query: continue: true resumes the most recent session
for await (const message of query({
prompt: "Now refactor it to use JWT",
options: {
continue: true,
allowedTools: ["Read", "Edit", "Write", "Glob", "Grep"]
}
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}
createSession()์ ์ ๊ณตํ ์คํ์ V2 ์ธ์
API๋ send / stream ํจํด์ผ๋ก ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. V1 query() ํจ์์ ์ด ํ์ด์ง์ ์ค๋ช
๋ ์ธ์
์ต์
์ ์ฌ์ฉํ์ธ์.
query()์ ํจ๊ป ์ธ์
์ต์
์ฌ์ฉํ๊ธฐ
์ธ์ ID ์บก์ฒํ๊ธฐ
Resume๊ณผ fork์๋ ์ธ์
ID๊ฐ ํ์ํฉ๋๋ค. ๊ฒฐ๊ณผ ๋ฉ์์ง์ session_id ํ๋์์ ์ฝ์ต๋๋ค (Python์ ResultMessage, TypeScript์ SDKResultMessage). ์ด๋ ์ฑ๊ณต ๋๋ ์ค๋ฅ์ ๊ด๊ณ์์ด ๋ชจ๋ ๊ฒฐ๊ณผ์ ์กด์ฌํฉ๋๋ค. TypeScript์์ ID๋ ์ด๊ธฐ SystemMessage์ ์ง์ ํ๋๋ก๋ ๋ ์ผ์ฐ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค. Python์์๋ SystemMessage.data ๋ด์ ์ค์ฒฉ๋์ด ์์ต๋๋ค.
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage
async def main():
session_id = None
async for message in query(
prompt="Analyze the auth module and suggest improvements",
options=ClaudeAgentOptions(
allowed_tools=["Read", "Glob", "Grep"],
),
):
if isinstance(message, ResultMessage):
session_id = message.session_id
if message.subtype == "success":
print(message.result)
print(f"Session ID: {session_id}")
return session_id
session_id = asyncio.run(main())
import { query } from "@anthropic-ai/claude-agent-sdk";
let sessionId: string | undefined;
for await (const message of query({
prompt: "Analyze the auth module and suggest improvements",
options: { allowedTools: ["Read", "Glob", "Grep"] }
})) {
if (message.type === "result") {
sessionId = message.session_id;
if (message.subtype === "success") {
console.log(message.result);
}
}
}
console.log(`Session ID: ${sessionId}`);
ID๋ก ์ฌ๊ฐํ๊ธฐ
์ธ์
ID๋ฅผ resume์ ์ ๋ฌํ์ฌ ํน์ ์ธ์
์ผ๋ก ๋์๊ฐ๋๋ค. ์์ด์ ํธ๋ ์ธ์
์ด ์ค๋จ๋ ๊ณณ์์ ์ ์ฒด ์ปจํ
์คํธ๋ก ์ ํํฉ๋๋ค. ์ฌ๊ฐํ๋ ์ผ๋ฐ์ ์ธ ์ด์ :
- ์๋ฃ๋ ์์ ์ ๋ํด ํ์ ์กฐ์นํ๊ธฐ. ์์ด์ ํธ๊ฐ ์ด๋ฏธ ๋ฌด์ธ๊ฐ๋ฅผ ๋ถ์ํ์ต๋๋ค. ์ด์ ํ์ผ์ ๋ค์ ์ฝ์ง ์๊ณ ํด๋น ๋ถ์์ ๋ฐ๋ผ ์กฐ์นํ๊ธฐ๋ฅผ ์ํฉ๋๋ค.
- ์ ํ์์ ๋ณต๊ตฌํ๊ธฐ. ์ฒซ ๋ฒ์งธ ์คํ์ด
error_max_turns๋๋error_max_budget_usd๋ก ๋๋ฌ์ต๋๋ค (๊ฒฐ๊ณผ ์ฒ๋ฆฌ ์ฐธ์กฐ). ๋ ๋์ ์ ํ์ผ๋ก ์ฌ๊ฐํฉ๋๋ค. - ํ๋ก์ธ์ค ์ฌ์์ํ๊ธฐ. ์ข ๋ฃ ์ ์ ID๋ฅผ ์บก์ฒํ์ผ๋ฉฐ ๋ํ๋ฅผ ๋ณต์ํ๊ณ ์ถ์ต๋๋ค.
์ด ์์ ๋ ์ธ์ ID ์บก์ฒํ๊ธฐ์ ์ธ์ ์ ํ์ ํ๋กฌํํธ๋ก ์ฌ๊ฐํฉ๋๋ค. ์ฌ๊ฐํ๊ณ ์์ผ๋ฏ๋ก ์์ด์ ํธ๋ ์ด๋ฏธ ์ด์ ๋ถ์์ ์ปจํ ์คํธ์ ๊ฐ์ง๊ณ ์์ต๋๋ค:
# Earlier session analyzed the code; now build on that analysis
async for message in query(
prompt="Now implement the refactoring you suggested",
options=ClaudeAgentOptions(
resume=session_id,
allowed_tools=["Read", "Edit", "Write", "Glob", "Grep"],
),
):
if isinstance(message, ResultMessage) and message.subtype == "success":
print(message.result)
// Earlier session analyzed the code; now build on that analysis
for await (const message of query({
prompt: "Now implement the refactoring you suggested",
options: {
resume: sessionId,
allowedTools: ["Read", "Edit", "Write", "Glob", "Grep"]
}
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}
resume ํธ์ถ์ด ์์๋ ๊ธฐ๋ก ๋์ ์ ์ธ์
์ ๋ฐํํ๋ฉด ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์์ธ์ ์ผ์นํ์ง ์๋ cwd์
๋๋ค. ์ธ์
์ ~/.claude/projects/<encoded-cwd>/*.jsonl ์๋์ ์ ์ฅ๋๋ฉฐ, ์ฌ๊ธฐ์ <encoded-cwd>๋ ๋ชจ๋ ์์ซ์๊ฐ ์๋ ๋ฌธ์๊ฐ -๋ก ๋ฐ๋ ์ ๋ ์์
๋๋ ํ ๋ฆฌ์
๋๋ค (๋ฐ๋ผ์ /Users/me/proj๋ -Users-me-proj๊ฐ ๋ฉ๋๋ค). resume ํธ์ถ์ด ๋ค๋ฅธ ๋๋ ํ ๋ฆฌ์์ ์คํ๋๋ฉด SDK๊ฐ ์๋ชป๋ ์์น๋ฅผ ์ฐพ์ต๋๋ค. ์ธ์
ํ์ผ๋ ํ์ฌ ๋จธ์ ์ ์กด์ฌํด์ผ ํฉ๋๋ค.
๋จธ์ ๊ฐ ๋๋ ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ์์ ์ธ์
์ ์ฌ๊ฐํ๋ ค๋ฉด SessionStore ์ด๋ํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋์คํฌ๋ฆฝํธ๋ฅผ ๊ณต์ ์คํ ๋ฆฌ์ง๋ก ๋ฏธ๋ฌ๋งํฉ๋๋ค.
๋์ฒด ๋ฐฉ์์ ํ์ํ๊ธฐ ์ํด ํฌํฌํ๊ธฐ
ํฌํน์ ์๋ณธ์ ๊ธฐ๋ก ๋ณต์ฌ๋ณธ์ผ๋ก ์์ํ์ง๋ง ๊ทธ ์ง์ ์์ ๋ถ๊ธฐํ๋ ์ ์ธ์ ์ ๋ง๋ญ๋๋ค. ํฌํฌ๋ ์์ ์ ์ธ์ ID๋ฅผ ๊ฐ์ง๋๋ค. ์๋ณธ์ ID์ ๊ธฐ๋ก์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ๋ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ์ธ์ ์ ๋ณ๋๋ก ์ฌ๊ฐํ ์ ์๋ ๋ ๊ฐ์ ์ธ์ ID๋ก ๋๋ฉ๋๋ค.
ํฌํน์ ๋ํ ๊ธฐ๋ก์ ๋ถ๊ธฐํ๋ฉฐ, ํ์ผ ์์คํ ์ ๋ถ๊ธฐํ์ง ์์ต๋๋ค. ํฌํฌ๋ ์์ด์ ํธ๊ฐ ํ์ผ์ ํธ์งํ๋ฉด ํด๋น ๋ณ๊ฒฝ ์ฌํญ์ ์ค์ ์ด๋ฉฐ ๋์ผํ ๋๋ ํ ๋ฆฌ์์ ์์ ํ๋ ๋ชจ๋ ์ธ์ ์ ํ์๋ฉ๋๋ค. ํ์ผ ๋ณ๊ฒฝ ์ฌํญ์ ๋ถ๊ธฐํ๊ณ ๋๋๋ฆฌ๋ ค๋ฉด ํ์ผ ์ฒดํฌํฌ์ธํ ์ ์ฌ์ฉํฉ๋๋ค.
์ด ์์ ๋ ์ธ์
ID ์บก์ฒํ๊ธฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค: session_id์์ ์ธ์ฆ ๋ชจ๋์ ์ด๋ฏธ ๋ถ์ํ์ผ๋ฉฐ JWT ์ค์ฌ ์ค๋ ๋๋ฅผ ์์ง ์๊ณ OAuth2๋ฅผ ํ์ํ๊ณ ์ถ์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋ธ๋ก์ ์ธ์
์ ํฌํฌํ๊ณ ํฌํฌ์ ID (forked_id)๋ฅผ ์บก์ฒํฉ๋๋ค. ๋ ๋ฒ์งธ ๋ธ๋ก์ ์๋ณธ session_id๋ฅผ ์ฌ๊ฐํ์ฌ JWT ๊ฒฝ๋ก๋ฅผ ๊ณ์ํฉ๋๋ค. ์ด์ ๋ ๊ฐ์ ์ธ์
ID๊ฐ ๋ ๊ฐ์ ๋ณ๋ ๊ธฐ๋ก์ ๊ฐ๋ฆฌํต๋๋ค:
# Fork: branch from session_id into a new session
forked_id = None
async for message in query(
prompt="Instead of JWT, implement OAuth2 for the auth module",
options=ClaudeAgentOptions(
resume=session_id,
fork_session=True,
),
):
if isinstance(message, ResultMessage):
forked_id = message.session_id # The fork's ID, distinct from session_id
if message.subtype == "success":
print(message.result)
print(f"Forked session: {forked_id}")
# Original session is untouched; resuming it continues the JWT thread
async for message in query(
prompt="Continue with the JWT approach",
options=ClaudeAgentOptions(resume=session_id),
):
if isinstance(message, ResultMessage) and message.subtype == "success":
print(message.result)
// Fork: branch from sessionId into a new session
let forkedId: string | undefined;
for await (const message of query({
prompt: "Instead of JWT, implement OAuth2 for the auth module",
options: {
resume: sessionId,
forkSession: true
}
})) {
if (message.type === "system" && message.subtype === "init") {
forkedId = message.session_id; // The fork's ID, distinct from sessionId
}
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}
console.log(`Forked session: ${forkedId}`);
// Original session is untouched; resuming it continues the JWT thread
for await (const message of query({
prompt: "Continue with the JWT approach",
options: { resume: sessionId }
})) {
if (message.type === "result" && message.subtype === "success") {
console.log(message.result);
}
}
ํธ์คํธ ๊ฐ์ ์ฌ๊ฐํ๊ธฐ
์ธ์ ํ์ผ์ ์ด๋ฅผ ๋ง๋ ๋จธ์ ์ ๋ก์ปฌ์ ๋๋ค. ๋ค๋ฅธ ํธ์คํธ (CI ์์ปค, ์์ ์ปจํ ์ด๋, ์๋ฒ๋ฆฌ์ค)์์ ์ธ์ ์ ์ฌ๊ฐํ๋ ค๋ฉด ๋ ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค:
- ์ธ์
ํ์ผ ์ด๋ํ๊ธฐ. ์ฒซ ๋ฒ์งธ ์คํ์์
~/.claude/projects/<encoded-cwd>/<session-id>.jsonl์ ์ ์งํ๊ณresume์ ํธ์ถํ๊ธฐ ์ ์ ์ ํธ์คํธ์ ๋์ผํ ๊ฒฝ๋ก๋ก ๋ณต์ํฉ๋๋ค.cwd๊ฐ ์ผ์นํด์ผ ํฉ๋๋ค. - ์ธ์ ์ฌ๊ฐ์ ์์กดํ์ง ์๊ธฐ. ํ์ํ ๊ฒฐ๊ณผ (๋ถ์ ์ถ๋ ฅ, ๊ฒฐ์ , ํ์ผ diff)๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ก ์บก์ฒํ๊ณ ์ ์ธ์ ์ ํ๋กฌํํธ์ ์ ๋ฌํฉ๋๋ค. ์ด๋ ์ข ์ข ํธ๋์คํฌ๋ฆฝํธ ํ์ผ์ ์ฃผ๋ณ์ ๋ฐฐ์กํ๋ ๊ฒ๋ณด๋ค ๋ ๊ฒฌ๊ณ ํฉ๋๋ค.
๋ SDK ๋ชจ๋ ๋์คํฌ์ ์ธ์
์ ์ด๊ฑฐํ๊ณ ๋ฉ์์ง๋ฅผ ์ฝ๊ธฐ ์ํ ํจ์๋ฅผ ๋
ธ์ถํฉ๋๋ค: TypeScript์ listSessions() ๋ฐ getSessionMessages(), Python์ list_sessions() ๋ฐ get_session_messages(). ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ์ ์ธ์
์ ํ๊ธฐ, ์ ๋ฆฌ ๋ก์ง ๋๋ ํธ๋์คํฌ๋ฆฝํธ ๋ทฐ์ด๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
๋ SDK ๋ชจ๋ ๊ฐ๋ณ ์ธ์
์ ์กฐํํ๊ณ ๋ณ๊ฒฝํ๊ธฐ ์ํ ํจ์๋ ๋
ธ์ถํฉ๋๋ค: Python์ get_session_info(), rename_session(), tag_session(), ๊ทธ๋ฆฌ๊ณ TypeScript์ getSessionInfo(), renameSession(), tagSession(). ์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ทธ๋ณ๋ก ์ธ์
์ ๊ตฌ์ฑํ๊ฑฐ๋ ์ธ๊ฐ์ด ์ฝ์ ์ ์๋ ์ ๋ชฉ์ ์ ๊ณตํฉ๋๋ค.
๊ด๋ จ ๋ฆฌ์์ค
- ์์ด์ ํธ ๋ฃจํ ์๋ ๋ฐฉ์: ์ธ์ ๋ด์์ ํด, ๋ฉ์์ง, ์ปจํ ์คํธ ๋์ ์ ์ดํดํฉ๋๋ค
- ํ์ผ ์ฒดํฌํฌ์ธํ : ์ธ์ ๊ฐ ํ์ผ ๋ณ๊ฒฝ ์ฌํญ ์ถ์ ๋ฐ ๋๋๋ฆฌ๊ธฐ
- Python
ClaudeAgentOptions: Python์ ์ ์ฒด ์ธ์ ์ต์ ์ฐธ์กฐ - TypeScript
Options: TypeScript์ ์ ์ฒด ์ธ์ ์ต์ ์ฐธ์กฐ