billion-context 0.1.23 → 0.1.25
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/README.md +148 -171
- package/README.zh-CN.md +108 -118
- package/dist/index.js +18990 -447
- package/dist/index.js.map +1 -1
- package/package.json +3 -1
package/README.zh-CN.md
CHANGED
|
@@ -42,134 +42,130 @@ npm install -g billion-context
|
|
|
42
42
|
|
|
43
43
|
## 快速上手
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
两种方式 —— 任选其一:
|
|
46
|
+
|
|
47
|
+
- **零配置(最简单):** 在客户端 baseURL 前面加上代理地址 + `/bili/`。无需配置文件 —— context 窗口自动从 [models.dev](https://models.dev) registry 查询。`/bili/` 前缀还是个自检测信号:billion-context 的客户端扩展(billion-context-pi / opencode-acp)能在自己的 baseUrl 里认出它并自禁用,避免双层压缩。
|
|
48
|
+
- **显式 context 窗口覆盖:** 在配置文件(或网页)里按 URL 声明 context 窗口,用于 registry 不认识的端点,或想钉死一个精确值的场景。两种方式路由都是同一个 `/bili/` 前缀 —— 配置只改变代理用哪个 context 窗口。
|
|
49
|
+
|
|
46
50
|
压缩是自动注入的 —— 你只需配置路由,无需配置压缩本身。
|
|
47
51
|
|
|
48
|
-
###
|
|
52
|
+
### 方式 A —— 零配置(`/bili/` 前缀)
|
|
53
|
+
|
|
54
|
+
启动代理:
|
|
49
55
|
|
|
50
56
|
```bash
|
|
51
57
|
bili
|
|
52
58
|
```
|
|
53
59
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
点击[http://localhost:8787/__acp/](http://localhost:8787/__acp/) 添加你的模型
|
|
57
|
-
<img width="2908" height="1787" alt="image" src="https://github.com/user-attachments/assets/cacf4b64-e5c6-41f2-b270-fd2be02eab0c" />
|
|
58
|
-
|
|
59
|
-
### 第 2 步 —— 编辑配置文件
|
|
60
|
+
然后把客户端现有的 baseURL 前面加上 `http://localhost:8787/bili/` 就行。完整上游 URL 嵌在路径里,proxy 无需任何配置就知道转发到哪:
|
|
60
61
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
### 第 3 步 —— 把客户端指向代理
|
|
62
|
+
```
|
|
63
|
+
客户端 baseURL 之前: https://api.openai.com/v1
|
|
64
|
+
客户端 baseURL 之后: http://localhost:8787/bili/https://api.openai.com/v1
|
|
65
|
+
```
|
|
67
66
|
|
|
68
|
-
|
|
69
|
-
`http://localhost:8787/<provider>/...`(第 2 步声明的 provider 名作为路径
|
|
70
|
-
第一段)。把你的**真实** API key 也填进客户端配置 —— 代理原样透传。
|
|
67
|
+
就这样 —— 真实 API key 照常填在客户端配置里(proxy 原样透传)。context 窗口(gpt-5.1-codex=400K、glm-5.2=1M、claude-opus-4=200K ……)自动从 models.dev 查询。
|
|
71
68
|
|
|
72
|
-
####
|
|
69
|
+
#### A. API-key 客户端(`/bili/` 前缀)
|
|
73
70
|
|
|
74
|
-
|
|
71
|
+
用 **API key** 配置(不是登录账号)的客户端允许你改上游 URL。只需在前面加 `http://localhost:8787/bili/`,其他都不用改。
|
|
75
72
|
|
|
73
|
+
**OpenCode** —— 编辑 `~/.config/opencode/opencode.json`,改 provider 的 `baseURL`:
|
|
76
74
|
```jsonc
|
|
77
|
-
//
|
|
78
|
-
"
|
|
79
|
-
//
|
|
80
|
-
"
|
|
75
|
+
// 之前:
|
|
76
|
+
"baseURL": "https://open.bigmodel.cn/api/coding/paas/v4"
|
|
77
|
+
// 之后(前面加上代理地址 + /bili/):
|
|
78
|
+
"baseURL": "http://localhost:8787/bili/https://open.bigmodel.cn/api/coding/paas/v4"
|
|
81
79
|
```
|
|
82
80
|
|
|
83
|
-
|
|
81
|
+
**Codex(API key 模式)** —— 编辑 `~/.codex/config.toml`,改 provider 的 `base_url`:
|
|
82
|
+
```toml
|
|
83
|
+
# 之前:
|
|
84
|
+
base_url = "https://api.openai.com/v1"
|
|
85
|
+
# 之后:
|
|
86
|
+
base_url = "http://localhost:8787/bili/https://api.openai.com/v1"
|
|
87
|
+
```
|
|
84
88
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
+
**Pi** —— 编辑 `~/.pi/agent/models.json`,改 provider 的 `baseUrl`:
|
|
90
|
+
```jsonc
|
|
91
|
+
// 之前:
|
|
92
|
+
"baseUrl": "https://api.anthropic.com"
|
|
93
|
+
// 之后:
|
|
94
|
+
"baseUrl": "http://localhost:8787/bili/https://api.anthropic.com"
|
|
95
|
+
```
|
|
89
96
|
|
|
90
|
-
|
|
91
|
-
> (`PI_CODING_AGENT_DIR=…`),免得客户端扩展和 proxy 双重压缩。
|
|
92
|
-
> `bili-test-pi` 脚本帮你做好了这层隔离。
|
|
97
|
+
**其他 API-key 客户端(Cursor / Aider / Continue ……)** —— 只要配置了上游 URL,前面加 `http://localhost:8787/bili/` 就行,其他都不用改。
|
|
93
98
|
|
|
94
|
-
####
|
|
99
|
+
#### B. 登录/订阅客户端(MITM 透明代理)
|
|
95
100
|
|
|
96
|
-
|
|
101
|
+
需要 **登录账号**的客户端(ChatGPT Plus/Pro、Claude、ZCode coding plan
|
|
102
|
+
……)通过 **OAuth 认证,且硬编码了端点**——你改不了 baseURL,所以 `/bili/`
|
|
103
|
+
前缀方式对它们无效。这类客户端要用 **MITM 透明代理模式**。
|
|
97
104
|
|
|
98
|
-
|
|
99
|
-
// 改之前:
|
|
100
|
-
"baseURL": "https://open.bigmodel.cn/api/coding/paas/v4"
|
|
101
|
-
// 改之后:
|
|
102
|
-
"baseURL": "http://localhost:8787/zhipu/api/coding/paas/v4"
|
|
103
|
-
```
|
|
105
|
+
支持的登录客户端:
|
|
104
106
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
107
|
+
| 客户端 | 登录方式 | 硬编码端点 | 状态 |
|
|
108
|
+
|---|---|---|---|
|
|
109
|
+
| **ZCode** | 智谱 coding plan(OAuth) | `open.bigmodel.cn`(内置 provider) | ✅ 已测试 |
|
|
110
|
+
| **Codex** | ChatGPT 账号(OAuth) | `chatgpt.com/backend-api` | ❓ 未测试(可能不支持,需验证) |
|
|
111
|
+
| **Claude Code** | Claude 订阅(OAuth) | `api.anthropic.com` | ❓ 未测试(可能不支持,需验证) |
|
|
108
112
|
|
|
109
|
-
|
|
113
|
+
MITM 模式原理:这类客户端只提供 **HTTP 代理**设置,所以它发送
|
|
114
|
+
`CONNECT <域名>:443`;billion-context 在本地用自生成的根 CA 终止 TLS,在明文里注入压缩,再重新加密转发。OAuth token 随客户端的
|
|
115
|
+
`Authorization` 头原样转发(我们不动它)——订阅折扣保留。
|
|
110
116
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
# 改之后:
|
|
115
|
-
base_url = "http://localhost:8787/zhipu/api/coding/paas/v4"
|
|
116
|
-
```
|
|
117
|
+
MITM 默认开启,且只对一份 **白名单**中的模型域名(`open.bigmodel.cn`、
|
|
118
|
+
`api.anthropic.com`、`api.openai.com`、`chatgpt.com`)生效。所有其他 HTTPS
|
|
119
|
+
域名都是盲隧道(billion-context 从不解密非模型流量)。
|
|
117
120
|
|
|
118
|
-
|
|
121
|
+
**一次性设置(在客户端里信任根 CA):**
|
|
119
122
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
+
1. 启动一次 proxy 以生成根 CA:
|
|
124
|
+
```bash
|
|
125
|
+
bili start
|
|
126
|
+
ls ~/.local/share/billion-context/ca/root-ca.pem # 现在存在了
|
|
127
|
+
```
|
|
123
128
|
|
|
124
|
-
|
|
129
|
+
2. 在客户端的 **设置 → 网络/代理** 里填:
|
|
130
|
+
- **HTTP 代理**:`http://127.0.0.1:8787`
|
|
131
|
+
- **代理 CA 证书路径**:`~/.local/share/billion-context/ca/root-ca.pem`
|
|
132
|
+
- (可选)**不走代理列表**:`localhost,127.0.0.1`
|
|
133
|
+
- (ZCode 具体位置:**设置 → 网络**。Codex/Claude Code:设 `HTTPS_PROXY`
|
|
134
|
+
环境变量 + `NODE_EXTRA_CA_CERTS` 指向 CA 路径。)
|
|
125
135
|
|
|
126
|
-
|
|
127
|
-
|
|
136
|
+
3. 重启客户端。它的模型流量现在会经过 billion-context 并注入压缩。发一条消息,看 proxy 日志(`~/.local/state/billion-context/bili.log`)应出现
|
|
137
|
+
`mitm <域名>:443 tunnel established`。
|
|
128
138
|
|
|
129
|
-
|
|
139
|
+
> 根 CA 是本地生成的、只存在本机,**不是**系统级安装。只有你配置的那个
|
|
140
|
+
> 客户端(通过 CA 路径设置,它会把该路径作为 `NODE_EXTRA_CA_CERTS` 喂给
|
|
141
|
+
> Node)信任它,其他应用不受影响。删除 CA 文件并重启 proxy 会重新生成。
|
|
130
142
|
|
|
131
|
-
|
|
132
|
-
自动化部署,也可以直接手编 JSON 文件,效果完全一样。
|
|
143
|
+
### 方式 B 手动配置文件&设置上下文大小
|
|
133
144
|
|
|
134
145
|
打开 `~/.config/billion-context/billion-context.json`,编辑 `providers` 块。
|
|
135
|
-
|
|
136
|
-
|
|
146
|
+
**key 就是上游 URL** —— 客户端写在 `/bili/` 后面的那个字符串。value 为该
|
|
147
|
+
URL 声明按模型的 context 窗口:
|
|
137
148
|
|
|
138
149
|
```json
|
|
139
150
|
{
|
|
140
151
|
"providers": {
|
|
141
|
-
"
|
|
142
|
-
"
|
|
143
|
-
"models": {
|
|
144
|
-
"glm-5.2": { "context": 1000000, "output": 131072 }
|
|
145
|
-
}
|
|
152
|
+
"https://open.bigmodel.cn/api/coding/paas/v4": {
|
|
153
|
+
"models": { "glm-5.2": { "context": 1000000 } }
|
|
146
154
|
},
|
|
147
|
-
"
|
|
155
|
+
"https://api.anthropic.com": {}
|
|
148
156
|
}
|
|
149
157
|
}
|
|
150
158
|
```
|
|
151
159
|
|
|
152
|
-
-
|
|
153
|
-
-
|
|
160
|
+
- 一个 key 在客户端嵌入的 URL 等于它或以它开头时匹配(最长 key 优先)。纯 host key 覆盖该 host 上的所有路径。
|
|
161
|
+
- 空 value `{}` 表示"这个 URL 存在,无覆盖"(context 窗口来自 models.dev / 前缀表)。
|
|
162
|
+
- 删掉你不用的条目;添加其他的(按需)。
|
|
154
163
|
- API key **不**写在这里 —— key 在客户端那边,代理原样透传。
|
|
155
164
|
|
|
156
|
-
保存后**重启 `bili`**。启动行列出你的路由:
|
|
157
|
-
|
|
158
|
-
```
|
|
159
|
-
acp-proxy listening on http://127.0.0.1:8787 — routes: anthropic=https://api.anthropic.com, zhipu=https://open.bigmodel.cn
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
这证明代理读到了你的配置。(完整 schema —— 按模型的 context 窗口、可选字段 —— 见[配置](#配置)。)
|
|
163
|
-
|
|
164
|
-
### 网页配置
|
|
165
|
-
|
|
166
|
-
代理跑着的时候,在浏览器打开 `http://localhost:8787/__acp/`。你可以:
|
|
167
165
|
|
|
168
|
-
|
|
169
|
-
- **生成客户端 URL** —— 选一个 provider,得到可直接复制的配置片段(Pi / OpenCode / Codex 的 `baseUrl`/`baseURL`/`base_url` 一行,已填好代理地址 + provider 名)。
|
|
170
|
-
- **查看会话** —— 实时会话表(请求数、省的 token、最后活跃时间),自动刷新。
|
|
166
|
+
### 方式C 网页配置&设置上下文大小
|
|
171
167
|
|
|
172
|
-
|
|
168
|
+
打开 [http://localhost:8787/__bili/](http://localhost:8787/__bili/) 进行配置。
|
|
173
169
|
|
|
174
170
|
### 验证
|
|
175
171
|
|
|
@@ -177,11 +173,11 @@ acp-proxy listening on http://127.0.0.1:8787 — routes: anthropic=https://api.a
|
|
|
177
173
|
|
|
178
174
|
```bash
|
|
179
175
|
# 健康检查(代理是否在跑 + 转发到哪)
|
|
180
|
-
curl -s http://localhost:8787/
|
|
176
|
+
curl -s http://localhost:8787/__bili/health
|
|
181
177
|
# → {"ok":true,"upstream":"https://api.anthropic.com"}
|
|
182
178
|
|
|
183
179
|
# 实时会话统计(发过真实请求后)
|
|
184
|
-
curl -s http://localhost:8787/
|
|
180
|
+
curl -s http://localhost:8787/__bili/stats
|
|
185
181
|
```
|
|
186
182
|
|
|
187
183
|
然后从助手发一条消息,观察日志(`~/.local/state/billion-context/bili.log`,
|
|
@@ -279,15 +275,13 @@ bili --no-auto-update # 本次启动禁用自动更新
|
|
|
279
275
|
"port": 8787,
|
|
280
276
|
"host": "127.0.0.1",
|
|
281
277
|
"providers": {
|
|
282
|
-
"
|
|
283
|
-
"url": "https://open.bigmodel.cn",
|
|
278
|
+
"https://open.bigmodel.cn/api/coding/paas/v4": {
|
|
284
279
|
"models": {
|
|
285
|
-
"glm-5.2": { "context": 1000000
|
|
286
|
-
"glm-5.1": { "context": 200000
|
|
280
|
+
"glm-5.2": { "context": 1000000 },
|
|
281
|
+
"glm-5.1": { "context": 200000 }
|
|
287
282
|
}
|
|
288
283
|
},
|
|
289
|
-
"
|
|
290
|
-
"deepseek": "https://api.deepseek.com"
|
|
284
|
+
"https://api.deepseek.com": {}
|
|
291
285
|
}
|
|
292
286
|
}
|
|
293
287
|
```
|
|
@@ -298,12 +292,11 @@ bili --no-auto-update # 本次启动禁用自动更新
|
|
|
298
292
|
|------|---------|-------------|
|
|
299
293
|
| `port` | `8787` | 代理监听端口 |
|
|
300
294
|
| `host` | `127.0.0.1` | 代理监听地址 |
|
|
301
|
-
| `upstream` | `https://api.anthropic.com` | 无路由匹配时的默认上游 |
|
|
302
295
|
| `sessionHeader` | `x-acp-session` | 客户端可发来标识会话的 header 名 |
|
|
303
296
|
| `log` | `true` | 启用请求日志 |
|
|
304
297
|
| `debug` | `false` | 详细日志(等同 `ACP_DEBUG=1`) |
|
|
305
298
|
| `passthrough` | `false` | 不压缩直接转发(等同 `ACP_PASSTHROUGH=1`) |
|
|
306
|
-
| `providers` | *(无)* |
|
|
299
|
+
| `providers` | *(无)* | 按 URL 的 context 覆盖 —— 见下文 |
|
|
307
300
|
| `compress` | *(见默认值)* | `{ injectTool, injectNudge }` |
|
|
308
301
|
|
|
309
302
|
> **选择 `host`**(IPv6 / 容器):默认 `127.0.0.1` 只听 IPv4 且仅
|
|
@@ -314,41 +307,38 @@ bili --no-auto-update # 本次启动禁用自动更新
|
|
|
314
307
|
> `--host 0.0.0.0`。⚠️ `0.0.0.0` / `::` 会把代理暴露到**所有**网卡;
|
|
315
308
|
> 确保你在可信网络或防火墙后面。
|
|
316
309
|
|
|
317
|
-
### Providers(URL
|
|
310
|
+
### Providers(按 URL 的 context 覆盖)
|
|
318
311
|
|
|
319
|
-
|
|
312
|
+
路由始终是 `/bili/` 前缀(见[方式 A](#方式-a-零配置bili-前缀))。
|
|
313
|
+
`providers` 块只声明**按 URL 的 context 窗口覆盖**,以上游 URL 为 key。
|
|
314
|
+
key 就是客户端写在 `/bili/` 后面的那个字符串:
|
|
320
315
|
|
|
321
|
-
**简单形式** —— provider 名 → URL:
|
|
322
|
-
```json
|
|
323
|
-
{ "deepseek": "https://api.deepseek.com" }
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
**完整形式** —— provider 名 → `{ url, models }`:
|
|
327
316
|
```json
|
|
328
317
|
{
|
|
329
|
-
"
|
|
330
|
-
"
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
318
|
+
"providers": {
|
|
319
|
+
"https://open.bigmodel.cn/api/coding/paas/v4": {
|
|
320
|
+
"models": {
|
|
321
|
+
"glm-5.2": { "context": 1000000 },
|
|
322
|
+
"glm-5.1": { "context": 200000 }
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
"https://api.deepseek.com": {}
|
|
335
326
|
}
|
|
336
327
|
}
|
|
337
328
|
```
|
|
338
329
|
|
|
339
|
-
|
|
330
|
+
同一个模型在不同上游后面可以有不同 context 窗口(例如 relay 把模型包成更大窗口)。`context` 是**输入 context 上限**(压缩器用它判断何时 nudge)。可选;缺失值回退到 [models.dev](https://models.dev) registry,再回退到内置前缀表。
|
|
340
331
|
|
|
341
|
-
> **为什么要声明 context?** LLM 的 `/models` API **不返回** context 窗口(已跨 OpenAI、Anthropic、智谱、comfly 验证)。它们是文档级信息。值错了(例如把 GLM-5.2 猜成 128K 而非 1M)会导致频繁误触发压缩。按
|
|
332
|
+
> **为什么要声明 context?** LLM 的 `/models` API **不返回** context 窗口(已跨 OpenAI、Anthropic、智谱、comfly 验证)。它们是文档级信息。值错了(例如把 GLM-5.2 猜成 128K 而非 1M)会导致频繁误触发压缩。按 URL + 模型声明能让代理匹配客户端自己用的注册表。
|
|
342
333
|
|
|
343
|
-
|
|
334
|
+
### URL key 匹配规则
|
|
344
335
|
|
|
345
|
-
|
|
336
|
+
- 一个请求在客户端嵌入的 URL **等于 key 或以 key 开头**时匹配(最长 key 优先)。
|
|
337
|
+
- 浅 key 如 `https://open.bigmodel.cn` 覆盖该 host 上的每条路径;深 key 如 `https://open.bigmodel.cn/api/anthropic` 只覆盖那一个端点。
|
|
338
|
+
- key 永不跨 host(边界检查要求 key 后面是 `/` 或字符串结尾),所以 `https://x.com` 不会匹配 `https://x.com.evil`。
|
|
339
|
+
- 未被任何匹配 key 覆盖的模型回退到 models.dev,再回退到前缀表,最后回退到 `modelContextLimit`。
|
|
346
340
|
|
|
347
|
-
|
|
348
|
-
- 保留字(`v1`、`chat`、`completions`、`messages`、`models`、`api`)被拒绝,以免与真实 API 路径段冲突。
|
|
349
|
-
- provider 名可出现在路径任意位置;最长匹配优先。
|
|
350
|
-
- **未声明任何 providers**(比如你清空了 `providers` 块)时,每个请求按完整
|
|
351
|
-
原始路径转发到默认 `upstream` —— 边缘场景,非正常流程。
|
|
341
|
+
**API key 永远不存进代理** —— 助手发什么 key,原样透传给上游。
|
|
352
342
|
|
|
353
343
|
## 会话机制
|
|
354
344
|
|
|
@@ -370,7 +360,7 @@ bili --no-auto-update # 本次启动禁用自动更新
|
|
|
370
360
|
|
|
371
361
|
## 状态
|
|
372
362
|
|
|
373
|
-
早期。协议处理和压缩已通过 mock 测试(
|
|
363
|
+
早期。协议处理和压缩已通过 mock 测试(146 项通过)。真实模型集成测试是下一里程碑。预期会有粗糙的地方。
|
|
374
364
|
|
|
375
365
|
pi 扩展模式(进程内、更紧密集成、参考实现)见 [billion-context-pi](https://github.com/ranxianglei/billion-context-pi)。
|
|
376
366
|
|