mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-02-13 21:14:24 +01:00
127 lines
4.1 KiB
TypeScript
127 lines
4.1 KiB
TypeScript
|
|
import { buildToolSet, BuildToolSetConfig } from './tools';
|
||
|
|
|
||
|
|
describe('buildToolSet', () => {
|
||
|
|
describe('event-driven mode (toolDefinitions)', () => {
|
||
|
|
it('builds toolSet from toolDefinitions when available', () => {
|
||
|
|
const agentConfig: BuildToolSetConfig = {
|
||
|
|
toolDefinitions: [
|
||
|
|
{ name: 'tool_search', description: 'Search for tools' },
|
||
|
|
{ name: 'list_commits_mcp_github', description: 'List commits' },
|
||
|
|
{ name: 'calculator', description: 'Calculate' },
|
||
|
|
],
|
||
|
|
tools: [],
|
||
|
|
};
|
||
|
|
|
||
|
|
const toolSet = buildToolSet(agentConfig);
|
||
|
|
|
||
|
|
expect(toolSet.size).toBe(3);
|
||
|
|
expect(toolSet.has('tool_search')).toBe(true);
|
||
|
|
expect(toolSet.has('list_commits_mcp_github')).toBe(true);
|
||
|
|
expect(toolSet.has('calculator')).toBe(true);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('includes tool_search in toolSet for deferred tools workflow', () => {
|
||
|
|
const agentConfig: BuildToolSetConfig = {
|
||
|
|
toolDefinitions: [
|
||
|
|
{ name: 'tool_search', description: 'Search for deferred tools' },
|
||
|
|
{ name: 'deferred_tool_1', description: 'A deferred tool', defer_loading: true },
|
||
|
|
{ name: 'deferred_tool_2', description: 'Another deferred tool', defer_loading: true },
|
||
|
|
],
|
||
|
|
};
|
||
|
|
|
||
|
|
const toolSet = buildToolSet(agentConfig);
|
||
|
|
|
||
|
|
expect(toolSet.has('tool_search')).toBe(true);
|
||
|
|
expect(toolSet.has('deferred_tool_1')).toBe(true);
|
||
|
|
expect(toolSet.has('deferred_tool_2')).toBe(true);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('prefers toolDefinitions over tools when both are present', () => {
|
||
|
|
const agentConfig: BuildToolSetConfig = {
|
||
|
|
toolDefinitions: [{ name: 'from_definitions' }],
|
||
|
|
tools: [{ name: 'from_tools' }],
|
||
|
|
};
|
||
|
|
|
||
|
|
const toolSet = buildToolSet(agentConfig);
|
||
|
|
|
||
|
|
expect(toolSet.size).toBe(1);
|
||
|
|
expect(toolSet.has('from_definitions')).toBe(true);
|
||
|
|
expect(toolSet.has('from_tools')).toBe(false);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('legacy mode (tools)', () => {
|
||
|
|
it('falls back to tools when toolDefinitions is empty', () => {
|
||
|
|
const agentConfig: BuildToolSetConfig = {
|
||
|
|
toolDefinitions: [],
|
||
|
|
tools: [{ name: 'web_search' }, { name: 'calculator' }],
|
||
|
|
};
|
||
|
|
|
||
|
|
const toolSet = buildToolSet(agentConfig);
|
||
|
|
|
||
|
|
expect(toolSet.size).toBe(2);
|
||
|
|
expect(toolSet.has('web_search')).toBe(true);
|
||
|
|
expect(toolSet.has('calculator')).toBe(true);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('falls back to tools when toolDefinitions is undefined', () => {
|
||
|
|
const agentConfig: BuildToolSetConfig = {
|
||
|
|
tools: [{ name: 'tool_a' }, { name: 'tool_b' }],
|
||
|
|
};
|
||
|
|
|
||
|
|
const toolSet = buildToolSet(agentConfig);
|
||
|
|
|
||
|
|
expect(toolSet.size).toBe(2);
|
||
|
|
expect(toolSet.has('tool_a')).toBe(true);
|
||
|
|
expect(toolSet.has('tool_b')).toBe(true);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('edge cases', () => {
|
||
|
|
it('returns empty set when agentConfig is null', () => {
|
||
|
|
const toolSet = buildToolSet(null);
|
||
|
|
expect(toolSet.size).toBe(0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('returns empty set when agentConfig is undefined', () => {
|
||
|
|
const toolSet = buildToolSet(undefined);
|
||
|
|
expect(toolSet.size).toBe(0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('returns empty set when both toolDefinitions and tools are empty', () => {
|
||
|
|
const agentConfig: BuildToolSetConfig = {
|
||
|
|
toolDefinitions: [],
|
||
|
|
tools: [],
|
||
|
|
};
|
||
|
|
|
||
|
|
const toolSet = buildToolSet(agentConfig);
|
||
|
|
expect(toolSet.size).toBe(0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('filters out null/undefined tool entries', () => {
|
||
|
|
const agentConfig: BuildToolSetConfig = {
|
||
|
|
tools: [{ name: 'valid_tool' }, null, undefined, { name: 'another_valid' }],
|
||
|
|
};
|
||
|
|
|
||
|
|
const toolSet = buildToolSet(agentConfig);
|
||
|
|
|
||
|
|
expect(toolSet.size).toBe(2);
|
||
|
|
expect(toolSet.has('valid_tool')).toBe(true);
|
||
|
|
expect(toolSet.has('another_valid')).toBe(true);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('filters out empty string tool names', () => {
|
||
|
|
const agentConfig: BuildToolSetConfig = {
|
||
|
|
toolDefinitions: [{ name: 'valid' }, { name: '' }, { name: 'also_valid' }],
|
||
|
|
};
|
||
|
|
|
||
|
|
const toolSet = buildToolSet(agentConfig);
|
||
|
|
|
||
|
|
expect(toolSet.size).toBe(2);
|
||
|
|
expect(toolSet.has('valid')).toBe(true);
|
||
|
|
expect(toolSet.has('also_valid')).toBe(true);
|
||
|
|
expect(toolSet.has('')).toBe(false);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
});
|