Skip to content

Commit 29d07ed

Browse files
committed
fix(taskprocessing): use the event for AppAPI to get list of AI providers
Signed-off-by: Oleksander Piskun <oleksandr2088@icloud.com>
1 parent 90a3928 commit 29d07ed

File tree

4 files changed

+128
-6
lines changed

4 files changed

+128
-6
lines changed

lib/composer/composer/autoload_classmap.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -816,6 +816,7 @@
816816
'OCP\\Talk\\ITalkBackend' => $baseDir . '/lib/public/Talk/ITalkBackend.php',
817817
'OCP\\TaskProcessing\\EShapeType' => $baseDir . '/lib/public/TaskProcessing/EShapeType.php',
818818
'OCP\\TaskProcessing\\Events\\AbstractTaskProcessingEvent' => $baseDir . '/lib/public/TaskProcessing/Events/AbstractTaskProcessingEvent.php',
819+
'OCP\\TaskProcessing\\Events\\GetTaskProcessingProvidersEvent' => $baseDir . '/lib/public/TaskProcessing/Events/GetTaskProcessingProvidersEvent.php',
819820
'OCP\\TaskProcessing\\Events\\TaskFailedEvent' => $baseDir . '/lib/public/TaskProcessing/Events/TaskFailedEvent.php',
820821
'OCP\\TaskProcessing\\Events\\TaskSuccessfulEvent' => $baseDir . '/lib/public/TaskProcessing/Events/TaskSuccessfulEvent.php',
821822
'OCP\\TaskProcessing\\Exception\\Exception' => $baseDir . '/lib/public/TaskProcessing/Exception/Exception.php',

lib/composer/composer/autoload_static.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -865,6 +865,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
865865
'OCP\\Talk\\ITalkBackend' => __DIR__ . '/../../..' . '/lib/public/Talk/ITalkBackend.php',
866866
'OCP\\TaskProcessing\\EShapeType' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/EShapeType.php',
867867
'OCP\\TaskProcessing\\Events\\AbstractTaskProcessingEvent' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/Events/AbstractTaskProcessingEvent.php',
868+
'OCP\\TaskProcessing\\Events\\GetTaskProcessingProvidersEvent' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/Events/GetTaskProcessingProvidersEvent.php',
868869
'OCP\\TaskProcessing\\Events\\TaskFailedEvent' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/Events/TaskFailedEvent.php',
869870
'OCP\\TaskProcessing\\Events\\TaskSuccessfulEvent' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/Events/TaskSuccessfulEvent.php',
870871
'OCP\\TaskProcessing\\Exception\\Exception' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/Exception/Exception.php',

lib/private/TaskProcessing/Manager.php

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
use OCP\SpeechToText\ISpeechToTextProvider;
4242
use OCP\SpeechToText\ISpeechToTextProviderWithId;
4343
use OCP\TaskProcessing\EShapeType;
44+
use OCP\TaskProcessing\Events\GetTaskProcessingProvidersEvent;
4445
use OCP\TaskProcessing\Events\TaskFailedEvent;
4546
use OCP\TaskProcessing\Events\TaskSuccessfulEvent;
4647
use OCP\TaskProcessing\Exception\NotFoundException;
@@ -81,6 +82,9 @@ class Manager implements IManager {
8182
private IAppData $appData;
8283
private ?array $preferences = null;
8384
private ?array $providersById = null;
85+
86+
/** @var ITaskType[]|null */
87+
private ?array $taskTypes = null;
8488
private ICache $distributedCache;
8589

8690
public function __construct(
@@ -488,14 +492,39 @@ public function getOptionalOutputShapeEnumValues(): array {
488492
return $newProviders;
489493
}
490494

495+
/**
496+
* Dispatches the event to collect external providers and task types.
497+
* Caches the result within the request.
498+
*/
499+
private function dispatchGetProvidersEvent(): GetTaskProcessingProvidersEvent {
500+
static $eventResult = null;
501+
502+
if ($eventResult === null) {
503+
$event = new GetTaskProcessingProvidersEvent();
504+
$this->dispatcher->dispatchTyped($event);
505+
$eventResult = $event;
506+
}
507+
return $eventResult;
508+
}
509+
491510
/**
492511
* @return IProvider[]
493512
*/
494513
private function _getProviders(): array {
495514
$context = $this->coordinator->getRegistrationContext();
496515

497516
if ($context === null) {
498-
return [];
517+
$event = $this->dispatchGetProvidersEvent();
518+
$externalProviders = $event->getProviders();
519+
520+
$providers = [];
521+
foreach ($externalProviders as $provider) {
522+
if (isset($providers[$provider->getId()])) {
523+
$this->logger->warning('External task processing provider is using ID ' . $provider->getId() . ' which is already used by ' . $providers[$provider->getId()]::class);
524+
}
525+
$providers[$provider->getId()] = $provider;
526+
}
527+
return $providers;
499528
}
500529

501530
$providers = [];
@@ -516,6 +545,19 @@ private function _getProviders(): array {
516545
}
517546
}
518547

548+
$event = $this->dispatchGetProvidersEvent();
549+
$externalProviders = $event->getProviders();
550+
foreach ($externalProviders as $provider) {
551+
if (isset($providers[$provider->getId()])) {
552+
$this->logger->warning('External task processing provider is using ID ' . $provider->getId() . ' which is already used by a locally registered provider (' . get_class($providers[$provider->getId()]) . ')');
553+
}
554+
if (!isset($providers[$provider->getId()])) {
555+
$providers[$provider->getId()] = $provider;
556+
} else {
557+
$this->logger->info('Skipping external task processing provider with ID ' . $provider->getId() . ' because a local provider with the same ID already exists.');
558+
}
559+
}
560+
519561
$providers += $this->_getTextProcessingProviders() + $this->_getTextToImageProviders() + $this->_getSpeechToTextProviders();
520562

521563
return $providers;
@@ -525,12 +567,12 @@ private function _getProviders(): array {
525567
* @return ITaskType[]
526568
*/
527569
private function _getTaskTypes(): array {
528-
$context = $this->coordinator->getRegistrationContext();
529-
530-
if ($context === null) {
531-
return [];
570+
if ($this->taskTypes !== null) {
571+
return $this->taskTypes;
532572
}
533573

574+
$context = $this->coordinator->getRegistrationContext();
575+
534576
// Default task types
535577
$taskTypes = [
536578
\OCP\TaskProcessing\TaskTypes\TextToText::ID => \OCP\Server::get(\OCP\TaskProcessing\TaskTypes\TextToText::class),
@@ -568,9 +610,19 @@ private function _getTaskTypes(): array {
568610
}
569611
}
570612

613+
$event = $this->dispatchGetProvidersEvent();
614+
$externalTaskTypes = $event->getTaskTypes();
615+
foreach ($externalTaskTypes as $taskType) {
616+
if (isset($taskTypes[$taskType->getId()])) {
617+
$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()]) . ')');
618+
}
619+
$taskTypes[$taskType->getId()] = $taskType;
620+
}
621+
571622
$taskTypes += $this->_getTextProcessingTaskTypes();
572623

573-
return $taskTypes;
624+
$this->taskTypes = $taskTypes;
625+
return $this->taskTypes;
574626
}
575627

576628
/**
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?php
2+
3+
/**
4+
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
5+
* SPDX-License-Identifier: AGPL-3.0-or-later
6+
*/
7+
namespace OCP\TaskProcessing\Events;
8+
9+
use OCP\EventDispatcher\Event;
10+
use OCP\TaskProcessing\IProvider;
11+
use OCP\TaskProcessing\ITaskType;
12+
13+
/**
14+
* Event dispatched by the server to collect Task Processing Providers
15+
* and custom Task Types from listeners (like AppAPI).
16+
*
17+
* Listeners should add their providers and task types using the
18+
* addProvider() and addTaskType() methods.
19+
*
20+
* @since 32.0.0
21+
*/
22+
class GetTaskProcessingProvidersEvent extends Event {
23+
/** @var IProvider[] */
24+
private array $providers = [];
25+
26+
/** @var ITaskType[] */
27+
private array $taskTypes = [];
28+
29+
/**
30+
* Add a Task Processing Provider.
31+
*
32+
* @param IProvider $provider The provider instance to add.
33+
* @since 32.0.0
34+
*/
35+
public function addProvider(IProvider $provider): void {
36+
$this->providers[] = $provider;
37+
}
38+
39+
/**
40+
* Get all collected Task Processing Providers.
41+
*
42+
* @return IProvider[]
43+
* @since 32.0.0
44+
*/
45+
public function getProviders(): array {
46+
return $this->providers;
47+
}
48+
49+
/**
50+
* Add a custom Task Processing Task Type.
51+
*
52+
* @param ITaskType $taskType The task type instance to add.
53+
* @since 32.0.0
54+
*/
55+
public function addTaskType(ITaskType $taskType): void {
56+
$this->taskTypes[] = $taskType;
57+
}
58+
59+
/**
60+
* Get all collected custom Task Processing Task Types.
61+
*
62+
* @return ITaskType[]
63+
* @since 32.0.0
64+
*/
65+
public function getTaskTypes(): array {
66+
return $this->taskTypes;
67+
}
68+
}

0 commit comments

Comments
 (0)