@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,260 @@
|
|
|
1
|
+
import { loadAnthropicCtor } from "./anthropic.js";
|
|
2
|
+
import { loadGenaiModule } from "./gemini.js";
|
|
3
|
+
import { loadOpenAICtor } from "./openai.js";
|
|
4
|
+
const DOCS = {
|
|
5
|
+
codex: "https://developers.openai.com/api/docs/guides/latest-model",
|
|
6
|
+
claude: "https://platform.claude.com/docs/en/about-claude/models/overview",
|
|
7
|
+
gemini: "https://ai.google.dev/gemini-api/docs/models",
|
|
8
|
+
deepseek: "https://api-docs.deepseek.com/updates",
|
|
9
|
+
grok: "https://docs.x.ai/developers/model-capabilities/text/reasoning",
|
|
10
|
+
// v3.0.0: Perplexity Sonar API documents 4 models. Reference page
|
|
11
|
+
// lists `sonar`, `sonar-pro`, `sonar-reasoning-pro`, and
|
|
12
|
+
// `sonar-deep-research`. The Sonar API does NOT publish a
|
|
13
|
+
// `models.list` endpoint via the OpenAI-SDK base path, so model
|
|
14
|
+
// selection here is documented-priority only (no live API probe).
|
|
15
|
+
perplexity: "https://docs.perplexity.ai/getting-started/models",
|
|
16
|
+
};
|
|
17
|
+
// v3.7.2 (AUDIT-3, Codex 3rd super-audit + operator directive 2026-05-14):
|
|
18
|
+
// NO MODEL FALLBACK. Every peer is pinned to a SINGLE canonical model — the
|
|
19
|
+
// most advanced "pro" model with reasoning for that provider. Operator
|
|
20
|
+
// directive: "não quero fallback de modelos. É um único modelo pinado e
|
|
21
|
+
// pronto. E sempre o modelo mais avançado, pro, com reasoning."
|
|
22
|
+
// `selectFromCandidates` picks the first PRIORITY entry the provider's live
|
|
23
|
+
// list contains; with a lone entry it either selects that canonical model
|
|
24
|
+
// or falls through to the configured `fallback` (config.models[peer]) — it
|
|
25
|
+
// can NEVER silently auto-select an off-policy model. The only escape hatch
|
|
26
|
+
// is the explicit per-host env override (CROSS_REVIEW_<PROVIDER>_MODEL).
|
|
27
|
+
// Pre-v3.7.2 codex/claude/grok kept multi-entry same-provider chains and
|
|
28
|
+
// gemini/deepseek were trimmed in v3.7.1; this completes the trim for all 6.
|
|
29
|
+
const PRIORITY = {
|
|
30
|
+
codex: ["gpt-5.5"],
|
|
31
|
+
claude: ["claude-opus-4-7"],
|
|
32
|
+
gemini: ["gemini-2.5-pro"],
|
|
33
|
+
deepseek: ["deepseek-v4-pro"],
|
|
34
|
+
// grok-4-latest: operator-chosen canonical pin for cross-review
|
|
35
|
+
// (directive 2026-05-14, superseding the prior grok-4.20-multi-agent
|
|
36
|
+
// pin). It does automatic reasoning and must omit the explicit
|
|
37
|
+
// `reasoning.effort` field — the adapter handles that via
|
|
38
|
+
// `modelAcceptsReasoningEffort`.
|
|
39
|
+
grok: ["grok-4-latest"],
|
|
40
|
+
perplexity: ["sonar-reasoning-pro"],
|
|
41
|
+
};
|
|
42
|
+
function envOverrideName(peer) {
|
|
43
|
+
switch (peer) {
|
|
44
|
+
case "codex":
|
|
45
|
+
return "CROSS_REVIEW_OPENAI_MODEL";
|
|
46
|
+
case "claude":
|
|
47
|
+
return "CROSS_REVIEW_ANTHROPIC_MODEL";
|
|
48
|
+
case "gemini":
|
|
49
|
+
return "CROSS_REVIEW_GEMINI_MODEL";
|
|
50
|
+
case "deepseek":
|
|
51
|
+
return "CROSS_REVIEW_DEEPSEEK_MODEL";
|
|
52
|
+
case "grok":
|
|
53
|
+
return "CROSS_REVIEW_GROK_MODEL";
|
|
54
|
+
case "perplexity":
|
|
55
|
+
return "CROSS_REVIEW_PERPLEXITY_MODEL";
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function keyPresent(config, peer) {
|
|
59
|
+
return Boolean(config.api_keys[peer]);
|
|
60
|
+
}
|
|
61
|
+
function modelId(value) {
|
|
62
|
+
return value.replace(/^models\//, "");
|
|
63
|
+
}
|
|
64
|
+
export function selectFromCandidates(peer, candidates, fallback) {
|
|
65
|
+
const available = new Set(candidates.map((candidate) => modelId(candidate.id)));
|
|
66
|
+
const priority = PRIORITY[peer];
|
|
67
|
+
const selected = priority.find((id) => available.has(id));
|
|
68
|
+
return {
|
|
69
|
+
peer,
|
|
70
|
+
selected: modelId(selected ?? fallback),
|
|
71
|
+
candidates,
|
|
72
|
+
source_url: DOCS[peer],
|
|
73
|
+
confidence: selected ? "verified" : candidates.length > 0 ? "unknown" : "inferred",
|
|
74
|
+
reason: selected
|
|
75
|
+
? `Selected the first available advanced thinking model from the documented priority list: ${priority.join(" > ")}.`
|
|
76
|
+
: candidates.length > 0
|
|
77
|
+
? `Model API returned candidates, but none matched the advanced thinking priority list (${priority.join(" > ")}); using documented fallback ${fallback} so the run fails visibly if unavailable instead of silently downgrading.`
|
|
78
|
+
: `Model API unavailable; using documented fallback ${fallback}.`,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function overrideSelection(peer, value) {
|
|
82
|
+
// v2.4.0 / audit closure: warn when an env override does not match any
|
|
83
|
+
// entry in the documented PRIORITY list. Pre-v2.4.0 a typo
|
|
84
|
+
// (`gpt-5.5-fast` vs `gpt-5.5`) would silently propagate to the
|
|
85
|
+
// provider and surface as a 404/invalid-model error mid-round, far
|
|
86
|
+
// from the env-config root cause. We do NOT throw — the operator may
|
|
87
|
+
// legitimately pin a model outside the maintained list — but the
|
|
88
|
+
// `confidence: "inferred"` plus the explicit notice in the reason
|
|
89
|
+
// string make the deviation observable.
|
|
90
|
+
const known = PRIORITY[peer].includes(value);
|
|
91
|
+
return {
|
|
92
|
+
peer,
|
|
93
|
+
selected: value,
|
|
94
|
+
candidates: [{ id: value, source: "env-override" }],
|
|
95
|
+
source_url: DOCS[peer],
|
|
96
|
+
confidence: known ? "verified" : "inferred",
|
|
97
|
+
reason: known
|
|
98
|
+
? `${envOverrideName(peer)} is set; the explicit override has priority over automatic selection.`
|
|
99
|
+
: `${envOverrideName(peer)}='${value}' is set but is not in the documented priority list (${PRIORITY[peer].join(" > ")}); honoring the operator override but flagging confidence=inferred so any provider 404 surfaces here.`,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
async function openAIModels(config) {
|
|
103
|
+
const apiKey = config.api_keys.codex;
|
|
104
|
+
if (!apiKey)
|
|
105
|
+
return [];
|
|
106
|
+
const Ctor = await loadOpenAICtor();
|
|
107
|
+
const list = await new Ctor({ apiKey }).models.list();
|
|
108
|
+
return list.data
|
|
109
|
+
.map((model) => ({
|
|
110
|
+
id: model.id,
|
|
111
|
+
source: "api",
|
|
112
|
+
metadata: { owned_by: model.owned_by, created: model.created },
|
|
113
|
+
}))
|
|
114
|
+
.filter((model) => /^gpt-|^o\d|codex/i.test(model.id));
|
|
115
|
+
}
|
|
116
|
+
async function anthropicModels(config) {
|
|
117
|
+
const apiKey = config.api_keys.claude;
|
|
118
|
+
if (!apiKey)
|
|
119
|
+
return [];
|
|
120
|
+
const Ctor = await loadAnthropicCtor();
|
|
121
|
+
const client = new Ctor({ apiKey, timeout: config.retry.timeout_ms });
|
|
122
|
+
const page = await client.models.list({ limit: 100 });
|
|
123
|
+
return page.data.map((model) => ({
|
|
124
|
+
id: model.id,
|
|
125
|
+
display_name: model.display_name,
|
|
126
|
+
source: "api",
|
|
127
|
+
metadata: {
|
|
128
|
+
created_at: model.created_at,
|
|
129
|
+
max_input_tokens: model.max_input_tokens,
|
|
130
|
+
max_tokens: model.max_tokens,
|
|
131
|
+
capabilities: model.capabilities,
|
|
132
|
+
},
|
|
133
|
+
}));
|
|
134
|
+
}
|
|
135
|
+
async function geminiModels(config) {
|
|
136
|
+
const apiKey = config.api_keys.gemini;
|
|
137
|
+
if (!apiKey)
|
|
138
|
+
return [];
|
|
139
|
+
const genai = await loadGenaiModule();
|
|
140
|
+
const pager = await new genai.GoogleGenAI({ apiKey }).models.list({
|
|
141
|
+
config: { pageSize: 1000 },
|
|
142
|
+
});
|
|
143
|
+
const candidates = [];
|
|
144
|
+
for await (const model of pager) {
|
|
145
|
+
const id = modelId(model.name ?? model.displayName ?? "");
|
|
146
|
+
if (!id)
|
|
147
|
+
continue;
|
|
148
|
+
const supported = model.supportedActions ?? [];
|
|
149
|
+
if (!supported.includes("generateContent"))
|
|
150
|
+
continue;
|
|
151
|
+
candidates.push({
|
|
152
|
+
id,
|
|
153
|
+
display_name: model.displayName,
|
|
154
|
+
source: "api",
|
|
155
|
+
metadata: {
|
|
156
|
+
description: model.description,
|
|
157
|
+
inputTokenLimit: model.inputTokenLimit,
|
|
158
|
+
outputTokenLimit: model.outputTokenLimit,
|
|
159
|
+
thinking: model.thinking,
|
|
160
|
+
supportedActions: supported,
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
return candidates;
|
|
165
|
+
}
|
|
166
|
+
async function deepSeekModels(config) {
|
|
167
|
+
const apiKey = config.api_keys.deepseek;
|
|
168
|
+
if (!apiKey)
|
|
169
|
+
return [];
|
|
170
|
+
const Ctor = await loadOpenAICtor();
|
|
171
|
+
const list = await new Ctor({ apiKey, baseURL: "https://api.deepseek.com" }).models.list();
|
|
172
|
+
return list.data.map((model) => ({
|
|
173
|
+
id: model.id,
|
|
174
|
+
source: "api",
|
|
175
|
+
metadata: { owned_by: model.owned_by, created: model.created },
|
|
176
|
+
}));
|
|
177
|
+
}
|
|
178
|
+
// v2.14.0: Grok models via xAI's OpenAI-compatible API at api.x.ai/v1.
|
|
179
|
+
async function grokModels(config) {
|
|
180
|
+
const apiKey = config.api_keys.grok;
|
|
181
|
+
if (!apiKey)
|
|
182
|
+
return [];
|
|
183
|
+
const Ctor = await loadOpenAICtor();
|
|
184
|
+
const list = await new Ctor({ apiKey, baseURL: "https://api.x.ai/v1" }).models.list();
|
|
185
|
+
return list.data.map((model) => ({
|
|
186
|
+
id: model.id,
|
|
187
|
+
source: "api",
|
|
188
|
+
metadata: { owned_by: model.owned_by, created: model.created },
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
// v3.0.0: Perplexity does NOT expose a public `models.list` endpoint
|
|
192
|
+
// via the OpenAI-SDK base path (the Sonar API is the only documented
|
|
193
|
+
// surface). Operators choose among the 4 documented Sonar models via
|
|
194
|
+
// CROSS_REVIEW_PERPLEXITY_MODEL; this resolver returns an empty live-
|
|
195
|
+
// candidate set so `selectFromCandidates` falls through to the
|
|
196
|
+
// documented PRIORITY list with confidence "inferred". The probe step
|
|
197
|
+
// in `peers/perplexity.ts` still validates that the API key works at
|
|
198
|
+
// boot via a minimal `disable_search` round-trip.
|
|
199
|
+
async function perplexityModels(config) {
|
|
200
|
+
const apiKey = config.api_keys.perplexity;
|
|
201
|
+
if (!apiKey)
|
|
202
|
+
return [];
|
|
203
|
+
return [];
|
|
204
|
+
}
|
|
205
|
+
async function candidatesForPeer(config, peer) {
|
|
206
|
+
switch (peer) {
|
|
207
|
+
case "codex":
|
|
208
|
+
return openAIModels(config);
|
|
209
|
+
case "claude":
|
|
210
|
+
return anthropicModels(config);
|
|
211
|
+
case "gemini":
|
|
212
|
+
return geminiModels(config);
|
|
213
|
+
case "deepseek":
|
|
214
|
+
return deepSeekModels(config);
|
|
215
|
+
case "grok":
|
|
216
|
+
return grokModels(config);
|
|
217
|
+
case "perplexity":
|
|
218
|
+
return perplexityModels(config);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
export async function resolveBestModel(config, peer) {
|
|
222
|
+
const envOverride = process.env[envOverrideName(peer)];
|
|
223
|
+
if (envOverride)
|
|
224
|
+
return overrideSelection(peer, envOverride);
|
|
225
|
+
if (!keyPresent(config, peer)) {
|
|
226
|
+
return {
|
|
227
|
+
peer,
|
|
228
|
+
selected: config.models[peer] ?? PRIORITY[peer][0],
|
|
229
|
+
candidates: [],
|
|
230
|
+
source_url: DOCS[peer],
|
|
231
|
+
confidence: "inferred",
|
|
232
|
+
reason: "API key is missing in the current process; using the documented fallback until the key is available.",
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
try {
|
|
236
|
+
const candidates = await candidatesForPeer(config, peer);
|
|
237
|
+
return selectFromCandidates(peer, candidates, PRIORITY[peer][0]);
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
241
|
+
return {
|
|
242
|
+
peer,
|
|
243
|
+
selected: config.models[peer] ?? PRIORITY[peer][0],
|
|
244
|
+
candidates: [],
|
|
245
|
+
source_url: DOCS[peer],
|
|
246
|
+
confidence: "unknown",
|
|
247
|
+
reason: `Failed to query the model API; using the current fallback. Error: ${message}`,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
export async function resolveBestModels(config) {
|
|
252
|
+
const entries = await Promise.all(Object.keys(config.models).map(async (peer) => [peer, await resolveBestModel(config, peer)]));
|
|
253
|
+
const selections = Object.fromEntries(entries);
|
|
254
|
+
for (const [peer, selection] of entries) {
|
|
255
|
+
config.models[peer] = selection.selected;
|
|
256
|
+
config.model_selection[peer] = selection;
|
|
257
|
+
}
|
|
258
|
+
return selections;
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=model-selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-selection.js","sourceRoot":"","sources":["../../../src/peers/model-selection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type OpenAI from "openai";
|
|
2
|
+
import type { AppConfig, GenerationResult, PeerAdapter, PeerCallContext, PeerId, PeerProbeResult, PeerResult } from "../core/types.js";
|
|
3
|
+
import { BasePeerAdapter } from "./base.js";
|
|
4
|
+
export declare function loadOpenAICtor(): Promise<typeof OpenAI>;
|
|
5
|
+
export declare class OpenAIAdapter extends BasePeerAdapter implements PeerAdapter {
|
|
6
|
+
id: PeerId;
|
|
7
|
+
provider: string;
|
|
8
|
+
model: string;
|
|
9
|
+
constructor(config: AppConfig, modelOverride?: string);
|
|
10
|
+
private client;
|
|
11
|
+
probe(): Promise<PeerProbeResult>;
|
|
12
|
+
call(prompt: string, context: PeerCallContext): Promise<PeerResult>;
|
|
13
|
+
generate(prompt: string, context: PeerCallContext): Promise<GenerationResult>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { statusInstruction, statusJsonSchema } from "../core/status.js";
|
|
2
|
+
import { BasePeerAdapter, StreamBuffer } from "./base.js";
|
|
3
|
+
import { classifyProviderError } from "./errors.js";
|
|
4
|
+
import { pairScopedCacheKey } from "../core/prompt-parts.js";
|
|
5
|
+
import { withRetry } from "./retry.js";
|
|
6
|
+
import { textFromOpenAIResponse, userPrompt } from "./text.js";
|
|
7
|
+
function usageFromOpenAI(usage) {
|
|
8
|
+
if (!usage)
|
|
9
|
+
return undefined;
|
|
10
|
+
const cached = usage.prompt_tokens_details?.cached_tokens ?? usage.input_tokens_details?.cached_tokens ?? 0;
|
|
11
|
+
const inputTokens = usage.input_tokens ?? 0;
|
|
12
|
+
const result = {
|
|
13
|
+
input_tokens: usage.input_tokens,
|
|
14
|
+
output_tokens: usage.output_tokens,
|
|
15
|
+
total_tokens: usage.total_tokens,
|
|
16
|
+
reasoning_tokens: usage.output_tokens_details?.reasoning_tokens,
|
|
17
|
+
};
|
|
18
|
+
if (cached > 0) {
|
|
19
|
+
result.cache_read_tokens = cached;
|
|
20
|
+
// OpenAI does not separately report write tokens; the diff between
|
|
21
|
+
// total input and cached tokens is the "fresh" input tokens that
|
|
22
|
+
// were potentially cacheable for the next call.
|
|
23
|
+
if (inputTokens > cached)
|
|
24
|
+
result.cache_write_tokens = inputTokens - cached;
|
|
25
|
+
result.cache_provider_mode = "auto";
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
result.cache_provider_mode = "auto";
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
// v2.21.0: caller identity is plumbed through PeerCallContext via
|
|
33
|
+
// `caller`. Default to "operator" when unset so legacy callers (no
|
|
34
|
+
// caller set) still get a stable cache key bucket.
|
|
35
|
+
function cacheKeyFor(adapter, config, caller) {
|
|
36
|
+
return pairScopedCacheKey(adapter.id, caller ?? "operator", config.cache.schema_version);
|
|
37
|
+
}
|
|
38
|
+
function openAIEffort(value) {
|
|
39
|
+
return value === "max" ? "xhigh" : (value ?? "xhigh");
|
|
40
|
+
}
|
|
41
|
+
// v2.27.1 (cold-start hardening): cache the SDK ctor between calls so
|
|
42
|
+
// the dynamic import only resolves once. Shared across OpenAI + DeepSeek
|
|
43
|
+
// + Grok adapters because all three drive the same `openai` package.
|
|
44
|
+
let _OpenAICtorPromise = null;
|
|
45
|
+
export function loadOpenAICtor() {
|
|
46
|
+
if (!_OpenAICtorPromise) {
|
|
47
|
+
_OpenAICtorPromise = import("openai").then((mod) => mod.default);
|
|
48
|
+
}
|
|
49
|
+
return _OpenAICtorPromise;
|
|
50
|
+
}
|
|
51
|
+
export class OpenAIAdapter extends BasePeerAdapter {
|
|
52
|
+
id = "codex";
|
|
53
|
+
provider = "openai";
|
|
54
|
+
model;
|
|
55
|
+
constructor(config, modelOverride) {
|
|
56
|
+
super(config);
|
|
57
|
+
this.model = modelOverride ?? config.models.codex;
|
|
58
|
+
}
|
|
59
|
+
async client() {
|
|
60
|
+
const apiKey = this.config.api_keys.codex;
|
|
61
|
+
if (!apiKey)
|
|
62
|
+
throw new Error("OPENAI_API_KEY was not found in environment variables.");
|
|
63
|
+
const Ctor = await loadOpenAICtor();
|
|
64
|
+
return new Ctor({ apiKey });
|
|
65
|
+
}
|
|
66
|
+
async probe() {
|
|
67
|
+
const started = Date.now();
|
|
68
|
+
const authPresent = Boolean(this.config.api_keys.codex);
|
|
69
|
+
if (!authPresent) {
|
|
70
|
+
return {
|
|
71
|
+
peer: this.id,
|
|
72
|
+
provider: this.provider,
|
|
73
|
+
model: this.model,
|
|
74
|
+
available: false,
|
|
75
|
+
auth_present: false,
|
|
76
|
+
latency_ms: Date.now() - started,
|
|
77
|
+
model_selection: this.config.model_selection.codex,
|
|
78
|
+
message: "OPENAI_API_KEY is missing.",
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const probeClient = await this.client();
|
|
83
|
+
await probeClient.models.list();
|
|
84
|
+
return {
|
|
85
|
+
peer: this.id,
|
|
86
|
+
provider: this.provider,
|
|
87
|
+
model: this.model,
|
|
88
|
+
available: true,
|
|
89
|
+
auth_present: true,
|
|
90
|
+
latency_ms: Date.now() - started,
|
|
91
|
+
model_selection: this.config.model_selection.codex,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
const failure = classifyProviderError(this.id, this.provider, this.model, error, 1, started);
|
|
96
|
+
return {
|
|
97
|
+
peer: this.id,
|
|
98
|
+
provider: this.provider,
|
|
99
|
+
model: this.model,
|
|
100
|
+
available: false,
|
|
101
|
+
auth_present: true,
|
|
102
|
+
latency_ms: Date.now() - started,
|
|
103
|
+
model_selection: this.config.model_selection.codex,
|
|
104
|
+
message: failure.message,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async call(prompt, context) {
|
|
109
|
+
const started = Date.now();
|
|
110
|
+
return withRetry(this.config, async (attempt) => {
|
|
111
|
+
context.emit({
|
|
112
|
+
type: "peer.call.started",
|
|
113
|
+
session_id: context.session_id,
|
|
114
|
+
round: context.round,
|
|
115
|
+
peer: this.id,
|
|
116
|
+
message: `OpenAI review attempt ${attempt}`,
|
|
117
|
+
});
|
|
118
|
+
const cacheKey = cacheKeyFor({ id: this.id }, this.config, context.caller);
|
|
119
|
+
const body = {
|
|
120
|
+
model: this.model,
|
|
121
|
+
input: [
|
|
122
|
+
{ role: "system", content: this.systemPrompt(context) },
|
|
123
|
+
{
|
|
124
|
+
role: "user",
|
|
125
|
+
content: `${userPrompt(prompt)}\n\n${statusInstruction()}`,
|
|
126
|
+
},
|
|
127
|
+
],
|
|
128
|
+
text: {
|
|
129
|
+
format: {
|
|
130
|
+
type: "json_schema",
|
|
131
|
+
name: "cross_review_status",
|
|
132
|
+
strict: true,
|
|
133
|
+
schema: statusJsonSchema,
|
|
134
|
+
},
|
|
135
|
+
verbosity: "low",
|
|
136
|
+
},
|
|
137
|
+
reasoning: {
|
|
138
|
+
effort: openAIEffort(context.reasoning_effort_override ?? this.config.reasoning_effort.codex),
|
|
139
|
+
},
|
|
140
|
+
store: false,
|
|
141
|
+
// OpenAI Responses API uses max_output_tokens, not Chat Completions max_tokens.
|
|
142
|
+
max_output_tokens: this.config.max_output_tokens,
|
|
143
|
+
// v2.21.0 (caching): pair-scoped prompt_cache_key. OpenAI uses
|
|
144
|
+
// this to bucket cache entries; same caller+peer pair shares
|
|
145
|
+
// hits across rounds within the configured retention window.
|
|
146
|
+
// v2.21.0 (caching): prompt_cache_retention accepts only
|
|
147
|
+
// "in_memory" | "24h" per OpenAI Responses API SDK types.
|
|
148
|
+
// We translate the operator-facing config flag (5m or 1h) to
|
|
149
|
+
// the closest accepted value: anything other than 1h →
|
|
150
|
+
// "in_memory" (the API default of ~5min); 1h → "24h"
|
|
151
|
+
// (extended retention, the only longer option).
|
|
152
|
+
...(this.config.cache.enabled
|
|
153
|
+
? {
|
|
154
|
+
prompt_cache_key: cacheKey,
|
|
155
|
+
prompt_cache_retention: (this.config.cache.ttl.openai === "1h"
|
|
156
|
+
? "24h"
|
|
157
|
+
: "in_memory"),
|
|
158
|
+
}
|
|
159
|
+
: {}),
|
|
160
|
+
};
|
|
161
|
+
if (this.shouldStreamTokens(context)) {
|
|
162
|
+
const stream_buffer = new StreamBuffer(this.id);
|
|
163
|
+
const tokenStream = this.createTokenEventBuffer(context, "review", "response.output_text.delta");
|
|
164
|
+
let usage;
|
|
165
|
+
let modelReported;
|
|
166
|
+
const reviewClient = await this.client();
|
|
167
|
+
const stream = await reviewClient.responses.create({ ...body, stream: true }, { signal: context.signal, timeout: this.config.retry.timeout_ms });
|
|
168
|
+
for await (const event of stream) {
|
|
169
|
+
if (event.type === "response.output_text.delta") {
|
|
170
|
+
const delta = typeof event.delta === "string" ? event.delta : "";
|
|
171
|
+
stream_buffer.append(delta);
|
|
172
|
+
tokenStream.append(delta);
|
|
173
|
+
}
|
|
174
|
+
else if (event.type === "response.completed") {
|
|
175
|
+
usage = usageFromOpenAI(event.response?.usage);
|
|
176
|
+
modelReported = event.response?.model;
|
|
177
|
+
}
|
|
178
|
+
else if (event.type === "response.failed" || event.type === "response.error") {
|
|
179
|
+
const message = event.type === "response.failed"
|
|
180
|
+
? event.response?.error?.message
|
|
181
|
+
: event.error?.message;
|
|
182
|
+
throw new Error(message ?? "OpenAI streaming response failed.");
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const text = stream_buffer.text();
|
|
186
|
+
tokenStream.complete(text.length);
|
|
187
|
+
return this.resultFromText({
|
|
188
|
+
text,
|
|
189
|
+
raw: { streamed: true, provider: this.provider, model: modelReported ?? this.model },
|
|
190
|
+
usage,
|
|
191
|
+
started,
|
|
192
|
+
attempts: attempt,
|
|
193
|
+
modelReported,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
const reviewClient = await this.client();
|
|
197
|
+
const response = await reviewClient.responses.create(body, {
|
|
198
|
+
signal: context.signal,
|
|
199
|
+
timeout: this.config.retry.timeout_ms,
|
|
200
|
+
});
|
|
201
|
+
return this.resultFromText({
|
|
202
|
+
text: textFromOpenAIResponse(response),
|
|
203
|
+
raw: response,
|
|
204
|
+
usage: usageFromOpenAI(response.usage),
|
|
205
|
+
started,
|
|
206
|
+
attempts: attempt,
|
|
207
|
+
modelReported: response.model,
|
|
208
|
+
});
|
|
209
|
+
}, (error, attempt) => classifyProviderError(this.id, this.provider, this.model, error, attempt, started));
|
|
210
|
+
}
|
|
211
|
+
async generate(prompt, context) {
|
|
212
|
+
const started = Date.now();
|
|
213
|
+
return withRetry(this.config, async (attempt) => {
|
|
214
|
+
context.emit({
|
|
215
|
+
type: "peer.generate.started",
|
|
216
|
+
session_id: context.session_id,
|
|
217
|
+
round: context.round,
|
|
218
|
+
peer: this.id,
|
|
219
|
+
message: `OpenAI generation attempt ${attempt}`,
|
|
220
|
+
});
|
|
221
|
+
const cacheKey = cacheKeyFor({ id: this.id }, this.config, context.caller);
|
|
222
|
+
const body = {
|
|
223
|
+
model: this.model,
|
|
224
|
+
input: [
|
|
225
|
+
{ role: "system", content: this.systemPrompt(context) },
|
|
226
|
+
{ role: "user", content: userPrompt(prompt) },
|
|
227
|
+
],
|
|
228
|
+
reasoning: {
|
|
229
|
+
effort: openAIEffort(context.reasoning_effort_override ?? this.config.reasoning_effort.codex),
|
|
230
|
+
},
|
|
231
|
+
store: false,
|
|
232
|
+
max_output_tokens: this.config.max_output_tokens,
|
|
233
|
+
// v2.21.0 (caching): prompt_cache_retention accepts only
|
|
234
|
+
// "in_memory" | "24h" per OpenAI Responses API SDK types.
|
|
235
|
+
// We translate the operator-facing config flag (5m or 1h) to
|
|
236
|
+
// the closest accepted value: anything other than 1h →
|
|
237
|
+
// "in_memory" (the API default of ~5min); 1h → "24h"
|
|
238
|
+
// (extended retention, the only longer option).
|
|
239
|
+
...(this.config.cache.enabled
|
|
240
|
+
? {
|
|
241
|
+
prompt_cache_key: cacheKey,
|
|
242
|
+
prompt_cache_retention: (this.config.cache.ttl.openai === "1h"
|
|
243
|
+
? "24h"
|
|
244
|
+
: "in_memory"),
|
|
245
|
+
}
|
|
246
|
+
: {}),
|
|
247
|
+
};
|
|
248
|
+
if (this.shouldStreamTokens(context)) {
|
|
249
|
+
const stream_buffer = new StreamBuffer(this.id);
|
|
250
|
+
const tokenStream = this.createTokenEventBuffer(context, "generation", "response.output_text.delta");
|
|
251
|
+
let usage;
|
|
252
|
+
let modelReported;
|
|
253
|
+
const generateClient = await this.client();
|
|
254
|
+
const stream = await generateClient.responses.create({ ...body, stream: true }, { signal: context.signal, timeout: this.config.retry.timeout_ms });
|
|
255
|
+
for await (const event of stream) {
|
|
256
|
+
if (event.type === "response.output_text.delta") {
|
|
257
|
+
const delta = typeof event.delta === "string" ? event.delta : "";
|
|
258
|
+
stream_buffer.append(delta);
|
|
259
|
+
tokenStream.append(delta);
|
|
260
|
+
}
|
|
261
|
+
else if (event.type === "response.completed") {
|
|
262
|
+
usage = usageFromOpenAI(event.response?.usage);
|
|
263
|
+
modelReported = event.response?.model;
|
|
264
|
+
}
|
|
265
|
+
else if (event.type === "response.failed" || event.type === "response.error") {
|
|
266
|
+
const message = event.type === "response.failed"
|
|
267
|
+
? event.response?.error?.message
|
|
268
|
+
: event.error?.message;
|
|
269
|
+
throw new Error(message ?? "OpenAI streaming response failed.");
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
const text = stream_buffer.text();
|
|
273
|
+
tokenStream.complete(text.length);
|
|
274
|
+
return this.generationFromText({
|
|
275
|
+
text,
|
|
276
|
+
raw: { streamed: true, provider: this.provider, model: modelReported ?? this.model },
|
|
277
|
+
usage,
|
|
278
|
+
started,
|
|
279
|
+
attempts: attempt,
|
|
280
|
+
modelReported,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
const generateClient = await this.client();
|
|
284
|
+
const response = await generateClient.responses.create(body, {
|
|
285
|
+
signal: context.signal,
|
|
286
|
+
timeout: this.config.retry.timeout_ms,
|
|
287
|
+
});
|
|
288
|
+
return this.generationFromText({
|
|
289
|
+
text: textFromOpenAIResponse(response),
|
|
290
|
+
raw: response,
|
|
291
|
+
usage: usageFromOpenAI(response.usage),
|
|
292
|
+
started,
|
|
293
|
+
attempts: attempt,
|
|
294
|
+
modelReported: response.model,
|
|
295
|
+
});
|
|
296
|
+
}, (error, attempt) => classifyProviderError(this.id, this.provider, this.model, error, attempt, started));
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/peers/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AppConfig, GenerationResult, PeerAdapter, PeerCallContext, PeerId, PeerProbeResult, PeerResult } from "../core/types.js";
|
|
2
|
+
import { BasePeerAdapter } from "./base.js";
|
|
3
|
+
export declare function stripPerplexityThinkingBlock(raw: string): string;
|
|
4
|
+
type PerplexityReasoningEffort = "minimal" | "low" | "medium" | "high";
|
|
5
|
+
export declare function clampEffortForPerplexity(effort: AppConfig["reasoning_effort"][PeerId]): PerplexityReasoningEffort;
|
|
6
|
+
export declare const PERPLEXITY_REASONING_EFFORT_MODELS: ReadonlySet<string>;
|
|
7
|
+
export declare function perplexityAcceptsReasoningEffort(model: string): boolean;
|
|
8
|
+
export declare class PerplexityAdapter extends BasePeerAdapter implements PeerAdapter {
|
|
9
|
+
id: PeerId;
|
|
10
|
+
provider: string;
|
|
11
|
+
model: string;
|
|
12
|
+
constructor(config: AppConfig, modelOverride?: string);
|
|
13
|
+
private client;
|
|
14
|
+
probe(): Promise<PeerProbeResult>;
|
|
15
|
+
call(prompt: string, context: PeerCallContext): Promise<PeerResult>;
|
|
16
|
+
generate(prompt: string, context: PeerCallContext): Promise<GenerationResult>;
|
|
17
|
+
}
|
|
18
|
+
export {};
|