translationManager->getProviders() as $provider) { $translationProviders[] = [ 'class' => $provider instanceof ITranslationProviderWithId ? $provider->getId() : $provider::class, 'name' => $provider->getName(), ]; $translationPreferences[] = $provider instanceof ITranslationProviderWithId ? $provider->getId() : $provider::class; } $sttProviders = []; foreach ($this->sttManager->getProviders() as $provider) { $sttProviders[] = [ 'class' => $provider instanceof ISpeechToTextProviderWithId ? $provider->getId() : $provider::class, 'name' => $provider->getName(), ]; } $textProcessingProviders = []; /** @var array, string|class-string> $textProcessingSettings */ $textProcessingSettings = []; foreach ($this->textProcessingManager->getProviders() as $provider) { $textProcessingProviders[] = [ 'class' => $provider instanceof IProviderWithId ? $provider->getId() : $provider::class, 'name' => $provider->getName(), 'taskType' => $provider->getTaskType(), ]; if (!isset($textProcessingSettings[$provider->getTaskType()])) { $textProcessingSettings[$provider->getTaskType()] = $provider instanceof IProviderWithId ? $provider->getId() : $provider::class; } } $textProcessingTaskTypes = []; foreach ($textProcessingSettings as $taskTypeClass => $providerClass) { /** @var ITaskType $taskType */ try { $taskType = $this->container->get($taskTypeClass); } catch (NotFoundExceptionInterface $e) { continue; } catch (ContainerExceptionInterface $e) { continue; } $textProcessingTaskTypes[] = [ 'class' => $taskTypeClass, 'name' => $taskType->getName(), 'description' => $taskType->getDescription(), ]; } $text2imageProviders = []; foreach ($this->text2imageManager->getProviders() as $provider) { $text2imageProviders[] = [ 'id' => $provider->getId(), 'name' => $provider->getName(), ]; } $taskProcessingProviders = []; /** @var array, string|class-string> $taskProcessingSettings */ $taskProcessingSettings = []; foreach ($this->taskProcessingManager->getProviders() as $provider) { $taskProcessingProviders[] = [ 'id' => $provider->getId(), 'name' => $provider->getName(), 'taskType' => $provider->getTaskTypeId(), ]; if (!isset($taskProcessingSettings[$provider->getTaskTypeId()])) { $taskProcessingSettings[$provider->getTaskTypeId()] = $provider->getId(); } } $taskProcessingTaskTypes = []; foreach ($this->taskProcessingManager->getAvailableTaskTypes() as $taskTypeId => $taskTypeDefinition) { $taskProcessingTaskTypes[] = [ 'id' => $taskTypeId, 'name' => $taskTypeDefinition['name'], 'description' => $taskTypeDefinition['description'], ]; } $this->initialState->provideInitialState('ai-stt-providers', $sttProviders); $this->initialState->provideInitialState('ai-translation-providers', $translationProviders); $this->initialState->provideInitialState('ai-text-processing-providers', $textProcessingProviders); $this->initialState->provideInitialState('ai-text-processing-task-types', $textProcessingTaskTypes); $this->initialState->provideInitialState('ai-text2image-providers', $text2imageProviders); $this->initialState->provideInitialState('ai-task-processing-providers', $taskProcessingProviders); $this->initialState->provideInitialState('ai-task-processing-task-types', $taskProcessingTaskTypes); $settings = [ 'ai.stt_provider' => count($sttProviders) > 0 ? $sttProviders[0]['class'] : null, 'ai.translation_provider_preferences' => $translationPreferences, 'ai.textprocessing_provider_preferences' => $textProcessingSettings, 'ai.text2image_provider' => count($text2imageProviders) > 0 ? $text2imageProviders[0]['id'] : null, 'ai.taskprocessing_provider_preferences' => $taskProcessingSettings, ]; foreach ($settings as $key => $defaultValue) { $value = $defaultValue; $json = $this->config->getAppValue('core', $key, ''); if ($json !== '') { $value = json_decode($json, true); switch($key) { case 'ai.taskprocessing_provider_preferences': case 'ai.textprocessing_provider_preferences': // fill $value with $defaultValue values $value = array_merge($defaultValue, $value); break; case 'ai.translation_provider_preferences': // Only show entries from $value (saved pref list) that are in $defaultValue (enabled providers) // and add all providers that are enabled but not in the pref list if (!is_array($defaultValue)) { break; } $value = array_values(array_unique(array_merge(array_intersect($value, $defaultValue), $defaultValue), SORT_STRING)); break; default: break; } } $settings[$key] = $value; } $this->initialState->provideInitialState('ai-settings', $settings); return new TemplateResponse('settings', 'settings/admin/ai'); } /** * @return string the section ID, e.g. 'sharing' */ public function getSection() { return 'ai'; } /** * @return int whether the form should be rather on the top or bottom of * the admin section. The forms are arranged in ascending order of the * priority values. It is required to return a value between 0 and 100. * * E.g.: 70 */ public function getPriority() { return 10; } public function getName(): ?string { return $this->l->t('Artificial Intelligence'); } public function getAuthorizedAppConfig(): array { return [ 'core' => ['/ai..*/'], ]; } }