微软M365 Copilot转OpenAI API需付费商业许可
速览
帖子分享了一个Python脚本,可将微软M365 Copilot转为兼容OpenAI API的代理用于调用。但必须拥有付费的Microsoft 365 Copilot商业许可证,否则会报错。脚本使用设备代码流授权,支持流式输出。作者通过咸鱼购买E3账号尝试后确认需付费许可。
AI 深度解读
背景
随着 AI 模型调用成本的上升,许多开发者开始寻找更经济或更灵活的 API 获取方式。本文的作者原本依赖某个 "team 车队"(推测为共享 API 订阅的服务)来免费调用 OpenAI 兼容接口("养虾" 是社区黑话,指维持 API 可用状态),但该车队已失效。作者转而利用自己拥有的 Microsoft 365 Copilot 订阅,尝试将其底层能力通过微软官方提供的 Graph API 转换为标准的 OpenAI API 格式,从而让第三方客户端(如 ChatBox、LobeChat 等)能够直接调用。
微软从 2025 年底开始逐步开放了 Microsoft 365 Copilot Chat API(preview → beta),提供了 REST 端点用于创建对话、发送消息并获取流式响应(SSE)。这为将 M365 Copilot 包装成 OpenAI 兼容代理提供了技术可能。然而,作者在实践中发现,该 API 要求调用者必须拥有 付费的 Microsoft 365 Copilot 商业许可证,普通的 E3/E5 开发者订阅(如 Office 365 E3 Developer)并不具备访问权限。作者最终在闲鱼购买了 E3 管理员账号,折腾成功后分享了这一 Python 脚本。
核心内容
该脚本使用 FastAPI 实现了一个轻量级代理服务器,接收 OpenAI 标准的 /v1/chat/completions 请求,将其转换为 Microsoft Graph 的 Copilot Chat 流式 API 调用,并返回 OpenAI 兼容的 SSE 响应。具体流程如下:
-
配置 Entra ID 应用凭证:需要在 Microsoft Entra ID(原 Azure AD)中注册一个应用程序,获取 TENANT_ID 和 CLIENT_ID,用于设备代码流授权。
-
设备代码流获取用户 Token:脚本启动后,会向微软登录端点发起设备代码请求,生成一个授权码和 URL。用户需要在浏览器中访问该 URL,输入设备代码完成登录。登录成功后,脚本持有用户的 access_token,用于后续所有 Graph API 调用。
-
转换 OpenAI 请求为 Graph 格式:
- 接收 OpenAI 格式的 JSON body,提取最后一条用户消息作为
user_prompt。 - 记录是否为流式请求(
stream参数)。 - 使用 access_token 向
https://graph.microsoft.com/beta/copilot/conversations发送 POST 请求,创建一个新的对话线程,获得conversation_id。 - 向
https://graph.microsoft.com/beta/copilot/conversations/{id}/chatOverStream发送 POST 请求(SSE 流式端点),附带message.text(用户提问)和时区信息。
- 接收 OpenAI 格式的 JSON body,提取最后一条用户消息作为
-
处理流式响应:脚本通过
requests的流式迭代逐行读取微软返回的 SSE 数据,直接转发给客户端。如果遇到 HTTP 错误(如创建对话失败或 API 调用报错),脚本会生成一个虚拟的 OpenAI 格式错误流,防止第三方客户端崩溃。 -
CORS 支持:添加了 FastAPI 的 CORS 中间件,允许任意来源跨域调用,方便集成到 Web 应用或桌面客户端。
脚本使用前提:
- 微软工作或学校账号,且必须拥有付费的 Microsoft 365 Copilot 商业许可证。
- 需要在 Entra ID 中注册应用并配置重定向(但设备代码流无需重定向 URL)。
- 如果网络连接微软服务器不稳定,可配置本地代理(如
127.0.0.1:7890)。
错误处理:当用户没有有效许可证时,微软 API 会返回类似 You don't have a valid license 的 403 错误,脚本会在首次创建对话时捕获并输出到终端,同时返回错误流。
关键要点
- 许可证是硬门槛:只有付费的 Microsoft 365 Copilot 商业许可证(如 M365 Copilot 独立版、Teams Premium 附带版等)才能调通 API。免费或开发者订阅(E5 白嫖号、个人版 Office)均会返回
You don't have a valid license错误。 - 需要 Entra ID 应用注册:用户必须拥有 Azure 管理权限才能在 Entra ID 中创建应用并获取 TENANT_ID 和 CLIENT_ID。这是设备代码流认证的前提。
- 设备代码流验证方式:脚本每次启动都会要求用户在浏览器中手动授权,Token 保存在内存变量中,重启后需重新登录(可进一步改造成持久化刷新)。
- 对话创建独立于每次请求:每次
/v1/chat/completions调用都会新建一个 Copilot 对话,不会保留上下文。如需多轮对话,需自行在客户端侧管理历史(但原文脚本未实现多轮上下文传递)。 - 代理仅支持单次提问:只提取
messages数组中最后一条用户消息作为输入,忽略系统消息和历史消息。因此该代理适用于简单的单轮问答或工具调用场景,不适合复杂的多轮对话。 - 时区参数:微软 API 要求提供
locationHint.timeZone,脚本预设为"Asia/Shanghai",可根据需要修改。 - 流式与非流式均可:脚本根据
stream字段决定返回格式,非流式请求同样走chatOverStream端点,然后缓冲全部内容再以 JSON 形式返回(但原文代码仅展示了流式处理分支,非流式需额外实现)。
意义与影响
- 降低 API 使用成本:对于已经拥有 M365 Copilot 商业许可证的用户或企业,该脚本提供了一种复用现有订阅、调用 OpenAI 兼容接口的方法。相比直接购买 OpenAI API 的按量付费,订阅制可能更具性价比(尤其对于重度用户)。
- 拓宽 AI 客户端生态:许多本地 AI 客户端(如 ChatBox、NextChat、LobeChat、Open WebUI)原生支持 OpenAI API。通过此脚本,用户可以将微软 Copilot 能力无缝接入这些工具,无需二次开发。
- 技术验证与启发:本文展示了如何利用微软开放的新版 Graph Copilot API 进行二次封装,为其他微软生态的开发者提供了参考——未来可能有更多类似服务(如 Azure OpenAI 与 M365 Copilot 的互通方案)。
- 许可证合规风险提示:脚本虽然仅用于个人或企业内部使用,但用户需注意微软服务条款:将 M365 Copilot 作为 API 代理调用,可能违反商业许可协议(仅限订阅者自身使用,不能对外公开或量化转售)。特别是通过设备代码流自动登录,Token 的使用范围需谨慎。
- 对开发者社区的贡献:作者在 Linux Do 论坛公开了完整代码,降低了同类需求的门槛。社区可以基于此改进多轮对话、刷新 Token、支持更多 OpenAI 参数(如 temperature、top_p 等),甚至加入负载均衡和监控。
