TRENDSHIFT DAILY #2 · 2026-07-25 · OPENWORKER · 오픈소스 AI 코워커

andrewyng/openworker 딥다이브
— 채팅이 아니라 완성된 결과물을 내놓는, 내 컴퓨터 위의 오픈소스 AI 동료

OpenWorker는 앤드류 응(Andrew Ng)이 공개한 오픈소스 AI 코워커(AI coworker)다. 한 문장으로 말하면 "내 데스크탑에서 돌아가면서, 내 파일·터미널·업무 앱(Slack·GitHub·Jira 등 25개+)을 직접 다뤄 다듬어진 문서·정리된 캘린더·숫자가 담긴 Slack 답장 같은 '끝난 일'을 가져다주는 로컬 에이전트 앱"이다.

이 프로젝트의 급소는 이것이다: 챗봇은 "할 일 목록"을 주지만, OpenWorker는 "완성된 결과물(finished work)"을 준다. 게다가 특정 모델에 묶이지 않는다 — OpenAI·Anthropic·Gemini는 물론, DeepSeek·Kimi·Qwen 같은 오픈웨이트, 그리고 Ollama로 완전 로컬까지 내 API 키를 꽂아 쓴다. 데이터는 내가 고른 모델·연동을 통해서만 컴퓨터를 벗어난다.

(저장소 andrewyng/openworker · 제작 Andrew Ng 팀 · 백엔드 Python 3.10+ · 데스크탑 Tauri(Rust)+React 18 · 엔진은 aisuite 기반 · 라이선스 MIT · Open Beta · shallow clone 소스 직접 분석)
목차
  1. 프로젝트 한 줄 요약
  2. 왜 주목받는가 — 챗봇을 넘어 '완성된 일'로
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트
  7. 하드웨어 / 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한 줄 요약

"대화하는 AI"가 아니라 "일을 끝내주는 AI"

대부분의 AI 도우미는 "물어보면 → 답을 알려주는" 챗봇이다. 요약도 해주고 코드도 짜주지만, 결국 "이렇게 하세요"라는 안내를 남기고 실행은 내 몫으로 넘긴다. OpenWorker는 이 틀을 깬다. "고객 브리핑 준비해줘", "내 캘린더 정리해줘", "Jira랑 GitHub 걸쳐서 릴리스 어디까지 왔는지 확인해줘" 같은 결과(outcome)를 말하면, 그것을 단계로 쪼개 내 파일·앱을 넘나들며 작업하고, 열어서 바로 쓸 수 있는 파일 / 보낸 메시지 / 갱신된 캘린더를 돌려준다.

핵심 비유

"검색해서 알려주는 인턴" vs "일을 대신 마쳐주는 동료"

일반 챗봇이 "자료 찾아서 요약 읽어주는 인턴"이라면, OpenWorker는 "자리 옆에 앉아 실제 업무 계정으로 문서를 만들고, Slack에 답장하고, 캘린더를 고쳐놓는 동료"다.

단, 이 동료는 중요한 일을 하기 전엔 반드시 물어본다. 메시지를 보내거나, 캘린더를 바꾸거나, 터미널 명령을 실행하기 직전에 "이거 해도 될까요?"라고 확인을 받는다. 승인·수정·거부는 전부 내가 한다.

그리고 OpenWorker는 로컬 우선(local-first)이다. 에이전트 루프, 대화 기록, 연동 토큰, 모델 키가 전부 내 컴퓨터의 로컬 시크릿 저장소에 있다. 유일한 클라우드 조각은 연동(OAuth) 악수를 중개하는 작은 서비스뿐이고, 로그인 없이도 수동 발급한 API 키로 연동을 쓸 수 있다. "내 데이터가 어디로 새는가"를 스스로 통제할 수 있다는 뜻이다.

용어 풀이
AI 코워커 (AI coworker)
단순히 질문에 답하는 챗봇을 넘어, 사용자의 도구·파일·계정을 직접 조작해 완성된 산출물을 만들어내는 에이전트. OpenWorker는 이를 "채팅이 아닌 완성된 일(finished work, not just chat)"이라는 슬로건으로 요약한다.

2왜 주목받는가 — 챗봇을 넘어 '완성된 일'로

TrendShift Daily 상위권에 오른 이유 3가지

이 저장소가 트렌딩에 오른 데는 세 가지 결이 겹친다: (1) 만든 사람의 무게, (2) "결과물 중심" 철학, (3) 모델·데이터 주권을 사용자에게 돌려주는 설계.

① 앤드류 응이 만든 오픈소스 에이전트

OpenWorker는 Coursera·DeepLearning.AI 창립자이자 AI 교육의 대명사인 앤드류 응(Andrew Ng) 팀이 공개했다. 흥미로운 점은 이 엔진이 그가 만든 또 다른 오픈소스 aisuite 위에 세워졌다는 것 — OpenWorker는 원래 aisuite 저장소 안에서 개발되다가 독립한 프로젝트다. 즉 "aisuite로 실제 제품급 에이전트를 어떻게 조립하는가"의 살아있는 레퍼런스이기도 하다.

② "할 일 목록"이 아니라 "결과물"을 준다

README가 반복해 강조하는 차별점은 deliverable(산출물)이다. 문서·스프레드시트·리포트·웹페이지가 열어서 공유할 수 있는 실제 파일로 떨어진다. Slack에서 @OpenWorker를 멘션하면 내 데스크탑에서 세션이 열리고, 내 도구로 작업이 이뤄진 뒤, 답이 스레드 답장으로 돌아온다. 아침 브리핑·주간 리포트 같은 반복 업무는 스케줄(automation)로 돌려두면 앱 안에 전체 기록과 함께 결과가 쌓인다.

한 걸음 더

보통의 "AI 에이전트 데모"는 화면 안에서만 뭔가 하는 척하다 끝난다. OpenWorker의 승부처는 "산출물이 파일 시스템·업무 앱에 실제로 남는가"이다. 그래서 파일 도구, 25개+ 커넥터, 터미널이 1급 시민으로 붙어 있다.

③ 모델·데이터 주권 (BYOM + local-first)

OpenWorker는 특정 모델 회사에 묶이지 않는다(BYOM · Bring Your Own Model). 제공자를 고르고 키를 붙이면 언제든 바꿀 수 있다. 기본 지원만 해도 OpenAI · Anthropic · Google Gemini · Inkling(Thinking Machines) · GLM(Z.ai) · DeepSeek · Kimi(Moonshot) · Qwen · MiniMax · Mistral · Grok(xAI), 여기에 Together·Fireworks의 오픈웨이트, 그리고 Ollama 완전 로컬까지 포함된다. 데스크탑에서 로컬로 돌기 때문에 프라이버시 통제권이 사용자에게 있다.

구분일반 클라우드 AI 비서OpenWorker
실행 위치제공사 서버내 데스크탑(로컬 에이전트 서버)
산출물채팅 답변 위주실제 파일·메시지·캘린더 변경
모델 선택고정(그 회사 모델)BYOM — 11개+ 제공자 & Ollama 로컬
위험 행동제공사 정책쓰기·전송·셸은 사용자 승인 게이트
데이터 경로서버 경유local-first, OAuth 중개만 클라우드
라이선스대개 독점MIT 오픈소스

3기술 스택 전체 지도

백엔드(Python) · 데스크탑(Tauri+React) · STT(Rust) 세 겹

OpenWorker는 세 개의 몸통으로 이루어진다: ① 로컬 에이전트 서버(Python), ② 데스크탑 앱(Tauri 셸 + React UI), ③ 음성 입력용 STT 사이드카(Rust). 세 겹을 하나씩 뜯어보자.

백엔드 — Python 에이전트 서버 (coworker/)

핵심 두뇌다. pyproject.toml의 패키지 이름은 흥미롭게도 coworker(제품명 OpenWorker와 별개의 내부 이름)이며 "provider-agnostic agentic coworker runtime"으로 스스로를 정의한다.

영역라이브러리 / 기술역할
에이전트 프레임워크aisuite(git 커밋 고정 핀)제공자 통합 chat-completions API + 툴킷·MCP·트레이싱 레이어
모델 제공자openai · anthropic · google-genaiClaude Messages API·Gemini 네이티브 제공자 직접 포함
웹 서버FastAPI + uvicorn로컬 에이전트 HTTP 서버(--port 8765)
TUItextual터미널 기반 UI(GUI 없이도 사용)
데이터 검증pydantic v2모델/설정 스키마
도구 연동mcp>=1.1MCP 클라이언트(stdio + streamable-http)
스케줄croniterautomation 스케줄러의 cron 다음-실행 계산
웹 검색ddgs(DuckDuckGo)키 없이 쓰는 기본 검색(Tavily·Brave는 httpx)
PDFpypdf + pypdfium2텍스트 추출 + 페이지 래스터화(AGPL PyMuPDF 회피)
메시징(옵션)slack-bolt · python-telegram-bot · aiohttp인바운드 메시지 수신 리스너
브라우저(옵션)playwright인터랙티브 브라우저 자동화
용어 풀이
aisuite
앤드류 응 팀의 경량 Python 라이브러리. 여러 LLM 제공자를 하나의 chat-completions API로 통일하고, 그 위에 도구(tools)·툴킷(toolkits)·MCP를 얹는 에이전트 레이어를 제공한다. OpenWorker의 엔진이 이 위에 올라가 있다.
함정 주의
aisuite는 PyPI가 아니라 git 커밋으로 고정돼 있다

pyproject.tomlaisuite @ git+https://.../aisuite.git@1b4bbf30...처럼 특정 커밋 해시를 물고 있다. OpenWorker가 이 저장소에서 임포트된 그 시점의 aisuite에 맞춰졌기 때문 — 다음 aisuite 릴리스가 나오면 PyPI 핀으로 바꾼다고 주석에 적혀 있다.

프론트엔드 — 데스크탑 앱 (surfaces/gui/)

영역기술역할
데스크탑 셸Tauri 2(Rust)네이티브 창 + 서버 프로세스 감독(supervise)
UI 프레임워크React 18 + TypeScript 5대화·승인·인박스·트랜스크립트 화면
빌드Vite 5개발 서버 + 번들러
스타일Tailwind 3 + PostCSSUI 스타일링
문서 렌더react-markdown + remark-gfm마크다운 산출물 미리보기
파일 처리pdfjs-dist · xlsx(SheetJS)PDF·엑셀 산출물 표시
테스트Vitest + Playwright단위 + hermetic E2E
Tauri가 뭐길래?

Electron이 "크롬 통째로 앱에 넣기"라면, Tauri는 OS에 이미 있는 웹뷰를 쓰고 백엔드를 Rust로 짠다. 그래서 앱이 훨씬 가볍다. 여기서 Tauri 셸은 창을 띄우는 동시에 Python 에이전트 서버 프로세스를 직접 켜고 돌본다 — 사용자는 "앱 하나"를 켜지만 안에서는 Rust+Python이 함께 돈다.

STT 사이드카 (stt/, Rust)

음성 입력을 위한 별도 speech-to-text 사이드카(Rust)가 붙어 있다. 말로 지시하면 텍스트로 바꿔 에이전트에 넣는 구조다. "사이드카"란 본체(에이전트 서버) 옆에 붙어 특정 기능만 담당하는 보조 프로세스를 뜻한다.

4아키텍처 심화 분석

TurnEngine · PermissionEngine · Inbox 세 축으로 이해한다

OpenWorker의 코드에서 배울 가치가 가장 큰 부분이다. "에이전트가 도구를 쓰다가 위험한 행동 앞에서 멈추고 사람 승인을 기다린다"를 실제로 어떻게 구현했는지 뜯어보자. 전체 그림은 이렇다.

┌─────────────────────────────────────────────────────────┐ │ OpenWorker 데스크탑 앱 (Tauri + React) │ 네이티브 창 + GUI ├─────────────────────────────────────────────────────────┤ │ 로컬 에이전트 서버 (Python · FastAPI/uvicorn) │ engine · tools · connectors │ ┌────────────┐ ┌──────────────┐ ┌──────────────────┐ │ (aisuite 위) │ │ TurnEngine │→ │PermissionEng.│→ │ Inbox (승인 대기) │ │ │ │ 에이전트 루프│ │allow/deny/ask│ │ pending→resolved │ │ │ └────────────┘ └──────────────┘ └──────────────────┘ │ ├───────────────┬──────────────────┬──────────────────────┤ │ 내 파일 │ 내 도구 │ 내 모델 │ 전부 내 키로, │ & 터미널 │ 25개+ 커넥터+MCP │ 아무 제공자나 │ 내 컴퓨터에서 └───────────────┴──────────────────┴──────────────────────┘ ↑ local-first: 클라우드는 OAuth 중개 서비스 하나뿐

축 ① TurnEngine — 소유한 에이전트 루프 (engine.py, 1033줄)

한 번의 사용자 발화(turn)는 "모델 ↔ 도구"를 여러 번 오가는 반복이다. 모델이 도구를 그만 요청하거나, 안전 레일이 걸리거나, 사용자가 중단할 때까지 이어진다. 핵심 설계 결정들:

# engine.py — 승인 결과는 4가지로 갈린다 (ApprovalOutcome)
class ApprovalOutcome(str, Enum):
    ONCE           = "once"            # 이번 한 번만 허용
    ALWAYS_TOOL    = "always_tool"     # 이 도구는 앞으로 자동 허용
    ALWAYS_COMMAND = "always_command"  # 이 명령(prefix)은 자동 허용
    DENY           = "deny"            # 거부

축 ② PermissionEngine — allow / deny / ask-user 판정 (permissions.py + risk.py)

"무엇을 자동 허용하고, 무엇을 물어볼지"를 결정하는 두뇌다. 두 개의 개념이 맞물린다: 모드(Mode)위험 클래스(RiskClass).

모드(Mode) — 세션의 자유도

모드동작
DISCUSS읽기 전용 대화. 편집·계획 워크플로 없음
PLAN읽기 전용 + 계획 계약(탐색→propose_plan→실행)
INTERACTIVE기본값. 읽기는 자동, 쓰기·명령은 승인 요청
AUTO전부 허용(단 경로 스코프는 유지)
CUSTOMINTERACTIVE + 설정의 auto_allow 도구는 자동 허용

위험 클래스(RiskClass) — 도구의 부작용 등급

예전엔 권한 엔진이 WRITE_TOOLS/SHELL_TOOL 같은 이름 집합을 코드에 박아 뒀지만, 지금은 위험을 도구가 선언하는 속성으로 바꿨다. classify() 하나가 이를 읽는다.

# risk.py — 부작용 카테고리 4단계
class RiskClass(str, Enum):
    READ         = "read"          # 부작용 없음 → 항상 허용
    WRITE_LOCAL  = "write_local"   # 워크스페이스 변경 → 경로스코프+모드게이트
    EXEC         = "exec"          # 명령 실행 → 모드게이트
    EXTERNAL     = "external"      # 컴퓨터 밖 부작용 → 무인 Inbox 훅

# 효과적 위험 = 사용자 오버라이드 ?? 이름표 ?? aisuite 메타데이터 ?? READ
잘 만든 지점
셸 메타문자 = 자동허용 자격 박탈

allowlist에 등록된 명령이라도 ; && | > $( 같은 셸 연산자가 하나라도 있으면 자동 실행 자격을 잃고 승인을 요구한다. ls를 허용했다고 ls; rm -rf ~가 통과하는 참사를 막는 아주 실전적인 방어다.

축 ③ Inbox — 세션을 가로지르는 '사람 주의' 큐 (inbox.py)

여러 세션이 동시에 돌거나, 사용자가 자리를 비운 채 세션이 무인(Unattended)으로 돌아갈 때, 다른 에이전트들이 사람에게 필요로 하는 것(승인·질문·알림)을 담아두는 정본(store of record) 큐다. 메시징 커넥터·모바일은 같은 항목을 나르는 "운송 수단"일 뿐이다.

보너스 — Self-wake: 잠들었다 깨는 에이전트 (selfwake.py)

상시 대기(always-on) 에이전트를 suspend/resume(중단/재개) 방식으로 바꿔 유휴 비용을 거의 0으로 만든다. 세션이 잠들고, 깨어날 조건(wake)이 되면 런타임이 다시 부른다. 두 가지 트리거 — 타이머(sleep_for/sleep_until)와 완료 시(wake_on: 백그라운드 작업이 끝나면 깨움). 이 깨우기는 automation 스케줄러의 tick이 소비한다.

5디렉토리 구조 해부

어디에 무엇이 있는지 — 3겹(백엔드/데스크탑/사이드카) 지도
openworker/ ├─ coworker/ Python 백엔드 (에이전트 엔진·제공자·커넥터·MCP·메모리·자동화) │ ├─ engine.py ★ TurnEngine — 소유한 에이전트 루프 (1033줄) │ ├─ agent.py Agent → TurnEngine 조립(도구+권한+메모리+스킬 카탈로그) │ ├─ permissions.py ★ PermissionEngine — allow/deny/ask 판정 │ ├─ risk.py 위험 클래스(READ/WRITE_LOCAL/EXEC/EXTERNAL) │ ├─ inbox.py ★ Inbox — 세션 횡단 '사람 주의' 큐(pending→resolved) │ ├─ selfwake.py suspend/resume(타이머·완료 트리거) │ ├─ cloud.py 클라우드 중개(OAuth 등, 678줄) │ ├─ conversations.py 대화 상태 저장 │ ├─ pdf_support.py PDF 첨부(네이티브 미지원 모델용) │ ├─ secrets.py 로컬 시크릿 저장소(키·토큰) │ ├─ server/ FastAPI 서버 │ │ ├─ app.py HTTP 라우트(1773줄) │ │ ├─ manager.py 세션 매니저(3505줄 — 가장 큰 파일) │ │ └─ run.py 서버 엔트리(openworker-server) │ ├─ tools/ 내장 도구 │ │ ├─ shell.py run_shell + LocalExecutor(589줄) │ │ ├─ files.py search.py git.py todo.py plan.py ask.py │ │ └─ subagent.py ★ explore — 읽기전용 리서치 서브에이전트 │ ├─ connectors/ 25개+ 외부 연동(GitHub·Slack·Jira·Notion…) │ ├─ memory/ 영속 메모리(SQLite, 스코프 global/workspace/session) │ ├─ automation/ 스케줄러(cron·run-once-catch-up·skip-on-overlap) │ ├─ personas/ 페르소나(YAML frontmatter + builtin/ops.md) │ ├─ providers/ 모델 제공자 라우팅 │ ├─ skills/ 스킬(progressive disclosure + load_skill) │ ├─ mcp/ MCP 클라이언트 계층 │ └─ tui/ 터미널 UI(textual) ├─ surfaces/gui/ 데스크탑 앱 — React UI + Tauri 셸 │ ├─ src/ React 컴포넌트 │ └─ src-tauri/ Rust 셸(tauri.conf.json, Cargo.toml) ├─ stt/ 음성 입력 STT 사이드카(Rust) ├─ packaging/ 설치본 빌드(macOS DMG·Windows·자동업데이트·dev 부트스트랩) ├─ docs/ 설계 스펙 & 결정 로그(PERMISSIONS-AND-INBOX.md 등) ├─ tests/ 백엔드 테스트 └─ pyproject.toml 패키지명 'coworker' · aisuite git 핀
규모 감각

server/manager.py3505줄, server/app.py가 1773줄, engine.py가 1033줄이다. "세션을 관리하고(manager) → HTTP로 노출하고(app) → 실제 루프를 도는(engine)" 3단이 코드량의 중심이다. 처음 읽는다면 engine.py → permissions.py → risk.py → inbox.py 순서를 추천한다. 여기가 이 프로젝트의 '설계 사상'이 응축된 곳이다.

6학습 포인트

이 저장소에서 실제로 배울 수 있는 것들

① 프로덕션급 에이전트 루프 설계

튜토리얼의 while 루프가 아니라 실제 앱이 쓰는 에이전트 루프를 볼 수 있다. async 루프에서 블로킹 호출을 스레드로 격리하는 법, 저위험 도구를 병렬화하고 부작용 도구를 직렬화하는 법, 이벤트를 스트림으로 흘려 UI와 분리하는 법 — engine.py 한 파일에 다 있다.

② 권한/위험 모델 = "AI에게 무엇을 맡길까"의 공학

에이전트 안전의 핵심은 '멋진 프롬프트'가 아니라 '실행 게이트'라는 걸 코드로 배운다. 모드 × 위험 클래스 × 경로 스코프 × allowlist × 셸 메타문자 검사의 조합으로 "자동/승인/거부"를 판정하는 구조는 어떤 에이전트를 만들든 참고할 원형(原型)이다.

③ 멀티 세션 / 무인 실행 / 인간 개입(HITL)

Inbox의 멱등·선착순 상태 기계는 "여러 곳에서 동시에 승인 답이 올 수 있는" 분산 문제를 어떻게 안전하게 푸는지 보여준다. Self-wake는 상시 대기 에이전트의 유휴 비용을 없애는 실전 패턴이다.

④ 제공자 추상화(BYOM)와 커넥터 아키텍처

aisuite 위에서 11개+ 모델 제공자를 한 API로 통일하고, 25개+ 커넥터를 catalog(닫힌 벤더 카탈로그) + MCP(개방 확장)로 이원화한 설계를 볼 수 있다. "우리가 벳(vet)한 도구"와 "사용자가 붙이는 MCP 도구"를 위험 관점에서 다르게 다루는 방식이 특히 배울 점.

⑤ 서브에이전트(explore)로 컨텍스트 아끼기

"retry 로직 어디서 처리돼?" 같은 넓은 질문은 메인 세션 컨텍스트를 파일 읽기로 태워버린다. OpenWorker의 explore 도구는 읽기 전용 자식 TurnEngine을 별도 컨텍스트로 띄워, 최종 리포트만 부모에게 돌려준다. 자식은 plan 모드로 강제돼 쓰기가 하드 블록되고, 승인 왕복이 없어 여러 explore를 한 턴에 병렬 실행할 수 있다.

용어 풀이
Progressive disclosure (스킬 점진 공개)
모든 스킬 정의를 처음부터 컨텍스트에 넣지 않고, 목록(카탈로그)만 보여준 뒤 필요한 스킬을 load_skill로 그때그때 불러오는 방식. 컨텍스트 낭비를 막는 에이전트 설계 관용구다.

7하드웨어 / 시스템 요구사항

데스크탑 앱 다운로드 vs 소스 빌드

완성본 앱(권장)

플랫폼요구비고
macOSmacOS 12+ (Apple Silicon)서명·공증 완료, 자동 업데이트
WindowsWindows 10/11 (x64)아직 코드 서명 전 → SmartScreen 경고(서명 진행 중)

앱을 열고 → 모델 키를 추가(또는 Ollama를 가리키게) → 실제 업무를 시켜보면 된다.

소스에서 실행(개발자)

필요버전
Python3.10+
Node20+
Rustrustup 툴체인(데스크탑 셸용)
# 1. 한 번만: Python venv(.venv) 부트스트랩 (Win은 Git Bash/WSL)
bash packaging/setup_dev_env.sh

# 2. 로컬 에이전트 서버 시작
.venv/bin/openworker-server --cwd ~/some/project --port 8765

# 3. 두 번째 터미널에서 UI 시작
cd surfaces/gui && npm install && npm run dev   # 브라우저 UI
# 데스크탑 앱 전체는 3단계 대신: npm run tauri dev
모델 비용 유의
"로컬 앱"이지만 모델은 대부분 유료 API

앱 자체는 내 컴퓨터에서 돌지만, OpenAI·Anthropic·Gemini 등을 쓰면 토큰 요금은 내 API 키로 청구된다. 완전 무료로 돌리려면 Ollama 로컬 모델을 써야 한다(단 로컬 모델은 도구 호출 품질이 제각각 — README도 "검증된 모델 목록"을 별도로 표시한다).

8직접 해볼 수 있는 실습 과제

난이도별 5개 — 읽기부터 코드 기여까지
과제 1 · 난이도 ★☆☆☆☆

앱 설치 후 "결과물" 한 개 받아보기

완성본 앱을 깔고 모델 키(또는 Ollama)를 붙인 뒤, "이 폴더의 CSV들을 요약한 리포트 문서를 만들어줘"를 시켜보라. 채팅 답이 아니라 실제 파일이 떨어지는지 확인하고, 중간에 뜨는 승인 프롬프트를 관찰하라.

과제 2 · 난이도 ★★☆☆☆

권한 모드 4종 체감하기

같은 지시(예: 파일 하나 수정)를 DISCUSS → PLAN → INTERACTIVE → AUTO 모드로 각각 시켜보고, 어디서 막히고 어디서 물어보는지 비교하라. 그다음 permissions.pyMode·READ_ONLY_MODES를 읽어 코드와 체감이 맞는지 확인.

과제 3 · 난이도 ★★★☆☆

새 페르소나(persona) 만들기

coworker/personas/builtin/ops.md를 템플릿 삼아, YAML frontmatter(id·name·tools·connectors·recommended_models·default_permission_mode·recommends)를 채운 나만의 페르소나(예: "리서치 코워커")를 만들어 로드해보라. 도구·커넥터 조합이 실제로 반영되는지 확인.

과제 4 · 난이도 ★★★★☆

자동화(automation) 스케줄 등록 + 코드 추적

"매일 아침 이 채널의 지난 24시간을 요약해줘" 같은 스케줄을 걸고, automation/scheduler.py에서 run-once-catch-up(내려가 있던 동안 놓친 실행을 시작 시 1회 처리)과 skip-on-overlap(이전 실행이 안 끝났으면 안 겹침)이 어떻게 구현됐는지 코드로 확인하라.

과제 5 · 난이도 ★★★★★

MCP 도구 하나 붙여 위험 오버라이드 실험

임의의 MCP 서버를 커넥터로 연결하고, 그 도구가 risk.py의 기본 분류(외부=EXTERNAL, 그 외=READ)에서 어떻게 다뤄지는지 관찰하라. 이어서 사용자-로컬 위험 오버라이드로 MCP의 보수적 기본값을 완화해보고, 그 변화가 승인 흐름에 미치는 영향을 engine.py의 승인 경로로 추적한다.

9관련 기술 심화 학습 로드맵

4주 커리큘럼 — 이 저장소를 발판으로
주차주제할 것
1주차에이전트 루프 기초LLM tool-calling 원리 → engine.py의 turn 루프 정독 → aisuite의 chat-completions 통합 API 이해
2주차권한·안전(HITL)permissions.py·risk.py·inbox.py 정독 → 모드×위험클래스 매트릭스 직접 표로 재구성 → 셸 메타문자 방어 재현
3주차도구·커넥터·MCPMCP 스펙 학습 → connectors/ + catalog.py 구조 파악 → 나만의 커넥터/MCP 도구 1개 붙이기
4주차비동기·스케줄·데스크탑asyncio(to_thread·이벤트 스트림) → automation/scheduler.py·selfwake.py → Tauri+React가 서버를 감독하는 구조 실습
학습 순서 팁

이 저장소는 "에이전트를 안전하게, 로컬에서, 여러 모델로 돌리는 법"의 종합 교재다. 배경 지식이 얇다면 aisuite → OpenWorker 순서가 좋다. aisuite로 "에이전트 조립의 최소 단위"를 익힌 뒤, OpenWorker에서 "그것을 제품으로 키우면 어떤 문제(권한·멀티세션·무인·비용)가 생기고 어떻게 푸는가"를 배우는 흐름이다.

10핵심 키워드 사전

이 문서에 나온 용어 빠른 정리
용어
AI coworker도구·파일·계정을 직접 조작해 완성된 산출물을 내놓는 에이전트(챗봇의 상위 개념)
aisuite여러 LLM 제공자를 한 API로 통일하는 앤드류 응 팀의 경량 라이브러리. OpenWorker 엔진의 토대
BYOMBring Your Own Model — 사용자가 제공자·키를 골라 붙이는 모델 비종속 설계
local-first에이전트 루프·기록·토큰·키가 전부 로컬에 있고, 클라우드는 최소(OAuth 중개)만 쓰는 방식
TurnEngineOpenWorker가 직접 소유한 async 에이전트 루프. 모델↔도구 반복 + 승인 대역밖 처리
PermissionEngine도구 호출마다 allow/deny/ask-user를 판정하는 엔진(모드+위험클래스 기반)
RiskClass도구의 부작용 등급: READ / WRITE_LOCAL / EXEC / EXTERNAL
Mode세션 자유도: DISCUSS / PLAN / INTERACTIVE(기본) / AUTO / CUSTOM
Inbox세션을 가로지르는 사람 주의 큐. pending→resolved, 멱등·선착순
Unattended사용자 부재 시 무인 실행 모드. 승인 요청을 Inbox에 park(보관)
Self-wake에이전트가 스스로 잠들고(sleep_for/until) 조건 충족 시 깨어나는 suspend/resume
explore읽기 전용 자식 TurnEngine 서브에이전트. 별도 컨텍스트로 리서치 후 리포트만 반환
persona도구·커넥터·권장 모델·기본 권한모드를 묶은 역할 프로필(YAML frontmatter)
MCPModel Context Protocol — 외부 도구를 표준 방식으로 에이전트에 꽂는 개방 규격
TauriOS 웹뷰 + Rust 백엔드로 만드는 경량 데스크탑 앱 프레임워크(Electron 대안)
progressive disclosure스킬 목록만 먼저 보여주고 필요할 때 load_skill로 불러오는 컨텍스트 절약 기법

11참고 링크

원문으로 더 파고들기