@jsonstudio/rcc 0.89.1457 → 0.89.1488
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/configsamples/config.json +12 -4
- package/dist/build-info.js +2 -2
- package/dist/client/gemini-cli/gemini-cli-protocol-client.js +53 -26
- package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
- package/dist/manager/modules/quota/antigravity-quota-manager.d.ts +4 -0
- package/dist/manager/modules/quota/antigravity-quota-manager.js +130 -2
- package/dist/manager/modules/quota/antigravity-quota-manager.js.map +1 -1
- package/dist/manager/modules/quota/provider-quota-daemon.events.js +63 -2
- package/dist/manager/modules/quota/provider-quota-daemon.events.js.map +1 -1
- package/dist/modules/llmswitch/bridge.js +17 -4
- package/dist/modules/llmswitch/bridge.js.map +1 -1
- package/dist/modules/llmswitch/core-loader.d.ts +1 -1
- package/dist/modules/llmswitch/core-loader.js +15 -3
- package/dist/modules/llmswitch/core-loader.js.map +1 -1
- package/dist/providers/auth/antigravity-userinfo-helper.d.ts +3 -1
- package/dist/providers/auth/antigravity-userinfo-helper.js +41 -7
- package/dist/providers/auth/antigravity-userinfo-helper.js.map +1 -1
- package/dist/providers/auth/gemini-cli-userinfo-helper.js +66 -4
- package/dist/providers/auth/gemini-cli-userinfo-helper.js.map +1 -1
- package/dist/providers/auth/oauth-lifecycle.js +112 -1
- package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
- package/dist/providers/auth/tokenfile-auth.d.ts +12 -0
- package/dist/providers/auth/tokenfile-auth.js +92 -1
- package/dist/providers/auth/tokenfile-auth.js.map +1 -1
- package/dist/providers/core/runtime/gemini-cli-http-provider.d.ts +0 -1
- package/dist/providers/core/runtime/gemini-cli-http-provider.js +118 -78
- package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
- package/dist/providers/core/runtime/http-transport-provider.js +10 -3
- package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
- package/dist/runtime/wasm-runtime/wasm-config.d.ts +73 -0
- package/dist/runtime/wasm-runtime/wasm-config.js +124 -0
- package/dist/runtime/wasm-runtime/wasm-config.js.map +1 -0
- package/dist/runtime/wasm-runtime/wasm-loader.d.ts +40 -0
- package/dist/runtime/wasm-runtime/wasm-loader.js +62 -0
- package/dist/runtime/wasm-runtime/wasm-loader.js.map +1 -0
- package/dist/server/runtime/http-server/index.js +53 -1
- package/dist/server/runtime/http-server/index.js.map +1 -1
- package/docs/antigravity-gemini-format-cleanup.md +54 -13
- package/docs/llms-wasm-migration.md +331 -0
- package/docs/llms-wasm-module-boundaries.md +588 -0
- package/docs/llms-wasm-replay-baseline.md +171 -0
- package/docs/plans/llms-wasm-migration-plan.md +401 -0
- package/package.json +2 -2
- package/scripts/antigravity-token-bridge.mjs +283 -0
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "llms-wasm Migration Plan"
|
|
3
|
+
tags:
|
|
4
|
+
- migration
|
|
5
|
+
- wasm
|
|
6
|
+
- architecture
|
|
7
|
+
status: planning
|
|
8
|
+
priority: high
|
|
9
|
+
created: 2026-01-26
|
|
10
|
+
owners:
|
|
11
|
+
- name: RouteCodex Team
|
|
12
|
+
role: Architecture
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# llms-wasm 逐步替换迁移计划
|
|
16
|
+
|
|
17
|
+
> [!important] 核心目标
|
|
18
|
+
> 让 llms-wasm 和 llms TS 同时加载、同一请求可双跑;默认流量仍走 TS,WASM 跑影子并产出 diff;diff 可回溯、可修正;按模块逐步替换并具备清晰的验收与回滚开关。
|
|
19
|
+
|
|
20
|
+
## 目录
|
|
21
|
+
|
|
22
|
+
- [[#总体目标]]
|
|
23
|
+
- [[#核心原则]]
|
|
24
|
+
- [[#阶段 0:边界与基线]]
|
|
25
|
+
- [[#阶段 1:双加载 + 开关矩阵]]
|
|
26
|
+
- [[#阶段 2:影子 + Diff 机制(含 SSE 协议)]]
|
|
27
|
+
- [[#阶段 3:责任归属与修复路径]]
|
|
28
|
+
- [[#阶段 4:模块级替换(shadow → canary → default)]]
|
|
29
|
+
- [[#阶段 5:安全与可观测性]]
|
|
30
|
+
- [[#阶段 6:正式切换与清理]]
|
|
31
|
+
- [[#附录 A:Ruleset 版本化规范]]
|
|
32
|
+
- [[#附录 B:Diff 存储与脱敏]]
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 总体目标
|
|
37
|
+
|
|
38
|
+
### 核心能力
|
|
39
|
+
|
|
40
|
+
- 双路运行:llms-wasm 与 llms TS 同时加载,同一请求可并行执行
|
|
41
|
+
- 影子模式:默认 TS 为主路,WASM 为影子;影子失败不影响主路
|
|
42
|
+
- 差异追踪:diff 可回溯(绑定 ruleset 版本)、可归因(责任归属)、可修复(compat 或 wasm core)
|
|
43
|
+
- 模块替换:模块级开关、验收阈值、观察期、回滚开关
|
|
44
|
+
|
|
45
|
+
### 成功指标(建议起始阈值)
|
|
46
|
+
|
|
47
|
+
- diff rate ≤ 0.5%(按模块可更严格)
|
|
48
|
+
- shadow error rate ≤ 0.1%(影子侧)
|
|
49
|
+
- P95 latency delta ≤ +10ms(主路 vs 基线)
|
|
50
|
+
|
|
51
|
+
> [!note] 统计口径
|
|
52
|
+
> 指标必须按 `tenant`、`route`、`module`、`runtime(ts|wasm)` 分维度统计,并支持按 ruleset 版本回溯。
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 核心原则
|
|
57
|
+
|
|
58
|
+
> [!warning] 责任边界(必须遵守)
|
|
59
|
+
> - **Host**:只做开关读取 / 影子分发 / 指标上报;不得做 canonicalization、tool 修复、路由决策或 diff 计算。
|
|
60
|
+
> - **llmswitch-core**:拥有 canonicalization、routing、tools、compat、diff 协议与比较规则。
|
|
61
|
+
> - **Provider V2**:只负责 auth、HTTP、retries、compat hooks;不解读用户 payload 语义、不参与工具/路由/diff。
|
|
62
|
+
|
|
63
|
+
> [!important] 单执行路径
|
|
64
|
+
> `HTTP server → llmswitch-core Hub Pipeline → Provider V2 → upstream AI`;禁止旁路。
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 阶段 0:边界与基线
|
|
69
|
+
|
|
70
|
+
### 0.1 模块边界清单(Contract + 归属)
|
|
71
|
+
|
|
72
|
+
> [!tip] 产出物
|
|
73
|
+
> 输出一份“模块边界清单”,用于:替换顺序、归因、验收与回滚。
|
|
74
|
+
|
|
75
|
+
| 模块 | 输入 Contract | 输出 Contract | Owner/修复路径 | 仓库归属 |
|
|
76
|
+
|---|---|---|---|---|
|
|
77
|
+
| tokenizer/encoding | `text` | `tokens` | wasm core | llmswitch-core |
|
|
78
|
+
| tool canonicalization | `ToolCallRaw[]` | `ToolCallCanonical[]` | wasm core | llmswitch-core |
|
|
79
|
+
| compat | `UpstreamResponse` | `CanonicalResponse` | compat adapter | llmswitch-core |
|
|
80
|
+
| streaming (SSE) | `SSEChunk[]` | `CanonicalSSEEvents[]` | wasm core | llmswitch-core |
|
|
81
|
+
| routing | `RequestContext` | `ProviderTarget` | wasm core | llmswitch-core |
|
|
82
|
+
|
|
83
|
+
> [!note] 依赖顺序
|
|
84
|
+
> `tokenizer → tools → routing → compat → streaming`(可按实际代码调整,但必须写入清单)。
|
|
85
|
+
|
|
86
|
+
### 0.2 基线回放集(Replay Baseline)
|
|
87
|
+
|
|
88
|
+
- 固定请求集:覆盖典型模型/工具/路由/SSE 场景
|
|
89
|
+
- 固定版本快照:记录 TS 与 WASM 的版本号 + core ruleset 版本
|
|
90
|
+
- 回放方式:离线 replay + 线上 sampled replay(可选)
|
|
91
|
+
|
|
92
|
+
> [!important] 回放基线必须可重复
|
|
93
|
+
> - 输入需要脱敏但可复现(结构不变)
|
|
94
|
+
> - 影子侧必须能独立重放同一请求(同版本、同 ruleset)
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 阶段 1:双加载 + 开关矩阵
|
|
99
|
+
|
|
100
|
+
### 1.1 双加载初始化
|
|
101
|
+
|
|
102
|
+
- TS runtime:当前 `@jsonstudio/llms`(TS)
|
|
103
|
+
- WASM runtime:`llms-wasm`
|
|
104
|
+
- 目标:同进程内并存、互不影响、初始化失败可降级(不 silent fallback;需上报错误)
|
|
105
|
+
|
|
106
|
+
> [!warning] Fail fast + 可观测
|
|
107
|
+
> WASM 初始化失败必须走 `providerErrorCenter` + `errorHandlingCenter` 上报;主路仍按模式走 TS。
|
|
108
|
+
|
|
109
|
+
### 1.2 运行模式
|
|
110
|
+
|
|
111
|
+
- `ts_primary`:主路 TS(默认)
|
|
112
|
+
- `shadow`:主路 TS,WASM 影子
|
|
113
|
+
- `wasm_primary`:主路 WASM,TS 影子
|
|
114
|
+
- `split`:按比例分流(用于逐步切流)
|
|
115
|
+
|
|
116
|
+
### 1.3 开关优先级与作用域
|
|
117
|
+
|
|
118
|
+
> [!important] 优先级(强制)
|
|
119
|
+
> 全局 > 租户 > 路由 > 请求
|
|
120
|
+
|
|
121
|
+
| 作用域 | 示例 | 说明 |
|
|
122
|
+
|---|---|---|
|
|
123
|
+
| 全局(进程级) | env `ROUTECODEX_WASM_MODE=shadow` | 默认行为 |
|
|
124
|
+
| 租户级 | config `tenants[*].wasmMode` | 覆盖全局 |
|
|
125
|
+
| 路由级 | virtual router `routes[*].wasmMode` | 覆盖租户 |
|
|
126
|
+
| 请求级 | header `X-WASM-Mode: wasm_primary` | 单次请求 override |
|
|
127
|
+
|
|
128
|
+
> [!note] 开关读取位置
|
|
129
|
+
> Host 只做“读取与决策分发”;具体逻辑执行(含 canonicalization、diff 协议)在 llmswitch-core。
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## 阶段 2:影子 + Diff 机制(含 SSE 协议)
|
|
134
|
+
|
|
135
|
+
### 2.1 影子请求分发
|
|
136
|
+
|
|
137
|
+
- 主路请求正常执行
|
|
138
|
+
- 影子请求异步执行(不阻塞主路响应)
|
|
139
|
+
- 影子失败不重试(默认);如需重试必须可配置且有预算(error budget)
|
|
140
|
+
|
|
141
|
+
### 2.2 Diff 协议与 Canonicalization(在 llmswitch-core)
|
|
142
|
+
|
|
143
|
+
> [!warning] Canonicalization 归属
|
|
144
|
+
> 所有 canonicalization、diff ruleset、比较逻辑都必须在 llmswitch-core;Host 不做字段修补。
|
|
145
|
+
|
|
146
|
+
#### 通用 Diff 规则(降噪)
|
|
147
|
+
|
|
148
|
+
- 排除/标准化:`timestamp`、随机 id、trace id 等
|
|
149
|
+
- 容忍策略:浮点容忍、集合无序、JSON 格式化
|
|
150
|
+
- 非确定性:白名单 + ruleset 版本化(见附录 A)
|
|
151
|
+
|
|
152
|
+
#### SSE 对比协议(event + token)
|
|
153
|
+
|
|
154
|
+
> [!tip] 核心原则
|
|
155
|
+
> 允许 chunk 拆包差异,但要求最终 token 序列一致;对比基于 event-level schema。
|
|
156
|
+
|
|
157
|
+
Canonical event schema:
|
|
158
|
+
|
|
159
|
+
- `event_type`
|
|
160
|
+
- `ordinal_index`
|
|
161
|
+
- `normalized_payload`
|
|
162
|
+
- `token_digest`(可选,用于 token 级校验)
|
|
163
|
+
|
|
164
|
+
判定逻辑:
|
|
165
|
+
|
|
166
|
+
- event 序列可容忍“拆包导致的分段差异”
|
|
167
|
+
- 最终 token_digest 序列一致则通过
|
|
168
|
+
- 失败时输出最小 diff 摘要(added/removed/mismatch)
|
|
169
|
+
|
|
170
|
+
### 2.3 Diff 记录(绑定 ruleset)
|
|
171
|
+
|
|
172
|
+
每条 diff 必须包含:
|
|
173
|
+
|
|
174
|
+
- `requestId` / `tenant` / `route`
|
|
175
|
+
- `runtime_main` / `runtime_shadow`
|
|
176
|
+
- `ruleset_version`
|
|
177
|
+
- `diff_summary`(可索引)
|
|
178
|
+
- `payload_refs`(可选:用于回放;存储时需脱敏)
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## 阶段 3:责任归属与修复路径
|
|
183
|
+
|
|
184
|
+
### 3.1 责任归属表(Owner + Fix Location)
|
|
185
|
+
|
|
186
|
+
> [!important] 修复入口
|
|
187
|
+
> 所有 diff 必须能被归因到“修复路径”:`compat` vs `wasm core`(Host 永远不是修复入口)。
|
|
188
|
+
|
|
189
|
+
| 模块 | Owner | 修复路径 | 入口函数/文件(示例) |
|
|
190
|
+
|---|---|---|---|
|
|
191
|
+
| tokenizer | @team/core | wasm core | `llmswitch-core/src/tokenizer/*` |
|
|
192
|
+
| tools | @team/tools | wasm core | `llmswitch-core/src/tools/*` |
|
|
193
|
+
| compat | @team/compat | compat adapter | `llmswitch-core/src/conversion/compat/*` |
|
|
194
|
+
| streaming | @team/streaming | wasm core | `llmswitch-core/src/streaming/*` |
|
|
195
|
+
| routing | @team/routing | wasm core | `llmswitch-core/src/routing/*` |
|
|
196
|
+
|
|
197
|
+
### 3.2 修复闭环
|
|
198
|
+
|
|
199
|
+
1. 影子 diff 收集 → 2. 分类(compat/logic/nondeterministic) → 3. 修复 → 4. 基线回放验证 → 5. diff 下降 → 6. 推进模块替换阶段
|
|
200
|
+
|
|
201
|
+
```mermaid
|
|
202
|
+
graph LR
|
|
203
|
+
A[Shadow Run] --> B[Diff Detect]
|
|
204
|
+
B --> C{Classify}
|
|
205
|
+
C -->|compat_issue| D[Fix compat adapter]
|
|
206
|
+
C -->|logic_bug| E[Fix wasm core]
|
|
207
|
+
C -->|nondeterministic| F[Update ruleset]
|
|
208
|
+
D --> G[Replay baseline]
|
|
209
|
+
E --> G
|
|
210
|
+
F --> G
|
|
211
|
+
G --> H{Diff down?}
|
|
212
|
+
H -->|yes| I[Proceed]
|
|
213
|
+
H -->|no| J[Deep dive]
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## 阶段 4:模块级替换(shadow → canary → default)
|
|
219
|
+
|
|
220
|
+
### 4.1 建议替换顺序(低风险 → 高风险)
|
|
221
|
+
|
|
222
|
+
1. tokenizer/encoding
|
|
223
|
+
2. tool canonicalization
|
|
224
|
+
3. compat layer
|
|
225
|
+
4. streaming response formatting (SSE)
|
|
226
|
+
5. routing decision logic
|
|
227
|
+
|
|
228
|
+
### 4.2 每个模块的替换 Gate
|
|
229
|
+
|
|
230
|
+
> [!note] 状态机
|
|
231
|
+
> `shadow → canary → default → deprecated → removed`
|
|
232
|
+
|
|
233
|
+
- shadow:TS 主路,WASM 影子;跑满观察期(建议 1-2 周)
|
|
234
|
+
- canary:WASM 主路小流量(5-10%),TS 影子;对稳定性最敏感
|
|
235
|
+
- default:WASM 主路大流量(50-100%);TS 影子可逐步关闭
|
|
236
|
+
- deprecated:TS 保留 2-3 个 release 作为 fallback
|
|
237
|
+
|
|
238
|
+
#### 验收门槛(示例,按模块调整)
|
|
239
|
+
|
|
240
|
+
- diff rate:按模块设阈值(tokenizer 可到 0.01%,streaming 可到 0.5%)
|
|
241
|
+
- error rate:≤ 0.1%(canary 阶段更严格)
|
|
242
|
+
- latency delta:P95 ≤ +10ms(或按模块调整)
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## 阶段 5:安全与可观测性
|
|
247
|
+
|
|
248
|
+
### 5.1 必需指标
|
|
249
|
+
|
|
250
|
+
- `diff_rate`(按 module/tenant/route/ruleset)
|
|
251
|
+
- `shadow_error_rate`(按 runtime)
|
|
252
|
+
- `latency_delta_p50/p95/p99`
|
|
253
|
+
- `wasm_init_time` / `wasm_memory`
|
|
254
|
+
|
|
255
|
+
### 5.2 告警与 Error Budget
|
|
256
|
+
|
|
257
|
+
- diff 突增(超过阈值 2x)
|
|
258
|
+
- shadow error rate 超阈值
|
|
259
|
+
- 主路延迟显著上升
|
|
260
|
+
- WASM 初始化失败/崩溃
|
|
261
|
+
|
|
262
|
+
> [!warning] 自动回滚建议
|
|
263
|
+
> 若具备自动回滚能力:以“错误率 + 延迟 + diff 突增”作为触发器,回滚到 `ts_primary` 或回滚单模块。
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## 阶段 6:正式切换与清理
|
|
268
|
+
|
|
269
|
+
### 6.1 版本策略
|
|
270
|
+
|
|
271
|
+
- TS 逻辑保留 2-3 个 release(建议)
|
|
272
|
+
- 在 release note 标记迁移状态与开关说明
|
|
273
|
+
- 在移除双路 diff 逻辑前:保留 ruleset 版本与历史 diff 归档
|
|
274
|
+
|
|
275
|
+
### 6.2 清理原则
|
|
276
|
+
|
|
277
|
+
> [!important] No deletions without approval
|
|
278
|
+
> 如需删除现有文件或大规模移除 TS 路径,必须先提案并获得确认。
|
|
279
|
+
|
|
280
|
+
清理候选(仅列举,不直接执行):
|
|
281
|
+
|
|
282
|
+
- 移除 TS 专用实现(在确认无流量后)
|
|
283
|
+
- 移除双路 diff 代码(若不再需要审计)
|
|
284
|
+
- 更新 docs/ 与 CLI 运行手册
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## 附录 A:Ruleset 版本化规范
|
|
289
|
+
|
|
290
|
+
### A.1 命名与存放
|
|
291
|
+
|
|
292
|
+
- 命名:`diff_ruleset_vN`
|
|
293
|
+
- 存放:`llmswitch-core/src/diff/rulesets/`
|
|
294
|
+
|
|
295
|
+
### A.2 必含字段
|
|
296
|
+
|
|
297
|
+
- `version`(v1/v2/...)
|
|
298
|
+
- `created_at`(日期)
|
|
299
|
+
- `field_whitelist`(忽略字段)
|
|
300
|
+
- `tolerance_policy`(容忍策略)
|
|
301
|
+
- `nondeterministic_rules`(非确定性规则)
|
|
302
|
+
- `sse_protocol`(SSE 协议版本)
|
|
303
|
+
|
|
304
|
+
### A.3 升级流程
|
|
305
|
+
|
|
306
|
+
1. 新增 v(N+1) ruleset(不改旧版本)
|
|
307
|
+
2. 切换 `current_ruleset` 指针
|
|
308
|
+
3. 所有 diff 记录写入 `ruleset_version`
|
|
309
|
+
|
|
310
|
+
---
|
|
311
|
+
|
|
312
|
+
## 附录 B:Diff 存储与脱敏
|
|
313
|
+
|
|
314
|
+
### B.1 索引字段
|
|
315
|
+
|
|
316
|
+
- `requestId`
|
|
317
|
+
- `tenant`
|
|
318
|
+
- `route`
|
|
319
|
+
- `ruleset_version`
|
|
320
|
+
- `timestamp`
|
|
321
|
+
|
|
322
|
+
### B.2 保留策略
|
|
323
|
+
|
|
324
|
+
- 全量:7-14 天
|
|
325
|
+
- 采样摘要:30-90 天
|
|
326
|
+
|
|
327
|
+
### B.3 脱敏规则
|
|
328
|
+
|
|
329
|
+
- PII:hash + mask(结构保留)
|
|
330
|
+
- secrets:完全移除(不入库)
|
|
331
|
+
- stack:stack hash(用于聚类),必要时保留截断 stack(受访问控制)
|