56 lines
2.3 KiB
JavaScript
56 lines
2.3 KiB
JavaScript
import { describe, expect, it } from 'vitest';
|
|
import { createFullTraceSelector } from '../src/traces.js';
|
|
|
|
const message = (role, content, extra = {}) => ({ role, content, ...extra });
|
|
const example = (...messages) => ({ messages });
|
|
|
|
describe('full trace selection', () => {
|
|
it('keeps only the maximal snapshot of a growing conversation', () => {
|
|
const user = message('user', 'Start');
|
|
const first = message('assistant', 'First');
|
|
const next = message('user', 'Continue');
|
|
const last = message('assistant', 'Done');
|
|
const examples = [
|
|
example(user, first, next, last),
|
|
example(user, first),
|
|
];
|
|
|
|
expect(examples.filter(createFullTraceSelector())).toEqual([examples[0]]);
|
|
});
|
|
|
|
it('keeps every leaf when a conversation is rewound and branched', () => {
|
|
const shared = [message('user', 'Start'), message('assistant', 'Shared')];
|
|
const branchC = example(...shared, message('user', 'Choose C'), message('assistant', 'C'));
|
|
const branchD = example(...shared, message('user', 'Choose D'), message('assistant', 'D'));
|
|
const intermediate = example(...shared);
|
|
|
|
const examples = [branchD, branchC, intermediate];
|
|
expect(examples.filter(createFullTraceSelector())).toEqual([branchD, branchC]);
|
|
});
|
|
|
|
it('matches JSON tool arguments despite provider whitespace changes', () => {
|
|
const requestToolCall = message('assistant', null, {
|
|
tool_calls: [{ id: 'call_1', type: 'function', function: { name: 'run', arguments: '{ "path": "a" }' } }],
|
|
});
|
|
const echoedToolCall = message('assistant', null, {
|
|
tool_calls: [{ type: 'function', function: { arguments: '{"path":"a"}', name: 'run' }, id: 'call_1' }],
|
|
});
|
|
const newest = example(
|
|
message('user', 'Run it'), echoedToolCall,
|
|
message('tool', 'ok', { tool_call_id: 'call_1' }), message('assistant', 'Done'),
|
|
);
|
|
const intermediate = example(message('user', 'Run it'), requestToolCall);
|
|
|
|
const examples = [newest, intermediate];
|
|
expect(examples.filter(createFullTraceSelector())).toEqual([newest]);
|
|
});
|
|
|
|
it('does not combine unrelated conversations', () => {
|
|
const examples = [
|
|
example(message('user', 'One'), message('assistant', '1')),
|
|
example(message('user', 'Two'), message('assistant', '2')),
|
|
];
|
|
expect(examples.filter(createFullTraceSelector())).toEqual(examples);
|
|
});
|
|
});
|