定位:下游。构造 ima 鉴权头 → 调上游 ima 接口 → 透传结果。 鉴权、积分扣减、沙盒编排全在上游。
config.py 配置
ima_auth.py ★ 鉴权头构造:cookie 序列化 + bkn 签名(算法已从 H5 源码还原)
ima_upstream.py 上游客户端(chat + SSE 透传)
server.py FastAPI 入口:/v1/chat/completions(流式/非流式)
selftest.py bkn/鉴权头自检
x-ima-cookie: IMA-UID=..;IMA-TOKEN=..;IMA-REFRESH-TOKEN=..;UID-TYPE=..;TOKEN-TYPE=..
from_browser_ima: 1
x-ima-bkn: DJB33(IMA-TOKEN) ← ima_auth.py:ima_bkn(),JS 32 位语义精确模拟
PC 版 ima 是 Chromium 架构,登录票据在本机数据目录:
- 找数据目录:
%LOCALAPPDATA%\ima.copilot\User Data\(或安装目录下 User Data) - 粗提取(最快):在该目录下用工具搜二进制
IMA-TOKEN字符串(如findstr /m /s或 7-Zip 打开Default\Network\Cookies、Default\Local Storage\leveldb\*.ldb逐个看),找到形如IMA-TOKEN=t@xxxx的值 - 写成
ima_cookie.txt放服务目录:IMA-UID=你的uid IMA-TOKEN=t@xxxx IMA-REFRESH-TOKEN=r@xxxx UID-TYPE=1 TOKEN-TYPE=1 - 或者开 PC 客户端 remote debugging(启动参数
--remote-debugging-port=9222 --remote-allow-origins=*),DevTools 的 Network 里直接看任意 cgi 请求的x-ima-cookie原串——最准,连 token 轮换后的新值都能看
pip install fastapi uvicorn httpx
python selftest.py # 鉴权构造自检
uvicorn server:app --port 8300
curl http://127.0.0.1:8300/v1/chat/completions -H "Content-Type: application/json" \
-d '{"stream":true,"messages":[{"role":"user","content":"你好"}]}'/cgi-bin/s/*走加密通道(x-ima-cm/ckey/ctk三头 + ErrRejectPlain 拒明文), 加解密由客户端 native(Go so:X25519+HKDF+AES-GCM)完成cgi-bin/assistant/qa是否强制加密未知——401 只说明要票据,带上票据后实测见分晓- 若 qa 强制加密:再战 Go crypto 逆向(X25519 会话协商),工程量大但路径已清楚
tools_def.py read/bash/edit/write 工具定义(OpenAI schema)+ 真实执行器(限定 agent_ws 目录)
test_client.py agent 循环客户端(连 /v1/chat/completions,自动执行 tool_calls 并回传)
mock_upstream.py 无 token 验链路:MOCK_UPSTREAM=1 切模拟模型
e2e_test.py 进程内端到端测试(无需起服务)
python3 e2e_test.py
# 或真实 HTTP:
MOCK_UPSTREAM=1 uvicorn server:app --port 8300
python3 test_client.py "帮我看下 demo.txt"uvicorn server:app --port 8300 # 不设 MOCK_UPSTREAM 即真实 ima
python3 test_client.py "你的任务"第1轮:tool_calls → read(demo.txt) ← 模型发起,finish_reason=tool_calls
第2轮:tool_calls → bash(ls -la) ← 工具结果已回注上下文
第3轮:最终回答,finish_reason=stop
1. POST /cgi-bin/session_logic/init_session {"session_type":0,"env_info":{"robot_type":10000}}
→ session_id(每轮问答新建,规避同session限流"版本过低")
2. POST /cgi-bin/assistant/qa (SSE)
{"session_id","robot_type":10000,"question","question_type":0,
"client_id","command_info":{"command_type":0,"params":{}},"attach_media":[]}
→ 事件: QA_START(模型/trace) → SESSION_START → MESSAGE(Text) 或
STRUCTURED_BLOCK(blockMessage.text_message.Text) → COMPLETED → CLOSE
3. 鉴权: x-ima-cookie + x-ima-bkn(DJB33, 已验证与线上一致) + from_browser_ima:1
- 第1轮:tools 注入 → 模型输出
{"tool_calls":[...read(demo.txt)...]}→ 解析为 OpenAI tool_calls → 本地执行 - 第2轮:工具结果回注 → 模型基于结果回答 → finish_reason=stop
- 限流:同账号连续请求会被限(约20s间隔安全),生产加重试即可
- 注意:robot_type=15(Copilot) 走 web 通道报"当前版本暂不支持",Main=10000 可用