workbuddy2api 2.0.1__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.
Files changed (19) hide show
  1. {workbuddy2api-2.0.1 → workbuddy2api-2.0.2}/PKG-INFO +82 -38
  2. {workbuddy2api-2.0.1 → workbuddy2api-2.0.2}/README.md +81 -37
  3. {workbuddy2api-2.0.1 → workbuddy2api-2.0.2}/pyproject.toml +1 -1
  4. {workbuddy2api-2.0.1 → workbuddy2api-2.0.2}/src/codebuddy_proxy/__main__.py +77 -14
  5. {workbuddy2api-2.0.1 → workbuddy2api-2.0.2}/src/workbuddy2api.egg-info/PKG-INFO +82 -38
  6. {workbuddy2api-2.0.1 → workbuddy2api-2.0.2}/LICENSE +0 -0
  7. {workbuddy2api-2.0.1 → workbuddy2api-2.0.2}/setup.cfg +0 -0
  8. {workbuddy2api-2.0.1 → workbuddy2api-2.0.2}/src/codebuddy_proxy/anthropic_adapter.py +0 -0
  9. {workbuddy2api-2.0.1 → workbuddy2api-2.0.2}/src/codebuddy_proxy/codebuddy_client_demo.py +0 -0
  10. {workbuddy2api-2.0.1 → workbuddy2api-2.0.2}/src/codebuddy_proxy/desensitize.py +0 -0
  11. {workbuddy2api-2.0.1 → workbuddy2api-2.0.2}/src/codebuddy_proxy/dsml_parser.py +0 -0
  12. {workbuddy2api-2.0.1 → workbuddy2api-2.0.2}/src/codebuddy_proxy/projection_metadata.py +0 -0
  13. {workbuddy2api-2.0.1 → workbuddy2api-2.0.2}/src/codebuddy_proxy/responses_adapter.py +0 -0
  14. {workbuddy2api-2.0.1 → workbuddy2api-2.0.2}/src/codebuddy_proxy/responses_projection.py +0 -0
  15. {workbuddy2api-2.0.1 → workbuddy2api-2.0.2}/src/workbuddy2api.egg-info/SOURCES.txt +0 -0
  16. {workbuddy2api-2.0.1 → workbuddy2api-2.0.2}/src/workbuddy2api.egg-info/dependency_links.txt +0 -0
  17. {workbuddy2api-2.0.1 → workbuddy2api-2.0.2}/src/workbuddy2api.egg-info/entry_points.txt +0 -0
  18. {workbuddy2api-2.0.1 → workbuddy2api-2.0.2}/src/workbuddy2api.egg-info/requires.txt +0 -0
  19. {workbuddy2api-2.0.1 → 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.1
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
- # 直接运行(uv 会自动安装依赖)
40
- uv run codebuddy_proxy.py
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
- pip install -r requirements.txt
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
- # 使用 uv(推荐)
56
- uv run codebuddy_proxy.py --desensitize
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 日志文件(默认 logs/codebuddy-proxy.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.py --login
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.py --desensitize
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.py --desensitize --optimize-context
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.py --session-file ~/.codebuddy-work.json --login
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.py --session-file ~/.codebuddy-personal.json --login
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.py --host 0.0.0.0 --desensitize
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.py --desensitize
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.py --desensitize --optimize-context
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.py --desensitize
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.py --optimize-context
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.py --desensitize --optimize-context
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 logs/codebuddy-proxy.jsonl | jq .
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
- - 文本日志:`logs/proxy.log`(按天滚动,保留 30 天)
547
- - 结构化日志:`logs/codebuddy-proxy.jsonl`(完整请求/响应,包含流式细节)
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 logs/codebuddy-proxy.jsonl
591
+ tail -f "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
554
592
 
555
593
  # 查看流式事件
556
- tail -100 logs/codebuddy-proxy.jsonl | jq 'select(.event | startswith("stream"))'
594
+ tail -100 "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" | jq 'select(.event | startswith("stream"))'
557
595
 
558
596
  # 统计超时
559
- jq 'select(.event=="stream_timeout")' logs/codebuddy-proxy.jsonl | wc -l
597
+ jq 'select(.event=="stream_timeout")' "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" | wc -l
560
598
 
561
599
  # 验证脱敏
562
- grep desensitize_applied logs/codebuddy-proxy.jsonl
600
+ grep desensitize_applied "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
563
601
 
564
602
  # 验证压缩(查看统计数据)
565
- grep projection_applied logs/codebuddy-proxy.jsonl | jq .
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.py --login
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.py --login
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.py --desensitize
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.py --desensitize --optimize-context
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.py --port 8788
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.py
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
- # 直接运行(uv 会自动安装依赖)
25
- uv run codebuddy_proxy.py
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
- pip install -r requirements.txt
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
- # 使用 uv(推荐)
41
- uv run codebuddy_proxy.py --desensitize
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 日志文件(默认 logs/codebuddy-proxy.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.py --login
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.py --desensitize
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.py --desensitize --optimize-context
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.py --session-file ~/.codebuddy-work.json --login
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.py --session-file ~/.codebuddy-personal.json --login
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.py --host 0.0.0.0 --desensitize
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.py --desensitize
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.py --desensitize --optimize-context
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.py --desensitize
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.py --optimize-context
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.py --desensitize --optimize-context
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 logs/codebuddy-proxy.jsonl | jq .
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
- - 文本日志:`logs/proxy.log`(按天滚动,保留 30 天)
532
- - 结构化日志:`logs/codebuddy-proxy.jsonl`(完整请求/响应,包含流式细节)
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 logs/codebuddy-proxy.jsonl
576
+ tail -f "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
539
577
 
540
578
  # 查看流式事件
541
- tail -100 logs/codebuddy-proxy.jsonl | jq 'select(.event | startswith("stream"))'
579
+ tail -100 "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" | jq 'select(.event | startswith("stream"))'
542
580
 
543
581
  # 统计超时
544
- jq 'select(.event=="stream_timeout")' logs/codebuddy-proxy.jsonl | wc -l
582
+ jq 'select(.event=="stream_timeout")' "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" | wc -l
545
583
 
546
584
  # 验证脱敏
547
- grep desensitize_applied logs/codebuddy-proxy.jsonl
585
+ grep desensitize_applied "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
548
586
 
549
587
  # 验证压缩(查看统计数据)
550
- grep projection_applied logs/codebuddy-proxy.jsonl | jq .
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.py --login
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.py --login
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.py --desensitize
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.py --desensitize --optimize-context
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.py --port 8788
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.py
645
+ uv run --with workbuddy2api python -m codebuddy_proxy \
646
+ --log-file "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
603
647
  ```
604
648
 
605
649
  ## 技术细节
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "workbuddy2api"
3
- version = "2.0.1"
3
+ version = "2.0.2"
4
4
  description = "Local OpenAI/Responses/Anthropic compatible proxy for CodeBuddy"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -8,20 +8,22 @@ Features:
8
8
  - Robust timeout handling with async iterators
9
9
 
10
10
  Usage with uv:
11
- uv run codebuddy_proxy.py
12
- uv run codebuddy_proxy.py --desensitize
13
- uv run codebuddy_proxy.py --host 0.0.0.0 --port 8787
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
14
14
  """
15
15
 
16
16
  import argparse
17
17
  import base64
18
18
  import hashlib
19
19
  import io
20
+ import importlib.metadata
20
21
  import json
21
22
  import logging
22
23
  import logging.handlers
23
24
  import os
24
25
  import pathlib
26
+ import platform
25
27
  import sys
26
28
  import time
27
29
  import uuid
@@ -101,10 +103,40 @@ def setup_logging(log_dir: pathlib.Path) -> logging.Logger:
101
103
  return logger
102
104
 
103
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
+
104
123
  def now_s() -> int:
105
124
  return int(time.time())
106
125
 
107
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
+
108
140
  # ============================================================================
109
141
  # 全局状态管理
110
142
  # ============================================================================
@@ -121,6 +153,7 @@ class ProxyState:
121
153
  enable_optimize_context: bool = False,
122
154
  verbose_llm: bool = False,
123
155
  logger: logging.Logger | None = None,
156
+ json_logger: logging.Logger | None = None,
124
157
  ):
125
158
  self.client = client
126
159
  self.mock_dir = mock_dir
@@ -129,6 +162,8 @@ class ProxyState:
129
162
  self.enable_optimize_context = enable_optimize_context
130
163
  self.verbose_llm = verbose_llm
131
164
  self.logger = logger
165
+ self.json_logger = json_logger
166
+ self.runtime_info = get_runtime_info()
132
167
  self.started_at = time.time()
133
168
 
134
169
  def ensure_auth(self) -> None:
@@ -136,29 +171,33 @@ class ProxyState:
136
171
  self.client.ensure_authenticated()
137
172
 
138
173
  def write_log(self, event: str, **kwargs) -> None:
139
- if self.log_file is None:
174
+ if self.json_logger is None:
140
175
  return
141
176
  try:
142
- record = {"timestamp": time.strftime("%Y-%m-%dT%H:%M:%S%z"), "event": event, **kwargs}
143
- with open(self.log_file, "a", encoding="utf-8") as f:
144
- f.write(json.dumps(record, ensure_ascii=False) + "\n")
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))
145
184
  except Exception:
146
185
  pass
147
186
 
148
187
  def write_body_log(self, event: str, body: bytes, **kwargs) -> None:
149
- if self.log_file is None:
188
+ if self.json_logger is None:
150
189
  return
151
190
  try:
152
191
  text = body.decode("utf-8", errors="replace")
153
192
  record = {
154
193
  "timestamp": time.strftime("%Y-%m-%dT%H:%M:%S%z"),
155
194
  "event": event,
195
+ **self.runtime_info,
156
196
  "body_bytes": len(body),
157
197
  "body_text": text,
158
198
  **kwargs
159
199
  }
160
- with open(self.log_file, "a", encoding="utf-8") as f:
161
- f.write(json.dumps(record, ensure_ascii=False) + "\n")
200
+ self.json_logger.info(json.dumps(record, ensure_ascii=False))
162
201
  except Exception:
163
202
  pass
164
203
 
@@ -1500,9 +1539,18 @@ def main():
1500
1539
  help="会话文件路径")
1501
1540
  parser.add_argument("--mock-dir", type=pathlib.Path,
1502
1541
  help="只使用指定目录中的真实响应 fixture,不访问 CodeBuddy 后端")
1503
- parser.add_argument("--log-file", type=pathlib.Path,
1504
- default=pathlib.Path(os.getenv("CODEBUDDY_PROXY_LOG_FILE", "logs/codebuddy-proxy.jsonl")),
1505
- help="记录完整请求/响应的 JSONL 文件(默认 logs/codebuddy-proxy.jsonl)")
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
+ )
1506
1554
  parser.add_argument("--desensitize", action="store_true",
1507
1555
  help="启用脱敏处理,对 system 消息中的敏感词插入零宽空格(缓解审核误拦)")
1508
1556
  parser.add_argument("--optimize-context", action="store_true",
@@ -1518,10 +1566,12 @@ def main():
1518
1566
  parser.add_argument("--config-cache-ttl", type=int, default=int(os.getenv("CODEBUDDY_CONFIG_CACHE_TTL", "300")),
1519
1567
  help="远程配置缓存 TTL(秒,默认 300)")
1520
1568
  args = parser.parse_args()
1569
+ args.log_file = args.log_file.expanduser()
1521
1570
 
1522
1571
  # 设置日志
1523
1572
  log_dir = args.log_file.parent if args.log_file else pathlib.Path("logs")
1524
1573
  logger = setup_logging(log_dir)
1574
+ json_logger = setup_json_logging(args.log_file)
1525
1575
 
1526
1576
  # 初始化客户端
1527
1577
  client = CodeBuddyClient(args.endpoint, session_file=args.session_file)
@@ -1538,7 +1588,20 @@ def main():
1538
1588
  enable_desensitize=args.desensitize,
1539
1589
  enable_optimize_context=args.optimize_context,
1540
1590
  verbose_llm=args.verbose_llm,
1541
- 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"],
1542
1605
  )
1543
1606
 
1544
1607
  # 初始化远程配置缓存(默认启用动态模型列表)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: workbuddy2api
3
- Version: 2.0.1
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
- # 直接运行(uv 会自动安装依赖)
40
- uv run codebuddy_proxy.py
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
- pip install -r requirements.txt
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
- # 使用 uv(推荐)
56
- uv run codebuddy_proxy.py --desensitize
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 日志文件(默认 logs/codebuddy-proxy.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.py --login
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.py --desensitize
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.py --desensitize --optimize-context
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.py --session-file ~/.codebuddy-work.json --login
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.py --session-file ~/.codebuddy-personal.json --login
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.py --host 0.0.0.0 --desensitize
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.py --desensitize
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.py --desensitize --optimize-context
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.py --desensitize
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.py --optimize-context
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.py --desensitize --optimize-context
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 logs/codebuddy-proxy.jsonl | jq .
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
- - 文本日志:`logs/proxy.log`(按天滚动,保留 30 天)
547
- - 结构化日志:`logs/codebuddy-proxy.jsonl`(完整请求/响应,包含流式细节)
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 logs/codebuddy-proxy.jsonl
591
+ tail -f "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
554
592
 
555
593
  # 查看流式事件
556
- tail -100 logs/codebuddy-proxy.jsonl | jq 'select(.event | startswith("stream"))'
594
+ tail -100 "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" | jq 'select(.event | startswith("stream"))'
557
595
 
558
596
  # 统计超时
559
- jq 'select(.event=="stream_timeout")' logs/codebuddy-proxy.jsonl | wc -l
597
+ jq 'select(.event=="stream_timeout")' "$HOME/.workbuddy2api/codebuddy-proxy.jsonl" | wc -l
560
598
 
561
599
  # 验证脱敏
562
- grep desensitize_applied logs/codebuddy-proxy.jsonl
600
+ grep desensitize_applied "$HOME/.workbuddy2api/codebuddy-proxy.jsonl"
563
601
 
564
602
  # 验证压缩(查看统计数据)
565
- grep projection_applied logs/codebuddy-proxy.jsonl | jq .
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.py --login
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.py --login
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.py --desensitize
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.py --desensitize --optimize-context
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.py --port 8788
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.py
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