( tools: any[] | undefined, providerTools: any[] | undefined, logger: any, provider?: string )
| 926 | * @returns Object with prepared tools and tool_choice settings |
| 927 | */ |
| 928 | export function prepareToolsWithUsageControl( |
| 929 | tools: any[] | undefined, |
| 930 | providerTools: any[] | undefined, |
| 931 | logger: any, |
| 932 | provider?: string |
| 933 | ): { |
| 934 | tools: any[] | undefined |
| 935 | toolChoice: |
| 936 | | 'auto' |
| 937 | | 'none' |
| 938 | | { type: 'function'; function: { name: string } } |
| 939 | | { type: 'tool'; name: string } |
| 940 | | { type: 'any'; any: { model: string; name: string } } |
| 941 | | undefined |
| 942 | toolConfig?: { |
| 943 | functionCallingConfig: { |
| 944 | mode: 'AUTO' | 'ANY' | 'NONE' |
| 945 | allowedFunctionNames?: string[] |
| 946 | } |
| 947 | } |
| 948 | hasFilteredTools: boolean |
| 949 | forcedTools: string[] |
| 950 | } { |
| 951 | if (!tools || tools.length === 0) { |
| 952 | return { |
| 953 | tools: undefined, |
| 954 | toolChoice: undefined, |
| 955 | hasFilteredTools: false, |
| 956 | forcedTools: [], |
| 957 | } |
| 958 | } |
| 959 | |
| 960 | const filteredTools = tools.filter((tool) => { |
| 961 | const toolId = tool.function?.name || tool.name |
| 962 | const toolConfig = providerTools?.find((t) => t.id === toolId) |
| 963 | return toolConfig?.usageControl !== 'none' |
| 964 | }) |
| 965 | |
| 966 | const hasFilteredTools = filteredTools.length < tools.length |
| 967 | if (hasFilteredTools) { |
| 968 | logger.info( |
| 969 | `Filtered out ${tools.length - filteredTools.length} tools with usageControl='none'` |
| 970 | ) |
| 971 | } |
| 972 | |
| 973 | if (filteredTools.length === 0) { |
| 974 | logger.info('All tools were filtered out due to usageControl="none"') |
| 975 | return { |
| 976 | tools: undefined, |
| 977 | toolChoice: undefined, |
| 978 | hasFilteredTools: true, |
| 979 | forcedTools: [], |
| 980 | } |
| 981 | } |
| 982 | |
| 983 | const forcedTools = providerTools?.filter((tool) => tool.usageControl === 'force') || [] |
| 984 | const forcedToolIds = forcedTools.map((tool) => tool.id) |
| 985 |
no test coverage detected