핵심 요약
- OpenDuet은 CopilotKit이 공개한 선제적(proactive) 업무 에이전트입니다. 매일 아침 메일과 일정을 읽어 브리핑을 보내고, 다른 사람에게 메시지를 보내는 동작은 사용자의 승인을 받은 뒤에 실행합니다.
- Anthropic의 Claude Duet과 같은 범주를 겨냥하지만, 직접 호스팅하고 OpenAI나 Anthropic 등의 모델을 골라 쓸 수 있다는 점이 다릅니다.
- 직접 호스팅하더라도 대화 스레드와 메모리를 맡는 CopilotKit Intelligence 프로젝트 키가 있어야 서버가 시작됩니다. CopilotKit 요금 정책상 무료 사용은 개발, 테스트, 데모 용도이며 실제 업무(프로덕션) 사용은 유료입니다.
- 프로젝트는 아직 초기 개발 단계이며, OpenDuet 전용 배포 가이드와 컨테이너 이미지가 없어 저장소를 내려받아 빠른 시작(Quick start) 절차대로 실행하는 방법만 지원합니다.
OpenDuet 소개
메일함과 일정을 보는 AI 비서는 대부분 사용자가 먼저 물어야 움직입니다. 오늘 무엇을 처리해야 하는지 알려면 결국 사람이 메일을 열고 일정을 훑어야 합니다. 에이전트에게 일을 맡기더라도 메일 발송이나 결제처럼 되돌리기 어려운 작업을 어디까지 맡길지가 문제로 남습니다. 2026년 10월 Anthropic이 연구 프리뷰로 공개한 Claude Duet은 에이전트가 먼저 말을 거는 방식으로 이 문제에 접근했습니다. 다만 미국의 Pro와 Max 사용자만 대기자 명단을 거쳐 쓸 수 있고, 모델은 Claude Opus 5.5로 고정되어 있습니다. 이번에 소개하는 OpenDuet은 이러한 선제적 에이전트를 사용자가 직접 호스팅하고 모델도 고를 수 있게 만든 오픈소스 프로젝트입니다.
OpenDuet은 사용자의 Gmail과 Google Calendar를 읽어 나를 기다리는 일과 미뤄도 되는 일을 나누고, 그 결과로 아침 브리핑을 만들어 하루의 첫 메시지로 보냅니다. 맡긴 작업은 에이전트 전용 컴퓨터(Chromium 브라우저, 작업 폴더, 셸이 들어 있는 컨테이너)에서 계속 처리하고, 끝났거나 막혔을 때만 다시 알립니다. 무엇을 바꾸는 동작은 모두 하나의 게이트웨이를 거치며, 그중 중요한 동작은 실행할 내용을 그대로 보여준 뒤 한 번 허용(Allow once), 항상 허용(Always allow), 거부(Refuse) 중 하나를 고를 때까지 멈춥니다. 다른 사람에게 보내는 메시지는 전체 승인 기능을 꺼도 받는 사람과 내용을 보여주고 승인을 받으며, 항상 허용을 고르면 그 받는 사람에게만 다시 묻지 않습니다.
OpenDuet은 CopilotKit이 먼저 공개한 OpenBot (
OpenBot: 에이전트마다 전용 컴퓨터를 주고 모든 도구 호출을 정책으로 심사하는 자체 호스팅 플랫폼) 위에서 동작합니다. 봇별 전용 컴퓨터, 승인 게이트웨이, 감사 기록, 로그인, Slack과 Microsoft Teams 연동은 OpenBot이 제공합니다. OpenDuet은 그 위에 아침 브리핑, 작업 목록(Tasks), 결과물 모음(Make), 자체 봇과 스킬을 더했습니다. 에이전트와 서버는 AG-UI (
AG-UI: 사용자와 에이전트의 상호작용을 위한 프로토콜 (feat. CopilotKit)) 프로토콜로 통신하므로, LangGraph나 Mastra, CrewAI 등으로 만든 에이전트도 AG-UI 엔드포인트로 노출하면 연결할 수 있습니다. 현재 OpenDuet 프로젝트는 스스로 초기 개발 단계라고 밝히고 있으므로, 기능과 설정이 계속 바뀔 수 있다는 점을 감안해 살펴보시기 바랍니다.
OpenDuet과 Claude Duet 비교
OpenDuet 저장소는 Claude Duet처럼 사용자에게 먼저 연락하는 선제적 에이전트 범주를 CopilotKit이 오픈소스로 구현한 것이라고 소개하면서, Anthropic과는 관계가 없는 독립 프로젝트라고 밝히고 있습니다. 두 프로젝트의 공개 자료를 기준으로 주요 차이를 정리하면 다음과 같습니다:
| 항목 | OpenDuet | Claude Duet |
|---|---|---|
| 제공 형태 | 직접 호스팅하는 오픈소스 (MIT) | Anthropic의 앱, 연구 프리뷰 |
| 이용 조건 | 누구나 설치 가능, CopilotKit Intelligence 프로젝트 필요 | 미국의 Pro, Max 요금제 사용자, 대기자 명단 |
| 모델 | 기본 OpenAI gpt-5.6-terra, Anthropic 및 OpenAI 호환 엔드포인트로 교체 가능 |
Claude Opus 5.5 고정, 사용자가 선택할 수 없음 |
| 데이터 위치 | 정책, 승인, 감사 기록, 저장된 로그인은 자체 PostgreSQL, 스레드와 메모리는 CopilotKit Intelligence | Anthropic 클라우드, 기존 Claude 계정의 메모리와 커넥터를 그대로 사용 |
| 사용 화면 | 웹 앱, Slack, Microsoft Teams | iOS 및 Android 앱, claude.ai |
| 실행 환경 | 봇마다 컨테이너(Chromium, /workspace, 셸), 로그인이나 2단계 인증에서 사람이 넘겨받기 가능 |
클라우드 가상 머신과 자체 브라우저, 작업 중인 브라우저를 보거나 넘겨받을 수 없음 |
| 승인 규칙 | 허용, 승인 요청, 거부 규칙을 직접 설정 | 전송, 결제, 서명, 삭제 전 승인, 증권 거래와 계좌 간 이체는 승인해도 불가 |
| 연결 앱 | Gmail, Google Calendar, Google Drive, Notion, Composio를 거친 MCP 커넥터 | Claude Marketplace의 6,000개 이상 커넥터와 플러그인, Link와 Shop Pay 결제 |
| 비용 | 모델 API 사용료와 CopilotKit Intelligence 요금 | Pro, Max 요금제의 사용량 한도에 포함 |
두 프로젝트의 사용자 경험은 상당히 비슷합니다. 아침 브리핑, Tasks 탭, 주제별 채널, 그리고 전송, 결제, 서명, 삭제 전의 승인 절차는 Claude Duet 안내 문서에도 같은 이름과 기준으로 등장합니다. 차이는 운영 주체에 있습니다. Claude Duet은 Anthropic이 운영하는 서비스라 모델, 커넥터, 결제 연동, 민감 정보 분류기를 모두 갖추고 있지만, 대상 국가와 요금제가 제한됩니다. OpenDuet은 이런 제한이 없는 대신 서버 운영과 모델 비용, 보안 설정을 사용자가 직접 맡아야 합니다.
민감 정보 처리는 두 프로젝트를 비교할 때 따로 확인해야 하는 부분입니다. OpenDuet README의 소개 목록에는 *"Every outgoing message is checked for sensitive information"*이라는 항목이 있습니다. 하지만 같은 README에서 지금 동작하는 기능을 정리한 표에는 이에 대응하는 항목이 없습니다. 저장소에서 MCP 호출 인자를 검사하는 content-governance.ts도 주석에서 일반 개인정보가 아니라 비밀번호, 토큰, 개인 키 같은 자격 증명만 찾도록 했다고 밝히고 있습니다. 카드 번호나 건강 정보가 외부로 나가는 것을 막는 기능이 필요하다면, 도입 전에 실제 동작을 직접 확인해야 합니다.
OpenDuet을 사용하면 좋을 사용자
사내에 Claude Duet과 비슷한 비서를 직접 만들려는 팀에게 OpenDuet은 참고하기 좋은 출발점입니다. Claude Duet의 대상 국가나 요금제 조건에 맞지 않는 개발자도 같은 방식의 에이전트를 써 볼 수 있습니다. 봇 이름, 지시문, 채널, 모델, 스킬이 한 폴더에 모여 있어 복제한 뒤 고쳐 쓰기 쉽습니다. 메일 분류 평가 세트와 실행 스크립트도 저장소에 들어 있어, 프롬프트나 모델을 바꿨을 때의 변화를 비교할 수 있습니다. 승인 게이트웨이와 감사 기록은 OpenBot의 것을 그대로 쓰므로, 에이전트에게 메일 발송 권한을 줄 때 무엇이 언제 승인됐는지가 처음부터 기록됩니다.
반대로 지금 바로 업무용으로 쓰려는 개인에게는 준비할 것이 많습니다. Docker와 Bun, Google OAuth 클라이언트 등록을 직접 해야 하고, OpenDuet 전용 배포 가이드와 컨테이너 이미지가 아직 없습니다.
비용도 따져 봐야 합니다. 빠른 시작 절차는 CopilotKit이 운영하는 호스팅형 Intelligence에 연결하며, 무료 요금제는 조직당 월 1,000건의 상호작용(interaction)까지입니다. CopilotKit은 개발, 테스트, 데모 사용은 무료이고 프로덕션 사용은 유료라고 밝히고 있습니다. 실제 업무에 쓰려면 유료 요금제를 검토해야 합니다. 평가 목적이라면 무료 Developer Edition으로 Intelligence까지 자기 컴퓨터의 Docker에서 실행할 수 있습니다. 하지만 프로덕션용 자체 호스팅과 오프라인 운영은 영업 상담을 거친 유료 계약(오프라인은 연간 계약)이 필요합니다. 유료 계약 없이 모든 데이터를 자체 인프라에 두고 실제 업무에 쓰려는 조직에게는 OpenDuet이 아직 적절한 선택지가 아닙니다.
OpenDuet이 메일을 분류하는 방식과 평가 결과
OpenDuet의 아침 브리핑은 새 메일을 나를 기다리는 일(needs you)과 미뤄도 되는 일(can wait)로 나누는 분류(triage) 단계 위에 만들어집니다. 분류는 2단계로 이뤄집니다: 먼저 메일 헤더와 Gmail의 분류만으로 결정할 수 있는 메일을 규칙으로 처리하고, 나머지만 모델에 보내 판단과 한 줄 사유를 받습니다. 규칙으로 처리하는 메일은 자동 응답, 일정 초대에 대한 회신, 그리고 Gmail이 프로모션이나 소셜 탭으로 분류한 메일입니다. 메일링 리스트 헤더가 있는 대량 발송 메일도 이 Gmail 분류가 함께 있을 때만 규칙으로 처리합니다.
이렇게 조건을 붙인 데에는 이유가 있습니다. 실제 사용 중에 보안 그룹 메일링 리스트로 온 취약점 보고와 업체의 토큰 교체 안내가 메일링 리스트 헤더만으로 미뤄도 되는 일로 분류된 사례가 있었습니다. 개발팀은 이 사례 이후 규칙을 좁혔다고 저장소의 평가 문서에 밝히고 있습니다. 결제 실패 알림이 들어오는 업데이트 탭과 Google 그룹 메일이 들어오는 포럼 탭도 같은 이유로 규칙에서 일부러 제외했습니다.
같은 문서에는 개발팀이 직접 만든 평가 세트와 결과도 들어 있습니다. 평가 세트는 작은 도자기 공방을 운영하는 가상의 인물에게 온 메일 62통(나를 기다리는 일 27통, 미뤄도 되는 일 35통)입니다. 여기에는 급해 보이는 마케팅 메일, 꼭 확인해야 하는 noreply 발신 메일(결제 실패, 스토어 일시 중지, 보안 경고), 피싱 메일, 에이전트에게 지시를 내리려는 메일이 들어 있습니다. CopilotKit이 자체적으로 측정해 공개한 결과는 다음과 같습니다:
| 모델 | 평가 메일 수 | needs you 정밀도 | needs you 재현율 | 규칙으로 결정한 메일 |
|---|---|---|---|---|
claude-sonnet-5-5 |
62통 | 100% (27/27) | 100% (27/27) | 12통 |
gpt-5.6-terra |
60통 (보안 그룹 메일과 업체 안내 2통 추가 전) | 96.2% (25/26) | 100% (25/25) | 16통 |
기본 모델인 gpt-5.6-terra 의 결과는 2통이 추가되고 규칙이 바뀌기 전의 60통 세트에서 측정한 값이라, 두 행을 그대로 비교할 수는 없습니다. gpt-5.6-terra 가 틀린 1통은 이미 일정에 있는 치과 예약 알림을 나를 기다리는 일로 분류한 경우였습니다. 개발팀은 평가 세트가 작고 가상의 메일로 구성되어 있다는 점을 직접 밝히고 있습니다. 정답 라벨과 프롬프트를 같은 사람이 작성했다는 점도 함께 적혀 있습니다. 따라서 이 수치는 실제 메일함에서의 정확도가 아니라, 규칙이나 프롬프트, 모델을 바꿀 때 성능이 떨어지지 않았는지 확인하는 회귀 검사(regression check) 용도로 읽어야 합니다.
OpenDuet의 화면 구성
OpenDuet의 웹 앱은 휴대폰 화면을 기준으로 채팅(Chat), 작업 목록(Tasks), 결과물 모음(Make) 3개의 탭으로 구성되어 있습니다. 아래 이미지는 왼쪽 위부터 아침 브리핑이 표시된 Chat, Tasks, Make 탭, 채널 목록이 있는 사이드 패널, 그리고 제안된 작업을 오른쪽으로 밀어 시작하는 화면입니다:
Chat 탭에는 첫날 이후 매일 처음 열 때 한 번 아침 브리핑이 게시됩니다. 첫날에는 그 대신 최근 메일과 이번 주 일정을 읽은 뒤, 사용자가 누구인지와 도울 수 있는 일 3가지를 제안하는 인사가 나옵니다. 브리핑은 나를 기다리는 일과 그 이유, 미뤄도 되는 일, 오늘 일정, 확인하지 못한 항목으로 구성되며, 항목의 Start 를 누르면 해당 메일 처리를 OpenDuet에게 맡깁니다. Tasks 탭은 답이 필요한 일, OpenDuet이 백그라운드 조사로 제안하는 일, 진행 중인 일을 한곳에 모으고, 각 작업은 Working, Ready for review, Needs input 상태로 표시됩니다. Make 탭에는 사용자가 요청한 디자인 시스템, 대시보드, 슬라이드, 문서, 웹 페이지가 썸네일로 쌓입니다. 업무별로 채널을 만들면 그 채널의 목적에 맞춰 작업을 이어가며, 음성 입력은 서버에 음성 인식(speech-to-text) 제공자를 설정한 경우에만 쓸 수 있습니다.
OpenDuet의 구조와 내 프로젝트로 바꾸는 방법
OpenDuet의 전체 구조는 README의 다음 도식에 정리되어 있습니다:
You: web · Slack / Microsoft Teams
│ ▲
│ asks, answers, approvals │ morning brief, "this needs you"
▼ │
OpenDuet server (OpenBot: Hono + CopilotKit runtime)
├── triage what needs you / what can wait
├── approvals Allow once · Always allow · Refuse
└── gateway policy → audit record → act
│ AG-UI
▼
Agent (any AG-UI agent, on a framework or hand-written)
│ every tool call comes back through the gateway
▼
Its own computer Chromium · /workspace · shell
CopilotKit Intelligence threads and memory
PostgreSQL + pgvector policy, approvals, audit, encrypted credentials
MCP connectors Google Drive, Notion, and more through Composio
사용자는 웹, Slack, Teams에서 요청과 승인을 보내고, 서버의 분류 단계와 승인 단계가 아침 브리핑과 승인 요청을 만들어 돌려보냅니다. 에이전트가 부르는 모든 도구 호출은 게이트웨이로 돌아와 정책 확인과 감사 기록을 거친 뒤에야 실행됩니다. 비밀번호가 필요한 사이트에서는 사용자가 마스킹된 입력 상자에 직접 입력하고, 대화 기록에는 비밀 값을 요청했다는 사실만 남습니다. 게이트웨이와 전용 컴퓨터의 자세한 동작은 OpenBot 소개 글에서 다뤘으므로 여기서는 생략합니다.
OpenDuet을 OpenBot과 구분하는 설정은 모두 openbot/examples/openduet 폴더에 있습니다. 이 폴더를 테넌트 패키지(tenant package)라고 부르며, 파일별 역할은 다음과 같습니다:
| 파일 | 정하는 것 |
|---|---|
brand.yaml |
앱 전체에 표시되는 제품 이름 |
agents.yaml |
봇 목록, 각 봇의 지시문과 보유 스킬 |
channels.yaml |
사용자에게 보이는 대화 채널과 각 채널에서 답하는 봇 |
model.yaml |
모델 제공자와 기본 모델 |
skills.yaml |
/ 로 부르는 스킬과 각 스킬에 필요한 도구 |
이 폴더를 복사해 고친 뒤 .env 의 TENANT_PACKAGE_DIR 이 복사본을 가리키게 하면(경로는 openbot/server 기준 상대 경로) 이름과 봇, 스킬이 바뀐 비서를 만들 수 있습니다. openbot/ 아래의 OpenBot 코드는 그대로 두므로, 이후 OpenBot의 수정 사항을 계속 가져올 수 있습니다.
OpenDuet 설치와 사용
Docker, Bun 1.3 이상, CopilotKit CLI를 실행할 Node.js(npx), 모델 API 키, CopilotKit Intelligence 프로젝트가 필요합니다. 아래 명령은 모두 저장소 루트에서 실행합니다:
git clone https://github.com/CopilotKit/OpenDuet.git
cd OpenDuet
cp .env.example .env
bun install
다음으로 CopilotKit에 로그인해 Intelligence 프로젝트를 고릅니다. 마지막 스크립트는 프로젝트 키를 서버가 읽는 INTELLIGENCE_API_KEY 로 복사하고, 학습 컨테이너가 없으면 만듭니다:
npx --yes copilotkit@latest login
npx --yes copilotkit@latest project select
bun openbot/scripts/setup-learning.ts
기본 봇은 openbot/examples/openduet/model.yaml 에 지정된 OpenAI gpt-5.6-terra 를 사용하므로, .env 에 다음과 같이 OpenAI 키를 넣습니다:
OPENAI_API_KEY=sk-...
Anthropic 모델을 쓰려면 BOT_PROVIDER=anthropic 과 ANTHROPIC_API_KEY 를 설정하며, BOT_MODEL 을 지정하지 않으면 claude-sonnet-4-5 가 사용됩니다.
설정을 마쳤으면 다음 명령으로 실행합니다:
bash scripts/start.sh
스크립트는 Docker로 PostgreSQL과 봇별 컴퓨터를 실행하고, 데이터베이스 마이그레이션을 적용한 뒤 API 서버, 루틴 워커, 앱을 차례로 시작합니다. 준비가 끝나면 브라우저에서 http://localhost:3010 을 엽니다. 종료는 bash scripts/stop.sh 로 하며, 데이터베이스와 봇의 파일, 브라우저 프로필은 Docker 볼륨에 남습니다.
Gmail과 Google Calendar를 연결하려면 관리자가 Google OAuth 클라이언트를 한 번 등록해야 합니다. Google 계정 없이 동작을 먼저 보고 싶다면 저장소에 들어 있는 테스트용 가짜 Google 서버를 쓸 수 있습니다. 이 서버는 가상의 메일함과 일정을 제공하며, 다음 명령으로 실행합니다:
bun openbot/scripts/fake-google/server.ts --port 4900
그다음 .env 에 OPENDUET_FAKE_GOOGLE_URL=http://127.0.0.1:4900 을 설정하고 OpenDuet을 다시 시작합니다. 관리 화면에서 커넥터를 켜고 연결하는 나머지 단계는 README의 연결 절차를 따릅니다.
마지막으로 텔레메트리 설정을 확인해야 합니다. OpenDuet은 CopilotKit 런타임(runtime)의 사용 통계에 OpenDuet 이라는 고정된 이름표를 붙여 CopilotKit에 보냅니다. 또한 SDK 기본값이 5%인 표본 추출 비율을, 별도 설정이 없으면 100%로 올립니다(docs/telemetry.md). 이 이름표는 테넌트 패키지에서 제품 이름을 바꿔도 유지되며, OPENBOT_ACCESSIBILITY_DISABLED=true 로 뺄 수 있습니다. 이벤트에는 Intelligence 계정과 연결되는 CPK_TELEMETRY_ID 도 함께 실립니다. 보내지 않으려면 .env 에 COPILOTKIT_TELEMETRY_DISABLED=true 또는 DO_NOT_TRACK=1 을 설정하고 서버를 다시 시작합니다.
OpenDuet의 라이선스
OpenDuet은 MIT 라이선스로 공개되어 있어 개인 및 상업적 목적으로 자유롭게 사용할 수 있습니다.
단, 실행에 필요한 CopilotKit Intelligence는 이 라이선스가 적용되지 않는 별도 서비스입니다. 프로덕션 사용은 유료이므로, 실제 업무에 쓰기 전에 CopilotKit 요금제를 확인해야 합니다.
OpenDuet 소개 페이지 (CopilotKit 공식 사이트)
OpenDuet 프로젝트 GitHub 저장소
더 읽어보기
이 글은 GPT 모델로 정리한 초안을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 댓글로 알려주시기를 부탁드립니다. ![]()
이 글은 파이토치 한국 사용자 모임
이 직접 정리한 글입니다. 새 글을 놓치지 않으시려면 텔레그램(Telegram)이나 Slack/Discord/Teams/Dooray/GoogleChat 등으로 알림을 받으시고, 회원으로 가입하시면 주요 글들을 이메일
로도 보내드립니다! ![]()
아래
쪽에 좋아요
를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ ![]()


