HEXUXIU/M365-Copilot2API
Microsoft 365 Copilot → OpenAI / Anthropic 兼容 API 网关。
M365 Copilot2API란?
M365 Copilot2API는 Go로 작성된 자체 호스팅 게이트웨이로, OpenAI 호환 또는 Anthropic 호환 HTTP API(예: ChatGPT 스타일 SDK, Claude Code, Cursor, OpenCode)를 예상하는 모든 클라이언트를 사용하여 Microsoft 365 Copilot과 통신할 수 있게 해줍니다. 내부적으로는 M365 Copilot 서비스에서 사용하는 프라이빗 ChatHub WebSocket 프로토콜을 사용한 다음, 해당 메시지를 OpenAI 및 Anthropic API에서 정의한 표준 JSON 페이로드로 변환합니다.
존재 이유
- Microsoft 365 Copilot은 상업용 구독을 통해서만 사용할 수 있으며 해당 API는 공개적으로 문서화되어 있지 않습니다. 이 게이트웨이는 WebSocket 프로토콜을 리버스 엔지니어링하고 익숙한 REST 인터페이스를 노출합니다.
- 이를 통해 개발자는 독점 프로토콜에 맞게 다시 작성할 필요 없이 기존 도구, 라이브러리 및 에이전트를 재사용할 수 있습니다.
- 또한 관리 콘솔, API 키 처리, 다중 계정 로테이션, 프록시 풀, 사용 통계 및 캐싱(일반적으로 직접 구축해야 하는 기능)을 추가합니다.
핵심 기능 (README에 설명된 대로)
| 기능 | 역할 |
|---|---|
OpenAI 호환 /v1/chat/completions |
동일한 JSON 스키마를 수락하고, 스트리밍(stream:true) 및 함수 호출을 지원합니다. |
Anthropic 호환 /v1/messages |
Anthropic 요청 형식을 사용하여 Claude Code, Cursor 등과 함께 작동합니다. |
응답 엔드포인트(/v1/responses) |
OpenAI의 이전 Responses 프로토콜(예: Codex)과의 호환성. |
| SSE 스트리밍 | 공식 API와 마찬가지로 토큰별 이벤트를 반환합니다. |
| 도구 호출 변환 | OpenAI 함수 호출을 M365 Copilot 도구 프로토콜에 매핑합니다(두 가지 계획 모드: router 또는 native). |
| 콘텐츠 키 세션 재사용 | 동일한 대화 컨텍스트가 캐시되며, 후속 요청은 새 메시지만 업스트림으로 전송하여 토큰을 절약합니다. |
| 명시적 세션 바인딩 | 헤더 X-M365-Session-Id는 요청이 특정 클라우드 대화를 계속하도록 강제합니다. |
| 자동 정리 | 구성 가능한 TTL(기본 2시간) 후 또는 최대 크기 제한에 도달하면 유휴 클라우드 대화가 회수됩니다. |
| 다중 계정 관리 | OAuth/PKCE 흐름, 라운드 로빈 요청 분배 및 계정이 무효화될 경우 자동 페일오버. |
| API 키 관리 | 클라이언트가 인증에 사용하는 키를 생성, 취소 및 볼 수 있는 웹 UI. |
| 프록시 풀 | 상태 확인과 실패 시 쿨다운을 갖춘 HTTP, HTTPS 및 SOCKS5 프록시를 지원합니다. |
| 사용량 통계 | 키별, 계정별, 모델별 사용량을 usage.jsonl에 기록하고 대시보드에 적중률 카운터를 표시합니다. |
| 멀티모달 입력 | 이미지 데이터(base64 데이터 URL 또는 공개 HTTPS URL)를 수락하고 M365의 UploadFile 엔드포인트로 전달한 다음 파일 참조를 채팅 메시지에 주입합니다. |
| 이미지 생성 | OpenAI의 이미지 API를 모방하는 /v1/images/generations을 노출합니다. |
| 웹 관리 콘솔 | 로그인, 계정 인증, 키 관리, 프록시 풀, 대화 보기, 모델 테스트 및 설정을 위한 전체 UI. |
작동 방식 – 고급 아키텍처
OpenAI/Anthropic client ──► HTTP endpoint (/v1/…) ──► M365-Copilot2API (Go)
│
│ internal/chathub
▼
ChatHub WebSocket (private)
│
▼
Microsoft 365 Copilot (cloud)
internal/chathub: 프라이빗 ChatHub 프로토콜에 대한 저수준 WebSocket 핸드셰이크, 하트비트 및 이벤트 스트림 파싱을 처리합니다.internal/web/session_resolver.go: 요청이 바인딩되어야 하는 M365 계정과 클라우드 대화를 결정하여 콘텐츠 키 재사용 로직을 구현합니다.- 계정 로테이션 및 페일오버: 요청이 속도 제한, 인증 오류 또는 기타 업스트림 실패에 도달하면 게이트웨이는 자동으로 다음 정상 계정으로 재시도합니다.
시작하기 (README의 빠른 시작 단계)
- GitHub Releases 페이지에서 OS/아키텍처에 맞는 사전 빌드된 바이너리를 다운로드합니다.
- 실행합니다. 기본적으로
127.0.0.1:4141에서 수신 대기하며 기본 관리자 비밀번호admin123을 사용합니다(첫 로그인 시 변경해야 합니다). - 브라우저에서
http://127.0.0.1:4141을 열고, 로그인한 다음 Accounts 페이지를 사용하여 Microsoft 365 자격 증명으로 OAuth/PKCE 흐름을 시작합니다. - 콜백 URL을 UI에 다시 붙여넣은 후 API Keys 페이지에서 API Key를 생성합니다.
- OpenAI 호환 클라이언트로 게이트웨이를 호출합니다. 예:
curl http://127.0.0.1:4141/v1/chat/completions \ -H "Authorization: Bearer <YOUR_API_KEY>" \ -H "Content-Type: application/json" \ -d '{"model":"gpt-5.6-sol","messages":[{"role":"user","content":"你好"}]}'
구성 하이라이트
모든 설정은 환경 변수입니다(.env.example 제공됨). 중요한 설정은 다음과 같습니다:
M365_LISTEN– 바인딩할 주소/포트.M365_ADMIN_PASSWORD– 관리자 로그인 비밀번호.M365_PROXY_POOL– 쉼표로 구분된 프록시 목록.M365_TOOL_PLANNING_MODE–router(게이트웨이가 도구 라우팅 결정) 또는native(업스트림 Copilot이 처리하게 둠).- 세션 관련 TTL(
M365_SESSION_TTL_MINUTES,M365_CONTEXT_TTL_MINUTES). - 자동 정리 제어(
M365_AUTO_CLEANUP_*).
일반적인 사용 사례
- 개발자: 사용자 지정 클라이언트를 작성하지 않고 기존 OpenAI SDK를 사용하여 Microsoft 365 Copilot을 실험하고자 하는 경우.
- 팀: Copilot을 호출해야 하지만 공급자(OpenAI, Anthropic, M365) 간에 통일된 API 인터페이스를 유지해야 하는 내부 에이전트를 구축하는 경우.
- 파워 유저: 사용량을 모니터링하고, 여러 Microsoft 계정을 로테이션하고, 토큰 소비를 줄이기 위해 대화 컨텍스트를 캐싱하는 로컬 대시보드를 원하는 경우.
제한 사항 및 법적 고지(작성자가 명시한 대로)
- 이 프로젝트는 공식 Microsoft 제품이 아니며 Microsoft, OpenAI 또는 Anthropic과 제휴 관계가 없습니다.
- 타사 계정이나 프록시 풀을 통해 Copilot에 액세스하는 것은 서비스 약관을 위반할 수 있으며, 사용자가 모든 위험을 부담합니다.
- 개인 학습/연구 목적으로만 사용 – 상업적 재판매 또는 대규모 배포는 금지됩니다.
- 계정 정지, 데이터 손실 또는 기타 손해에 대해 책임을 지지 않습니다.
위의 모든 정보는 저장소의 README에서 직접 가져온 것입니다. 추가 기능은 추론되지 않았습니다.
관련
- 프로젝트
- 프로젝트
- 프로젝트
- 프로젝트