main
dart 34 lines 1000 Bytes
Raw
1 import 'tool_definition.dart';
2
3 abstract class ToolProvider {
4 Future<List<ToolDefinition>> listTools();
5 Future<ToolExecutionResult> execute(String name, Map<String, dynamic> args);
6 }
7
8 class ToolRegistry {
9 final List<ToolProvider> providers;
10
11 ToolRegistry({required this.providers});
12
13 Future<List<ToolDefinition>> listTools({Set<String>? allowedTools}) async {
14 final all = <ToolDefinition>[];
15 for (final provider in providers) {
16 all.addAll(await provider.listTools());
17 }
18 if (allowedTools == null || allowedTools.isEmpty) return all;
19 return all.where((t) => allowedTools.contains(t.name)).toList();
20 }
21
22 Future<ToolExecutionResult> execute(
23 String name,
24 Map<String, dynamic> args,
25 ) async {
26 for (final provider in providers) {
27 final tools = await provider.listTools();
28 if (tools.any((t) => t.name == name)) {
29 return provider.execute(name, args);
30 }
31 }
32 return const ToolExecutionResult.failure('Tool not found');
33 }
34 }