Vendored
+61
@@ -31,6 +31,22 @@ function testCatalog() {
|
||||
assert.strictEqual(catalog.findCatalogEntry('qwen3-8b').vision, false);
|
||||
assert.strictEqual(catalog.toolDialectFor('gemma4-4b'), 'gemma4');
|
||||
assert.strictEqual(catalog.toolDialectFor('qwen3-8b'), 'hermes');
|
||||
assert.strictEqual(catalog.toolDialectFor('qwen3.5-2b'), 'qwen35');
|
||||
assert.strictEqual(catalog.toolDialectFor('qwen3.5-0.8b'), 'qwen35');
|
||||
assert.strictEqual(catalog.toolDialectFor('QWEN3_5_2B_MULTIMODAL_Q4_K_M'), 'qwen35');
|
||||
assert.strictEqual(catalog.findCatalogEntry('qwen3.5-2b').tools, true);
|
||||
assert.strictEqual(catalog.findCatalogEntry('qwen3.5-2b').compactTools, true);
|
||||
assert.strictEqual(catalog.findCatalogEntry('qwen3.5-0.8b').tools, true);
|
||||
assert.strictEqual(catalog.findCatalogEntry('qwen3.5-0.8b').compactTools, true);
|
||||
assert.strictEqual(catalog.isCompactToolModel('qwen3.5-2b'), true);
|
||||
assert.strictEqual(catalog.isCompactToolModel('qwen3.5-0.8b'), true);
|
||||
assert.strictEqual(catalog.isCompactToolModel('qwen3.5-4b'), false);
|
||||
const tiny = catalog.filterToolsForModel(
|
||||
[{ name: 'web_search' }, { name: 'qvac_capability' }, { name: 'cu_drag' }],
|
||||
'qwen3.5-0.8b',
|
||||
);
|
||||
assert.deepStrictEqual(tiny.map((t) => t.name), ['web_search']);
|
||||
assert.strictEqual(catalog.filterToolsForModel([{ name: 'cu_drag' }], 'qwen3.5-4b')[0].name, 'cu_drag');
|
||||
assert.ok(/~5 GB/.test(catalog.catalogLabel(catalog.findCatalogEntry('qwen3-8b'))));
|
||||
assert.ok(catalog.FALLBACK_LLM_IDS.indexOf('gemma4-4b') >= 0);
|
||||
const listed = catalog.listCatalog().find((m) => m.id === 'gemma4-2b');
|
||||
@@ -250,7 +266,52 @@ function testDevicePrefersGpu() {
|
||||
assert.strictEqual(device.backendLabel(norm).backend, 'vulkan');
|
||||
}
|
||||
|
||||
function testToolParse() {
|
||||
const parse = require('../lib/tool-parse.js');
|
||||
const tools = [
|
||||
{ name: 'web_search', parameters: { type: 'object', properties: { query: { type: 'string' } } } },
|
||||
{ name: 'run_terminal_cmd', parameters: { type: 'object', properties: { command: { type: 'string' } } } },
|
||||
];
|
||||
const xml = [
|
||||
'<think>',
|
||||
'I should look that up.',
|
||||
'<tool_call>',
|
||||
'<function=web_search>',
|
||||
'<parameter=query>weather in Paris</parameter>',
|
||||
'</function>',
|
||||
'</tool_call>',
|
||||
'</think>',
|
||||
].join('\n');
|
||||
const nested = parse.extractCalls(xml, tools);
|
||||
assert.strictEqual(nested.length, 1);
|
||||
assert.strictEqual(nested[0].name, 'web_search');
|
||||
assert.strictEqual(nested[0].arguments.query, 'weather in Paris');
|
||||
|
||||
const hermes = parse.extractCalls(
|
||||
'<think><tool_call>{"name":"web_search","arguments":{"query":"news"}}</tool_call></think>',
|
||||
tools
|
||||
);
|
||||
assert.strictEqual(hermes[0].name, 'web_search');
|
||||
assert.strictEqual(hermes[0].arguments.query, 'news');
|
||||
|
||||
const aliased = parse.extractCalls(
|
||||
'<tool_call><function=search><parameter=query>headlines</parameter></function></tool_call>',
|
||||
tools
|
||||
);
|
||||
assert.strictEqual(aliased[0].name, 'web_search');
|
||||
|
||||
const recovered = parse.recover({
|
||||
thinking: xml,
|
||||
text: 'I will search now.\n<tool_call><function=web_search><parameter=query>x</parameter></function></tool_call>',
|
||||
tools,
|
||||
});
|
||||
assert.strictEqual(recovered.calls[0].name, 'web_search');
|
||||
assert.strictEqual(recovered.text, 'I will search now.');
|
||||
assert.ok(parse.FORMAT_REMINDER.indexOf('<function=TOOL_NAME>') >= 0);
|
||||
}
|
||||
|
||||
testCatalog();
|
||||
testToolParse();
|
||||
testCompaction();
|
||||
testSearchReplace();
|
||||
testToolSet();
|
||||
|
||||
Reference in New Issue
Block a user