Pi 통합 아키텍처
이 문서는 OpenClaw가 pi-coding-agent 및 그 형제 패키지(pi-ai, pi-agent-core, pi-tui)와 통합되어 AI 에이전트 기능을 제공하는 방식을 설명합니다.
개요
OpenClaw는 pi SDK를 사용해 메시징 게이트웨이 아키텍처 안에 AI 코딩 에이전트를 내장합니다. pi를 하위 프로세스로 실행하거나 RPC 모드를 사용하는 대신, OpenClaw는createAgentSession()을 통해 pi의 AgentSession을 직접 import하고 인스턴스화합니다. 이 내장 방식은 다음을 제공합니다:
- 세션 수명 주기와 이벤트 처리에 대한 완전한 제어
- 커스텀 도구 주입(메시징, sandbox, 채널별 액션)
- 채널/컨텍스트별 system prompt 커스터마이징
- 브랜칭/압축 지원이 있는 세션 영속화
- 장애 조치를 포함한 다중 계정 auth 프로필 순환
- provider에 종속되지 않는 모델 전환
패키지 의존성
| Package | 용도 |
|---|---|
pi-ai | 핵심 LLM 추상화: Model, streamSimple, 메시지 타입, provider API |
pi-agent-core | 에이전트 루프, 도구 실행, AgentMessage 타입 |
pi-coding-agent | 상위 수준 SDK: createAgentSession, SessionManager, AuthStorage, ModelRegistry, 내장 도구 |
pi-tui | 터미널 UI 구성 요소(OpenClaw의 로컬 TUI 모드에서 사용) |
파일 구조
src/agents/tools 아래가 아니라 plugin 소유 extension
디렉터리에 있습니다. 예를 들면 다음과 같습니다:
- Discord plugin 액션 런타임 파일
- Slack plugin 액션 런타임 파일
- Telegram plugin 액션 런타임 파일
- WhatsApp plugin 액션 런타임 파일
핵심 통합 흐름
1. 내장 에이전트 실행
메인 진입점은pi-embedded-runner/run.ts의 runEmbeddedPiAgent()입니다:
2. 세션 생성
runEmbeddedPiAgent()가 호출하는 runEmbeddedAttempt() 내부에서는 pi SDK를 사용합니다:
3. 이벤트 구독
subscribeEmbeddedPiSession()은 pi의 AgentSession 이벤트를 구독합니다:
message_start/message_end/message_update(스트리밍 텍스트/생각)tool_execution_start/tool_execution_update/tool_execution_endturn_start/turn_endagent_start/agent_endauto_compaction_start/auto_compaction_end
4. 프롬프팅
설정이 끝나면 세션에 프롬프트를 보냅니다:images를 통해 전달합니다. 이전 기록 턴을 다시 스캔해
이미지 payload를 재주입하지는 않습니다.
도구 아키텍처
도구 파이프라인
- 기본 도구: pi의
codingTools(read,bash,edit,write) - 커스텀 대체: OpenClaw는
bash를exec/process로 대체하고, sandbox용으로read/edit/write를 커스터마이징합니다 - OpenClaw 도구: 메시징, 브라우저, 캔버스, 세션, cron, 게이트웨이 등
- 채널 도구: Discord/Telegram/Slack/WhatsApp 전용 액션 도구
- 정책 필터링: 프로필, provider, 에이전트, 그룹, sandbox 정책에 따라 도구 필터링
- 스키마 정규화: Gemini/OpenAI 특이점에 맞게 스키마 정리
- AbortSignal 래핑: 중단 신호를 존중하도록 도구 래핑
도구 정의 어댑터
pi-agent-core의AgentTool은 pi-coding-agent의 ToolDefinition과 다른 execute 시그니처를 가집니다. pi-tool-definition-adapter.ts의 어댑터가 이를 연결합니다:
도구 분할 전략
splitSdkTools()는 모든 도구를 customTools로 전달합니다:
System prompt 구성
system prompt는buildAgentSystemPrompt()(system-prompt.ts)에서 빌드됩니다. Tooling, Tool Call Style, Safety guardrails, OpenClaw CLI reference, Skills, Docs, Workspace, Sandbox, Messaging, Reply Tags, Voice, Silent Replies, Heartbeats, Runtime metadata 섹션과, 활성화된 경우 Memory 및 Reactions, 선택적 컨텍스트 파일과 추가 system prompt 콘텐츠를 포함한 전체 prompt를 조립합니다. 섹션은 subagent에 사용되는 최소 prompt 모드에 맞게 잘립니다.
prompt는 세션 생성 후 applySystemPromptOverrideToSession()을 통해 적용됩니다:
세션 관리
세션 파일
세션은 트리 구조(id/parentId 연결)를 가진 JSONL 파일입니다. pi의 SessionManager가 영속화를 처리합니다:
guardSessionManager()로 감쌉니다.
세션 캐싱
session-manager-cache.ts는 반복적인 파일 파싱을 피하기 위해 SessionManager 인스턴스를 캐시합니다:
기록 제한
limitHistoryTurns()는 채널 유형(DM 대 그룹)에 따라 대화 기록을 잘라냅니다.
압축
자동 압축은 컨텍스트 초과 시 트리거됩니다. 일반적인 초과 시그니처에는request_too_large, context length exceeded, input exceeds the maximum number of tokens, input token count exceeds the maximum number of input tokens, input is too long for the model, ollama error: context length exceeded가 포함됩니다. 수동
압축은 compactEmbeddedPiSessionDirect()가 처리합니다:
인증 및 모델 해석
Auth 프로필
OpenClaw는 provider별로 여러 API 키를 가진 auth 프로필 저장소를 유지합니다:모델 해석
장애 조치
구성된 경우FailoverError가 모델 폴백을 트리거합니다:
Pi extensions
OpenClaw는 특수 동작을 위해 커스텀 pi extensions를 로드합니다:압축 safeguard
src/agents/pi-hooks/compaction-safeguard.ts는 적응형 토큰 예산과 도구 실패 및 파일 작업 요약을 포함한 압축 가드레일을 추가합니다:
컨텍스트 가지치기
src/agents/pi-hooks/context-pruning.ts는 캐시 TTL 기반 컨텍스트 가지치기를 구현합니다:
스트리밍 및 블록 답변
블록 청킹
EmbeddedBlockChunker는 스트리밍 텍스트를 개별 답변 블록으로 관리합니다:
Thinking/Final 태그 제거
스트리밍 출력은<think>/<thinking> 블록을 제거하고 <final> 내용을 추출하도록 처리됩니다:
답변 지시어
[[media:url]], [[voice]], [[reply:id]] 같은 답변 지시어는 파싱되어 추출됩니다:
오류 처리
오류 분류
pi-embedded-helpers.ts는 적절한 처리를 위해 오류를 분류합니다:
Thinking 수준 폴백
thinking 수준이 지원되지 않으면 폴백됩니다:Sandbox 통합
sandbox 모드가 활성화되면 도구와 경로가 제한됩니다:Provider별 처리
Anthropic
- Refusal 매직 문자열 제거
- 연속 역할에 대한 턴 검증
- 엄격한 업스트림 Pi 도구 파라미터 검증
Google/Gemini
- plugin 소유 도구 스키마 정리
OpenAI
- Codex 모델용
apply_patch도구 - Thinking 수준 다운그레이드 처리
TUI 통합
OpenClaw에는 pi-tui 구성 요소를 직접 사용하는 로컬 TUI 모드도 있습니다:Pi CLI와의 주요 차이점
| 항목 | Pi CLI | OpenClaw Embedded |
|---|---|---|
| 호출 방식 | pi 명령 / RPC | createAgentSession()을 통한 SDK |
| 도구 | 기본 코딩 도구 | 커스텀 OpenClaw 도구 모음 |
| System prompt | AGENTS.md + prompts | 채널/컨텍스트별 동적 구성 |
| 세션 저장소 | ~/.pi/agent/sessions/ | ~/.openclaw/agents/<agentId>/sessions/ (또는 $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/) |
| Auth | 단일 자격 증명 | 순환이 가능한 다중 프로필 |
| Extensions | 디스크에서 로드 | 프로그래밍 방식 + 디스크 경로 |
| 이벤트 처리 | TUI 렌더링 | 콜백 기반(onBlockReply 등) |
향후 고려 사항
잠재적 재작업 영역:- 도구 시그니처 정렬: 현재 pi-agent-core와 pi-coding-agent 시그니처 사이를 어댑트하고 있음
- 세션 관리자 래핑:
guardSessionManager는 안전성을 추가하지만 복잡성을 높임 - Extension 로딩: pi의
ResourceLoader를 더 직접적으로 사용할 수 있음 - 스트리밍 핸들러 복잡성:
subscribeEmbeddedPiSession이 많이 커짐 - Provider 특이점: pi가 잠재적으로 처리할 수 있는 provider별 코드 경로가 많음
테스트
Pi 통합 커버리지는 다음 테스트 스위트에 걸쳐 있습니다:src/agents/pi-*.test.tssrc/agents/pi-auth-json.test.tssrc/agents/pi-embedded-*.test.tssrc/agents/pi-embedded-helpers*.test.tssrc/agents/pi-embedded-runner*.test.tssrc/agents/pi-embedded-runner/**/*.test.tssrc/agents/pi-embedded-subscribe*.test.tssrc/agents/pi-tools*.test.tssrc/agents/pi-tool-definition-adapter*.test.tssrc/agents/pi-settings.test.tssrc/agents/pi-hooks/**/*.test.ts
src/agents/pi-embedded-runner-extraparams.live.test.ts(OPENCLAW_LIVE_TEST=1활성화)