Skip to content

Latest commit

 

History

9 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AugLoop Copilot Proxy

将 Microsoft 365 Excel Copilot 的 AugLoop AI 后端转换为 OpenAI 兼容 API 的反向代理服务器。

目录


功能概述

本项目是一个 独立的反向代理服务器,通过拦截 Microsoft Excel Copilot 的 AugLoop WebSocket 协议,将其转换为 OpenAI 兼容的 API 接口

核心能力

能力 说明
OpenAI 兼容 API POST /v1/chat/completions — 任何支持 OpenAI API 的客户端都可以直接对接
流式响应 支持 SSE 流式输出 (stream: true)
Function Calling 内置 8 种工具 (read_file, write_file, run_shell, run_python, http_get 等)
对话管理 SQLite 存储对话历史,支持多会话
Token 自动获取 5 种策略自动获取和刷新 Token,无需手动抓包
Copilot UI 可禁用 通过注册表禁用 Copilot UI 后仍可正常反代
提前刷新 过期前 10 分钟自动刷新 Token,确保不中断

用户准备清单

在开始使用前,请确认你已准备好以下所有条件:

必须准备

  • Windows 10/11 电脑(不支持 Linux/macOS,内存扫描依赖 Windows API)
  • Python 3.10+(推荐 3.12)— 下载地址
  • Microsoft Excel(已安装并能正常启动)
  • Microsoft 365 账号(需要有 Copilot 权限,ConsumerPro 或企业版均可)
  • Excel 中已登录 Microsoft 365 账号
  • 网络可访问 augloop.svc.cloud.microsoft(中国大陆网络通常可直连)
  • 至少在 Excel 中打开过一次 Copilot(以在内存中初始化 AugLoop Token)

不需要准备

  • ❌ 不需要 Frida(纯 Python ctypes 内存扫描)
  • ❌ 不需要抓包工具(内置自动 Token 获取)
  • ❌ 不需要 MITM 代理证书
  • ❌ 不需要管理员权限(普通用户即可)
  • ❌ 不需要 Copilot UI 可见(可通过注册表禁用)

前提条件

条件 必须 说明
Windows 10/11 内存扫描使用 Windows API (ctypes + OpenProcess/ReadProcessMemory)
Python 3.10+ 推荐 3.12,需要 pip 可用
Microsoft Excel 必须安装并运行(JWE Token 从 Excel 进程内存获取)
Microsoft 365 账号 需要有 Copilot 权限(ConsumerPro 或企业版)
Excel 登录状态 Excel 中需登录 Microsoft 365 账号
首次 Copilot 触发 Excel 需要至少打开过一次 Copilot 面板,以在内存中生成 Token
网络访问 需能访问 augloop.svc.cloud.microsoft(WebSocket 直连)

为什么必须运行 Excel?

系统需要两种 Token:

① JWT anonymousToken (auth_token)
   用途: Phase 2 WebSocket 会话认证
   有效期: 24 小时
   获取方式: WebSocket Phase 1 自动返回
   ← 不需要 Excel! 只需连接 augloop.svc.cloud.microsoft

② JWE Bearer Token (bearer_token)
   用途: Licensing Check + TokenProvision
   有效期: 服务端实际仅 ~4 分钟(客户端缓存 150 秒)
   获取方式: 扫描 Excel 进程内存 (ctypes ReadProcessMemory)
   ← 必须运行 Excel!
   还需要两个不同的 JWE Token (Token A + Token B)

如果 Excel 未运行:

  • 步骤 ① 仍可通过 WebSocket Phase 1 获取 JWT
  • 步骤 ② 无法获取 JWE Token → Licensing Check 失效 → 服务器静默忽略聊天请求

限制说明

技术限制

限制 详情
JWE Token 有效期极短 服务端实际仅约 4 分钟有效,系统每 2 分钟检查一次,过期前 10 分钟主动刷新
需要两个 JWE Token Licensing Check 需要两个不同的 JWE Token(Token A 主身份 + Token B 第二身份)
Excel 进程必须存活 每次 WebSocket 连接前都会调用 _refresh_jwe_token_from_memory(),扫描 Excel 进程内存
仅支持 Windows 内存扫描依赖 Windows API,不支持 Linux/macOS
Token 来源依赖 Excel 内存 如果 Excel 崩溃或被关闭,JWE Token 无法刷新,反代将失效
系统提示词在云端 AI 的系统提示词由 Microsoft 云端服务注入,不在本地存储,无法修改

合规与安全

  • 本项目仅供授权研究和个人学习使用
  • 使用本工具需要有效的 Microsoft 365 Copilot 许可
  • 请勿用于绕过 Microsoft 的使用条款或服务限制
  • Token 中包含个人身份信息(用户 ID、组织 ID 等),请妥善保管
  • .augloop_tokenconfig.yamlconversations.db 已被 .gitignore 排除,不会被上传

快速开始

1. 克隆仓库

git clone https://github.com/your-username/augloop-copilot-proxy.git
cd augloop-copilot-proxy

2. 创建配置文件

# 从模板复制配置文件
cp config.example.yaml config.yaml

# config.yaml 中的大部分字段会在首次运行时自动填充
# 你通常不需要手动修改任何内容

3. 安装依赖

pip install -r requirements.txt

4. 启动

方式一:一键启动(推荐)

:: Windows 批处理(自动管理 Excel + Token + 服务器)
start.bat

start.bat 会自动完成:

  1. 清理 8080 端口的旧进程
  2. 检查 Python 和依赖
  3. 启动 Excel(后台隐藏模式)
  4. 自动触发 Copilot 初始化 Token
  5. 启动反代服务器

方式二:手动启动

# 含 Excel 后台 Token 收割
python run.py --auto-init

# 或直接启动服务器(Excel 已在运行且已有 Token)
python server.py

方式三:禁用 Copilot UI 后启动

# 1. 通过注册表禁用 Copilot UI(可选,不影响反代)
reg add "HKCU\Software\Microsoft\Office\16.0\Common\Copilot" /v "CopilotDisabled" /t REG_DWORD /d 1 /f

# 2. 启动
python run.py --auto-init

启动参数

python run.py [选项]

选项:
  --mode {hide,minimize,offscreen}   Excel 隐藏模式 (默认 hide)
  --interval FLOAT                    强制刷新间隔秒数 (默认 3000 = 50 分钟)
  --no-wait                          跳过等待用户, 直接隐藏 Excel
  --auto-init                        自动打开 Copilot 并发消息初始化
  --no-validate                      跳过 Token 验证
  --port INT                          服务器端口 (默认 8080)
  --host STR                          绑定地址 (默认 127.0.0.1)

配置说明

配置文件:config.yaml(首次运行从 config.example.yaml 复制)

server:
  host: 127.0.0.1        # 服务器绑定地址
  port: 8080              # 服务器端口
  api_key: ''             # API 密钥(留空表示不需要认证)

augloop:
  base_url: https://augloop.svc.cloud.microsoft
  workflow: OfficeCopilotOrchestrationWorkflow
  bearer_token: ''        # JWE Token (自动填充)
  auth_token: ''         # JWT Token (自动填充)
  copilot_license_type: ConsumerPro
  strip_prompts: true     # 去除系统提示词中的 Copilot 包装

token_manager:
  auto_refresh: true
  refresh_interval: 120            # 检查间隔(秒)
  preemptive_refresh_threshold: 600 # 提前刷新阈值(秒)
  strategies:                      # Token 获取策略优先级
  - auto     # 内存扫描 (需要 Excel, 推荐)
  - wam      # MSAL.NET broker
  - har      # HAR 文件提取
  - mitm     # .augloop_token 文件
  - frida    # Frida 内存扫描

tools:
  enabled: true
  max_iterations: 5
  builtin_tools:
  - get_current_time
  - http_get
  - read_file
  - write_file
  - list_directory
  - run_python
  - run_shell
  - json_parse

支持的模型

模型列表

代理通过 AugLoop WebSocket 协议将请求转发给 Microsoft 云端,实际使用的 AI 模型由 服务端 flights 配置决定。代理会透传客户端请求中的 model 字段,但最终是否使用该模型取决于服务端。

已知支持的模型

模型 厂商 model 参数 说明
GPT-5.5 OpenAI gpt-5.5 OpenAI 最新 GPT 系列
GPT-5.6 OpenAI gpt-5.6 OpenAI 最新 GPT 系列
Claude Opus 4.8 Anthropic claude-opus-4.8 代理默认模型(代码内置),Anthropic Claude Opus 系列
Claude Opus 5 Anthropic claude-opus-5 Anthropic 最新 Opus 系列
Claude Sonnet 5 Anthropic claude-sonnet-5 Anthropic Claude Sonnet 系列

Flights 配置中的模型 Slot

以下信息从 flights.txt 中提取,反映了 Microsoft 后端的模型路由配置:

Claude 系列:

Slot Model ID 说明
Claude Slot 1 137 EAELlmClaudeSlot1ModelId
Claude Slot 2 147 EAELlmClaudeSlot2ModelId(Opus 4.8)
Claude Slot 5 156 EAELlmClaudeSlot5ModelId

GPT 系列:

Slot Model ID 说明
GPT-5 Slot 1 135 EAELlmGpt5Slot1ModelId
GPT-5 Slot 2 148 EAELlmGpt5Slot2ModelId
EU 默认 135 EAELlmEUModelId

Agent Mode 变体

变体 说明
ClaudeAgentVariant Claude 通用变体
ClaudeOpus46AgentVariant Claude Opus 4.6 变体
ClaudeSlot1AgentVariant Claude Slot 1 变体
ClaudeSlot2AgentVariant Claude Slot 2 变体
Gpt5AgentVariant GPT-5 通用变体
Gpt54AgentVariant GPT-5.4 变体
Gpt5Slot1AgentVariant GPT-5 Slot 1 变体

模型选择机制

客户端请求 (model: "claude-opus-5")
    │
    ▼
代理透传 model 字段到 AugLoop ChatSignal
    │
    ▼
AugLoop 服务端根据 flights 配置路由到对应模型
    │
    ├─ model 匹配 → 使用指定模型
    └─ model 不匹配 → 回退到默认模型 (GPT-5, ModelId:135)

注意:代理无法控制最终使用哪个模型。model 参数仅作为提示传递给 AugLoop 服务端,实际模型由 Microsoft 云端根据 flights 配置和负载情况决定。代理默认使用 claude-opus-4.8(代码内置)。

使用示例

import openai

client = openai.OpenAI(base_url="http://127.0.0.1:8080/v1", api_key="any")

# 使用默认模型 (claude-opus-4.8)
response = client.chat.completions.create(
    model="copilot",
    messages=[{"role": "user", "content": "你好"}],
)

# 指定模型
response = client.chat.completions.create(
    model="claude-opus-5",
    messages=[{"role": "user", "content": "你好"}],
)

模型可用性查询

# 查看当前服务端返回的模型列表
curl http://127.0.0.1:8080/v1/models

# 查看代理状态 (含当前模型)
curl http://127.0.0.1:8080/status

API 端点

聊天 API(OpenAI 兼容)

# 发送聊天请求
curl -X POST http://127.0.0.1:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "copilot",
    "messages": [{"role": "user", "content": "你好"}],
    "stream": false
  }'
# 流式请求
curl -X POST http://127.0.0.1:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "copilot",
    "messages": [{"role": "user", "content": "1+1=?"}],
    "stream": true
  }'

Python 调用示例

import openai

client = openai.OpenAI(
    base_url="http://127.0.0.1:8080/v1",
    api_key="any-string"  # config.yaml 中 api_key 为空时任意值即可
)

response = client.chat.completions.create(
    model="copilot",
    messages=[{"role": "user", "content": "用 Python 写一个快速排序"}],
)

print(response.choices[0].message.content)

管理端点

端点 方法 说明
GET /status GET 代理状态 & Token 有效性
GET /token/status GET Token 管理器详细状态
POST /token/auto POST 🔑 全自动获取双 Token
POST /token/refresh POST 强制刷新 Token
POST /token/manual POST 手动设置 Token
GET /v1/models GET 模型列表
GET /v1/tools GET 列出可用工具
GET /v1/conversations GET 列出所有对话
POST /v1/conversations POST 创建新对话
GET / GET 桌面端 Web UI

Token 管理机制

两种 Token

Token 用途 有效期 获取方式
JWE Bearer Token Licensing Check ~4 分钟(服务端) Excel 内存扫描
JWT anonymousToken WebSocket 认证 24 小时 WebSocket Phase 1

自动刷新链路

每 2 分钟检查 (refresh_interval=120)
    │
    ▼
  Token 剩余时间 < 10 分钟? (preemptive_refresh_threshold=600)
    │ Yes
    ▼
  get_token(force_refresh=True) 按优先级尝试:
    │
    ├─ ① auto: ctypes 内存扫描 Excel 进程 → JWE Token
    ├─ ② mitm: 读取 .augloop_token 文件
    ├─ ③ frida: Frida 内存扫描
    ├─ ④ wam: MSAL.NET broker 静默获取
    ├─ ⑤ har: 从 HAR 文件提取
    │
    └─ 全部失败? → HTTP POST /token/auto (WebSocket Phase 1 保底)
         → 自动获取 anonymousToken (JWT, 24h) + 可能获取 JWE

每 50 分钟强制刷新一次 (run.py bg_scan_loop):
    │
    ├─ 触发 Excel Copilot 刷新 (Alt+Y + 发消息)
    ├─ 扫描 Excel 内存 → 找到新 Token
    ├─ 验证 Token 有效性 (Workflow API)
    └─ 保存有效 Token 到 .augloop_token + config.yaml

架构原理

┌─────────────────────────────────────────────────────────────┐
│                    你的应用程序 / 客户端                      │
│              (OpenAI API 兼容, 任何 SDK 都可对接)              │
└────────────────────────┬────────────────────────────────────┘
                         │ HTTP POST /v1/chat/completions
                         ▼
┌─────────────────────────────────────────────────────────────┐
│                  本反代服务器 (server.py)                     │
│                    127.0.0.1:8080                            │
│                                                             │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────────┐   │
│  │ FastAPI 路由  │  │ ToolRegistry │  │ ConversationStore│   │
│  │ (OpenAI 兼容) │  │ (8 种工具)    │  │ (SQLite 对话存储) │   │
│  └──────┬───────┘  └──────────────┘  └──────────────────┘   │
│         │                                                   │
│  ┌──────▼───────────────────────────────────────────────┐  │
│  │              AugLoopWSClient (WebSocket)              │  │
│  │                                                       │  │
│  │  Phase 1: 连接 wss://augloop.svc.cloud.microsoft/    │  │
│  │    → 获取 anonymousToken (JWT, 24h) + sliceUrl       │  │
│  │                                                       │  │
│  │  Phase 2: 连接 sliceUrl                               │  │
│  │    → 26 个 AnnotationActivation                       │  │
│  │    → Licensing Check (JWE Token A + B)               │  │
│  │    → TokenProvision (JWE Token)                      │  │
│  │    → CheckPermissionSignal                           │  │
│  │    → 发送聊天请求 → 接收流式 AI 响应                   │  │
│  └───────────────────────────────────────────────────────┘  │
│                                                             │
│  ┌───────────────────────────────────────────────────────┐  │
│  │              TokenManager (自动刷新)                    │  │
│  │  每 2 分钟检查, 过期前 10 分钟主动刷新                   │  │
│  │  策略: auto → mitm → frida → wam → har → HTTP fallback │  │
│  └───────────────────────────────────────────────────────┘  │
│                                                             │
│  ┌───────────────────────────────────────────────────────┐  │
│  │           memory_token_scanner (ctypes)               │  │
│  │  OpenProcess → VirtualQueryEx → ReadProcessMemory    │  │
│  │  扫描 EXCEL.EXE 内存中的 JWE/JWT Token                │  │
│  └───────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────┘
          │                                    │
          │ WebSocket                           │ ctypes
          │                                     │
          ▼                                     ▼
┌──────────────────────────┐     ┌─────────────────────────┐
│  Microsoft AugLoop 云端    │     │   Excel 进程 (EXCEL.EXE)  │
│  augloop.svc.cloud.        │     │                         │
│  microsoft                 │     │  内存中的 JWE Token:     │
│                            │     │  eyJhbGciOiJkaXIi...    │
│  → 注入系统提示词            │     │  (有效期 ~4 分钟)        │
│  → 调用 LLM (GPT-5/Claude)  │     │                         │
│  → 返回流式响应              │     │                         │
└──────────────────────────┘     └─────────────────────────┘

故障排查

常见问题

问题 原因 解决方案
"Token 为空且无法从内存刷新" Excel 未运行或未打开过 Copilot 启动 Excel,打开 Copilot 面板,发送一条消息
"TokenProvision 失败 (JWE Token 已过期)" JWE Token 已过期(>4 分钟) 调用 POST /token/auto 刷新,或在 Excel Copilot 中发一条消息
服务器返回 SyncResponse 但不处理聊天 Licensing Check 未通过 确认 Excel 运行中,调用 POST /token/auto
"未收到 UserAllowedAnnotation" 权限验证未通过 检查 JWE Token 是否有效,确认 Microsoft 365 账号有 Copilot 权限
端口 8080 被占用 旧进程未关闭 start.bat 会自动清理,或手动 taskkill /F /PID <pid>
WebSocket 连接失败 网络问题或 AugLoop 服务不可用 检查网络,确认能访问 augloop.svc.cloud.microsoft
内存扫描找不到 Token Excel 进程中无 AugLoop Token 确认 Excel 已登录 Microsoft 365 账号,且打开过 Copilot
所有 JWE Token 已过期 Excel 的 AugLoop Token 超过 4 分钟未刷新 系统会自动触发 Excel 刷新,等待 50 分钟强制刷新周期

调试命令

# 查看 Token 状态
curl http://127.0.0.1:8080/token/status

# 查看代理状态
curl http://127.0.0.1:8080/status

# 全自动获取 Token
curl -X POST http://127.0.0.1:8080/token/auto

# 手动设置 Token
curl -X POST http://127.0.0.1:8080/token/manual \
  -H "Content-Type: application/json" \
  -d '{"token": "eyJhbGci..."}'

# 测试聊天
curl -X POST http://127.0.0.1:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"copilot","messages":[{"role":"user","content":"hello"}]}'

集成示例

Node.js

import OpenAI from 'openai';

const client = new OpenAI({
  baseURL: 'http://127.0.0.1:8080/v1',
  apiKey: 'any-string',
});

const response = await client.chat.completions.create({
  model: 'copilot',
  messages: [{ role: 'user', content: '用 JavaScript 写一个 debounce 函数' }],
});

console.log(response.choices[0].message.content);

LangChain (Python)

from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage

llm = ChatOpenAI(
    base_url="http://127.0.0.1:8080/v1/v1",
    api_key="any-string",
    model="copilot",
)

response = llm.invoke([HumanMessage(content="解释什么是闭包")])
print(response.content)

cURL (流式)

curl -N http://127.0.0.1:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"copilot","messages":[{"role":"user","content":"讲个笑话"}],"stream":true}'

使用 Function Calling

import openai

client = openai.OpenAI(base_url="http://127.0.0.1:8080/v1", api_key="any")

response = client.chat.completions.create(
    model="copilot",
    messages=[{"role": "user", "content": "当前时间是多少?"}],
    tools=[{
        "type": "function",
        "function": {
            "name": "get_current_time",
            "description": "获取当前系统时间",
            "parameters": {"type": "object", "properties": {}}
        }
    }],
)

print(response.choices[0].message.content)
# AI 会调用 get_current_time 工具并返回实际时间

对接 Web UI (浏览器)

直接访问 http://127.0.0.1:8080/ 即可使用内置的 Web UI 进行对话,无需任何客户端。


自定义工具开发

你可以通过 ToolRegistry 注册自定义工具,扩展 AI 的能力:

from tool_registry import ToolRegistry

registry = ToolRegistry()

# 注册自定义工具
registry.register(
    name="weather",
    description="查询指定城市的天气",
    parameters={
        "type": "object",
        "properties": {
            "city": {"type": "string", "description": "城市名"}
        },
        "required": ["city"]
    },
    handler=lambda city: f"{city} 今天晴, 25°C"
)

工具运行在代理服务器上,不是 Excel 内。可用工具列表通过 GET /v1/tools 查看。


安全建议

本机使用(默认)

默认配置 host: 127.0.0.1 只允许本机访问,无需额外安全措施。

局域网/远程使用(不推荐)

如果必须暴露到网络:

  1. 设置 API Keyconfig.yamlapi_key: "your-secret-key"
  2. 使用反向代理:通过 Nginx 添加 TLS 和速率限制
  3. 绑定内网 IPhost: 192.168.x.x 而非 0.0.0.0
  4. 防火墙:仅允许信任 IP 访问 8080 端口

Token 安全

  • Token 中包含个人身份信息,请勿公开分享
  • .augloop_tokenconfig.yaml 已被 .gitignore 排除
  • 日志文件可能包含 Token 片段,请勿公开日志
  • 如果 Token 泄露,在 Excel 中关闭并重新打开 Copilot 会生成新 Token

FAQ

Q: 没有 Microsoft 365 Copilot 订阅可以用吗?

A: 不行。系统需要有效的 Copilot 许可证 (ConsumerPro 或企业版),Licensing Check 会验证 Token 中的许可证信息。

Q: 禁用 Copilot UI 后还能用吗?

A: 可以。通过注册表 CopilotDisabled=1 禁用 Copilot UI 后,AugLoop 运行时仍在 Excel 进程内存中,反代正常工作。

Q: 如何重新启用 Copilot UI?

A: 删除注册表项或设为 0:

reg add "HKCU\Software\Microsoft\Office\16.0\Common\Copilot" /v "CopilotDisabled" /t REG_DWORD /d 0 /f

Q: Excel 闪退了怎么办?

A: 重新启动 Excel,打开任意工作簿,打开 Copilot 面板发送一条消息,然后调用 POST /token/auto 获取新 Token。

Q: 可以同时开多个 Excel 实例吗?

A: run.py 会通过 COM Dispatch 启动自己的 Excel 实例,只管理该实例。你已打开的其他 Excel 不受影响。

Q: 反代会影响 Excel 的正常使用吗?

A: 不会。反代通过独立的 WebSocket 连接 AugLoop,不干扰 Excel 的正常运行。50 分钟强制刷新时会短暂触发 Copilot(后台自动完成)。

Q: 为什么 AI 总说自己是"Excel 助手"?

A: 系统提示词由 Microsoft 云端注入,代理无法修改。prompt_stripper.py 可以删除请求中的部分提示词,但云端注入的系统人格无法改变。2026-08-03 已实测证实(见 TEST_REPORT_2026-08-03.md):即使在 WebSocket 帧层做 MITM 改写(注入 system 消息 + systemPrompt 字段 + 前置指令到 query),模型也会看到注入内容并明确拒绝,维持 Excel 人格——服务端系统提示词优先级高于客户端一切字段。

Q: 支持流式输出吗?

A: 支持。设置 "stream": true 即可使用 SSE 流式输出。

Q: 对话历史会丢失吗?

A: 不会。对话历史存储在 conversations.db (SQLite) 中,重启后可通过 GET /v1/conversations 恢复。但 AugLoop WebSocket 会话每次重启会重建。


文件结构

copilot_proxy/
├── README.md                   ← 本文件
├── LICENSE                     ← MIT 开源协议
├── .gitignore                  ← Git 忽略规则 (排除敏感文件)
├── config.example.yaml         ← 配置模板 (脱敏, 请复制为 config.yaml)
├── config.yaml                 ← 实际配置 (.gitignore 排除, 自动生成)
├── requirements.txt            ← Python 依赖
├── start.bat                   ← Windows 一键启动脚本
├── run.py                      ← 一键启动 (Excel 后台 + 50分钟强制刷新)
├── server.py                   ← FastAPI 主服务器 (OpenAI 兼容 API)
│
├── augloop_ws_client.py        ← AugLoop WebSocket 客户端 (核心协议)
├── augloop_client.py           ← AugLoop HTTP API 客户端
├── token_manager.py            ← 统一 Token 管理 (5种策略 + 提前刷新 + HTTP回退)
├── memory_token_scanner.py     ← 纯 Python 内存扫描 (ctypes, 不依赖 Frida)
├── excel_background_runner.py  ← Excel 后台运行管理 (不保存过期Token)
├── excel_trigger.py            ← Excel Copilot 自动触发
│
├── prompt_stripper.py          ← 系统提示词剥离器
├── tool_registry.py            ← 工具注册表 (8种内置工具)
├── tool_call_parser.py         ← Function Calling 解析器
├── conversation_store.py       ← 对话存储 (SQLite)
├── desktop_ui.py               ← Web UI HTML
│
├── flights.txt                 ← Feature Gate 配置 (从抓包提取)
├── .augloop_token               ← 缓存 JWE Token (.gitignore 排除, 自动生成)
├── conversations.db             ← 对话数据库 (.gitignore 排除, 自动生成)
└── conversations.db-wal       ← SQLite WAL (.gitignore 排除, 自动生成)

敏感文件保护

以下文件已被 .gitignore 排除,不会上传到 GitHub

文件 原因
config.yaml 含实际 Token 和会话 ID
.augloop_token 含实际 JWE Token
conversations.db 含聊天历史
*.log 日志可能含 Token 信息

上传前请确认 config.yaml 不在 Git 跟踪范围内。仓库中只包含 config.example.yaml 模板。


开源协议

本项目基于 MIT License 开源。

使用声明

  • 本项目仅供授权研究和个人学习使用
  • 使用本工具需要有效的 Microsoft 365 Copilot 许可
  • 请勿用于绕过 Microsoft 的使用条款或服务限制
  • 作者不对本工具的滥用行为承担责任
  • Token 和对话数据中可能包含个人身份信息,请妥善保管

贡献

欢迎提交 Issue 和 Pull Request。


不支持的功能清单

以下是本项目明确不支持的功能,请在使用前了解。

平台限制

不支持 原因
❌ Linux / macOS 内存扫描使用 Windows API (ctypes + OpenProcess/ReadProcessMemory),无法跨平台
❌ 无头模式 (Headless) Excel 必须以 GUI 进程运行,COM Dispatch 需要桌面会话
❌ Docker 容器 Windows 容器不支持 COM 自动化 + 进程内存扫描
❌ 远程 Excel 内存扫描只能读本机进程,不支持扫描远程机器的 Excel

其他 Office 应用

不支持 说明
❌ PowerPoint Copilot 不同的 sdxs 插件和 workflow,本代理只支持 Excel 的 OfficeCopilotOrchestrationWorkflow
❌ Word Copilot 不同的 Host 类型 (Document vs Workbook)
❌ OneNote Copilot 不同的 Host 类型 (Notebook)
❌ Outlook Copilot 不同的后端服务和认证体系
❌ Teams Copilot 不走 augloop.svc.cloud.microsoft

Excel Copilot 高级功能

不支持 说明
❌ 公式自动补全 独立的 CopilotFormulaCompletion 信号类型,不是聊天请求
❌ 表格智能分析 (Table Lint) 独立的 TableLint workflow
❌ 文档上下文 (单元格/区域读取) 代理不发送 Excel 文档数据给 AI,AI 不知道你的工作簿内容
❌ Excel 内 Python 执行 Excel 的 Python 沙箱,与代理的 run_python 工具完全不同
❌ 图表创建/修改 需要 Copilot 的 ExcelAgent 技能和文档上下文
❌ 数据透视表建议 需要 Copilot 的 Agent 技能
❌ 条件格式建议 Excel Copilot 特有功能,不在聊天 workflow 中
❌ 公式转换 独立 workflow
❌ 文本分析/标记/分类 独立 annotation 类型

AI 模型与参数控制

不支持 说明
❌ 选择 AI 模型 模型由服务端根据 flights 决定(GPT-5 / Claude Opus 等),代理无法控制
❌ 设置 temperature AugLoop 协议不暴露此参数
❌ 设置 max_tokens 同上
❌ 设置 top_p / frequency_penalty 同上
❌ 自定义系统提示词 系统提示词由 Microsoft 云端注入,prompt_stripper.py 只能删除请求中的提示词,不能添加自定义
❌ 自定义 AI 人格 AI 始终认为自己是"Excel 助手",无法改变

企业级功能

不支持 说明
❌ 企业搜索 (Enterprise Search) 需要 SharePoint 连接器 + 企业租户,代理已禁用此功能
❌ Power BI MCP 查询 需要 Power BI 租户
❌ Fabric MCP 需要 Microsoft Fabric 租户
❌ 联合连接器 (Federated Connectors) 需要企业配置
❌ 敏感度标签 (Sensitivity Labels) 需要 Microsoft Purview
❌ DLP 策略检查 需要 Microsoft 365 企业版

多用户与并发

不支持 说明
❌ 多用户 单 Excel 实例 = 单 Token 集 = 单用户,无法支持多租户
❌ 并发请求 WebSocket 是单连接,不支持同时多个聊天请求
❌ 水平扩展 不能添加更多 Excel 实例(内存扫描绑定到特定 PID)
❌ 会话持久化 重启后 AugLoop WebSocket 会话丢失(对话历史在 SQLite 中保留)

内容与媒体

不支持 说明
❌ 图片生成 DALL-E/图片生成是 PowerPoint 专用功能
❌ 多模态输入 代理只发送文本,不支持图片/文件上传
❌ 文件上传到 Copilot Graph API copilotuploads 未完全实现
❌ 文档接地 (Grounding) AI 不知道你的 Excel 文件内容,无法基于工作簿数据回答

安全

不支持 说明
❌ HTTPS/TLS 代理服务器默认 HTTP(建议仅在本机使用,不暴露到公网)
❌ 默认 API 认证 api_key 留空表示不需要认证(建议设置 api_key 后再使用)
❌ 请求速率限制 无 rate limiting 机制
❌ 日志脱敏 日志中可能打印 Token 信息(请勿公开日志)

运维

不支持 说明
❌ Excel 崩溃自动恢复 无 watchdog 机制,Excel 崩溃后代理失效
❌ 零停机刷新 50 分钟强制刷新期间会短暂中断活跃对话
❌ WebSocket 长连接 每次聊天请求新建 WebSocket 连接
❌ 跨重启状态恢复 对话历史保留在 SQLite,但 AugLoop session 每次重启重建

工具能力差异

代理的 ToolRegistry 提供 8 种工具,但它们运行在代理服务器上,不是 Excel 内:

代理工具 运行位置 能否操作 Excel
read_file 代理服务器文件系统 ❌ 不能读 Excel 工作簿
write_file 代理服务器文件系统 ❌ 不能写入 Excel 单元格
list_directory 代理服务器文件系统 ❌ 不能列出 Excel 工作表
run_python 代理服务器 Python ❌ 不是 Excel 内的 Python
run_shell 代理服务器 Shell ❌ 与 Excel 无关
http_get 代理服务器网络 — 与 Excel 无关,可正常使用
get_current_time 系统时间 — 可正常使用
json_parse 纯计算 — 可正常使用

关键差异:Excel Copilot 的原生工具可以直接读写当前打开的 Excel 工作簿(单元格、公式、图表),而代理的工具只能操作代理服务器的文件系统。AI 在回复中会提到"Excel 操作"能力,但实际上它无法通过代理工具操作你的 Excel。


致谢

About

Microsoft 365 Excel Copilot (AugLoop) to OpenAI-compatible API reverse proxy server

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages