一个面向服务器部署的非官方兼容网关,把 Microsoft 365 Copilot ChatHub 适配为常见的 OpenAI/Anthropic 风格 HTTP 接口。项目重点处理长流式响应、工具调用、跨轮上下文、严格账号顺序切换和生产安全边界。
服务器版本:Server Final7 发布基线:2026-08-23 许可证:GNU AGPL-3.0-only
本仓库是从经过生产验证的服务器版本拆出的脱敏公开版,不包含任何真实账号、令牌、API Key、代理、域名、IP、证书、日志或生产数据。
POST /v1/chat/completions,支持流式和非流式 Chat Completions。POST /v1/responses,支持 Responses 事件流、previous_response_id与跨轮工具结果。POST /v1/messages,提供 Anthropic Messages 兼容入口。POST /v1/images/generations,提供图片生成兼容入口。- OpenAI 风格模型目录与模型详情。
- 多模态输入、结构化函数工具、工具进度、输出上限和长响应自动续写。
- 单活账号、严格顺序故障转移;不会随机扫号。
- WebSocket 断流后,在安全条件下执行同账号、同会话的一次续流。
- 管理后台、API Key 哈希存储、登录限速、代理安全校验和调试日志脱敏。
- 非 root 容器、只读根文件系统、全部 Linux capabilities 丢弃。
/v1/realtime当前返回501 Not Implemented。本版本不提供实时语音 WebSocket,避免把文本流错误地伪装成语音能力。- 这是社区项目,不是 Microsoft、OpenAI 或 Anthropic 官方产品。
- 使用者必须自行确认其账号、订阅、地区、自动化方式和部署场景符合相关服务条款与当地法律。
要求:Docker Engine 与 Docker Compose v2。
mkdir -p secrets
openssl rand -base64 32 > secrets/m365_admin_password
chmod 600 secrets/m365_admin_password
cp .env.example .env
docker compose up -d --build默认只监听宿主机 127.0.0.1:4141,避免管理接口直接暴露到公网。生产环境应通过 HTTPS 反向代理访问;示例位于 ops/nginx/。
首次启动后:
- 通过管理后台登录。
- 添加并授权 Microsoft 365 账号。
- 在“访问配置”中创建 API Key。
- 把客户端 Base URL 配置为
https://你的域名/v1。
本地 HTTP 调试时可以在 .env 中临时设置 M365_COOKIE_SECURE=false;公网部署必须恢复为 true。
curl https://m365.example.com/v1/chat/completions \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"model": "gpt-5.6-sol",
"messages": [{"role": "user", "content": "你好"}],
"stream": true
}'Responses API:
curl https://m365.example.com/v1/responses \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"model": "gpt-5.6-sol",
"input": "请给出一个简短的健康检查方案",
"stream": true
}'- 任意时刻只有一个活动账号。
- 未使用账号不参与后台对话或并行探测。
- 发生可切换错误时严格按管理后台顺序推进到直接后继账号。
- 首个可见输出之前,一次请求最多尝试当前账号及其直接后继。
- 输出已经可见后不跨账号从头重放,防止重复文本和重复工具副作用。
- 文本流在具备上游会话状态时,可以在同账号、同会话内续流一次。
- 配额、鉴权、代理、HTTP、WebSocket 和客户端取消分别分类处理,不共享一个笼统冷却状态。
运行状态默认写入 Docker 命名卷 m365-copilot-openai-bridge-data,避免 Linux 新建 bind mount 目录时出现 root 权限问题。一次性 secret-init 服务会读取宿主机权限为 0600 的 ./secrets/m365_admin_password,复制到独立命名卷并设置为容器用户 UID 100、权限 0400;主服务不会以 root 身份读取 secret。secrets/ 被 .gitignore 和 .dockerignore 排除。
备份运行状态:
docker run --rm \
-v m365-copilot-openai-bridge-data:/data:ro \
-v "$PWD":/backup \
alpine:3.24 tar -C /data -czf /backup/m365-data-backup.tar.gz .该备份包含账号令牌和 API Key 哈希,必须作为敏感文件离线保存,绝不能提交到仓库。
不要提交以下文件:
token-cache.jsonapi-keys.jsonsessions.jsonadmin-password.hashdebug-logs.jsonl- 任何
.env、证书、私钥、代理凭据或抓包
go test ./...
go vet ./...
go test -race ./internal/web ./internal/chathub ./internal/proxy
docker build -t m365-copilot-openai-bridge:server-final7 .ops/ 还包含协议矩阵、Hermes/OpenCode 兼容测试、API Key 稳定性测试和 30 分钟混合压力测试。测试真实模型时请保持低频,避免测试本身制造账号风控。
生产部署前请阅读 SECURITY.md。默认配置要求显式管理员密码、拒绝不安全默认密码,并把服务绑定到 loopback。不要把管理界面直接暴露到公网 IP。
请阅读 CONTRIBUTING.md。提交 bug 时必须删除账号、令牌、邮件、代理、域名、IP 和完整请求内容。
本项目按现状提供,不保证第三方上游协议长期稳定。Microsoft、Microsoft 365、Copilot、OpenAI、Anthropic 及相关名称可能是其各自所有者的商标。本项目与这些公司没有隶属、授权或背书关系。