目标:实现个人免费的AI调用(如接入CodeX、Copilot、QQbot),兼容OpenAI接口,具备工具执行的能力。正在逐步推进。
- 和
openclaw-zero-token的关系:API逆向参考了其代码(特别是PowChallenge);没有openclaw的部分,只有API的封装,且专门用于Windows。 - 和
foxhui:WebAI2API的关系:目标一致(都是API封装,所以抄了它的项目名),但是我认为它对网页AI调用的开发还不够。且有很多花里胡哨的东西(太重)。
目前只打算针对deepseek进行封装。好处是可以深度定制,坏处是没有多模态。
Note
本项目调用的是 DeepSeek Web 接口,不是官方 api.deepseek.com API Key 接口。
- 网页AI的好处:免费,适合单人使用;无需自己管理上下文(上面提到的两个库没有很好发挥“网页AI自带记忆管理”这个强项)。
- 坏处:只能写用户提示词;文件支持较差;要和官方博弈。
项目特色:
- 利用网页记忆管理实现了 responses API 的封装,可以接入CodeX
- 利用提示词工程实现了 tool-calling
目前只有Windows
- Node.js 20+
- pnpm
- 本机已安装 Chrome 或 Edge
pnpm install拉起一个独立浏览器:
pnpm auth --launch如果你已经有一个打开了远程调试端口的浏览器:
pnpm auth --cdp http://127.0.0.1:9222
pnpm auth --cdp 9222 # 可以只传递端口号; 默认用回环地址成功后会自动关闭浏览器,并把凭证保存到./.data/deepseek-credentials.json;也可以通过 --output 指定保存位置:
pnpm auth -o .data/deepseek-credentials.json如果不想直接关闭浏览器,可以使用 --keep
【不推荐】使用 Windows 账户登录
Windows下可以指定已有的用户,比如自己的用户,例子:
pnpm auth --launch --user-data-dir='C:\Users\<用户名>\AppData\Local\Microsoft\Edge\User Data'不过如果后台有Edge进程,会导致连不上,所以要先杀进程:
taskkill /F /IM msedge.exe如果使用API方式,可以用自己的账户,如上操作即可。但如果要用浏览器方式,由于要先杀进程,导致非常不实用。
{
"cookie": "...",
"bearer": "...",
"userAgent": "...",
}如果不想安装一堆依赖,可以先登录上deepseek,打开控制台,查看网络活动,找一个有关的请求,其head就可以找到这三个值,手动创建文件、填写内容。
本项目进行了两种封装:API和浏览器。API即nodejs发起请求,支持流式;浏览器即操作浏览器完成请求,不支持流式,好在deepseek没有反自动化,随便模拟一下人的操作就行。下面展示的都是基于API的调用方式;如果要用浏览器版只要将 chat 改为 chat-browser。
对于本项目,下面这些功能更大的意义在于展示如何使用封装,而不是真的拿来用。如果自己的js项目要用到,可以直接 import 相关文件。
pnpm chat "你好,介绍一下你自己"指定凭证文件:
pnpm chat --credentials .data/deepseek-credentials.json "帮我分析这段逻辑"交互式聊天模式:
pnpm chat --interactive "可选的第一句话"结束后自动删除对话记录:
pnpm chat "你好" --delete由于QQbot使用了nonebot,跨语言调用需要走网络请求。传统封装仅仅是 completions API,但由于网页AI自带记忆管理,因此 Responses API 更为合适。本项目两个都实现了,并用提示词工程实现了工具调用。最终效果(用python调用接口)↓

pnpm run server -p 8787 --credentials="..." --browser --user-data-dir="..."port: 服务端口,默认8787credentials: 使用API封装时的凭证json文件路径browser: 是否使用浏览器封装,默认使用API封装user-data-dir: 使用浏览器封装时的用户配置文件夹。默认用auth的默认路径
为了安全,默认只处理本地请求。可以在环境变量 MYDS_IP_ALLOWLIST 中添加白名单。
completions: 每次请求相当于新开对话,需要自己维护上下文。调用完成会自动删除session。调用示例请查看test_completions.pyresponses: 利用网页AI的记忆管理复用对话,不需要自己维护上下文,每次只需要发送增量。不会自动删除会话。调用示例请查看test_responses.py
和官方调用不同,本项目决定不了请求的 id,因此采用了以下的策略:
- 响应的id为
{sessionId}|{messageId},在 responses API 调用时需要用返回值的id更新请求的id。 - 工具调用的id就是源码。返回调用结果时会将id和结果一起输出,这样AI就知道清晰的对应关系了
CodeX配置如下:
model = "deepseek"
model_provider = "local-service"
model_supports_reasoning_summaries = false
[model_providers.local-service]
name = "My Local Codex Service"
base_url = "http://localhost:8787/v1"
wire_api = "responses"
api_key = "do-not-need-api-key"
supports_websockets = true注意:supports_websockets为true时会复用会话,为false时不会复用。
Tip
CodeX执行 Get-Content -Path .\README.md -Raw 经常得到乱码,这是 GBK/GB2312 编码的文本被错误地用 UTF-8 解码后产生的现象。解决方法是加上 -Encoding UTF8。虽然大模型看得懂,但是最好还是设置一下PowerShell。具体做法是:
- 先
$PROFILE | Select-Object *随便找一个配置文件修改 - 增加
$PSDefaultParameterValues['Get-Content:Encoding'] = 'utf8'
需要先安装插件 OAI Compatible Provider for Copilot,设置中 url 填写 http://localhost:8787/v1 即可。
在Windows下,codex的 apply_patch 工具会有问题,导致代码修改没有diff;而copilot就很好。不过copilot使用的是 completions API,每次会把消息全发出去,稍微浪费一些上行流量。
[] 文件和图片的上传 [] 等待ds放开图像理解模式
WebAI2API/realResponse
实际采集到的网页端请求数据
WebAI2API/src
│ auth.ts 登录、获取凭证
│ browser.ts 浏览器启动
│ deepseekBrowserClient.ts 浏览器封装
│ deepseekStreamParser.ts deepseek的流式返回解析
│ deepseekWebClient.ts API封装
│ sseStreamParser.ts 通用SSE流解析
│ utils.ts 通用工具函数
│ webScript.js 油猴脚本,用于测试API
│
├─server 本地请求相关
│ │ httpUtils.ts 发送
│ │ models.ts /models/ 这个接口的数据
│ │ responseId.ts 对sessionId和messageId的封装与解析
│ │ server.ts 入口
│ │ serverClient.ts 对两种封装的统一
│ │ toolPrompt.ts prompt实现工具调用
│ │
│ ├─completions
│ │ completionsType.ts
│ │ stream.ts
│ │
│ └─responses
│ responsesType.ts
│ stream.ts
│ websocketHandler.ts 专门为CodeX实现的
│
├─test
│ test_completions.py
│ test_responses.py
│
└─usage 直接用API/浏览器封装(不使用server)的示例
chat.ts
chat_browser.ts
Caution
免责声明
本项目仅供学习交流使用。如果因使用该项目造成的任何后果 (包括但不限于账号被禁用),作者和项目均不承担任何责任。请遵守相关网站和服务的使用条款 (ToS),并做好相关数据的备份工作。
