installRequirements method
Install RequiredToolkit / RequiredSchema into the room if missing,
mirroring Python install_requirements.
Implementation
Future<void> installRequirements({String? participantId}) async {
final room = this.room;
// 1. Load schemas
final Map<String, StorageEntry> schemasByName = {};
final schemas = await room.storage.list('.schemas');
for (final schema in schemas) {
schemasByName[schema.name] = schema;
}
// 2. Load visible toolkits
final Map<String, ToolkitDescription> toolkitsByName = {};
final visibleToolkits = await room.agents.listToolkits(
participantId: participantId,
);
for (final tk in visibleToolkits) {
toolkitsByName[tk.name] = tk;
}
var installed = false;
const builtinAgentsUrl = 'http://localhost:8080';
for (final requirement in requires) {
if (!requirement.callable) continue;
if (requirement is RequiredToolkit) {
if (requirement.name == 'ui') {
// Python: skip ui
continue;
}
if (!toolkitsByName.containsKey(requirement.name)) {
installed = true;
_agentLogger.info(
'calling required toolkit into room ${requirement.name}',
);
final String url;
if (requirement.name.startsWith('https://') ||
requirement.name.startsWith('http://')) {
url = requirement.name;
} else {
url = '$builtinAgentsUrl/toolkits/${requirement.name}';
}
await room.agents.call(
url: url,
name: requirement.name,
arguments: const <String, dynamic>{},
);
}
} else if (requirement is RequiredSchema) {
if (!schemasByName.containsKey(requirement.name)) {
installed = true;
_agentLogger.info('Installing required schema ${requirement.name}');
final String url;
if (requirement.name.startsWith('https://') ||
requirement.name.startsWith('http://')) {
url = requirement.name;
} else {
url = '$builtinAgentsUrl/schemas/${requirement.name}';
}
await room.agents.call(
url: url,
name: requirement.name,
arguments: const <String, dynamic>{},
);
}
} else {
throw RoomServerException('unsupported requirement: $requirement');
}
}
if (installed) {
await Future<void>.delayed(const Duration(seconds: 5));
}
}