@jsonstudio/rcc 0.89.1491 → 0.89.1502
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 +4 -12
- package/dist/build-info.js +2 -2
- package/dist/cli/commands/init.js +3 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/client/gemini-cli/gemini-cli-protocol-client.js +9 -13
- package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
- package/dist/commands/oauth.js +20 -5
- package/dist/commands/oauth.js.map +1 -1
- package/dist/error-handling/quiet-error-handling-center.js +8 -46
- package/dist/error-handling/quiet-error-handling-center.js.map +1 -1
- package/dist/manager/modules/quota/antigravity-quota-manager.d.ts +2 -4
- package/dist/manager/modules/quota/antigravity-quota-manager.js +48 -137
- package/dist/manager/modules/quota/antigravity-quota-manager.js.map +1 -1
- package/dist/manager/modules/quota/provider-quota-daemon.events.js +2 -63
- package/dist/manager/modules/quota/provider-quota-daemon.events.js.map +1 -1
- package/dist/modules/llmswitch/bridge.js +4 -17
- 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 +3 -15
- package/dist/modules/llmswitch/core-loader.js.map +1 -1
- package/dist/providers/auth/antigravity-userinfo-helper.d.ts +1 -3
- package/dist/providers/auth/antigravity-userinfo-helper.js +7 -41
- package/dist/providers/auth/antigravity-userinfo-helper.js.map +1 -1
- package/dist/providers/auth/gemini-cli-userinfo-helper.js +3 -3
- package/dist/providers/auth/gemini-cli-userinfo-helper.js.map +1 -1
- package/dist/providers/auth/oauth-lifecycle.js +175 -79
- package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
- package/dist/providers/auth/tokenfile-auth.d.ts +0 -12
- package/dist/providers/auth/tokenfile-auth.js +1 -92
- package/dist/providers/auth/tokenfile-auth.js.map +1 -1
- package/dist/providers/core/config/camoufox-launcher.d.ts +0 -5
- package/dist/providers/core/config/camoufox-launcher.js +43 -5
- package/dist/providers/core/config/camoufox-launcher.js.map +1 -1
- package/dist/providers/core/config/oauth-flows.js +1 -1
- package/dist/providers/core/config/oauth-flows.js.map +1 -1
- package/dist/providers/core/config/service-profiles.js +17 -3
- package/dist/providers/core/config/service-profiles.js.map +1 -1
- package/dist/providers/core/runtime/base-provider.d.ts +5 -0
- package/dist/providers/core/runtime/base-provider.js +112 -26
- package/dist/providers/core/runtime/base-provider.js.map +1 -1
- package/dist/providers/core/runtime/gemini-cli-http-provider.d.ts +1 -3
- package/dist/providers/core/runtime/gemini-cli-http-provider.js +71 -370
- package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
- package/dist/providers/core/runtime/http-transport-provider.d.ts +0 -1
- package/dist/providers/core/runtime/http-transport-provider.js +5 -38
- package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
- package/dist/providers/core/runtime/provider-error-classifier.js +3 -1
- package/dist/providers/core/runtime/provider-error-classifier.js.map +1 -1
- package/dist/providers/core/runtime/rate-limit-manager.d.ts +12 -1
- package/dist/providers/core/runtime/rate-limit-manager.js +77 -4
- package/dist/providers/core/runtime/rate-limit-manager.js.map +1 -1
- package/dist/providers/core/strategies/oauth-auth-code-flow.js +10 -4
- package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
- package/dist/providers/core/strategies/oauth-device-flow.js +10 -4
- package/dist/providers/core/strategies/oauth-device-flow.js.map +1 -1
- package/dist/server/runtime/http-server/executor-pipeline.d.ts +1 -0
- package/dist/server/runtime/http-server/executor-provider.d.ts +2 -0
- package/dist/server/runtime/http-server/executor-provider.js +46 -0
- package/dist/server/runtime/http-server/executor-provider.js.map +1 -1
- package/dist/server/runtime/http-server/index.js +13 -55
- package/dist/server/runtime/http-server/index.js.map +1 -1
- package/dist/server/runtime/http-server/request-executor.js +12 -2
- package/dist/server/runtime/http-server/request-executor.js.map +1 -1
- package/dist/token-daemon/index.d.ts +1 -0
- package/dist/token-daemon/index.js +81 -1
- package/dist/token-daemon/index.js.map +1 -1
- package/package.json +3 -3
- package/scripts/run-bg.sh +14 -0
- package/scripts/tests/antigravity-codex-sample-pipeline-compare.mjs +221 -0
- package/scripts/tests/antigravity-gemini-dryrun-compare.mjs +222 -0
- package/scripts/tests/ci-jest.mjs +0 -5
- package/scripts/verify-e2e-toolcall.mjs +22 -6
- package/dist/runtime/wasm-runtime/wasm-config.d.ts +0 -73
- package/dist/runtime/wasm-runtime/wasm-config.js +0 -124
- package/dist/runtime/wasm-runtime/wasm-config.js.map +0 -1
- package/dist/runtime/wasm-runtime/wasm-loader.d.ts +0 -40
- package/dist/runtime/wasm-runtime/wasm-loader.js +0 -62
- package/dist/runtime/wasm-runtime/wasm-loader.js.map +0 -1
- package/docs/antigravity-gemini-format-cleanup.md +0 -143
- package/docs/llms-wasm-migration.md +0 -331
- package/docs/llms-wasm-module-boundaries.md +0 -588
- package/docs/llms-wasm-replay-baseline.md +0 -171
- package/docs/plans/llms-wasm-migration-plan.md +0 -401
- package/scripts/antigravity-token-bridge.mjs +0 -283
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WASM 运行时配置与运行模式开关
|
|
3
|
-
*
|
|
4
|
-
* 责任边界:
|
|
5
|
-
* - Host:开关读取、影子请求分发、指标上报
|
|
6
|
-
* - Core(WASM/TS):canonicalization、routing、tools、compat、diff 协议
|
|
7
|
-
*
|
|
8
|
-
* 开关优先级矩阵(高 → 低):
|
|
9
|
-
* - 全局(进程级):ROUTECODEX_HUB_PIPELINE_IMPL
|
|
10
|
-
* - 租户级:config.virtualRouter.*(暂未实现)
|
|
11
|
-
* - 路由级:metadata.routeHint(暂未实现)
|
|
12
|
-
* - 请求级:header X-RC-Pipeline-Impl(暂未实现)
|
|
13
|
-
*/
|
|
14
|
-
/**
|
|
15
|
-
* HubPipeline 实现类型
|
|
16
|
-
*/
|
|
17
|
-
export type HubPipelineImpl = 'ts' | 'wasm';
|
|
18
|
-
/**
|
|
19
|
-
* 运行模式
|
|
20
|
-
*/
|
|
21
|
-
export type HubPipelineMode = 'ts_primary' | 'wasm_primary' | 'shadow_ts' | 'shadow_wasm' | 'split';
|
|
22
|
-
/**
|
|
23
|
-
* 运行模式配置
|
|
24
|
-
*/
|
|
25
|
-
export interface HubPipelineRuntimeConfig {
|
|
26
|
-
/**
|
|
27
|
-
* 运行模式
|
|
28
|
-
*/
|
|
29
|
-
mode: HubPipelineMode;
|
|
30
|
-
/**
|
|
31
|
-
* 分流比例(仅 split 模式有效)
|
|
32
|
-
* - 0.0 = 全部走 TS
|
|
33
|
-
* - 1.0 = 全部走 WASM
|
|
34
|
-
* - 0.5 = 50% TS / 50% WASM
|
|
35
|
-
*/
|
|
36
|
-
splitRatio?: number;
|
|
37
|
-
/**
|
|
38
|
-
* 是否启用影子 diff 记录
|
|
39
|
-
*/
|
|
40
|
-
enableShadowDiff?: boolean;
|
|
41
|
-
/**
|
|
42
|
-
* 影子失败是否回退到主路(false = 影子失败不影响主路)
|
|
43
|
-
*/
|
|
44
|
-
shadowFallback?: boolean;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* 解析运行模式(从环境变量)
|
|
48
|
-
*/
|
|
49
|
-
export declare function resolveHubPipelineMode(): HubPipelineMode;
|
|
50
|
-
/**
|
|
51
|
-
* 解析分流比例
|
|
52
|
-
*/
|
|
53
|
-
export declare function resolveSplitRatio(): number;
|
|
54
|
-
/**
|
|
55
|
-
* 解析运行时配置
|
|
56
|
-
*/
|
|
57
|
-
export declare function resolveHubPipelineRuntimeConfig(): HubPipelineRuntimeConfig;
|
|
58
|
-
/**
|
|
59
|
-
* 判断是否应该使用 WASM 作为主路
|
|
60
|
-
*/
|
|
61
|
-
export declare function shouldUseWasmPrimary(config: HubPipelineRuntimeConfig): boolean;
|
|
62
|
-
/**
|
|
63
|
-
* 判断是否应该运行影子管道
|
|
64
|
-
*/
|
|
65
|
-
export declare function shouldRunShadow(config: HubPipelineRuntimeConfig): boolean;
|
|
66
|
-
/**
|
|
67
|
-
* 获取影子管道的实现类型
|
|
68
|
-
*/
|
|
69
|
-
export declare function getShadowImpl(config: HubPipelineRuntimeConfig): HubPipelineImpl;
|
|
70
|
-
/**
|
|
71
|
-
* 根据分流比例决定使用哪种实现
|
|
72
|
-
*/
|
|
73
|
-
export declare function selectImplBySplitRatio(requestId: string, splitRatio: number): HubPipelineImpl;
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WASM 运行时配置与运行模式开关
|
|
3
|
-
*
|
|
4
|
-
* 责任边界:
|
|
5
|
-
* - Host:开关读取、影子请求分发、指标上报
|
|
6
|
-
* - Core(WASM/TS):canonicalization、routing、tools、compat、diff 协议
|
|
7
|
-
*
|
|
8
|
-
* 开关优先级矩阵(高 → 低):
|
|
9
|
-
* - 全局(进程级):ROUTECODEX_HUB_PIPELINE_IMPL
|
|
10
|
-
* - 租户级:config.virtualRouter.*(暂未实现)
|
|
11
|
-
* - 路由级:metadata.routeHint(暂未实现)
|
|
12
|
-
* - 请求级:header X-RC-Pipeline-Impl(暂未实现)
|
|
13
|
-
*/
|
|
14
|
-
/**
|
|
15
|
-
* 解析运行模式(从环境变量)
|
|
16
|
-
*/
|
|
17
|
-
export function resolveHubPipelineMode() {
|
|
18
|
-
const raw = String(process.env.ROUTECODEX_HUB_PIPELINE_IMPL || 'ts_primary').trim().toLowerCase();
|
|
19
|
-
const validModes = [
|
|
20
|
-
'ts_primary',
|
|
21
|
-
'wasm_primary',
|
|
22
|
-
'shadow_ts',
|
|
23
|
-
'shadow_wasm',
|
|
24
|
-
'split'
|
|
25
|
-
];
|
|
26
|
-
if (validModes.includes(raw)) {
|
|
27
|
-
return raw;
|
|
28
|
-
}
|
|
29
|
-
// 兼容旧环境变量
|
|
30
|
-
if (raw === 'ts') {
|
|
31
|
-
return 'ts_primary';
|
|
32
|
-
}
|
|
33
|
-
if (raw === 'wasm' || raw === 'engine') {
|
|
34
|
-
return 'wasm_primary';
|
|
35
|
-
}
|
|
36
|
-
if (raw === 'shadow') {
|
|
37
|
-
return 'shadow_ts';
|
|
38
|
-
}
|
|
39
|
-
console.warn(`[wasm-config] Invalid ROUTECODEX_HUB_PIPELINE_IMPL: ${raw}, fallback to ts_primary`);
|
|
40
|
-
return 'ts_primary';
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* 解析分流比例
|
|
44
|
-
*/
|
|
45
|
-
export function resolveSplitRatio() {
|
|
46
|
-
const raw = process.env.ROUTECODEX_HUB_PIPELINE_SPLIT_RATIO;
|
|
47
|
-
if (!raw) {
|
|
48
|
-
return 0.5; // 默认 50/50
|
|
49
|
-
}
|
|
50
|
-
const ratio = parseFloat(raw);
|
|
51
|
-
if (isNaN(ratio) || ratio < 0 || ratio > 1) {
|
|
52
|
-
console.warn(`[wasm-config] Invalid ROUTECODEX_HUB_PIPELINE_SPLIT_RATIO: ${raw}, fallback to 0.5`);
|
|
53
|
-
return 0.5;
|
|
54
|
-
}
|
|
55
|
-
return ratio;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* 解析运行时配置
|
|
59
|
-
*/
|
|
60
|
-
export function resolveHubPipelineRuntimeConfig() {
|
|
61
|
-
const mode = resolveHubPipelineMode();
|
|
62
|
-
const splitRatio = mode === 'split' ? resolveSplitRatio() : undefined;
|
|
63
|
-
const enableShadowDiff = process.env.ROUTECODEX_HUB_PIPELINE_SHADOW_DIFF !== '0';
|
|
64
|
-
const shadowFallback = process.env.ROUTECODEX_HUB_PIPELINE_SHADOW_FALLBACK !== '0';
|
|
65
|
-
return {
|
|
66
|
-
mode,
|
|
67
|
-
splitRatio,
|
|
68
|
-
enableShadowDiff,
|
|
69
|
-
shadowFallback
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* 判断是否应该使用 WASM 作为主路
|
|
74
|
-
*/
|
|
75
|
-
export function shouldUseWasmPrimary(config) {
|
|
76
|
-
if (config.mode === 'wasm_primary' || config.mode === 'shadow_wasm') {
|
|
77
|
-
return true;
|
|
78
|
-
}
|
|
79
|
-
if (config.mode === 'split' && config.splitRatio !== undefined) {
|
|
80
|
-
// 使用 requestId 的哈希值进行一致性分流
|
|
81
|
-
return false; // 在请求分发时动态决定
|
|
82
|
-
}
|
|
83
|
-
return false;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* 判断是否应该运行影子管道
|
|
87
|
-
*/
|
|
88
|
-
export function shouldRunShadow(config) {
|
|
89
|
-
return config.mode === 'shadow_ts' || config.mode === 'shadow_wasm';
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* 获取影子管道的实现类型
|
|
93
|
-
*/
|
|
94
|
-
export function getShadowImpl(config) {
|
|
95
|
-
if (config.mode === 'shadow_ts') {
|
|
96
|
-
return 'wasm';
|
|
97
|
-
}
|
|
98
|
-
if (config.mode === 'shadow_wasm') {
|
|
99
|
-
return 'ts';
|
|
100
|
-
}
|
|
101
|
-
return 'ts'; // 默认
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* 根据分流比例决定使用哪种实现
|
|
105
|
-
*/
|
|
106
|
-
export function selectImplBySplitRatio(requestId, splitRatio) {
|
|
107
|
-
// 使用 requestId 的哈希值进行一致性分流
|
|
108
|
-
const hash = simpleHash(requestId);
|
|
109
|
-
const threshold = Math.floor(hash * 1000) / 1000;
|
|
110
|
-
return threshold < splitRatio ? 'wasm' : 'ts';
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* 简单哈希函数(用于一致性分流)
|
|
114
|
-
*/
|
|
115
|
-
function simpleHash(str) {
|
|
116
|
-
let hash = 0;
|
|
117
|
-
for (let i = 0; i < str.length; i++) {
|
|
118
|
-
const char = str.charCodeAt(i);
|
|
119
|
-
hash = (hash << 5) - hash + char;
|
|
120
|
-
hash = hash & hash; // Convert to 32bit integer
|
|
121
|
-
}
|
|
122
|
-
return Math.abs(hash) / Math.pow(2, 31); // Normalize to [0, 1]
|
|
123
|
-
}
|
|
124
|
-
//# sourceMappingURL=wasm-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wasm-config.js","sourceRoot":"","sources":["../../../src/runtime/wasm-runtime/wasm-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WASM HubPipeline 加载器
|
|
3
|
-
* 负责从 llms-engine 包加载 WASM HubPipeline 实现并提供给 Host 使用
|
|
4
|
-
*/
|
|
5
|
-
export type WasmHubPipelineCtor = new (config: {
|
|
6
|
-
virtualRouter: unknown;
|
|
7
|
-
[key: string]: unknown;
|
|
8
|
-
}) => WasmHubPipelineInstance;
|
|
9
|
-
export type WasmHubPipelineInstance = {
|
|
10
|
-
execute(request: {
|
|
11
|
-
id?: string;
|
|
12
|
-
endpoint?: string;
|
|
13
|
-
payload?: Record<string, unknown>;
|
|
14
|
-
metadata?: Record<string, unknown>;
|
|
15
|
-
}): Promise<{
|
|
16
|
-
requestId: string;
|
|
17
|
-
providerPayload: Record<string, unknown>;
|
|
18
|
-
standardizedRequest?: Record<string, unknown>;
|
|
19
|
-
processedRequest?: Record<string, unknown>;
|
|
20
|
-
routingDecision?: Record<string, unknown>;
|
|
21
|
-
routingDiagnostics?: Record<string, unknown>;
|
|
22
|
-
target?: Record<string, unknown>;
|
|
23
|
-
metadata?: Record<string, unknown>;
|
|
24
|
-
nodeResults?: Array<{
|
|
25
|
-
id: string;
|
|
26
|
-
success: boolean;
|
|
27
|
-
metadata?: Record<string, unknown>;
|
|
28
|
-
error?: unknown;
|
|
29
|
-
}>;
|
|
30
|
-
}>;
|
|
31
|
-
updateVirtualRouterConfig?(config: unknown): void;
|
|
32
|
-
};
|
|
33
|
-
/**
|
|
34
|
-
* 加载 WASM HubPipeline 构造函数
|
|
35
|
-
*/
|
|
36
|
-
export declare function loadWasmHubPipelineCtor(): Promise<WasmHubPipelineCtor>;
|
|
37
|
-
/**
|
|
38
|
-
* 清除缓存的 WASM HubPipeline 构造函数(主要用于测试)
|
|
39
|
-
*/
|
|
40
|
-
export declare function clearWasmHubPipelineCache(): void;
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WASM HubPipeline 加载器
|
|
3
|
-
* 负责从 llms-engine 包加载 WASM HubPipeline 实现并提供给 Host 使用
|
|
4
|
-
*/
|
|
5
|
-
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
6
|
-
import path from 'node:path';
|
|
7
|
-
import fs from 'node:fs';
|
|
8
|
-
// No sync loading needed in current wasm loader.
|
|
9
|
-
let cachedWasmHubPipelineCtor = null;
|
|
10
|
-
/**
|
|
11
|
-
* 解析 llms-engine 包路径
|
|
12
|
-
*/
|
|
13
|
-
function resolveWasmEnginePackageDir() {
|
|
14
|
-
let currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
15
|
-
while (true) {
|
|
16
|
-
const scope = '@jsonstudio';
|
|
17
|
-
const packageName = 'llms-engine';
|
|
18
|
-
const candidate = path.join(currentDir, 'node_modules', scope, packageName);
|
|
19
|
-
if (fs.existsSync(candidate)) {
|
|
20
|
-
return candidate;
|
|
21
|
-
}
|
|
22
|
-
const parent = path.dirname(currentDir);
|
|
23
|
-
if (parent === currentDir) {
|
|
24
|
-
break;
|
|
25
|
-
}
|
|
26
|
-
currentDir = parent;
|
|
27
|
-
}
|
|
28
|
-
throw new Error('[wasm-loader] Unable to locate llms-engine package. Please install it via npm install.');
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* 加载 WASM HubPipeline 构造函数
|
|
32
|
-
*/
|
|
33
|
-
export async function loadWasmHubPipelineCtor() {
|
|
34
|
-
if (cachedWasmHubPipelineCtor) {
|
|
35
|
-
return cachedWasmHubPipelineCtor;
|
|
36
|
-
}
|
|
37
|
-
const pkgDir = resolveWasmEnginePackageDir();
|
|
38
|
-
const hubPipelineEntry = path.join(pkgDir, 'js', 'hub-pipeline.mjs');
|
|
39
|
-
if (!fs.existsSync(hubPipelineEntry)) {
|
|
40
|
-
throw new Error(`[wasm-loader] HubPipeline entry not found at ${hubPipelineEntry}. Please verify llms-engine installation.`);
|
|
41
|
-
}
|
|
42
|
-
try {
|
|
43
|
-
const wasmModule = await import(pathToFileURL(hubPipelineEntry).href);
|
|
44
|
-
const { HubPipeline: WasmHubPipeline } = wasmModule;
|
|
45
|
-
if (typeof WasmHubPipeline !== 'function') {
|
|
46
|
-
throw new Error('[wasm-loader] HubPipeline export is not a constructor');
|
|
47
|
-
}
|
|
48
|
-
cachedWasmHubPipelineCtor = WasmHubPipeline;
|
|
49
|
-
return cachedWasmHubPipelineCtor;
|
|
50
|
-
}
|
|
51
|
-
catch (error) {
|
|
52
|
-
const detail = error instanceof Error ? error.message : String(error);
|
|
53
|
-
throw new Error(`[wasm-loader] Failed to load WASM HubPipeline: ${detail}`);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* 清除缓存的 WASM HubPipeline 构造函数(主要用于测试)
|
|
58
|
-
*/
|
|
59
|
-
export function clearWasmHubPipelineCache() {
|
|
60
|
-
cachedWasmHubPipelineCtor = null;
|
|
61
|
-
}
|
|
62
|
-
//# sourceMappingURL=wasm-loader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wasm-loader.js","sourceRoot":"","sources":["../../../src/runtime/wasm-runtime/wasm-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAgCzB,iDAAiD;AAEjD,IAAI,yBAAyB,GAA+B,IAAI,CAAC;AAEjE;;GAEG;AACH,SAAS,2BAA2B;IAClC,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,aAAa,CAAC;QAC5B,MAAM,WAAW,GAAG,aAAa,CAAC;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QAC5E,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;YAC1B,MAAM;QACR,CAAC;QACD,UAAU,GAAG,MAAM,CAAC;IACtB,CAAC;IACD,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,IAAI,yBAAyB,EAAE,CAAC;QAC9B,OAAO,yBAAyB,CAAC;IACnC,CAAC;IAED,MAAM,MAAM,GAAG,2BAA2B,EAAE,CAAC;IAC7C,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAErE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,gDAAgD,gBAAgB,2CAA2C,CAC5G,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,UAAU,CAAC;QAEpD,IAAI,OAAO,eAAe,KAAK,UAAU,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QAED,yBAAyB,GAAG,eAAsC,CAAC;QACnE,OAAO,yBAAyB,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,KAAK,CAAC,kDAAkD,MAAM,EAAE,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,yBAAyB,GAAG,IAAI,CAAC;AACnC,CAAC"}
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Antigravity Gemini 格式清理要求
|
|
3
|
-
date: 2026-01-25
|
|
4
|
-
tags:
|
|
5
|
-
- routecodex
|
|
6
|
-
- antigravity
|
|
7
|
-
- gemini
|
|
8
|
-
- claude
|
|
9
|
-
status: active
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# Antigravity Gemini 格式清理要求(gcli2api 对齐)
|
|
13
|
-
|
|
14
|
-
> [!summary]
|
|
15
|
-
> 本文汇总当前 **antigravity** 走 Gemini 协议时的格式清理要求,覆盖 **Gemini 系列** 与 **Claude 系列** 的关键输出/请求规范、UA/Headers 规范、工具历史一致性要求等。
|
|
16
|
-
> 本次改动已生效:历史 `functionCall` 强制补 `thoughtSignature: "skip_thought_signature_validator"`。
|
|
17
|
-
|
|
18
|
-
## 1) 适用范围
|
|
19
|
-
- **Gemini 系列**:`gemini-3-pro-low / gemini-3-pro-high` 等 Gemini 协议模型。
|
|
20
|
-
- **Claude 系列**:`claude-*` 走 antigravity/兼容层的 Gemini 路由时的兼容字段统一。
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## 2) UA 与 Headers(Antigravity Tools 对齐)
|
|
25
|
-
- **Antigravity 分支**:
|
|
26
|
-
- **JSON wrapper 内保留**:`requestId / requestType / userAgent / project / request`
|
|
27
|
-
- **不发送 Gemini CLI header triplet**:`x-goog-api-client / client-metadata`(避免与 Antigravity Tools 行为不一致)
|
|
28
|
-
- **不注入 session_id**(保持协议最小化)
|
|
29
|
-
- **非 Antigravity 分支**(Gemini CLI 常规):
|
|
30
|
-
- 仍可维持稳定 header triplet(用于 Gemini CLI 兼容)
|
|
31
|
-
|
|
32
|
-
> [!note]
|
|
33
|
-
> Antigravity 路径的 User-Agent 由 wrapper 里的 `userAgent: "antigravity"` 控制,Header 仅保留必要的 HTTP 通用头。
|
|
34
|
-
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
## 3) 工具与历史一致性(核心要求)
|
|
38
|
-
|
|
39
|
-
> [!important]
|
|
40
|
-
> **历史中出现的工具调用必须与当前请求 tools 对齐**。历史中不得出现当前 tools 列表中不存在的工具调用。
|
|
41
|
-
|
|
42
|
-
- **历史工具清理**:
|
|
43
|
-
- 对 **history 中出现但当前 tools 不存在** 的 `functionCall`/`functionResponse` 做 **移除或降级为纯文本**。
|
|
44
|
-
- 保持 **tools 列表与历史工具调用**的 **一一对应**。
|
|
45
|
-
- **工具名合法性**:
|
|
46
|
-
- Gemini 对函数名字符集/形状严格校验;不合法名称需 **清理或过滤**。
|
|
47
|
-
- **工具 schema 对齐**:
|
|
48
|
-
- 历史 `functionCall.args` 必须与当前工具 schema 对齐。
|
|
49
|
-
- 对 `args` 做 **结构修正**:Gemini 期望 `functionCall.args` 为对象(Struct),非对象需包 `value`。
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
## 4) Gemini 协议的格式清理要点
|
|
54
|
-
|
|
55
|
-
### 4.1 functionCall 历史补签名
|
|
56
|
-
- **新增要求(已生效)**:
|
|
57
|
-
- 历史 `functionCall` **必须包含**:
|
|
58
|
-
- `thoughtSignature: "skip_thought_signature_validator"`
|
|
59
|
-
- 这是 gcli2api 的行为:即使没有真实签名,也需要该字段以通过 Cloud Code 严格校验。
|
|
60
|
-
|
|
61
|
-
### 4.2 工具 schema 输出
|
|
62
|
-
- **始终输出工具 schema**(Gemini 需要工具声明来校验 `functionCall`/`functionResponse`)。
|
|
63
|
-
- `toolConfig.functionCallingConfig`:
|
|
64
|
-
- `NONE / ANY / ALLOWED` 按 `tool_choice` 映射。
|
|
65
|
-
|
|
66
|
-
### 4.3 Content 清理
|
|
67
|
-
- 统一 `contents` 结构,确保每条 entry 的 parts 合法。
|
|
68
|
-
- 对无效 part 做降级或过滤,避免 Gemini 侧 malformed。
|
|
69
|
-
|
|
70
|
-
---
|
|
71
|
-
|
|
72
|
-
## 5) Claude 系列在 Antigravity 中的兼容统一
|
|
73
|
-
|
|
74
|
-
- Claude-thinking / 非 thinking 输出在 antigravity 侧 **统一形态**:
|
|
75
|
-
- 保证与 Gemini/OpenAI 响应结构一致的 **content 形状**。
|
|
76
|
-
- 保持 **history/tool 行为与 Gemini 同步**(同样遵循历史工具一致性要求)。
|
|
77
|
-
|
|
78
|
-
---
|
|
79
|
-
|
|
80
|
-
## 6) 当前已生效的关键修复(含 2026-01-26 更新)
|
|
81
|
-
|
|
82
|
-
- ✅ **历史 functionCall 强制补 `thoughtSignature`**(gcli2api 行为一致)。
|
|
83
|
-
- ✅ **history/tool 对齐清理**:历史工具调用不再允许与当前 tools 不一致。
|
|
84
|
-
- ✅ **args 结构修正**:非对象 args 包装到 `{ value }`。
|
|
85
|
-
- ✅ **UA/Headers 与 Antigravity Tools 对齐**(wrapper 保留 identity,移除 Gemini CLI triplet)。
|
|
86
|
-
- ✅ **兼容层保留 wrapper 字段**:`chat:gemini` 的 `shallow_pick` 允许 `request / requestId / requestType / userAgent / project`。
|
|
87
|
-
- ✅ **上游 request 不含 metadata**:避免 `Unknown name "metadata" at 'request'`。
|
|
88
|
-
- ✅ **baseURL 对齐 prod**:`https://cloudcode-pa.googleapis.com`。
|
|
89
|
-
|
|
90
|
-
---
|
|
91
|
-
|
|
92
|
-
## 6.1) Request Wrapper 结构(Antigravity)
|
|
93
|
-
|
|
94
|
-
```json
|
|
95
|
-
{
|
|
96
|
-
"model": "gemini-3-pro",
|
|
97
|
-
"project": "your-project-id",
|
|
98
|
-
"requestId": "agent-...",
|
|
99
|
-
"requestType": "agent|web_search|image_gen",
|
|
100
|
-
"userAgent": "antigravity",
|
|
101
|
-
"request": {
|
|
102
|
-
"contents": [...],
|
|
103
|
-
"systemInstruction": {...},
|
|
104
|
-
"tools": [...],
|
|
105
|
-
"generationConfig": {...},
|
|
106
|
-
"safetySettings": [...]
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
> [!important]
|
|
112
|
-
> `request` 内部 **禁止** `metadata` 字段。
|
|
113
|
-
|
|
114
|
-
---
|
|
115
|
-
|
|
116
|
-
## 6.2) 多账号 alias 策略(Antigravity)
|
|
117
|
-
|
|
118
|
-
- **默认策略**:按 **model 维度**挑选“最佳账号”(剩余配额最高)。
|
|
119
|
-
- **不做轮询**:只有当该 alias 的该 model **为空** 才切换。
|
|
120
|
-
- **model 空判定**:
|
|
121
|
-
- quota `<= 0`
|
|
122
|
-
- 或 **429 冷却移出账号池 ≥ 30s**
|
|
123
|
-
- **数据来源**:quota 池(antigravity quota snapshot 注入到 `quotaView`)。
|
|
124
|
-
- **模型族分开**:每个 model 单独选择最佳 alias。
|
|
125
|
-
|
|
126
|
-
> [!note]
|
|
127
|
-
> “最佳账号推荐”来自 quota 池的剩余额度排序,优先消耗高配额账号以提升稳定性与命中率。
|
|
128
|
-
|
|
129
|
-
---
|
|
130
|
-
|
|
131
|
-
## 7) 验证方式(建议)
|
|
132
|
-
|
|
133
|
-
- 对比两条请求(首条无历史、次条带历史):
|
|
134
|
-
- `provider-request.json` 中 **`functionCall` 必须带 `thoughtSignature`**。
|
|
135
|
-
- `tools` 与历史 functionCall **必须一一对齐**。
|
|
136
|
-
- `args` 必须为对象(Struct)。
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
## 8) 备注
|
|
141
|
-
|
|
142
|
-
> [!note]
|
|
143
|
-
> 本次修改已验证生效。若后续仍出现 429 或 Cloud Code 严格校验失败,优先检查 **history 中工具清理是否遗漏** 或 **functionCall/Response 的结构化字段是否存在差异**。
|