AgentOffice 로컬 실험기: 에이전트를 사무실 UI로 바라보기

이 글은 agent-office라는 멀티 에이전트 시뮬레이션 앱을 로컬에서 고쳐가며 실행해 본 기록이다. 처음에는 단순히 “AI 에이전트들이 사무실에서 움직이는 UI” 정도로 보였지만, 손을 대다 보니 더 흥미로운 질문으로 이어졌다.

로컬에서 돌아가거나 기록된 에이전트들의 상태를 하나의 사무실 풍경으로 볼 수 있을까?

이번 실험의 결론부터 말하면, 가능했다. 다만 처음부터 가볍게 가능했던 것은 아니다. Ollama 기반 사고 루프는 내 로컬 환경에서 꽤 무거웠고, Colyseus 버전 차이와 오래된 의존성 문제도 있었다. 그래서 먼저 앱을 “가볍게 관찰 가능한 상태”로 만든 뒤, Paperclip 백업 데이터를 가져와 사무실 UI에 뿌리는 데모까지 붙였다.

AgentOffice Paperclip Demo Import 화면

시작점

처음 다룬 저장소는 harishkotra/agent-office였다. 구조는 대략 다음과 같았다.

  • 서버는 Colyseus 기반의 멀티플레이 룸을 관리한다.
  • UI는 Vite/React/Phaser 기반으로 사무실 맵과 패널을 보여준다.
  • Alice, Bob 같은 에이전트가 위치, 행동, 생각, 작업, 감정 상태를 가진다.
  • Ollama를 붙이면 로컬 모델이 에이전트의 다음 행동을 결정한다.

개념은 매력적이었다. 에이전트를 채팅 로그나 터미널 출력으로만 보는 것이 아니라, “공간 안의 동료”처럼 보는 방식이기 때문이다. 하지만 원본 그대로는 내 로컬에서 매끄럽게 돌리기 어려웠다.

먼저 한 정리

가장 먼저 한 일은 실행 기반을 정리하는 것이었다.

  1. 의존성 보안 업그레이드
  2. pixel-agents-repo 중첩 구조 제거
  3. Ollama URL/model 설정을 환경변수화
  4. Colyseus 서버/클라이언트 버전 차이 대응
  5. 로컬 테스트용 AI 비활성화 모드 추가

특히 중요한 변화는 이것이었다.

1
2
3
AGENT_OFFICE_AI_ENABLED=false
OLLAMA_URL=http://localhost:11434
OLLAMA_MODEL=gemma4:e4b

AGENT_OFFICE_AI_ENABLED=false를 두면 Ollama 사고 루프를 끄고 UI와 이벤트 흐름만 확인할 수 있다. 처음에는 이것이 단순한 우회처럼 보였지만, 결과적으로는 더 좋은 실험 기반이 되었다. 무거운 추론을 잠시 제거하자, “에이전트 상태를 시각화하는 인터페이스” 자체를 훨씬 빠르게 다룰 수 있었다.

Demo Test 버튼

AI 루프를 꺼두면 화면은 가벼워지지만, 에이전트가 생각하거나 작업하는 모습도 사라진다. 그래서 Demo Test 버튼을 추가했다.

이 버튼은 서버의 /api/demo-test를 호출한다. 그러면 서버가 deterministic demo event를 만들어 방에 broadcast한다.

  • Alice에게 QA 체크리스트 작업 부여
  • Bob에게 blocker triage 작업 부여
  • chat 이벤트 전송
  • highlight 이벤트 전송
  • task board 업데이트
  • relationship graph 업데이트

여기서 핵심은 “가짜 데이터”라기보다 “로컬 관찰용 fixture”에 가깝다는 점이다. LLM이 없어도 UI, WebSocket, task board, highlight feed가 살아 있는지 확인할 수 있다.

Paperclip과 연결하기

다음 질문은 자연스럽게 Paperclip으로 넘어갔다.

Paperclip은 내가 로컬에서 실험하던 멀티 에이전트 오케스트레이션 프로젝트다. 현재 서버 소스는 이동되었거나 지워진 상태였지만, .paperclip 인스턴스 데이터는 남아 있었다.

발견한 경로는 다음과 같다.

1
C:/Users/crescent/.paperclip/instances/default/

그 안에는 PostgreSQL 데이터 디렉터리, 로그, 그리고 SQL 백업이 있었다.

1
C:/Users/crescent/.paperclip/instances/default/data/backups/

Paperclip 서버를 다시 띄우지 않아도, 최신 SQL 백업을 읽으면 회사, 에이전트, 프로젝트, 이슈, 활동 로그를 복원할 수 있었다. 그래서 AgentOffice 서버에 Paperclip Demo Import 기능을 붙였다.

Paperclip Demo Import

Paperclip Demo Import 버튼은 서버의 /api/paperclip-demo-import를 호출한다.

서버는 최신 Paperclip SQL 백업을 찾아서 다음 테이블을 파싱한다.

  • companies
  • agents
  • projects
  • issues
  • activity_log

그리고 이 데이터를 AgentOffice의 세계로 변환한다.

Paperclip 데이터 AgentOffice 표현
company scenario/highlight 제목
agent 사무실 캐릭터
issue task board 항목
activity_log highlight 이벤트
agent status 캐릭터 action/mood/risk/momentum

실제 최신 백업에서는 다음 데이터가 들어왔다.

1
2
3
4
5
company: Read-Master
agents: 1
projects: 1
active issues: 2
activity events: 17

Paperclip 서버가 꺼져 있어도, 과거의 에이전트 조직 상태를 사무실 UI로 다시 불러오는 데는 충분했다.

흥미로웠던 점

이번 실험에서 가장 흥미로웠던 점은 AgentOffice가 단순한 “AI 캐릭터 놀이”가 아니라는 것이다.

조금만 바꾸면 이것은 로컬 에이전트 시스템들을 위한 관측 레이어가 된다.

터미널 로그는 시간순 기록을 잘 보여준다. 대시보드는 상태 요약을 잘 보여준다. 하지만 사무실 UI는 관계와 분위기를 보여준다. 어떤 에이전트가 바쁜지, 어떤 이슈가 떠 있는지, 조직 전체가 안정적인지 불안정한지 한눈에 느낄 수 있다.

이런 시각화는 정확한 운영 도구라기보다 “인지적 표면”에 가깝다. 내가 지금 무엇을 보고 있는지, 어떤 에이전트가 살아 있는지, 어떤 일이 걸려 있는지를 빠르게 감각화하게 해준다.

이번에 얻은 구조

현재 구조는 이렇게 정리할 수 있다.

1
2
3
4
5
6
7
8
9
Paperclip SQL Backup

paperclipImport parser

AgentOffice server API

Colyseus room broadcast

React/Phaser office UI

이 흐름은 서버가 살아 있는 시스템뿐 아니라, 백업/로그/스냅샷만 남은 시스템도 시각화할 수 있게 한다. 이 지점이 마음에 든다. 에이전트 실험은 자주 깨지고, 이동하고, 버려진다. 그래도 흔적이 남아 있다면 다시 하나의 장면으로 불러올 수 있다.

남은 과제

아직 이 실험은 완성된 제품이 아니다. 다음 단계는 명확하다.

  • Paperclip 서버가 살아 있을 때 live API polling 연결
  • 여러 Paperclip agent를 좌석/팀/역할별로 배치
  • activity log를 timeline replay로 재생
  • issue 상태별 색상과 zone 표시
  • Ollama/LLM loop를 필요할 때만 켜는 hybrid mode
  • 번들 크기 줄이기와 UI 패널 정리

특히 live 연결이 붙으면 AgentOffice는 단순한 데모가 아니라 “로컬 에이전트 관제실”에 가까워질 수 있다.

마무리

이번 실험은 꽤 작은 로컬 수선에서 시작했다. 의존성을 올리고, 무거운 모델 호출을 끄고, 데모 버튼을 붙이는 정도였다. 그런데 그 위에 Paperclip 백업을 얹자 방향이 바뀌었다.

에이전트를 꼭 채팅창 안에만 둘 필요는 없다. 작업, 관계, 활동 로그, 실패 흔적까지 하나의 공간으로 볼 수 있다.

AgentOffice는 아직 거칠다. 하지만 이 거친 화면 안에는 내가 좋아하는 가능성이 있다. 로컬의 여러 AI 실험을 한 사무실 안에 불러와서, 사람처럼 보는 것이 아니라 시스템처럼 느끼는 가능성이다.

Comments

댓글

GitHub 계정으로 의견을 남길 수 있습니다. 댓글은 GitHub Discussions에 저장됩니다.