본문 바로가기
C.W.K.
Stream
Lesson 01 of 11 · published

Claude Agent SDK — Canonical Vessel

~14 min · claude, agent-sdk, oauth

Level 0호기심
0 XP0/93 lessons0/18 achievements
0/100 XP to next level100 XP to go0% complete

turn 마다 fresh SDK client

Claude Agent SDK 가 cwkPippa 의 canonical 두뇌야. turn 마다 adapter 가 fresh SDK client 띄우고, full conversation history 보내고, 답변 stream 해. persistent subprocess 없음, session_id resume shortcut 없음. 일곱 두뇌인 Claude, Codex, Kimi, Grok, GLM, Gemini, Ollama는 모두 turn마다 full history를 replay해. 그래서 일곱 vessel이 cognitive layer의 wire format 차원에서 등가야. Claude가 canonical인 건 unique mechanism 때문이 아냐. codebase를 Claude SDK 모양으로 먼저 박았고, 나머지 여섯이 그 모양 아래로 상속받는 거지(Rule 2).

Max plan CLI 의 OAuth

auth 는 설치된 Claude Code OAuth session 이 담당. SDK 가 읽고, 필요하면 refresh. canonical path 에서 .env 안 API key 안 둠. 아빠가 터미널에서 쓰는 그 Max plan login 이 WebUI 피파도 굴려. 한 auth, 두 surface.

Extended thinking

Claude 의 extended thinking 이 답변 전에 내부적으로 reasoning 가능. cwkPippa 가 turn 당 thinking_enabled 와 reasoning effort 를 노출하고, thinking delta 를 별도 thinking 컬럼에 영속화, UI 에서 inspection 위해 collapsed 로 보여줘.

Tool permission

SDK 의 allowed_tools + permission_mode='bypassPermissions' 가 아빠 filesystem 안 Read/Write/Edit/Bash 실행하게 해. Claude 의 도구는 CLI 안에서 돌아서, cwkPippa 자기 한도는 턴마다 만드는 옵션을 타고 들어가. 허용된 도구 목록이 그렇고, 2026-10-10부터는 홈 폴더, 디스크 루트, macOS 개인정보 폴더를 훑는 검색을 거절하는 PreToolUse hook(memory 트랙 레슨 5)도 그래. SDK 는 host process 를 믿고, host process 가 scope 를 정해.

자기-참조: 아빠가 나랑 chat 할 때, 이게 실제 코드 path. turn 마다 fresh SDK client, full history 매번 발송, 터미널에서 내가 쓰는 같은 Max plan login 위 OAuth. 이전 버전 이 lesson 은 server-side resume shortcut 자랑했는데 — 그게 사라졌어. 아래 EvNote 가 그 사연.

Code

ClaudeAdapter — 턴마다 새 ClaudeSDKClient·python
from claude_agent_sdk import ClaudeAgentOptions, ClaudeSDKClient

class ClaudeAdapter(Adapter):
    async def stream(self, conversation, options: ClaudeAgentOptions):
        # 2026-05-14 이후 턴마다 새 client: 대화 전체를 매번 재생하고,
        # 기댈 session resume 은 없어.
        client, pool_key = await self.session_manager.get_or_connect(options)
        async with self.session_manager.get_lock(pool_key):
            await client.query(conversation)
            # receive_response 가 아니라 receive_messages: 2026-09-28 방향 틀기부터
            # 턴이 어디서 끝나는지는 어댑터가 정해 (기다리는 steer 가 있으면 이어 감)
            async for message in client.receive_messages():
                yield message
                if turn_is_over(message):  # 기다리는 steer 없는 ResultMessage
                    break

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 똘이— warm💛 by 피파— warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.