@roj-ai/sdk 0.1.35 → 0.1.36
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/dist/core/agents/agent.d.ts.map +1 -1
- package/dist/core/agents/agent.js +7 -3
- package/dist/core/agents/agent.js.map +1 -1
- package/dist/core/agents/state.d.ts +24 -0
- package/dist/core/agents/state.d.ts.map +1 -1
- package/dist/core/agents/state.js.map +1 -1
- package/dist/core/context/state.d.ts.map +1 -1
- package/dist/core/context/state.js +4 -0
- package/dist/core/context/state.js.map +1 -1
- package/dist/core/llm/anthropic.d.ts.map +1 -1
- package/dist/core/llm/anthropic.js +49 -8
- package/dist/core/llm/anthropic.js.map +1 -1
- package/dist/core/llm/model-shortlist-live.test.d.ts +35 -0
- package/dist/core/llm/model-shortlist-live.test.d.ts.map +1 -0
- package/dist/core/llm/model-shortlist-live.test.js +452 -0
- package/dist/core/llm/model-shortlist-live.test.js.map +1 -0
- package/dist/core/llm/openrouter-mapping.test.js +18 -0
- package/dist/core/llm/openrouter-mapping.test.js.map +1 -1
- package/dist/core/llm/openrouter.d.ts.map +1 -1
- package/dist/core/llm/openrouter.js +20 -11
- package/dist/core/llm/openrouter.js.map +1 -1
- package/dist/core/llm/provider.d.ts +34 -3
- package/dist/core/llm/provider.d.ts.map +1 -1
- package/dist/core/llm/provider.js.map +1 -1
- package/dist/core/llm/reasoning-details.test.d.ts +2 -0
- package/dist/core/llm/reasoning-details.test.d.ts.map +1 -0
- package/dist/core/llm/reasoning-details.test.js +144 -0
- package/dist/core/llm/reasoning-details.test.js.map +1 -0
- package/dist/core/llm/state.d.ts +2 -0
- package/dist/core/llm/state.d.ts.map +1 -1
- package/dist/core/llm/state.js +11 -0
- package/dist/core/llm/state.js.map +1 -1
- package/dist/core/llm/thinking-blocks.test.d.ts +2 -0
- package/dist/core/llm/thinking-blocks.test.d.ts.map +1 -0
- package/dist/core/llm/thinking-blocks.test.js +291 -0
- package/dist/core/llm/thinking-blocks.test.js.map +1 -0
- package/dist/core/reasoning-round-trip.integration.test.d.ts +2 -0
- package/dist/core/reasoning-round-trip.integration.test.d.ts.map +1 -0
- package/dist/core/reasoning-round-trip.integration.test.js +150 -0
- package/dist/core/reasoning-round-trip.integration.test.js.map +1 -0
- package/dist/core/sessions/state.d.ts.map +1 -1
- package/dist/core/sessions/state.js +5 -0
- package/dist/core/sessions/state.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/core/agents/agent.ts +9 -3
- package/src/core/agents/state.ts +26 -0
- package/src/core/context/state.ts +4 -0
- package/src/core/llm/anthropic.ts +71 -10
- package/src/core/llm/model-shortlist-live.test.ts +577 -0
- package/src/core/llm/openrouter-mapping.test.ts +24 -0
- package/src/core/llm/openrouter.ts +28 -12
- package/src/core/llm/provider.ts +44 -3
- package/src/core/llm/reasoning-details.test.ts +177 -0
- package/src/core/llm/state.ts +12 -0
- package/src/core/llm/thinking-blocks.test.ts +345 -0
- package/src/core/reasoning-round-trip.integration.test.ts +188 -0
- package/src/core/sessions/state.ts +5 -0
- package/src/index.ts +1 -0
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Live verification of the webmaster model shortlist against the real OpenRouter API.
|
|
3
|
+
*
|
|
4
|
+
* The list mirrors `AGENT_MODEL_OPTIONS` in webmaster `packages/api/feature-flags.ts` — the
|
|
5
|
+
* models an org admin can pin an edit-session agent to. Every entry there had only ever been
|
|
6
|
+
* read off a screenshot; this exercises each one through the SDK's real path:
|
|
7
|
+
*
|
|
8
|
+
* SessionManager → Session → Agent → OpenRouterProvider → openrouter.ai
|
|
9
|
+
*
|
|
10
|
+
* so a pass means *our runtime* works with the model, not merely that the model exists. The
|
|
11
|
+
* agent loop is forced through a tool call whose answer cannot be guessed (a made-up
|
|
12
|
+
* identifier), then through `tell_user`, so the assertions cover: tool call with correct
|
|
13
|
+
* arguments → tool result consumed → final user-visible answer containing the looked-up value.
|
|
14
|
+
*
|
|
15
|
+
* Every outbound HTTP body is recorded, which is what makes the secondary checks real rather
|
|
16
|
+
* than assumed:
|
|
17
|
+
*
|
|
18
|
+
* - `cache_control` — `buildHttpRequest` attaches Anthropic-shaped markers unconditionally.
|
|
19
|
+
* Recorded per request, and on a 4xx the same body is replayed with the markers stripped to
|
|
20
|
+
* prove whether they were the cause.
|
|
21
|
+
* - `reasoning_details` — the branch echoes them back on the next request. Proven by finding
|
|
22
|
+
* the key in a *later* outbound body, not by trusting the code path.
|
|
23
|
+
* - `stop` — the agent always sends `['<message']`; several shortlist models do not list
|
|
24
|
+
* `stop` in `supported_parameters`.
|
|
25
|
+
* - vision — separate one-shot requests with real PNG bytes, asserting the model names the
|
|
26
|
+
* colour rather than merely that the request shape was accepted.
|
|
27
|
+
*
|
|
28
|
+
* Opt-in, so a plain `bun test` stays hermetic and offline:
|
|
29
|
+
*
|
|
30
|
+
* LIVE_TESTS=1 OPENROUTER_API_KEY=… bun test model-shortlist-live
|
|
31
|
+
*
|
|
32
|
+
* `LIVE_MODELS` (comma-separated slugs) narrows the run to a subset.
|
|
33
|
+
*/
|
|
34
|
+
import { describe, expect, test } from 'bun:test';
|
|
35
|
+
import z4 from 'zod/v4';
|
|
36
|
+
import { MemoryEventStore } from '../../core/events/memory.js';
|
|
37
|
+
import { SessionFileStore } from '../../core/file-store/file-store.js';
|
|
38
|
+
import { SessionManager } from '../../core/sessions/session-manager.js';
|
|
39
|
+
import { createTool } from '../../core/tools/definition.js';
|
|
40
|
+
import { ToolExecutor } from '../../core/tools/executor.js';
|
|
41
|
+
import { silentLogger } from '../../lib/logger/logger.js';
|
|
42
|
+
import { agentStatusPlugin } from '../../plugins/agent-status/plugin.js';
|
|
43
|
+
import { agentsPlugin } from '../../plugins/agents/plugin.js';
|
|
44
|
+
import { filesystemPlugin } from '../../plugins/filesystem/index.js';
|
|
45
|
+
import { gitStatusPlugin } from '../../plugins/git-status/index.js';
|
|
46
|
+
import { llmDebugPlugin } from '../../plugins/llm-debug/plugin.js';
|
|
47
|
+
import { logsPlugin } from '../../plugins/logs/index.js';
|
|
48
|
+
import { mailboxPlugin } from '../../plugins/mailbox/plugin.js';
|
|
49
|
+
import { resourcesPlugin } from '../../plugins/resources/plugin.js';
|
|
50
|
+
import { servicePlugin } from '../../plugins/services/plugin.js';
|
|
51
|
+
import { presetsPlugin, sessionLifecyclePlugin } from '../../plugins/session-lifecycle/index.js';
|
|
52
|
+
import { sessionStatePlugin } from '../../plugins/session-state/plugin.js';
|
|
53
|
+
import { sessionStatsPlugin } from '../../plugins/session-stats/index.js';
|
|
54
|
+
import { uploadsPlugin } from '../../plugins/uploads/plugin.js';
|
|
55
|
+
import { userChatPlugin } from '../../plugins/user-chat/plugin.js';
|
|
56
|
+
import { createNodePlatform } from '../../testing/node-platform.js';
|
|
57
|
+
import { createTestPreset } from '../../testing/preset-helpers.js';
|
|
58
|
+
import { waitForAllAgentsIdle } from '../../testing/wait-helpers.js';
|
|
59
|
+
import { OpenRouterProvider } from './openrouter.js';
|
|
60
|
+
import { ModelId } from './schema.js';
|
|
61
|
+
// ============================================================================
|
|
62
|
+
// Gating
|
|
63
|
+
// ============================================================================
|
|
64
|
+
const liveEnabled = process.env.LIVE_TESTS === '1';
|
|
65
|
+
const openRouterApiKey = liveEnabled ? process.env.OPENROUTER_API_KEY : undefined;
|
|
66
|
+
/** Mirrors webmaster `AGENT_MODEL_OPTIONS`. Keep in sync by hand — the repos do not share code. */
|
|
67
|
+
const SHORTLIST = [
|
|
68
|
+
'anthropic/claude-haiku-4.5',
|
|
69
|
+
'anthropic/claude-sonnet-5',
|
|
70
|
+
'anthropic/claude-sonnet-4.6',
|
|
71
|
+
'anthropic/claude-opus-5',
|
|
72
|
+
'openai/gpt-5.6-luna',
|
|
73
|
+
'openai/gpt-5.6-terra',
|
|
74
|
+
'openai/gpt-5.6-sol',
|
|
75
|
+
'google/gemini-3.6-flash',
|
|
76
|
+
'x-ai/grok-4.5',
|
|
77
|
+
'moonshotai/kimi-k2.7-code',
|
|
78
|
+
'moonshotai/kimi-k3',
|
|
79
|
+
];
|
|
80
|
+
const selectedModels = process.env.LIVE_MODELS ? process.env.LIVE_MODELS.split(',').map((s) => s.trim()).filter(Boolean) : SHORTLIST;
|
|
81
|
+
/**
|
|
82
|
+
* The constant from provider-integration.test.ts, where it is commented "1x1 red pixel". It is
|
|
83
|
+
* actually a 1x1 RGBA pixel of #FFFF00 at alpha 127. Kept because xAI rejects it outright
|
|
84
|
+
* (min 8x8), which is worth knowing before someone reuses it as a vision fixture.
|
|
85
|
+
*/
|
|
86
|
+
const TINY_PNG = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==';
|
|
87
|
+
/**
|
|
88
|
+
* 32x32 opaque #0000FF — unambiguous to name, and above every provider's minimum. xAI is the
|
|
89
|
+
* binding constraint: it rejects anything under 8px per side or under 512 total pixels, so 16x16
|
|
90
|
+
* (256 px) is still too small.
|
|
91
|
+
*/
|
|
92
|
+
const BLUE_PNG_32 = 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAJklEQVR42u3NsQkAAAjAsP7/tF7hIASyp5pjAoFAIBAIBAKB4EmwOkv8Lom8x/sAAAAASUVORK5CYII=';
|
|
93
|
+
const noopImageProcessor = {
|
|
94
|
+
resolveContent: async (content) => content,
|
|
95
|
+
};
|
|
96
|
+
/** Wraps real fetch and keeps the parsed request/response pair. Auth headers are never stored. */
|
|
97
|
+
const createRecordingFetch = (sink) => {
|
|
98
|
+
return async (input, init) => {
|
|
99
|
+
const requestBody = JSON.parse(typeof init?.body === 'string' ? init.body : '{}');
|
|
100
|
+
const response = await globalThis.fetch(input, init);
|
|
101
|
+
const rawResponse = await response.text();
|
|
102
|
+
let parsed;
|
|
103
|
+
try {
|
|
104
|
+
parsed = JSON.parse(rawResponse);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
parsed = undefined;
|
|
108
|
+
}
|
|
109
|
+
sink.push({ request: requestBody, status: response.status, rawResponse, response: parsed });
|
|
110
|
+
return new Response(rawResponse, { status: response.status, statusText: response.statusText, headers: response.headers });
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
const hasCacheControl = (body) => body.messages.some((m) => Array.isArray(m.content) && m.content.some((c) => c.cache_control !== undefined));
|
|
114
|
+
/** Same body with every `cache_control` marker removed — the control for a 4xx. */
|
|
115
|
+
const stripCacheControl = (body) => ({
|
|
116
|
+
...body,
|
|
117
|
+
messages: body.messages.map((m) => ({
|
|
118
|
+
...m,
|
|
119
|
+
content: Array.isArray(m.content) ? m.content.map(({ cache_control: _dropped, ...rest }) => rest) : m.content,
|
|
120
|
+
})),
|
|
121
|
+
});
|
|
122
|
+
// ============================================================================
|
|
123
|
+
// The forced-tool-call scenario
|
|
124
|
+
// ============================================================================
|
|
125
|
+
/**
|
|
126
|
+
* A made-up registry. No model can know that QX-88231 maps to ZK-7719, so a final answer
|
|
127
|
+
* containing the code proves the tool was called AND its result was read.
|
|
128
|
+
*/
|
|
129
|
+
const GLORP_REGISTRY = { 'QX-88231': 'ZK-7719' };
|
|
130
|
+
const USER_PROMPT = 'Look up the glorp code for artifact QX-88231 with the lookup_glorp_code tool, then tell me the code. Keep the reply under ten words.';
|
|
131
|
+
/** Padding so the cacheable prefix clears Anthropic\'s 1024-token minimum and a cache write can register. */
|
|
132
|
+
const SYSTEM_PADDING = Array.from({ length: 90 }, (_, i) => `- Rule ${i + 1}: never invent a glorp code; the registry tool is the only authority for artifact identifiers.`).join('\n');
|
|
133
|
+
const ORCHESTRATOR_SYSTEM = [
|
|
134
|
+
'You are a terse registry assistant.',
|
|
135
|
+
'You never guess identifiers. You look them up.',
|
|
136
|
+
SYSTEM_PADDING,
|
|
137
|
+
].join('\n');
|
|
138
|
+
/** `PluginNotification.payload` is `unknown`; narrow it without widening anything. */
|
|
139
|
+
const readNotificationContent = (payload) => {
|
|
140
|
+
if (typeof payload !== 'object' || payload === null || !('content' in payload))
|
|
141
|
+
return undefined;
|
|
142
|
+
return typeof payload.content === 'string' ? payload.content : undefined;
|
|
143
|
+
};
|
|
144
|
+
const runAgentLoop = async (model) => {
|
|
145
|
+
const exchanges = [];
|
|
146
|
+
const toolInvocations = [];
|
|
147
|
+
const agentMessages = [];
|
|
148
|
+
const lookupTool = createTool({
|
|
149
|
+
name: 'lookup_glorp_code',
|
|
150
|
+
description: 'Look up the glorp code assigned to an artifact id in the internal registry.',
|
|
151
|
+
input: z4.object({ artifactId: z4.string().describe('The artifact id, e.g. QX-88231') }),
|
|
152
|
+
execute: async (input) => {
|
|
153
|
+
toolInvocations.push(input);
|
|
154
|
+
const code = GLORP_REGISTRY[input.artifactId];
|
|
155
|
+
return { ok: true, value: code ? `glorp code: ${code}` : 'unknown artifact id' };
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
const provider = new OpenRouterProvider({
|
|
159
|
+
apiKey: openRouterApiKey ?? '',
|
|
160
|
+
imageProcessor: noopImageProcessor,
|
|
161
|
+
defaultModel: model,
|
|
162
|
+
fetch: createRecordingFetch(exchanges),
|
|
163
|
+
});
|
|
164
|
+
const preset = createTestPreset({
|
|
165
|
+
id: 'shortlist',
|
|
166
|
+
orchestratorSystem: ORCHESTRATOR_SYSTEM,
|
|
167
|
+
});
|
|
168
|
+
preset.orchestrator.model = ModelId(model);
|
|
169
|
+
preset.orchestrator.tools = [lookupTool];
|
|
170
|
+
const basePath = `/tmp/roj-shortlist-${Math.random().toString(36).slice(2)}`;
|
|
171
|
+
const platform = createNodePlatform();
|
|
172
|
+
const sessionManager = new SessionManager({
|
|
173
|
+
eventStore: new MemoryEventStore(),
|
|
174
|
+
llmProvider: provider,
|
|
175
|
+
toolExecutor: new ToolExecutor(silentLogger),
|
|
176
|
+
presets: new Map([[preset.id, preset]]),
|
|
177
|
+
logger: silentLogger,
|
|
178
|
+
basePath,
|
|
179
|
+
dataFileStore: new SessionFileStore(basePath, undefined, false, platform.fs, 'session'),
|
|
180
|
+
platform,
|
|
181
|
+
onUserOutput: (notification) => {
|
|
182
|
+
if (notification.pluginName !== 'user-chat' || notification.type !== 'agentMessage')
|
|
183
|
+
return;
|
|
184
|
+
const content = readNotificationContent(notification.payload);
|
|
185
|
+
if (content !== undefined)
|
|
186
|
+
agentMessages.push(content);
|
|
187
|
+
},
|
|
188
|
+
systemPlugins: [
|
|
189
|
+
sessionLifecyclePlugin,
|
|
190
|
+
presetsPlugin,
|
|
191
|
+
mailboxPlugin,
|
|
192
|
+
agentsPlugin,
|
|
193
|
+
agentStatusPlugin,
|
|
194
|
+
userChatPlugin,
|
|
195
|
+
uploadsPlugin,
|
|
196
|
+
resourcesPlugin,
|
|
197
|
+
llmDebugPlugin,
|
|
198
|
+
servicePlugin,
|
|
199
|
+
filesystemPlugin,
|
|
200
|
+
logsPlugin,
|
|
201
|
+
sessionStatsPlugin,
|
|
202
|
+
sessionStatePlugin,
|
|
203
|
+
gitStatusPlugin,
|
|
204
|
+
],
|
|
205
|
+
});
|
|
206
|
+
const created = await sessionManager.createSession(preset.id);
|
|
207
|
+
if (!created.ok)
|
|
208
|
+
throw new Error(`createSession failed: ${created.error.type} — ${created.error.message}`);
|
|
209
|
+
const session = created.value;
|
|
210
|
+
const entryAgentId = session.getEntryAgentId();
|
|
211
|
+
if (!entryAgentId)
|
|
212
|
+
throw new Error('no entry agent');
|
|
213
|
+
const sent = await session.callPluginMethod('user-chat.sendMessage', {
|
|
214
|
+
sessionId: String(session.id),
|
|
215
|
+
content: USER_PROMPT,
|
|
216
|
+
agentId: String(entryAgentId),
|
|
217
|
+
});
|
|
218
|
+
if (!sent.ok)
|
|
219
|
+
throw new Error(`sendMessage failed: ${sent.error.type} — ${sent.error.message}`);
|
|
220
|
+
let idleTimedOut = false;
|
|
221
|
+
try {
|
|
222
|
+
await waitForAllAgentsIdle(session, { timeoutMs: 150_000 });
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
// A non-retryable 4xx parks the agent in `error`, which never becomes idle. The recorded
|
|
226
|
+
// exchanges are the evidence either way, so this is reported rather than thrown.
|
|
227
|
+
idleTimedOut = true;
|
|
228
|
+
}
|
|
229
|
+
const agentState = session.getAgent(entryAgentId)?.state;
|
|
230
|
+
const assistantTexts = (agentState?.conversationHistory ?? [])
|
|
231
|
+
.filter((m) => m.role === 'assistant')
|
|
232
|
+
.map((m) => (typeof m.content === 'string' ? m.content : ''))
|
|
233
|
+
.filter((text) => text.length > 0);
|
|
234
|
+
await sessionManager.shutdown();
|
|
235
|
+
const toolsOffered = (exchanges[0]?.request.tools ?? []).map((t) => t.function.name);
|
|
236
|
+
return { model, toolInvocations, agentMessages, assistantTexts, toolsOffered, exchanges, idleTimedOut };
|
|
237
|
+
};
|
|
238
|
+
// ============================================================================
|
|
239
|
+
// Reporting
|
|
240
|
+
// ============================================================================
|
|
241
|
+
/** Stable short identity for a reasoning_details array, for matching returned blocks to echoed ones. */
|
|
242
|
+
const reasoningFingerprint = (details) => {
|
|
243
|
+
if (!details?.length)
|
|
244
|
+
return null;
|
|
245
|
+
const serialized = JSON.stringify(details);
|
|
246
|
+
return `${details.length}b/${serialized.length}c/${serialized.slice(0, 24)}`;
|
|
247
|
+
};
|
|
248
|
+
/** One machine-readable line per model, so the run can be turned into a matrix afterwards. */
|
|
249
|
+
const reportOutcome = (outcome) => {
|
|
250
|
+
const { exchanges } = outcome;
|
|
251
|
+
const failures = exchanges.filter((e) => e.status >= 400);
|
|
252
|
+
const reasoningTurns = exchanges.filter((e) => (e.response?.choices?.[0]?.message?.reasoning_details?.length ?? 0) > 0).length;
|
|
253
|
+
const echoTurns = exchanges.filter((e) => e.request.messages.some((m) => m.role === 'assistant' && m.reasoning_details !== undefined)).length;
|
|
254
|
+
const assistantTurns = exchanges.flatMap((e) => e.request.messages.filter((m) => m.role === 'assistant')).length;
|
|
255
|
+
const cost = exchanges.reduce((sum, e) => sum + (e.response?.usage?.cost ?? 0), 0);
|
|
256
|
+
const cached = exchanges.reduce((sum, e) => sum + (e.response?.usage?.prompt_tokens_details?.cached_tokens ?? 0), 0);
|
|
257
|
+
const cacheWrites = exchanges.reduce((sum, e) => sum + (e.response?.usage?.prompt_tokens_details?.cache_write_tokens ?? 0), 0);
|
|
258
|
+
console.log(`RESULT ${JSON.stringify({
|
|
259
|
+
model: outcome.model,
|
|
260
|
+
requests: exchanges.length,
|
|
261
|
+
httpFailures: failures.map((f) => ({ status: f.status, body: f.rawResponse.slice(0, 400) })),
|
|
262
|
+
cacheControlSent: exchanges.every((e) => hasCacheControl(e.request)),
|
|
263
|
+
stopSent: exchanges[0]?.request.stop,
|
|
264
|
+
promptTokens: exchanges.map((e) => e.response?.usage?.prompt_tokens ?? 0),
|
|
265
|
+
cachedTokens: cached,
|
|
266
|
+
cacheWriteTokens: cacheWrites,
|
|
267
|
+
reasoningReturnedOnTurns: reasoningTurns,
|
|
268
|
+
assistantMessagesSentBack: assistantTurns,
|
|
269
|
+
assistantMessagesCarryingReasoningDetails: echoTurns,
|
|
270
|
+
reasoningTrace: exchanges.map((e, i) => ({
|
|
271
|
+
turn: i,
|
|
272
|
+
returned: reasoningFingerprint(e.response?.choices?.[0]?.message?.reasoning_details),
|
|
273
|
+
sentBack: e.request.messages.filter((m) => m.role === 'assistant').map((m) => reasoningFingerprint(m.reasoning_details)),
|
|
274
|
+
})),
|
|
275
|
+
toolInvocations: outcome.toolInvocations,
|
|
276
|
+
tellUserOffered: outcome.toolsOffered.includes('tell_user'),
|
|
277
|
+
usedTellUser: outcome.agentMessages.length > 0,
|
|
278
|
+
agentMessages: outcome.agentMessages,
|
|
279
|
+
assistantTexts: outcome.assistantTexts,
|
|
280
|
+
idleTimedOut: outcome.idleTimedOut,
|
|
281
|
+
cost,
|
|
282
|
+
})}`);
|
|
283
|
+
};
|
|
284
|
+
// ============================================================================
|
|
285
|
+
// Tests
|
|
286
|
+
// ============================================================================
|
|
287
|
+
const describeLive = (name, fn) => {
|
|
288
|
+
if (!openRouterApiKey) {
|
|
289
|
+
describe.skip(`${name} (skipped — LIVE_TESTS=1 + OPENROUTER_API_KEY required)`, fn);
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
describe(name, fn);
|
|
293
|
+
};
|
|
294
|
+
describeLive('OpenRouter shortlist — agent loop', () => {
|
|
295
|
+
for (const model of selectedModels) {
|
|
296
|
+
test(`${model} runs a tool-calling agent turn`, async () => {
|
|
297
|
+
const outcome = await runAgentLoop(model);
|
|
298
|
+
reportOutcome(outcome);
|
|
299
|
+
const failed = outcome.exchanges.filter((e) => e.status >= 400);
|
|
300
|
+
if (failed.length > 0) {
|
|
301
|
+
// Isolate the cause: replay the same body without the cache_control markers.
|
|
302
|
+
const first = failed[0];
|
|
303
|
+
const control = await globalThis.fetch('https://openrouter.ai/api/v1/chat/completions', {
|
|
304
|
+
method: 'POST',
|
|
305
|
+
headers: { 'content-type': 'application/json', 'Authorization': `Bearer ${openRouterApiKey}` },
|
|
306
|
+
body: JSON.stringify(stripCacheControl(first.request)),
|
|
307
|
+
});
|
|
308
|
+
const controlBody = await control.text();
|
|
309
|
+
console.log(`CONTROL ${JSON.stringify({ model, withoutCacheControl: control.status, body: controlBody.slice(0, 400) })}`);
|
|
310
|
+
}
|
|
311
|
+
expect(failed.map((f) => `${f.status} ${f.rawResponse.slice(0, 300)}`)).toEqual([]);
|
|
312
|
+
// The agent loop actually ran: correct tool, correct argument, result used in the answer.
|
|
313
|
+
// The answer counts whether it came back as assistant text or through `tell_user` —
|
|
314
|
+
// which one a model picks is instruction-following, not runtime compatibility.
|
|
315
|
+
expect(outcome.toolInvocations).toContainEqual({ artifactId: 'QX-88231' });
|
|
316
|
+
expect([...outcome.assistantTexts, ...outcome.agentMessages].join('\n')).toContain('ZK-7719');
|
|
317
|
+
// cache_control travelled on every request — the point of the exercise.
|
|
318
|
+
for (const exchange of outcome.exchanges) {
|
|
319
|
+
expect(hasCacheControl(exchange.request)).toBe(true);
|
|
320
|
+
}
|
|
321
|
+
// The agent always sends stop sequences, whatever the model advertises.
|
|
322
|
+
expect(outcome.exchanges[0].request.stop).toEqual(['<message']);
|
|
323
|
+
// reasoning_details round trip. The negative control comes first: a model that never
|
|
324
|
+
// reasons must produce no `reasoning_details` key anywhere on the wire, because the prompt
|
|
325
|
+
// cache is keyed on the serialized prefix and the pre-fix bytes had no such key.
|
|
326
|
+
const producedReasoning = outcome.exchanges.some((e) => (e.response?.choices?.[0]?.message?.reasoning_details?.length ?? 0) > 0);
|
|
327
|
+
const echoed = outcome.exchanges.some((e) => e.request.messages.some((m) => m.role === 'assistant' && m.reasoning_details !== undefined));
|
|
328
|
+
if (!producedReasoning) {
|
|
329
|
+
expect(echoed).toBe(false);
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
// Verbatim, on the wire: every block set that goes back out must be byte-identical to one
|
|
333
|
+
// the provider returned earlier — nothing invented, reordered or edited, which is exactly
|
|
334
|
+
// what OpenRouter rejects. All these requests came back 200 (asserted above), so the echo
|
|
335
|
+
// was also accepted.
|
|
336
|
+
//
|
|
337
|
+
// The converse does not hold and must not be asserted: an auxiliary inference
|
|
338
|
+
// (`runAuxiliaryInference`) and an empty-response retry both discard their response
|
|
339
|
+
// without committing it to history, so some returned blocks legitimately never come back.
|
|
340
|
+
const returnedFingerprints = new Set();
|
|
341
|
+
let verbatimEchoes = 0;
|
|
342
|
+
for (const exchange of outcome.exchanges) {
|
|
343
|
+
for (const message of exchange.request.messages) {
|
|
344
|
+
if (message.reasoning_details === undefined)
|
|
345
|
+
continue;
|
|
346
|
+
expect(returnedFingerprints).toContain(JSON.stringify(message.reasoning_details));
|
|
347
|
+
verbatimEchoes++;
|
|
348
|
+
}
|
|
349
|
+
const returned = exchange.response?.choices?.[0]?.message?.reasoning_details;
|
|
350
|
+
if (returned?.length)
|
|
351
|
+
returnedFingerprints.add(JSON.stringify(returned));
|
|
352
|
+
}
|
|
353
|
+
console.log(`ROUNDTRIP ${JSON.stringify({ model, verbatimEchoes, roundTripProven: verbatimEchoes > 0 })}`);
|
|
354
|
+
}, 200_000);
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
/**
|
|
358
|
+
* `stop` is sent on every agent inference (`agent.ts` hardcodes `['<message']` to stop the model
|
|
359
|
+
* hallucinating message tags), but several shortlist models do not list `stop` in
|
|
360
|
+
* `supported_parameters`. OpenRouter drops unsupported parameters instead of erroring, so the
|
|
361
|
+
* question is not "does the request fail" but "is the guard actually in force". Asking the model
|
|
362
|
+
* to emit text that straddles the stop sequence answers it: truncated → honored, intact → dropped.
|
|
363
|
+
*/
|
|
364
|
+
describeLive('OpenRouter shortlist — stop sequences', () => {
|
|
365
|
+
for (const model of selectedModels) {
|
|
366
|
+
test(`${model} stop sequence behaviour`, async () => {
|
|
367
|
+
const exchanges = [];
|
|
368
|
+
const provider = new OpenRouterProvider({
|
|
369
|
+
apiKey: openRouterApiKey ?? '',
|
|
370
|
+
imageProcessor: noopImageProcessor,
|
|
371
|
+
defaultModel: model,
|
|
372
|
+
fetch: createRecordingFetch(exchanges),
|
|
373
|
+
});
|
|
374
|
+
const result = await provider.inference({
|
|
375
|
+
model: ModelId(model),
|
|
376
|
+
systemPrompt: 'You echo text literally. No preamble, no commentary, no markdown.',
|
|
377
|
+
messages: [{ role: 'user', content: 'Repeat this line exactly, and nothing else: ALPHA<message>BRAVO' }],
|
|
378
|
+
stopSequences: ['<message'],
|
|
379
|
+
// Generous: a reasoning model spends most of its budget before the first visible token.
|
|
380
|
+
maxTokens: 512,
|
|
381
|
+
});
|
|
382
|
+
const content = result.ok ? (result.value.content ?? '') : '';
|
|
383
|
+
const reasoning = result.ok ? (result.value.reasoning ?? '') : '';
|
|
384
|
+
// `honored_killed_turn` is the dangerous one: the sequence also applies to the reasoning
|
|
385
|
+
// stream, so the model stops mid-thought and the turn yields no content at all.
|
|
386
|
+
const verdict = content.includes('ALPHA') && !content.includes('BRAVO')
|
|
387
|
+
? 'honored'
|
|
388
|
+
: content.includes('ALPHA') && content.includes('BRAVO')
|
|
389
|
+
? 'ignored'
|
|
390
|
+
: content === '' && reasoning.includes('ALPHA') && !reasoning.includes('BRAVO')
|
|
391
|
+
? 'honored_killed_turn'
|
|
392
|
+
: 'inconclusive';
|
|
393
|
+
console.log(`STOP ${JSON.stringify({
|
|
394
|
+
model,
|
|
395
|
+
status: exchanges[0]?.status,
|
|
396
|
+
stopInRequest: exchanges[0]?.request.stop,
|
|
397
|
+
verdict,
|
|
398
|
+
content,
|
|
399
|
+
reasoning: reasoning.slice(0, 200),
|
|
400
|
+
finishReason: result.ok ? result.value.finishReason : undefined,
|
|
401
|
+
error: result.ok ? undefined : result.error,
|
|
402
|
+
cost: exchanges[0]?.response?.usage?.cost,
|
|
403
|
+
})}`);
|
|
404
|
+
// The only hard requirement: sending `stop` must never break the request.
|
|
405
|
+
expect(exchanges[0]?.request.stop).toEqual(['<message']);
|
|
406
|
+
expect(exchanges[0]?.status).toBe(200);
|
|
407
|
+
}, 120_000);
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
const probeVision = async (model, imageBase64, maxTokens) => {
|
|
411
|
+
const exchanges = [];
|
|
412
|
+
const provider = new OpenRouterProvider({
|
|
413
|
+
apiKey: openRouterApiKey ?? '',
|
|
414
|
+
imageProcessor: noopImageProcessor,
|
|
415
|
+
defaultModel: model,
|
|
416
|
+
fetch: createRecordingFetch(exchanges),
|
|
417
|
+
});
|
|
418
|
+
const result = await provider.inference({
|
|
419
|
+
model: ModelId(model),
|
|
420
|
+
systemPrompt: 'You describe images. Answer with a single colour word and nothing else.',
|
|
421
|
+
messages: [{
|
|
422
|
+
role: 'user',
|
|
423
|
+
content: [
|
|
424
|
+
{ type: 'text', text: 'What colour fills this image? Answer with one colour word.' },
|
|
425
|
+
{ type: 'image_url', imageUrl: { url: `data:image/png;base64,${imageBase64}` } },
|
|
426
|
+
],
|
|
427
|
+
}],
|
|
428
|
+
maxTokens,
|
|
429
|
+
});
|
|
430
|
+
return {
|
|
431
|
+
status: exchanges[0]?.status,
|
|
432
|
+
content: result.ok ? result.value.content : undefined,
|
|
433
|
+
error: result.ok ? undefined : result.error,
|
|
434
|
+
body: result.ok ? undefined : exchanges[0]?.rawResponse.slice(0, 300),
|
|
435
|
+
cost: exchanges[0]?.response?.usage?.cost,
|
|
436
|
+
};
|
|
437
|
+
};
|
|
438
|
+
describeLive('OpenRouter shortlist — vision', () => {
|
|
439
|
+
for (const model of selectedModels) {
|
|
440
|
+
test(`${model} accepts an inline image`, async () => {
|
|
441
|
+
// Two fixtures: the existing 1x1 constant (some providers reject it on size), then a
|
|
442
|
+
// 32x32 solid blue that clears every minimum. Answering "blue" is behavioural proof the
|
|
443
|
+
// pixels arrived; a 200 with empty content only proves the request shape was accepted.
|
|
444
|
+
const tiny = await probeVision(model, TINY_PNG, 64);
|
|
445
|
+
const blue = await probeVision(model, BLUE_PNG_32, 512);
|
|
446
|
+
console.log(`VISION ${JSON.stringify({ model, tiny1x1: tiny, blue32x32: blue, sawBlue: (blue.content ?? '').toLowerCase().includes('blue') })}`);
|
|
447
|
+
expect(blue.status).toBe(200);
|
|
448
|
+
expect((blue.content ?? '').toLowerCase()).toContain('blue');
|
|
449
|
+
}, 180_000);
|
|
450
|
+
}
|
|
451
|
+
});
|
|
452
|
+
//# sourceMappingURL=model-shortlist-live.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-shortlist-live.test.js","sourceRoot":"","sources":["../../../src/core/llm/model-shortlist-live.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -169,4 +169,22 @@ describe('OpenRouterProvider buildHttpRequest', () => {
|
|
|
169
169
|
}
|
|
170
170
|
});
|
|
171
171
|
});
|
|
172
|
+
// ============================================================================
|
|
173
|
+
// Reasoning budget
|
|
174
|
+
// ============================================================================
|
|
175
|
+
describe('OpenRouterProvider reasoning budget', () => {
|
|
176
|
+
test('forwards the reasoning budget', async () => {
|
|
177
|
+
const request = buildRequest([{ role: 'user', content: 'Hello' }]);
|
|
178
|
+
request.openrouter = { reasoning: { effort: 'low' } };
|
|
179
|
+
const http = await createProvider().buildHttpRequest(request);
|
|
180
|
+
expect(http.body).toEqual(expect.objectContaining({ reasoning: { effort: 'low' } }));
|
|
181
|
+
});
|
|
182
|
+
// Omitted, not defaulted: the model's own default applies, and adding the key would
|
|
183
|
+
// rewrite the cached prefix for every request that does not want to set it. Asserted on
|
|
184
|
+
// the serialized body — an undefined-valued key is still a present key on the object.
|
|
185
|
+
test('omits reasoning when unset', async () => {
|
|
186
|
+
const http = await createProvider().buildHttpRequest(buildRequest([{ role: 'user', content: 'Hello' }]));
|
|
187
|
+
expect(JSON.stringify(http.body)).not.toContain('"reasoning"');
|
|
188
|
+
});
|
|
189
|
+
});
|
|
172
190
|
//# sourceMappingURL=openrouter-mapping.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openrouter-mapping.test.js","sourceRoot":"","sources":["../../../src/core/llm/openrouter-mapping.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"openrouter-mapping.test.js","sourceRoot":"","sources":["../../../src/core/llm/openrouter-mapping.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../../src/core/llm/openrouter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAG3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAEnD,OAAO,KAAK,EACX,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EAGR,WAAW,
|
|
1
|
+
{"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../../src/core/llm/openrouter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAG3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAEnD,OAAO,KAAK,EACX,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EAGR,WAAW,EAGX,mBAAmB,EACnB,mBAAmB,EACnB,MAAM,eAAe,CAAA;AAOtB,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,cAAc,CAAA;IAC9B,iFAAiF;IACjF,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;CAChF;AAqJD,qBAAa,kBAAmB,YAAW,WAAW;IACrD,QAAQ,CAAC,IAAI,gBAAe;IAC5B,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAQ;IACvB,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,OAAO,CAA0E;gBAE7E,MAAM,EAAE,gBAAgB;IAS9B,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IA0F9G,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,CAAC;YA8DhG,UAAU;YAUV,iBAAiB;IA6C/B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAa9B,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,YAAY;IA0BpB,OAAO,CAAC,QAAQ;CAYhB"}
|
|
@@ -119,6 +119,9 @@ export class OpenRouterProvider {
|
|
|
119
119
|
finishReason: this.mapFinishReason(choice.finish_reason),
|
|
120
120
|
metrics,
|
|
121
121
|
providerRequestId: data.id,
|
|
122
|
+
reasoning: choice.message.reasoning || undefined,
|
|
123
|
+
// Normalized to undefined here so an empty array never reaches the wire on the way back.
|
|
124
|
+
reasoningDetails: choice.message.reasoning_details?.length ? choice.message.reasoning_details : undefined,
|
|
122
125
|
});
|
|
123
126
|
}
|
|
124
127
|
catch (error) {
|
|
@@ -159,6 +162,9 @@ export class OpenRouterProvider {
|
|
|
159
162
|
if (orOpts.providers) {
|
|
160
163
|
body.provider = orOpts.providers;
|
|
161
164
|
}
|
|
165
|
+
if (orOpts.reasoning) {
|
|
166
|
+
body.reasoning = orOpts.reasoning;
|
|
167
|
+
}
|
|
162
168
|
if (orOpts.route) {
|
|
163
169
|
body.route = orOpts.route;
|
|
164
170
|
}
|
|
@@ -206,19 +212,22 @@ export class OpenRouterProvider {
|
|
|
206
212
|
tool_call_id: msg.toolCallId,
|
|
207
213
|
};
|
|
208
214
|
}
|
|
209
|
-
case 'assistant':
|
|
215
|
+
case 'assistant': {
|
|
216
|
+
const mapped = { role: 'assistant', content: msg.content };
|
|
210
217
|
if (msg.toolCalls?.length) {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
type: 'function',
|
|
217
|
-
function: { name: tc.name, arguments: JSON.stringify(tc.input) },
|
|
218
|
-
})),
|
|
219
|
-
};
|
|
218
|
+
mapped.tool_calls = msg.toolCalls.map((tc) => ({
|
|
219
|
+
id: tc.id,
|
|
220
|
+
type: 'function',
|
|
221
|
+
function: { name: tc.name, arguments: JSON.stringify(tc.input) },
|
|
222
|
+
}));
|
|
220
223
|
}
|
|
221
|
-
|
|
224
|
+
// Echoed verbatim and only when present: the provider rejects an edited or reordered
|
|
225
|
+
// sequence, and adding the key for a non-reasoning model would rewrite the cached prefix.
|
|
226
|
+
if (msg.reasoningDetails?.length) {
|
|
227
|
+
mapped.reasoning_details = msg.reasoningDetails;
|
|
228
|
+
}
|
|
229
|
+
return mapped;
|
|
230
|
+
}
|
|
222
231
|
case 'system':
|
|
223
232
|
return { role: 'system', content: msg.content };
|
|
224
233
|
case 'user':
|