에이전트 하네스와 Pi Part 4: Pi 를 옆에 두기
이 글은 Claude Opus 5.5 를 이용해 초안이 작성되었으며, 이후 퇴고를 거쳤습니다.
같은 저장소에서 세 하네스에게 “안녕” 한마디만 보내고, 모델에게 실제로 나간 요청을 받아 크기를 쟀습니다. 저장소에는 두 줄짜리 규칙 파일(AGENTS.md 또는 CLAUDE.md)과 파이썬 파일 하나만 두었어요.
| 하네스 (버전, 깨끗한 기본 설정) | 시스템 지시문 | 도구 정의 | 그 밖에 끼워 넣은 것 | 합계 |
|---|---|---|---|---|
| Pi 1.4.0 | 3,243자 | 2,956자 (4개) | 없음 | 약 6,200자 |
| Codex CLI 0.160.0 (gpt-5.5) | 21,299자 | 9,511자 (10개) | 5,792자 (개발자 메시지·규칙 파일·환경) | 약 36,600자 |
| Claude Code 2.1.287 | 5,967자 | 46,484자 (20개) | 9,497자 (환경 정보·리마인더·규칙 파일) | 약 61,900자 |
대략 4자를 1토큰으로 어림하면 Pi 는 1,500 토큰 남짓, Codex 는 9천, Claude Code 는 1만 5천 토큰쯤을 사용자의 첫 문장보다 먼저 씁니다. Claude Code 의 도구 20개에는 Bash·Read·Edit 같은 기본 도구 말고도 서브 에이전트(Agent), 예약 작업(Cron 계열), worktree, 웹 검색, 워크플로가 들어 있어요. 3편에서 Mario Zechner 가 말한 “우주선” 이 이 표의 한 줄입니다.
저는 Claude Code 를 업무에 쓰면서 컨텍스트가 어디로 가는지 잘 안 보인다는 게 아쉬웠는데, 이렇게 재 보니 안 보이던 이유가 조금 보였습니다. 이 편은 Claude Code 나 Codex 를 쓰는 사람이 Pi 를 옆에 하나 더 둘 때 무엇이 달라지는지, 컨텍스트가 안 보인다는 것과 세션 관리가 불편하다는 두 아쉬움을 중심으로 직접 돌려 본 결과를 적습니다.
이 측정을 어떻게 했고, 무엇을 말하지 않는가#
세 하네스 모두 실제 모델 대신 제 노트북의 localhost 에서 도는 작은 가짜 서버에 붙였습니다. Claude Code 는 문서화된 ANTHROPIC_BASE_URL 로, Codex 는 config.toml 의 사용자 정의 provider 로, Pi 는 models.json 의 OpenAI 호환 엔드포인트로요. 가짜 서버는 들어온 요청을 파일에 남기고 미리 정해 둔 짧은 답만 돌려줍니다. 사용자 설정이 섞이지 않게 세 하네스 모두 빈 설정 디렉터리(CLAUDE_CONFIG_DIR, CODEX_HOME, PI_CODING_AGENT_DIR)에서 돌렸고, 실제 API 키나 구독은 쓰지 않았어요. 아래 Pi 예제도 같은 가짜 서버로 동작만 확인한 것이라, 모델이 똑똑하게 굴었는지는 이 글에서 판단하지 않습니다. 실제 모델과 제 계정은 뒤의 요금 이야기에서만 붙였어요.
숫자를 읽을 때 조심할 게 여럿 있습니다. 글자 수는 토큰 수가 아니고, 버전·모델·설정·MCP 서버·플러그인에 따라 크게 달라져요. Codex 는 모델에 따라 모양 자체가 바뀌어서, gpt-5.6-terra 로 돌리면 도구 필드 없이 개발자 메시지로 2만 3천 자를 보냈습니다(도구를 코드로 엮는 Code Mode 쪽으로 보입니다). 또 Claude Code 와 Codex 는 프롬프트 캐시를 적극적으로 쓰기 때문에 이 접두어가 매 요청마다 정가로 청구되는 건 아닙니다. 도구가 많다는 건 할 수 있는 일이 많다는 뜻이기도 하고요. 그리고 공정하게 적어 두면, Claude Code 에는 /context 라는 명령이 있어서 컨텍스트가 시스템 프롬프트·도구·메시지 등으로 어떻게 나뉘는지 보여 줍니다. 문서에 따르면 MCP 도구 정의도 기본으로 지연 로딩돼서 실제로 쓰기 전까지는 이름만 컨텍스트를 차지하고요(이번 측정은 MCP 없이 했습니다). 제가 확인한 범위에서 Pi 에는 그런 분해 화면이 없어요. Pi 쪽 장점은 화면이 아니라 다른 데 있습니다.
컨텍스트에 들어가는 것을 직접 보고 고치기#
Pi 의 첫 번째 장점은 요청이 작다는 것보다, 들어가는 것을 사용자가 전부 볼 수 있고 바꿀 수 있다는 데 있습니다.
먼저 세션 파일입니다. Pi 는 세션마다 JSONL 파일 하나를 남기는데, 그 안에 모델에게 보낸 시스템 프롬프트가 섹션별로 그대로 저장돼요. 위 측정의 Pi 세션 파일을 열어 보면 system 메시지가 preamble 169자, tools 339자, rules 839자, docs 1,457자, project_context 316자, cwd 123자로 나뉘어 있습니다. project_context 가 제 두 줄짜리 AGENTS.md 이고요. 나중에 “그때 모델이 무엇을 보고 있었지?” 를 확인하려면 이 파일을 열면 됩니다. 세션 도중 extension 이 프롬프트를 바꾸면 바뀐 섹션만 따로 기록되고요.
다음은 매 요청을 기록하는 extension 입니다. 모델에게 요청이 나가기 직전에 불리는 before_provider_request 훅에서 요청 본문을 받아, 시스템 프롬프트·도구·대화가 각각 몇 자인지 프로젝트 폴더의 파일에 한 줄씩 남기게 했어요. 25줄입니다.
import { appendFileSync } from "node:fs";
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
// 모델에게 나가는 요청을 부분별 크기로 기록한다: 시스템 프롬프트, 도구 정의, 대화.
export default function (pi: ExtensionAPI) {
const size = (v: unknown) => (v === undefined ? 0 : JSON.stringify(v).length);
pi.on("before_provider_request", async (event, ctx) => {
const p = event.payload as Record<string, any>;
const messages: any[] = p.messages ?? p.input ?? [];
const byRole: Record<string, number> = {};
for (const m of messages) byRole[m.role ?? m.type] = (byRole[m.role ?? m.type] ?? 0) + size(m.content);
const row = {
at: new Date().toISOString(),
model: p.model,
systemChars: size(p.system) + (byRole.system ?? 0) + (byRole.developer ?? 0),
toolChars: size(p.tools),
toolNames: (p.tools ?? []).map((t: any) => t.function?.name ?? t.name),
messageChars: byRole,
contextUsage: ctx.getContextUsage(),
};
appendFileSync(".pi-context-ledger.jsonl", JSON.stringify(row) + "\n");
return undefined; // payload 는 건드리지 않는다
});
}
pi -p -e context-ledger.ts "이 디렉터리에 뭐가 있어?" 로 돌리고 가짜 모델이 ls 를 한 번 부르게 했더니 요청 두 번이 이렇게 남았습니다.
{"systemChars": 3304, "toolChars": 2841, "toolNames": ["read", "bash", "edit", "write"], "messageChars": {"system": 3304, "user": 41}}
{"systemChars": 3304, "toolChars": 2841, "toolNames": ["read", "bash", "edit", "write"], "messageChars": {"system": 3304, "user": 41, "assistant": 4, "tool": 60}}
두 번째 요청에 도구 결과(tool)가 60자 붙은 게 보이죠. 실제 작업에서 이 파일을 쌓아 두면 어떤 도구 결과가 컨텍스트를 먹는지, 컴팩션이 언제 무엇을 줄였는지가 줄 단위로 남습니다. Claude Code 의 /context 가 지금 상태의 단면을 보여 준다면, 이건 매 요청의 기록이에요. 같은 훅에서 payload 를 고쳐 돌려주면 요청 자체를 바꿀 수도 있습니다.
고치는 쪽도 열려 있습니다. 프로젝트의 .pi/SYSTEM.md 는 기본 시스템 프롬프트를 통째로 바꾸고, .pi/APPEND_SYSTEM.md 는 뒤에 덧붙여요. --tools read,bash 처럼 도구를 골라 켜고 -nc 로 AGENTS.md·CLAUDE.md 읽기를 끌 수 있습니다. 화면 아래쪽 footer 에는 지금 컨텍스트 사용량과 누적 비용이 나오고, /session 은 토큰 수와 비용을 보여 줍니다. Claude Code 에도 --append-system-prompt 나 도구 허용 목록 같은 손잡이가 있지만, 기본 시스템 프롬프트와 도구 20개의 설명을 사용자가 통째로 갈아 끼우는 건 Pi 쪽이 훨씬 쉽습니다.
세션을 파일로 다루기#
두 번째 아쉬움이었던 세션 관리 쪽입니다. Pi 의 세션은 처음부터 “파일” 로 설계됐어요. 가짜 서버에 이렇게 세 번 물었습니다.
pi -p --name "auth-bug" "로그인 버그를 쿠키 방식으로 고치면?"
pi -p -c "토큰 방식이면?" # 같은 세션 이어 하기
pi -p --fork <세션 파일> "포크한 쪽에서 계속" # 새 세션 파일로 갈라지기
pi --export <세션 파일> auth-bug.html # HTML 로 내보내기 (오프라인)
세션 폴더에 파일이 두 개 생겼고, 원래 세션 파일의 항목을 id 와 부모 id 로 늘어놓으면 이렇습니다.
17938127 <- (없음) session_info auth-bug
7c5a4856 <- 17938127 model_change
31a1fb1d <- 7c5a4856 thinking_level_change
a1134063 <- 31a1fb1d system
0a5ad4d4 <- a1134063 user 로그인 버그를 쿠키 방식으로 고치면?
7729f5ff <- 0a5ad4d4 assistant 쿠키 방식으로 고치려면 …
dac40cee <- 7729f5ff user 토큰 방식이면?
342ec98b <- dac40cee assistant 토큰 방식이면 …
모든 항목이 부모를 가리키는 트리예요. 대화형 화면에서 /tree 로 “로그인 버그를 쿠키 방식으로” 아래 지점으로 돌아가 다른 질문을 하면, 새 가지가 같은 파일에 붙고 원래 가지는 지워지지 않습니다. 가지를 옮겨 갈 때 떠나는 가지를 요약해 붙여 주기도 하고요. /tree 는 대화형 화면에서만 되는 기능이라 이번에는 문서로만 확인했고, 위의 --fork 는 별도 파일로 떼어 내는 쪽입니다. /tree 화면에서 Shift+L 로 항목에 라벨을 달아 책갈피처럼 쓸 수도 있어요.
이게 일에서 쓸모 있는 장면은 이런 겁니다. 장애 원인을 두 갈래로 의심할 때 한 세션 안에서 가설 A 와 B 를 가지로 나눠 따라가 보고, 더 나은 쪽을 이어 가면서도 버린 쪽 기록을 남겨 둘 수 있어요. 끝나면 pi --export 로 290KB 짜리 HTML 하나를 만들어 장애 회고 문서에 붙이거나, /share 로 링크를 만들어 동료에게 넘깁니다. 세션 파일 형식이 문서화된 JSONL 이니 jq 로 “이번 주에 bash 로 무슨 명령을 돌렸나” 를 뽑는 것도 가능하고요. 다만 /share 는 Earendil 의 Radius 로 로그인해 두면 기본 목적지가 Radius 가 되고 아니면 비공개 GitHub gist 로 올라가니, 문서가 경고하는 대로 프롬프트·명령 출력·파일 내용이 들어 있는지 먼저 확인해야 합니다.
공정하게 덧붙이면, Claude Code 도 세션을 JSONL 로 저장하고 되감기·이어 하기·포크를 지원합니다. 차이는 Pi 가 그 형식을 문서로 공개하고 트리를 한 파일 안에 두며, 내보내기·공유·RPC 조회(get_tree, get_entries)까지 바깥 도구가 다루기 좋게 열어 둔 데 있어요.
프롬프트 대신 훅으로 막기#
3편에서 본 protected-paths 예제를 실제로 돌려 봤습니다. 가짜 모델이 .env 를 덮어쓰는 write 도구를 부르게 해 두고, extension 없이 한 번, 있이 한 번.
[extension 없음] .env => SECRET=changed | 모델이 받은 도구 결과 => Successfully wrote to .env
[extension 있음] .env => SECRET=xyz | 모델이 받은 도구 결과 => Path ".env" is protected
첫 줄이 Pi 의 기본값입니다. 확인 창 없이 바로 씁니다. 사실 이 실험을 준비하다가 실수로 한 번 더 겪었는데, 다른 테스트용 Pi 프로세스가 백그라운드에 남아 있다가 엉뚱한 응답을 받고 .env 를 덮어썼어요. 가짜 모델이었으니 망정이지, 권한 팝업이 없다는 게 무슨 뜻인지 손으로 배운 셈입니다. 두 번째 줄이 extension 을 붙였을 때고요. 모델이 “.env 는 건드리지 마” 라는 지시를 잊거나 무시해도, 도구가 실행되기 직전에 코드가 막습니다. 3편의 엉클 밥 이야기와 같은 방향이에요. 규칙을 프롬프트에 길게 쓰는 대신, 결정론적인 검사로 옮기는 것.
다만 이건 실수를 막는 장치이지 보안 경계는 아닙니다. bash 도구로 echo X > .env 를 하면 이 extension 은 못 막아요. Pi 의 보안 문서도 신뢰할 수 없는 코드를 다룬다면 Pi 를 컨테이너나 샌드박스 안에서 돌리라고 합니다. 이 점에서는 셸 명령을 OS 샌드박스 안에서 돌리는 Codex 나 권한 모드가 있는 Claude Code 가 기본값으로 더 안전해요.
스크립트와 CI 에서#
Claude Code 의 claude -p 나 codex exec 를 스크립트에서 쓰고 있다면 Pi 의 print 모드도 비슷하게 씁니다. 쓸 만한 조합 몇 개를 적어 둡니다.
# 읽기 전용 도구만 켜고 변경분 리뷰 (파이프로 넣은 내용은 첫 프롬프트 앞에 붙습니다)
git diff main... | pi -p --no-session --tools read,grep,find,ls "이 변경에서 위험한 부분만 짚어 줘"
# 이벤트를 JSONL 로 받아 후처리
pi --mode json -p --no-session "테스트를 돌리고 실패한 것만 요약해 줘" > events.jsonl
# 규칙 파일 없이, 깨끗한 컨텍스트로
pi -p -nc --no-session --model openai/gpt-5.5 "이 스택 트레이스의 원인 후보를 세 줄로"
하나 함정이 있었습니다. stdin 이 열려 있는데 파이프로 아무것도 안 넣으면 Pi 는 stdin 이 닫히기를 기다립니다. 문서에 “Piped stdin: Prepend its contents to the first prompt” 라고 돼 있는 동작인데, 터미널이 아닌 환경(CI, 다른 에이전트 안)에서 그냥 pi -p "..." 를 부르면 멈춘 것처럼 보여요. 넣을 게 없으면 < /dev/null 을 붙이면 됩니다. 이번 측정에서 처음에 Pi 가 2분 동안 아무 요청도 보내지 않은 이유가 이거였어요. 그리고 파이프로 넣은 내용은 프롬프트 바로 앞에 구분 없이 붙어서, 위의 리뷰 예제를 돌려 보니 diff 의 마지막 줄 끝에 질문이 이어 붙어 있었습니다. 프롬프트를 “위 diff 에서” 처럼 시작하거나 앞에 빈 줄을 넣어 두는 편이 안전해요.
이미 가진 것 옮겨 오기#
Claude Code 를 쓰던 저장소에서 바로 Pi 를 열어도 되는 부분과 손이 가는 부분이 있습니다. CLAUDE.md 는 별도 설정 없이 읽혀요. AGENTS.md 도 읽으니 Codex 를 쓰던 저장소도 마찬가지고요. MCP 서버는 Claude Code 나 Cursor 의 mcpServers 항목을 .pi/mcp.json 에 그대로 복사하면 된다고 문서가 안내합니다(이건 직접 해 보지는 않았습니다). skill 은 조금 다릅니다. Pi 는 Agent Skills 의 공용 위치인 .agents/skills/ 와 자기 폴더는 찾지만 .claude/skills/ 는 기본으로 찾지 않아서, 테스트 저장소에 둔 .claude/skills/release-notes 가 기본 실행에서는 시스템 프롬프트에 나타나지 않았어요. --skill .claude/skills 를 주니 이름과 설명이 들어갔습니다(시스템 프롬프트가 700자쯤 늘었습니다). 설정 파일에 경로를 적어 두거나 공용 위치로 옮기면 됩니다.
모델과 요금, Claude 구독이라면#
Claude Code 사용자에게 가장 중요한 실무 정보는 기술이 아니라 요금입니다. Claude 구독을 Pi 에 붙이는 길은 두 갈래이고, 어느 길이냐에 따라 청구 방식이 달라요.
하나는 Pi 의 /login 으로 Claude 계정에 직접 로그인하는 길입니다. 2편에서 본 대로 Anthropic 은 2026년 4월 4일부터 서드파티 하네스가 구독 한도를 쓸 수 없게 했고, 그 사용량은 구독과 별도로 과금되는 extra usage 로 넘어갑니다. 이 정책을 거둬들였다는 발표는 찾지 못했어요. 10월 21일에 나온 Pi 1.4.0 도 이렇게 로그인하면 경고를 띄웁니다. “Anthropic subscription auth is active. Third-party harness usage draws from extra usage and is billed per token, not your Claude plan limits.” Anthropic 의 Claude Code 법적 고지 문서도 OAuth 인증이 “Claude Code 와 그 밖의 Anthropic 네이티브 애플리케이션” 의 일반적인 사용을 위한 것이라고 적고 있습니다. 제 Claude 구독 계정으로 로그인해 보니 이 경고가 그대로 떴고, extra usage 를 켜 두지 않은 상태에서 첫 요청을 보내자 Anthropic 서버가 400 오류로 돌려보냈어요. “Third-party apps now draw from your extra usage, not your plan limits. Add more at claude.ai/settings/usage and keep going.” 문서와 경고문만이 아니라 서버도 같은 말을 하는 셈입니다. 그러니 Max 구독으로 Claude Code 를 쓰던 감각으로 이 길에서 Claude 를 돌리면 청구서가 달라질 수 있어요.
다른 하나는 Pi 가 Claude Code 를 거쳐 Claude 를 부르게 하는 길입니다. 제3자 패키지 pi-claude-bridge 가 이렇게 동작하는데, Claude Agent SDK 로 Claude Code 를 모델 공급자처럼 붙이고 Pi 의 도구 호출을 그쪽으로 이어 줍니다. Anthropic 지원 문서는 10월 7일 갱신본에서도 Agent SDK·claude -p·서드파티 앱 사용이 구독 한도에서 차감된다고 적고 있어요. 다만 이 자리는 한 번 흔들렸습니다. Anthropic 은 5월에 이런 사용을 6월 15일부터 구독 한도에서 떼어 별도 월 크레딧으로 돌리겠다고 알렸다가 시행 당일 보류했고, 계획을 고쳐 바뀌기 전에 미리 알리겠다고 했어요. 지금의 계산이 오래간다는 보장은 없다는 뜻입니다. 법적 고지 문서는 Agent SDK 로 제품을 만드는 개발자에게 API 키를 쓰라고 하면서도, 사용자가 수정하지 않은 Claude Code 에 자기 구독으로 로그인하는 것은 막지 않는다고 적고 있습니다. 개인이 제3자 패키지로 자기 Claude Code 를 부르는 이 길이 어느 쪽에 가까운지는 문서만으로는 분명하지 않아요. 저는 pi-claude-bridge 를 설치해 보지는 않았습니다.
Max 구독자에게는 길이 하나 더 있습니다. Anthropic 은 10월 7일부터 Max 와 Team 플랜에 Claude API 용 월 크레딧을 주기 시작했어요. Max 5x 는 매달 100달러, Max 20x 는 200달러이고, 연결해 둔 Console 조직의 API 키로 보내는 요청에서 먼저 차감됩니다. 그 조직의 API 키를 Pi 에 넣으면 크레딧 안에서는 따로 돈이 나가지 않는 셈이에요. 대화형 Claude Code 에는 쓸 수 없고, 남은 크레딧은 이월되지 않으며, Pro 는 대상이 아닙니다.
그 밖의 선택지도 있습니다. Anthropic API 키를 직접 쓰면 처음부터 토큰당 과금이라 오히려 계산이 분명합니다. Pi 는 auth.json 에 키 대신 !security find-generic-password ... 같은 명령을 적어 두고 키체인에서 꺼내 쓰는 방식도 지원해요. ChatGPT 구독은 사정이 더 단순합니다. OpenAI 는 9월 말 공개한 Sign in with ChatGPT 에 오픈소스·로컬 앱이 사용자의 허락을 받아 그 사람의 ChatGPT 플랜으로 요청을 보내는 기능을 넣었고, 이 요청은 플랜에 포함된 사용량이나 크레딧 잔액에서 차감된다고 개발자 문서에 적었어요. Pi 는 9월 29일 나온 0.99.0 부터 /login 에서 이 로그인을 지원합니다. 한도는 플랜 전체에 걸릴 수도 있고 앱별로 걸릴 수도 있다고 하고요. 제 ChatGPT 계정으로 로그인해 GPT-6.1 Sol 로 아래의 작은 작업을 돌려 보니 막힘 없이 끝났습니다. 다만 모델 목록에 보이는 gpt-5.5 를 고르자 “The ‘gpt-5.5’ model is not supported when using Codex with a ChatGPT account.” 라는 오류가 났어요. 목록에 있다고 해서 플랜으로 다 쓸 수 있는 건 아니었습니다. GitHub Copilot 구독과 OpenRouter, 로컬 모델(llama.cpp, Ollama)도 붙일 수 있습니다.
그리고 이게 Pi 의 또 다른 장점입니다. 모델을 세션 중간에 바꿀 수 있어요. /model 이나 Ctrl+L 로 고르고, --models "anthropic/*sonnet*,openai/gpt-5*" 처럼 자주 쓰는 모델을 묶어 두면 Ctrl+P 로 돌아가며 씁니다. 저장소를 훑고 로그를 읽는 단계는 싼 모델로, 설계 결정과 큰 수정은 비싼 모델로 하는 식이죠. 세션 파일에 모델 변경이 항목으로 남으니 나중에 어느 답이 어느 모델에서 나왔는지도 알 수 있습니다. 다만 다른 회사 모델로 넘어갈 때 Pi 가 추론 내용을 변환해 넘기긴 해도, 같은 대화를 다른 모델이 이어받으면 품질이 들쭉날쭉할 수 있다는 건 감안해야 해요.
토큰을 아끼면 요금이 메워질까#
첫 표만 보면 이런 계산이 떠오릅니다. Pi 가 요청마다 Claude Code 의 열 분의 일만 보낸다면, extra usage 를 내더라도 아낀 토큰으로 메워지지 않을까. 그래서 세 파일짜리 작은 파이썬 저장소를 주고 같은 세션에서 두 번 물어봤습니다. 처음에는 README 와 소스를 읽고 무엇을 하는 프로젝트인지 두 문장으로 설명하라고 했고, 이어서 평균 함수가 빈 리스트에서 어떻게 실패하는지와 고친 코드를 보여 달라고 했어요. 이번에는 가짜 서버가 아니라 실제 모델이고, Claude Code 는 플러그인·MCP·전역 CLAUDE.md 가 그대로 실린 제 평소 설정입니다.
| 실행 (2026-10-24) | 모델 | 요청 | 입력 토큰 (그중 캐시 읽기) | 출력 토큰 | 정가 환산 |
|---|---|---|---|---|---|
| Claude Code 2.1.287, 제 설정 (도구 34개, MCP 1개) | Claude Opus 5.5 | 5회 | 101,101 (85,314) | 1,569 | 약 0.175달러, 구독 한도에서 차감 |
| Pi 1.4.0, 기본 설정 | GPT-6.1 Sol | 4회 | 6,823 (4,608) | 319 | 약 0.008달러, ChatGPT 플랜에서 차감 |
| Pi 1.4.0, 기본 설정 | Claude Opus 5.5 | 0회 | 첫 요청 6,676자 | 없음 | 400 오류 (extra usage 꺼짐) |
정가 환산은 Claude Code 와 Pi 가 각자 보고한 값입니다. Claude Code 쪽 0.175달러 가운데 0.12달러는 첫 질문에서 1만 5천 토큰을 1시간짜리 프롬프트 캐시에 쓰는 비용이었어요. 캐시가 데워진 두 번째 질문은 요청 한 번에 2만 6천 토큰을 읽고도 0.025달러였고, 그중 절반 이상이 출력이었습니다. Pi 와 Opus 5.5 조합은 400 오류 때문에 재지 못했고, GPT 쪽 숫자는 모델과 토크나이저가 달라 그대로 맞대면 안 됩니다. 요청 크기로 어림하면 같은 일을 Pi 와 Opus 5.5 로 했을 때 정가로 3센트 안팎이 나왔을 거예요.
정가로 보면 Pi 가 확실히 쌉니다. 그런데 Claude 구독자에게 이 비교는 정가끼리 하는 게 아니에요. 구독 안의 Claude Code 는 한도에 닿을 때까지 추가로 내는 돈이 0이고, Pi 에 직접 로그인한 Claude 는 첫 토큰부터 정가로 청구됩니다. 0보다 싸질 수는 없으니 토큰을 얼마나 아끼든 요금이 메워지지는 않습니다. 아끼는 양도 생각보다 작아요. 차이의 대부분은 매 요청 앞에 붙는 고정 접두어인데, 이건 캐시에서 읽혀 Opus 5.5 기준으로 입력 정가의 5% 에 청구됩니다. 캐시가 데워진 뒤에는 요청 한 번에 2만여 토큰, 0.5센트 안팎의 차이예요. 세션이 길어지면 읽은 파일과 도구 출력이 쌓여 대화 자체가 커지니, 10만 토큰짜리 대화에서 2만 토큰의 차이는 다섯 분의 일로 줄어듭니다.
토큰 절약이 실제 돈이 되는 건 어차피 토큰당 내는 자리입니다. API 키로 돌리는 CI 자동화가 그렇고, 위에서 본 Max 의 월 API 크레딧도 정해진 예산이라 접두어가 작을수록 같은 돈으로 요청을 더 보낼 수 있어요. 구독 한도에 자주 닿아 Claude Code 에서도 extra usage 를 쓰는 사람이라면 고정 접두어만큼은 Pi 가 유리하겠지만, 그때도 아끼는 건 요청당 0.5센트 단위입니다. 결국 Claude 구독자가 Pi 를 들이는 이유는 돈이 아니라 앞에서 본 가시성과 통제여야 하고, 그 값을 치르는 방법으로는 ChatGPT 플랜이나 Max 의 API 크레딧이 직접 로그인보다 낫습니다.
들이지 않는 게 나은 경우#
중립으로 비교하겠다고 했으니 반대쪽도 적습니다. 이런 경우라면 Pi 를 들일 이유가 약하거나 오히려 손해일 수 있어요.
권한 확인과 샌드박스를 기본값으로 원한다면 Claude Code 나 Codex 가 낫습니다. Pi 에서 같은 수준을 원하면 컨테이너를 직접 꾸려야 해요. 팀 전체가 같은 도구를 써야 하고 관리자 정책·감사 로그·SSO 가 필요하다면 벤더 제품 쪽이 갖춘 게 많습니다. Pi 는 개인이 자기 손에 맞게 고치는 도구에 가깝고, 그 고친 것들을 팀이 유지하는 비용은 따로 듭니다. sub-agent·plan mode·to-do 를 지금 그대로 쓰고 있다면 Pi 에서는 패키지를 고르거나 수백 줄짜리 extension 을 들여와야 하고요. Claude Max 구독의 한도 안에서 쓰는 게 핵심이라면, 지금은 Claude Code 를 거치는 길만 그 한도를 쓰고 그마저 Anthropic 이 다시 손볼 수 있다는 점을 계산에 넣어야 합니다. 노트북을 닫아도 도는 클라우드 세션이나 예약 실행이 필요하다면 2편에서 본 Claude Code 의 cloud sessions 와 scheduled tasks 가 이미 정식이고, Pi 쪽의 Pi Durable 은 아직 실험 단계예요.
그래서 제가 해 보려는 방식은 바꾸는 게 아니라 옆에 두는 겁니다. 일상의 코딩은 지금처럼 Claude Code 로 하고, 스크립트로 돌리는 읽기 전용 리뷰, 기록으로 남기고 공유해야 하는 조사 세션, 여러 회사 모델을 섞어 봐야 하는 일에 Pi 를 써 보려고요. 그러면서 컨텍스트 기록 extension 을 켜 두면, Claude Code 를 쓸 때 막연하던 “지금 모델이 무엇을 보고 있나” 를 적어도 한쪽에서는 숫자로 보게 됩니다.
자료에 대해#
첫 표와 Pi 예제의 결과는 모두 제 노트북에서 2026년 10월 23일에 가짜 모델 서버로 직접 측정한 것입니다. 이 부분은 실제 모델로 돌리지 않았으므로 응답 품질과 실제 토큰 수는 측정하지 않았고, 토큰 수는 4자당 1토큰으로 어림했습니다. Claude Code 와 Codex 는 빈 설정 디렉터리에서 돌렸기 때문에 플러그인·MCP·사용자 설정이 있는 실제 환경에서는 숫자가 더 커질 수 있고, Codex 는 모델에 따라 요청 모양이 달랐습니다. /tree 의 파일 내 분기와 MCP 설정 복사는 문서로만 확인했습니다. 요금 절의 실제 모델 실행은 10월 24일 제 계정으로 한 번씩만 돌린 것이라 반복 측정이 아니고, 토큰 수는 Claude Code 의 JSON 출력과 Pi 의 세션 파일에 남은 값입니다. 청구서는 확인하지 못했어요. Claude 직접 로그인이 extra usage 로 간다는 건 Anthropic 서버의 오류 응답과 Pi 1.4.0 의 경고 문구로 확인했고, 4월 정책은 고객 메일을 인용한 TechCrunch 기사로, Agent SDK 경로의 차감 방식과 Max 의 API 크레딧은 Anthropic 지원 문서(2026-10-23 조회)로, 5월 발표와 6월 보류는 Ars Technica 기사로, ChatGPT 플랜 사용은 OpenAI 개발자 문서로 확인했어요. pi-claude-bridge 는 패키지 소개문만 읽었습니다. Claude Code 의 /context 와 Pi 의 비교는 제가 확인한 범위의 것입니다.
| 편 | 주제 |
|---|---|
| Part 1 | 하네스란 무엇인가 |
| Part 2 | 하네스 이전과 지금 |
| Part 3 | Pi 라는 하네스 |
| Part 4 (이 글) | Pi 를 옆에 두기 |
References#
최신 자료 (2026)
- 직접 측정: Pi 1.4.0 · Claude Code 2.1.287 · Codex CLI 0.160.0 의 첫 요청 크기, localhost 가짜 모델 서버 (2026-10-23)
- earendil-works/pi docs: sessions · session-format · extensions · cli · configuration · skills · mcp · providers · security · rpc-commands (v1.4.0) [문서]
- pi.dev (조회 2026-10-23) [문서]
- Anthropic, 「Legal and compliance」, Claude Code Docs (조회 2026-10-23) [문서]
- TechCrunch, 「Anthropic says Claude Code subscribers will need to pay extra for OpenClaw support」 (2026-04-04) [제3자 보도]
- Anthropic, 「Use the Claude Agent SDK with your Claude plan」 (2026-10-07 갱신) · 「Monthly API credits for Max and Team plans」, Claude Help Center (조회 2026-10-23) [문서]
- Ars Technica, 「Anthropic “pauses” token-based billing for its Claude Agent SDK」 (2026-06-16) [제3자 보도]
- OpenAI, 「Sign in with ChatGPT: ChatGPT plan usage」 · 「UI/UX guidelines」, OpenAI Developers (조회 2026-10-23) [문서]
- elidickinson, pi-claude-bridge (v0.9.3, 2026-10-13) [제3자 패키지]
- Anthropic, 「How Claude Code works」, Claude Code Docs (조회 2026-10-23) [문서]
비교·배경 자료 (2025)
- Mario Zechner, 「What I learned building an opinionated and minimal coding agent」 (2025-11-30) [개인 글]