workbuddy2api 2.0.0__tar.gz → 2.0.2__tar.gz
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.
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/PKG-INFO +82 -38
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/README.md +81 -37
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/pyproject.toml +1 -1
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/src/codebuddy_proxy/__main__.py +77 -15
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/src/workbuddy2api.egg-info/PKG-INFO +82 -38
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/LICENSE +0 -0
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/setup.cfg +0 -0
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/src/codebuddy_proxy/anthropic_adapter.py +0 -0
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/src/codebuddy_proxy/codebuddy_client_demo.py +0 -0
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/src/codebuddy_proxy/desensitize.py +0 -0
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/src/codebuddy_proxy/dsml_parser.py +0 -0
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/src/codebuddy_proxy/projection_metadata.py +0 -0
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/src/codebuddy_proxy/responses_adapter.py +0 -0
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/src/codebuddy_proxy/responses_projection.py +0 -0
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/src/workbuddy2api.egg-info/SOURCES.txt +0 -0
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/src/workbuddy2api.egg-info/dependency_links.txt +0 -0
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/src/workbuddy2api.egg-info/entry_points.txt +0 -0
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/src/workbuddy2api.egg-info/requires.txt +0 -0
- {workbuddy2api-2.0.0 → workbuddy2api-2.0.2}/src/workbuddy2api.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: workbuddy2api
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.2
|
|
4
4
|
Summary: Local OpenAI/Responses/Anthropic compatible proxy for CodeBuddy
|
|
5
5
|
Requires-Python: >=3.10
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -30,21 +30,40 @@ Dynamic: license-file
|
|
|
30
30
|
|
|
31
31
|
## 安装
|
|
32
32
|
|
|
33
|
-
推荐使用 [uv](https://docs.astral.sh/uv/)
|
|
33
|
+
推荐使用 [uv](https://docs.astral.sh/uv/) 从 PyPI 运行:
|
|
34
34
|
|
|
35
35
|
```bash
|
|
36
36
|
# 安装 uv
|
|
37
37
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
38
38
|
|
|
39
|
-
#
|
|
40
|
-
uv run codebuddy_proxy
|
|
39
|
+
# 运行最新可用版本(uv 会自动创建环境并安装依赖)
|
|
40
|
+
uv run --with workbuddy2api python -m codebuddy_proxy \
|
|
41
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
42
|
+
|
|
43
|
+
# 强制刷新缓存后运行最新版本
|
|
44
|
+
uv run --refresh-package workbuddy2api --with workbuddy2api \
|
|
45
|
+
python -m codebuddy_proxy \
|
|
46
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
后续启动无需手动激活虚拟环境,重复执行上述 `uv run` 命令即可。
|
|
50
|
+
|
|
51
|
+
### 本地源码启动
|
|
52
|
+
|
|
53
|
+
在项目根目录执行以下命令,使用当前工作区源码而不是 PyPI 中的已发布版本:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# 同步本地项目依赖
|
|
57
|
+
uv sync
|
|
58
|
+
|
|
59
|
+
# 启动本地源码
|
|
60
|
+
uv run python -m codebuddy_proxy --desensitize
|
|
41
61
|
```
|
|
42
62
|
|
|
43
|
-
|
|
63
|
+
首次使用需要登录时:
|
|
44
64
|
|
|
45
65
|
```bash
|
|
46
|
-
|
|
47
|
-
python codebuddy_proxy.py
|
|
66
|
+
uv run python -m codebuddy_proxy --login --desensitize
|
|
48
67
|
```
|
|
49
68
|
|
|
50
69
|
## 快速开始
|
|
@@ -52,11 +71,9 @@ python codebuddy_proxy.py
|
|
|
52
71
|
### 1. 启动 proxy
|
|
53
72
|
|
|
54
73
|
```bash
|
|
55
|
-
#
|
|
56
|
-
uv run codebuddy_proxy
|
|
57
|
-
|
|
58
|
-
# 或传统方式
|
|
59
|
-
python codebuddy_proxy.py --desensitize
|
|
74
|
+
# 使用最新版本(推荐)
|
|
75
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize \
|
|
76
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
60
77
|
```
|
|
61
78
|
|
|
62
79
|
默认监听 `http://127.0.0.1:8787`
|
|
@@ -118,7 +135,7 @@ codex --profile codebuddy "你的任务"
|
|
|
118
135
|
--port PORT 监听端口(默认 8787)
|
|
119
136
|
--endpoint ENDPOINT CodeBuddy 后端地址
|
|
120
137
|
--session-file PATH 会话文件路径(默认 ~/.codebuddy-session.json)
|
|
121
|
-
--log-file PATH JSONL 日志文件(默认
|
|
138
|
+
--log-file PATH JSONL 日志文件(默认 ~/.workbuddy2api/codebuddy-proxy.jsonl)
|
|
122
139
|
--desensitize 启用脱敏处理(推荐)
|
|
123
140
|
--optimize-context 启用消息压缩优化(Codex CLI 推荐)
|
|
124
141
|
--login 启动时执行浏览器登录
|
|
@@ -142,7 +159,8 @@ CODEBUDDY_PROXY_LOG_FILE # 等同 --log-file
|
|
|
142
159
|
### 首次使用(需要登录)
|
|
143
160
|
|
|
144
161
|
```bash
|
|
145
|
-
uv run codebuddy_proxy
|
|
162
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --login \
|
|
163
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
146
164
|
```
|
|
147
165
|
|
|
148
166
|
浏览器打开后登录,成功后 proxy 自动启动。
|
|
@@ -150,29 +168,34 @@ uv run codebuddy_proxy.py --login
|
|
|
150
168
|
### 日常使用(自动读取登录态)
|
|
151
169
|
|
|
152
170
|
```bash
|
|
153
|
-
uv run codebuddy_proxy
|
|
171
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize \
|
|
172
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
154
173
|
```
|
|
155
174
|
|
|
156
175
|
### Codex CLI 场景(启用压缩优化)
|
|
157
176
|
|
|
158
177
|
```bash
|
|
159
|
-
uv run codebuddy_proxy
|
|
178
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize --optimize-context \
|
|
179
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
160
180
|
```
|
|
161
181
|
|
|
162
182
|
### 多账号切换
|
|
163
183
|
|
|
164
184
|
```bash
|
|
165
185
|
# 账号 1
|
|
166
|
-
uv run codebuddy_proxy
|
|
186
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --session-file ~/.codebuddy-work.json --login \
|
|
187
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
167
188
|
|
|
168
189
|
# 账号 2
|
|
169
|
-
uv run codebuddy_proxy
|
|
190
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --session-file ~/.codebuddy-personal.json --login \
|
|
191
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
170
192
|
```
|
|
171
193
|
|
|
172
194
|
### 监听所有网卡(局域网共享)
|
|
173
195
|
|
|
174
196
|
```bash
|
|
175
|
-
uv run codebuddy_proxy
|
|
197
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --host 0.0.0.0 --desensitize \
|
|
198
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
176
199
|
```
|
|
177
200
|
|
|
178
201
|
## API 接口
|
|
@@ -371,7 +394,8 @@ upstream chunk → response.output_text.delta
|
|
|
371
394
|
|
|
372
395
|
```bash
|
|
373
396
|
# 必须启用 --desensitize,否则几乎每次都被拦截
|
|
374
|
-
uv run codebuddy_proxy
|
|
397
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize \
|
|
398
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
375
399
|
|
|
376
400
|
# 在 Claude Code / CC Switch 中配置
|
|
377
401
|
# Base URL: http://127.0.0.1:8787/v1/messages
|
|
@@ -381,7 +405,8 @@ uv run codebuddy_proxy.py --desensitize
|
|
|
381
405
|
|
|
382
406
|
```bash
|
|
383
407
|
# 同时启用脱敏和消息压缩(最佳配置)
|
|
384
|
-
uv run codebuddy_proxy
|
|
408
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize --optimize-context \
|
|
409
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
385
410
|
|
|
386
411
|
# 在 Codex CLI 配置文件中
|
|
387
412
|
# base_url: http://127.0.0.1:8787/v1/responses
|
|
@@ -391,7 +416,8 @@ uv run codebuddy_proxy.py --desensitize --optimize-context
|
|
|
391
416
|
|
|
392
417
|
```bash
|
|
393
418
|
# 启用脱敏以避免合规术语被误拦
|
|
394
|
-
uv run codebuddy_proxy
|
|
419
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize \
|
|
420
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
395
421
|
|
|
396
422
|
# 示例请求
|
|
397
423
|
curl http://127.0.0.1:8787/v1/chat/completions \
|
|
@@ -465,10 +491,12 @@ curl http://127.0.0.1:8787/v1/chat/completions \
|
|
|
465
491
|
|
|
466
492
|
```bash
|
|
467
493
|
# 启用消息压缩
|
|
468
|
-
uv run codebuddy_proxy
|
|
494
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --optimize-context \
|
|
495
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
469
496
|
|
|
470
497
|
# 同时启用两个功能(推荐用于 Codex CLI)
|
|
471
|
-
uv run codebuddy_proxy
|
|
498
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize --optimize-context \
|
|
499
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
472
500
|
```
|
|
473
501
|
|
|
474
502
|
#### 工作原理
|
|
@@ -512,7 +540,7 @@ uv run codebuddy_proxy.py --desensitize --optimize-context
|
|
|
512
540
|
启用功能后,日志会记录压缩统计:
|
|
513
541
|
|
|
514
542
|
```bash
|
|
515
|
-
grep projection_applied
|
|
543
|
+
grep projection_applied "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" | jq .
|
|
516
544
|
```
|
|
517
545
|
|
|
518
546
|
示例输出:
|
|
@@ -543,26 +571,36 @@ grep projection_applied logs/codebuddy-proxy.jsonl | jq .
|
|
|
543
571
|
### 日志
|
|
544
572
|
|
|
545
573
|
日志包含:
|
|
546
|
-
-
|
|
547
|
-
-
|
|
574
|
+
- 文本日志:`$HOME/.workbuddy2api/proxy.log`(按天滚动,保留 30 天)
|
|
575
|
+
- 结构化日志:`$HOME/.workbuddy2api/codebuddy-proxy.jsonl`(按天滚动,保留 30 天,完整请求/响应)
|
|
576
|
+
|
|
577
|
+
JSONL 每条记录包含 `app_version`、`system_version`、`python_version` 和 `machine` 字段;启动时还会记录 `startup` 事件。
|
|
578
|
+
|
|
579
|
+
也可以指定日志文件的绝对路径:
|
|
580
|
+
|
|
581
|
+
```bash
|
|
582
|
+
uv run --with workbuddy2api python -m codebuddy_proxy \
|
|
583
|
+
--desensitize \
|
|
584
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
585
|
+
```
|
|
548
586
|
|
|
549
587
|
查看日志:
|
|
550
588
|
|
|
551
589
|
```bash
|
|
552
590
|
# 实时查看
|
|
553
|
-
tail -f
|
|
591
|
+
tail -f "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
554
592
|
|
|
555
593
|
# 查看流式事件
|
|
556
|
-
tail -100
|
|
594
|
+
tail -100 "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" | jq 'select(.event | startswith("stream"))'
|
|
557
595
|
|
|
558
596
|
# 统计超时
|
|
559
|
-
jq 'select(.event=="stream_timeout")'
|
|
597
|
+
jq 'select(.event=="stream_timeout")' "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" | wc -l
|
|
560
598
|
|
|
561
599
|
# 验证脱敏
|
|
562
|
-
grep desensitize_applied
|
|
600
|
+
grep desensitize_applied "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
563
601
|
|
|
564
602
|
# 验证压缩(查看统计数据)
|
|
565
|
-
grep projection_applied
|
|
603
|
+
grep projection_applied "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" | jq .
|
|
566
604
|
```
|
|
567
605
|
|
|
568
606
|
### 找不到 session 文件
|
|
@@ -570,7 +608,8 @@ grep projection_applied logs/codebuddy-proxy.jsonl | jq .
|
|
|
570
608
|
首次使用需要登录:
|
|
571
609
|
|
|
572
610
|
```bash
|
|
573
|
-
uv run codebuddy_proxy
|
|
611
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --login \
|
|
612
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
574
613
|
```
|
|
575
614
|
|
|
576
615
|
### 401 认证失败
|
|
@@ -578,7 +617,8 @@ uv run codebuddy_proxy.py --login
|
|
|
578
617
|
Token 过期,重新登录:
|
|
579
618
|
|
|
580
619
|
```bash
|
|
581
|
-
uv run codebuddy_proxy
|
|
620
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --login \
|
|
621
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
582
622
|
```
|
|
583
623
|
|
|
584
624
|
### 审核拦截
|
|
@@ -586,20 +626,23 @@ uv run codebuddy_proxy.py --login
|
|
|
586
626
|
启用脱敏:
|
|
587
627
|
|
|
588
628
|
```bash
|
|
589
|
-
uv run codebuddy_proxy
|
|
629
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize \
|
|
630
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
590
631
|
```
|
|
591
632
|
|
|
592
633
|
如果仍然被拦截,尝试压缩优化(仅 `/v1/responses`):
|
|
593
634
|
|
|
594
635
|
```bash
|
|
595
|
-
uv run codebuddy_proxy
|
|
636
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize --optimize-context \
|
|
637
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
596
638
|
```
|
|
597
639
|
|
|
598
640
|
### 端口被占用
|
|
599
641
|
|
|
600
642
|
```bash
|
|
601
643
|
lsof -i :8787
|
|
602
|
-
uv run codebuddy_proxy
|
|
644
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --port 8788 \
|
|
645
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
603
646
|
```
|
|
604
647
|
|
|
605
648
|
### SOCKS proxy 错误
|
|
@@ -614,7 +657,8 @@ env | grep -i proxy
|
|
|
614
657
|
|
|
615
658
|
```bash
|
|
616
659
|
unset http_proxy https_proxy all_proxy
|
|
617
|
-
uv run codebuddy_proxy
|
|
660
|
+
uv run --with workbuddy2api python -m codebuddy_proxy \
|
|
661
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
618
662
|
```
|
|
619
663
|
|
|
620
664
|
## 技术细节
|
|
@@ -15,21 +15,40 @@
|
|
|
15
15
|
|
|
16
16
|
## 安装
|
|
17
17
|
|
|
18
|
-
推荐使用 [uv](https://docs.astral.sh/uv/)
|
|
18
|
+
推荐使用 [uv](https://docs.astral.sh/uv/) 从 PyPI 运行:
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
21
|
# 安装 uv
|
|
22
22
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
23
23
|
|
|
24
|
-
#
|
|
25
|
-
uv run codebuddy_proxy
|
|
24
|
+
# 运行最新可用版本(uv 会自动创建环境并安装依赖)
|
|
25
|
+
uv run --with workbuddy2api python -m codebuddy_proxy \
|
|
26
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
27
|
+
|
|
28
|
+
# 强制刷新缓存后运行最新版本
|
|
29
|
+
uv run --refresh-package workbuddy2api --with workbuddy2api \
|
|
30
|
+
python -m codebuddy_proxy \
|
|
31
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
后续启动无需手动激活虚拟环境,重复执行上述 `uv run` 命令即可。
|
|
35
|
+
|
|
36
|
+
### 本地源码启动
|
|
37
|
+
|
|
38
|
+
在项目根目录执行以下命令,使用当前工作区源码而不是 PyPI 中的已发布版本:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# 同步本地项目依赖
|
|
42
|
+
uv sync
|
|
43
|
+
|
|
44
|
+
# 启动本地源码
|
|
45
|
+
uv run python -m codebuddy_proxy --desensitize
|
|
26
46
|
```
|
|
27
47
|
|
|
28
|
-
|
|
48
|
+
首次使用需要登录时:
|
|
29
49
|
|
|
30
50
|
```bash
|
|
31
|
-
|
|
32
|
-
python codebuddy_proxy.py
|
|
51
|
+
uv run python -m codebuddy_proxy --login --desensitize
|
|
33
52
|
```
|
|
34
53
|
|
|
35
54
|
## 快速开始
|
|
@@ -37,11 +56,9 @@ python codebuddy_proxy.py
|
|
|
37
56
|
### 1. 启动 proxy
|
|
38
57
|
|
|
39
58
|
```bash
|
|
40
|
-
#
|
|
41
|
-
uv run codebuddy_proxy
|
|
42
|
-
|
|
43
|
-
# 或传统方式
|
|
44
|
-
python codebuddy_proxy.py --desensitize
|
|
59
|
+
# 使用最新版本(推荐)
|
|
60
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize \
|
|
61
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
45
62
|
```
|
|
46
63
|
|
|
47
64
|
默认监听 `http://127.0.0.1:8787`
|
|
@@ -103,7 +120,7 @@ codex --profile codebuddy "你的任务"
|
|
|
103
120
|
--port PORT 监听端口(默认 8787)
|
|
104
121
|
--endpoint ENDPOINT CodeBuddy 后端地址
|
|
105
122
|
--session-file PATH 会话文件路径(默认 ~/.codebuddy-session.json)
|
|
106
|
-
--log-file PATH JSONL 日志文件(默认
|
|
123
|
+
--log-file PATH JSONL 日志文件(默认 ~/.workbuddy2api/codebuddy-proxy.jsonl)
|
|
107
124
|
--desensitize 启用脱敏处理(推荐)
|
|
108
125
|
--optimize-context 启用消息压缩优化(Codex CLI 推荐)
|
|
109
126
|
--login 启动时执行浏览器登录
|
|
@@ -127,7 +144,8 @@ CODEBUDDY_PROXY_LOG_FILE # 等同 --log-file
|
|
|
127
144
|
### 首次使用(需要登录)
|
|
128
145
|
|
|
129
146
|
```bash
|
|
130
|
-
uv run codebuddy_proxy
|
|
147
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --login \
|
|
148
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
131
149
|
```
|
|
132
150
|
|
|
133
151
|
浏览器打开后登录,成功后 proxy 自动启动。
|
|
@@ -135,29 +153,34 @@ uv run codebuddy_proxy.py --login
|
|
|
135
153
|
### 日常使用(自动读取登录态)
|
|
136
154
|
|
|
137
155
|
```bash
|
|
138
|
-
uv run codebuddy_proxy
|
|
156
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize \
|
|
157
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
139
158
|
```
|
|
140
159
|
|
|
141
160
|
### Codex CLI 场景(启用压缩优化)
|
|
142
161
|
|
|
143
162
|
```bash
|
|
144
|
-
uv run codebuddy_proxy
|
|
163
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize --optimize-context \
|
|
164
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
145
165
|
```
|
|
146
166
|
|
|
147
167
|
### 多账号切换
|
|
148
168
|
|
|
149
169
|
```bash
|
|
150
170
|
# 账号 1
|
|
151
|
-
uv run codebuddy_proxy
|
|
171
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --session-file ~/.codebuddy-work.json --login \
|
|
172
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
152
173
|
|
|
153
174
|
# 账号 2
|
|
154
|
-
uv run codebuddy_proxy
|
|
175
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --session-file ~/.codebuddy-personal.json --login \
|
|
176
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
155
177
|
```
|
|
156
178
|
|
|
157
179
|
### 监听所有网卡(局域网共享)
|
|
158
180
|
|
|
159
181
|
```bash
|
|
160
|
-
uv run codebuddy_proxy
|
|
182
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --host 0.0.0.0 --desensitize \
|
|
183
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
161
184
|
```
|
|
162
185
|
|
|
163
186
|
## API 接口
|
|
@@ -356,7 +379,8 @@ upstream chunk → response.output_text.delta
|
|
|
356
379
|
|
|
357
380
|
```bash
|
|
358
381
|
# 必须启用 --desensitize,否则几乎每次都被拦截
|
|
359
|
-
uv run codebuddy_proxy
|
|
382
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize \
|
|
383
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
360
384
|
|
|
361
385
|
# 在 Claude Code / CC Switch 中配置
|
|
362
386
|
# Base URL: http://127.0.0.1:8787/v1/messages
|
|
@@ -366,7 +390,8 @@ uv run codebuddy_proxy.py --desensitize
|
|
|
366
390
|
|
|
367
391
|
```bash
|
|
368
392
|
# 同时启用脱敏和消息压缩(最佳配置)
|
|
369
|
-
uv run codebuddy_proxy
|
|
393
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize --optimize-context \
|
|
394
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
370
395
|
|
|
371
396
|
# 在 Codex CLI 配置文件中
|
|
372
397
|
# base_url: http://127.0.0.1:8787/v1/responses
|
|
@@ -376,7 +401,8 @@ uv run codebuddy_proxy.py --desensitize --optimize-context
|
|
|
376
401
|
|
|
377
402
|
```bash
|
|
378
403
|
# 启用脱敏以避免合规术语被误拦
|
|
379
|
-
uv run codebuddy_proxy
|
|
404
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize \
|
|
405
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
380
406
|
|
|
381
407
|
# 示例请求
|
|
382
408
|
curl http://127.0.0.1:8787/v1/chat/completions \
|
|
@@ -450,10 +476,12 @@ curl http://127.0.0.1:8787/v1/chat/completions \
|
|
|
450
476
|
|
|
451
477
|
```bash
|
|
452
478
|
# 启用消息压缩
|
|
453
|
-
uv run codebuddy_proxy
|
|
479
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --optimize-context \
|
|
480
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
454
481
|
|
|
455
482
|
# 同时启用两个功能(推荐用于 Codex CLI)
|
|
456
|
-
uv run codebuddy_proxy
|
|
483
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize --optimize-context \
|
|
484
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
457
485
|
```
|
|
458
486
|
|
|
459
487
|
#### 工作原理
|
|
@@ -497,7 +525,7 @@ uv run codebuddy_proxy.py --desensitize --optimize-context
|
|
|
497
525
|
启用功能后,日志会记录压缩统计:
|
|
498
526
|
|
|
499
527
|
```bash
|
|
500
|
-
grep projection_applied
|
|
528
|
+
grep projection_applied "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" | jq .
|
|
501
529
|
```
|
|
502
530
|
|
|
503
531
|
示例输出:
|
|
@@ -528,26 +556,36 @@ grep projection_applied logs/codebuddy-proxy.jsonl | jq .
|
|
|
528
556
|
### 日志
|
|
529
557
|
|
|
530
558
|
日志包含:
|
|
531
|
-
-
|
|
532
|
-
-
|
|
559
|
+
- 文本日志:`$HOME/.workbuddy2api/proxy.log`(按天滚动,保留 30 天)
|
|
560
|
+
- 结构化日志:`$HOME/.workbuddy2api/codebuddy-proxy.jsonl`(按天滚动,保留 30 天,完整请求/响应)
|
|
561
|
+
|
|
562
|
+
JSONL 每条记录包含 `app_version`、`system_version`、`python_version` 和 `machine` 字段;启动时还会记录 `startup` 事件。
|
|
563
|
+
|
|
564
|
+
也可以指定日志文件的绝对路径:
|
|
565
|
+
|
|
566
|
+
```bash
|
|
567
|
+
uv run --with workbuddy2api python -m codebuddy_proxy \
|
|
568
|
+
--desensitize \
|
|
569
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
570
|
+
```
|
|
533
571
|
|
|
534
572
|
查看日志:
|
|
535
573
|
|
|
536
574
|
```bash
|
|
537
575
|
# 实时查看
|
|
538
|
-
tail -f
|
|
576
|
+
tail -f "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
539
577
|
|
|
540
578
|
# 查看流式事件
|
|
541
|
-
tail -100
|
|
579
|
+
tail -100 "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" | jq 'select(.event | startswith("stream"))'
|
|
542
580
|
|
|
543
581
|
# 统计超时
|
|
544
|
-
jq 'select(.event=="stream_timeout")'
|
|
582
|
+
jq 'select(.event=="stream_timeout")' "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" | wc -l
|
|
545
583
|
|
|
546
584
|
# 验证脱敏
|
|
547
|
-
grep desensitize_applied
|
|
585
|
+
grep desensitize_applied "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
548
586
|
|
|
549
587
|
# 验证压缩(查看统计数据)
|
|
550
|
-
grep projection_applied
|
|
588
|
+
grep projection_applied "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" | jq .
|
|
551
589
|
```
|
|
552
590
|
|
|
553
591
|
### 找不到 session 文件
|
|
@@ -555,7 +593,8 @@ grep projection_applied logs/codebuddy-proxy.jsonl | jq .
|
|
|
555
593
|
首次使用需要登录:
|
|
556
594
|
|
|
557
595
|
```bash
|
|
558
|
-
uv run codebuddy_proxy
|
|
596
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --login \
|
|
597
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
559
598
|
```
|
|
560
599
|
|
|
561
600
|
### 401 认证失败
|
|
@@ -563,7 +602,8 @@ uv run codebuddy_proxy.py --login
|
|
|
563
602
|
Token 过期,重新登录:
|
|
564
603
|
|
|
565
604
|
```bash
|
|
566
|
-
uv run codebuddy_proxy
|
|
605
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --login \
|
|
606
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
567
607
|
```
|
|
568
608
|
|
|
569
609
|
### 审核拦截
|
|
@@ -571,20 +611,23 @@ uv run codebuddy_proxy.py --login
|
|
|
571
611
|
启用脱敏:
|
|
572
612
|
|
|
573
613
|
```bash
|
|
574
|
-
uv run codebuddy_proxy
|
|
614
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize \
|
|
615
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
575
616
|
```
|
|
576
617
|
|
|
577
618
|
如果仍然被拦截,尝试压缩优化(仅 `/v1/responses`):
|
|
578
619
|
|
|
579
620
|
```bash
|
|
580
|
-
uv run codebuddy_proxy
|
|
621
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize --optimize-context \
|
|
622
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
581
623
|
```
|
|
582
624
|
|
|
583
625
|
### 端口被占用
|
|
584
626
|
|
|
585
627
|
```bash
|
|
586
628
|
lsof -i :8787
|
|
587
|
-
uv run codebuddy_proxy
|
|
629
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --port 8788 \
|
|
630
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
588
631
|
```
|
|
589
632
|
|
|
590
633
|
### SOCKS proxy 错误
|
|
@@ -599,7 +642,8 @@ env | grep -i proxy
|
|
|
599
642
|
|
|
600
643
|
```bash
|
|
601
644
|
unset http_proxy https_proxy all_proxy
|
|
602
|
-
uv run codebuddy_proxy
|
|
645
|
+
uv run --with workbuddy2api python -m codebuddy_proxy \
|
|
646
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
603
647
|
```
|
|
604
648
|
|
|
605
649
|
## 技术细节
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
1
|
"""Local OpenAI/Responses/Anthropic compatible proxy for CodeBuddy.
|
|
3
2
|
|
|
4
3
|
High-performance async implementation with FastAPI + httpx.
|
|
@@ -9,20 +8,22 @@ Features:
|
|
|
9
8
|
- Robust timeout handling with async iterators
|
|
10
9
|
|
|
11
10
|
Usage with uv:
|
|
12
|
-
uv run codebuddy_proxy
|
|
13
|
-
uv run codebuddy_proxy
|
|
14
|
-
uv run codebuddy_proxy
|
|
11
|
+
uv run --with workbuddy2api python -m codebuddy_proxy
|
|
12
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize
|
|
13
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --host 0.0.0.0 --port 8787
|
|
15
14
|
"""
|
|
16
15
|
|
|
17
16
|
import argparse
|
|
18
17
|
import base64
|
|
19
18
|
import hashlib
|
|
20
19
|
import io
|
|
20
|
+
import importlib.metadata
|
|
21
21
|
import json
|
|
22
22
|
import logging
|
|
23
23
|
import logging.handlers
|
|
24
24
|
import os
|
|
25
25
|
import pathlib
|
|
26
|
+
import platform
|
|
26
27
|
import sys
|
|
27
28
|
import time
|
|
28
29
|
import uuid
|
|
@@ -102,10 +103,40 @@ def setup_logging(log_dir: pathlib.Path) -> logging.Logger:
|
|
|
102
103
|
return logger
|
|
103
104
|
|
|
104
105
|
|
|
106
|
+
def setup_json_logging(log_file: pathlib.Path) -> logging.Logger:
|
|
107
|
+
"""配置 JSONL 滚动日志:按天分片,保留30天。"""
|
|
108
|
+
logger = logging.getLogger("codebuddy_proxy.jsonl")
|
|
109
|
+
logger.setLevel(logging.INFO)
|
|
110
|
+
logger.propagate = False
|
|
111
|
+
logger.handlers.clear()
|
|
112
|
+
|
|
113
|
+
handler = logging.handlers.TimedRotatingFileHandler(
|
|
114
|
+
log_file, when="midnight", interval=1, backupCount=30, encoding="utf-8"
|
|
115
|
+
)
|
|
116
|
+
handler.suffix = "%Y-%m-%d"
|
|
117
|
+
handler.setFormatter(logging.Formatter("%(message)s"))
|
|
118
|
+
logger.addHandler(handler)
|
|
119
|
+
|
|
120
|
+
return logger
|
|
121
|
+
|
|
122
|
+
|
|
105
123
|
def now_s() -> int:
|
|
106
124
|
return int(time.time())
|
|
107
125
|
|
|
108
126
|
|
|
127
|
+
def get_runtime_info() -> dict[str, str]:
|
|
128
|
+
try:
|
|
129
|
+
app_version = importlib.metadata.version("workbuddy2api")
|
|
130
|
+
except importlib.metadata.PackageNotFoundError:
|
|
131
|
+
app_version = "unknown"
|
|
132
|
+
return {
|
|
133
|
+
"app_version": app_version,
|
|
134
|
+
"system_version": platform.platform(),
|
|
135
|
+
"python_version": platform.python_version(),
|
|
136
|
+
"machine": platform.machine(),
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
|
|
109
140
|
# ============================================================================
|
|
110
141
|
# 全局状态管理
|
|
111
142
|
# ============================================================================
|
|
@@ -122,6 +153,7 @@ class ProxyState:
|
|
|
122
153
|
enable_optimize_context: bool = False,
|
|
123
154
|
verbose_llm: bool = False,
|
|
124
155
|
logger: logging.Logger | None = None,
|
|
156
|
+
json_logger: logging.Logger | None = None,
|
|
125
157
|
):
|
|
126
158
|
self.client = client
|
|
127
159
|
self.mock_dir = mock_dir
|
|
@@ -130,6 +162,8 @@ class ProxyState:
|
|
|
130
162
|
self.enable_optimize_context = enable_optimize_context
|
|
131
163
|
self.verbose_llm = verbose_llm
|
|
132
164
|
self.logger = logger
|
|
165
|
+
self.json_logger = json_logger
|
|
166
|
+
self.runtime_info = get_runtime_info()
|
|
133
167
|
self.started_at = time.time()
|
|
134
168
|
|
|
135
169
|
def ensure_auth(self) -> None:
|
|
@@ -137,29 +171,33 @@ class ProxyState:
|
|
|
137
171
|
self.client.ensure_authenticated()
|
|
138
172
|
|
|
139
173
|
def write_log(self, event: str, **kwargs) -> None:
|
|
140
|
-
if self.
|
|
174
|
+
if self.json_logger is None:
|
|
141
175
|
return
|
|
142
176
|
try:
|
|
143
|
-
record = {
|
|
144
|
-
|
|
145
|
-
|
|
177
|
+
record = {
|
|
178
|
+
"timestamp": time.strftime("%Y-%m-%dT%H:%M:%S%z"),
|
|
179
|
+
"event": event,
|
|
180
|
+
**self.runtime_info,
|
|
181
|
+
**kwargs,
|
|
182
|
+
}
|
|
183
|
+
self.json_logger.info(json.dumps(record, ensure_ascii=False))
|
|
146
184
|
except Exception:
|
|
147
185
|
pass
|
|
148
186
|
|
|
149
187
|
def write_body_log(self, event: str, body: bytes, **kwargs) -> None:
|
|
150
|
-
if self.
|
|
188
|
+
if self.json_logger is None:
|
|
151
189
|
return
|
|
152
190
|
try:
|
|
153
191
|
text = body.decode("utf-8", errors="replace")
|
|
154
192
|
record = {
|
|
155
193
|
"timestamp": time.strftime("%Y-%m-%dT%H:%M:%S%z"),
|
|
156
194
|
"event": event,
|
|
195
|
+
**self.runtime_info,
|
|
157
196
|
"body_bytes": len(body),
|
|
158
197
|
"body_text": text,
|
|
159
198
|
**kwargs
|
|
160
199
|
}
|
|
161
|
-
|
|
162
|
-
f.write(json.dumps(record, ensure_ascii=False) + "\n")
|
|
200
|
+
self.json_logger.info(json.dumps(record, ensure_ascii=False))
|
|
163
201
|
except Exception:
|
|
164
202
|
pass
|
|
165
203
|
|
|
@@ -1501,9 +1539,18 @@ def main():
|
|
|
1501
1539
|
help="会话文件路径")
|
|
1502
1540
|
parser.add_argument("--mock-dir", type=pathlib.Path,
|
|
1503
1541
|
help="只使用指定目录中的真实响应 fixture,不访问 CodeBuddy 后端")
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1542
|
+
default_log_file = pathlib.Path(
|
|
1543
|
+
os.getenv(
|
|
1544
|
+
"CODEBUDDY_PROXY_LOG_FILE",
|
|
1545
|
+
str(pathlib.Path.home() / ".workbuddy2api" / "codebuddy-proxy.jsonl"),
|
|
1546
|
+
)
|
|
1547
|
+
).expanduser()
|
|
1548
|
+
parser.add_argument(
|
|
1549
|
+
"--log-file",
|
|
1550
|
+
type=pathlib.Path,
|
|
1551
|
+
default=default_log_file,
|
|
1552
|
+
help="记录完整请求/响应的 JSONL 文件(默认 ~/.workbuddy2api/codebuddy-proxy.jsonl)",
|
|
1553
|
+
)
|
|
1507
1554
|
parser.add_argument("--desensitize", action="store_true",
|
|
1508
1555
|
help="启用脱敏处理,对 system 消息中的敏感词插入零宽空格(缓解审核误拦)")
|
|
1509
1556
|
parser.add_argument("--optimize-context", action="store_true",
|
|
@@ -1519,10 +1566,12 @@ def main():
|
|
|
1519
1566
|
parser.add_argument("--config-cache-ttl", type=int, default=int(os.getenv("CODEBUDDY_CONFIG_CACHE_TTL", "300")),
|
|
1520
1567
|
help="远程配置缓存 TTL(秒,默认 300)")
|
|
1521
1568
|
args = parser.parse_args()
|
|
1569
|
+
args.log_file = args.log_file.expanduser()
|
|
1522
1570
|
|
|
1523
1571
|
# 设置日志
|
|
1524
1572
|
log_dir = args.log_file.parent if args.log_file else pathlib.Path("logs")
|
|
1525
1573
|
logger = setup_logging(log_dir)
|
|
1574
|
+
json_logger = setup_json_logging(args.log_file)
|
|
1526
1575
|
|
|
1527
1576
|
# 初始化客户端
|
|
1528
1577
|
client = CodeBuddyClient(args.endpoint, session_file=args.session_file)
|
|
@@ -1539,7 +1588,20 @@ def main():
|
|
|
1539
1588
|
enable_desensitize=args.desensitize,
|
|
1540
1589
|
enable_optimize_context=args.optimize_context,
|
|
1541
1590
|
verbose_llm=args.verbose_llm,
|
|
1542
|
-
logger=logger
|
|
1591
|
+
logger=logger,
|
|
1592
|
+
json_logger=json_logger,
|
|
1593
|
+
)
|
|
1594
|
+
proxy_state.write_log(
|
|
1595
|
+
"startup",
|
|
1596
|
+
host=args.host,
|
|
1597
|
+
port=args.port,
|
|
1598
|
+
)
|
|
1599
|
+
logger.info(
|
|
1600
|
+
"Runtime: app_version=%s system_version=%s python_version=%s machine=%s",
|
|
1601
|
+
proxy_state.runtime_info["app_version"],
|
|
1602
|
+
proxy_state.runtime_info["system_version"],
|
|
1603
|
+
proxy_state.runtime_info["python_version"],
|
|
1604
|
+
proxy_state.runtime_info["machine"],
|
|
1543
1605
|
)
|
|
1544
1606
|
|
|
1545
1607
|
# 初始化远程配置缓存(默认启用动态模型列表)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: workbuddy2api
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.2
|
|
4
4
|
Summary: Local OpenAI/Responses/Anthropic compatible proxy for CodeBuddy
|
|
5
5
|
Requires-Python: >=3.10
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -30,21 +30,40 @@ Dynamic: license-file
|
|
|
30
30
|
|
|
31
31
|
## 安装
|
|
32
32
|
|
|
33
|
-
推荐使用 [uv](https://docs.astral.sh/uv/)
|
|
33
|
+
推荐使用 [uv](https://docs.astral.sh/uv/) 从 PyPI 运行:
|
|
34
34
|
|
|
35
35
|
```bash
|
|
36
36
|
# 安装 uv
|
|
37
37
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
38
38
|
|
|
39
|
-
#
|
|
40
|
-
uv run codebuddy_proxy
|
|
39
|
+
# 运行最新可用版本(uv 会自动创建环境并安装依赖)
|
|
40
|
+
uv run --with workbuddy2api python -m codebuddy_proxy \
|
|
41
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
42
|
+
|
|
43
|
+
# 强制刷新缓存后运行最新版本
|
|
44
|
+
uv run --refresh-package workbuddy2api --with workbuddy2api \
|
|
45
|
+
python -m codebuddy_proxy \
|
|
46
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
后续启动无需手动激活虚拟环境,重复执行上述 `uv run` 命令即可。
|
|
50
|
+
|
|
51
|
+
### 本地源码启动
|
|
52
|
+
|
|
53
|
+
在项目根目录执行以下命令,使用当前工作区源码而不是 PyPI 中的已发布版本:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# 同步本地项目依赖
|
|
57
|
+
uv sync
|
|
58
|
+
|
|
59
|
+
# 启动本地源码
|
|
60
|
+
uv run python -m codebuddy_proxy --desensitize
|
|
41
61
|
```
|
|
42
62
|
|
|
43
|
-
|
|
63
|
+
首次使用需要登录时:
|
|
44
64
|
|
|
45
65
|
```bash
|
|
46
|
-
|
|
47
|
-
python codebuddy_proxy.py
|
|
66
|
+
uv run python -m codebuddy_proxy --login --desensitize
|
|
48
67
|
```
|
|
49
68
|
|
|
50
69
|
## 快速开始
|
|
@@ -52,11 +71,9 @@ python codebuddy_proxy.py
|
|
|
52
71
|
### 1. 启动 proxy
|
|
53
72
|
|
|
54
73
|
```bash
|
|
55
|
-
#
|
|
56
|
-
uv run codebuddy_proxy
|
|
57
|
-
|
|
58
|
-
# 或传统方式
|
|
59
|
-
python codebuddy_proxy.py --desensitize
|
|
74
|
+
# 使用最新版本(推荐)
|
|
75
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize \
|
|
76
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
60
77
|
```
|
|
61
78
|
|
|
62
79
|
默认监听 `http://127.0.0.1:8787`
|
|
@@ -118,7 +135,7 @@ codex --profile codebuddy "你的任务"
|
|
|
118
135
|
--port PORT 监听端口(默认 8787)
|
|
119
136
|
--endpoint ENDPOINT CodeBuddy 后端地址
|
|
120
137
|
--session-file PATH 会话文件路径(默认 ~/.codebuddy-session.json)
|
|
121
|
-
--log-file PATH JSONL 日志文件(默认
|
|
138
|
+
--log-file PATH JSONL 日志文件(默认 ~/.workbuddy2api/codebuddy-proxy.jsonl)
|
|
122
139
|
--desensitize 启用脱敏处理(推荐)
|
|
123
140
|
--optimize-context 启用消息压缩优化(Codex CLI 推荐)
|
|
124
141
|
--login 启动时执行浏览器登录
|
|
@@ -142,7 +159,8 @@ CODEBUDDY_PROXY_LOG_FILE # 等同 --log-file
|
|
|
142
159
|
### 首次使用(需要登录)
|
|
143
160
|
|
|
144
161
|
```bash
|
|
145
|
-
uv run codebuddy_proxy
|
|
162
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --login \
|
|
163
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
146
164
|
```
|
|
147
165
|
|
|
148
166
|
浏览器打开后登录,成功后 proxy 自动启动。
|
|
@@ -150,29 +168,34 @@ uv run codebuddy_proxy.py --login
|
|
|
150
168
|
### 日常使用(自动读取登录态)
|
|
151
169
|
|
|
152
170
|
```bash
|
|
153
|
-
uv run codebuddy_proxy
|
|
171
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize \
|
|
172
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
154
173
|
```
|
|
155
174
|
|
|
156
175
|
### Codex CLI 场景(启用压缩优化)
|
|
157
176
|
|
|
158
177
|
```bash
|
|
159
|
-
uv run codebuddy_proxy
|
|
178
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize --optimize-context \
|
|
179
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
160
180
|
```
|
|
161
181
|
|
|
162
182
|
### 多账号切换
|
|
163
183
|
|
|
164
184
|
```bash
|
|
165
185
|
# 账号 1
|
|
166
|
-
uv run codebuddy_proxy
|
|
186
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --session-file ~/.codebuddy-work.json --login \
|
|
187
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
167
188
|
|
|
168
189
|
# 账号 2
|
|
169
|
-
uv run codebuddy_proxy
|
|
190
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --session-file ~/.codebuddy-personal.json --login \
|
|
191
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
170
192
|
```
|
|
171
193
|
|
|
172
194
|
### 监听所有网卡(局域网共享)
|
|
173
195
|
|
|
174
196
|
```bash
|
|
175
|
-
uv run codebuddy_proxy
|
|
197
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --host 0.0.0.0 --desensitize \
|
|
198
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
176
199
|
```
|
|
177
200
|
|
|
178
201
|
## API 接口
|
|
@@ -371,7 +394,8 @@ upstream chunk → response.output_text.delta
|
|
|
371
394
|
|
|
372
395
|
```bash
|
|
373
396
|
# 必须启用 --desensitize,否则几乎每次都被拦截
|
|
374
|
-
uv run codebuddy_proxy
|
|
397
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize \
|
|
398
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
375
399
|
|
|
376
400
|
# 在 Claude Code / CC Switch 中配置
|
|
377
401
|
# Base URL: http://127.0.0.1:8787/v1/messages
|
|
@@ -381,7 +405,8 @@ uv run codebuddy_proxy.py --desensitize
|
|
|
381
405
|
|
|
382
406
|
```bash
|
|
383
407
|
# 同时启用脱敏和消息压缩(最佳配置)
|
|
384
|
-
uv run codebuddy_proxy
|
|
408
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize --optimize-context \
|
|
409
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
385
410
|
|
|
386
411
|
# 在 Codex CLI 配置文件中
|
|
387
412
|
# base_url: http://127.0.0.1:8787/v1/responses
|
|
@@ -391,7 +416,8 @@ uv run codebuddy_proxy.py --desensitize --optimize-context
|
|
|
391
416
|
|
|
392
417
|
```bash
|
|
393
418
|
# 启用脱敏以避免合规术语被误拦
|
|
394
|
-
uv run codebuddy_proxy
|
|
419
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize \
|
|
420
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
395
421
|
|
|
396
422
|
# 示例请求
|
|
397
423
|
curl http://127.0.0.1:8787/v1/chat/completions \
|
|
@@ -465,10 +491,12 @@ curl http://127.0.0.1:8787/v1/chat/completions \
|
|
|
465
491
|
|
|
466
492
|
```bash
|
|
467
493
|
# 启用消息压缩
|
|
468
|
-
uv run codebuddy_proxy
|
|
494
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --optimize-context \
|
|
495
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
469
496
|
|
|
470
497
|
# 同时启用两个功能(推荐用于 Codex CLI)
|
|
471
|
-
uv run codebuddy_proxy
|
|
498
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize --optimize-context \
|
|
499
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
472
500
|
```
|
|
473
501
|
|
|
474
502
|
#### 工作原理
|
|
@@ -512,7 +540,7 @@ uv run codebuddy_proxy.py --desensitize --optimize-context
|
|
|
512
540
|
启用功能后,日志会记录压缩统计:
|
|
513
541
|
|
|
514
542
|
```bash
|
|
515
|
-
grep projection_applied
|
|
543
|
+
grep projection_applied "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" | jq .
|
|
516
544
|
```
|
|
517
545
|
|
|
518
546
|
示例输出:
|
|
@@ -543,26 +571,36 @@ grep projection_applied logs/codebuddy-proxy.jsonl | jq .
|
|
|
543
571
|
### 日志
|
|
544
572
|
|
|
545
573
|
日志包含:
|
|
546
|
-
-
|
|
547
|
-
-
|
|
574
|
+
- 文本日志:`$HOME/.workbuddy2api/proxy.log`(按天滚动,保留 30 天)
|
|
575
|
+
- 结构化日志:`$HOME/.workbuddy2api/codebuddy-proxy.jsonl`(按天滚动,保留 30 天,完整请求/响应)
|
|
576
|
+
|
|
577
|
+
JSONL 每条记录包含 `app_version`、`system_version`、`python_version` 和 `machine` 字段;启动时还会记录 `startup` 事件。
|
|
578
|
+
|
|
579
|
+
也可以指定日志文件的绝对路径:
|
|
580
|
+
|
|
581
|
+
```bash
|
|
582
|
+
uv run --with workbuddy2api python -m codebuddy_proxy \
|
|
583
|
+
--desensitize \
|
|
584
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
585
|
+
```
|
|
548
586
|
|
|
549
587
|
查看日志:
|
|
550
588
|
|
|
551
589
|
```bash
|
|
552
590
|
# 实时查看
|
|
553
|
-
tail -f
|
|
591
|
+
tail -f "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
554
592
|
|
|
555
593
|
# 查看流式事件
|
|
556
|
-
tail -100
|
|
594
|
+
tail -100 "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" | jq 'select(.event | startswith("stream"))'
|
|
557
595
|
|
|
558
596
|
# 统计超时
|
|
559
|
-
jq 'select(.event=="stream_timeout")'
|
|
597
|
+
jq 'select(.event=="stream_timeout")' "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" | wc -l
|
|
560
598
|
|
|
561
599
|
# 验证脱敏
|
|
562
|
-
grep desensitize_applied
|
|
600
|
+
grep desensitize_applied "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
563
601
|
|
|
564
602
|
# 验证压缩(查看统计数据)
|
|
565
|
-
grep projection_applied
|
|
603
|
+
grep projection_applied "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" | jq .
|
|
566
604
|
```
|
|
567
605
|
|
|
568
606
|
### 找不到 session 文件
|
|
@@ -570,7 +608,8 @@ grep projection_applied logs/codebuddy-proxy.jsonl | jq .
|
|
|
570
608
|
首次使用需要登录:
|
|
571
609
|
|
|
572
610
|
```bash
|
|
573
|
-
uv run codebuddy_proxy
|
|
611
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --login \
|
|
612
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
574
613
|
```
|
|
575
614
|
|
|
576
615
|
### 401 认证失败
|
|
@@ -578,7 +617,8 @@ uv run codebuddy_proxy.py --login
|
|
|
578
617
|
Token 过期,重新登录:
|
|
579
618
|
|
|
580
619
|
```bash
|
|
581
|
-
uv run codebuddy_proxy
|
|
620
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --login \
|
|
621
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
582
622
|
```
|
|
583
623
|
|
|
584
624
|
### 审核拦截
|
|
@@ -586,20 +626,23 @@ uv run codebuddy_proxy.py --login
|
|
|
586
626
|
启用脱敏:
|
|
587
627
|
|
|
588
628
|
```bash
|
|
589
|
-
uv run codebuddy_proxy
|
|
629
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize \
|
|
630
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
590
631
|
```
|
|
591
632
|
|
|
592
633
|
如果仍然被拦截,尝试压缩优化(仅 `/v1/responses`):
|
|
593
634
|
|
|
594
635
|
```bash
|
|
595
|
-
uv run codebuddy_proxy
|
|
636
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --desensitize --optimize-context \
|
|
637
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
596
638
|
```
|
|
597
639
|
|
|
598
640
|
### 端口被占用
|
|
599
641
|
|
|
600
642
|
```bash
|
|
601
643
|
lsof -i :8787
|
|
602
|
-
uv run codebuddy_proxy
|
|
644
|
+
uv run --with workbuddy2api python -m codebuddy_proxy --port 8788 \
|
|
645
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
603
646
|
```
|
|
604
647
|
|
|
605
648
|
### SOCKS proxy 错误
|
|
@@ -614,7 +657,8 @@ env | grep -i proxy
|
|
|
614
657
|
|
|
615
658
|
```bash
|
|
616
659
|
unset http_proxy https_proxy all_proxy
|
|
617
|
-
uv run codebuddy_proxy
|
|
660
|
+
uv run --with workbuddy2api python -m codebuddy_proxy \
|
|
661
|
+
--log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
|
|
618
662
|
```
|
|
619
663
|
|
|
620
664
|
## 技术细节
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|