🦥 feat: Add Deferred Tools as Agents Capability (#11295)

This commit is contained in:
Danny Avila 2026-01-10 20:25:34 -05:00
parent 7c9c7e530b
commit 3d98194a99
No known key found for this signature in database
GPG key ID: BF31EEB2C5CA0956
8 changed files with 819 additions and 79 deletions

View file

@ -0,0 +1,88 @@
import { renderHook } from '@testing-library/react';
import { AgentCapabilities } from 'librechat-data-provider';
import useAgentCapabilities from '../useAgentCapabilities';
describe('useAgentCapabilities', () => {
it('should return all capabilities as false when capabilities is undefined', () => {
const { result } = renderHook(() => useAgentCapabilities(undefined));
expect(result.current.toolsEnabled).toBe(false);
expect(result.current.actionsEnabled).toBe(false);
expect(result.current.artifactsEnabled).toBe(false);
expect(result.current.ocrEnabled).toBe(false);
expect(result.current.contextEnabled).toBe(false);
expect(result.current.fileSearchEnabled).toBe(false);
expect(result.current.webSearchEnabled).toBe(false);
expect(result.current.codeEnabled).toBe(false);
expect(result.current.deferredToolsEnabled).toBe(false);
});
it('should return all capabilities as false when capabilities is empty array', () => {
const { result } = renderHook(() => useAgentCapabilities([]));
expect(result.current.toolsEnabled).toBe(false);
expect(result.current.deferredToolsEnabled).toBe(false);
});
it('should return true for enabled capabilities', () => {
const capabilities = [
AgentCapabilities.tools,
AgentCapabilities.deferred_tools,
AgentCapabilities.file_search,
];
const { result } = renderHook(() => useAgentCapabilities(capabilities));
expect(result.current.toolsEnabled).toBe(true);
expect(result.current.deferredToolsEnabled).toBe(true);
expect(result.current.fileSearchEnabled).toBe(true);
expect(result.current.actionsEnabled).toBe(false);
expect(result.current.webSearchEnabled).toBe(false);
});
it('should return deferredToolsEnabled as true when deferred_tools is in capabilities', () => {
const capabilities = [AgentCapabilities.deferred_tools];
const { result } = renderHook(() => useAgentCapabilities(capabilities));
expect(result.current.deferredToolsEnabled).toBe(true);
});
it('should return deferredToolsEnabled as false when deferred_tools is not in capabilities', () => {
const capabilities = [
AgentCapabilities.tools,
AgentCapabilities.actions,
AgentCapabilities.artifacts,
];
const { result } = renderHook(() => useAgentCapabilities(capabilities));
expect(result.current.deferredToolsEnabled).toBe(false);
});
it('should handle all capabilities being enabled', () => {
const capabilities = [
AgentCapabilities.tools,
AgentCapabilities.actions,
AgentCapabilities.artifacts,
AgentCapabilities.ocr,
AgentCapabilities.context,
AgentCapabilities.file_search,
AgentCapabilities.web_search,
AgentCapabilities.execute_code,
AgentCapabilities.deferred_tools,
];
const { result } = renderHook(() => useAgentCapabilities(capabilities));
expect(result.current.toolsEnabled).toBe(true);
expect(result.current.actionsEnabled).toBe(true);
expect(result.current.artifactsEnabled).toBe(true);
expect(result.current.ocrEnabled).toBe(true);
expect(result.current.contextEnabled).toBe(true);
expect(result.current.fileSearchEnabled).toBe(true);
expect(result.current.webSearchEnabled).toBe(true);
expect(result.current.codeEnabled).toBe(true);
expect(result.current.deferredToolsEnabled).toBe(true);
});
});

View file

@ -10,6 +10,7 @@ interface AgentCapabilitiesResult {
fileSearchEnabled: boolean;
webSearchEnabled: boolean;
codeEnabled: boolean;
deferredToolsEnabled: boolean;
}
export default function useAgentCapabilities(
@ -55,6 +56,11 @@ export default function useAgentCapabilities(
[capabilities],
);
const deferredToolsEnabled = useMemo(
() => capabilities?.includes(AgentCapabilities.deferred_tools) ?? false,
[capabilities],
);
return {
ocrEnabled,
codeEnabled,
@ -64,5 +70,6 @@ export default function useAgentCapabilities(
artifactsEnabled,
webSearchEnabled,
fileSearchEnabled,
deferredToolsEnabled,
};
}