qq-codex-bridge 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +62 -0
- package/README.md +232 -287
- package/bin/chatgpt-desktop.js +2 -0
- package/bin/qq-codex-weixin-gateway.js +14 -0
- package/dist/apps/bridge-daemon/src/bootstrap.js +161 -31
- package/dist/apps/bridge-daemon/src/cli.js +5 -1
- package/dist/apps/bridge-daemon/src/config.js +168 -37
- package/dist/apps/bridge-daemon/src/http-server.js +23 -11
- package/dist/apps/bridge-daemon/src/main.js +163 -29
- package/dist/apps/bridge-daemon/src/thread-command-handler.js +320 -23
- package/dist/apps/chatgpt-desktop-cli/src/cli.js +191 -0
- package/dist/apps/weixin-gateway/src/cli.js +446 -0
- package/dist/apps/weixin-gateway/src/config.js +135 -0
- package/dist/apps/weixin-gateway/src/dev.js +2 -0
- package/dist/apps/weixin-gateway/src/message-store.js +50 -0
- package/dist/apps/weixin-gateway/src/server.js +216 -0
- package/dist/apps/weixin-gateway/src/state.js +163 -0
- package/dist/apps/weixin-gateway/src/weixin-client.js +520 -0
- package/dist/packages/adapters/chatgpt-desktop/src/ax-client.js +472 -0
- package/dist/packages/adapters/chatgpt-desktop/src/bridge-provider.js +82 -0
- package/dist/packages/adapters/chatgpt-desktop/src/driver.js +161 -0
- package/dist/packages/adapters/chatgpt-desktop/src/image-cache.js +155 -0
- package/dist/packages/adapters/chatgpt-desktop/src/session-registry.js +48 -0
- package/dist/packages/adapters/chatgpt-desktop/src/types.js +1 -0
- package/dist/packages/adapters/codex-desktop/src/codex-app-server-driver.js +810 -0
- package/dist/packages/adapters/codex-desktop/src/codex-app-ui-notification-forwarder.js +33 -0
- package/dist/packages/adapters/codex-desktop/src/codex-desktop-driver.js +727 -123
- package/dist/packages/adapters/codex-desktop/src/codex-local-rollout-reader.js +227 -0
- package/dist/packages/adapters/codex-desktop/src/codex-local-submission-reader.js +142 -0
- package/dist/packages/adapters/weixin/src/weixin-channel-adapter.js +15 -0
- package/dist/packages/adapters/weixin/src/weixin-http-client.js +42 -0
- package/dist/packages/adapters/weixin/src/weixin-sender.js +200 -0
- package/dist/packages/adapters/weixin/src/weixin-webhook.js +35 -0
- package/dist/packages/orchestrator/src/bridge-orchestrator.js +72 -25
- package/dist/packages/orchestrator/src/weixin-outbound-format.js +55 -0
- package/dist/packages/ports/src/chat.js +1 -0
- package/dist/packages/store/src/session-repo.js +16 -3
- package/dist/packages/store/src/sqlite.js +3 -0
- package/package.json +8 -2
package/README.md
CHANGED
|
@@ -7,444 +7,389 @@
|
|
|
7
7
|
|
|
8
8
|

|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
## 把 Codex / ChatGPT Desktop 变成你的 QQ / 微信私人 AI 助理
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
**qq-codex-bridge** 是一个开源本地桥接工具,让你通过 **QQ** 或**微信**直接对话 **Codex Desktop** 或 **ChatGPT Desktop**——支持图片理解、语音提问、文件分析、AI 生图回传,私聊群聊都能用,同时支持多 Bot、多账号接入。
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
- 按会话把消息映射到 Codex Desktop 线程
|
|
16
|
-
- 用 CDP 驱动 Codex Desktop 发送消息、切线程、读取回复
|
|
17
|
-
- 把 Codex 的文本、图片、文件、语音转写结果继续回送到 QQ
|
|
14
|
+
---
|
|
18
15
|
|
|
19
|
-
|
|
16
|
+
## 你可以这样用
|
|
20
17
|
|
|
21
|
-
|
|
18
|
+
### 发张图片,让 AI 帮你看
|
|
22
19
|
|
|
23
|
-
|
|
24
|
-
- [FAQ 与故障排查](./docs/faq.md)
|
|
25
|
-
- [架构说明](./docs/architecture.md)
|
|
26
|
-
- [在线 Wiki(GitNexus 自动生成)](https://gistcdn.githack.com/983033995/3206d28d1bd71323166bc511b8681620/raw/index.html#overview)
|
|
27
|
-
- [测试说明](./docs/testing.md)
|
|
28
|
-
- [变更记录](./CHANGELOG.md)
|
|
29
|
-
- [贡献指南](./CONTRIBUTING.md)
|
|
30
|
-
- [安全策略](./SECURITY.md)
|
|
20
|
+
遇到截图、照片、产品图?直接发给机器人,AI 会结合图片内容给出分析。手机端 QQ、桌面端 QQ 均可使用。
|
|
31
21
|
|
|
32
|
-
|
|
22
|
+

|
|
33
23
|
|
|
34
|
-
|
|
24
|
+
### 语音提问,张口就来
|
|
35
25
|
|
|
36
|
-
|
|
26
|
+
发一条语音,桥接会自动转写后发给 AI。双手不便打字时,直接说话就能问。
|
|
37
27
|
|
|
38
|
-
|
|
39
|
-
- QQ 私聊 / 群聊会话隔离
|
|
40
|
-
- Codex Desktop 启动检查与 CDP 连接
|
|
41
|
-
- QQ 消息映射到 Codex 线程
|
|
42
|
-
- Codex 回复增量采集并多次回传到 QQ
|
|
43
|
-
- SQLite 持久化会话、入站记录、出站任务
|
|
28
|
+
### Markdown 和代码,结构完整回传
|
|
44
29
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
- QQ 附件下载与上下文注入
|
|
48
|
-
- 图片
|
|
49
|
-
- 语音
|
|
50
|
-
- 视频
|
|
51
|
-
- 文件
|
|
52
|
-
- 语音转文字
|
|
53
|
-
- QQ 自带 `asr_refer_text` 回退
|
|
54
|
-
- `openai-compatible`
|
|
55
|
-
- `volcengine-flash`
|
|
56
|
-
- 本地离线 `whisper.cpp`
|
|
57
|
-
- QQ 媒体回传
|
|
58
|
-
- 图片
|
|
59
|
-
- 音频
|
|
60
|
-
- 视频
|
|
61
|
-
- 文件
|
|
62
|
-
|
|
63
|
-
### Codex 回复处理
|
|
64
|
-
|
|
65
|
-
- 富文本链接提取
|
|
66
|
-
- 有序列表编号保留
|
|
67
|
-
- 代码块序列化为 fenced markdown
|
|
68
|
-
- 表格结构保留
|
|
69
|
-
- 长耗时任务回复采集窗口延长
|
|
70
|
-
- 同一轮回复中的媒体结果继续跟进,不再只截前几段文本
|
|
30
|
+
AI 输出的列表、代码块、表格会尽量保留格式后再发到 QQ。写代码、看文档都清晰。
|
|
71
31
|
|
|
72
|
-
|
|
32
|
+

|
|
73
33
|
|
|
74
|
-
|
|
34
|
+
### AI 生成了图片?直接发回 QQ
|
|
75
35
|
|
|
76
|
-
|
|
77
|
-
| --- | --- | --- |
|
|
78
|
-
| 查看最近活跃线程 | `/threads` | `/t` |
|
|
79
|
-
| 查看当前绑定线程 | `/thread current` | `/tc` |
|
|
80
|
-
| 切换到指定线程 | `/thread use <序号>` | `/tu <序号>` |
|
|
81
|
-
| 新建线程 | `/thread new <标题>` | `/tn <标题>` |
|
|
82
|
-
| 基于最近对话 fork 线程 | `/thread fork <标题>` | `/tf <标题>` |
|
|
83
|
-
| 查看帮助 | `/help` | - |
|
|
84
|
-
|
|
85
|
-
---
|
|
36
|
+
Codex / ChatGPT 调用图片生成工具后,成品会自动回传到 QQ 对话里。创作结果一目了然。
|
|
86
37
|
|
|
87
|
-
|
|
38
|
+

|
|
88
39
|
|
|
89
|
-
|
|
90
|
-
- 需要把图片、语音、文件上下文桥接给 Codex
|
|
91
|
-
- 想研究 Codex Desktop 的 CDP 自动化与回复采集
|
|
92
|
-
- 想复用 QQ 官方 Bot 能力,但不依赖 OpenClaw 宿主
|
|
40
|
+
### 私聊线程管理,复杂任务不丢上下文
|
|
93
41
|
|
|
94
|
-
|
|
42
|
+
在 QQ 私聊中直接查看、切换、新建 Codex / ChatGPT 对话线程。大型项目可以分线程讨论,每个线程独立记忆,互不干扰。
|
|
95
43
|
|
|
96
|
-
|
|
44
|
+

|
|
97
45
|
|
|
98
|
-
|
|
46
|
+
---
|
|
99
47
|
|
|
100
|
-
|
|
48
|
+
## 工作原理
|
|
101
49
|
|
|
102
|
-
|
|
50
|
+
```text
|
|
51
|
+
QQ Bot / 微信
|
|
52
|
+
│
|
|
53
|
+
▼
|
|
54
|
+
BridgeOrchestrator(本地 Node.js 进程)
|
|
55
|
+
│
|
|
56
|
+
├── SessionStore / TranscriptStore(SQLite)
|
|
57
|
+
├── Channel Sender(QQ / 微信)
|
|
58
|
+
│
|
|
59
|
+
├── CodexDesktopDriver ──► Chrome DevTools Protocol ──► Codex Desktop
|
|
60
|
+
└── ChatgptDesktopDriver ──► macOS Accessibility API ──► ChatGPT Desktop
|
|
61
|
+
```
|
|
103
62
|
|
|
104
|
-
|
|
63
|
+
桥接运行在本地,通过 CDP 驱动 Codex Desktop,通过 macOS Accessibility API 驱动 ChatGPT Desktop,完成消息收发和上下文注入。每个私聊会话可以独立绑定对话线程,并通过 `/source` 命令随时切换 AI 源。
|
|
105
64
|
|
|
106
|
-
|
|
65
|
+
---
|
|
107
66
|
|
|
108
|
-
|
|
67
|
+
## 快速开始
|
|
109
68
|
|
|
110
|
-
###
|
|
69
|
+
### 第 0 步:创建 QQ 机器人,获取 AppID 和 AppSecret
|
|
111
70
|
|
|
112
|
-
|
|
71
|
+
1. 打开 [QQ 开放平台](https://q.qq.com/qqbot/openclaw/index.html),登录后点击「**创建机器人**」
|
|
72
|
+
2. 填写机器人名称和简介,完成创建
|
|
73
|
+
3. 进入机器人详情页,复制 **AppID** 和 **AppSecret**(点击"查看"可显示 AppSecret)
|
|
113
74
|
|
|
114
|
-

|
|
115
76
|
|
|
116
|
-
|
|
77
|
+
> 同一 AppID + AppSecret 可以同时在多个群聊和私聊中使用,无需重复创建。
|
|
117
78
|
|
|
118
|
-
|
|
79
|
+
### 第 1 步:生成配置文件
|
|
119
80
|
|
|
120
|
-
|
|
81
|
+
推荐直接用 `npx`:
|
|
121
82
|
|
|
122
|
-
|
|
83
|
+
```bash
|
|
84
|
+
npx qq-codex-bridge init
|
|
85
|
+
```
|
|
123
86
|
|
|
124
|
-
|
|
87
|
+
或全局安装后使用:
|
|
125
88
|
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
▼
|
|
130
|
-
QqGatewayClient / QqGateway
|
|
131
|
-
│
|
|
132
|
-
▼
|
|
133
|
-
BridgeOrchestrator
|
|
134
|
-
│
|
|
135
|
-
├── SessionStore / TranscriptStore (SQLite)
|
|
136
|
-
├── QqSender / QqApiClient
|
|
137
|
-
└── CodexDesktopDriver
|
|
138
|
-
│
|
|
139
|
-
└── Chrome DevTools Protocol
|
|
140
|
-
│
|
|
141
|
-
└── Codex Desktop
|
|
89
|
+
```bash
|
|
90
|
+
npm i -g qq-codex-bridge
|
|
91
|
+
qq-codex-bridge init
|
|
142
92
|
```
|
|
143
93
|
|
|
144
|
-
|
|
94
|
+
这会将内置配置模板写入当前目录的 `.env`。
|
|
145
95
|
|
|
146
|
-
|
|
147
|
-
QQ 消息
|
|
148
|
-
-> 归一化 / 附件下载 / STT
|
|
149
|
-
-> 构造成 Codex 入站上下文
|
|
150
|
-
-> 注入 Codex Desktop
|
|
151
|
-
-> 轮询最新 assistant unit
|
|
152
|
-
-> 增量 draft
|
|
153
|
-
-> QQ 文本 / 媒体发送
|
|
154
|
-
-> SQLite 记录入站与出站任务
|
|
155
|
-
```
|
|
96
|
+
### 第 2 步:填写 `.env`
|
|
156
97
|
|
|
157
|
-
|
|
98
|
+
将上一步复制的 **AppID** 和 **AppSecret** 填入 `.env`:
|
|
158
99
|
|
|
159
|
-
|
|
100
|
+
```env
|
|
101
|
+
QQBOT_APP_ID=你的AppID
|
|
102
|
+
QQBOT_CLIENT_SECRET=你的ClientSecret
|
|
103
|
+
```
|
|
160
104
|
|
|
161
|
-
|
|
105
|
+
`.env` 中其他常用变量:
|
|
162
106
|
|
|
163
|
-
|
|
164
|
-
|
|
107
|
+
| 变量 | 说明 | 默认值 |
|
|
108
|
+
|---|---|---|
|
|
109
|
+
| `CODEX_REMOTE_DEBUGGING_PORT` | Codex Desktop 远程调试端口 | `9229` |
|
|
110
|
+
| `QQBOT_STT_*` | 语音转文字配置(可选,不填则用 QQ 内置 ASR) | — |
|
|
111
|
+
| `QQBOT_MARKDOWN_SUPPORT` | 是否启用 QQ markdown 文本发送 | `false` |
|
|
165
112
|
|
|
166
|
-
|
|
113
|
+
### 第 3 步:启动桥接
|
|
167
114
|
|
|
168
|
-
|
|
169
|
-
-
|
|
170
|
-
|
|
171
|
-
- Markdown 分块发送思路
|
|
172
|
-
- “增量回复 -> 分段回传”的设计方向
|
|
115
|
+
```bash
|
|
116
|
+
npx qq-codex-bridge
|
|
117
|
+
```
|
|
173
118
|
|
|
174
|
-
|
|
119
|
+
正常启动后会看到类似日志:
|
|
175
120
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
121
|
+
```text
|
|
122
|
+
[qq-codex-bridge] codex desktop ready { launched: true|false, remoteDebuggingPort: 9229 }
|
|
123
|
+
[qq-codex-bridge] ready { transport: 'qq-gateway-websocket', accountKeys: ['qqbot:default'], conversationProvider: 'codex-desktop' }
|
|
124
|
+
```
|
|
180
125
|
|
|
181
|
-
|
|
126
|
+
> 桥接会先检查 Codex Desktop 是否已运行;若未运行,会尽量自动拉起后再继续。
|
|
182
127
|
|
|
183
|
-
|
|
128
|
+
### 第 4 步:在 QQ 中联调
|
|
184
129
|
|
|
185
|
-
|
|
130
|
+
建议按这个顺序测试:
|
|
186
131
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
config.ts
|
|
193
|
-
thread-command-handler.ts
|
|
194
|
-
debug-codex-workers.ts
|
|
195
|
-
|
|
196
|
-
packages/adapters/qq/
|
|
197
|
-
src/
|
|
198
|
-
qq-gateway-client.ts
|
|
199
|
-
qq-gateway.ts
|
|
200
|
-
qq-api-client.ts
|
|
201
|
-
qq-sender.ts
|
|
202
|
-
qq-media-downloader.ts
|
|
203
|
-
qq-media-parser.ts
|
|
204
|
-
qq-stt.ts
|
|
205
|
-
|
|
206
|
-
packages/adapters/codex-desktop/
|
|
207
|
-
src/
|
|
208
|
-
cdp-session.ts
|
|
209
|
-
codex-desktop-driver.ts
|
|
210
|
-
composer-heuristics.ts
|
|
211
|
-
reply-parser.ts
|
|
212
|
-
|
|
213
|
-
packages/orchestrator/
|
|
214
|
-
src/
|
|
215
|
-
bridge-orchestrator.ts
|
|
216
|
-
media-context.ts
|
|
217
|
-
qq-outbound-draft.ts
|
|
218
|
-
qq-outbound-format.ts
|
|
219
|
-
qqbot-skill-context.ts
|
|
220
|
-
|
|
221
|
-
packages/store/
|
|
222
|
-
src/
|
|
223
|
-
sqlite.ts
|
|
224
|
-
session-repo.ts
|
|
225
|
-
message-repo.ts
|
|
226
|
-
```
|
|
132
|
+
1. **普通文本** — 先确认消息收发正常
|
|
133
|
+
2. **一条会让 AI 分阶段回答的问题** — 验证增量回复采集
|
|
134
|
+
3. **一条语音** — 验证 STT 转写链路
|
|
135
|
+
4. **一张图片** — 验证图片上下文注入
|
|
136
|
+
5. **`/t` 与 `/tu 2`** — 验证线程管理命令
|
|
227
137
|
|
|
228
138
|
---
|
|
229
139
|
|
|
230
|
-
##
|
|
140
|
+
## 微信通道
|
|
231
141
|
|
|
232
|
-
-
|
|
233
|
-
- Node.js 20+
|
|
234
|
-
- 已安装 Codex Desktop
|
|
235
|
-
- Codex Desktop 可通过远程调试端口暴露 page target
|
|
236
|
-
- QQ 官方机器人 `AppID` 和 `ClientSecret`
|
|
142
|
+
仓库内置了一套**真实微信文本网关**,对接微信 long-poll 接口,把消息转发给 bridge,再把回复发回微信。
|
|
237
143
|
|
|
238
|
-
|
|
144
|
+
### 最小配置
|
|
239
145
|
|
|
240
|
-
|
|
146
|
+
在 `.env` 中补充:
|
|
241
147
|
|
|
242
|
-
|
|
148
|
+
```env
|
|
149
|
+
WEIXIN_ENABLED=true
|
|
150
|
+
WEIXIN_ACCOUNT_ID=default
|
|
151
|
+
WEIXIN_WEBHOOK_PATH=/webhooks/weixin
|
|
152
|
+
WEIXIN_EGRESS_BASE_URL=http://127.0.0.1:3200
|
|
153
|
+
WEIXIN_EGRESS_TOKEN=your-token
|
|
154
|
+
```
|
|
243
155
|
|
|
244
|
-
|
|
156
|
+
### 首次扫码登录
|
|
245
157
|
|
|
246
158
|
```bash
|
|
247
|
-
|
|
159
|
+
pnpm weixin:login
|
|
160
|
+
# 或已安装发布包:
|
|
161
|
+
qq-codex-weixin-gateway --weixin-login
|
|
248
162
|
```
|
|
249
163
|
|
|
250
|
-
|
|
164
|
+
### 启动网关
|
|
251
165
|
|
|
252
166
|
```bash
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
```
|
|
167
|
+
# 源码开发模式(同时启动 bridge + 微信网关):
|
|
168
|
+
pnpm dev
|
|
256
169
|
|
|
257
|
-
|
|
170
|
+
# 或单独启动微信网关:
|
|
171
|
+
pnpm start:weixin-gateway
|
|
172
|
+
# 已安装发布包:
|
|
173
|
+
qq-codex-weixin-gateway
|
|
174
|
+
```
|
|
258
175
|
|
|
259
|
-
|
|
176
|
+
完整说明见:[微信文本通道接入文档](./docs/weixin-text-gateway.md)
|
|
260
177
|
|
|
261
|
-
|
|
178
|
+
---
|
|
262
179
|
|
|
263
|
-
|
|
264
|
-
- `QQBOT_CLIENT_SECRET`
|
|
180
|
+
## 多 Bot / 多账号接入
|
|
265
181
|
|
|
266
|
-
###
|
|
182
|
+
### 多 QQ Bot
|
|
267
183
|
|
|
268
|
-
|
|
184
|
+
**方式 A:JSON 数组(推荐)**
|
|
269
185
|
|
|
270
|
-
```
|
|
271
|
-
|
|
186
|
+
```env
|
|
187
|
+
QQBOTS_JSON=[{"accountId":"main","appId":"AppID1","clientSecret":"Secret1","markdownSupport":false},{"accountId":"shop","appId":"AppID2","clientSecret":"Secret2","markdownSupport":false}]
|
|
272
188
|
```
|
|
273
189
|
|
|
274
|
-
|
|
190
|
+
**方式 B:ID 列表 + 分账号变量**
|
|
275
191
|
|
|
276
|
-
```
|
|
277
|
-
|
|
192
|
+
```env
|
|
193
|
+
QQBOT_ACCOUNT_IDS=main,shop
|
|
194
|
+
QQBOT_MAIN_APP_ID=AppID1
|
|
195
|
+
QQBOT_MAIN_CLIENT_SECRET=Secret1
|
|
196
|
+
QQBOT_SHOP_APP_ID=AppID2
|
|
197
|
+
QQBOT_SHOP_CLIENT_SECRET=Secret2
|
|
278
198
|
```
|
|
279
199
|
|
|
280
|
-
|
|
200
|
+
### 多微信账号
|
|
281
201
|
|
|
282
|
-
|
|
202
|
+
每个微信账号需要一个独立的网关进程(监听不同端口):
|
|
283
203
|
|
|
284
|
-
|
|
204
|
+
**方式 A:JSON 数组**
|
|
285
205
|
|
|
286
|
-
|
|
206
|
+
```env
|
|
207
|
+
WEIXIN_ACCOUNTS_JSON=[{"accountId":"main","webhookPath":"/webhooks/weixin/main","egressBaseUrl":"http://127.0.0.1:3201","egressToken":"token-main"},{"accountId":"shop","webhookPath":"/webhooks/weixin/shop","egressBaseUrl":"http://127.0.0.1:3202","egressToken":"token-shop"}]
|
|
208
|
+
```
|
|
287
209
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
210
|
+
**方式 B:ID 列表 + 分账号变量**
|
|
211
|
+
|
|
212
|
+
```env
|
|
213
|
+
WEIXIN_ACCOUNT_IDS=main,shop
|
|
214
|
+
WEIXIN_MAIN_WEBHOOK_PATH=/webhooks/weixin/main
|
|
215
|
+
WEIXIN_MAIN_EGRESS_BASE_URL=http://127.0.0.1:3201
|
|
216
|
+
WEIXIN_MAIN_EGRESS_TOKEN=token-main
|
|
217
|
+
WEIXIN_SHOP_WEBHOOK_PATH=/webhooks/weixin/shop
|
|
218
|
+
WEIXIN_SHOP_EGRESS_BASE_URL=http://127.0.0.1:3202
|
|
219
|
+
WEIXIN_SHOP_EGRESS_TOKEN=token-shop
|
|
291
220
|
```
|
|
292
221
|
|
|
293
|
-
|
|
222
|
+
> 单 bot 单账号时保持旧配置(`QQBOT_APP_ID` + `QQBOT_CLIENT_SECRET`)即可,自动作为 `accountId=default` 处理,无需改动。
|
|
294
223
|
|
|
295
|
-
|
|
224
|
+
---
|
|
296
225
|
|
|
297
|
-
|
|
298
|
-
2. 一条会让 Codex 分阶段回答的问题
|
|
299
|
-
3. 一条语音
|
|
300
|
-
4. 一张图片
|
|
301
|
-
5. `/t` 与 `/tu 2`
|
|
226
|
+
## 对话源切换(Codex / ChatGPT)
|
|
302
227
|
|
|
303
|
-
|
|
228
|
+
bridge 同时支持 **Codex Desktop** 和 **ChatGPT Desktop** 作为 AI 对话后端。每个私聊会话可以独立切换:
|
|
304
229
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
230
|
+
```text
|
|
231
|
+
/source 查看当前对话源
|
|
232
|
+
/source codex 切换到 Codex Desktop
|
|
233
|
+
/source chatgpt 切换到 ChatGPT Desktop
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
切换后,`/t`、`/tu`、`/tn` 等线程命令会自动路由到对应的 Desktop 应用。
|
|
308
237
|
|
|
309
|
-
|
|
238
|
+
---
|
|
310
239
|
|
|
311
|
-
|
|
240
|
+
## 开发者源码启动
|
|
312
241
|
|
|
313
242
|
```bash
|
|
314
243
|
git clone https://github.com/983033995/qq-codex-bridge.git
|
|
315
244
|
cd qq-codex-bridge
|
|
316
245
|
pnpm install
|
|
317
246
|
cp .env.example .env
|
|
247
|
+
# 填写 .env 中的 QQBOT_APP_ID 和 QQBOT_CLIENT_SECRET
|
|
318
248
|
pnpm dev
|
|
319
249
|
```
|
|
320
250
|
|
|
321
251
|
---
|
|
322
252
|
|
|
323
|
-
##
|
|
324
|
-
|
|
325
|
-
项目支持三层语音转写策略。
|
|
253
|
+
## 项目特性
|
|
326
254
|
|
|
327
|
-
###
|
|
255
|
+
### 核心能力
|
|
328
256
|
|
|
329
|
-
|
|
257
|
+
- QQ 官方 Bot WebSocket gateway 入站,支持多 bot 并行
|
|
258
|
+
- 微信文本 long-poll 入站 / HTTP 文本出站,支持多账号
|
|
259
|
+
- QQ 私聊 / 群聊会话隔离
|
|
260
|
+
- 多通道会话隔离(QQ / 微信)
|
|
261
|
+
- 双 AI 源:Codex Desktop(CDP)+ ChatGPT Desktop(macOS AX)
|
|
262
|
+
- 每个私聊会话独立绑定线程,可随时切换 AI 源
|
|
263
|
+
- SQLite 持久化会话、入站记录、出站任务
|
|
330
264
|
|
|
331
|
-
|
|
332
|
-
- 如果 QQ 没返回 ASR,再回退到附件占位
|
|
265
|
+
### 媒体与语音
|
|
333
266
|
|
|
334
|
-
|
|
267
|
+
- QQ 附件下载与上下文注入(图片、语音、视频、文件)
|
|
268
|
+
- 语音转文字:支持 QQ 内置 ASR / OpenAI 兼容 / 火山引擎 / 本地 whisper.cpp
|
|
269
|
+
- QQ 媒体回传:图片、音频、视频、文件
|
|
270
|
+
- ChatGPT Desktop 图片生成结果自动回传
|
|
335
271
|
|
|
336
|
-
###
|
|
272
|
+
### 回复处理
|
|
337
273
|
|
|
338
|
-
|
|
274
|
+
- 富文本链接提取、有序列表编号保留
|
|
275
|
+
- 代码块序列化为 fenced markdown、表格结构保留
|
|
276
|
+
- 长耗时任务回复采集窗口延长
|
|
277
|
+
- 同一轮回复中的媒体结果持续跟进
|
|
339
278
|
|
|
340
|
-
|
|
341
|
-
- `volcengine-flash`
|
|
279
|
+
### 私聊命令(完整列表)
|
|
342
280
|
|
|
343
|
-
|
|
281
|
+
所有命令仅在**私聊**中有效;`/` 开头的命令由 bridge 拦截处理,不会直接发给 AI。
|
|
344
282
|
|
|
345
|
-
|
|
283
|
+
**Codex Desktop 源下可用:**
|
|
346
284
|
|
|
347
|
-
|
|
285
|
+
| 用途 | 完整命令 | 简写 |
|
|
286
|
+
| --- | --- | --- |
|
|
287
|
+
| 查看最近活跃线程 | `/threads` | `/t` |
|
|
288
|
+
| 查看当前绑定线程 | `/thread current` | `/tc` |
|
|
289
|
+
| 切换到指定线程 | `/thread use <序号>` | `/tu <序号>` |
|
|
290
|
+
| 新建线程 | `/thread new <标题>` | `/tn <标题>` |
|
|
291
|
+
| 基于最近对话 fork 线程 | `/thread fork <标题>` | `/tf <标题>` |
|
|
292
|
+
| 查看当前模型 | `/model` | `/m` |
|
|
293
|
+
| 切换模型 | `/model use <名称>` | `/mu <名称>` |
|
|
294
|
+
| 查看额度信息 | `/quota` | `/q` |
|
|
295
|
+
| 查看当前运行状态 | `/status` | `/st` |
|
|
348
296
|
|
|
349
|
-
|
|
297
|
+
**ChatGPT Desktop 源下可用:**
|
|
350
298
|
|
|
351
|
-
|
|
299
|
+
| 用途 | 完整命令 | 简写 |
|
|
300
|
+
| --- | --- | --- |
|
|
301
|
+
| 查看最近对话列表 | `/threads` | `/t` |
|
|
302
|
+
| 查看当前绑定对话 | `/thread current` | `/tc` |
|
|
303
|
+
| 切换到指定对话 | `/thread use <序号>` | `/tu <序号>` |
|
|
304
|
+
| 新建对话 | `/thread new <标题>` | `/tn <标题>` |
|
|
352
305
|
|
|
353
|
-
|
|
306
|
+
**两种源通用:**
|
|
354
307
|
|
|
355
|
-
|
|
308
|
+
| 用途 | 命令 |
|
|
309
|
+
| --- | --- |
|
|
310
|
+
| 查看当前对话源 | `/source` |
|
|
311
|
+
| 切换到 Codex Desktop | `/source codex` |
|
|
312
|
+
| 切换到 ChatGPT Desktop | `/source chatgpt` |
|
|
313
|
+
| 查看所有已接入账号 | `/accounts` |
|
|
314
|
+
| 查看帮助 | `/help` 或 `/h` |
|
|
356
315
|
|
|
357
|
-
|
|
358
|
-
- `qq stt completed`
|
|
359
|
-
- `qq stt produced no transcript`
|
|
360
|
-
- `qq stt fallback used`
|
|
361
|
-
- `qq stt failed`
|
|
316
|
+
---
|
|
362
317
|
|
|
363
|
-
|
|
318
|
+
## 当前实现上的保护逻辑
|
|
364
319
|
|
|
365
|
-
-
|
|
366
|
-
-
|
|
367
|
-
-
|
|
368
|
-
- `
|
|
369
|
-
- `hasAsrReferText`
|
|
370
|
-
- `transcriptPreview`
|
|
320
|
+
- **重复 QQ 入站抑制** — 短时间内同一会话、同一正文、同一媒体指纹的重复消息会被拦下
|
|
321
|
+
- **长耗时任务回复采集窗口延长** — 图片生成、长搜索不再因默认超时被提前截断
|
|
322
|
+
- **单条 draft 发送失败不再截断整轮回复** — 某一条 QQ 发送失败时,后续 draft 仍会继续尝试
|
|
323
|
+
- **可恢复错误不会打断桥接** — `reply_timeout` 等可恢复错误不再直接把会话打成 `needs_rebind`
|
|
371
324
|
|
|
372
325
|
---
|
|
373
326
|
|
|
374
|
-
##
|
|
375
|
-
|
|
376
|
-
这几个点是项目和“最小 demo”相比比较重要的部分:
|
|
327
|
+
## 已知限制
|
|
377
328
|
|
|
378
|
-
-
|
|
379
|
-
|
|
329
|
+
- Codex Desktop 驱动依赖当前版本的 DOM 结构和 CDP 可见性,桌面端改版后可能需要跟着适配
|
|
330
|
+
- ChatGPT Desktop 驱动依赖 macOS Accessibility API,macOS 系统权限变更可能影响使用
|
|
331
|
+
- 对 AI 回复的增量采集是**基于页面快照的伪流式**,不是官方内部事件流
|
|
332
|
+
- QQ 客户端的消息样式、Markdown 支持、媒体卡片展示不完全可控
|
|
333
|
+
- 微信当前只开放了**文本通道**,还没有内置图片、语音、文件与真实提供方签名适配
|
|
334
|
+
- 线程管理命令目前只在 **QQ 私聊** 中开放
|
|
380
335
|
|
|
381
|
-
|
|
382
|
-
图片生成、长搜索、长工具执行不再因为默认 30 秒窗口被提前截断。
|
|
336
|
+
---
|
|
383
337
|
|
|
384
|
-
|
|
385
|
-
某一条 QQ 发送失败时,后续 draft 仍会继续尝试发送。
|
|
338
|
+
## 环境要求
|
|
386
339
|
|
|
387
|
-
-
|
|
388
|
-
|
|
340
|
+
- macOS
|
|
341
|
+
- Node.js 20+
|
|
342
|
+
- 已安装 Codex Desktop(使用 Codex 源时)
|
|
343
|
+
- 已安装 ChatGPT Desktop(使用 ChatGPT 源时)
|
|
344
|
+
- QQ 官方机器人 `AppID` 和 `ClientSecret`
|
|
389
345
|
|
|
390
346
|
---
|
|
391
347
|
|
|
392
|
-
##
|
|
348
|
+
## 安全提醒
|
|
393
349
|
|
|
394
|
-
-
|
|
395
|
-
-
|
|
396
|
-
-
|
|
397
|
-
- 线程管理命令目前只在 **QQ 私聊** 中开放。
|
|
398
|
-
- 某些极端场景下,如果 Codex Desktop 页面结构变化很大,线程定位与回复提取可能失效。
|
|
350
|
+
- `.env` 里包含 QQ Bot、STT 等敏感密钥,**不要提交到仓库**(`.gitignore` 已默认排除 `.env`)
|
|
351
|
+
- 如果你把项目分享给别人,请务必轮换已经暴露过的密钥
|
|
352
|
+
- 本项目会处理用户消息、附件、语音与本地文件路径,联调时请注意隐私边界
|
|
399
353
|
|
|
400
354
|
---
|
|
401
355
|
|
|
402
356
|
## 调试建议
|
|
403
357
|
|
|
404
|
-
### 查看类型检查
|
|
405
|
-
|
|
406
358
|
```bash
|
|
359
|
+
# 类型检查
|
|
407
360
|
pnpm run check
|
|
408
|
-
```
|
|
409
|
-
|
|
410
|
-
### 运行测试
|
|
411
361
|
|
|
412
|
-
|
|
362
|
+
# 运行测试
|
|
413
363
|
pnpm test
|
|
414
|
-
```
|
|
415
364
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
```bash
|
|
365
|
+
# 调试 Codex page / worker
|
|
419
366
|
pnpm run debug:codex-workers -- --duration-ms 12000
|
|
420
367
|
```
|
|
421
368
|
|
|
422
369
|
---
|
|
423
370
|
|
|
424
|
-
##
|
|
371
|
+
## 文档导航
|
|
425
372
|
|
|
426
|
-
-
|
|
427
|
-
-
|
|
428
|
-
-
|
|
373
|
+
- [FAQ 与故障排查](./docs/faq.md)
|
|
374
|
+
- [架构说明](./docs/architecture.md)
|
|
375
|
+
- [测试说明](./docs/testing.md)
|
|
376
|
+
- [变更记录](./CHANGELOG.md)
|
|
377
|
+
- [贡献指南](./CONTRIBUTING.md)
|
|
378
|
+
- [安全策略](./SECURITY.md)
|
|
379
|
+
- [在线 Wiki(GitNexus 自动生成)](https://gistcdn.githack.com/983033995/e5715ad0d61605f039ca4e6055094083/raw/index.html#overview)
|
|
429
380
|
|
|
430
381
|
---
|
|
431
382
|
|
|
432
383
|
## 贡献
|
|
433
384
|
|
|
434
|
-
欢迎 issue、讨论和 PR
|
|
435
|
-
|
|
436
|
-
在提交改动前,建议至少执行:
|
|
385
|
+
欢迎 issue、讨论和 PR。在提交改动前,建议至少执行:
|
|
437
386
|
|
|
438
387
|
```bash
|
|
439
388
|
pnpm run check
|
|
440
389
|
pnpm test
|
|
441
390
|
```
|
|
442
391
|
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
- [CONTRIBUTING.md](./CONTRIBUTING.md)
|
|
446
|
-
- [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md)
|
|
447
|
-
- [SECURITY.md](./SECURITY.md)
|
|
392
|
+
更多约定请看 [CONTRIBUTING.md](./CONTRIBUTING.md) 和 [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md)。
|
|
448
393
|
|
|
449
394
|
---
|
|
450
395
|
|