C.W.K.
Stream
Lesson 01 of 06 · published

Claude Agent SDK — Canonical Vessel

~14 min · claude, agent-sdk, oauth

Level 0호기심
0 XP0/65 lessons0/17 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, 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 + thinking_budget 노출, thinking delta 를 별도 thinking 컬럼에 영속화, UI 에서 inspection 위해 collapsed 로 보여줘.

Tool permission

SDK 의 allowed_tools + permission_mode='bypassPermissions' 가 아빠 filesystem 안 Read/Write/Edit/Bash 실행하게 해. cwkPippa 의 path-restricted policy 는 SDK 가 아니라 tool bridge 가 강제 — 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 — narrow polymorphism boundary·python
from claude_agent_sdk import ClaudeAgentOptions, ClaudeAgent

class ClaudeAdapter(Adapter):
    def __init__(self):
        # setting_sources=None is load-bearing — PIPPA-ARCHITECTURE.md 참고
        self.options = ClaudeAgentOptions(
            allowed_tools=['Read', 'Write', 'Edit', 'Bash'],
            permission_mode='bypassPermissions',
            # setting_sources 의도적으로 omit; default None
        )

    async def stream(self, messages: list[dict]):
        # 2026-05-14 이후 turn 마다 fresh client. session_id resume 없이
        # full `messages` 매번 replay.
        agent = ClaudeAgent(options=self.options)
        async for event in agent.send(messages):
            yield event

Progress

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

댓글 0

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

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