Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce LanguageModel/TextProcessing OCP API #38854

Merged
merged 77 commits into from
Jul 21, 2023
Merged
Show file tree
Hide file tree
Changes from 75 commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
70d5bf7
Initial work on lm OCP API
marcelklehr Jun 15, 2023
01dd1a8
LLM OCP API: Rework to use Task objects
marcelklehr Jun 15, 2023
3413873
LLM OCP API: Implement private backend code + add ILanguageModelTask
marcelklehr Jun 16, 2023
6fc4cb6
LLM OCP API: Add db migration
marcelklehr Jun 16, 2023
82d3b00
LLM OCP API: Add to RegistrationContext
marcelklehr Jun 16, 2023
9e9fc1d
Fix Copyright
marcelklehr Jun 19, 2023
9d5717d
LLM OCP API: ADd topics and headline tasks
marcelklehr Jun 20, 2023
795b097
LLM OCP API: Implement ocs API
marcelklehr Jun 20, 2023
b6941aa
LLM OCP API: cs:fix
marcelklehr Jun 20, 2023
b8a9f08
LLM OCP API: Make linters happy
marcelklehr Jun 20, 2023
b6a95e3
LLM OCP API: Fix type errors
marcelklehr Jun 20, 2023
9935034
LLM OCP API: Add @since
marcelklehr Jun 20, 2023
fac83ce
LLM OCP API: Fix static analysis
marcelklehr Jun 20, 2023
75d7af8
LLM OCP API: cs:fix
marcelklehr Jun 20, 2023
72ea761
LLM OCP API: Fix coding style and psalm
marcelklehr Jun 20, 2023
249dd5c
Update lib/public/LanguageModel/ITopicsProvider.php
marcelklehr Jun 26, 2023
fb4de16
LLM OCP API: Add task definitions
marcelklehr Jun 26, 2023
5bc6180
LLM OCP API: Commit autoloaders
marcelklehr Jun 26, 2023
fb55afc
Update lib/public/AppFramework/Bootstrap/IRegistrationContext.php
marcelklehr Jun 27, 2023
8e4aa92
Apply suggestions from code review
marcelklehr Jun 27, 2023
906e9b7
LLM OCP API: Type shenanigans for Visitor pattern
marcelklehr Jun 27, 2023
83db23e
LLM OCP API: strict types and copyright
marcelklehr Jun 27, 2023
a7cd6bf
OCP: Introduce OCP\Common\Exception\NotFoundException
marcelklehr Jun 27, 2023
b00a9a6
LLM OCP API: Use OCP\Common\Exception\NotFoundException
marcelklehr Jun 27, 2023
94fcf88
LLM OCP API: Fix copyright
marcelklehr Jun 27, 2023
1d3661d
cs:fix
marcelklehr Jun 27, 2023
cb0f918
Add tasks::last_updated column and vacate tasks after a week
marcelklehr Jun 28, 2023
1623ad9
TaskMapper#update: Use time factory
marcelklehr Jun 28, 2023
0a94525
ILanguageModelManager: Add docblock description
marcelklehr Jun 28, 2023
27e1c86
ILanguageModelTask: Use php type checking along with psalm parameteri…
marcelklehr Jun 28, 2023
ebc7631
Add preliminary tests
marcelklehr Jun 28, 2023
20cb993
Fix tests
marcelklehr Jun 29, 2023
66c0e6b
Make tests pass
marcelklehr Jun 29, 2023
c568c4a
Add test for task cleanup
marcelklehr Jun 30, 2023
1747068
Fix LanguageModelManager#runTask: Insert task into db if it doesn't e…
marcelklehr Jun 30, 2023
fb657bf
cs:fix
marcelklehr Jun 30, 2023
5b77246
Apply suggestions from code review
marcelklehr Jul 6, 2023
f6f8cb4
LLM OCP API: Add identifier param
marcelklehr Jul 6, 2023
62b19e0
LLM OCP API: Fix psalm error
marcelklehr Jul 6, 2023
f7e1e79
LLM OCP API: Fix security issue
marcelklehr Jul 6, 2023
d6d4e0f
LLM OCP API: Fix psam errors
marcelklehr Jul 6, 2023
0a0e812
LLM OCP API: Fix psam error
marcelklehr Jul 6, 2023
d33b7a8
LLM OCS API: s/tasks/tasktypes/
marcelklehr Jul 7, 2023
61b9b4f
LLM OCS API: Add OpenAPI docs
marcelklehr Jul 7, 2023
95d2bd5
Apply suggestions from code review
marcelklehr Jul 7, 2023
ba950f7
Update lib/public/LanguageModel/ILanguageModelProvider.php
marcelklehr Jul 7, 2023
bad124c
Update lib/public/LanguageModel/Events/TaskFailedEvent.php
marcelklehr Jul 7, 2023
0909657
LLM Migration: Return null if nothing changed
marcelklehr Jul 7, 2023
a28d8fa
LLM OCP API: Add missing copyright and strict types
marcelklehr Jul 7, 2023
d56286b
LLM OCP API: s/getAvailableTasks/getAvailableTaskClasses/
marcelklehr Jul 7, 2023
9455227
LLM OCP API: Simplify LanguageModelManager#canHandleTask
marcelklehr Jul 7, 2023
05fcf31
LLM OCP API: Don't lose trace of wrapped exceptions
marcelklehr Jul 7, 2023
e810a8b
LLM OCP API: Explain TaskBackgroundJob#setAllowParallelRuns
marcelklehr Jul 7, 2023
9ccc65d
LLM OCP API: Simplify TaskBackgroundJob#run catch block
marcelklehr Jul 7, 2023
3974953
OCP\Common\NotFoundException: Add param type
marcelklehr Jul 7, 2023
8f1a4f4
LLM OCP API: Avoid using OC in OCP
marcelklehr Jul 7, 2023
de1cfaa
LLM OCP API: Fix psalm issues
marcelklehr Jul 7, 2023
ea4dc4c
LLM OCP API: Fix OpenApi docs
marcelklehr Jul 7, 2023
9f405a1
LLM OCP API: Improve scheduleTask docblock
marcelklehr Jul 7, 2023
bf2dcd6
LLM OCP API: Change Tests to use EventDispatcher mock
marcelklehr Jul 7, 2023
a4578cd
cs:fix
marcelklehr Jul 7, 2023
49ea56b
LanguageModelApiController: Use jsonSerialize method to help psalm
marcelklehr Jul 7, 2023
069962d
Since 27.1.0
marcelklehr Jul 7, 2023
b7c3b50
Update core/Controller/LanguageModelApiController.php
marcelklehr Jul 11, 2023
48c8206
Fix openapi docs
marcelklehr Jul 11, 2023
d430cbb
Update core/Controller/LanguageModelApiController.php
marcelklehr Jul 11, 2023
bd45c43
Update core/Controller/LanguageModelApiController.php
marcelklehr Jul 11, 2023
ffe27ce
Massive refactoring: Turn LanguageModel OCP API into TextProcessing API
marcelklehr Jul 14, 2023
95d2d3a
Fix psalm errors
marcelklehr Jul 14, 2023
df1cf18
Fix psalm errors
marcelklehr Jul 14, 2023
590eefe
Apply suggestions from code review
marcelklehr Jul 17, 2023
add5962
Update autoloaders
marcelklehr Jul 17, 2023
2811932
cs:fix
marcelklehr Jul 17, 2023
d63c122
Fix psalm errors
marcelklehr Jul 17, 2023
7389567
Remove Task::factory method
marcelklehr Jul 19, 2023
fd0fd97
Fix tests: Adjust constructor signature
marcelklehr Jul 19, 2023
6d568b0
Fix tests: Adjust constructor signature
marcelklehr Jul 19, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
137 changes: 137 additions & 0 deletions core/Controller/TextProcessingApiController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
<?php

declare(strict_types=1);

/**
* @copyright Copyright (c) 2023 Marcel Klehr <[email protected]>
*
* @author Marcel Klehr <[email protected]>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/


namespace OC\Core\Controller;

use InvalidArgumentException;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
use OCP\Common\Exception\NotFoundException;
use OCP\IL10N;
use OCP\IRequest;
use OCP\TextProcessing\ITaskType;
use OCP\TextProcessing\Task;
use OCP\TextProcessing\IManager;
use OCP\PreConditionNotMetException;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
use Psr\Container\NotFoundExceptionInterface;
use Psr\Log\LoggerInterface;

class TextProcessingApiController extends \OCP\AppFramework\OCSController {
public function __construct(
string $appName,
IRequest $request,
private IManager $languageModelManager,
private IL10N $l,
private ?string $userId,
private ContainerInterface $container,
private LoggerInterface $logger,
) {
parent::__construct($appName, $request);
}

/**
* This endpoint returns all available LanguageModel task types
*
* @PublicPage
*/
public function taskTypes(): DataResponse {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As discussed, maybe it makes sense to have another endpoint to list the providers (maybe grouped by task type).

Also, maybe we could include the "selected provider" for each task type in the result of this taskTypes method.

WDYT?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we really need the providers on the frontend though? I think we would usually want to hide them, no?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah they wouldn't be displayed in the text processing UI component but maybe it's useful for the settings part where admins can choose the "default" provider for each task type.

Also, maybe we could include the "selected provider" for each task type in the result of this taskTypes method.

What do you think about that other aspect? It might make sense to let advanced users know which provider is used when choosing a task type. This information would not necessarily be very visible in the UI. But just in case we find a nice way to give more details if users want to know.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the "selected provider" for each task type

I tend to think this should be hidden from the user. Only the admin should see this.

maybe it's useful for the settings part where admins can choose the "default" provider for each task type

I'll deal with that in the follow up PR :)

$typeClasses = $this->languageModelManager->getAvailableTaskTypes();
$types = [];
foreach ($typeClasses as $typeClass) {
try {
/** @var ITaskType $object */
$object = $this->container->get($typeClass);
} catch (NotFoundExceptionInterface|ContainerExceptionInterface $e) {
$this->logger->warning('Could not find ' . $typeClass, ['exception' => $e]);
continue;
}
$types[] = [
'id' => $typeClass,
'name' => $object->getName(),
'description' => $object->getDescription(),
];
}

return new DataResponse([
'types' => $types,
]);
Fixed Show fixed Hide fixed
}

/**
* This endpoint allows scheduling a language model task
*
* @PublicPage
* @UserRateThrottle(limit=20, period=120)
* @AnonRateThrottle(limit=5, period=120)
*/
public function schedule(string $input, string $type, string $appId, string $identifier = ''): DataResponse {
try {
$task = new Task($type, $input, $this->userId, $appId, $identifier);
} catch (InvalidArgumentException) {
return new DataResponse(['message' => $this->l->t('Requested task type does not exist')], Http::STATUS_BAD_REQUEST);
}
try {
$this->languageModelManager->scheduleTask($task);

$json = $task->jsonSerialize();

return new DataResponse([
'task' => $json,
]);
Fixed Show fixed Hide fixed
} catch (PreConditionNotMetException) {
return new DataResponse(['message' => $this->l->t('Necessary language model provider is not available')], Http::STATUS_PRECONDITION_FAILED);
}
}

/**
* This endpoint allows checking the status and results of a task.
* Tasks are removed 1 week after receiving their last update.
*
* @PublicPage
* @param int $id The id of the task
*/
public function getTask(int $id): DataResponse {
try {
$task = $this->languageModelManager->getTask($id);

if ($this->userId !== $task->getUserId()) {
return new DataResponse(['message' => $this->l->t('Task not found')], Http::STATUS_NOT_FOUND);
}

$json = $task->jsonSerialize();

return new DataResponse([
'task' => $json,
]);
Fixed Show fixed Hide fixed
} catch (NotFoundException $e) {
return new DataResponse(['message' => $this->l->t('Task not found')], Http::STATUS_NOT_FOUND);
} catch (\RuntimeException $e) {
return new DataResponse(['message' => $this->l->t('Internal error')], Http::STATUS_INTERNAL_SERVER_ERROR);
}
}
}
102 changes: 102 additions & 0 deletions core/Migrations/Version28000Date20230616104802.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
<?php

declare(strict_types=1);

/**
* @copyright Copyright (c) 2023 Marcel Klehr <[email protected]>
*
* @author Marcel Klehr <[email protected]>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/

namespace OC\Core\Migrations;

use Closure;
use OCP\DB\ISchemaWrapper;
use OCP\DB\Types;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;

/**
* Introduce llm_tasks table
*/
class Version28000Date20230616104802 extends SimpleMigrationStep {
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
* @return null|ISchemaWrapper
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();

if (!$schema->hasTable('llm_tasks')) {
$table = $schema->createTable('llm_tasks');

$table->addColumn('id', Types::BIGINT, [
'notnull' => true,
'length' => 64,
'autoincrement' => true,
]);
$table->addColumn('type', Types::STRING, [
'notnull' => true,
'length' => 255,
]);
$table->addColumn('input', Types::TEXT, [
'notnull' => true,
]);
$table->addColumn('output', Types::TEXT, [
'notnull' => false,
]);
$table->addColumn('status', Types::INTEGER, [
'notnull' => false,
'length' => 6,
'default' => 0,
]);
$table->addColumn('user_id', Types::STRING, [
'notnull' => true,
'length' => 64,
]);
$table->addColumn('app_id', Types::STRING, [
'notnull' => true,
'length' => 32,
'default' => '',
]);
$table->addColumn('identifier', Types::STRING, [
'notnull' => true,
'length' => 255,
'default' => '',
]);
$table->addColumn('last_updated', 'integer', [
'notnull' => false,
'length' => 4,
'default' => 0,
'unsigned' => true,
]);

$table->setPrimaryKey(['id'], 'llm_tasks_id_index');
$table->addUniqueIndex(['status', 'type'], 'llm_tasks_status_type');
$table->addIndex(['last_updated'], 'llm_tasks_updated');

return $schema;
}

return null;
}
}
4 changes: 4 additions & 0 deletions core/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,10 @@

['root' => '/translation', 'name' => 'TranslationApi#languages', 'url' => '/languages', 'verb' => 'GET'],
['root' => '/translation', 'name' => 'TranslationApi#translate', 'url' => '/translate', 'verb' => 'POST'],

['root' => '/textprocessing', 'name' => 'TextProcessingApi#taskTypes', 'url' => '/tasktypes', 'verb' => 'GET'],
['root' => '/textprocessing', 'name' => 'TextProcessingApi#schedule', 'url' => '/schedule', 'verb' => 'POST'],
['root' => '/textprocessing', 'name' => 'TextProcessingApi#getTask', 'url' => '/task/{id}', 'verb' => 'GET'],
],
]);

Expand Down
20 changes: 20 additions & 0 deletions lib/composer/composer/autoload_classmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@
'OCP\\Comments\\IllegalIDChangeException' => $baseDir . '/lib/public/Comments/IllegalIDChangeException.php',
'OCP\\Comments\\MessageTooLongException' => $baseDir . '/lib/public/Comments/MessageTooLongException.php',
'OCP\\Comments\\NotFoundException' => $baseDir . '/lib/public/Comments/NotFoundException.php',
'OCP\\Common\\Exception\\NotFoundException' => $baseDir . '/lib/public/Common/Exception/NotFoundException.php',
'OCP\\Config\\BeforePreferenceDeletedEvent' => $baseDir . '/lib/public/Config/BeforePreferenceDeletedEvent.php',
'OCP\\Config\\BeforePreferenceSetEvent' => $baseDir . '/lib/public/Config/BeforePreferenceSetEvent.php',
'OCP\\Console\\ConsoleEvent' => $baseDir . '/lib/public/Console/ConsoleEvent.php',
Expand Down Expand Up @@ -624,6 +625,17 @@
'OCP\\Talk\\IConversationOptions' => $baseDir . '/lib/public/Talk/IConversationOptions.php',
'OCP\\Talk\\ITalkBackend' => $baseDir . '/lib/public/Talk/ITalkBackend.php',
'OCP\\Template' => $baseDir . '/lib/public/Template.php',
'OCP\\TextProcessing\\Events\\AbstractTextProcessingEvent' => $baseDir . '/lib/public/TextProcessing/Events/AbstractTextProcessingEvent.php',
'OCP\\TextProcessing\\Events\\TaskFailedEvent' => $baseDir . '/lib/public/TextProcessing/Events/TaskFailedEvent.php',
'OCP\\TextProcessing\\Events\\TaskSuccessfulEvent' => $baseDir . '/lib/public/TextProcessing/Events/TaskSuccessfulEvent.php',
'OCP\\TextProcessing\\FreePromptTaskType' => $baseDir . '/lib/public/TextProcessing/FreePromptTaskType.php',
'OCP\\TextProcessing\\HeadlineTaskType' => $baseDir . '/lib/public/TextProcessing/HeadlineTaskType.php',
'OCP\\TextProcessing\\IManager' => $baseDir . '/lib/public/TextProcessing/IManager.php',
'OCP\\TextProcessing\\IProvider' => $baseDir . '/lib/public/TextProcessing/IProvider.php',
'OCP\\TextProcessing\\ITaskType' => $baseDir . '/lib/public/TextProcessing/ITaskType.php',
'OCP\\TextProcessing\\SummaryTaskType' => $baseDir . '/lib/public/TextProcessing/SummaryTaskType.php',
'OCP\\TextProcessing\\Task' => $baseDir . '/lib/public/TextProcessing/Task.php',
'OCP\\TextProcessing\\TopicsTaskType' => $baseDir . '/lib/public/TextProcessing/TopicsTaskType.php',
'OCP\\Translation\\CouldNotTranslateException' => $baseDir . '/lib/public/Translation/CouldNotTranslateException.php',
'OCP\\Translation\\IDetectLanguageProvider' => $baseDir . '/lib/public/Translation/IDetectLanguageProvider.php',
'OCP\\Translation\\ITranslationManager' => $baseDir . '/lib/public/Translation/ITranslationManager.php',
Expand Down Expand Up @@ -1047,6 +1059,7 @@
'OC\\Core\\Controller\\ReferenceController' => $baseDir . '/core/Controller/ReferenceController.php',
'OC\\Core\\Controller\\SearchController' => $baseDir . '/core/Controller/SearchController.php',
'OC\\Core\\Controller\\SetupController' => $baseDir . '/core/Controller/SetupController.php',
'OC\\Core\\Controller\\TextProcessingApiController' => $baseDir . '/core/Controller/TextProcessingApiController.php',
'OC\\Core\\Controller\\TranslationApiController' => $baseDir . '/core/Controller/TranslationApiController.php',
'OC\\Core\\Controller\\TwoFactorChallengeController' => $baseDir . '/core/Controller/TwoFactorChallengeController.php',
'OC\\Core\\Controller\\UnifiedSearchController' => $baseDir . '/core/Controller/UnifiedSearchController.php',
Expand Down Expand Up @@ -1125,6 +1138,7 @@
'OC\\Core\\Migrations\\Version27000Date20220613163520' => $baseDir . '/core/Migrations/Version27000Date20220613163520.php',
'OC\\Core\\Migrations\\Version27000Date20230309104325' => $baseDir . '/core/Migrations/Version27000Date20230309104325.php',
'OC\\Core\\Migrations\\Version27000Date20230309104802' => $baseDir . '/core/Migrations/Version27000Date20230309104802.php',
'OC\\Core\\Migrations\\Version28000Date20230616104802' => $baseDir . '/core/Migrations/Version28000Date20230616104802.php',
'OC\\Core\\Notification\\CoreNotifier' => $baseDir . '/core/Notification/CoreNotifier.php',
'OC\\Core\\Service\\LoginFlowV2Service' => $baseDir . '/core/Service/LoginFlowV2Service.php',
'OC\\DB\\Adapter' => $baseDir . '/lib/private/DB/Adapter.php',
Expand Down Expand Up @@ -1498,6 +1512,7 @@
'OC\\RepairException' => $baseDir . '/lib/private/RepairException.php',
'OC\\Repair\\AddBruteForceCleanupJob' => $baseDir . '/lib/private/Repair/AddBruteForceCleanupJob.php',
'OC\\Repair\\AddCleanupUpdaterBackupsJob' => $baseDir . '/lib/private/Repair/AddCleanupUpdaterBackupsJob.php',
'OC\\Repair\\AddRemoveOldTasksBackgroundJob' => $baseDir . '/lib/private/Repair/AddRemoveOldTasksBackgroundJob.php',
'OC\\Repair\\CleanTags' => $baseDir . '/lib/private/Repair/CleanTags.php',
'OC\\Repair\\CleanUpAbandonedApps' => $baseDir . '/lib/private/Repair/CleanUpAbandonedApps.php',
'OC\\Repair\\ClearFrontendCaches' => $baseDir . '/lib/private/Repair/ClearFrontendCaches.php',
Expand Down Expand Up @@ -1649,6 +1664,11 @@
'OC\\Template\\ResourceLocator' => $baseDir . '/lib/private/Template/ResourceLocator.php',
'OC\\Template\\ResourceNotFoundException' => $baseDir . '/lib/private/Template/ResourceNotFoundException.php',
'OC\\Template\\TemplateFileLocator' => $baseDir . '/lib/private/Template/TemplateFileLocator.php',
'OC\\TextProcessing\\Db\\Task' => $baseDir . '/lib/private/TextProcessing/Db/Task.php',
'OC\\TextProcessing\\Db\\TaskMapper' => $baseDir . '/lib/private/TextProcessing/Db/TaskMapper.php',
'OC\\TextProcessing\\Manager' => $baseDir . '/lib/private/TextProcessing/Manager.php',
'OC\\TextProcessing\\RemoveOldTasksBackgroundJob' => $baseDir . '/lib/private/TextProcessing/RemoveOldTasksBackgroundJob.php',
'OC\\TextProcessing\\TaskBackgroundJob' => $baseDir . '/lib/private/TextProcessing/TaskBackgroundJob.php',
'OC\\Translation\\TranslationManager' => $baseDir . '/lib/private/Translation/TranslationManager.php',
'OC\\URLGenerator' => $baseDir . '/lib/private/URLGenerator.php',
'OC\\Updater' => $baseDir . '/lib/private/Updater.php',
Expand Down
Loading
Loading