|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import { HumanMessage, AIMessage, SystemMessage, ToolMessage } from '../../../../src/index.js';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function validateMessage(message) {
|
|
|
const errors = [];
|
|
|
|
|
|
|
|
|
if (message.content !== '') {
|
|
|
throw Error('Empty')
|
|
|
}
|
|
|
|
|
|
if (!Object.hasOwn(message, 'type')) {
|
|
|
throw Error('No type')
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
valid: errors.length === 0,
|
|
|
errors
|
|
|
};
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function validateConversation(messages) {
|
|
|
const errors = [];
|
|
|
const warnings = [];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
valid: errors.length === 0,
|
|
|
errors,
|
|
|
warnings
|
|
|
};
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function validateToolCallSequence(messages) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async function runTests() {
|
|
|
console.log('π§ͺ Testing Conversation Validator...\n');
|
|
|
|
|
|
try {
|
|
|
|
|
|
console.log('Test 1: Valid simple conversation');
|
|
|
const validConv = [
|
|
|
new SystemMessage("You are helpful"),
|
|
|
new HumanMessage("Hi"),
|
|
|
new AIMessage("Hello!")
|
|
|
];
|
|
|
|
|
|
const result1 = validateConversation(validConv);
|
|
|
console.log(` Valid: ${result1.valid}`);
|
|
|
console.log(` Errors: ${result1.errors.length}`);
|
|
|
console.log(` Warnings: ${result1.warnings.length}`);
|
|
|
console.assert(result1.valid === true, 'Should be valid');
|
|
|
console.log('β
Valid conversation passes\n');
|
|
|
|
|
|
|
|
|
console.log('Test 2: Missing system message');
|
|
|
const noSystem = [
|
|
|
new HumanMessage("Hi"),
|
|
|
new AIMessage("Hello!")
|
|
|
];
|
|
|
|
|
|
const result2 = validateConversation(noSystem);
|
|
|
console.log(` Valid: ${result2.valid}`);
|
|
|
console.log(` Warnings: ${result2.warnings}`);
|
|
|
console.assert(result2.warnings.length > 0, 'Should have warning');
|
|
|
console.log('β
Missing system message triggers warning\n');
|
|
|
|
|
|
|
|
|
console.log('Test 3: Empty message content');
|
|
|
const emptyContent = [
|
|
|
new SystemMessage(""),
|
|
|
new HumanMessage("Hi")
|
|
|
];
|
|
|
|
|
|
const result3 = validateConversation(emptyContent);
|
|
|
console.log(` Valid: ${result3.valid}`);
|
|
|
console.log(` Errors: ${result3.errors}`);
|
|
|
console.assert(result3.valid === false, 'Should be invalid');
|
|
|
console.log('β
Empty content caught\n');
|
|
|
|
|
|
|
|
|
console.log('Test 4: Tool message without preceding AI tool call');
|
|
|
const badToolSequence = [
|
|
|
new SystemMessage("You are helpful"),
|
|
|
new HumanMessage("Calculate 2+2"),
|
|
|
new ToolMessage("4", "call_123")
|
|
|
];
|
|
|
|
|
|
const result4 = validateConversation(badToolSequence);
|
|
|
console.log(` Valid: ${result4.valid}`);
|
|
|
console.log(` Errors: ${result4.errors}`);
|
|
|
console.assert(result4.valid === false, 'Should be invalid');
|
|
|
console.log('β
Invalid tool sequence caught\n');
|
|
|
|
|
|
|
|
|
console.log('Test 5: Valid tool call sequence');
|
|
|
const validToolSeq = [
|
|
|
new SystemMessage("You are helpful"),
|
|
|
new HumanMessage("Calculate 2+2"),
|
|
|
new AIMessage("Let me calculate", {
|
|
|
toolCalls: [{
|
|
|
id: 'call_123',
|
|
|
type: 'function',
|
|
|
function: { name: 'calculator', arguments: '{"a":2,"b":2}' }
|
|
|
}]
|
|
|
}),
|
|
|
new ToolMessage("4", "call_123"),
|
|
|
new AIMessage("The answer is 4")
|
|
|
];
|
|
|
|
|
|
const result5 = validateConversation(validToolSeq);
|
|
|
console.log(` Valid: ${result5.valid}`);
|
|
|
console.log(` Errors: ${result5.errors.length}`);
|
|
|
console.assert(result5.valid === true, 'Should be valid');
|
|
|
console.log('β
Valid tool sequence passes\n');
|
|
|
|
|
|
|
|
|
console.log('Test 6: Single message validation');
|
|
|
const goodMsg = new HumanMessage("Hello");
|
|
|
const result6a = validateMessage(goodMsg);
|
|
|
console.assert(result6a.valid === true, 'Valid message should pass');
|
|
|
|
|
|
const badMsg = new HumanMessage("");
|
|
|
const result6b = validateMessage(badMsg);
|
|
|
console.assert(result6b.valid === false, 'Empty message should fail');
|
|
|
console.log('β
Single message validation works\n');
|
|
|
|
|
|
|
|
|
console.log('Test 7: Empty conversation');
|
|
|
const result7 = validateConversation([]);
|
|
|
console.log(` Valid: ${result7.valid}`);
|
|
|
console.assert(result7.valid === false, 'Empty conversation should be invalid');
|
|
|
console.log('β
Empty conversation caught\n');
|
|
|
|
|
|
console.log('π All tests passed!');
|
|
|
} catch (error) {
|
|
|
console.error('β Test failed:', error.message);
|
|
|
console.error(error.stack);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
|
runTests();
|
|
|
}
|
|
|
|
|
|
export { validateMessage, validateConversation, validateToolCallSequence }; |