【免费下载链接】Windows-Copilot-API
Reverse engineered Windows Copilot into an OpenAI-compatible API. Access GPT-4 and GPT-5 models through a simple REST interface without API keys or billing.
想用Windows-Copilot-API实现 AI 打字机效果?这篇流式输出教程带你用 3 种方式拿到实时逐字打印的结果:Python 库直接流式、HTTP 服务器 SSE 流式、官方 OpenAI SDK 流式。无需 API Key,无需计费,基于自己的 Copilot 账号,2 分钟就能跑起来 🚀
什么是流式输出?为什么需要打字机效果
普通的chat()调用要等模型把整段回答生成完才返回。回答越长,等待越久,体验越"闷"。
流式输出(streaming)则完全不同:模型边生成、边把一小段一小段的文字(chunk)推送给你的程序,你边收边打印,就像聊天窗口里字一个个蹦出来一样。
Windows-Copilot-API 的两种使用方式都原生支持流式:
- 🐍 Python 库:
client.stream()返回可迭代对象 - 🔌 HTTP 服务器:请求体里加
"stream": true,服务端以Server-Sent Events(SSE)格式推送
核心实现分别在 copilot/client.py(CopilotClient.stream)和 server/openai_format.py(SSE 数据块构造)。
准备工作:克隆项目并完成一次登录
git clone https://gitcode.com/gh_mirrors/wi/Windows-Copilot-API cd Windows-Copilot-API python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate.bat pip install -r requirements.txt playwright install chromium python -m copilot login # 打开浏览器登录一次,之后自动复用登录完成后,会话保存在session/目录,每次运行自动复用,无需重复登录 ✅
方式一:Python 库直接流式(最简单)
如果你的代码本身就是 Python,这是最快上手的路径,完整示例见 examples/03_direct_stream.py:
from copilot import CopilotClient client = CopilotClient() stream = client.stream("Tell me a short, clean joke.") for chunk in stream: print(chunk, end="", flush=True) # 每收到一段就立刻打印 print() print("conversation_id:", stream.conversation_id)几个关键细节:
stream是ChatStream对象,可以像普通迭代器一样for循环,每轮产出一小段文本(字符串)flush=True是打字机效果的关键:不刷新的话输出会滞留在缓冲区,看起来就是一次性冒出来的conversation_id随流自动填充:开始新对话时 id 在迭代开始后自动写入stream.conversation_id,把它传给下一次调用即可续接同一个对话- 流式调用若遇到 Cloudflare 校验过期,客户端会自动打开浏览器刷新验证并重试,恢复发生在输出任何文字之前,所以不会重复打印(见 copilot/client.py 中
_stream_with_recovery的说明)
对比非流式:client.chat("...")会缓冲完整回答后一次性返回ChatReply(含text、conversation_id、images),适合不需要实时展示的场景,参见 examples/01_direct_chat.py。
方式二:HTTP 服务器 SSE 流式(跨语言通用)
需要给别人用、或者前端网页实时展示时,启动本地 OpenAI 兼容服务器更合适。
第一步,在终端启动服务器(详见 server/api.py):
python app.py # -> Copilot OpenAI-compatible API on http://127.0.0.1:8000第二步,发送请求。注意流式需要两个stream:请求体里的"stream": true让服务器切换为 SSE 模式,而 HTTP 客户端侧的stream=True让你可以逐行读取响应,完整示例见 examples/05_server_stream.py:
import json import requests with requests.post("http://localhost:8000/v1/chat/completions", json={ "model": "copilot", "stream": True, "messages": [{"role": "user", "content": "Tell me a short, clean joke."}], }, stream=True) as response: for line in response.iter_lines(): if not line or not line.startswith(b"data: "): continue payload = line[len("data: "):] if payload == b"[DONE]": # 流结束标记 break chunk = json.loads(payload) piece = chunk["choices"][0]["delta"].get("content") if piece: print(piece, end="", flush=True)理解 SSE 数据格式只需要知道 3 件事:
| 内容 | 位置 |
|---|---|
| 文字片段 | 每个data: {...}块里的choices[0].delta.content |
| 对话 id | 只有最后一个chunk 携带顶层conversation_id |
| 结束信号 | data: [DONE] |
⚠️ 与方式一不同,服务器运行在无头模式:若 Cloudflare 校验过期,它不会弹浏览器,而是直接返回
503(type: "clearance_required")。在主机会话上重新执行python -m copilot login后再重试即可。
方式三:官方 OpenAI SDK 流式(对已有代码零改动)
如果你的项目已经在用 OpenAI SDK,只需把base_url指向本地服务器,流式代码与调用 OpenAI 时完全一致。先pip install openai,完整示例见 examples/06_server_openai_sdk.py:
from openai import OpenAI client = OpenAI(base_url="http://localhost:8000/v1", api_key="unused") stream = client.chat.completions.create( model="copilot", messages=[{"role": "user", "content": "Say hello in one short sentence."}], stream=True, ) for chunk in stream: if chunk.choices and chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end="", flush=True)由于conversation_id不在 OpenAI 标准 schema 中,SDK 会把它放进model_extra;要续接对话,用extra_body={"conversation_id": cid}回传即可。SDK 还会自动处理429限流的指数退避重试,省心很多。
流式输出的实用注意事项
- 限流:服务器默认每分钟最多 12 个请求(
RATE_LIMIT_RPM),超出返回标准429+Retry-After头,实现见 server/ratelimit.py。建议客户端做指数退避(1s → 2s → 4s) - 并发:上游 Copilot 聊天 socket 不支持同一账号并发会话,服务器会把请求串行排队处理,保持同时在途请求数在 1–4 个左右最稳
- 模型名称:服务器只有一个模型,就叫
copilot,通过GET /v1/models可以确认 - 前端接入:SSE 是标准 Web 技术,浏览器里用
EventSource或 fetch 流式读取同一接口即可,把print换成往 DOM 追加文本
总结
| 场景 | 推荐方式 | 示例文件 |
|---|---|---|
| 本地 Python 脚本、快速验证 | CopilotClient.stream() | examples/03_direct_stream.py |
| 跨语言 / 前端 / 其他客户端 | HTTP + SSE("stream": true) | examples/05_server_stream.py |
| 已有 OpenAI SDK 代码 | 改base_url即可 | examples/06_server_openai_sdk.py |
三种方式的打字机效果都来自同一个原理:逐段接收、逐段打印、及时刷新。跑通任意一种后,你可以参考 examples/ 目录下的 README.md 把 6 个示例全部过一遍,基本就掌握了 Windows-Copilot-API 的全部用法 🎉
【免费下载链接】Windows-Copilot-API
Reverse engineered Windows Copilot into an OpenAI-compatible API. Access GPT-4 and GPT-5 models through a simple REST interface without API keys or billing.
相关推荐
SSE流式输出实战:edgeone-makers-tools如何打造打字机效果的AI对话
SSE流式输出实战:edgeone makers tools如何打造打字机效果的AI对话 edgeone makers tools 是腾讯云 EdgeOne M
Steamodded高级技巧:如何优化你的Balatro Mod性能与兼容性
Steamodded高级技巧:如何优化你的Balatro Mod性能与兼容性 想要让你的Balatro Mod运行更流畅、兼容性更好吗?Steamodded作为
游戏开发插件系统终极Modern JavaScript Cheatsheet打印指南:10个专业技巧优化你的打印输出效果
终极Modern JavaScript Cheatsheet打印指南:10个专业技巧优化你的打印输出效果 Modern JavaScript Cheatshee
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考