aboutsummaryrefslogtreecommitdiffstats
path: root/apps/settings/lib/Settings/Admin/ArtificialIntelligence.php
diff options
context:
space:
mode:
Diffstat (limited to 'apps/settings/lib/Settings/Admin/ArtificialIntelligence.php')
-rw-r--r--apps/settings/lib/Settings/Admin/ArtificialIntelligence.php71
1 files changed, 62 insertions, 9 deletions
diff --git a/apps/settings/lib/Settings/Admin/ArtificialIntelligence.php b/apps/settings/lib/Settings/Admin/ArtificialIntelligence.php
index ac4badc2434..aaec0049b20 100644
--- a/apps/settings/lib/Settings/Admin/ArtificialIntelligence.php
+++ b/apps/settings/lib/Settings/Admin/ArtificialIntelligence.php
@@ -10,7 +10,7 @@ namespace OCA\Settings\Settings\Admin;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Services\IInitialState;
-use OCP\IConfig;
+use OCP\IAppConfig;
use OCP\IL10N;
use OCP\Settings\IDelegatedSettings;
use OCP\SpeechToText\ISpeechToTextManager;
@@ -24,10 +24,11 @@ use OCP\Translation\ITranslationProviderWithId;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
use Psr\Container\NotFoundExceptionInterface;
+use Psr\Log\LoggerInterface;
class ArtificialIntelligence implements IDelegatedSettings {
public function __construct(
- private IConfig $config,
+ private IAppConfig $appConfig,
private IL10N $l,
private IInitialState $initialState,
private ITranslationManager $translationManager,
@@ -35,6 +36,8 @@ class ArtificialIntelligence implements IDelegatedSettings {
private IManager $textProcessingManager,
private ContainerInterface $container,
private \OCP\TextToImage\IManager $text2imageManager,
+ private \OCP\TaskProcessing\IManager $taskProcessingManager,
+ private LoggerInterface $logger,
) {
}
@@ -98,30 +101,80 @@ class ArtificialIntelligence implements IDelegatedSettings {
];
}
+ $taskProcessingProviders = [];
+ /** @var array<class-string<ITaskType>, string|class-string<IProvider>> $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 = [];
+ $taskProcessingTypeSettings = [];
+ foreach ($this->taskProcessingManager->getAvailableTaskTypes(true) as $taskTypeId => $taskTypeDefinition) {
+ $taskProcessingTaskTypes[] = [
+ 'id' => $taskTypeId,
+ 'name' => $taskTypeDefinition['name'],
+ 'description' => $taskTypeDefinition['description'],
+ ];
+ $taskProcessingTypeSettings[$taskTypeId] = true;
+ }
+
+
$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.textprocessing_provider_preferences' => $textProcessingSettings,
'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,
+ 'ai.taskprocessing_type_preferences' => $taskProcessingTypeSettings,
+ 'ai.taskprocessing_guests' => false,
];
foreach ($settings as $key => $defaultValue) {
$value = $defaultValue;
- $json = $this->config->getAppValue('core', $key, '');
+ $json = $this->appConfig->getValueString('core', $key, '', lazy: in_array($key, \OC\TaskProcessing\Manager::LAZY_CONFIG_KEYS, true));
if ($json !== '') {
- $value = json_decode($json, true);
- switch($key) {
+ try {
+ $value = json_decode($json, true, flags: JSON_THROW_ON_ERROR);
+ } catch (\JsonException $e) {
+ $this->logger->error('Failed to get settings. JSON Error in ' . $key, ['exception' => $e]);
+ if ($key === 'ai.taskprocessing_type_preferences') {
+ $value = [];
+ foreach ($taskProcessingTypeSettings as $taskTypeId => $taskTypeValue) {
+ $value[$taskTypeId] = false;
+ }
+ $settings[$key] = $value;
+ }
+ continue;
+ }
+
+ switch ($key) {
+ case 'ai.taskprocessing_provider_preferences':
+ case 'ai.taskprocessing_type_preferences':
case 'ai.textprocessing_provider_preferences':
// fill $value with $defaultValue values
$value = array_merge($defaultValue, $value);
break;
case 'ai.translation_provider_preferences':
- $value += array_diff($defaultValue, $value); // Add entries from $defaultValue that are not in $value to the end of $value
+ // 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;
@@ -144,8 +197,8 @@ class ArtificialIntelligence implements IDelegatedSettings {
/**
* @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.
+ * 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
*/