TRENDSHIFT 딥다이브 · 일간 #2 · 2026-06-18

QwenPaw 딥다이브
— 내 메신저 안에 사는 '셀프호스팅 AI 비서'

QwenPaw는 텔레그램·디스코드·위챗·QQ·딩톡·라크 같은 채팅앱 17곳에 동시에 연결되어, 단순히 답만 하는 게 아니라 셸 명령 실행·파일 작업·브라우저 자동화·예약 작업까지 "행동"하는 개인 AI 에이전트를, 내 컴퓨터나 내 서버에 직접 띄우는 오픈소스 셀프호스팅 비서 플랫폼이다. pip install qwenpaw 한 줄로 깔린다. 알리바바 통이(Tongyi) 계열인 agentscope-ai 조직이 만든 agentscope 에이전트 프레임워크 위에 올라가 있다. (저장소: agentscope-ai/QwenPaw · Python+FastAPI 백엔드 + React(Ant Design)+Tauri 데스크탑 콘솔 · Apache 2.0 · ★18.4k · 옛 이름 CoPaw)
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

한 문장으로 이 프로젝트가 뭘 하는지부터.

QwenPaw = "내가 쓰는 모든 메신저 안에 들어와 있는, 도구를 쓸 줄 아는 개인 AI 비서." ChatGPT는 정해진 웹사이트에서만 만나지만, QwenPaw는 텔레그램·디스코드·위챗 등 내가 평소 쓰는 채팅앱 안에서 직접 말을 걸 수 있고, 부탁하면 답변만 하는 게 아니라 파일을 찾아 읽고·코드를 돌리고·웹을 뒤지고·매일 아침 뉴스를 요약해 보내주는 일까지 "행동"한다. 그리고 그 비서는 내 컴퓨터(또는 내 서버)에서 돌아간다.

🐾 한 줄 비유

"클라우드에 세 들어 사는 챗봇"이 아니라, "내 집에 상주하는 비서"를 들이는 것

보통의 AI 비서는 남의 서버(클라우드)에 살고, 내 대화·파일이 그 회사를 거쳐 간다. QwenPaw는 반대로 비서를 내 집(내 머신)에 들인다. 열쇠(API 키)도 내 금고(OS 키링)에, 일지(대화·메모리)도 내 서랍(로컬 파일)에 둔다.

대신 이 비서는 손발이 있다 — 터미널을 쓰고, 브라우저를 열고, 예약 알람을 건다. 그래서 "말귀를 알아듣는 챗봇"을 넘어 "심부름을 실제로 해내는 에이전트"에 가깝다.

용어
셀프호스팅 (Self-hosting)
남의 클라우드 서비스를 쓰는 대신, 소프트웨어를 내 컴퓨터·내 서버에 직접 설치해 운영하는 것. 데이터가 밖으로 안 나가 프라이버시·통제권이 강하지만, 설치·관리·보안은 내 책임이 된다.
용어
에이전트 (Agent)
스스로 "다음에 뭘 할지" 판단하고 도구를 골라 쓰는 AI. 챗봇이 "대답만" 한다면, 에이전트는 "파일을 읽고 → 명령을 실행하고 → 결과를 보고 다시 판단"하는 행동까지 한다. QwenPaw의 두뇌가 이 에이전트(ReAct 루프)다.

중요한 사실 하나 — 이름이 비슷해 헷갈리지만 QwenPaw는 흔히 알려진 다른 챗봇 호스팅 프로젝트(AstrBot 등)와 코드 계보가 다르다. 원래 이름은 CoPaw였고 2026년 4월 QwenPaw로 리브랜딩됐으며, 알리바바 통이 연구 계열인 agentscope-ai 조직 소유다. 핵심 엔진도 같은 조직의 agentscope / agentscope-runtime 프레임워크다.

2왜 주목받는가

TrendShift 일간 2위까지 올라온 이유 — 트렌딩의 배경.

2025~2026년은 "에이전트가 실제 업무를 대신하는" 흐름이 폭발한 시기다. 코딩 에이전트(Claude Code·Codex)에 이어, 이번엔 "내 개인 비서 에이전트를 통째로 셀프호스팅"하는 쪽이 주목받는다. QwenPaw가 상위로 올라온 이유를 다섯으로 정리한다.

① "내 메신저 = 비서 창구" — 17개 채널 동시 연결

텔레그램·디스코드·위챗·QQ·딩톡·라크(Feishu)·Matrix·Mattermost·기업위챗·iMessage·MQTT, 심지어 SIP(전화)까지. 한 비서를 띄워 두면 어느 메신저에서 말을 걸든 같은 에이전트가 같은 기억으로 응답한다. "챗봇을 어디에 붙일까"라는 통합 문제를 한 번에 해결한 것이 가장 큰 매력이다.

② 알리바바 agentscope 생태계의 플래그십

QwenPaw는 단독 프로젝트가 아니라, 알리바바의 오픈소스 에이전트 프레임워크 agentscope 위에 세워진 대표 응용 사례다. Qwen(통이천문) 모델을 무료 티어로 바로 쓸 수 있고, DashScope·ModelScope 연동이 1급 시민이다. 프레임워크 제작사가 직접 만든 레퍼런스 앱이라 "agentscope를 제대로 쓰는 법"의 교본 역할을 한다.

③ Skills + MCP + ACP — 에이전트 표준 3종 세트를 한 몸에

요즘 에이전트 생태계의 세 표준을 모두 엮었다. 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라도 비교적 새 프로젝트라 빠르게 바뀐다 — "트렌딩이라 안전·완성"이 아니라, 최신 에이전트 아키텍처를 공부하기 좋은 살아있는 사례로 보는 게 맞다.

3기술 스택 전체 지도

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) 벡터 백엔드 연결.

ⓑ LLM 공급자 & 채널 SDK

구성요소무엇역할
openai · google-genai · anthropicLLM SDKOpenAI/Gemini/Anthropic 직접 + 호환 API 수십 종(DeepSeek·Kimi·Zhipu·DashScope/Qwen 등).
Ollama · LM Studio로컬 LLMAPI 키 없이 내 머신에서 모델 구동. 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 5UI 라이브러리antd + agentscope 자체 컴포넌트(@agentscope-ai/chat 등). Vue 아님.
Zustand · React Router 7상태 · 라우팅가벼운 전역 스토어 + SPA 라우팅.
Monaco · Mermaid · i18next에디터 · 도식 · 다국어코딩 모드 웹 IDE, 다이어그램 렌더, 영/중 다국어.
Tauri 2 (Rust)데스크탑 패키징같은 React 콘솔을 네이티브 데스크탑 앱(NSIS 인스톨러)으로 빌드.

ⓓ 저장 & 보안 (DB가 아니라 파일!)

구성요소무엇역할
~/.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접근 제어채널별 사용자/그룹 화이트·블랙리스트, 그룹 멘션 게이트.
용어
MCP (Model Context Protocol)
AI 에이전트가 외부 도구·데이터에 접근하는 표준 규약. USB-C처럼 "한 번 꽂으면 어떤 에이전트든 같은 방식으로 도구를 쓴다." QwenPaw는 외부 MCP 서버의 도구를 자기 에이전트에 등록(클라이언트)하고, OAuth 2.1·도구 화이트리스트까지 지원한다.
용어
ACP (Agent Client Protocol)
에디터·IDE가 외부 에이전트와 stdio JSON-RPC로 대화하는 프로토콜(Zed가 주도). QwenPaw는 ACP 서버로 자신을 노출해 Zed·OpenCode가 붙게 하고, 반대로 외부 ACP 에이전트에게 일을 위임할 수도 있다.

4아키텍처 심화 분석

텔레그램에 보낸 한 줄이 답이 되어 돌아오기까지 — 메시지의 여정.

QwenPaw의 진짜 묘미는 "표준 프레임워크는 위임하고, 자기만의 레이어를 위에 얹는" 이중 구조다. 에이전트의 추론 루프(ReAct)는 agentscope에 맡기고, 그 위에 채널 입출력·메시지 큐·접근제어·보안 가드를 직접 구현했다. 메시지 한 통의 흐름을 그림으로 보면 이렇다.

[채팅 플랫폼: 텔레그램 / 디스코드 / 위챗 / QQ / 딩톡 / 라크 / Matrix ...] │ (웹훅 · 롱폴 · 웹소켓 — 채널별 SDK) ▼ app/channels/{플랫폼}/channel.py ← BaseChannel 서브클래스 │ enqueue(channel_id, payload) ▼ UnifiedQueueManager ← 세션키별 asyncio.Queue + consumer 루프 │ · 디바운스(연달아 온 메시지 버퍼링) · 배치 병합 ▼ BaseChannel.consume_one(payload) │ ① 접근제어 게이트(화이트/블랙리스트, 그룹 멘션) │ ② 컨트롤 커맨드면 즉시 처리 ③ AgentRequest로 변환 ▼ DynamicMultiAgentRunner.stream_query() ← X-Agent-Id로 워크스페이스 라우팅 ▼ MultiAgentManager.get_agent(id) → Workspace(에이전트별 격리) → AgentRunner │ · ContextVar로 agent/session/user/channel 컨텍스트 전파 │ · MCP 클라이언트(핫리로드) 도구 합류 ▼ QwenPawAgent(CodingModeMixin, ToolGuardMixin, ReActAgent) ┌───────────── agentscope ReAct 루프 (추론 ↔ 행동, max_iters) ─────────────┐ │ model = RetryChatModel(TokenRecordingModelWrapper(공급자 모델)) │ │ toolkit = 빌트인 도구 + 스킬 + 플러그인 도구 + MCP 도구 │ │ hooks: pre_reasoning / post_acting … (컨텍스트 압축 · 부트스트랩) │ │ 도구: 셸 실행 · 파일 IO · 브라우저 · 서브에이전트 생성 · LSP · MCP … │ └───────────────────────────────┬──────────────────────────────────────────┘ ▲ │ 각 단계가 Event 스트림으로 방출 │ Event가 역방향으로 다시 올라감 ▼ BaseChannel.on_event_* → MessageRenderer(플랫폼별 메시지로 변환) ▼ [원래 채팅 플랫폼으로 스트리밍 응답 전송]

핵심 설계 패턴 ① — 프레임워크 위임 + Mixin 합성

에이전트 클래스 정의 한 줄이 전체 설계 철학을 압축한다:

class QwenPawAgent(CodingModeMixin, ToolGuardMixin, ReActAgent):
    # 추론 루프 자체는 agentscope의 ReActAgent에 위임하고,
    # '코딩 모드'와 '도구 안전 가드' 같은 횡단 관심사는 Mixin으로 끼워 넣는다.

자체 ReAct를 새로 짜지 않고 ReActAgent를 상속하되, 기능을 Mixin(혼합 클래스)으로 분리해 합성했다. "도구 가드"나 "코딩 모드"를 켜고 끄기 쉽고, 본체 코드가 깔끔해진다 — 다중 상속의 모범적 사용.

핵심 설계 패턴 ② — 데코레이터 체인으로 모델 감싸기

LLM 모델 객체를 그대로 쓰지 않고, 같은 인터페이스를 유지한 채 기능을 겹겹이 입힌다.

model = RetryChatModel(            # ③ 재시도 · 레이트리밋 · 백오프
            TokenRecordingModelWrapper(   # ② 토큰 사용량 기록
                provider.get_chat_model_instance(model_name)  # ① 원본 모델
            )
        )

양파처럼 감싼 데코레이터 패턴이다. 토큰 측정·재시도 로직이 에이전트 본체에 섞이지 않고 투명하게 추가된다. 멀티벤더 LLM 앱을 만들 때 그대로 베껴 쓸 만한 구조다.

핵심 설계 패턴 ③ — 레지스트리 + base_url 프리셋

수십 개 LLM 공급자를 일일이 클래스로 만들지 않는다. OpenAI 호환·Anthropic 호환·Gemini 3개 베이스로 환원하고, DeepSeek·Kimi·Zhipu·DashScope(Qwen) 등은 base_url과 메타데이터만 바꿔 등록한다. 채널도 마찬가지로 딕셔너리 레지스트리 + 지연 import(lazy) 방식이다.

핵심 설계 패턴 ④ — 큐 + 디바운스 + 컨텍스트 전파

채팅의 현실 문제를 구조로 푼다. 사용자가 메시지를 3줄 연달아 보내면? UnifiedQueueManager가 세션별 큐에서 디바운스(잠깐 모았다 합치기)·배치 병합으로 처리한다. 그리고 비동기 호출 사슬 전체에 누가·어느 채널·어느 세션인지를 ContextVar로 흘려보내, 미들웨어→러너→모델→토큰기록까지 일관된 컨텍스트를 유지한다.

용어
ReAct (Reason + Act)
LLM이 한 번에 답을 뱉지 않고 "지금 뭘 알아야 하지?(추론) → 이 도구를 쓰자(행동) → 결과를 보니(관찰) → 다음은…"을 목표 달성까지 반복하는 패턴. QwenPaw의 도구 사용 능력이 바로 이 루프(agentscope ReActAgent)에서 나온다.
왜 '위임 + 얹기' 구조가 영리한가

에이전트의 추론 루프를 직접 만들면, LLM 생태계가 바뀔 때마다 따라 고쳐야 한다. QwenPaw는 그 가장 빨리 변하는 부분(추론·도구호출 표준)을 agentscope에 맡기고, 자기 가치가 분명한 부분(채널 통합·보안·운영 콘솔)에만 집중한다. "남이 잘하는 건 빌리고, 내가 잘할 것에 투자"하는 전형적 레이어링이다.

5디렉토리 구조 해부

레포를 클론하면 보이는 폴더들 — 어디에 뭐가 있나.

QwenPaw/ ├── src/qwenpaw/ # ★ Python 패키지 본체 (526개 .py) │ ├── agents/ # 에이전트 코어 (가장 중요) │ │ ├── react_agent.py # QwenPawAgent — ReAct + Mixin │ │ ├── model_factory.py # 모델 생성 + 데코레이터 체인 │ │ ├── tools/ # 빌트인 도구(셸·파일·브라우저·서브에이전트·LSP) │ │ ├── skill_system/ # 스킬 로딩(pool → workspace 복사) │ │ ├── skills/ # 빌트인 스킬(SKILL.md, en/zh): cron·news·pdf… │ │ ├── memory/ # ReMeLight / Markdown / 능동 메모리 │ │ ├── context/ # 컨텍스트 압축 │ │ └── acp/ # Agent Client Protocol │ ├── app/ # 앱/서버 레이어 (181개 .py) │ │ ├── _app.py # FastAPI 조립 + DynamicMultiAgentRunner │ │ ├── channels/ # 17개 채널 어댑터 + base/manager/registry │ │ ├── routers/ # 40+ FastAPI 라우터 │ │ ├── runner/ # AgentRunner + 세션/명령 디스패치 │ │ ├── workspace/ # 에이전트별 서비스 컨테이너 │ │ ├── mcp/ # MCP 클라이언트 관리(핫리로드) │ │ └── approvals/ # 위험 작업 승인 워크플로 │ ├── providers/ # LLM 공급자(레지스트리 + 재시도 래퍼 + OAuth) │ ├── security/ # tool_guard / skill_scanner / secret_store │ ├── cli/ # click 기반 CLI(app·init·channels·cron·doctor…) │ └── config/ # Pydantic 설정 모델 전체 │ ├── console/ # 웹 콘솔 (React 18 + Vite + TS + Ant Design) │ └── src-tauri/ # Tauri 2(Rust) — 데스크탑 앱 빌드 ├── website/ # 문서/랜딩 사이트 ├── plugins/ # 번들·도구 플러그인(cloudpaw, qwenpaw-pet, gpt-image2…) ├── deploy/ # Dockerfile(멀티스테이지) + entrypoint + supervisord ├── docker-compose.yml # 8088 포트 + data/secret/backup 볼륨 3개 ├── e2e/ · tests/ # E2E(playwright) + 단위/통합 테스트 └── pyproject.toml # 패키징 + CLI 진입점(qwenpaw / copaw)

한눈에 정리하면: 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/ = 사장실 모니터(설정·현황 관리). 입구는 여럿이어도 일하는 비서는 하나다.

6학습 포인트 (기술별)

이 레포에서 무엇을, 어떻게 배울 수 있나.

① 표준 프레임워크 위에 프로덕션 시스템 얹기 (가장 값진 부분)

"agentscope가 주는 ReAct/Toolkit/Formatter를 어떻게 상속·확장하고, 그 위에 채널 I/O·큐·접근제어를 직접 구현하는가"의 분리선이 명확하다. 프레임워크를 쓰되 끌려다니지 않는 법을 배우는 실전 교본이다.

실습 아이디어: react_agent.py에서 어떤 부분이 agentscope 상속이고 어떤 부분이 QwenPaw 자체 코드인지 형광펜으로 나눠 본다.

② 멀티벤더 LLM 추상화

베이스클래스 환원 + base_url 프리셋 + 데코레이터(재시도·레이트리밋·토큰측정) 체인. 수십 개 LLM을 한 인터페이스로 다루는 멀티벤더 LLM 앱의 모범 설계providers/에서 통째로 볼 수 있다.

실습 아이디어: providers/에서 OpenAI 호환 프리셋이 어떻게 정의되는지 찾아, base_url만 바꾼 "가짜 공급자"를 하나 추가해 본다.

③ 비동기 메시지 파이프라인

asyncio Queue, 디바운스, 배치 병합, ContextVar 컨텍스트 전파, graceful shutdown. "여러 채팅방에서 동시에 메시지가 쏟아질 때 어떻게 안 꼬이게 처리하나"의 구체적 답을 app/channels/에서 배운다.

실습 아이디어: UnifiedQueueManager의 디바운스 시간을 바꿔, 메시지를 빠르게 연달아 보낼 때 동작이 어떻게 달라지는지 관찰한다.

④ Skills + MCP + ACP 통합

요즘 에이전트 생태계 표준(Skills·MCP·ACP)을 한 시스템에 엮은 드문 레퍼런스. SKILL.md 포맷, MCP 클라이언트 핫리로드, ACP 서버/클라이언트 양방향을 실제 코드로 확인할 수 있다.

실습 아이디어: 빌트인 스킬 하나(agents/skills/cron-en/SKILL.md)를 열어, frontmatter와 본문이 에이전트에게 어떻게 "도구 사용법"을 알려주는지 읽어 본다.

⑤ 에이전트 보안 가드레일

"에이전트가 rm -rf를 치면 어떻게 막나?"의 실제 구현. 정규식 규칙 엔진(Tool Guard) + 스킬 정적 스캐너 + 승인 워크플로의 다층 방어를 security/에서 본다. 자율 에이전트를 만들 사람이라면 반드시 봐야 할 부분.

실습 아이디어: security/tool_guard/의 위험 명령 YAML 규칙을 읽고, 차단되는 명령과 통과되는 명령의 경계를 정리한다.

⑥ 웹앱을 Tauri로 데스크탑 패키징

같은 React 코드를 웹 콘솔과 데스크탑 앱으로 동시 배포하는 방법(Rust Tauri 2 + NSIS). "내 웹 도구를 어떻게 설치형 앱으로 만드나"의 가벼운 입문이 console/src-tauri/에 있다.

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

내 컴퓨터에서 돌리려면 뭐가 필요한가.

QwenPaw 자체는 "LLM API를 호출하는 가벼운 에이전트 서버"다. 클라우드 LLM(Qwen·DeepSeek·OpenAI 등)을 쓰면 무거운 GPU가 필요 없다 — 진짜 계산은 LLM 쪽이 한다. 내 머신은 채널 중계·도구 실행·웹 콘솔만 돌리면 된다. 단, 로컬 모델·브라우저 자동화·코딩 모드를 켜면 그만큼 자원이 더 든다.

항목요구사항비고
Python3.10 ~ 3.13로컬 설치 시 필요(pip install qwenpaw). 3.14 미만.
LLMAPI 키 1개 또는 Ollama/LM StudioQwen 무료 티어·DeepSeek·Kimi·OpenAI 등 / 로컬 모델은 키 불필요.
GPU클라우드 LLM이면 불필요로컬 모델을 직접 구동할 때만 모델 크기만큼 RAM/VRAM 필요.
Docker권장 배포 방식이미지에 Chromium·Xvfb·supervisord 포함. docker compose up → 8088 포트.
브라우저 자동화Playwright Chromiumbrowser_use 도구 사용 시 추가 메모리·디스크.
공식 최소 사양명시 안 됨레포 문서에 정량 최소 사양은 없음 — 위 항목으로 가늠.
중요한 함정
"손발 달린 비서"는 보안 설정이 절반이다

QwenPaw는 셸·파일·브라우저를 실제로 만진다. 인증 없이 외부에 포트를 열면 누구나 내 비서에게 명령할 수 있고, 신뢰할 수 없는 스킬·MCP를 붙이면 위험 코드가 실행될 수 있다. Docker가 무인증으로 바인딩되면 entrypoint가 경고를 띄우는 이유다. 셀프호스팅은 "깔면 끝"이 아니라 네트워크·인증·도구 권한 설정까지가 한 세트다.

기본으로 깔린 안전장치
시크릿 분리 · 도구 가드 · 콘솔 인증

API 키는 작업 폴더와 분리해 OS 키링에 두고, 위험 셸 명령은 Tool Guard가 막으며, 콘솔은 JWT 인증(QWENPAW_AUTH_* 환경변수)을 걸 수 있다. 채널별 화이트리스트로 "누가 이 비서에게 말 걸 수 있나"도 통제된다. 안전장치는 있으니, 켜고 제대로 설정하는 것이 사용자 몫이다.

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

난이도별 5개 — 손으로 익히는 게 최고다.

난이도 ★☆☆ — 첫 비서 띄우기

1. 5분 만에 내 AI 비서 깨우기

pip install qwenpawqwenpaw initqwenpaw apphttp://127.0.0.1:8088 콘솔에 접속. LLM 공급자(예: Qwen 무료 티어 또는 Ollama)를 연결하고 첫 대화를 나눈다. 목표: 콘솔 구조와 "모델 연결 → 대화"의 기본 흐름 체험.

난이도 ★☆☆ — 메신저 연결

2. 텔레그램 봇으로 비서 불러내기

BotFather로 텔레그램 봇 토큰을 발급받아 qwenpaw channels(또는 콘솔)에서 텔레그램 채널을 켠다. 폰에서 봇에게 말을 걸어 본다. 목표: 같은 에이전트가 웹과 메신저에서 동일하게 응답하는 "멀티채널"을 체감.

난이도 ★★☆ — 예약 작업

3. 매일 아침 뉴스 다이제스트 예약하기

빌트인 cron + news 스킬을 이용해 "매일 아침 8시에 AI 뉴스 요약을 텔레그램으로 보내줘"를 예약한다. 목표: 스킬 + 스케줄러(APScheduler)가 결합해 "능동적으로 일하는 비서"가 되는 과정 이해.

난이도 ★★☆ — 스킬 만들기

4. 나만의 SKILL.md 한 장 추가하기

~/.qwenpaw/skill_pool/SKILL.md(YAML frontmatter + 본문) 한 장을 떨궈, 에이전트가 자동으로 그 스킬을 인식·사용하게 한다. 목표: Anthropic Agent Skill 포맷과 "pool → workspace 동기화" 로딩 구조를 직접 손으로 확인.

난이도 ★★★ — 도구 확장

5. MCP 서버 연결 또는 플러그인 만들기

외부 MCP 서버(예: 파일시스템·검색 MCP)를 연결해 에이전트 도구로 등록하거나, plugin.json + api.register_tool(...)로 커스텀 도구 플러그인을 만든다. 목표: "에이전트의 능력을 어떻게 외부에서 확장하나"를 MCP/플러그인 두 경로로 체득.

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

이 레포를 발판으로 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번 아키텍처 그림을 따라가며 읽는" 역방향 학습이다.

10핵심 키워드 사전

레포 문서·코드에 자주 나오는 용어 빠른 정리.

용어
agentscope / agentscope-runtime
알리바바 통이 계열(agentscope-ai)이 만든 오픈소스 에이전트 프레임워크와 그 런타임. QwenPaw의 ReAct 루프·도구킷·모델 추상화·서버 빌더가 모두 여기서 온다. QwenPaw는 이 프레임워크의 대표 응용 사례다.
용어
채널 (Channel)
텔레그램·디스코드·위챗 같은 외부 메신저/프로토콜을 QwenPaw에 연결하는 어댑터. BaseChannel을 상속해 "그 플랫폼의 메시지를 받아 에이전트 요청으로 바꾸고, 응답을 그 플랫폼 형식으로 돌려보내는" 역할을 한다. 빌트인 17종.
용어
스킬 (Skill / SKILL.md)
에이전트에게 "이럴 때 이렇게 해라"를 알려주는 폴더형 지식 묶음. Anthropic의 Agent Skill 포맷(YAML frontmatter + 마크다운)을 그대로 채택했다. 필요할 때만 읽어 들이고(점진적 공개), 사용자가 새로 추가·수정할 수 있다.
용어
Tool Guard (도구 가드)
에이전트가 실행하려는 도구 호출(특히 셸 명령)의 인자를 검사해, rm -rf·fork bomb 같은 위험 패턴을 정규식 규칙(YAML)으로 차단하거나 사용자 승인을 요구하는 안전장치. 자율 에이전트의 "안전벨트".
용어
멀티 에이전트 / 서브에이전트
역할이 다른 여러 에이전트를 동시에 띄우고(MultiAgentManager), 한 에이전트가 다른 에이전트를 만들어(spawn) 일을 위임하거나 협업하는 구조. 복잡한 작업을 여러 "전문 비서"에게 분배할 수 있다.
용어
ContextVar (컨텍스트 변수)
비동기 코드에서 "지금 처리 중인 요청이 누구·어느 채널·어느 세션인지"를 함수 인자로 일일이 넘기지 않고 호출 사슬 전체에 자동으로 전파하는 파이썬 기능. 멀티에이전트 라우팅·토큰 집계의 핵심 장치.
용어
Tauri
웹 기술(HTML/JS)로 만든 UI를 가벼운 네이티브 데스크탑 앱으로 패키징하는 Rust 기반 프레임워크(Electron의 경량 대안). QwenPaw는 같은 React 콘솔을 웹과 데스크탑 앱으로 동시에 낸다.
용어
파일 기반 영속화 (No-DB)
MySQL·PostgreSQL 같은 DB 서버 없이, 설정·대화·메모리를 평범한 JSON/Markdown 파일(~/.qwenpaw/)에 저장하는 방식. 셀프호스팅·프라이버시·이식성이 좋다(선택적으로 ADBPG 벡터 메모리 연결 가능).

11참고 링크

더 깊이 파고들 곳.

리소스주소 / 명령용도
GitHub 저장소github.com/agentscope-ai/QwenPaw소스코드 · README · 이슈 · 릴리스.
공식 문서qwenpaw.agentscope.io설치 가이드 · 채널 설정 · 릴리스 노트.
PyPI 패키지pip install qwenpaw한 줄 설치.
핵심 프레임워크agentscope · agentscope-runtimeQwenPaw가 올라탄 에이전트 엔진(같은 조직).
DeepWikideepwiki.com/agentscope-ai/QwenPaw레포 구조 자동 문서화(AI 생성 위키).
관련 표준MCP(modelcontextprotocol.io) · ACPQwenPaw가 통합한 에이전트 도구·에디터 프로토콜.