pip install qwenpaw 한 줄로 깔린다. 알리바바 통이(Tongyi) 계열인 agentscope-ai 조직이 만든 agentscope 에이전트 프레임워크 위에 올라가 있다. (저장소: agentscope-ai/QwenPaw · Python+FastAPI 백엔드 + React(Ant Design)+Tauri 데스크탑 콘솔 · Apache 2.0 · ★18.4k · 옛 이름 CoPaw)한 문장으로 이 프로젝트가 뭘 하는지부터.
QwenPaw = "내가 쓰는 모든 메신저 안에 들어와 있는, 도구를 쓸 줄 아는 개인 AI 비서." ChatGPT는 정해진 웹사이트에서만 만나지만, QwenPaw는 텔레그램·디스코드·위챗 등 내가 평소 쓰는 채팅앱 안에서 직접 말을 걸 수 있고, 부탁하면 답변만 하는 게 아니라 파일을 찾아 읽고·코드를 돌리고·웹을 뒤지고·매일 아침 뉴스를 요약해 보내주는 일까지 "행동"한다. 그리고 그 비서는 내 컴퓨터(또는 내 서버)에서 돌아간다.
보통의 AI 비서는 남의 서버(클라우드)에 살고, 내 대화·파일이 그 회사를 거쳐 간다. QwenPaw는 반대로 비서를 내 집(내 머신)에 들인다. 열쇠(API 키)도 내 금고(OS 키링)에, 일지(대화·메모리)도 내 서랍(로컬 파일)에 둔다.
대신 이 비서는 손발이 있다 — 터미널을 쓰고, 브라우저를 열고, 예약 알람을 건다. 그래서 "말귀를 알아듣는 챗봇"을 넘어 "심부름을 실제로 해내는 에이전트"에 가깝다.
중요한 사실 하나 — 이름이 비슷해 헷갈리지만 QwenPaw는 흔히 알려진 다른 챗봇 호스팅 프로젝트(AstrBot 등)와 코드 계보가 다르다. 원래 이름은 CoPaw였고 2026년 4월 QwenPaw로 리브랜딩됐으며, 알리바바 통이 연구 계열인 agentscope-ai 조직 소유다. 핵심 엔진도 같은 조직의 agentscope / agentscope-runtime 프레임워크다.
TrendShift 일간 2위까지 올라온 이유 — 트렌딩의 배경.
2025~2026년은 "에이전트가 실제 업무를 대신하는" 흐름이 폭발한 시기다. 코딩 에이전트(Claude Code·Codex)에 이어, 이번엔 "내 개인 비서 에이전트를 통째로 셀프호스팅"하는 쪽이 주목받는다. QwenPaw가 상위로 올라온 이유를 다섯으로 정리한다.
텔레그램·디스코드·위챗·QQ·딩톡·라크(Feishu)·Matrix·Mattermost·기업위챗·iMessage·MQTT, 심지어 SIP(전화)까지. 한 비서를 띄워 두면 어느 메신저에서 말을 걸든 같은 에이전트가 같은 기억으로 응답한다. "챗봇을 어디에 붙일까"라는 통합 문제를 한 번에 해결한 것이 가장 큰 매력이다.
QwenPaw는 단독 프로젝트가 아니라, 알리바바의 오픈소스 에이전트 프레임워크 agentscope 위에 세워진 대표 응용 사례다. Qwen(통이천문) 모델을 무료 티어로 바로 쓸 수 있고, DashScope·ModelScope 연동이 1급 시민이다. 프레임워크 제작사가 직접 만든 레퍼런스 앱이라 "agentscope를 제대로 쓰는 법"의 교본 역할을 한다.
요즘 에이전트 생태계의 세 표준을 모두 엮었다. Skills(Anthropic의 Agent Skill 포맷 그대로, SKILL.md 폴더), MCP(외부 도구를 꽂는 표준), ACP(Zed·OpenCode 같은 에디터가 이 에이전트에 붙는 프로토콜)를 동시에 지원한다. 셋을 한 시스템에서 실제로 통합한 보기 드문 레퍼런스다.
데이터를 로컬 파일과 OS 키링에 두는 데다, 에이전트가 위험한 짓을 못 하게 막는 안전장치가 코드로 들어 있다. rm -rf 같은 파괴적 셸 명령을 정규식 규칙으로 차단하고(Tool Guard), 설치하는 스킬의 코드를 정적 스캔하며(Skill Scanner), 채널별 사용자 화이트리스트로 접근을 통제한다.
같은 React 웹 콘솔을 Tauri로 묶어 데스크탑 앱으로도 배포하고, 데스크탑 펫 플러그인까지 있다. 역할이 다른 여러 에이전트를 띄워 서로 협업·위임시키고, 대화를 거듭하며 메모리(Markdown)가 스스로 진화하는 기능도 갖췄다.
기존 챗봇 호스팅 = 손님용 응접실 하나 — 정해진 방(웹앱)에서만, 정해진 대화만 한다.
QwenPaw = 집 안에 상주하며 집안일까지 하는 비서 — 어느 문(메신저)으로 불러도 오고, 부탁하면 장보기 목록 정리(파일)·심부름(셸/브라우저)·아침 브리핑(예약)까지 한다. 단, 손발이 있는 만큼 "어디까지 시킬지" 규칙(보안 가드)을 잘 정해 둬야 한다.
QwenPaw는 셸·파일·브라우저를 실제로 조작한다. 보안 가드가 있어도, 잘못 설정하거나 신뢰할 수 없는 스킬·MCP를 붙이면 내 시스템을 망가뜨릴 수 있다. 특히 인증 없이 외부에 포트를 열면 누구나 내 비서에게 명령할 수 있게 되므로(공식 문서도 경고), 셀프호스팅 보안 지식이 필요하다. 또 ★18.4k라도 비교적 새 프로젝트라 빠르게 바뀐다 — "트렌딩이라 안전·완성"이 아니라, 최신 에이전트 아키텍처를 공부하기 좋은 살아있는 사례로 보는 게 맞다.
pyproject.toml · 소스 트리(526개 .py + React 콘솔)에서 직접 확인한 실제 구성.
QwenPaw는 ⓐ 백엔드(에이전트·서버 두뇌) ⓑ 프론트엔드(웹 콘솔/데스크탑) ⓒ 저장·보안 세 층으로 나뉜다. 한 가지 큰 특징은 전통적 데이터베이스가 없다는 점 — 상태를 전부 로컬 파일과 OS 키링에 둔다.
| 구성요소 | 무엇 | 역할 |
|---|---|---|
| Python 3.10~3.13 | 런타임 | 백엔드 본체. PyPI 패키지명 qwenpaw (옛 CLI 별칭 copaw 잔존). |
| FastAPI + uvicorn | 웹 서버 | 콘솔 API·채널 웹훅·SSE 스트리밍. 인증은 Starlette 미들웨어, 응답은 orjson. |
| agentscope 1.0.20 | 에이전트 프레임워크 | 핵심 정체성. ReActAgent·Toolkit·ChatModel·Formatter·메모리를 상속·사용. |
| agentscope-runtime 1.1.6 | 런타임 엔진 | AgentApp(FastAPI 빌더)·Runner(스트리밍 실행)·요청/응답/이벤트 스키마. |
| APScheduler | 스케줄러 | cron·예약 작업(매일 뉴스 요약 등). |
| asyncio + anyio | 비동기 런타임 | 채널 동시 처리·메시지 큐. watchfiles로 설정 핫리로드. |
| Playwright | 브라우저 자동화 | 에이전트가 실제 Chromium을 띄워 웹을 조작·캡처(browser_use 도구). |
| reme-ai | 메모리 매니저 | 장기 기억. 선택적으로 ADBPG(PostgreSQL) 벡터 백엔드 연결. |
| 구성요소 | 무엇 | 역할 |
|---|---|---|
| openai · google-genai · anthropic | LLM SDK | OpenAI/Gemini/Anthropic 직접 + 호환 API 수십 종(DeepSeek·Kimi·Zhipu·DashScope/Qwen 등). |
| Ollama · LM Studio | 로컬 LLM | API 키 없이 내 머신에서 모델 구동. transformers·modelscope로 토크나이저/로컬 모델. |
| 채널 SDK 17종 | discord-py · python-telegram-bot · dingtalk-stream · lark-oapi · matrix-nio · paho-mqtt · twilio … | 각 메신저/프로토콜 어댑터. 채널 자체 구현이 이 레포에서 가장 무거운 부분. |
| MCP / ACP | 도구·에디터 프로토콜 | 외부 MCP 도구를 가져오고(클라이언트), QwenPaw를 ACP 서버로 노출해 Zed·OpenCode가 붙음. |
| 구성요소 | 무엇 | 역할 |
|---|---|---|
| React 18 + TypeScript + Vite 6 | 웹 콘솔 | 대시보드 UI(console/). 모델·채널·스킬·플러그인·승인·로그 관리. |
| Ant Design 5 | UI 라이브러리 | antd + agentscope 자체 컴포넌트(@agentscope-ai/chat 등). Vue 아님. |
| Zustand · React Router 7 | 상태 · 라우팅 | 가벼운 전역 스토어 + SPA 라우팅. |
| Monaco · Mermaid · i18next | 에디터 · 도식 · 다국어 | 코딩 모드 웹 IDE, 다이어그램 렌더, 영/중 다국어. |
| Tauri 2 (Rust) | 데스크탑 패키징 | 같은 React 콘솔을 네이티브 데스크탑 앱(NSIS 인스톨러)으로 빌드. |
| 구성요소 | 무엇 | 역할 |
|---|---|---|
~/.qwenpaw/ | 작업 디렉토리 | config.json·chats.json·jobs.json(cron)·memory/*.md. 전부 평범한 파일. |
~/.qwenpaw.secret/ + 키링 | 시크릿 저장 | API 키 등은 작업 폴더와 분리해 OS 키링(keyring)에 암호화 보관. |
| Tool Guard | 도구 가드 | 위험 셸 명령(rm/fork bomb 등)을 YAML 규칙으로 차단·승인 요청. |
| Skill Scanner | 스킬 정적 스캔 | 설치하는 스킬 코드의 위험 패턴을 정책 기반으로 검사. |
| Access Control | 접근 제어 | 채널별 사용자/그룹 화이트·블랙리스트, 그룹 멘션 게이트. |
텔레그램에 보낸 한 줄이 답이 되어 돌아오기까지 — 메시지의 여정.
QwenPaw의 진짜 묘미는 "표준 프레임워크는 위임하고, 자기만의 레이어를 위에 얹는" 이중 구조다. 에이전트의 추론 루프(ReAct)는 agentscope에 맡기고, 그 위에 채널 입출력·메시지 큐·접근제어·보안 가드를 직접 구현했다. 메시지 한 통의 흐름을 그림으로 보면 이렇다.
에이전트 클래스 정의 한 줄이 전체 설계 철학을 압축한다:
class QwenPawAgent(CodingModeMixin, ToolGuardMixin, ReActAgent):
# 추론 루프 자체는 agentscope의 ReActAgent에 위임하고,
# '코딩 모드'와 '도구 안전 가드' 같은 횡단 관심사는 Mixin으로 끼워 넣는다.
자체 ReAct를 새로 짜지 않고 ReActAgent를 상속하되, 기능을 Mixin(혼합 클래스)으로 분리해 합성했다. "도구 가드"나 "코딩 모드"를 켜고 끄기 쉽고, 본체 코드가 깔끔해진다 — 다중 상속의 모범적 사용.
LLM 모델 객체를 그대로 쓰지 않고, 같은 인터페이스를 유지한 채 기능을 겹겹이 입힌다.
model = RetryChatModel( # ③ 재시도 · 레이트리밋 · 백오프
TokenRecordingModelWrapper( # ② 토큰 사용량 기록
provider.get_chat_model_instance(model_name) # ① 원본 모델
)
)
양파처럼 감싼 데코레이터 패턴이다. 토큰 측정·재시도 로직이 에이전트 본체에 섞이지 않고 투명하게 추가된다. 멀티벤더 LLM 앱을 만들 때 그대로 베껴 쓸 만한 구조다.
수십 개 LLM 공급자를 일일이 클래스로 만들지 않는다. OpenAI 호환·Anthropic 호환·Gemini 3개 베이스로 환원하고, DeepSeek·Kimi·Zhipu·DashScope(Qwen) 등은 base_url과 메타데이터만 바꿔 등록한다. 채널도 마찬가지로 딕셔너리 레지스트리 + 지연 import(lazy) 방식이다.
채팅의 현실 문제를 구조로 푼다. 사용자가 메시지를 3줄 연달아 보내면? UnifiedQueueManager가 세션별 큐에서 디바운스(잠깐 모았다 합치기)·배치 병합으로 처리한다. 그리고 비동기 호출 사슬 전체에 누가·어느 채널·어느 세션인지를 ContextVar로 흘려보내, 미들웨어→러너→모델→토큰기록까지 일관된 컨텍스트를 유지한다.
ReActAgent)에서 나온다.에이전트의 추론 루프를 직접 만들면, LLM 생태계가 바뀔 때마다 따라 고쳐야 한다. QwenPaw는 그 가장 빨리 변하는 부분(추론·도구호출 표준)을 agentscope에 맡기고, 자기 가치가 분명한 부분(채널 통합·보안·운영 콘솔)에만 집중한다. "남이 잘하는 건 빌리고, 내가 잘할 것에 투자"하는 전형적 레이어링이다.
레포를 클론하면 보이는 폴더들 — 어디에 뭐가 있나.
한눈에 정리하면: src/qwenpaw/agents/가 두뇌(에이전트·도구·스킬), src/qwenpaw/app/가 신경망(채널·서버·라우팅), src/qwenpaw/providers/가 입(LLM 연결), console/가 얼굴(웹·데스크탑 UI)이다. 구조를 빨리 잡으려면 agents/react_agent.py(에이전트가 어떻게 도구를 쓰나)와 app/channels/base.py(채널이 어떻게 추상화됐나) 두 파일이 지름길이다.
agents/ = 비서 본인(생각하고 도구 쓰는 사람), app/channels/ = 접수 창구 17개(텔레그램·위챗 등 어느 문으로 와도 응대), providers/ = 통역사(어느 LLM과도 대화 연결), security/ = 경비실(위험한 지시 차단), console/ = 사장실 모니터(설정·현황 관리). 입구는 여럿이어도 일하는 비서는 하나다.
이 레포에서 무엇을, 어떻게 배울 수 있나.
"agentscope가 주는 ReAct/Toolkit/Formatter를 어떻게 상속·확장하고, 그 위에 채널 I/O·큐·접근제어를 직접 구현하는가"의 분리선이 명확하다. 프레임워크를 쓰되 끌려다니지 않는 법을 배우는 실전 교본이다.
실습 아이디어: react_agent.py에서 어떤 부분이 agentscope 상속이고 어떤 부분이 QwenPaw 자체 코드인지 형광펜으로 나눠 본다.
베이스클래스 환원 + base_url 프리셋 + 데코레이터(재시도·레이트리밋·토큰측정) 체인. 수십 개 LLM을 한 인터페이스로 다루는 멀티벤더 LLM 앱의 모범 설계를 providers/에서 통째로 볼 수 있다.
실습 아이디어: providers/에서 OpenAI 호환 프리셋이 어떻게 정의되는지 찾아, base_url만 바꾼 "가짜 공급자"를 하나 추가해 본다.
asyncio Queue, 디바운스, 배치 병합, ContextVar 컨텍스트 전파, graceful shutdown. "여러 채팅방에서 동시에 메시지가 쏟아질 때 어떻게 안 꼬이게 처리하나"의 구체적 답을 app/channels/에서 배운다.
실습 아이디어: UnifiedQueueManager의 디바운스 시간을 바꿔, 메시지를 빠르게 연달아 보낼 때 동작이 어떻게 달라지는지 관찰한다.
요즘 에이전트 생태계 표준(Skills·MCP·ACP)을 한 시스템에 엮은 드문 레퍼런스. SKILL.md 포맷, MCP 클라이언트 핫리로드, ACP 서버/클라이언트 양방향을 실제 코드로 확인할 수 있다.
실습 아이디어: 빌트인 스킬 하나(agents/skills/cron-en/SKILL.md)를 열어, frontmatter와 본문이 에이전트에게 어떻게 "도구 사용법"을 알려주는지 읽어 본다.
"에이전트가 rm -rf를 치면 어떻게 막나?"의 실제 구현. 정규식 규칙 엔진(Tool Guard) + 스킬 정적 스캐너 + 승인 워크플로의 다층 방어를 security/에서 본다. 자율 에이전트를 만들 사람이라면 반드시 봐야 할 부분.
실습 아이디어: security/tool_guard/의 위험 명령 YAML 규칙을 읽고, 차단되는 명령과 통과되는 명령의 경계를 정리한다.
같은 React 코드를 웹 콘솔과 데스크탑 앱으로 동시 배포하는 방법(Rust Tauri 2 + NSIS). "내 웹 도구를 어떻게 설치형 앱으로 만드나"의 가벼운 입문이 console/src-tauri/에 있다.
내 컴퓨터에서 돌리려면 뭐가 필요한가.
QwenPaw 자체는 "LLM API를 호출하는 가벼운 에이전트 서버"다. 클라우드 LLM(Qwen·DeepSeek·OpenAI 등)을 쓰면 무거운 GPU가 필요 없다 — 진짜 계산은 LLM 쪽이 한다. 내 머신은 채널 중계·도구 실행·웹 콘솔만 돌리면 된다. 단, 로컬 모델·브라우저 자동화·코딩 모드를 켜면 그만큼 자원이 더 든다.
| 항목 | 요구사항 | 비고 |
|---|---|---|
| Python | 3.10 ~ 3.13 | 로컬 설치 시 필요(pip install qwenpaw). 3.14 미만. |
| LLM | API 키 1개 또는 Ollama/LM Studio | Qwen 무료 티어·DeepSeek·Kimi·OpenAI 등 / 로컬 모델은 키 불필요. |
| GPU | 클라우드 LLM이면 불필요 | 로컬 모델을 직접 구동할 때만 모델 크기만큼 RAM/VRAM 필요. |
| Docker | 권장 배포 방식 | 이미지에 Chromium·Xvfb·supervisord 포함. docker compose up → 8088 포트. |
| 브라우저 자동화 | Playwright Chromium | browser_use 도구 사용 시 추가 메모리·디스크. |
| 공식 최소 사양 | 명시 안 됨 | 레포 문서에 정량 최소 사양은 없음 — 위 항목으로 가늠. |
QwenPaw는 셸·파일·브라우저를 실제로 만진다. 인증 없이 외부에 포트를 열면 누구나 내 비서에게 명령할 수 있고, 신뢰할 수 없는 스킬·MCP를 붙이면 위험 코드가 실행될 수 있다. Docker가 무인증으로 바인딩되면 entrypoint가 경고를 띄우는 이유다. 셀프호스팅은 "깔면 끝"이 아니라 네트워크·인증·도구 권한 설정까지가 한 세트다.
API 키는 작업 폴더와 분리해 OS 키링에 두고, 위험 셸 명령은 Tool Guard가 막으며, 콘솔은 JWT 인증(QWENPAW_AUTH_* 환경변수)을 걸 수 있다. 채널별 화이트리스트로 "누가 이 비서에게 말 걸 수 있나"도 통제된다. 안전장치는 있으니, 켜고 제대로 설정하는 것이 사용자 몫이다.
난이도별 5개 — 손으로 익히는 게 최고다.
pip install qwenpaw → qwenpaw init → qwenpaw app 후 http://127.0.0.1:8088 콘솔에 접속. LLM 공급자(예: Qwen 무료 티어 또는 Ollama)를 연결하고 첫 대화를 나눈다. 목표: 콘솔 구조와 "모델 연결 → 대화"의 기본 흐름 체험.
BotFather로 텔레그램 봇 토큰을 발급받아 qwenpaw channels(또는 콘솔)에서 텔레그램 채널을 켠다. 폰에서 봇에게 말을 걸어 본다. 목표: 같은 에이전트가 웹과 메신저에서 동일하게 응답하는 "멀티채널"을 체감.
빌트인 cron + news 스킬을 이용해 "매일 아침 8시에 AI 뉴스 요약을 텔레그램으로 보내줘"를 예약한다. 목표: 스킬 + 스케줄러(APScheduler)가 결합해 "능동적으로 일하는 비서"가 되는 과정 이해.
~/.qwenpaw/skill_pool/에 SKILL.md(YAML frontmatter + 본문) 한 장을 떨궈, 에이전트가 자동으로 그 스킬을 인식·사용하게 한다. 목표: Anthropic Agent Skill 포맷과 "pool → workspace 동기화" 로딩 구조를 직접 손으로 확인.
외부 MCP 서버(예: 파일시스템·검색 MCP)를 연결해 에이전트 도구로 등록하거나, plugin.json + api.register_tool(...)로 커스텀 도구 플러그인을 만든다. 목표: "에이전트의 능력을 어떻게 외부에서 확장하나"를 MCP/플러그인 두 경로로 체득.
이 레포를 발판으로 4주 코스를 짠다면.
| 주차 | 주제 | 학습 내용 & 실습 |
|---|---|---|
| 1주차 | LLM 에이전트 기초 | ReAct 패턴, 도구 호출(function calling), agentscope의 Agent/Toolkit/Formatter. react_agent.py·model_factory.py 정독. |
| 2주차 | 비동기 멀티채널 서버 | FastAPI, asyncio Queue·디바운스, SSE 스트리밍, ContextVar. app/channels/base.py·UnifiedQueueManager 분석 + 채널 하나 흐름 추적. |
| 3주차 | 에이전트 확장 (Skills/MCP/ACP) | SKILL.md 작성, MCP 클라이언트 연결, ACP 노출. 직접 스킬·플러그인 만들어 등록. |
| 4주차 | 운영 · 보안 · 배포 | Tool Guard 규칙, 시크릿 키링, JWT 인증, Docker(멀티스테이지)+Tauri 데스크탑 빌드. |
에이전트/LLM이 궁금하면 1주차부터, 백엔드 서버 설계가 궁금하면 2주차부터 시작하면 된다. 가장 빨리 흥미가 붙는 길은 "8번 실습 1·2번으로 비서를 먼저 띄워 본 뒤, 텔레그램 메시지 한 통이 코드에서 어떻게 흐르는지 4번 아키텍처 그림을 따라가며 읽는" 역방향 학습이다.
레포 문서·코드에 자주 나오는 용어 빠른 정리.
BaseChannel을 상속해 "그 플랫폼의 메시지를 받아 에이전트 요청으로 바꾸고, 응답을 그 플랫폼 형식으로 돌려보내는" 역할을 한다. 빌트인 17종.rm -rf·fork bomb 같은 위험 패턴을 정규식 규칙(YAML)으로 차단하거나 사용자 승인을 요구하는 안전장치. 자율 에이전트의 "안전벨트".~/.qwenpaw/)에 저장하는 방식. 셀프호스팅·프라이버시·이식성이 좋다(선택적으로 ADBPG 벡터 메모리 연결 가능).더 깊이 파고들 곳.
| 리소스 | 주소 / 명령 | 용도 |
|---|---|---|
| GitHub 저장소 | github.com/agentscope-ai/QwenPaw | 소스코드 · README · 이슈 · 릴리스. |
| 공식 문서 | qwenpaw.agentscope.io | 설치 가이드 · 채널 설정 · 릴리스 노트. |
| PyPI 패키지 | pip install qwenpaw | 한 줄 설치. |
| 핵심 프레임워크 | agentscope · agentscope-runtime | QwenPaw가 올라탄 에이전트 엔진(같은 조직). |
| DeepWiki | deepwiki.com/agentscope-ai/QwenPaw | 레포 구조 자동 문서화(AI 생성 위키). |
| 관련 표준 | MCP(modelcontextprotocol.io) · ACP | QwenPaw가 통합한 에이전트 도구·에디터 프로토콜. |