devartifex/copilot-unleashed: 모든 Copilot 모델을 위한 자체 호스팅 AI 채팅
요약
이 프로젝트는 공식 Copilot SDK 기반으로 모든 주요 AI 모델을 자체 호스팅하여 사용할 수 있는 멀티 모델 채팅 환경을 제공합니다. Autopilot 에이전트 기능과 원격 세션 게시, 영속적인 세션 관리 등 개발 워크플로우 전반에 걸쳐 강력한 기능을 통합했습니다.
핵심 포인트
- 다양한 AI 모델(Claude Opus, GPT-5.4 등)을 하나의 환경에서 사용 가능합니다.
- Autopilot 에이전트가 이슈 수정부터 PR 생성까지 자동화하여 개발 효율성을 높입니다.
- 원격 세션 게시 및 영속적인 세션 관리를 통해 모든 장치에서 대화를 끊김 없이 이어갈 수 있습니다.
- BYOK 기능을 지원하며, CLI와 브라우저 간의 완벽한 동기화가 가능합니다.
모든 Copilot 모델. 하나의 로그인. 모든 장치. 사용자의 서버.
공식 @github/copilot-sdk 기반의 자체 호스팅 멀티 모델 AI 채팅
.
Autopilot 에이전트 · 실시간 추론 트레이스 · 네이티브 GitHub 도구 · 에이전트, 스킬, 프롬프트, 지침 및 MCP 서버를 위한 SDK 네이티브 커스터마이징 · 음성 입력 및 읽어주기.
Autopilot은 이슈 #88을 읽고, 수정 사항을 구현하며, 테스트를 실행하고, PR을 열어줍니다 — 개입 없음.
독립 프로젝트이며 GitHub와 제휴하지 않습니다. MIT 라이선스.
모든 Copilot 모델— Claude Opus 4.6, GPT-5.4, Gemini 3 Pro, Claude Sonnet 4.6 등 — 대화 중간에 전환하고 전체 기록 유지Autopilot 에이전트— 도구 실행을 통해 계획, 코드 작성, 테스트 실행 및 PR 자동 생성원격 세션 게시(Remote session publishing)— GitHub.com에서 표시되도록 세션을 선택적으로 설정 / 원격 세션 설정(Off / Export / Full remote)을 통한 모바일 접속; 배너를 통해 GitHub의 실시간 세션으로 연결됨. 서버 측 토글: ENABLE_REMOTE_SESSIONS (기본값 켜짐); 세션별 옵트인 여전히 필요.클라우드 세션(Cloud sessions)— 모든 리포지토리(Sessions 패널의 owner/repo/branch 형식)에 대해 GitHub 클라우드 에이전트에서 실행되는 세션 생성마지막 세션 재개(Resume last session)— GET /api/sessions/last는 사용자의 가장 최근 로컬 세션 메타데이터를 반환하여 모든 장치에서 원터치로 계속 진행할 수 있도록 함확장된 사고 과정(Extended thinking)— 접을 수 있는
자동 완성(autocomplete); 클립보드에서 이미지 붙여넣기; 비전 모델이 인라인으로 이미지를 분석합니다Issue 및 PR 참조— #을 입력하여 모든 리포지토리의 GitHub 이슈/PR을 검색하고 참조할 수 있습니다슬래시 명령어(Slash commands)— /를 입력하여/run(셸 명령어), /settings, /sessions, /status와 같은 액션에 직접 채팅에서 접근합니다BYOK (Bring Your Own Keys)— 추가 모델 제공업체를 위해 자체 API 키를 연결합니다. 키는 AES-256-GCM으로 저장 시 암호화됩니다(BYOK_ENABLED를 통해 선택적 활성화)Elicitation— SDK의 대화형 권한 프롬프트 및 사용자 입력 요청 기능이며, 오토파일럿 모드에서 구성 가능한 자동 승인 기능을 제공합니다영속적인 세션(Persistent sessions)— 모든 장치에서 어떤 대화든 재개할 수 있습니다. 서버 측 스토리지를 통해 브라우저를 닫아도 채팅 상태가 유지되며 콜드 리줌(cold resume)을 지원합니다CLI ↔ 브라우저 동기화(CLI ↔ Browser sync)— Copilot CLI에서 시작된 세션은 브라우저에도 나타나고 그 반대도 마찬가지입니다. 전체 대화 기록은 CLI의 session-store.db에서 로드됩니다(자세한 내용은 ↓)MCP OAuth 토큰— OAuth 인증 MCP 서버는 주기적인 새로 고침과 함께 CLI 토큰 저장소에서 자동으로 토큰을 주입합니다푸시 알림(Push notifications)— 브라우저가 닫혀도 웹 푸시 알림이 전송됩니다. 전체 PWA 지원 기능을 제공합니다플랜 및 플릿 모드(Plan & Fleet mode)— 디스크 동기화가 가능한 편집 가능한 실행 계획을 통해 다중 에이전트 병렬 실행을 지원합니다할당량 추적(Quota tracking)— 프리미엄 요청 사용량, 남은 잔액, 초기화 날짜를 추적합니다접근 가능성 및 반응성(Accessible & responsive)— WCAG 2.2 AA 표준을 준수합니다: 의미론적 랜드마크, 키보드 탐색, 키보드 트랩 없음(오프스크린 패널은 visibility:hidden 사용), 보이는 포커스 링, 스크린 리더 레이블, 충분한 색상 대비, 모든 보기 및 뷰포트에서 감소된 모션 지원자체 호스팅(Self-hosted)— 데이터가 절대 서버를 벗어나지 않습니다. Docker 또는 azd up으로 배포할 수 있습니다. 이 앱은 Copilot SDK의 네이티브 사용자 정의 모델을 미러링합니다. 한 번 구성하면 어디서든 사용할 수 있으며, CLI와 브라우저는 동기화 상태를 유지합니다.
| 유형 | 위치 | 사용 방법 |
|---|---|---|
| Agents | ~/.copilot/agents/*.agent.md | Settings → Select active for session |
| Skills | SDK가 검색함 (Discovered by SDK) | Settings에서 토글 → 모델이 호출 가능(invoke)하게 함 |
| Prompts | ~/.copilot/prompts/*.prompt.md | 채팅창에 /명령어 입력 → 자동 완성됨 (autocompletes) |
| Instructions | ~/.copilot/copilot-instructions.md | 자동으로 검색되며, Settings에서 표시됨 |
| MCP 서버 | ~/.copilot/mcp-config.json | Settings에서 토글 → 사용 가능한 도구(tools) 확인; OAuth 인증된 서버는 CLI 토큰 저장소에서 자동으로 토큰을 주입함 (auto-inject tokens from the CLI token store) |
모든 경로는 리포지토리 범위 변형(repo-scoped variants)도 지원합니다 (.github/agents/, .github/prompts/, .github/instructions/, .github/mcp-config.json).
Settings에 표시되는 소스 배지는 각 사용자 정의가 어디서 검색되었는지 보여줍니다: CLI (SDK 런타임), User (~/.copilot), 또는 Repo (.github/).
사전 준비 사항(Prerequisites): Copilot이 포함된 GitHub 계정 (무료 등급 사용 가능) + GitHub OAuth App.
OAuth App을 생성할 때, Homepage URL을 http://localhost:3000으로 설정하고 Authorization callback URL은 비워둡니다. 이 앱은 Device Flow를 사용하므로 콜백(callback)이 필요하지 않습니다.
1. 필수 환경 변수 설정
.env.example 파일을 .env로 복사합니다 (또는 .env 파일을 생성하고).
그리고 두 가지 필수 값을 채웁니다:
GITHUB_CLIENT_ID=<your-oauth-app-client-id> # github.com/settings/developers에서 가져옴
SESSION_SECRET=<random-32-byte-hex> # 생성 방법: openssl rand -hex 32
2. 실행(Run)
이전에 클론했습니까? 최신 변경 사항을 먼저 가져옵니다:
git fetch origin && git reset --hard origin/master
docker compose up --build
npm run dev는 위의 명령어의 별칭(alias)입니다.
Docker는 필수적입니다. @github/copilot CLI는 컨테이너 내부에 설치되며 SDK의 런타임 종속성(runtime dependency)입니다. 이것 없이는 앱이 작동하지 않습니다.
localhost:3000을 열고 GitHub으로 로그인합니다. 완료되었습니다.
| 변수 (Variable) | 필수 여부 (Required) | 기본값 (Default) | 용도 (Purpose) |
|---|---|---|---|
GITHUB_CLIENT_ID | 예 (yes) | — | GitHub OAuth App의 Client ID입니다. |
SESSION_SECRET | 예 (yes) | — | 쿠키 암호화를 위한 무작위 비밀 키입니다. openssl rand -hex 32로 생성하세요. |
PORT | — | 3000 | HTTP 서버 포트입니다. |
ALLOWED_GITHUB_USERS | — | — | 쉼표로 구분된 GitHub 사용자 이름입니다. 생략하면 인증된 모든 사용자가 허용됩니다. |
BASE_URL | — | http://localhost:3000 | 공개 URL입니다. 쿠키 도메인 및 WebSocket 오리진 검증에 사용됩니다. |
BYOK_ENABLED | — | false | 설정(Settings)에서 Bring Your Own Keys 패널을 활성화하려면 true로 설정하세요. |
모든 옵션 (All options)
| 변수 (Variable) | 기본값 (Default) | 용도 (Purpose) |
|---|---|---|
NODE_ENV | development | production은 보안 쿠키를 활성화합니다. |
TOKEN_MAX_AGE_MS | 86400000 | 재인증 간격(24시간)을 강제 설정합니다. |
SESSION_POOL_TTL_MS | 300000 | 연결이 끊겼을 때의 세션 TTL입니다 (5분). |
MAX_SESSIONS_PER_USER | 5 | 최대 동시 탭/기기 수입니다. |
COPILOT_CONFIG_DIR | ~/.copilot | 양방향 동기화(bidirectional sync)를 위해 CLI와 공유합니다. |
SESSION_STORE_PATH | /data/sessions | 영구 세션 디렉토리입니다. |
SETTINGS_STORE_PATH | /data/settings | 사용자별 설정 디렉토리입니다. |
CHAT_STATE_PATH | /data/chat-state | 보존된 채팅 상태입니다. |
VAPID_PUBLIC_KEY | — | 푸시 알림(base64url)에 사용됩니다. |
VAPID_PRIVATE_KEY | — | 푸시 알림(base64url)에 사용됩니다. |
VAPID_SUBJECT | — | 푸시 주제(mailto: 또는 https: )입니다. |
PUSH_STORE_PATH | /data/push-subscriptions | 푸시 구독 저장소입니다. |
ENABLE_REMOTE_SESSIONS | true | 세션이 클라우드 게시(cloud publishing) (`remoteSession: |
Container Apps, ACR (Basic), Key Vault (RBAC 전용), managed identity, Log Analytics, 그리고 TLS — 모두 자동으로 프로비저닝됩니다. azd up
GITHUB_CLIENT_ID가 이미 설정되어 있지 않은 경우 프롬프트를 요청합니다.
VAPID 키, 문제 해결 및 세부 정보
VAPID 키 (선택 사항, 푸시 알림용):
node scripts/generate-vapid-keys.mjs
azd env set VAPID_PUBLIC_KEY "<key>"
azd env set VAPID_PRIVATE_KEY "<key>"
...
문제 해결:
MANIFEST_UNKNOWN: azd env set SERVICE_WEB_IMAGE_NAME "" && azd up으로 오래된 이미지 태그를 지웁니다.
ACR 403 Forbidden: azd env set DEPLOYER_IP_ADDRESS "$(curl -s https://api.ipify.org)" && azd provision으로 배포자 IP를 재설정합니다.
Key Vault 비밀 누락: GITHUB_CLIENT_ID가 설정되었는지 확인한 후 azd provision을 실행합니다.
Copilot CLI에서 시작된 세션은 브라우저에 나타나고 그 반대도 마찬가지입니다. 앱은 ~/.copilot/session-state/를 CLI와 공유하며 — 계획 편집(plan edits)이 양방향으로 자동으로 동기화됩니다.
# docker-compose.yml — 동기화 활성화
volumes:
- ~/.copilot:/home/node/.copilot
재배포 없이 원격 인스턴스로 세션을 푸시합니다:
npm run sync:push -- https://your-app.azurecontainerapps.io
동기화 작동 방식, 세션 번들링 및 기타
SDK는 각 세션을 ~/.copilot/session-state/{uuid}/로 저장하며, 여기에는 workspace.yaml, plan.md, 그리고 체크포인트 파일이 포함됩니다. 브라우저에서 세션을 재개할 때 SDK는 대화 기록을 자동으로 복원합니다 — 그리고 CLI의 session-store.db가 사용 가능하다면, 더 풍부한 재개 경험을 위해 전체 턴별(turn-by-turn) 기록이 로드됩니다. 디스크 전용 세션(예: Docker에 번들링된 경우)의 경우, 앱은 체크포인트 파일을 직접 읽고 컨텍스트로 주입하는 방식으로 대체합니다.
빌드 시 세션 번들링 (Azure / CI):
npm run bundle-sessions # ~/.copilot 세션 스냅샷
azd up # predeploy 훅을 통해 자동 실행
세션 패널은 30초마다 자동으로 새로고침됩니다. COPILOT_CONFIG_DIR를 사용하여 세션 상태 경로를 사용자 정의할 수 있습니다.
채팅은 github.com / Copilot Mobile에 **게시(published)**될 수 있습니다. 설정 → 원격 세션에서 기본값을 선택하세요 (새 세션에 적용되거나, '현재 세션에 적용'을 누르세요):
| 모드 | 효과 |
|---|---|
"off" (기본값) | 로컬 전용. 서버 외부로 아무것도 나가지 않습니다. |
"export" | 읽기 전용 미러 — 세션 이벤트가 GitHub로 스트리밍되어 github.com/copilot 및 모바일에서 모니터링 모드로 표시됩니다. |
"on" | 완전한 원격 제어 가능 — 해당 세션은 이 앱뿐만 아니라 github.com / Mobile에서도 제어할 수 있습니다. |
이것은 { type: "new_session", remoteSession: "on", ... } 형식의 WebSocket을 통해 전송되며, SDK의 sessionConfig.remoteSession으로 전달됩니다.
; 런타임 토글링은 { type: "remote_toggle", mode }를 사용합니다.
(SDK session.rpc.remote). GitHub가 세션 URL을 반환하면, 앱에
- GitHub Device Flow 로그인 → 토큰은 서버 측에만 저장
- WebSocket 연결 개시 → 서버가 사용자당
CopilotClient를 생성 - SDK 이벤트 스트리밍 → 서버가 타입 지정된 JSON으로 전달 → Svelte에서 실시간 재렌더링
- 연결 끊김 시 → 세션은 TTL(Time To Live)과 함께 풀링되며, 재연결 시 메시지를 재생함
Device Flow OAuth (GitHub CLI와 동일). 토큰은 서버 측에만 존재하며 브라우저로 절대 전송되지 않습니다. 세션은 암호화되고, 속도 제한이 적용되며, 모든 WebSocket 연결 시 GitHub의 API를 통해 검증됩니다.
중요
자체 호스팅 사용자: 기본적으로 장치 흐름(device flow)을 완료하는 모든 GitHub 사용자가 로그인할 수 있습니다. ALLOWED_GITHUB_USERS=your-login[,another-login]를 설정하여 접근을 지정된 허용 목록으로 제한해야 합니다. 이는 공개적으로 접근 가능한 배포에 대한 가장 중요한 보안 강화 단계입니다.
전체 보안 세부 정보
- CSP 헤더, CSRF 보호, HSTS(HTTP Strict Transport Security), X-Frame-Options DENY
- Permissions-Policy: 마이크로폰은 동일 출처(
self)로 제한
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub AI Coding Assistants의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기