knowledge2 0.4.0__py3-none-any.whl

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 (139) hide show
  1. knowledge2-0.4.0.dist-info/METADATA +556 -0
  2. knowledge2-0.4.0.dist-info/RECORD +139 -0
  3. knowledge2-0.4.0.dist-info/WHEEL +5 -0
  4. knowledge2-0.4.0.dist-info/top_level.txt +1 -0
  5. sdk/__init__.py +70 -0
  6. sdk/_async_base.py +525 -0
  7. sdk/_async_paging.py +57 -0
  8. sdk/_base.py +541 -0
  9. sdk/_logging.py +41 -0
  10. sdk/_paging.py +73 -0
  11. sdk/_preview.py +70 -0
  12. sdk/_raw_response.py +25 -0
  13. sdk/_request_options.py +51 -0
  14. sdk/_transport.py +144 -0
  15. sdk/_validation.py +25 -0
  16. sdk/_validation_response.py +36 -0
  17. sdk/_version.py +3 -0
  18. sdk/async_client.py +320 -0
  19. sdk/async_resources/__init__.py +45 -0
  20. sdk/async_resources/_mixin_base.py +42 -0
  21. sdk/async_resources/a2a.py +230 -0
  22. sdk/async_resources/agents.py +489 -0
  23. sdk/async_resources/audit.py +145 -0
  24. sdk/async_resources/auth.py +133 -0
  25. sdk/async_resources/console.py +409 -0
  26. sdk/async_resources/corpora.py +276 -0
  27. sdk/async_resources/deployments.py +106 -0
  28. sdk/async_resources/documents.py +592 -0
  29. sdk/async_resources/feeds.py +248 -0
  30. sdk/async_resources/indexes.py +208 -0
  31. sdk/async_resources/jobs.py +165 -0
  32. sdk/async_resources/metadata.py +48 -0
  33. sdk/async_resources/models.py +102 -0
  34. sdk/async_resources/onboarding.py +538 -0
  35. sdk/async_resources/orgs.py +37 -0
  36. sdk/async_resources/pipelines.py +523 -0
  37. sdk/async_resources/projects.py +90 -0
  38. sdk/async_resources/search.py +262 -0
  39. sdk/async_resources/training.py +357 -0
  40. sdk/async_resources/usage.py +91 -0
  41. sdk/client.py +417 -0
  42. sdk/config.py +182 -0
  43. sdk/errors.py +178 -0
  44. sdk/examples/auth_factory.py +34 -0
  45. sdk/examples/batch_operations.py +57 -0
  46. sdk/examples/document_upload.py +56 -0
  47. sdk/examples/e2e_lifecycle.py +213 -0
  48. sdk/examples/error_handling.py +61 -0
  49. sdk/examples/pagination.py +64 -0
  50. sdk/examples/quickstart.py +36 -0
  51. sdk/examples/request_options.py +44 -0
  52. sdk/examples/search.py +64 -0
  53. sdk/integrations/__init__.py +57 -0
  54. sdk/integrations/_client.py +101 -0
  55. sdk/integrations/langchain/__init__.py +6 -0
  56. sdk/integrations/langchain/retriever.py +166 -0
  57. sdk/integrations/langchain/tools.py +108 -0
  58. sdk/integrations/llamaindex/__init__.py +11 -0
  59. sdk/integrations/llamaindex/filters.py +78 -0
  60. sdk/integrations/llamaindex/retriever.py +162 -0
  61. sdk/integrations/llamaindex/tools.py +109 -0
  62. sdk/integrations/llamaindex/vector_store.py +320 -0
  63. sdk/models/__init__.py +18 -0
  64. sdk/models/_base.py +24 -0
  65. sdk/models/_registry.py +457 -0
  66. sdk/models/a2a.py +92 -0
  67. sdk/models/agents.py +109 -0
  68. sdk/models/audit.py +28 -0
  69. sdk/models/auth.py +49 -0
  70. sdk/models/chunks.py +20 -0
  71. sdk/models/common.py +14 -0
  72. sdk/models/console.py +103 -0
  73. sdk/models/corpora.py +48 -0
  74. sdk/models/deployments.py +13 -0
  75. sdk/models/documents.py +126 -0
  76. sdk/models/embeddings.py +24 -0
  77. sdk/models/evaluation.py +17 -0
  78. sdk/models/feedback.py +9 -0
  79. sdk/models/feeds.py +57 -0
  80. sdk/models/indexes.py +36 -0
  81. sdk/models/jobs.py +52 -0
  82. sdk/models/models.py +26 -0
  83. sdk/models/onboarding.py +323 -0
  84. sdk/models/orgs.py +11 -0
  85. sdk/models/pipelines.py +147 -0
  86. sdk/models/projects.py +19 -0
  87. sdk/models/search.py +149 -0
  88. sdk/models/training.py +57 -0
  89. sdk/models/usage.py +39 -0
  90. sdk/namespaces.py +386 -0
  91. sdk/py.typed +0 -0
  92. sdk/resources/__init__.py +45 -0
  93. sdk/resources/_mixin_base.py +40 -0
  94. sdk/resources/a2a.py +230 -0
  95. sdk/resources/agents.py +487 -0
  96. sdk/resources/audit.py +144 -0
  97. sdk/resources/auth.py +138 -0
  98. sdk/resources/console.py +411 -0
  99. sdk/resources/corpora.py +269 -0
  100. sdk/resources/deployments.py +105 -0
  101. sdk/resources/documents.py +597 -0
  102. sdk/resources/feeds.py +246 -0
  103. sdk/resources/indexes.py +210 -0
  104. sdk/resources/jobs.py +164 -0
  105. sdk/resources/metadata.py +53 -0
  106. sdk/resources/models.py +99 -0
  107. sdk/resources/onboarding.py +542 -0
  108. sdk/resources/orgs.py +35 -0
  109. sdk/resources/pipeline_builder.py +257 -0
  110. sdk/resources/pipelines.py +520 -0
  111. sdk/resources/projects.py +87 -0
  112. sdk/resources/search.py +277 -0
  113. sdk/resources/training.py +358 -0
  114. sdk/resources/usage.py +92 -0
  115. sdk/types/__init__.py +366 -0
  116. sdk/types/a2a.py +88 -0
  117. sdk/types/agents.py +133 -0
  118. sdk/types/audit.py +26 -0
  119. sdk/types/auth.py +45 -0
  120. sdk/types/chunks.py +18 -0
  121. sdk/types/common.py +10 -0
  122. sdk/types/console.py +99 -0
  123. sdk/types/corpora.py +42 -0
  124. sdk/types/deployments.py +11 -0
  125. sdk/types/documents.py +104 -0
  126. sdk/types/embeddings.py +22 -0
  127. sdk/types/evaluation.py +15 -0
  128. sdk/types/feedback.py +7 -0
  129. sdk/types/feeds.py +61 -0
  130. sdk/types/indexes.py +30 -0
  131. sdk/types/jobs.py +50 -0
  132. sdk/types/models.py +22 -0
  133. sdk/types/onboarding.py +395 -0
  134. sdk/types/orgs.py +9 -0
  135. sdk/types/pipelines.py +177 -0
  136. sdk/types/projects.py +14 -0
  137. sdk/types/search.py +116 -0
  138. sdk/types/training.py +55 -0
  139. sdk/types/usage.py +37 -0
sdk/resources/auth.py ADDED
@@ -0,0 +1,138 @@
1
+ """Authentication resource mixin for the Knowledge2 SDK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import warnings
6
+ from typing import Any
7
+
8
+ from sdk._request_options import RequestOptions
9
+ from sdk._validation import require_str
10
+ from sdk.resources._mixin_base import RequesterMixin
11
+ from sdk.types import (
12
+ ApiKeyCreateResponse,
13
+ ApiKeyListResponse,
14
+ ApiKeyRevokeResponse,
15
+ ApiKeyRotateResponse,
16
+ WhoAmIResponse,
17
+ )
18
+
19
+
20
+ class AuthMixin(RequesterMixin):
21
+ def create_api_key(
22
+ self,
23
+ org_id: str,
24
+ name: str,
25
+ scopes: dict[str, Any] | None = None,
26
+ request_options: RequestOptions | None = None,
27
+ ) -> ApiKeyCreateResponse:
28
+ """Create a new API key for the given organisation.
29
+
30
+ Args:
31
+ org_id: Organisation that will own the key.
32
+ name: Human-readable name for the key.
33
+ scopes: Optional scope restrictions for the key.
34
+
35
+ Returns:
36
+ The newly created API key, including the raw secret (shown only once).
37
+
38
+ Raises:
39
+ Knowledge2Error: If the API request fails.
40
+ """
41
+ org_id = require_str(org_id, "org_id")
42
+ payload: dict[str, Any] = {"org_id": org_id, "name": name}
43
+ if scopes is not None:
44
+ payload["scopes"] = scopes
45
+ data = self._request(
46
+ "POST", "/v1/auth/api-keys", json=payload, request_options=request_options
47
+ )
48
+ return self._maybe_validate(data, "ApiKeyCreateResponse")
49
+
50
+ def list_api_keys(
51
+ self,
52
+ request_options: RequestOptions | None = None,
53
+ ) -> ApiKeyListResponse:
54
+ """List all API keys visible to the current credentials.
55
+
56
+ Returns:
57
+ A list of API key metadata objects.
58
+
59
+ Raises:
60
+ Knowledge2Error: If the API request fails.
61
+ """
62
+ data = self._request("GET", "/v1/auth/api-keys", request_options=request_options)
63
+ return self._maybe_validate(data, "ApiKeyListResponse")
64
+
65
+ def revoke_api_key(
66
+ self,
67
+ key_id: str,
68
+ request_options: RequestOptions | None = None,
69
+ ) -> ApiKeyRevokeResponse:
70
+ """Revoke an API key so it can no longer be used for authentication.
71
+
72
+ Args:
73
+ key_id: Unique identifier of the API key to revoke.
74
+
75
+ Returns:
76
+ Confirmation of the revocation.
77
+
78
+ Raises:
79
+ NotFoundError: If the key does not exist.
80
+ Knowledge2Error: If the API request fails.
81
+ """
82
+ key_id = require_str(key_id, "key_id")
83
+ data = self._request(
84
+ "POST", f"/v1/auth/api-keys/{key_id}:revoke", request_options=request_options
85
+ )
86
+ return self._maybe_validate(data, "ApiKeyRevokeResponse")
87
+
88
+ def rotate_api_key(
89
+ self,
90
+ key_id: str,
91
+ request_options: RequestOptions | None = None,
92
+ ) -> ApiKeyRotateResponse:
93
+ """Rotate an API key, generating a new secret and invalidating the old one.
94
+
95
+ Args:
96
+ key_id: Unique identifier of the API key to rotate.
97
+
98
+ Returns:
99
+ The rotated key with the new raw secret (shown only once).
100
+
101
+ Raises:
102
+ NotFoundError: If the key does not exist.
103
+ Knowledge2Error: If the API request fails.
104
+ """
105
+ key_id = require_str(key_id, "key_id")
106
+ data = self._request(
107
+ "POST", f"/v1/auth/api-keys/{key_id}:rotate", request_options=request_options
108
+ )
109
+ return self._maybe_validate(data, "ApiKeyRotateResponse")
110
+
111
+ def get_whoami(
112
+ self,
113
+ request_options: RequestOptions | None = None,
114
+ ) -> WhoAmIResponse:
115
+ """Return information about the current API key.
116
+
117
+ Returns:
118
+ A dict containing ``org_id``, ``key_id``, ``name``,
119
+ ``scopes``, and other metadata for the authenticated key.
120
+ """
121
+ data = self._request("GET", "/v1/auth/whoami", request_options=request_options)
122
+ return self._maybe_validate(data, "WhoAmIResponse")
123
+
124
+ def fetch_whoami(
125
+ self,
126
+ request_options: RequestOptions | None = None,
127
+ ) -> WhoAmIResponse:
128
+ """Return information about the current API key.
129
+
130
+ .. deprecated::
131
+ Use :meth:`get_whoami` instead.
132
+ """
133
+ warnings.warn(
134
+ "fetch_whoami() is deprecated, use get_whoami() instead",
135
+ DeprecationWarning,
136
+ stacklevel=2,
137
+ )
138
+ return self.get_whoami(request_options=request_options)
@@ -0,0 +1,411 @@
1
+ """Console resource mixin for the Knowledge2 SDK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ from sdk._request_options import RequestOptions
8
+ from sdk._validation import require_str
9
+ from sdk.resources._mixin_base import RequesterMixin
10
+ from sdk.types import (
11
+ ApiKeyCreateResponse,
12
+ ApiKeyListResponse,
13
+ ApiKeyRevokeResponse,
14
+ ConsoleBootstrapResponse,
15
+ ConsoleMeResponse,
16
+ ConsoleOrgResponse,
17
+ ConsoleProjectItem,
18
+ ConsoleProjectListResponse,
19
+ ConsoleSummaryResponse,
20
+ InviteAcceptResponse,
21
+ InviteCreateResponse,
22
+ InviteListResponse,
23
+ MemberRemoveResponse,
24
+ MemberUpdateResponse,
25
+ TeamListResponse,
26
+ )
27
+
28
+
29
+ class ConsoleMixin(RequesterMixin):
30
+ def console_me(
31
+ self,
32
+ *,
33
+ project_id: str | None = None,
34
+ request_options: RequestOptions | None = None,
35
+ ) -> ConsoleMeResponse:
36
+ """Retrieve the current console user profile.
37
+
38
+ Args:
39
+ project_id: Optional project context to include in the response.
40
+
41
+ Returns:
42
+ The authenticated user's console profile information.
43
+
44
+ Raises:
45
+ Knowledge2Error: If the API request fails.
46
+ """
47
+ params: dict[str, Any] = {}
48
+ if project_id is not None:
49
+ params["project_id"] = project_id
50
+ data = self._request(
51
+ "GET", "/v1/console/me", params=params or None, request_options=request_options
52
+ )
53
+ return self._maybe_validate(data, "ConsoleMeResponse")
54
+
55
+ def console_bootstrap(
56
+ self,
57
+ *,
58
+ org_name: str | None = None,
59
+ project_name: str | None = None,
60
+ email: str | None = None,
61
+ name: str | None = None,
62
+ request_options: RequestOptions | None = None,
63
+ ) -> ConsoleBootstrapResponse:
64
+ """Bootstrap a new console session, creating org/project if needed.
65
+
66
+ Args:
67
+ org_name: Name for the organisation to create or associate.
68
+ project_name: Name for the default project to create.
69
+ email: Contact email for the new organisation.
70
+ name: Display name for the user.
71
+
72
+ Returns:
73
+ Bootstrap result containing created or existing org/project details.
74
+
75
+ Raises:
76
+ Knowledge2Error: If the API request fails.
77
+ """
78
+ payload: dict[str, Any] = {}
79
+ if org_name is not None:
80
+ payload["org_name"] = org_name
81
+ if project_name is not None:
82
+ payload["project_name"] = project_name
83
+ if email is not None:
84
+ payload["email"] = email
85
+ if name is not None:
86
+ payload["name"] = name
87
+ data = self._request(
88
+ "POST", "/v1/console/bootstrap", json=payload, request_options=request_options
89
+ )
90
+ return self._maybe_validate(data, "ConsoleBootstrapResponse")
91
+
92
+ def console_summary(
93
+ self,
94
+ request_options: RequestOptions | None = None,
95
+ ) -> ConsoleSummaryResponse:
96
+ """Retrieve a high-level summary of the console (corpora, jobs, etc.).
97
+
98
+ Returns:
99
+ Aggregated summary statistics for the current organisation.
100
+
101
+ Raises:
102
+ Knowledge2Error: If the API request fails.
103
+ """
104
+ data = self._request("GET", "/v1/console/summary", request_options=request_options)
105
+ return self._maybe_validate(data, "ConsoleSummaryResponse")
106
+
107
+ def console_projects(
108
+ self,
109
+ request_options: RequestOptions | None = None,
110
+ ) -> ConsoleProjectListResponse:
111
+ """List all projects visible in the console.
112
+
113
+ Returns:
114
+ A list of console project summaries.
115
+
116
+ Raises:
117
+ Knowledge2Error: If the API request fails.
118
+ """
119
+ data = self._request("GET", "/v1/console/projects", request_options=request_options)
120
+ return self._maybe_validate(data, "ConsoleProjectListResponse")
121
+
122
+ def console_get_project(
123
+ self,
124
+ project_id: str,
125
+ request_options: RequestOptions | None = None,
126
+ ) -> ConsoleProjectItem:
127
+ """Retrieve details of a single console project.
128
+
129
+ Args:
130
+ project_id: Unique identifier of the project.
131
+
132
+ Returns:
133
+ Detailed project information.
134
+
135
+ Raises:
136
+ NotFoundError: If the project does not exist.
137
+ Knowledge2Error: If the API request fails.
138
+ """
139
+ project_id = require_str(project_id, "project_id")
140
+ data = self._request(
141
+ "GET", f"/v1/console/projects/{project_id}", request_options=request_options
142
+ )
143
+ return self._maybe_validate(data, "ConsoleProjectItem")
144
+
145
+ def console_update_project(
146
+ self,
147
+ project_id: str,
148
+ *,
149
+ name: str | None = None,
150
+ request_options: RequestOptions | None = None,
151
+ ) -> ConsoleProjectItem:
152
+ """Update a console project's settings.
153
+
154
+ Args:
155
+ project_id: Unique identifier of the project to update.
156
+ name: New display name for the project.
157
+
158
+ Returns:
159
+ The updated project information.
160
+
161
+ Raises:
162
+ NotFoundError: If the project does not exist.
163
+ Knowledge2Error: If the API request fails.
164
+ """
165
+ project_id = require_str(project_id, "project_id")
166
+ payload: dict[str, Any] = {}
167
+ if name is not None:
168
+ payload["name"] = name
169
+ data = self._request(
170
+ "PATCH",
171
+ f"/v1/console/projects/{project_id}",
172
+ json=payload,
173
+ request_options=request_options,
174
+ )
175
+ return self._maybe_validate(data, "ConsoleProjectItem")
176
+
177
+ def console_get_org(
178
+ self,
179
+ request_options: RequestOptions | None = None,
180
+ ) -> ConsoleOrgResponse:
181
+ """Retrieve the current organisation's console profile.
182
+
183
+ Returns:
184
+ Organisation details including name and settings.
185
+
186
+ Raises:
187
+ Knowledge2Error: If the API request fails.
188
+ """
189
+ data = self._request("GET", "/v1/console/org", request_options=request_options)
190
+ return self._maybe_validate(data, "ConsoleOrgResponse")
191
+
192
+ def console_update_org(
193
+ self,
194
+ *,
195
+ name: str | None = None,
196
+ contact_email: str | None = None,
197
+ request_options: RequestOptions | None = None,
198
+ ) -> ConsoleOrgResponse:
199
+ """Update the current organisation's settings.
200
+
201
+ Args:
202
+ name: New display name for the organisation.
203
+ contact_email: New contact email address.
204
+
205
+ Returns:
206
+ The updated organisation details.
207
+
208
+ Raises:
209
+ Knowledge2Error: If the API request fails.
210
+ """
211
+ payload: dict[str, Any] = {}
212
+ if name is not None:
213
+ payload["name"] = name
214
+ if contact_email is not None:
215
+ payload["contact_email"] = contact_email
216
+ data = self._request(
217
+ "PATCH", "/v1/console/org", json=payload, request_options=request_options
218
+ )
219
+ return self._maybe_validate(data, "ConsoleOrgResponse")
220
+
221
+ def console_list_team(
222
+ self,
223
+ request_options: RequestOptions | None = None,
224
+ ) -> TeamListResponse:
225
+ """List all team members in the current organisation.
226
+
227
+ Returns:
228
+ A list of team member records with roles.
229
+
230
+ Raises:
231
+ Knowledge2Error: If the API request fails.
232
+ """
233
+ data = self._request("GET", "/v1/console/team", request_options=request_options)
234
+ return self._maybe_validate(data, "TeamListResponse")
235
+
236
+ def console_list_invites(
237
+ self,
238
+ request_options: RequestOptions | None = None,
239
+ ) -> InviteListResponse:
240
+ """List pending team invitations for the current organisation.
241
+
242
+ Returns:
243
+ A list of pending invitation records.
244
+
245
+ Raises:
246
+ Knowledge2Error: If the API request fails.
247
+ """
248
+ data = self._request("GET", "/v1/console/invites", request_options=request_options)
249
+ return self._maybe_validate(data, "InviteListResponse")
250
+
251
+ def console_create_invite(
252
+ self,
253
+ email: str,
254
+ role: str = "member",
255
+ request_options: RequestOptions | None = None,
256
+ ) -> InviteCreateResponse:
257
+ """Invite a new member to the current organisation.
258
+
259
+ Args:
260
+ email: Email address of the person to invite.
261
+ role: Role to assign (e.g. ``"member"``, ``"admin"``).
262
+
263
+ Returns:
264
+ The created invitation record.
265
+
266
+ Raises:
267
+ ConflictError: If an invitation for this email already exists.
268
+ Knowledge2Error: If the API request fails.
269
+ """
270
+ payload = {"email": email, "role": role}
271
+ data = self._request(
272
+ "POST", "/v1/console/invites", json=payload, request_options=request_options
273
+ )
274
+ return self._maybe_validate(data, "InviteCreateResponse")
275
+
276
+ def console_accept_invite(
277
+ self,
278
+ token: str,
279
+ request_options: RequestOptions | None = None,
280
+ ) -> InviteAcceptResponse:
281
+ """Accept a pending team invitation.
282
+
283
+ Args:
284
+ token: The invitation token received via email.
285
+
286
+ Returns:
287
+ Confirmation of the accepted invitation.
288
+
289
+ Raises:
290
+ NotFoundError: If the invitation token is invalid or expired.
291
+ Knowledge2Error: If the API request fails.
292
+ """
293
+ token = require_str(token, "token")
294
+ data = self._request(
295
+ "POST", f"/v1/console/invites/{token}/accept", request_options=request_options
296
+ )
297
+ return self._maybe_validate(data, "InviteAcceptResponse")
298
+
299
+ def console_update_member_role(
300
+ self,
301
+ membership_id: str,
302
+ role: str,
303
+ request_options: RequestOptions | None = None,
304
+ ) -> MemberUpdateResponse:
305
+ """Update a team member's role within the organisation.
306
+
307
+ Args:
308
+ membership_id: Unique identifier of the membership to update.
309
+ role: New role to assign (e.g. ``"member"``, ``"admin"``).
310
+
311
+ Returns:
312
+ The updated membership record.
313
+
314
+ Raises:
315
+ NotFoundError: If the membership does not exist.
316
+ Knowledge2Error: If the API request fails.
317
+ """
318
+ membership_id = require_str(membership_id, "membership_id")
319
+ payload = {"role": role}
320
+ data = self._request(
321
+ "PATCH",
322
+ f"/v1/console/team/{membership_id}",
323
+ json=payload,
324
+ request_options=request_options,
325
+ )
326
+ return self._maybe_validate(data, "MemberUpdateResponse")
327
+
328
+ def console_remove_member(
329
+ self,
330
+ membership_id: str,
331
+ request_options: RequestOptions | None = None,
332
+ ) -> MemberRemoveResponse:
333
+ """Remove a member from the organisation.
334
+
335
+ Args:
336
+ membership_id: Unique identifier of the membership to remove.
337
+
338
+ Returns:
339
+ Confirmation of the member removal.
340
+
341
+ Raises:
342
+ NotFoundError: If the membership does not exist.
343
+ Knowledge2Error: If the API request fails.
344
+ """
345
+ membership_id = require_str(membership_id, "membership_id")
346
+ data = self._request(
347
+ "DELETE", f"/v1/console/team/{membership_id}", request_options=request_options
348
+ )
349
+ return self._maybe_validate(data, "MemberRemoveResponse")
350
+
351
+ def console_list_api_keys(
352
+ self,
353
+ request_options: RequestOptions | None = None,
354
+ ) -> ApiKeyListResponse:
355
+ """List API keys managed through the console.
356
+
357
+ Returns:
358
+ A list of API key metadata objects.
359
+
360
+ Raises:
361
+ Knowledge2Error: If the API request fails.
362
+ """
363
+ data = self._request("GET", "/v1/console/api-keys", request_options=request_options)
364
+ return self._maybe_validate(data, "ApiKeyListResponse")
365
+
366
+ def console_create_api_key(
367
+ self,
368
+ name: str,
369
+ access: str = "retrieval",
370
+ request_options: RequestOptions | None = None,
371
+ ) -> ApiKeyCreateResponse:
372
+ """Create a new API key through the console.
373
+
374
+ Args:
375
+ name: Human-readable name for the key.
376
+ access: Access level for the key (e.g. ``"retrieval"``, ``"admin"``).
377
+
378
+ Returns:
379
+ The newly created API key, including the raw secret (shown only once).
380
+
381
+ Raises:
382
+ Knowledge2Error: If the API request fails.
383
+ """
384
+ payload = {"name": name, "access": access}
385
+ data = self._request(
386
+ "POST", "/v1/console/api-keys", json=payload, request_options=request_options
387
+ )
388
+ return self._maybe_validate(data, "ApiKeyCreateResponse")
389
+
390
+ def console_revoke_api_key(
391
+ self,
392
+ key_id: str,
393
+ request_options: RequestOptions | None = None,
394
+ ) -> ApiKeyRevokeResponse:
395
+ """Revoke an API key through the console.
396
+
397
+ Args:
398
+ key_id: Unique identifier of the API key to revoke.
399
+
400
+ Returns:
401
+ Confirmation of the revocation.
402
+
403
+ Raises:
404
+ NotFoundError: If the key does not exist.
405
+ Knowledge2Error: If the API request fails.
406
+ """
407
+ key_id = require_str(key_id, "key_id")
408
+ data = self._request(
409
+ "POST", f"/v1/console/api-keys/{key_id}:revoke", request_options=request_options
410
+ )
411
+ return self._maybe_validate(data, "ApiKeyRevokeResponse")