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의 빠른 시작 단계)

  1. GitHub Releases 페이지에서 OS/아키텍처에 맞는 사전 빌드된 바이너리를 다운로드합니다.
  2. 실행합니다. 기본적으로 127.0.0.1:4141에서 수신 대기하며 기본 관리자 비밀번호 admin123을 사용합니다(첫 로그인 시 변경해야 합니다).
  3. 브라우저에서 http://127.0.0.1:4141을 열고, 로그인한 다음 Accounts 페이지를 사용하여 Microsoft 365 자격 증명으로 OAuth/PKCE 흐름을 시작합니다.
  4. 콜백 URL을 UI에 다시 붙여넣은 후 API Keys 페이지에서 API Key를 생성합니다.
  5. 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_MODErouter(게이트웨이가 도구 라우팅 결정) 또는 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에서 직접 가져온 것입니다. 추가 기능은 추론되지 않았습니다.

관련

  • 프로젝트
  • 프로젝트
  • 프로젝트
  • 프로젝트