aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorOleksander Piskun <oleksandr2088@icloud.com>2025-04-08 20:45:37 +0300
committerOleksander Piskun <oleksandr2088@icloud.com>2025-04-09 15:47:48 +0300
commitc23ab0d1f7ca6985f873035c8801d0c3244cc2d2 (patch)
tree220fc1fb01009c0dabb4624b92956edfe72e8b17 /lib
parent90a3928cdb2f390f2018e819b26c62255322be4d (diff)
downloadnextcloud-server-c23ab0d1f7ca6985f873035c8801d0c3244cc2d2.tar.gz
nextcloud-server-c23ab0d1f7ca6985f873035c8801d0c3244cc2d2.zip
fix(taskprocessing): use the event for AppAPI to get list of AI providersfix/noid/taskprocessing-appapi
Signed-off-by: Oleksander Piskun <oleksandr2088@icloud.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/composer/composer/autoload_classmap.php1
-rw-r--r--lib/composer/composer/autoload_static.php1
-rw-r--r--lib/private/TaskProcessing/Manager.php46
-rw-r--r--lib/public/TaskProcessing/Events/GetTaskProcessingProvidersEvent.php68
4 files changed, 115 insertions, 1 deletions
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index 52e3075e413..670a719c9fb 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -816,6 +816,7 @@ return array(
'OCP\\Talk\\ITalkBackend' => $baseDir . '/lib/public/Talk/ITalkBackend.php',
'OCP\\TaskProcessing\\EShapeType' => $baseDir . '/lib/public/TaskProcessing/EShapeType.php',
'OCP\\TaskProcessing\\Events\\AbstractTaskProcessingEvent' => $baseDir . '/lib/public/TaskProcessing/Events/AbstractTaskProcessingEvent.php',
+ 'OCP\\TaskProcessing\\Events\\GetTaskProcessingProvidersEvent' => $baseDir . '/lib/public/TaskProcessing/Events/GetTaskProcessingProvidersEvent.php',
'OCP\\TaskProcessing\\Events\\TaskFailedEvent' => $baseDir . '/lib/public/TaskProcessing/Events/TaskFailedEvent.php',
'OCP\\TaskProcessing\\Events\\TaskSuccessfulEvent' => $baseDir . '/lib/public/TaskProcessing/Events/TaskSuccessfulEvent.php',
'OCP\\TaskProcessing\\Exception\\Exception' => $baseDir . '/lib/public/TaskProcessing/Exception/Exception.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index e98bc3e1aaa..3e18f17caf6 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -865,6 +865,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OCP\\Talk\\ITalkBackend' => __DIR__ . '/../../..' . '/lib/public/Talk/ITalkBackend.php',
'OCP\\TaskProcessing\\EShapeType' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/EShapeType.php',
'OCP\\TaskProcessing\\Events\\AbstractTaskProcessingEvent' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/Events/AbstractTaskProcessingEvent.php',
+ 'OCP\\TaskProcessing\\Events\\GetTaskProcessingProvidersEvent' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/Events/GetTaskProcessingProvidersEvent.php',
'OCP\\TaskProcessing\\Events\\TaskFailedEvent' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/Events/TaskFailedEvent.php',
'OCP\\TaskProcessing\\Events\\TaskSuccessfulEvent' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/Events/TaskSuccessfulEvent.php',
'OCP\\TaskProcessing\\Exception\\Exception' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/Exception/Exception.php',
diff --git a/lib/private/TaskProcessing/Manager.php b/lib/private/TaskProcessing/Manager.php
index 0582d801e3d..a701c23d56f 100644
--- a/lib/private/TaskProcessing/Manager.php
+++ b/lib/private/TaskProcessing/Manager.php
@@ -41,6 +41,7 @@ use OCP\Lock\LockedException;
use OCP\SpeechToText\ISpeechToTextProvider;
use OCP\SpeechToText\ISpeechToTextProviderWithId;
use OCP\TaskProcessing\EShapeType;
+use OCP\TaskProcessing\Events\GetTaskProcessingProvidersEvent;
use OCP\TaskProcessing\Events\TaskFailedEvent;
use OCP\TaskProcessing\Events\TaskSuccessfulEvent;
use OCP\TaskProcessing\Exception\NotFoundException;
@@ -81,8 +82,13 @@ class Manager implements IManager {
private IAppData $appData;
private ?array $preferences = null;
private ?array $providersById = null;
+
+ /** @var ITaskType[]|null */
+ private ?array $taskTypes = null;
private ICache $distributedCache;
+ private ?GetTaskProcessingProvidersEvent $eventResult = null;
+
public function __construct(
private IConfig $config,
private Coordinator $coordinator,
@@ -489,6 +495,20 @@ class Manager implements IManager {
}
/**
+ * Dispatches the event to collect external providers and task types.
+ * Caches the result within the request.
+ */
+ private function dispatchGetProvidersEvent(): GetTaskProcessingProvidersEvent {
+ if ($this->eventResult !== null) {
+ return $this->eventResult;
+ }
+
+ $this->eventResult = new GetTaskProcessingProvidersEvent();
+ $this->dispatcher->dispatchTyped($this->eventResult);
+ return $this->eventResult ;
+ }
+
+ /**
* @return IProvider[]
*/
private function _getProviders(): array {
@@ -516,6 +536,16 @@ class Manager implements IManager {
}
}
+ $event = $this->dispatchGetProvidersEvent();
+ $externalProviders = $event->getProviders();
+ foreach ($externalProviders as $provider) {
+ if (!isset($providers[$provider->getId()])) {
+ $providers[$provider->getId()] = $provider;
+ } else {
+ $this->logger->info('Skipping external task processing provider with ID ' . $provider->getId() . ' because a local provider with the same ID already exists.');
+ }
+ }
+
$providers += $this->_getTextProcessingProviders() + $this->_getTextToImageProviders() + $this->_getSpeechToTextProviders();
return $providers;
@@ -531,6 +561,10 @@ class Manager implements IManager {
return [];
}
+ if ($this->taskTypes !== null) {
+ return $this->taskTypes;
+ }
+
// Default task types
$taskTypes = [
\OCP\TaskProcessing\TaskTypes\TextToText::ID => \OCP\Server::get(\OCP\TaskProcessing\TaskTypes\TextToText::class),
@@ -568,9 +602,19 @@ class Manager implements IManager {
}
}
+ $event = $this->dispatchGetProvidersEvent();
+ $externalTaskTypes = $event->getTaskTypes();
+ foreach ($externalTaskTypes as $taskType) {
+ if (isset($taskTypes[$taskType->getId()])) {
+ $this->logger->warning('External task processing task type is using ID ' . $taskType->getId() . ' which is already used by a locally registered task type (' . get_class($taskTypes[$taskType->getId()]) . ')');
+ }
+ $taskTypes[$taskType->getId()] = $taskType;
+ }
+
$taskTypes += $this->_getTextProcessingTaskTypes();
- return $taskTypes;
+ $this->taskTypes = $taskTypes;
+ return $this->taskTypes;
}
/**
diff --git a/lib/public/TaskProcessing/Events/GetTaskProcessingProvidersEvent.php b/lib/public/TaskProcessing/Events/GetTaskProcessingProvidersEvent.php
new file mode 100644
index 00000000000..10c94d20406
--- /dev/null
+++ b/lib/public/TaskProcessing/Events/GetTaskProcessingProvidersEvent.php
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCP\TaskProcessing\Events;
+
+use OCP\EventDispatcher\Event;
+use OCP\TaskProcessing\IProvider;
+use OCP\TaskProcessing\ITaskType;
+
+/**
+ * Event dispatched by the server to collect Task Processing Providers
+ * and custom Task Types from listeners (like AppAPI).
+ *
+ * Listeners should add their providers and task types using the
+ * addProvider() and addTaskType() methods.
+ *
+ * @since 32.0.0
+ */
+class GetTaskProcessingProvidersEvent extends Event {
+ /** @var IProvider[] */
+ private array $providers = [];
+
+ /** @var ITaskType[] */
+ private array $taskTypes = [];
+
+ /**
+ * Add a Task Processing Provider.
+ *
+ * @param IProvider $provider The provider instance to add.
+ * @since 32.0.0
+ */
+ public function addProvider(IProvider $provider): void {
+ $this->providers[] = $provider;
+ }
+
+ /**
+ * Get all collected Task Processing Providers.
+ *
+ * @return IProvider[]
+ * @since 32.0.0
+ */
+ public function getProviders(): array {
+ return $this->providers;
+ }
+
+ /**
+ * Add a custom Task Processing Task Type.
+ *
+ * @param ITaskType $taskType The task type instance to add.
+ * @since 32.0.0
+ */
+ public function addTaskType(ITaskType $taskType): void {
+ $this->taskTypes[] = $taskType;
+ }
+
+ /**
+ * Get all collected custom Task Processing Task Types.
+ *
+ * @return ITaskType[]
+ * @since 32.0.0
+ */
+ public function getTaskTypes(): array {
+ return $this->taskTypes;
+ }
+}