@lcv-ideas-software/cross-review 4.0.0
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/CHANGELOG.md +2568 -0
- package/LICENSE +201 -0
- package/NOTICE +26 -0
- package/README.md +208 -0
- package/SECURITY.md +52 -0
- package/dist/scripts/api-streaming-smoke.d.ts +1 -0
- package/dist/scripts/api-streaming-smoke.js +78 -0
- package/dist/scripts/api-streaming-smoke.js.map +1 -0
- package/dist/scripts/runtime-default-smoke.d.ts +1 -0
- package/dist/scripts/runtime-default-smoke.js +88 -0
- package/dist/scripts/runtime-default-smoke.js.map +1 -0
- package/dist/scripts/runtime-smoke.d.ts +1 -0
- package/dist/scripts/runtime-smoke.js +148 -0
- package/dist/scripts/runtime-smoke.js.map +1 -0
- package/dist/scripts/smoke.d.ts +1 -0
- package/dist/scripts/smoke.js +6156 -0
- package/dist/scripts/smoke.js.map +1 -0
- package/dist/src/core/cache-manifest.d.ts +22 -0
- package/dist/src/core/cache-manifest.js +133 -0
- package/dist/src/core/cache-manifest.js.map +1 -0
- package/dist/src/core/caller-tokens.d.ts +32 -0
- package/dist/src/core/caller-tokens.js +240 -0
- package/dist/src/core/caller-tokens.js.map +1 -0
- package/dist/src/core/config.d.ts +9 -0
- package/dist/src/core/config.js +643 -0
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/core/convergence.d.ts +5 -0
- package/dist/src/core/convergence.js +186 -0
- package/dist/src/core/convergence.js.map +1 -0
- package/dist/src/core/cost.d.ts +59 -0
- package/dist/src/core/cost.js +359 -0
- package/dist/src/core/cost.js.map +1 -0
- package/dist/src/core/file-config.d.ts +316 -0
- package/dist/src/core/file-config.js +490 -0
- package/dist/src/core/file-config.js.map +1 -0
- package/dist/src/core/orchestrator.d.ts +199 -0
- package/dist/src/core/orchestrator.js +3430 -0
- package/dist/src/core/orchestrator.js.map +1 -0
- package/dist/src/core/prompt-parts.d.ts +58 -0
- package/dist/src/core/prompt-parts.js +122 -0
- package/dist/src/core/prompt-parts.js.map +1 -0
- package/dist/src/core/relator-lottery.d.ts +23 -0
- package/dist/src/core/relator-lottery.js +112 -0
- package/dist/src/core/relator-lottery.js.map +1 -0
- package/dist/src/core/reports.d.ts +2 -0
- package/dist/src/core/reports.js +82 -0
- package/dist/src/core/reports.js.map +1 -0
- package/dist/src/core/session-store.d.ts +149 -0
- package/dist/src/core/session-store.js +1923 -0
- package/dist/src/core/session-store.js.map +1 -0
- package/dist/src/core/status.d.ts +61 -0
- package/dist/src/core/status.js +249 -0
- package/dist/src/core/status.js.map +1 -0
- package/dist/src/core/timeouts.d.ts +2 -0
- package/dist/src/core/timeouts.js +3 -0
- package/dist/src/core/timeouts.js.map +1 -0
- package/dist/src/core/types.d.ts +604 -0
- package/dist/src/core/types.js +36 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/dashboard/server.d.ts +2 -0
- package/dist/src/dashboard/server.js +339 -0
- package/dist/src/dashboard/server.js.map +1 -0
- package/dist/src/mcp/server.d.ts +54 -0
- package/dist/src/mcp/server.js +1584 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/observability/logger.d.ts +9 -0
- package/dist/src/observability/logger.js +24 -0
- package/dist/src/observability/logger.js.map +1 -0
- package/dist/src/peers/anthropic.d.ts +14 -0
- package/dist/src/peers/anthropic.js +290 -0
- package/dist/src/peers/anthropic.js.map +1 -0
- package/dist/src/peers/base.d.ts +72 -0
- package/dist/src/peers/base.js +416 -0
- package/dist/src/peers/base.js.map +1 -0
- package/dist/src/peers/deepseek.d.ts +12 -0
- package/dist/src/peers/deepseek.js +246 -0
- package/dist/src/peers/deepseek.js.map +1 -0
- package/dist/src/peers/errors.d.ts +2 -0
- package/dist/src/peers/errors.js +185 -0
- package/dist/src/peers/errors.js.map +1 -0
- package/dist/src/peers/gemini.d.ts +13 -0
- package/dist/src/peers/gemini.js +215 -0
- package/dist/src/peers/gemini.js.map +1 -0
- package/dist/src/peers/grok.d.ts +17 -0
- package/dist/src/peers/grok.js +346 -0
- package/dist/src/peers/grok.js.map +1 -0
- package/dist/src/peers/model-selection.d.ts +4 -0
- package/dist/src/peers/model-selection.js +260 -0
- package/dist/src/peers/model-selection.js.map +1 -0
- package/dist/src/peers/openai.d.ts +14 -0
- package/dist/src/peers/openai.js +299 -0
- package/dist/src/peers/openai.js.map +1 -0
- package/dist/src/peers/perplexity.d.ts +18 -0
- package/dist/src/peers/perplexity.js +375 -0
- package/dist/src/peers/perplexity.js.map +1 -0
- package/dist/src/peers/registry.d.ts +3 -0
- package/dist/src/peers/registry.js +77 -0
- package/dist/src/peers/registry.js.map +1 -0
- package/dist/src/peers/retry.d.ts +2 -0
- package/dist/src/peers/retry.js +36 -0
- package/dist/src/peers/retry.js.map +1 -0
- package/dist/src/peers/stub.d.ts +13 -0
- package/dist/src/peers/stub.js +344 -0
- package/dist/src/peers/stub.js.map +1 -0
- package/dist/src/peers/text.d.ts +18 -0
- package/dist/src/peers/text.js +39 -0
- package/dist/src/peers/text.js.map +1 -0
- package/dist/src/security/redact.d.ts +2 -0
- package/dist/src/security/redact.js +128 -0
- package/dist/src/security/redact.js.map +1 -0
- package/docs/api-keys.md +34 -0
- package/docs/architecture.md +118 -0
- package/docs/caching.md +135 -0
- package/docs/costs.md +40 -0
- package/docs/evidence-preflight.md +88 -0
- package/docs/github-security-baseline.md +32 -0
- package/docs/model-selection.md +105 -0
- package/docs/reports/cross-review-v2-api-capability-smoke-2026-04-30.md +354 -0
- package/docs/reports/cross-review-v2-format-recovery-findings-2026-04-28.md +223 -0
- package/docs/reports/cross-review-v2-official-provider-docs-refresh-2026-05-05.md +60 -0
- package/docs/reports/cross-review-v2-token-streaming-smoke-2026-04-30.md +119 -0
- package/package.json +88 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { statusInstruction, statusJsonSchema } from "../core/status.js";
|
|
2
|
+
import { BasePeerAdapter, StreamBuffer } from "./base.js";
|
|
3
|
+
import { classifyProviderError } from "./errors.js";
|
|
4
|
+
import { withRetry } from "./retry.js";
|
|
5
|
+
import { userPrompt } from "./text.js";
|
|
6
|
+
function usageFromGemini(usage) {
|
|
7
|
+
if (!usage)
|
|
8
|
+
return undefined;
|
|
9
|
+
const cached = usage.cachedContentTokenCount ?? 0;
|
|
10
|
+
const result = {
|
|
11
|
+
input_tokens: usage.promptTokenCount,
|
|
12
|
+
output_tokens: usage.candidatesTokenCount,
|
|
13
|
+
total_tokens: usage.totalTokenCount,
|
|
14
|
+
reasoning_tokens: usage.thoughtsTokenCount,
|
|
15
|
+
};
|
|
16
|
+
if (cached > 0) {
|
|
17
|
+
result.cache_read_tokens = cached;
|
|
18
|
+
result.cache_provider_mode = "implicit";
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
result.cache_provider_mode = "not_supported";
|
|
22
|
+
}
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
function geminiThinkingConfig(model, ThinkingLevelEnum) {
|
|
26
|
+
if (/gemini-3/i.test(model)) {
|
|
27
|
+
return { includeThoughts: false, thinkingLevel: ThinkingLevelEnum.HIGH };
|
|
28
|
+
}
|
|
29
|
+
return { includeThoughts: false, thinkingBudget: -1 };
|
|
30
|
+
}
|
|
31
|
+
// v2.27.1 (cold-start hardening): cache the @google/genai module promise
|
|
32
|
+
// so the dynamic import resolves exactly once across all callers.
|
|
33
|
+
// Exported so peers/model-selection.ts can share the same module promise.
|
|
34
|
+
let _genaiModulePromise = null;
|
|
35
|
+
export function loadGenaiModule() {
|
|
36
|
+
if (!_genaiModulePromise)
|
|
37
|
+
_genaiModulePromise = import("@google/genai");
|
|
38
|
+
return _genaiModulePromise;
|
|
39
|
+
}
|
|
40
|
+
export class GeminiAdapter extends BasePeerAdapter {
|
|
41
|
+
id = "gemini";
|
|
42
|
+
provider = "google";
|
|
43
|
+
model;
|
|
44
|
+
constructor(config, modelOverride) {
|
|
45
|
+
super(config);
|
|
46
|
+
this.model = modelOverride ?? config.models.gemini;
|
|
47
|
+
}
|
|
48
|
+
async client() {
|
|
49
|
+
const apiKey = this.config.api_keys.gemini;
|
|
50
|
+
if (!apiKey)
|
|
51
|
+
throw new Error("GEMINI_API_KEY was not found in environment variables.");
|
|
52
|
+
const genai = await loadGenaiModule();
|
|
53
|
+
return { ai: new genai.GoogleGenAI({ apiKey }), ThinkingLevel: genai.ThinkingLevel };
|
|
54
|
+
}
|
|
55
|
+
async probe() {
|
|
56
|
+
const started = Date.now();
|
|
57
|
+
const authPresent = Boolean(this.config.api_keys.gemini);
|
|
58
|
+
if (!authPresent) {
|
|
59
|
+
return {
|
|
60
|
+
peer: this.id,
|
|
61
|
+
provider: this.provider,
|
|
62
|
+
model: this.model,
|
|
63
|
+
available: false,
|
|
64
|
+
auth_present: false,
|
|
65
|
+
latency_ms: Date.now() - started,
|
|
66
|
+
model_selection: this.config.model_selection.gemini,
|
|
67
|
+
message: "GEMINI_API_KEY is missing.",
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
const probeClient = await this.client();
|
|
72
|
+
const pager = await probeClient.ai.models.list({ config: { pageSize: 1 } });
|
|
73
|
+
for await (const model of pager) {
|
|
74
|
+
void model;
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
peer: this.id,
|
|
79
|
+
provider: this.provider,
|
|
80
|
+
model: this.model,
|
|
81
|
+
available: true,
|
|
82
|
+
auth_present: true,
|
|
83
|
+
latency_ms: Date.now() - started,
|
|
84
|
+
model_selection: this.config.model_selection.gemini,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
const failure = classifyProviderError(this.id, this.provider, this.model, error, 1, started);
|
|
89
|
+
return {
|
|
90
|
+
peer: this.id,
|
|
91
|
+
provider: this.provider,
|
|
92
|
+
model: this.model,
|
|
93
|
+
available: false,
|
|
94
|
+
auth_present: true,
|
|
95
|
+
latency_ms: Date.now() - started,
|
|
96
|
+
model_selection: this.config.model_selection.gemini,
|
|
97
|
+
message: failure.message,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async call(prompt, context) {
|
|
102
|
+
const started = Date.now();
|
|
103
|
+
return withRetry(this.config, async (attempt) => {
|
|
104
|
+
context.emit({
|
|
105
|
+
type: "peer.call.started",
|
|
106
|
+
session_id: context.session_id,
|
|
107
|
+
round: context.round,
|
|
108
|
+
peer: this.id,
|
|
109
|
+
message: `Gemini review attempt ${attempt}`,
|
|
110
|
+
});
|
|
111
|
+
// v2.4.0 / audit closure (P2.8): pass AbortSignal to GoogleGenAI.
|
|
112
|
+
// The SDK accepts `requestOptions.signal`; without it,
|
|
113
|
+
// session_cancel_job cannot interrupt an in-flight Gemini call
|
|
114
|
+
// and continues burning tokens until the response naturally
|
|
115
|
+
// arrives.
|
|
116
|
+
const reviewClient = await this.client();
|
|
117
|
+
const params = {
|
|
118
|
+
model: this.model,
|
|
119
|
+
contents: `${this.systemPrompt(context)}\n\n${userPrompt(prompt)}\n\n${statusInstruction()}`,
|
|
120
|
+
config: {
|
|
121
|
+
responseMimeType: "application/json",
|
|
122
|
+
responseJsonSchema: statusJsonSchema,
|
|
123
|
+
maxOutputTokens: this.config.max_output_tokens,
|
|
124
|
+
thinkingConfig: geminiThinkingConfig(this.model, reviewClient.ThinkingLevel),
|
|
125
|
+
abortSignal: context.signal,
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
if (this.shouldStreamTokens(context)) {
|
|
129
|
+
const stream = await reviewClient.ai.models.generateContentStream(params);
|
|
130
|
+
const stream_buffer = new StreamBuffer(this.id);
|
|
131
|
+
const tokenStream = this.createTokenEventBuffer(context, "review", "generateContentStream.text");
|
|
132
|
+
let last;
|
|
133
|
+
for await (const chunk of stream) {
|
|
134
|
+
last = chunk;
|
|
135
|
+
const delta = chunk.text ?? "";
|
|
136
|
+
stream_buffer.append(delta);
|
|
137
|
+
tokenStream.append(delta);
|
|
138
|
+
}
|
|
139
|
+
const text = stream_buffer.text();
|
|
140
|
+
tokenStream.complete(text.length);
|
|
141
|
+
return this.resultFromText({
|
|
142
|
+
text: text || (last?.text ?? JSON.stringify(last ?? {})),
|
|
143
|
+
raw: { streamed: true, provider: this.provider, model: last?.modelVersion },
|
|
144
|
+
usage: usageFromGemini(last?.usageMetadata),
|
|
145
|
+
started,
|
|
146
|
+
attempts: attempt,
|
|
147
|
+
modelReported: last?.modelVersion,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
const response = (await reviewClient.ai.models.generateContent(params));
|
|
151
|
+
return this.resultFromText({
|
|
152
|
+
text: response.text ?? JSON.stringify(response),
|
|
153
|
+
raw: response,
|
|
154
|
+
usage: usageFromGemini(response.usageMetadata),
|
|
155
|
+
started,
|
|
156
|
+
attempts: attempt,
|
|
157
|
+
modelReported: response.modelVersion,
|
|
158
|
+
});
|
|
159
|
+
}, (error, attempt) => classifyProviderError(this.id, this.provider, this.model, error, attempt, started));
|
|
160
|
+
}
|
|
161
|
+
async generate(prompt, context) {
|
|
162
|
+
const started = Date.now();
|
|
163
|
+
return withRetry(this.config, async (attempt) => {
|
|
164
|
+
context.emit({
|
|
165
|
+
type: "peer.generate.started",
|
|
166
|
+
session_id: context.session_id,
|
|
167
|
+
round: context.round,
|
|
168
|
+
peer: this.id,
|
|
169
|
+
message: `Gemini generation attempt ${attempt}`,
|
|
170
|
+
});
|
|
171
|
+
const generateClient = await this.client();
|
|
172
|
+
const params = {
|
|
173
|
+
model: this.model,
|
|
174
|
+
contents: `${this.systemPrompt(context)}\n\n${userPrompt(prompt)}`,
|
|
175
|
+
config: {
|
|
176
|
+
maxOutputTokens: this.config.max_output_tokens,
|
|
177
|
+
thinkingConfig: geminiThinkingConfig(this.model, generateClient.ThinkingLevel),
|
|
178
|
+
abortSignal: context.signal,
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
if (this.shouldStreamTokens(context)) {
|
|
182
|
+
const stream = await generateClient.ai.models.generateContentStream(params);
|
|
183
|
+
const stream_buffer = new StreamBuffer(this.id);
|
|
184
|
+
const tokenStream = this.createTokenEventBuffer(context, "generation", "generateContentStream.text");
|
|
185
|
+
let last;
|
|
186
|
+
for await (const chunk of stream) {
|
|
187
|
+
last = chunk;
|
|
188
|
+
const delta = chunk.text ?? "";
|
|
189
|
+
stream_buffer.append(delta);
|
|
190
|
+
tokenStream.append(delta);
|
|
191
|
+
}
|
|
192
|
+
const text = stream_buffer.text();
|
|
193
|
+
tokenStream.complete(text.length);
|
|
194
|
+
return this.generationFromText({
|
|
195
|
+
text: text || (last?.text ?? JSON.stringify(last ?? {})),
|
|
196
|
+
raw: { streamed: true, provider: this.provider, model: last?.modelVersion },
|
|
197
|
+
usage: usageFromGemini(last?.usageMetadata),
|
|
198
|
+
started,
|
|
199
|
+
attempts: attempt,
|
|
200
|
+
modelReported: last?.modelVersion,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
const response = (await generateClient.ai.models.generateContent(params));
|
|
204
|
+
return this.generationFromText({
|
|
205
|
+
text: response.text ?? JSON.stringify(response),
|
|
206
|
+
raw: response,
|
|
207
|
+
usage: usageFromGemini(response.usageMetadata),
|
|
208
|
+
started,
|
|
209
|
+
attempts: attempt,
|
|
210
|
+
modelReported: response.modelVersion,
|
|
211
|
+
});
|
|
212
|
+
}, (error, attempt) => classifyProviderError(this.id, this.provider, this.model, error, attempt, started));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/peers/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AppConfig, GenerationResult, PeerAdapter, PeerCallContext, PeerId, PeerProbeResult, PeerResult } from "../core/types.js";
|
|
2
|
+
import { BasePeerAdapter } from "./base.js";
|
|
3
|
+
type GrokReasoningEffort = "none" | "minimal" | "low" | "medium" | "high" | "xhigh";
|
|
4
|
+
export declare function clampEffortForModel(effort: GrokReasoningEffort, model: string): GrokReasoningEffort;
|
|
5
|
+
export declare const GROK_REASONING_EFFORT_MODELS: ReadonlySet<string>;
|
|
6
|
+
export declare function modelAcceptsReasoningEffort(model: string): boolean;
|
|
7
|
+
export declare class GrokAdapter extends BasePeerAdapter implements PeerAdapter {
|
|
8
|
+
id: PeerId;
|
|
9
|
+
provider: string;
|
|
10
|
+
model: string;
|
|
11
|
+
constructor(config: AppConfig, modelOverride?: string);
|
|
12
|
+
private client;
|
|
13
|
+
probe(): Promise<PeerProbeResult>;
|
|
14
|
+
call(prompt: string, context: PeerCallContext): Promise<PeerResult>;
|
|
15
|
+
generate(prompt: string, context: PeerCallContext): Promise<GenerationResult>;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
import { statusInstruction, statusJsonSchema } from "../core/status.js";
|
|
2
|
+
import { BasePeerAdapter, StreamBuffer } from "./base.js";
|
|
3
|
+
import { classifyProviderError } from "./errors.js";
|
|
4
|
+
import { loadOpenAICtor } from "./openai.js";
|
|
5
|
+
import { pairScopedCacheKey } from "../core/prompt-parts.js";
|
|
6
|
+
import { withRetry } from "./retry.js";
|
|
7
|
+
import { textFromOpenAIResponse, userPrompt } from "./text.js";
|
|
8
|
+
const GROK_BASE_URL = "https://api.x.ai/v1";
|
|
9
|
+
function usageFromGrok(usage) {
|
|
10
|
+
if (!usage)
|
|
11
|
+
return undefined;
|
|
12
|
+
// v2.21.0 (caching): xAI's grok-4.3 mirrors the OpenAI Responses API
|
|
13
|
+
// shape and surfaces cached tokens under prompt_tokens_details. The
|
|
14
|
+
// adapter is OpenAI-compatible so the same parsing path applies.
|
|
15
|
+
const cached = usage.prompt_tokens_details?.cached_tokens ?? usage.input_tokens_details?.cached_tokens ?? 0;
|
|
16
|
+
const inputTokens = usage.input_tokens ?? 0;
|
|
17
|
+
const result = {
|
|
18
|
+
input_tokens: usage.input_tokens,
|
|
19
|
+
output_tokens: usage.output_tokens,
|
|
20
|
+
total_tokens: usage.total_tokens,
|
|
21
|
+
reasoning_tokens: usage.output_tokens_details?.reasoning_tokens,
|
|
22
|
+
};
|
|
23
|
+
if (cached > 0) {
|
|
24
|
+
result.cache_read_tokens = cached;
|
|
25
|
+
if (inputTokens > cached)
|
|
26
|
+
result.cache_write_tokens = inputTokens - cached;
|
|
27
|
+
result.cache_provider_mode = "auto";
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
result.cache_provider_mode = "auto";
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
function grokEffort(value) {
|
|
35
|
+
return value === "max" ? "xhigh" : (value ?? "xhigh");
|
|
36
|
+
}
|
|
37
|
+
// v2.18.4 / Codex audit 2026-05-07 P2.1: per-model effort clamp.
|
|
38
|
+
// grok-4.3 accepts only { none, low, medium, high } per xAI docs; the
|
|
39
|
+
// internal config scale can reach "xhigh"/"max" which the multi-agent
|
|
40
|
+
// model accepts but grok-4.3 would 400 on. Clamp before send.
|
|
41
|
+
//
|
|
42
|
+
// v2.18.5 / anti-drift driver (operator directive 2026-05-07): exported
|
|
43
|
+
// so the smoke harness can verify the clamp shape directly. Behavior
|
|
44
|
+
// unchanged for in-file callers.
|
|
45
|
+
export function clampEffortForModel(effort, model) {
|
|
46
|
+
if (model === "grok-4.3") {
|
|
47
|
+
// grok-4.3 accepts only { none, low, medium, high }. Our internal
|
|
48
|
+
// post-grokEffort scale is { none, minimal, low, medium, high,
|
|
49
|
+
// xhigh } — `max` already collapsed to `xhigh` upstream. Clamp
|
|
50
|
+
// `xhigh` and `minimal` to `high` (xhigh has no equivalent on
|
|
51
|
+
// 4.3; `minimal` is a non-standard value xAI does not accept).
|
|
52
|
+
if (effort === "xhigh" || effort === "minimal")
|
|
53
|
+
return "high";
|
|
54
|
+
// none/low/medium/high pass through unchanged.
|
|
55
|
+
return effort;
|
|
56
|
+
}
|
|
57
|
+
// grok-4.20-multi-agent and others: existing scale unchanged.
|
|
58
|
+
return effort;
|
|
59
|
+
}
|
|
60
|
+
// v2.15.0/v2.16.0: per-model reasoning capability detection. Per
|
|
61
|
+
// official xAI docs at https://docs.x.ai/developers/model-capabilities/text/reasoning, only
|
|
62
|
+
// `grok-4.20-multi-agent` accepts the `reasoning.effort` body field.
|
|
63
|
+
// Other Grok models (including `grok-4-latest`, `grok-4.20`, and
|
|
64
|
+
// `grok-4.20-reasoning`) have automatic reasoning by design, so the
|
|
65
|
+
// field is unnecessary and omitted.
|
|
66
|
+
//
|
|
67
|
+
// Pre-v2.15 the GrokAdapter unconditionally included
|
|
68
|
+
// `reasoning: { effort }` in every body, locking the operator to
|
|
69
|
+
// `grok-4.20-multi-agent` to avoid 400s (v2.14.1 hotfix). v2.15
|
|
70
|
+
// detects the configured model and omits the field for non-allowlist
|
|
71
|
+
// models, freeing the operator to use ANY Grok model — including
|
|
72
|
+
// cheaper ones for routine cross-reviews while reserving 16-agent
|
|
73
|
+
// xhigh runs for heavy tasks.
|
|
74
|
+
//
|
|
75
|
+
// Allowlist is an explicit Set so adding a new reasoning-capable
|
|
76
|
+
// model is a one-line change here. Future: if xAI exposes a model
|
|
77
|
+
// capability discovery endpoint, replace the static set with a
|
|
78
|
+
// runtime probe + cache.
|
|
79
|
+
export const GROK_REASONING_EFFORT_MODELS = new Set([
|
|
80
|
+
"grok-4.20-multi-agent",
|
|
81
|
+
// v2.18.4 / Codex audit 2026-05-07 P2.1: xAI docs (WebFetch verified
|
|
82
|
+
// 2026-05-07) document grok-4.3 as supporting reasoning_effort with
|
|
83
|
+
// { none, low (default), medium, high }. Added to allowlist so the
|
|
84
|
+
// adapter sends the field; clampEffortForModel narrows xhigh/max to
|
|
85
|
+
// "high" for this model.
|
|
86
|
+
"grok-4.3",
|
|
87
|
+
]);
|
|
88
|
+
export function modelAcceptsReasoningEffort(model) {
|
|
89
|
+
return GROK_REASONING_EFFORT_MODELS.has(model);
|
|
90
|
+
}
|
|
91
|
+
export class GrokAdapter extends BasePeerAdapter {
|
|
92
|
+
id = "grok";
|
|
93
|
+
provider = "xai";
|
|
94
|
+
model;
|
|
95
|
+
constructor(config, modelOverride) {
|
|
96
|
+
super(config);
|
|
97
|
+
this.model = modelOverride ?? config.models.grok;
|
|
98
|
+
}
|
|
99
|
+
// v2.21.0 (caching): construct a per-call client so we can attach a
|
|
100
|
+
// dynamic x-grok-conv-id header derived from the pair-scoped cache
|
|
101
|
+
// key. xAI uses the header to bucket cache entries the same way
|
|
102
|
+
// OpenAI uses prompt_cache_key — it ties a sequence of calls to the
|
|
103
|
+
// same conversation/cache scope.
|
|
104
|
+
async client(callerForCache) {
|
|
105
|
+
const apiKey = this.config.api_keys.grok;
|
|
106
|
+
if (!apiKey) {
|
|
107
|
+
throw new Error("GROK_API_KEY was not found in environment variables.");
|
|
108
|
+
}
|
|
109
|
+
const Ctor = await loadOpenAICtor();
|
|
110
|
+
if (this.config.cache.enabled) {
|
|
111
|
+
const convId = pairScopedCacheKey(this.id, callerForCache ?? "operator", this.config.cache.schema_version);
|
|
112
|
+
return new Ctor({
|
|
113
|
+
apiKey,
|
|
114
|
+
baseURL: GROK_BASE_URL,
|
|
115
|
+
defaultHeaders: { "x-grok-conv-id": convId },
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return new Ctor({ apiKey, baseURL: GROK_BASE_URL });
|
|
119
|
+
}
|
|
120
|
+
async probe() {
|
|
121
|
+
const started = Date.now();
|
|
122
|
+
const authPresent = Boolean(this.config.api_keys.grok);
|
|
123
|
+
if (!authPresent) {
|
|
124
|
+
return {
|
|
125
|
+
peer: this.id,
|
|
126
|
+
provider: this.provider,
|
|
127
|
+
model: this.model,
|
|
128
|
+
available: false,
|
|
129
|
+
auth_present: false,
|
|
130
|
+
latency_ms: Date.now() - started,
|
|
131
|
+
model_selection: this.config.model_selection.grok,
|
|
132
|
+
message: "GROK_API_KEY is missing.",
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
// probe does not need cache scope — it lists models, not posts.
|
|
137
|
+
const probeClient = await this.client();
|
|
138
|
+
await probeClient.models.list();
|
|
139
|
+
return {
|
|
140
|
+
peer: this.id,
|
|
141
|
+
provider: this.provider,
|
|
142
|
+
model: this.model,
|
|
143
|
+
available: true,
|
|
144
|
+
auth_present: true,
|
|
145
|
+
latency_ms: Date.now() - started,
|
|
146
|
+
model_selection: this.config.model_selection.grok,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
const failure = classifyProviderError(this.id, this.provider, this.model, error, 1, started);
|
|
151
|
+
return {
|
|
152
|
+
peer: this.id,
|
|
153
|
+
provider: this.provider,
|
|
154
|
+
model: this.model,
|
|
155
|
+
available: false,
|
|
156
|
+
auth_present: true,
|
|
157
|
+
latency_ms: Date.now() - started,
|
|
158
|
+
model_selection: this.config.model_selection.grok,
|
|
159
|
+
message: failure.message,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
async call(prompt, context) {
|
|
164
|
+
const started = Date.now();
|
|
165
|
+
return withRetry(this.config, async (attempt) => {
|
|
166
|
+
context.emit({
|
|
167
|
+
type: "peer.call.started",
|
|
168
|
+
session_id: context.session_id,
|
|
169
|
+
round: context.round,
|
|
170
|
+
peer: this.id,
|
|
171
|
+
message: `Grok review attempt ${attempt}`,
|
|
172
|
+
});
|
|
173
|
+
const cacheKey = pairScopedCacheKey(this.id, context.caller ?? "operator", this.config.cache.schema_version);
|
|
174
|
+
const body = {
|
|
175
|
+
model: this.model,
|
|
176
|
+
input: [
|
|
177
|
+
{ role: "system", content: this.systemPrompt(context) },
|
|
178
|
+
{
|
|
179
|
+
role: "user",
|
|
180
|
+
content: `${userPrompt(prompt)}\n\n${statusInstruction()}`,
|
|
181
|
+
},
|
|
182
|
+
],
|
|
183
|
+
text: {
|
|
184
|
+
format: {
|
|
185
|
+
type: "json_schema",
|
|
186
|
+
name: "cross_review_status",
|
|
187
|
+
strict: true,
|
|
188
|
+
schema: statusJsonSchema,
|
|
189
|
+
},
|
|
190
|
+
verbosity: "low",
|
|
191
|
+
},
|
|
192
|
+
...(modelAcceptsReasoningEffort(this.model)
|
|
193
|
+
? {
|
|
194
|
+
reasoning: {
|
|
195
|
+
effort: clampEffortForModel(grokEffort(context.reasoning_effort_override ?? this.config.reasoning_effort.grok), this.model),
|
|
196
|
+
},
|
|
197
|
+
}
|
|
198
|
+
: {}),
|
|
199
|
+
store: false,
|
|
200
|
+
max_output_tokens: this.config.max_output_tokens,
|
|
201
|
+
...(this.config.cache.enabled
|
|
202
|
+
? {
|
|
203
|
+
prompt_cache_key: cacheKey,
|
|
204
|
+
prompt_cache_retention: (this.config.cache.ttl.openai === "1h"
|
|
205
|
+
? "24h"
|
|
206
|
+
: "in_memory"),
|
|
207
|
+
}
|
|
208
|
+
: {}),
|
|
209
|
+
};
|
|
210
|
+
if (this.shouldStreamTokens(context)) {
|
|
211
|
+
const stream_buffer = new StreamBuffer(this.id);
|
|
212
|
+
const tokenStream = this.createTokenEventBuffer(context, "review", "response.output_text.delta");
|
|
213
|
+
let usage;
|
|
214
|
+
let modelReported;
|
|
215
|
+
const reviewClient = await this.client(context.caller);
|
|
216
|
+
const stream = await reviewClient.responses.create({ ...body, stream: true }, { signal: context.signal, timeout: this.config.retry.timeout_ms });
|
|
217
|
+
for await (const event of stream) {
|
|
218
|
+
if (event.type === "response.output_text.delta") {
|
|
219
|
+
const delta = typeof event.delta === "string" ? event.delta : "";
|
|
220
|
+
stream_buffer.append(delta);
|
|
221
|
+
tokenStream.append(delta);
|
|
222
|
+
}
|
|
223
|
+
else if (event.type === "response.completed") {
|
|
224
|
+
usage = usageFromGrok(event.response?.usage);
|
|
225
|
+
modelReported = event.response?.model;
|
|
226
|
+
}
|
|
227
|
+
else if (event.type === "response.failed" || event.type === "response.error") {
|
|
228
|
+
const message = event.type === "response.failed"
|
|
229
|
+
? event.response?.error?.message
|
|
230
|
+
: event.error?.message;
|
|
231
|
+
throw new Error(message ?? "Grok streaming response failed.");
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const text = stream_buffer.text();
|
|
235
|
+
tokenStream.complete(text.length);
|
|
236
|
+
return this.resultFromText({
|
|
237
|
+
text,
|
|
238
|
+
raw: { streamed: true, provider: this.provider, model: modelReported ?? this.model },
|
|
239
|
+
usage,
|
|
240
|
+
started,
|
|
241
|
+
attempts: attempt,
|
|
242
|
+
modelReported,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
const reviewClient = await this.client(context.caller);
|
|
246
|
+
const response = await reviewClient.responses.create(body, {
|
|
247
|
+
signal: context.signal,
|
|
248
|
+
timeout: this.config.retry.timeout_ms,
|
|
249
|
+
});
|
|
250
|
+
return this.resultFromText({
|
|
251
|
+
text: textFromOpenAIResponse(response),
|
|
252
|
+
raw: response,
|
|
253
|
+
usage: usageFromGrok(response.usage),
|
|
254
|
+
started,
|
|
255
|
+
attempts: attempt,
|
|
256
|
+
modelReported: response.model,
|
|
257
|
+
});
|
|
258
|
+
}, (error, attempt) => classifyProviderError(this.id, this.provider, this.model, error, attempt, started));
|
|
259
|
+
}
|
|
260
|
+
async generate(prompt, context) {
|
|
261
|
+
const started = Date.now();
|
|
262
|
+
return withRetry(this.config, async (attempt) => {
|
|
263
|
+
context.emit({
|
|
264
|
+
type: "peer.generate.started",
|
|
265
|
+
session_id: context.session_id,
|
|
266
|
+
round: context.round,
|
|
267
|
+
peer: this.id,
|
|
268
|
+
message: `Grok generation attempt ${attempt}`,
|
|
269
|
+
});
|
|
270
|
+
const cacheKey = pairScopedCacheKey(this.id, context.caller ?? "operator", this.config.cache.schema_version);
|
|
271
|
+
const body = {
|
|
272
|
+
model: this.model,
|
|
273
|
+
input: [
|
|
274
|
+
{ role: "system", content: this.systemPrompt(context) },
|
|
275
|
+
{ role: "user", content: userPrompt(prompt) },
|
|
276
|
+
],
|
|
277
|
+
...(modelAcceptsReasoningEffort(this.model)
|
|
278
|
+
? {
|
|
279
|
+
reasoning: {
|
|
280
|
+
effort: clampEffortForModel(grokEffort(context.reasoning_effort_override ?? this.config.reasoning_effort.grok), this.model),
|
|
281
|
+
},
|
|
282
|
+
}
|
|
283
|
+
: {}),
|
|
284
|
+
store: false,
|
|
285
|
+
max_output_tokens: this.config.max_output_tokens,
|
|
286
|
+
...(this.config.cache.enabled
|
|
287
|
+
? {
|
|
288
|
+
prompt_cache_key: cacheKey,
|
|
289
|
+
prompt_cache_retention: (this.config.cache.ttl.openai === "1h"
|
|
290
|
+
? "24h"
|
|
291
|
+
: "in_memory"),
|
|
292
|
+
}
|
|
293
|
+
: {}),
|
|
294
|
+
};
|
|
295
|
+
if (this.shouldStreamTokens(context)) {
|
|
296
|
+
const stream_buffer = new StreamBuffer(this.id);
|
|
297
|
+
const tokenStream = this.createTokenEventBuffer(context, "generation", "response.output_text.delta");
|
|
298
|
+
let usage;
|
|
299
|
+
let modelReported;
|
|
300
|
+
const generateClient = await this.client(context.caller);
|
|
301
|
+
const stream = await generateClient.responses.create({ ...body, stream: true }, { signal: context.signal, timeout: this.config.retry.timeout_ms });
|
|
302
|
+
for await (const event of stream) {
|
|
303
|
+
if (event.type === "response.output_text.delta") {
|
|
304
|
+
const delta = typeof event.delta === "string" ? event.delta : "";
|
|
305
|
+
stream_buffer.append(delta);
|
|
306
|
+
tokenStream.append(delta);
|
|
307
|
+
}
|
|
308
|
+
else if (event.type === "response.completed") {
|
|
309
|
+
usage = usageFromGrok(event.response?.usage);
|
|
310
|
+
modelReported = event.response?.model;
|
|
311
|
+
}
|
|
312
|
+
else if (event.type === "response.failed" || event.type === "response.error") {
|
|
313
|
+
const message = event.type === "response.failed"
|
|
314
|
+
? event.response?.error?.message
|
|
315
|
+
: event.error?.message;
|
|
316
|
+
throw new Error(message ?? "Grok streaming response failed.");
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
const text = stream_buffer.text();
|
|
320
|
+
tokenStream.complete(text.length);
|
|
321
|
+
return this.generationFromText({
|
|
322
|
+
text,
|
|
323
|
+
raw: { streamed: true, provider: this.provider, model: modelReported ?? this.model },
|
|
324
|
+
usage,
|
|
325
|
+
started,
|
|
326
|
+
attempts: attempt,
|
|
327
|
+
modelReported,
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
const generateClient = await this.client(context.caller);
|
|
331
|
+
const response = await generateClient.responses.create(body, {
|
|
332
|
+
signal: context.signal,
|
|
333
|
+
timeout: this.config.retry.timeout_ms,
|
|
334
|
+
});
|
|
335
|
+
return this.generationFromText({
|
|
336
|
+
text: textFromOpenAIResponse(response),
|
|
337
|
+
raw: response,
|
|
338
|
+
usage: usageFromGrok(response.usage),
|
|
339
|
+
started,
|
|
340
|
+
attempts: attempt,
|
|
341
|
+
modelReported: response.model,
|
|
342
|
+
});
|
|
343
|
+
}, (error, attempt) => classifyProviderError(this.id, this.provider, this.model, error, attempt, started));
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=grok.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grok.js","sourceRoot":"","sources":["../../../src/peers/grok.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AppConfig, ModelCandidate, ModelSelection, PeerId } from "../core/types.js";
|
|
2
|
+
export declare function selectFromCandidates(peer: PeerId, candidates: ModelCandidate[], fallback: string): ModelSelection;
|
|
3
|
+
export declare function resolveBestModel(config: AppConfig, peer: PeerId): Promise<ModelSelection>;
|
|
4
|
+
export declare function resolveBestModels(config: AppConfig): Promise<Partial<Record<PeerId, ModelSelection>>>;
|