Forked from vadimfedenko/analyze-images
Forked from vadimfedenko/analyze-images
scripts / strata-analysis-smoke.cjs
scripts / strata-analysis-smoke.cjs
const assert = require('node:assert/strict');
const { mkdtemp, writeFile } = require('node:fs/promises');
const { join } = require('node:path');
const { tmpdir } = require('node:os');
const http = require('node:http');
const { toolsProvider } = require('../dist/toolsProvider');
(async () => {
const root = await mkdtemp(join(tmpdir(), 'aia-strata-final-result-'));
const bytes = Buffer.from('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+aWQAAAABJRU5ErkJggg==', 'base64');
await writeFile(join(root, 'image.png'), bytes);
await writeFile(join(root, 'image.json'), JSON.stringify({ caption: 'verified fixture', sourcePageUrl: 'https://example.invalid/image' }));
let resolveRequest;
const received = new Promise(resolve => { resolveRequest = resolve; });
let count = 0;
const server = http.createServer(async (req, res) => {
let raw = '';
for await (const part of req) raw += part;
const body = JSON.parse(raw);
count++;
if (count === 1) resolveRequest({ req, res, body });
else if (count === 2) { res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify({ choices: [{ message: { content: 'Second isolated result.' } }] })); }
else { res.writeHead(503); res.end('unavailable'); }
});
await new Promise(resolve => server.listen(0, '127.0.0.1', resolve));
const baseUrl = `http://127.0.0.1:${server.address().port}/v1`;
let backend = 'auto';
let localSelections = 0;
const ctl = {
getWorkingDirectory: () => root,
getPluginConfig: () => ({ get: key => ({ analysisBackend: backend, strataModel: 'strata' })[key] }),
getGlobalPluginConfig: () => ({ get: key => ({ strataBaseUrl: baseUrl, strataApiKey: 'local-test-key' })[key] }),
client: { llm: { model: async () => {
localSelections++;
return { vision: true, identifier: 'strata-vision-primer', respond() { throw new Error('UI helper must not run inference'); } };
} }, files: { prepareImageBase64() { throw new Error('Local prediction must not be prepared'); } } },
};
const context = { status() {}, warn() {}, signal: new AbortController().signal, callId: 1 };
try {
const analyze = (await toolsProvider(ctl))[2];
let settled = false;
const running = analyze.implementation({ imageName: 'image.png', prompt: 'Find visual evidence.', context: '' }, context).then(result => { settled = true; return result; });
const { req, res, body } = await received;
assert.equal(settled, false, 'The tool must wait for the actual analysis before returning');
assert.equal(req.headers.authorization, 'Bearer local-test-key');
assert.equal(body.stream, false);
assert.equal(body.tools, undefined);
assert.equal(body.reasoning_effort, 'none');
assert.equal(body.messages.length, 1);
assert.match(body.messages[0].content[0].text, /Find visual evidence/);
assert.equal(body.messages[0].content[1].image_url.url, `data:image/png;base64,${bytes.toString('base64')}`);
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({ choices: [{ message: { content: 'Completed separate visual analysis.' } }] }));
const result = await running;
assert.equal(result.analysis, 'Completed separate visual analysis.');
assert.equal(result.analysisDeferred, undefined);
assert.equal(result._aiaStrataAnalysis, undefined);
assert.equal(result._aiaImageCandidate.relativePath, 'image.png');
assert.equal(localSelections, 1);
backend = 'strata';
assert.equal((await analyze.implementation({ imageName: 'image.png', prompt: 'Analyze again.' }, context)).analysis, 'Second isolated result.');
assert.equal(localSelections, 1, 'Explicit Strata mode must bypass local model selection');
await assert.rejects(analyze.implementation({ imageName: 'image.png', prompt: 'Test failure.' }, context), /HTTP 503/);
const aborted = new AbortController(); aborted.abort();
await assert.rejects(analyze.implementation({ imageName: 'image.png', prompt: 'Cancelled request.' }, { ...context, signal: aborted.signal }), /abort/i);
assert.equal(count, 3);
console.log('PASS: actual HTTP image-analysis request; tool stays pending until response, returns completed analysis, never runs helper inference, bypasses local selection in Strata mode, and handles HTTP failure/cancellation.');
} finally { server.closeAllConnections(); await new Promise(resolve => server.close(resolve)); }
})().catch(error => { console.error(error); process.exitCode = 1; });
const assert = require('node:assert/strict');
const { mkdtemp, writeFile } = require('node:fs/promises');
const { join } = require('node:path');
const { tmpdir } = require('node:os');
const http = require('node:http');
const { toolsProvider } = require('../dist/toolsProvider');
(async () => {
const root = await mkdtemp(join(tmpdir(), 'aia-strata-final-result-'));
const bytes = Buffer.from('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+aWQAAAABJRU5ErkJggg==', 'base64');
await writeFile(join(root, 'image.png'), bytes);
await writeFile(join(root, 'image.json'), JSON.stringify({ caption: 'verified fixture', sourcePageUrl: 'https://example.invalid/image' }));
let resolveRequest;
const received = new Promise(resolve => { resolveRequest = resolve; });
let count = 0;
const server = http.createServer(async (req, res) => {
let raw = '';
for await (const part of req) raw += part;
const body = JSON.parse(raw);
count++;
if (count === 1) resolveRequest({ req, res, body });
else if (count === 2) { res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify({ choices: [{ message: { content: 'Second isolated result.' } }] })); }
else { res.writeHead(503); res.end('unavailable'); }
});
await new Promise(resolve => server.listen(0, '127.0.0.1', resolve));
const baseUrl = `http://127.0.0.1:${server.address().port}/v1`;
let backend = 'auto';
let localSelections = 0;
const ctl = {
getWorkingDirectory: () => root,
getPluginConfig: () => ({ get: key => ({ analysisBackend: backend, strataModel: 'strata' })[key] }),
getGlobalPluginConfig: () => ({ get: key => ({ strataBaseUrl: baseUrl, strataApiKey: 'local-test-key' })[key] }),
client: { llm: { model: async () => {
localSelections++;
return { vision: true, identifier: 'strata-vision-primer', respond() { throw new Error('UI helper must not run inference'); } };
} }, files: { prepareImageBase64() { throw new Error('Local prediction must not be prepared'); } } },
};
const context = { status() {}, warn() {}, signal: new AbortController().signal, callId: 1 };
try {
const analyze = (await toolsProvider(ctl))[2];
let settled = false;
const running = analyze.implementation({ imageName: 'image.png', prompt: 'Find visual evidence.', context: '' }, context).then(result => { settled = true; return result; });
const { req, res, body } = await received;
assert.equal(settled, false, 'The tool must wait for the actual analysis before returning');
assert.equal(req.headers.authorization, 'Bearer local-test-key');
assert.equal(body.stream, false);
assert.equal(body.tools, undefined);
assert.equal(body.reasoning_effort, 'none');
assert.equal(body.messages.length, 1);
assert.match(body.messages[0].content[0].text, /Find visual evidence/);
assert.equal(body.messages[0].content[1].image_url.url, `data:image/png;base64,${bytes.toString('base64')}`);
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({ choices: [{ message: { content: 'Completed separate visual analysis.' } }] }));
const result = await running;
assert.equal(result.analysis, 'Completed separate visual analysis.');
assert.equal(result.analysisDeferred, undefined);
assert.equal(result._aiaStrataAnalysis, undefined);
assert.equal(result._aiaImageCandidate.relativePath, 'image.png');
assert.equal(localSelections, 1);
backend = 'strata';
assert.equal((await analyze.implementation({ imageName: 'image.png', prompt: 'Analyze again.' }, context)).analysis, 'Second isolated result.');
assert.equal(localSelections, 1, 'Explicit Strata mode must bypass local model selection');
await assert.rejects(analyze.implementation({ imageName: 'image.png', prompt: 'Test failure.' }, context), /HTTP 503/);
const aborted = new AbortController(); aborted.abort();
await assert.rejects(analyze.implementation({ imageName: 'image.png', prompt: 'Cancelled request.' }, { ...context, signal: aborted.signal }), /abort/i);
assert.equal(count, 3);
console.log('PASS: actual HTTP image-analysis request; tool stays pending until response, returns completed analysis, never runs helper inference, bypasses local selection in Strata mode, and handles HTTP failure/cancellation.');
} finally { server.closeAllConnections(); await new Promise(resolve => server.close(resolve)); }
})().catch(error => { console.error(error); process.exitCode = 1; });