nc-py-api 0.15.1__tar.gz → 0.17.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/CHANGELOG.md +20 -0
  2. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/PKG-INFO +15 -16
  3. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/README.md +14 -15
  4. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/_version.py +1 -1
  5. nc_py_api-0.17.0/nc_py_api/ex_app/providers/providers.py +24 -0
  6. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/ex_app/providers/task_processing.py +94 -30
  7. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/files/files.py +1 -1
  8. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/talk_bot.py +5 -0
  9. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/pyproject.toml +2 -1
  10. nc_py_api-0.15.1/nc_py_api/ex_app/providers/providers.py +0 -45
  11. nc_py_api-0.15.1/nc_py_api/ex_app/providers/speech_to_text.py +0 -128
  12. nc_py_api-0.15.1/nc_py_api/ex_app/providers/text_processing.py +0 -135
  13. nc_py_api-0.15.1/nc_py_api/ex_app/providers/translations.py +0 -165
  14. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/.gitignore +0 -0
  15. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/AUTHORS +0 -0
  16. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/LICENSE.txt +0 -0
  17. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/__init__.py +0 -0
  18. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/_deffered_error.py +0 -0
  19. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/_exceptions.py +0 -0
  20. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/_misc.py +0 -0
  21. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/_preferences.py +0 -0
  22. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/_preferences_ex.py +0 -0
  23. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/_session.py +0 -0
  24. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/_talk_api.py +0 -0
  25. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/_theming.py +0 -0
  26. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/activity.py +0 -0
  27. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/apps.py +0 -0
  28. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/calendar.py +0 -0
  29. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/ex_app/__init__.py +0 -0
  30. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/ex_app/defs.py +0 -0
  31. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/ex_app/events_listener.py +0 -0
  32. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/ex_app/integration_fastapi.py +0 -0
  33. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/ex_app/misc.py +0 -0
  34. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/ex_app/occ_commands.py +0 -0
  35. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/ex_app/persist_transformers_cache.py +0 -0
  36. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/ex_app/providers/__init__.py +0 -0
  37. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/ex_app/ui/__init__.py +0 -0
  38. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/ex_app/ui/files_actions.py +0 -0
  39. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/ex_app/ui/resources.py +0 -0
  40. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/ex_app/ui/settings.py +0 -0
  41. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/ex_app/ui/top_menu.py +0 -0
  42. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/ex_app/ui/ui.py +0 -0
  43. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/ex_app/uvicorn_fastapi.py +0 -0
  44. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/files/__init__.py +0 -0
  45. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/files/_files.py +0 -0
  46. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/files/files_async.py +0 -0
  47. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/files/sharing.py +0 -0
  48. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/loginflow_v2.py +0 -0
  49. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/nextcloud.py +0 -0
  50. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/notes.py +0 -0
  51. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/notifications.py +0 -0
  52. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/options.py +0 -0
  53. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/talk.py +0 -0
  54. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/user_status.py +0 -0
  55. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/users.py +0 -0
  56. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/users_groups.py +0 -0
  57. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/weather_status.py +0 -0
  58. {nc_py_api-0.15.1 → nc_py_api-0.17.0}/nc_py_api/webhooks.py +0 -0
@@ -2,6 +2,26 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [0.17.0 - 2024-09-05]
6
+
7
+ ### Added
8
+
9
+ - `message_type` property to TalkBotMessage. #292
10
+
11
+ ### Changed
12
+
13
+ - NextcloudApp: `TextProcessing`, `Speech2Text` and `Translation` AI Providers API was removed. #289
14
+
15
+ ## [0.16.0 - 2024-08-12]
16
+
17
+ ### Changed
18
+
19
+ - NextcloudApp: rework of TaskProcessing provider API. #284
20
+
21
+ ### Fixed
22
+
23
+ - `nc.files.makedirs` not working properly on Windows. #280 Thanks to @Wuli6
24
+
5
25
  ## [0.15.1 - 2024-07-30]
6
26
 
7
27
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: nc-py-api
3
- Version: 0.15.1
3
+ Version: 0.17.0
4
4
  Summary: Nextcloud Python Framework
5
5
  Project-URL: Changelog, https://github.com/cloud-py-api/nc_py_api/blob/main/CHANGELOG.md
6
6
  Project-URL: Documentation, https://cloud-py-api.github.io/nc_py_api/
@@ -101,23 +101,22 @@ Python library that provides a robust and well-documented API that allows develo
101
101
  * **Sync + Async**: Provides both sync and async APIs.
102
102
 
103
103
  ### Capabilities
104
- | **_Capability_** | Nextcloud 27 | Nextcloud 28 | Nextcloud 29 | Nextcloud 30 |
105
- |-----------------------|:------------:|:------------:|:------------:|:------------:|
106
- | Calendar | ✅ | ✅ | ✅ | ✅ |
107
- | File System & Tags | ✅ | ✅ | ✅ | ✅ |
108
- | Nextcloud Talk | ✅ | ✅ | ✅ | ✅ |
109
- | Notifications | ✅ | ✅ | ✅ | ✅ |
110
- | Shares | ✅ | ✅ | ✅ | ✅ |
111
- | Users & Groups | ✅ | ✅ | ✅ | ✅ |
112
- | User & Weather status | ✅ | ✅ | ✅ | ✅ |
113
- | Other APIs*** | ✅ | ✅ | ✅ | ✅ |
114
- | Talk Bot API* | ✅ | ✅ | ✅ | ✅ |
115
- | Settings UI API* | N/A | N/A | ✅ | ✅ |
116
- | AI Providers API** | N/A | N/A | | ✅ |
104
+ | **_Capability_** | Nextcloud 27 | Nextcloud 28 | Nextcloud 29 | Nextcloud 30 |
105
+ |------------------------------|:------------:|:------------:|:------------:|:------------:|
106
+ | Calendar | ✅ | ✅ | ✅ | ✅ |
107
+ | File System & Tags | ✅ | ✅ | ✅ | ✅ |
108
+ | Nextcloud Talk | ✅ | ✅ | ✅ | ✅ |
109
+ | Notifications | ✅ | ✅ | ✅ | ✅ |
110
+ | Shares | ✅ | ✅ | ✅ | ✅ |
111
+ | Users & Groups | ✅ | ✅ | ✅ | ✅ |
112
+ | User & Weather status | ✅ | ✅ | ✅ | ✅ |
113
+ | Other APIs** | ✅ | ✅ | ✅ | ✅ |
114
+ | Talk Bot API* | ✅ | ✅ | ✅ | ✅ |
115
+ | Settings UI API* | N/A | N/A | ✅ | ✅ |
116
+ | TaskProcessing Provider API* | N/A | N/A | N/A | ✅ |
117
117
 
118
118
  &ast;_available only for **NextcloudApp**_<br>
119
- &ast;&ast;_available only for **NextcloudApp**: SpeechToText, TextProcessing, Translation_<br>
120
- &ast;&ast;&ast;_Activity, Notes_
119
+ &ast;&ast;_Activity, Notes_
121
120
 
122
121
  ### Differences between the Nextcloud and NextcloudApp classes
123
122
 
@@ -24,23 +24,22 @@ Python library that provides a robust and well-documented API that allows develo
24
24
  * **Sync + Async**: Provides both sync and async APIs.
25
25
 
26
26
  ### Capabilities
27
- | **_Capability_** | Nextcloud 27 | Nextcloud 28 | Nextcloud 29 | Nextcloud 30 |
28
- |-----------------------|:------------:|:------------:|:------------:|:------------:|
29
- | Calendar | ✅ | ✅ | ✅ | ✅ |
30
- | File System & Tags | ✅ | ✅ | ✅ | ✅ |
31
- | Nextcloud Talk | ✅ | ✅ | ✅ | ✅ |
32
- | Notifications | ✅ | ✅ | ✅ | ✅ |
33
- | Shares | ✅ | ✅ | ✅ | ✅ |
34
- | Users & Groups | ✅ | ✅ | ✅ | ✅ |
35
- | User & Weather status | ✅ | ✅ | ✅ | ✅ |
36
- | Other APIs*** | ✅ | ✅ | ✅ | ✅ |
37
- | Talk Bot API* | ✅ | ✅ | ✅ | ✅ |
38
- | Settings UI API* | N/A | N/A | ✅ | ✅ |
39
- | AI Providers API** | N/A | N/A | | ✅ |
27
+ | **_Capability_** | Nextcloud 27 | Nextcloud 28 | Nextcloud 29 | Nextcloud 30 |
28
+ |------------------------------|:------------:|:------------:|:------------:|:------------:|
29
+ | Calendar | ✅ | ✅ | ✅ | ✅ |
30
+ | File System & Tags | ✅ | ✅ | ✅ | ✅ |
31
+ | Nextcloud Talk | ✅ | ✅ | ✅ | ✅ |
32
+ | Notifications | ✅ | ✅ | ✅ | ✅ |
33
+ | Shares | ✅ | ✅ | ✅ | ✅ |
34
+ | Users & Groups | ✅ | ✅ | ✅ | ✅ |
35
+ | User & Weather status | ✅ | ✅ | ✅ | ✅ |
36
+ | Other APIs** | ✅ | ✅ | ✅ | ✅ |
37
+ | Talk Bot API* | ✅ | ✅ | ✅ | ✅ |
38
+ | Settings UI API* | N/A | N/A | ✅ | ✅ |
39
+ | TaskProcessing Provider API* | N/A | N/A | N/A | ✅ |
40
40
 
41
41
  &ast;_available only for **NextcloudApp**_<br>
42
- &ast;&ast;_available only for **NextcloudApp**: SpeechToText, TextProcessing, Translation_<br>
43
- &ast;&ast;&ast;_Activity, Notes_
42
+ &ast;&ast;_Activity, Notes_
44
43
 
45
44
  ### Differences between the Nextcloud and NextcloudApp classes
46
45
 
@@ -1,3 +1,3 @@
1
1
  """Version of nc_py_api."""
2
2
 
3
- __version__ = "0.15.1"
3
+ __version__ = "0.17.0"
@@ -0,0 +1,24 @@
1
+ """Nextcloud API for AI Providers."""
2
+
3
+ from ..._session import AsyncNcSessionApp, NcSessionApp
4
+ from .task_processing import _AsyncTaskProcessingProviderAPI, _TaskProcessingProviderAPI
5
+
6
+
7
+ class ProvidersApi:
8
+ """Class that encapsulates all AI Providers functionality."""
9
+
10
+ task_processing: _TaskProcessingProviderAPI
11
+ """TaskProcessing Provider API."""
12
+
13
+ def __init__(self, session: NcSessionApp):
14
+ self.task_processing = _TaskProcessingProviderAPI(session)
15
+
16
+
17
+ class AsyncProvidersApi:
18
+ """Class that encapsulates all AI Providers functionality."""
19
+
20
+ task_processing: _AsyncTaskProcessingProviderAPI
21
+ """TaskProcessing Provider API."""
22
+
23
+ def __init__(self, session: AsyncNcSessionApp):
24
+ self.task_processing = _AsyncTaskProcessingProviderAPI(session)
@@ -3,35 +3,101 @@
3
3
  import contextlib
4
4
  import dataclasses
5
5
  import typing
6
+ from enum import IntEnum
7
+
8
+ from pydantic import RootModel
9
+ from pydantic.dataclasses import dataclass
6
10
 
7
11
  from ..._exceptions import NextcloudException, NextcloudExceptionNotFound
8
- from ..._misc import clear_from_params_empty, require_capabilities
12
+ from ..._misc import require_capabilities
9
13
  from ..._session import AsyncNcSessionApp, NcSessionApp
10
14
 
11
15
  _EP_SUFFIX: str = "ai_provider/task_processing"
12
16
 
13
17
 
14
- @dataclasses.dataclass
15
- class TaskProcessingProvider:
16
- """TaskProcessing provider description."""
18
+ class ShapeType(IntEnum):
19
+ """Enum for shape types."""
20
+
21
+ NUMBER = 0
22
+ TEXT = 1
23
+ IMAGE = 2
24
+ AUDIO = 3
25
+ VIDEO = 4
26
+ FILE = 5
27
+ ENUM = 6
28
+ LIST_OF_NUMBERS = 10
29
+ LIST_OF_TEXTS = 11
30
+ LIST_OF_IMAGES = 12
31
+ LIST_OF_AUDIOS = 13
32
+ LIST_OF_VIDEOS = 14
33
+ LIST_OF_FILES = 15
34
+
35
+
36
+ @dataclass
37
+ class ShapeEnumValue:
38
+ """Data object for input output shape enum slot value."""
39
+
40
+ name: str
41
+ """Name of the enum slot value which will be displayed in the UI"""
42
+ value: str
43
+ """Value of the enum slot value"""
44
+
17
45
 
18
- def __init__(self, raw_data: dict):
19
- self._raw_data = raw_data
46
+ @dataclass
47
+ class ShapeDescriptor:
48
+ """Data object for input output shape entries."""
20
49
 
21
- @property
22
- def name(self) -> str:
23
- """Unique ID for the provider."""
24
- return self._raw_data["name"]
50
+ name: str
51
+ """Name of the shape entry"""
52
+ description: str
53
+ """Description of the shape entry"""
54
+ shape_type: ShapeType
55
+ """Type of the shape entry"""
25
56
 
26
- @property
27
- def display_name(self) -> str:
28
- """Providers display name."""
29
- return self._raw_data["display_name"]
30
57
 
31
- @property
32
- def task_type(self) -> str:
33
- """The TaskType provided by this provider."""
34
- return self._raw_data["task_type"]
58
+ @dataclass
59
+ class TaskType:
60
+ """TaskType description for the provider."""
61
+
62
+ id: str
63
+ """The unique ID for the task type."""
64
+ name: str
65
+ """The localized name of the task type."""
66
+ description: str
67
+ """The localized description of the task type."""
68
+ input_shape: list[ShapeDescriptor]
69
+ """The input shape of the task."""
70
+ output_shape: list[ShapeDescriptor]
71
+ """The output shape of the task."""
72
+
73
+
74
+ @dataclass
75
+ class TaskProcessingProvider:
76
+
77
+ id: str
78
+ """Unique ID for the provider."""
79
+ name: str
80
+ """The localized name of this provider"""
81
+ task_type: str
82
+ """The TaskType provided by this provider."""
83
+ expected_runtime: int = dataclasses.field(default=0)
84
+ """Expected runtime of the task in seconds."""
85
+ optional_input_shape: list[ShapeDescriptor] = dataclasses.field(default_factory=list)
86
+ """Optional input shape of the task."""
87
+ optional_output_shape: list[ShapeDescriptor] = dataclasses.field(default_factory=list)
88
+ """Optional output shape of the task."""
89
+ input_shape_enum_values: dict[str, list[ShapeEnumValue]] = dataclasses.field(default_factory=dict)
90
+ """The option dict for each input shape ENUM slot."""
91
+ input_shape_defaults: dict[str, str | int | float] = dataclasses.field(default_factory=dict)
92
+ """The default values for input shape slots."""
93
+ optional_input_shape_enum_values: dict[str, list[ShapeEnumValue]] = dataclasses.field(default_factory=dict)
94
+ """The option list for each optional input shape ENUM slot."""
95
+ optional_input_shape_defaults: dict[str, str | int | float] = dataclasses.field(default_factory=dict)
96
+ """The default values for optional input shape slots."""
97
+ output_shape_enum_values: dict[str, list[ShapeEnumValue]] = dataclasses.field(default_factory=dict)
98
+ """The option list for each output shape ENUM slot."""
99
+ optional_output_shape_enum_values: dict[str, list[ShapeEnumValue]] = dataclasses.field(default_factory=dict)
100
+ """The option list for each optional output shape ENUM slot."""
35
101
 
36
102
  def __repr__(self):
37
103
  return f"<{self.__class__.__name__} name={self.name}, type={self.task_type}>"
@@ -44,17 +110,16 @@ class _TaskProcessingProviderAPI:
44
110
  self._session = session
45
111
 
46
112
  def register(
47
- self, name: str, display_name: str, task_type: str, custom_task_type: dict[str, typing.Any] | None = None
113
+ self,
114
+ provider: TaskProcessingProvider,
115
+ custom_task_type: TaskType | None = None,
48
116
  ) -> None:
49
117
  """Registers or edit the TaskProcessing provider."""
50
118
  require_capabilities("app_api", self._session.capabilities)
51
119
  params = {
52
- "name": name,
53
- "displayName": display_name,
54
- "taskType": task_type,
55
- "customTaskType": custom_task_type,
120
+ "provider": RootModel(provider).model_dump(),
121
+ **({"customTaskType": RootModel(custom_task_type).model_dump()} if custom_task_type else {}),
56
122
  }
57
- clear_from_params_empty(["customTaskType"], params)
58
123
  self._session.ocs("POST", f"{self._session.ae_url}/{_EP_SUFFIX}", json=params)
59
124
 
60
125
  def unregister(self, name: str, not_fail=True) -> None:
@@ -123,17 +188,16 @@ class _AsyncTaskProcessingProviderAPI:
123
188
  self._session = session
124
189
 
125
190
  async def register(
126
- self, name: str, display_name: str, task_type: str, custom_task_type: dict[str, typing.Any] | None = None
191
+ self,
192
+ provider: TaskProcessingProvider,
193
+ custom_task_type: TaskType | None = None,
127
194
  ) -> None:
128
195
  """Registers or edit the TaskProcessing provider."""
129
196
  require_capabilities("app_api", await self._session.capabilities)
130
197
  params = {
131
- "name": name,
132
- "displayName": display_name,
133
- "taskType": task_type,
134
- "customTaskType": custom_task_type,
198
+ "provider": RootModel(provider).model_dump(),
199
+ **({"customTaskType": RootModel(custom_task_type).model_dump()} if custom_task_type else {}),
135
200
  }
136
- clear_from_params_empty(["customTaskType"], params)
137
201
  await self._session.ocs("POST", f"{self._session.ae_url}/{_EP_SUFFIX}", json=params)
138
202
 
139
203
  async def unregister(self, name: str, not_fail=True) -> None:
@@ -174,7 +174,7 @@ class FilesAPI:
174
174
  path = path.lstrip("/")
175
175
  result = None
176
176
  for i in Path(path).parts:
177
- _path = os.path.join(_path, i)
177
+ _path = f"{_path}/{i}"
178
178
  if not exist_ok:
179
179
  result = self.mkdir(_path)
180
180
  else:
@@ -29,6 +29,11 @@ class TalkBotMessage:
29
29
  def __init__(self, raw_data: dict):
30
30
  self._raw_data = raw_data
31
31
 
32
+ @property
33
+ def message_type(self) -> str:
34
+ """The type of message like Join, Leave, Create, Activity, etc."""
35
+ return self._raw_data["type"]
36
+
32
37
  @property
33
38
  def actor_id(self) -> str:
34
39
  """One of the attendee types followed by the ``/`` character and a unique identifier within the given type.
@@ -129,6 +129,7 @@ lint.select = [
129
129
  "W",
130
130
  ]
131
131
  lint.extend-ignore = [
132
+ "D101",
132
133
  "D105",
133
134
  "D107",
134
135
  "D203",
@@ -173,7 +174,6 @@ master.py-version = "3.10"
173
174
  master.extension-pkg-allow-list = [
174
175
  "pydantic",
175
176
  ]
176
- design.max-attributes = 8
177
177
  design.max-locals = 20
178
178
  design.max-branches = 16
179
179
  design.max-returns = 8
@@ -206,6 +206,7 @@ messages_control.disable = [
206
206
  "line-too-long",
207
207
  "too-few-public-methods",
208
208
  "too-many-public-methods",
209
+ "too-many-instance-attributes",
209
210
  ]
210
211
 
211
212
  [tool.pytest.ini_options]
@@ -1,45 +0,0 @@
1
- """Nextcloud API for AI Providers."""
2
-
3
- from ..._session import AsyncNcSessionApp, NcSessionApp
4
- from .speech_to_text import _AsyncSpeechToTextProviderAPI, _SpeechToTextProviderAPI
5
- from .task_processing import _AsyncTaskProcessingProviderAPI, _TaskProcessingProviderAPI
6
- from .text_processing import _AsyncTextProcessingProviderAPI, _TextProcessingProviderAPI
7
- from .translations import _AsyncTranslationsProviderAPI, _TranslationsProviderAPI
8
-
9
-
10
- class ProvidersApi:
11
- """Class that encapsulates all AI Providers functionality."""
12
-
13
- speech_to_text: _SpeechToTextProviderAPI
14
- """SpeechToText Provider API."""
15
- text_processing: _TextProcessingProviderAPI
16
- """TextProcessing Provider API."""
17
- translations: _TranslationsProviderAPI
18
- """Translations Provider API."""
19
- task_processing: _TaskProcessingProviderAPI
20
- """TaskProcessing Provider API."""
21
-
22
- def __init__(self, session: NcSessionApp):
23
- self.speech_to_text = _SpeechToTextProviderAPI(session)
24
- self.text_processing = _TextProcessingProviderAPI(session)
25
- self.translations = _TranslationsProviderAPI(session)
26
- self.task_processing = _TaskProcessingProviderAPI(session)
27
-
28
-
29
- class AsyncProvidersApi:
30
- """Class that encapsulates all AI Providers functionality."""
31
-
32
- speech_to_text: _AsyncSpeechToTextProviderAPI
33
- """SpeechToText Provider API."""
34
- text_processing: _AsyncTextProcessingProviderAPI
35
- """TextProcessing Provider API."""
36
- translations: _AsyncTranslationsProviderAPI
37
- """Translations Provider API."""
38
- task_processing: _AsyncTaskProcessingProviderAPI
39
- """TaskProcessing Provider API."""
40
-
41
- def __init__(self, session: AsyncNcSessionApp):
42
- self.speech_to_text = _AsyncSpeechToTextProviderAPI(session)
43
- self.text_processing = _AsyncTextProcessingProviderAPI(session)
44
- self.translations = _AsyncTranslationsProviderAPI(session)
45
- self.task_processing = _AsyncTaskProcessingProviderAPI(session)
@@ -1,128 +0,0 @@
1
- """Nextcloud API for declaring SpeechToText provider."""
2
-
3
- import contextlib
4
- import dataclasses
5
-
6
- from ..._exceptions import NextcloudException, NextcloudExceptionNotFound
7
- from ..._misc import require_capabilities
8
- from ..._session import AsyncNcSessionApp, NcSessionApp
9
-
10
- _EP_SUFFIX: str = "ai_provider/speech_to_text"
11
-
12
-
13
- @dataclasses.dataclass
14
- class SpeechToTextProvider:
15
- """Speech2Text provider description."""
16
-
17
- def __init__(self, raw_data: dict):
18
- self._raw_data = raw_data
19
-
20
- @property
21
- def name(self) -> str:
22
- """Unique ID for the provider."""
23
- return self._raw_data["name"]
24
-
25
- @property
26
- def display_name(self) -> str:
27
- """Providers display name."""
28
- return self._raw_data["display_name"]
29
-
30
- @property
31
- def action_handler(self) -> str:
32
- """Relative ExApp url which will be called by Nextcloud."""
33
- return self._raw_data["action_handler"]
34
-
35
- def __repr__(self):
36
- return f"<{self.__class__.__name__} name={self.name}, handler={self.action_handler}>"
37
-
38
-
39
- class _SpeechToTextProviderAPI:
40
- """API for Speech2Text providers, avalaible as **nc.providers.text_processing.<method>**."""
41
-
42
- def __init__(self, session: NcSessionApp):
43
- self._session = session
44
-
45
- def register(self, name: str, display_name: str, callback_url: str) -> None:
46
- """Registers or edit the SpeechToText provider."""
47
- require_capabilities("app_api", self._session.capabilities)
48
- params = {
49
- "name": name,
50
- "displayName": display_name,
51
- "actionHandler": callback_url,
52
- }
53
- self._session.ocs("POST", f"{self._session.ae_url}/{_EP_SUFFIX}", json=params)
54
-
55
- def unregister(self, name: str, not_fail=True) -> None:
56
- """Removes SpeechToText provider."""
57
- require_capabilities("app_api", self._session.capabilities)
58
- try:
59
- self._session.ocs("DELETE", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
60
- except NextcloudExceptionNotFound as e:
61
- if not not_fail:
62
- raise e from None
63
-
64
- def get_entry(self, name: str) -> SpeechToTextProvider | None:
65
- """Get information of the SpeechToText."""
66
- require_capabilities("app_api", self._session.capabilities)
67
- try:
68
- return SpeechToTextProvider(
69
- self._session.ocs("GET", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
70
- )
71
- except NextcloudExceptionNotFound:
72
- return None
73
-
74
- def report_result(self, task_id: int, result: str = "", error: str = "") -> None:
75
- """Report results of speech to text task to Nextcloud."""
76
- require_capabilities("app_api", self._session.capabilities)
77
- with contextlib.suppress(NextcloudException):
78
- self._session.ocs(
79
- "PUT",
80
- f"{self._session.ae_url}/{_EP_SUFFIX}",
81
- json={"taskId": task_id, "result": result, "error": error},
82
- )
83
-
84
-
85
- class _AsyncSpeechToTextProviderAPI:
86
- """Async API for Speech2Text providers."""
87
-
88
- def __init__(self, session: AsyncNcSessionApp):
89
- self._session = session
90
-
91
- async def register(self, name: str, display_name: str, callback_url: str) -> None:
92
- """Registers or edit the SpeechToText provider."""
93
- require_capabilities("app_api", await self._session.capabilities)
94
- params = {
95
- "name": name,
96
- "displayName": display_name,
97
- "actionHandler": callback_url,
98
- }
99
- await self._session.ocs("POST", f"{self._session.ae_url}/{_EP_SUFFIX}", json=params)
100
-
101
- async def unregister(self, name: str, not_fail=True) -> None:
102
- """Removes SpeechToText provider."""
103
- require_capabilities("app_api", await self._session.capabilities)
104
- try:
105
- await self._session.ocs("DELETE", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
106
- except NextcloudExceptionNotFound as e:
107
- if not not_fail:
108
- raise e from None
109
-
110
- async def get_entry(self, name: str) -> SpeechToTextProvider | None:
111
- """Get information of the SpeechToText."""
112
- require_capabilities("app_api", await self._session.capabilities)
113
- try:
114
- return SpeechToTextProvider(
115
- await self._session.ocs("GET", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
116
- )
117
- except NextcloudExceptionNotFound:
118
- return None
119
-
120
- async def report_result(self, task_id: int, result: str = "", error: str = "") -> None:
121
- """Report results of speech to text task to Nextcloud."""
122
- require_capabilities("app_api", await self._session.capabilities)
123
- with contextlib.suppress(NextcloudException):
124
- await self._session.ocs(
125
- "PUT",
126
- f"{self._session.ae_url}/{_EP_SUFFIX}",
127
- json={"taskId": task_id, "result": result, "error": error},
128
- )
@@ -1,135 +0,0 @@
1
- """Nextcloud API for declaring TextProcessing provider."""
2
-
3
- import contextlib
4
- import dataclasses
5
-
6
- from ..._exceptions import NextcloudException, NextcloudExceptionNotFound
7
- from ..._misc import require_capabilities
8
- from ..._session import AsyncNcSessionApp, NcSessionApp
9
-
10
- _EP_SUFFIX: str = "ai_provider/text_processing"
11
-
12
-
13
- @dataclasses.dataclass
14
- class TextProcessingProvider:
15
- """TextProcessing provider description."""
16
-
17
- def __init__(self, raw_data: dict):
18
- self._raw_data = raw_data
19
-
20
- @property
21
- def name(self) -> str:
22
- """Unique ID for the provider."""
23
- return self._raw_data["name"]
24
-
25
- @property
26
- def display_name(self) -> str:
27
- """Providers display name."""
28
- return self._raw_data["display_name"]
29
-
30
- @property
31
- def action_handler(self) -> str:
32
- """Relative ExApp url which will be called by Nextcloud."""
33
- return self._raw_data["action_handler"]
34
-
35
- @property
36
- def task_type(self) -> str:
37
- """The TaskType provided by this provider."""
38
- return self._raw_data["task_type"]
39
-
40
- def __repr__(self):
41
- return f"<{self.__class__.__name__} name={self.name}, type={self.task_type}, handler={self.action_handler}>"
42
-
43
-
44
- class _TextProcessingProviderAPI:
45
- """API for TextProcessing providers, avalaible as **nc.providers.speech_to_text.<method>**."""
46
-
47
- def __init__(self, session: NcSessionApp):
48
- self._session = session
49
-
50
- def register(self, name: str, display_name: str, callback_url: str, task_type: str) -> None:
51
- """Registers or edit the TextProcessing provider."""
52
- require_capabilities("app_api", self._session.capabilities)
53
- params = {
54
- "name": name,
55
- "displayName": display_name,
56
- "actionHandler": callback_url,
57
- "taskType": task_type,
58
- }
59
- self._session.ocs("POST", f"{self._session.ae_url}/{_EP_SUFFIX}", json=params)
60
-
61
- def unregister(self, name: str, not_fail=True) -> None:
62
- """Removes TextProcessing provider."""
63
- require_capabilities("app_api", self._session.capabilities)
64
- try:
65
- self._session.ocs("DELETE", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
66
- except NextcloudExceptionNotFound as e:
67
- if not not_fail:
68
- raise e from None
69
-
70
- def get_entry(self, name: str) -> TextProcessingProvider | None:
71
- """Get information of the TextProcessing."""
72
- require_capabilities("app_api", self._session.capabilities)
73
- try:
74
- return TextProcessingProvider(
75
- self._session.ocs("GET", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
76
- )
77
- except NextcloudExceptionNotFound:
78
- return None
79
-
80
- def report_result(self, task_id: int, result: str = "", error: str = "") -> None:
81
- """Report results of the text processing to Nextcloud."""
82
- require_capabilities("app_api", self._session.capabilities)
83
- with contextlib.suppress(NextcloudException):
84
- self._session.ocs(
85
- "PUT",
86
- f"{self._session.ae_url}/{_EP_SUFFIX}",
87
- json={"taskId": task_id, "result": result, "error": error},
88
- )
89
-
90
-
91
- class _AsyncTextProcessingProviderAPI:
92
- """Async API for TextProcessing providers."""
93
-
94
- def __init__(self, session: AsyncNcSessionApp):
95
- self._session = session
96
-
97
- async def register(self, name: str, display_name: str, callback_url: str, task_type: str) -> None:
98
- """Registers or edit the TextProcessing provider."""
99
- require_capabilities("app_api", await self._session.capabilities)
100
- params = {
101
- "name": name,
102
- "displayName": display_name,
103
- "actionHandler": callback_url,
104
- "taskType": task_type,
105
- }
106
- await self._session.ocs("POST", f"{self._session.ae_url}/{_EP_SUFFIX}", json=params)
107
-
108
- async def unregister(self, name: str, not_fail=True) -> None:
109
- """Removes TextProcessing provider."""
110
- require_capabilities("app_api", await self._session.capabilities)
111
- try:
112
- await self._session.ocs("DELETE", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
113
- except NextcloudExceptionNotFound as e:
114
- if not not_fail:
115
- raise e from None
116
-
117
- async def get_entry(self, name: str) -> TextProcessingProvider | None:
118
- """Get information of the TextProcessing."""
119
- require_capabilities("app_api", await self._session.capabilities)
120
- try:
121
- return TextProcessingProvider(
122
- await self._session.ocs("GET", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
123
- )
124
- except NextcloudExceptionNotFound:
125
- return None
126
-
127
- async def report_result(self, task_id: int, result: str = "", error: str = "") -> None:
128
- """Report results of the text processing to Nextcloud."""
129
- require_capabilities("app_api", await self._session.capabilities)
130
- with contextlib.suppress(NextcloudException):
131
- await self._session.ocs(
132
- "PUT",
133
- f"{self._session.ae_url}/{_EP_SUFFIX}",
134
- json={"taskId": task_id, "result": result, "error": error},
135
- )
@@ -1,165 +0,0 @@
1
- """Nextcloud API for declaring Translations provider."""
2
-
3
- import contextlib
4
- import dataclasses
5
-
6
- from ..._exceptions import NextcloudException, NextcloudExceptionNotFound
7
- from ..._misc import require_capabilities
8
- from ..._session import AsyncNcSessionApp, NcSessionApp
9
-
10
- _EP_SUFFIX: str = "ai_provider/translation"
11
-
12
-
13
- @dataclasses.dataclass
14
- class TranslationsProvider:
15
- """Translations provider description."""
16
-
17
- def __init__(self, raw_data: dict):
18
- self._raw_data = raw_data
19
-
20
- @property
21
- def name(self) -> str:
22
- """Unique ID for the provider."""
23
- return self._raw_data["name"]
24
-
25
- @property
26
- def display_name(self) -> str:
27
- """Providers display name."""
28
- return self._raw_data["display_name"]
29
-
30
- @property
31
- def from_languages(self) -> dict[str, str]:
32
- """Input languages supported by provider."""
33
- return self._raw_data["from_languages"]
34
-
35
- @property
36
- def to_languages(self) -> dict[str, str]:
37
- """Output languages supported by provider."""
38
- return self._raw_data["to_languages"]
39
-
40
- @property
41
- def action_handler(self) -> str:
42
- """Relative ExApp url which will be called by Nextcloud."""
43
- return self._raw_data["action_handler"]
44
-
45
- @property
46
- def action_handler_detect_lang(self) -> str:
47
- """Relative ExApp url which will be called by Nextcloud to detect language."""
48
- return self._raw_data.get("action_detect_lang", "")
49
-
50
- def __repr__(self):
51
- return f"<{self.__class__.__name__} name={self.name}, handler={self.action_handler}>"
52
-
53
-
54
- class _TranslationsProviderAPI:
55
- """API for Translations providers, avalaible as **nc.providers.translations.<method>**."""
56
-
57
- def __init__(self, session: NcSessionApp):
58
- self._session = session
59
-
60
- def register(
61
- self,
62
- name: str,
63
- display_name: str,
64
- callback_url: str,
65
- from_languages: dict[str, str],
66
- to_languages: dict[str, str],
67
- detect_lang_callback_url: str = "",
68
- ) -> None:
69
- """Registers or edit the Translations provider."""
70
- require_capabilities("app_api", self._session.capabilities)
71
- params = {
72
- "name": name,
73
- "displayName": display_name,
74
- "fromLanguages": from_languages,
75
- "toLanguages": to_languages,
76
- "actionHandler": callback_url,
77
- "actionDetectLang": detect_lang_callback_url,
78
- }
79
- self._session.ocs("POST", f"{self._session.ae_url}/{_EP_SUFFIX}", json=params)
80
-
81
- def unregister(self, name: str, not_fail=True) -> None:
82
- """Removes Translations provider."""
83
- require_capabilities("app_api", self._session.capabilities)
84
- try:
85
- self._session.ocs("DELETE", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
86
- except NextcloudExceptionNotFound as e:
87
- if not not_fail:
88
- raise e from None
89
-
90
- def get_entry(self, name: str) -> TranslationsProvider | None:
91
- """Get information of the TranslationsProvider."""
92
- require_capabilities("app_api", self._session.capabilities)
93
- try:
94
- return TranslationsProvider(
95
- self._session.ocs("GET", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
96
- )
97
- except NextcloudExceptionNotFound:
98
- return None
99
-
100
- def report_result(self, task_id: int, result: str = "", error: str = "") -> None:
101
- """Report results of translation task to Nextcloud."""
102
- require_capabilities("app_api", self._session.capabilities)
103
- with contextlib.suppress(NextcloudException):
104
- self._session.ocs(
105
- "PUT",
106
- f"{self._session.ae_url}/{_EP_SUFFIX}",
107
- json={"taskId": task_id, "result": result, "error": error},
108
- )
109
-
110
-
111
- class _AsyncTranslationsProviderAPI:
112
- """Async API for Translations providers."""
113
-
114
- def __init__(self, session: AsyncNcSessionApp):
115
- self._session = session
116
-
117
- async def register(
118
- self,
119
- name: str,
120
- display_name: str,
121
- callback_url: str,
122
- from_languages: dict[str, str],
123
- to_languages: dict[str, str],
124
- detect_lang_callback_url: str = "",
125
- ) -> None:
126
- """Registers or edit the Translations provider."""
127
- require_capabilities("app_api", await self._session.capabilities)
128
- params = {
129
- "name": name,
130
- "displayName": display_name,
131
- "fromLanguages": from_languages,
132
- "toLanguages": to_languages,
133
- "actionHandler": callback_url,
134
- "actionDetectLang": detect_lang_callback_url,
135
- }
136
- await self._session.ocs("POST", f"{self._session.ae_url}/{_EP_SUFFIX}", json=params)
137
-
138
- async def unregister(self, name: str, not_fail=True) -> None:
139
- """Removes Translations provider."""
140
- require_capabilities("app_api", await self._session.capabilities)
141
- try:
142
- await self._session.ocs("DELETE", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
143
- except NextcloudExceptionNotFound as e:
144
- if not not_fail:
145
- raise e from None
146
-
147
- async def get_entry(self, name: str) -> TranslationsProvider | None:
148
- """Get information of the TranslationsProvider."""
149
- require_capabilities("app_api", await self._session.capabilities)
150
- try:
151
- return TranslationsProvider(
152
- await self._session.ocs("GET", f"{self._session.ae_url}/{_EP_SUFFIX}", params={"name": name})
153
- )
154
- except NextcloudExceptionNotFound:
155
- return None
156
-
157
- async def report_result(self, task_id: int, result: str = "", error: str = "") -> None:
158
- """Report results of translation task to Nextcloud."""
159
- require_capabilities("app_api", await self._session.capabilities)
160
- with contextlib.suppress(NextcloudException):
161
- await self._session.ocs(
162
- "PUT",
163
- f"{self._session.ae_url}/{_EP_SUFFIX}",
164
- json={"taskId": task_id, "result": result, "error": error},
165
- )
File without changes
File without changes
File without changes
File without changes
File without changes