← 홈으로

2026 · 개인 · 비공개

성주클루SeongjuClaw

Claude와 로컬 모델을 같은 도구 루프에서 쓰는 AI 에이전트 데스크톱 앱. 폐쇄망 모드 지원

역할
설계·구현 전부
기간
2026.07 – 현재
상태
사용 중
스택
Python, pywebview, Claude API, Ollama, RAG
링크

배경

Claude Code처럼 터미널에서 도구를 쓰는 에이전트를 내 방식대로 뜯어보고 싶었습니다. OpenClaw 같은 프로젝트를 참고하되 “코어는 anthropic 라이브러리 하나”라는 제약을 두고 에이전트 루프를 직접 썼습니다.

무엇을 만들었나

  • 에이전트 코어: 읽기·쓰기·편집·glob·grep 도구 5종에서 시작해 웹 검색, 스킬 시스템(SKILL.md), 영구 메모리, 이미지 입력, 로컬 RAG로 확장했습니다.
  • 앱: pywebview 기반 macOS 네이티브 앱(Windows 지원). 멀티세션·그룹·검색(키워드 + 의미 검색)·대화 분기·내보내기·음성 대화 모드.
  • 모델: Claude 8종 + 로컬 모델(Ollama). Models API로 새 모델을 자동 반영하고, 로컬 탭에서 모델 다운로드·메모리 게이지·서버 온오프까지 제어합니다.
  • 폐쇄망 모드: 외부로 나가는 호출을 전부 차단하고 로컬 모델만으로 동작합니다. 테마가 바뀌고 외부 기능 버튼이 사라져 어느 모드인지 한눈에 보입니다. 환경변수로 켠 폐쇄망은 UI에서 풀 수 없습니다.

기술적 결정

  • 도구 병렬 실행: 한 턴에 온 읽기 도구는 묶어 동시에 처리하고, 쓰기·부작용 도구를 만나면 끊어 순서를 지킵니다.
  • 작업 규율 프롬프트: 추측 금지·편집 전 읽기·반영 확인·완결성을 시스템 프롬프트로 강제하고, 검증한 것과 안 한 것을 구분해 보고하게 했습니다. 이 규칙은 이 포트폴리오를 만드는 동안에도 그대로 지켰습니다.
  • 서버 없는 RAG: fastembed + numpy로 로컬에서 임베딩·검색합니다. 인덱스 서버가 없어 설치가 pip install -e ".[rag]"로 끝납니다.
  • 코어 I/O 핸들러 분리: CLI와 GUI가 같은 엔진을 공유합니다.

트러블슈팅

  • 로컬 모델은 구조화 출력·사고 모드 지원이 모델마다 달라, 모델별 기능 표를 코드에 박지 않고 API 응답값에서 읽도록 바꿨습니다.
  • 90% 컨텍스트 자동 압축, 프롬프트 캐싱, 네트워크 끊김 자동 재시도를 넣기 전까지는 긴 세션이 자주 깨졌습니다.

검증

도구 루프와 RAG는 실제 모델로 end-to-end 실행해 확인했습니다. 위 캡처는 2026년 9월 폐쇄망 모드에서 로컬 모델(gemma4 12b)이 파일을 읽고 답한 실제 실행 화면입니다.