airbyte-agent-zendesk-support 0.18.18__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 (53) hide show
  1. airbyte_agent_zendesk_support/__init__.py +136 -0
  2. airbyte_agent_zendesk_support/_vendored/__init__.py +1 -0
  3. airbyte_agent_zendesk_support/_vendored/connector_sdk/__init__.py +82 -0
  4. airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_strategies.py +1123 -0
  5. airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_template.py +135 -0
  6. airbyte_agent_zendesk_support/_vendored/connector_sdk/connector_model_loader.py +938 -0
  7. airbyte_agent_zendesk_support/_vendored/connector_sdk/constants.py +78 -0
  8. airbyte_agent_zendesk_support/_vendored/connector_sdk/exceptions.py +23 -0
  9. airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/__init__.py +31 -0
  10. airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/hosted_executor.py +188 -0
  11. airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/local_executor.py +1504 -0
  12. airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/models.py +190 -0
  13. airbyte_agent_zendesk_support/_vendored/connector_sdk/extensions.py +655 -0
  14. airbyte_agent_zendesk_support/_vendored/connector_sdk/http/__init__.py +37 -0
  15. airbyte_agent_zendesk_support/_vendored/connector_sdk/http/adapters/__init__.py +9 -0
  16. airbyte_agent_zendesk_support/_vendored/connector_sdk/http/adapters/httpx_adapter.py +251 -0
  17. airbyte_agent_zendesk_support/_vendored/connector_sdk/http/config.py +98 -0
  18. airbyte_agent_zendesk_support/_vendored/connector_sdk/http/exceptions.py +119 -0
  19. airbyte_agent_zendesk_support/_vendored/connector_sdk/http/protocols.py +114 -0
  20. airbyte_agent_zendesk_support/_vendored/connector_sdk/http/response.py +102 -0
  21. airbyte_agent_zendesk_support/_vendored/connector_sdk/http_client.py +679 -0
  22. airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/__init__.py +11 -0
  23. airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/logger.py +264 -0
  24. airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/types.py +92 -0
  25. airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/__init__.py +11 -0
  26. airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/models.py +19 -0
  27. airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/redactor.py +81 -0
  28. airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/session.py +94 -0
  29. airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/__init__.py +6 -0
  30. airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/instrumentation.py +57 -0
  31. airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/metrics.py +93 -0
  32. airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/__init__.py +75 -0
  33. airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/base.py +160 -0
  34. airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/components.py +238 -0
  35. airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/connector.py +131 -0
  36. airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/extensions.py +109 -0
  37. airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/operations.py +146 -0
  38. airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/security.py +213 -0
  39. airbyte_agent_zendesk_support/_vendored/connector_sdk/secrets.py +182 -0
  40. airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/__init__.py +10 -0
  41. airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/config.py +32 -0
  42. airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/events.py +58 -0
  43. airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/tracker.py +151 -0
  44. airbyte_agent_zendesk_support/_vendored/connector_sdk/types.py +239 -0
  45. airbyte_agent_zendesk_support/_vendored/connector_sdk/utils.py +60 -0
  46. airbyte_agent_zendesk_support/_vendored/connector_sdk/validation.py +822 -0
  47. airbyte_agent_zendesk_support/connector.py +2193 -0
  48. airbyte_agent_zendesk_support/connector_model.py +3942 -0
  49. airbyte_agent_zendesk_support/models.py +790 -0
  50. airbyte_agent_zendesk_support/types.py +216 -0
  51. airbyte_agent_zendesk_support-0.18.18.dist-info/METADATA +121 -0
  52. airbyte_agent_zendesk_support-0.18.18.dist-info/RECORD +53 -0
  53. airbyte_agent_zendesk_support-0.18.18.dist-info/WHEEL +4 -0
@@ -0,0 +1,2193 @@
1
+ """
2
+ zendesk-support connector.
3
+ """
4
+
5
+ from __future__ import annotations
6
+
7
+ from typing import TYPE_CHECKING, Any, AsyncIterator, overload
8
+ try:
9
+ from typing import Literal
10
+ except ImportError:
11
+ from typing_extensions import Literal
12
+
13
+ from .connector_model import ZendeskSupportConnectorModel
14
+
15
+ from .types import (
16
+ ArticleAttachmentsDownloadParams,
17
+ ArticleAttachmentsGetParams,
18
+ ArticleAttachmentsListParams,
19
+ ArticlesGetParams,
20
+ ArticlesListParams,
21
+ AttachmentsDownloadParams,
22
+ AttachmentsGetParams,
23
+ AutomationsGetParams,
24
+ AutomationsListParams,
25
+ BrandsGetParams,
26
+ BrandsListParams,
27
+ GroupMembershipsListParams,
28
+ GroupsGetParams,
29
+ GroupsListParams,
30
+ MacrosGetParams,
31
+ MacrosListParams,
32
+ OrganizationMembershipsListParams,
33
+ OrganizationsGetParams,
34
+ OrganizationsListParams,
35
+ SatisfactionRatingsGetParams,
36
+ SatisfactionRatingsListParams,
37
+ SlaPoliciesGetParams,
38
+ SlaPoliciesListParams,
39
+ TagsListParams,
40
+ TicketAuditsListParams,
41
+ TicketCommentsListParams,
42
+ TicketFieldsGetParams,
43
+ TicketFieldsListParams,
44
+ TicketFormsGetParams,
45
+ TicketFormsListParams,
46
+ TicketMetricsListParams,
47
+ TicketsGetParams,
48
+ TicketsListParams,
49
+ TriggersGetParams,
50
+ TriggersListParams,
51
+ UsersGetParams,
52
+ UsersListParams,
53
+ ViewsGetParams,
54
+ ViewsListParams,
55
+ )
56
+
57
+ if TYPE_CHECKING:
58
+ from .models import ZendeskSupportAuthConfig
59
+ # Import specific auth config classes for multi-auth isinstance checks
60
+ from .models import ZendeskSupportOauth20AuthConfig, ZendeskSupportApiTokenAuthConfig
61
+ # Import response models and envelope models at runtime
62
+ from .models import (
63
+ ZendeskSupportExecuteResult,
64
+ ZendeskSupportExecuteResultWithMeta,
65
+ TicketsListResult,
66
+ TicketsGetResult,
67
+ UsersListResult,
68
+ UsersGetResult,
69
+ OrganizationsListResult,
70
+ OrganizationsGetResult,
71
+ GroupsListResult,
72
+ GroupsGetResult,
73
+ TicketCommentsListResult,
74
+ AttachmentsGetResult,
75
+ TicketAuditsListResult,
76
+ TicketAuditsListResult,
77
+ TicketMetricsListResult,
78
+ TicketFieldsListResult,
79
+ TicketFieldsGetResult,
80
+ BrandsListResult,
81
+ BrandsGetResult,
82
+ ViewsListResult,
83
+ ViewsGetResult,
84
+ MacrosListResult,
85
+ MacrosGetResult,
86
+ TriggersListResult,
87
+ TriggersGetResult,
88
+ AutomationsListResult,
89
+ AutomationsGetResult,
90
+ TagsListResult,
91
+ SatisfactionRatingsListResult,
92
+ SatisfactionRatingsGetResult,
93
+ GroupMembershipsListResult,
94
+ OrganizationMembershipsListResult,
95
+ SlaPoliciesListResult,
96
+ SlaPoliciesGetResult,
97
+ TicketFormsListResult,
98
+ TicketFormsGetResult,
99
+ ArticlesListResult,
100
+ ArticlesGetResult,
101
+ ArticleAttachmentsListResult,
102
+ ArticleAttachmentsGetResult,
103
+ )
104
+
105
+
106
+ class ZendeskSupportConnector:
107
+ """
108
+ Type-safe Zendesk-Support API connector.
109
+
110
+ Auto-generated from OpenAPI specification with full type safety.
111
+ """
112
+
113
+ connector_name = "zendesk-support"
114
+ connector_version = "0.1.3"
115
+ vendored_sdk_version = "0.1.0" # Version of vendored connector-sdk
116
+
117
+ # Map of (entity, action) -> has_extractors for envelope wrapping decision
118
+ _EXTRACTOR_MAP = {
119
+ ("tickets", "list"): True,
120
+ ("tickets", "get"): True,
121
+ ("users", "list"): True,
122
+ ("users", "get"): True,
123
+ ("organizations", "list"): True,
124
+ ("organizations", "get"): True,
125
+ ("groups", "list"): True,
126
+ ("groups", "get"): True,
127
+ ("ticket_comments", "list"): True,
128
+ ("attachments", "get"): True,
129
+ ("attachments", "download"): False,
130
+ ("ticket_audits", "list"): True,
131
+ ("ticket_audits", "list"): True,
132
+ ("ticket_metrics", "list"): True,
133
+ ("ticket_fields", "list"): True,
134
+ ("ticket_fields", "get"): True,
135
+ ("brands", "list"): True,
136
+ ("brands", "get"): True,
137
+ ("views", "list"): True,
138
+ ("views", "get"): True,
139
+ ("macros", "list"): True,
140
+ ("macros", "get"): True,
141
+ ("triggers", "list"): True,
142
+ ("triggers", "get"): True,
143
+ ("automations", "list"): True,
144
+ ("automations", "get"): True,
145
+ ("tags", "list"): True,
146
+ ("satisfaction_ratings", "list"): True,
147
+ ("satisfaction_ratings", "get"): True,
148
+ ("group_memberships", "list"): True,
149
+ ("organization_memberships", "list"): True,
150
+ ("sla_policies", "list"): True,
151
+ ("sla_policies", "get"): True,
152
+ ("ticket_forms", "list"): True,
153
+ ("ticket_forms", "get"): True,
154
+ ("articles", "list"): True,
155
+ ("articles", "get"): True,
156
+ ("article_attachments", "list"): True,
157
+ ("article_attachments", "get"): True,
158
+ ("article_attachments", "download"): False,
159
+ }
160
+
161
+ # Map of (entity, action) -> {python_param_name: api_param_name}
162
+ # Used to convert snake_case TypedDict keys to API parameter names in execute()
163
+ _PARAM_MAP = {
164
+ ('tickets', 'list'): {'page': 'page', 'external_id': 'external_id', 'sort': 'sort'},
165
+ ('tickets', 'get'): {'ticket_id': 'ticket_id'},
166
+ ('users', 'list'): {'page': 'page', 'role': 'role', 'external_id': 'external_id'},
167
+ ('users', 'get'): {'user_id': 'user_id'},
168
+ ('organizations', 'list'): {'page': 'page'},
169
+ ('organizations', 'get'): {'organization_id': 'organization_id'},
170
+ ('groups', 'list'): {'page': 'page', 'exclude_deleted': 'exclude_deleted'},
171
+ ('groups', 'get'): {'group_id': 'group_id'},
172
+ ('ticket_comments', 'list'): {'ticket_id': 'ticket_id', 'page': 'page', 'include_inline_images': 'include_inline_images', 'sort': 'sort'},
173
+ ('attachments', 'get'): {'attachment_id': 'attachment_id'},
174
+ ('attachments', 'download'): {'attachment_id': 'attachment_id', 'range_header': 'range_header'},
175
+ ('ticket_audits', 'list'): {'ticket_id': 'ticket_id', 'page': 'page'},
176
+ ('ticket_metrics', 'list'): {'page': 'page'},
177
+ ('ticket_fields', 'list'): {'page': 'page', 'locale': 'locale'},
178
+ ('ticket_fields', 'get'): {'ticket_field_id': 'ticket_field_id'},
179
+ ('brands', 'list'): {'page': 'page'},
180
+ ('brands', 'get'): {'brand_id': 'brand_id'},
181
+ ('views', 'list'): {'page': 'page', 'access': 'access', 'active': 'active', 'group_id': 'group_id', 'sort_by': 'sort_by', 'sort_order': 'sort_order'},
182
+ ('views', 'get'): {'view_id': 'view_id'},
183
+ ('macros', 'list'): {'page': 'page', 'access': 'access', 'active': 'active', 'category': 'category', 'group_id': 'group_id', 'only_viewable': 'only_viewable', 'sort_by': 'sort_by', 'sort_order': 'sort_order'},
184
+ ('macros', 'get'): {'macro_id': 'macro_id'},
185
+ ('triggers', 'list'): {'page': 'page', 'active': 'active', 'category_id': 'category_id', 'sort': 'sort'},
186
+ ('triggers', 'get'): {'trigger_id': 'trigger_id'},
187
+ ('automations', 'list'): {'page': 'page', 'active': 'active', 'sort': 'sort'},
188
+ ('automations', 'get'): {'automation_id': 'automation_id'},
189
+ ('tags', 'list'): {'page': 'page'},
190
+ ('satisfaction_ratings', 'list'): {'page': 'page', 'score': 'score', 'start_time': 'start_time', 'end_time': 'end_time'},
191
+ ('satisfaction_ratings', 'get'): {'satisfaction_rating_id': 'satisfaction_rating_id'},
192
+ ('group_memberships', 'list'): {'page': 'page'},
193
+ ('organization_memberships', 'list'): {'page': 'page'},
194
+ ('sla_policies', 'list'): {'page': 'page'},
195
+ ('sla_policies', 'get'): {'sla_policy_id': 'sla_policy_id'},
196
+ ('ticket_forms', 'list'): {'page': 'page', 'active': 'active', 'end_user_visible': 'end_user_visible'},
197
+ ('ticket_forms', 'get'): {'ticket_form_id': 'ticket_form_id'},
198
+ ('articles', 'list'): {'page': 'page', 'sort_by': 'sort_by', 'sort_order': 'sort_order'},
199
+ ('articles', 'get'): {'id': 'id'},
200
+ ('article_attachments', 'list'): {'article_id': 'article_id', 'page': 'page'},
201
+ ('article_attachments', 'get'): {'article_id': 'article_id', 'attachment_id': 'attachment_id'},
202
+ ('article_attachments', 'download'): {'article_id': 'article_id', 'attachment_id': 'attachment_id', 'range_header': 'range_header'},
203
+ }
204
+
205
+ def __init__(
206
+ self,
207
+ auth_config: ZendeskSupportAuthConfig | None = None,
208
+ connector_id: str | None = None,
209
+ airbyte_client_id: str | None = None,
210
+ airbyte_client_secret: str | None = None,
211
+ airbyte_connector_api_url: str | None = None,
212
+ on_token_refresh: Any | None = None,
213
+ subdomain: str | None = None ):
214
+ """
215
+ Initialize a new zendesk-support connector instance.
216
+
217
+ Supports both local and hosted execution modes:
218
+ - Local mode: Provide `auth_config` for direct API calls
219
+ - Hosted mode: Provide `connector_id`, `airbyte_client_id`, and `airbyte_client_secret` for hosted execution
220
+
221
+ Args:
222
+ auth_config: Typed authentication configuration (required for local mode)
223
+ connector_id: Connector ID (required for hosted mode)
224
+ airbyte_client_id: Airbyte OAuth client ID (required for hosted mode)
225
+ airbyte_client_secret: Airbyte OAuth client secret (required for hosted mode)
226
+ airbyte_connector_api_url: Airbyte connector API URL (defaults to Airbyte Cloud API URL)
227
+ on_token_refresh: Optional callback for OAuth2 token refresh persistence.
228
+ Called with new_tokens dict when tokens are refreshed. Can be sync or async.
229
+ Example: lambda tokens: save_to_database(tokens) subdomain: Your Zendesk subdomain
230
+ Examples:
231
+ # Local mode (direct API calls)
232
+ connector = ZendeskSupportConnector(auth_config=ZendeskSupportAuthConfig(access_token="...", refresh_token="..."))
233
+ # Hosted mode (executed on Airbyte cloud)
234
+ connector = ZendeskSupportConnector(
235
+ connector_id="connector-456",
236
+ airbyte_client_id="client_abc123",
237
+ airbyte_client_secret="secret_xyz789"
238
+ )
239
+
240
+ # Local mode with OAuth2 token refresh callback
241
+ def save_tokens(new_tokens: dict) -> None:
242
+ # Persist updated tokens to your storage (file, database, etc.)
243
+ with open("tokens.json", "w") as f:
244
+ json.dump(new_tokens, f)
245
+
246
+ connector = ZendeskSupportConnector(
247
+ auth_config=ZendeskSupportAuthConfig(access_token="...", refresh_token="..."),
248
+ on_token_refresh=save_tokens
249
+ )
250
+ """
251
+ # Hosted mode: connector_id, airbyte_client_id, and airbyte_client_secret provided
252
+ if connector_id and airbyte_client_id and airbyte_client_secret:
253
+ from ._vendored.connector_sdk.executor import HostedExecutor
254
+ self._executor = HostedExecutor(
255
+ connector_id=connector_id,
256
+ airbyte_client_id=airbyte_client_id,
257
+ airbyte_client_secret=airbyte_client_secret,
258
+ api_url=airbyte_connector_api_url,
259
+ )
260
+ else:
261
+ # Local mode: auth_config required
262
+ if not auth_config:
263
+ raise ValueError(
264
+ "Either provide (connector_id, airbyte_client_id, airbyte_client_secret) for hosted mode "
265
+ "or auth_config for local mode"
266
+ )
267
+
268
+ from ._vendored.connector_sdk.executor import LocalExecutor
269
+
270
+ # Build config_values dict from server variables
271
+ config_values: dict[str, str] = {}
272
+ if subdomain:
273
+ config_values["subdomain"] = subdomain
274
+
275
+ # Multi-auth connector: detect auth scheme from auth_config type
276
+ auth_scheme: str | None = None
277
+ if auth_config:
278
+ if isinstance(auth_config, ZendeskSupportOauth20AuthConfig):
279
+ auth_scheme = "zendeskOAuth"
280
+ if isinstance(auth_config, ZendeskSupportApiTokenAuthConfig):
281
+ auth_scheme = "zendeskAPIToken"
282
+
283
+ self._executor = LocalExecutor(
284
+ model=ZendeskSupportConnectorModel,
285
+ auth_config=auth_config.model_dump() if auth_config else None,
286
+ auth_scheme=auth_scheme,
287
+ config_values=config_values,
288
+ on_token_refresh=on_token_refresh
289
+ )
290
+
291
+ # Update base_url with server variables if provided
292
+ base_url = self._executor.http_client.base_url
293
+ if subdomain:
294
+ base_url = base_url.replace("{subdomain}", subdomain)
295
+ self._executor.http_client.base_url = base_url
296
+
297
+ # Initialize entity query objects
298
+ self.tickets = TicketsQuery(self)
299
+ self.users = UsersQuery(self)
300
+ self.organizations = OrganizationsQuery(self)
301
+ self.groups = GroupsQuery(self)
302
+ self.ticket_comments = TicketCommentsQuery(self)
303
+ self.attachments = AttachmentsQuery(self)
304
+ self.ticket_audits = TicketAuditsQuery(self)
305
+ self.ticket_metrics = TicketMetricsQuery(self)
306
+ self.ticket_fields = TicketFieldsQuery(self)
307
+ self.brands = BrandsQuery(self)
308
+ self.views = ViewsQuery(self)
309
+ self.macros = MacrosQuery(self)
310
+ self.triggers = TriggersQuery(self)
311
+ self.automations = AutomationsQuery(self)
312
+ self.tags = TagsQuery(self)
313
+ self.satisfaction_ratings = SatisfactionRatingsQuery(self)
314
+ self.group_memberships = GroupMembershipsQuery(self)
315
+ self.organization_memberships = OrganizationMembershipsQuery(self)
316
+ self.sla_policies = SlaPoliciesQuery(self)
317
+ self.ticket_forms = TicketFormsQuery(self)
318
+ self.articles = ArticlesQuery(self)
319
+ self.article_attachments = ArticleAttachmentsQuery(self)
320
+
321
+ # ===== TYPED EXECUTE METHOD (Recommended Interface) =====
322
+
323
+ @overload
324
+ async def execute(
325
+ self,
326
+ entity: Literal["tickets"],
327
+ action: Literal["list"],
328
+ params: "TicketsListParams"
329
+ ) -> "TicketsListResult": ...
330
+
331
+ @overload
332
+ async def execute(
333
+ self,
334
+ entity: Literal["tickets"],
335
+ action: Literal["get"],
336
+ params: "TicketsGetParams"
337
+ ) -> "TicketsGetResult": ...
338
+
339
+ @overload
340
+ async def execute(
341
+ self,
342
+ entity: Literal["users"],
343
+ action: Literal["list"],
344
+ params: "UsersListParams"
345
+ ) -> "UsersListResult": ...
346
+
347
+ @overload
348
+ async def execute(
349
+ self,
350
+ entity: Literal["users"],
351
+ action: Literal["get"],
352
+ params: "UsersGetParams"
353
+ ) -> "UsersGetResult": ...
354
+
355
+ @overload
356
+ async def execute(
357
+ self,
358
+ entity: Literal["organizations"],
359
+ action: Literal["list"],
360
+ params: "OrganizationsListParams"
361
+ ) -> "OrganizationsListResult": ...
362
+
363
+ @overload
364
+ async def execute(
365
+ self,
366
+ entity: Literal["organizations"],
367
+ action: Literal["get"],
368
+ params: "OrganizationsGetParams"
369
+ ) -> "OrganizationsGetResult": ...
370
+
371
+ @overload
372
+ async def execute(
373
+ self,
374
+ entity: Literal["groups"],
375
+ action: Literal["list"],
376
+ params: "GroupsListParams"
377
+ ) -> "GroupsListResult": ...
378
+
379
+ @overload
380
+ async def execute(
381
+ self,
382
+ entity: Literal["groups"],
383
+ action: Literal["get"],
384
+ params: "GroupsGetParams"
385
+ ) -> "GroupsGetResult": ...
386
+
387
+ @overload
388
+ async def execute(
389
+ self,
390
+ entity: Literal["ticket_comments"],
391
+ action: Literal["list"],
392
+ params: "TicketCommentsListParams"
393
+ ) -> "TicketCommentsListResult": ...
394
+
395
+ @overload
396
+ async def execute(
397
+ self,
398
+ entity: Literal["attachments"],
399
+ action: Literal["get"],
400
+ params: "AttachmentsGetParams"
401
+ ) -> "AttachmentsGetResult": ...
402
+
403
+ @overload
404
+ async def execute(
405
+ self,
406
+ entity: Literal["attachments"],
407
+ action: Literal["download"],
408
+ params: "AttachmentsDownloadParams"
409
+ ) -> "AsyncIterator[bytes]": ...
410
+
411
+ @overload
412
+ async def execute(
413
+ self,
414
+ entity: Literal["ticket_audits"],
415
+ action: Literal["list"],
416
+ params: "TicketAuditsListParams"
417
+ ) -> "TicketAuditsListResult": ...
418
+
419
+ @overload
420
+ async def execute(
421
+ self,
422
+ entity: Literal["ticket_audits"],
423
+ action: Literal["list"],
424
+ params: "TicketAuditsListParams"
425
+ ) -> "TicketAuditsListResult": ...
426
+
427
+ @overload
428
+ async def execute(
429
+ self,
430
+ entity: Literal["ticket_metrics"],
431
+ action: Literal["list"],
432
+ params: "TicketMetricsListParams"
433
+ ) -> "TicketMetricsListResult": ...
434
+
435
+ @overload
436
+ async def execute(
437
+ self,
438
+ entity: Literal["ticket_fields"],
439
+ action: Literal["list"],
440
+ params: "TicketFieldsListParams"
441
+ ) -> "TicketFieldsListResult": ...
442
+
443
+ @overload
444
+ async def execute(
445
+ self,
446
+ entity: Literal["ticket_fields"],
447
+ action: Literal["get"],
448
+ params: "TicketFieldsGetParams"
449
+ ) -> "TicketFieldsGetResult": ...
450
+
451
+ @overload
452
+ async def execute(
453
+ self,
454
+ entity: Literal["brands"],
455
+ action: Literal["list"],
456
+ params: "BrandsListParams"
457
+ ) -> "BrandsListResult": ...
458
+
459
+ @overload
460
+ async def execute(
461
+ self,
462
+ entity: Literal["brands"],
463
+ action: Literal["get"],
464
+ params: "BrandsGetParams"
465
+ ) -> "BrandsGetResult": ...
466
+
467
+ @overload
468
+ async def execute(
469
+ self,
470
+ entity: Literal["views"],
471
+ action: Literal["list"],
472
+ params: "ViewsListParams"
473
+ ) -> "ViewsListResult": ...
474
+
475
+ @overload
476
+ async def execute(
477
+ self,
478
+ entity: Literal["views"],
479
+ action: Literal["get"],
480
+ params: "ViewsGetParams"
481
+ ) -> "ViewsGetResult": ...
482
+
483
+ @overload
484
+ async def execute(
485
+ self,
486
+ entity: Literal["macros"],
487
+ action: Literal["list"],
488
+ params: "MacrosListParams"
489
+ ) -> "MacrosListResult": ...
490
+
491
+ @overload
492
+ async def execute(
493
+ self,
494
+ entity: Literal["macros"],
495
+ action: Literal["get"],
496
+ params: "MacrosGetParams"
497
+ ) -> "MacrosGetResult": ...
498
+
499
+ @overload
500
+ async def execute(
501
+ self,
502
+ entity: Literal["triggers"],
503
+ action: Literal["list"],
504
+ params: "TriggersListParams"
505
+ ) -> "TriggersListResult": ...
506
+
507
+ @overload
508
+ async def execute(
509
+ self,
510
+ entity: Literal["triggers"],
511
+ action: Literal["get"],
512
+ params: "TriggersGetParams"
513
+ ) -> "TriggersGetResult": ...
514
+
515
+ @overload
516
+ async def execute(
517
+ self,
518
+ entity: Literal["automations"],
519
+ action: Literal["list"],
520
+ params: "AutomationsListParams"
521
+ ) -> "AutomationsListResult": ...
522
+
523
+ @overload
524
+ async def execute(
525
+ self,
526
+ entity: Literal["automations"],
527
+ action: Literal["get"],
528
+ params: "AutomationsGetParams"
529
+ ) -> "AutomationsGetResult": ...
530
+
531
+ @overload
532
+ async def execute(
533
+ self,
534
+ entity: Literal["tags"],
535
+ action: Literal["list"],
536
+ params: "TagsListParams"
537
+ ) -> "TagsListResult": ...
538
+
539
+ @overload
540
+ async def execute(
541
+ self,
542
+ entity: Literal["satisfaction_ratings"],
543
+ action: Literal["list"],
544
+ params: "SatisfactionRatingsListParams"
545
+ ) -> "SatisfactionRatingsListResult": ...
546
+
547
+ @overload
548
+ async def execute(
549
+ self,
550
+ entity: Literal["satisfaction_ratings"],
551
+ action: Literal["get"],
552
+ params: "SatisfactionRatingsGetParams"
553
+ ) -> "SatisfactionRatingsGetResult": ...
554
+
555
+ @overload
556
+ async def execute(
557
+ self,
558
+ entity: Literal["group_memberships"],
559
+ action: Literal["list"],
560
+ params: "GroupMembershipsListParams"
561
+ ) -> "GroupMembershipsListResult": ...
562
+
563
+ @overload
564
+ async def execute(
565
+ self,
566
+ entity: Literal["organization_memberships"],
567
+ action: Literal["list"],
568
+ params: "OrganizationMembershipsListParams"
569
+ ) -> "OrganizationMembershipsListResult": ...
570
+
571
+ @overload
572
+ async def execute(
573
+ self,
574
+ entity: Literal["sla_policies"],
575
+ action: Literal["list"],
576
+ params: "SlaPoliciesListParams"
577
+ ) -> "SlaPoliciesListResult": ...
578
+
579
+ @overload
580
+ async def execute(
581
+ self,
582
+ entity: Literal["sla_policies"],
583
+ action: Literal["get"],
584
+ params: "SlaPoliciesGetParams"
585
+ ) -> "SlaPoliciesGetResult": ...
586
+
587
+ @overload
588
+ async def execute(
589
+ self,
590
+ entity: Literal["ticket_forms"],
591
+ action: Literal["list"],
592
+ params: "TicketFormsListParams"
593
+ ) -> "TicketFormsListResult": ...
594
+
595
+ @overload
596
+ async def execute(
597
+ self,
598
+ entity: Literal["ticket_forms"],
599
+ action: Literal["get"],
600
+ params: "TicketFormsGetParams"
601
+ ) -> "TicketFormsGetResult": ...
602
+
603
+ @overload
604
+ async def execute(
605
+ self,
606
+ entity: Literal["articles"],
607
+ action: Literal["list"],
608
+ params: "ArticlesListParams"
609
+ ) -> "ArticlesListResult": ...
610
+
611
+ @overload
612
+ async def execute(
613
+ self,
614
+ entity: Literal["articles"],
615
+ action: Literal["get"],
616
+ params: "ArticlesGetParams"
617
+ ) -> "ArticlesGetResult": ...
618
+
619
+ @overload
620
+ async def execute(
621
+ self,
622
+ entity: Literal["article_attachments"],
623
+ action: Literal["list"],
624
+ params: "ArticleAttachmentsListParams"
625
+ ) -> "ArticleAttachmentsListResult": ...
626
+
627
+ @overload
628
+ async def execute(
629
+ self,
630
+ entity: Literal["article_attachments"],
631
+ action: Literal["get"],
632
+ params: "ArticleAttachmentsGetParams"
633
+ ) -> "ArticleAttachmentsGetResult": ...
634
+
635
+ @overload
636
+ async def execute(
637
+ self,
638
+ entity: Literal["article_attachments"],
639
+ action: Literal["download"],
640
+ params: "ArticleAttachmentsDownloadParams"
641
+ ) -> "AsyncIterator[bytes]": ...
642
+
643
+
644
+ @overload
645
+ async def execute(
646
+ self,
647
+ entity: str,
648
+ action: str,
649
+ params: dict[str, Any]
650
+ ) -> ZendeskSupportExecuteResult[Any] | ZendeskSupportExecuteResultWithMeta[Any, Any] | Any: ...
651
+
652
+ async def execute(
653
+ self,
654
+ entity: str,
655
+ action: str,
656
+ params: dict[str, Any] | None = None
657
+ ) -> Any:
658
+ """
659
+ Execute an entity operation with full type safety.
660
+
661
+ This is the recommended interface for blessed connectors as it:
662
+ - Uses the same signature as non-blessed connectors
663
+ - Provides full IDE autocomplete for entity/action/params
664
+ - Makes migration from generic to blessed connectors seamless
665
+
666
+ Args:
667
+ entity: Entity name (e.g., "customers")
668
+ action: Operation action (e.g., "create", "get", "list")
669
+ params: Operation parameters (typed based on entity+action)
670
+
671
+ Returns:
672
+ Typed response based on the operation
673
+
674
+ Example:
675
+ customer = await connector.execute(
676
+ entity="customers",
677
+ action="get",
678
+ params={"id": "cus_123"}
679
+ )
680
+ """
681
+ from ._vendored.connector_sdk.executor import ExecutionConfig
682
+
683
+ # Remap parameter names from snake_case (TypedDict keys) to API parameter names
684
+ if params:
685
+ param_map = self._PARAM_MAP.get((entity, action), {})
686
+ if param_map:
687
+ params = {param_map.get(k, k): v for k, v in params.items()}
688
+
689
+ # Use ExecutionConfig for both local and hosted executors
690
+ config = ExecutionConfig(
691
+ entity=entity,
692
+ action=action,
693
+ params=params
694
+ )
695
+
696
+ result = await self._executor.execute(config)
697
+
698
+ if not result.success:
699
+ raise RuntimeError(f"Execution failed: {result.error}")
700
+
701
+ # Check if this operation has extractors configured
702
+ has_extractors = self._EXTRACTOR_MAP.get((entity, action), False)
703
+
704
+ if has_extractors:
705
+ # With extractors - return Pydantic envelope with data and meta
706
+ if result.meta is not None:
707
+ return ZendeskSupportExecuteResultWithMeta[Any, Any](
708
+ data=result.data,
709
+ meta=result.meta
710
+ )
711
+ else:
712
+ return ZendeskSupportExecuteResult[Any](data=result.data)
713
+ else:
714
+ # No extractors - return raw response data
715
+ return result.data
716
+
717
+
718
+
719
+ class TicketsQuery:
720
+ """
721
+ Query class for Tickets entity operations.
722
+ """
723
+
724
+ def __init__(self, connector: ZendeskSupportConnector):
725
+ """Initialize query with connector reference."""
726
+ self._connector = connector
727
+
728
+ async def list(
729
+ self,
730
+ page: int | None = None,
731
+ external_id: str | None = None,
732
+ sort: str | None = None,
733
+ **kwargs
734
+ ) -> TicketsListResult:
735
+ """
736
+ Returns a list of all tickets in your account
737
+
738
+ Args:
739
+ page: Page number for pagination
740
+ external_id: Lists tickets by external id
741
+ sort: Sort order
742
+ **kwargs: Additional parameters
743
+
744
+ Returns:
745
+ TicketsListResult
746
+ """
747
+ params = {k: v for k, v in {
748
+ "page": page,
749
+ "external_id": external_id,
750
+ "sort": sort,
751
+ **kwargs
752
+ }.items() if v is not None}
753
+
754
+ result = await self._connector.execute("tickets", "list", params)
755
+ # Cast generic envelope to concrete typed result
756
+ return TicketsListResult(
757
+ data=result.data,
758
+ meta=result.meta )
759
+
760
+
761
+
762
+ async def get(
763
+ self,
764
+ ticket_id: str,
765
+ **kwargs
766
+ ) -> TicketsGetResult:
767
+ """
768
+ Returns a ticket by its ID
769
+
770
+ Args:
771
+ ticket_id: The ID of the ticket
772
+ **kwargs: Additional parameters
773
+
774
+ Returns:
775
+ TicketsGetResult
776
+ """
777
+ params = {k: v for k, v in {
778
+ "ticket_id": ticket_id,
779
+ **kwargs
780
+ }.items() if v is not None}
781
+
782
+ result = await self._connector.execute("tickets", "get", params)
783
+ # Cast generic envelope to concrete typed result
784
+ return TicketsGetResult(
785
+ data=result.data )
786
+
787
+
788
+
789
+ class UsersQuery:
790
+ """
791
+ Query class for Users entity operations.
792
+ """
793
+
794
+ def __init__(self, connector: ZendeskSupportConnector):
795
+ """Initialize query with connector reference."""
796
+ self._connector = connector
797
+
798
+ async def list(
799
+ self,
800
+ page: int | None = None,
801
+ role: str | None = None,
802
+ external_id: str | None = None,
803
+ **kwargs
804
+ ) -> UsersListResult:
805
+ """
806
+ Returns a list of all users in your account
807
+
808
+ Args:
809
+ page: Page number for pagination
810
+ role: Filter by role
811
+ external_id: Filter by external id
812
+ **kwargs: Additional parameters
813
+
814
+ Returns:
815
+ UsersListResult
816
+ """
817
+ params = {k: v for k, v in {
818
+ "page": page,
819
+ "role": role,
820
+ "external_id": external_id,
821
+ **kwargs
822
+ }.items() if v is not None}
823
+
824
+ result = await self._connector.execute("users", "list", params)
825
+ # Cast generic envelope to concrete typed result
826
+ return UsersListResult(
827
+ data=result.data,
828
+ meta=result.meta )
829
+
830
+
831
+
832
+ async def get(
833
+ self,
834
+ user_id: str,
835
+ **kwargs
836
+ ) -> UsersGetResult:
837
+ """
838
+ Returns a user by their ID
839
+
840
+ Args:
841
+ user_id: The ID of the user
842
+ **kwargs: Additional parameters
843
+
844
+ Returns:
845
+ UsersGetResult
846
+ """
847
+ params = {k: v for k, v in {
848
+ "user_id": user_id,
849
+ **kwargs
850
+ }.items() if v is not None}
851
+
852
+ result = await self._connector.execute("users", "get", params)
853
+ # Cast generic envelope to concrete typed result
854
+ return UsersGetResult(
855
+ data=result.data )
856
+
857
+
858
+
859
+ class OrganizationsQuery:
860
+ """
861
+ Query class for Organizations entity operations.
862
+ """
863
+
864
+ def __init__(self, connector: ZendeskSupportConnector):
865
+ """Initialize query with connector reference."""
866
+ self._connector = connector
867
+
868
+ async def list(
869
+ self,
870
+ page: int | None = None,
871
+ **kwargs
872
+ ) -> OrganizationsListResult:
873
+ """
874
+ Returns a list of all organizations in your account
875
+
876
+ Args:
877
+ page: Page number for pagination
878
+ **kwargs: Additional parameters
879
+
880
+ Returns:
881
+ OrganizationsListResult
882
+ """
883
+ params = {k: v for k, v in {
884
+ "page": page,
885
+ **kwargs
886
+ }.items() if v is not None}
887
+
888
+ result = await self._connector.execute("organizations", "list", params)
889
+ # Cast generic envelope to concrete typed result
890
+ return OrganizationsListResult(
891
+ data=result.data,
892
+ meta=result.meta )
893
+
894
+
895
+
896
+ async def get(
897
+ self,
898
+ organization_id: str,
899
+ **kwargs
900
+ ) -> OrganizationsGetResult:
901
+ """
902
+ Returns an organization by its ID
903
+
904
+ Args:
905
+ organization_id: The ID of the organization
906
+ **kwargs: Additional parameters
907
+
908
+ Returns:
909
+ OrganizationsGetResult
910
+ """
911
+ params = {k: v for k, v in {
912
+ "organization_id": organization_id,
913
+ **kwargs
914
+ }.items() if v is not None}
915
+
916
+ result = await self._connector.execute("organizations", "get", params)
917
+ # Cast generic envelope to concrete typed result
918
+ return OrganizationsGetResult(
919
+ data=result.data )
920
+
921
+
922
+
923
+ class GroupsQuery:
924
+ """
925
+ Query class for Groups entity operations.
926
+ """
927
+
928
+ def __init__(self, connector: ZendeskSupportConnector):
929
+ """Initialize query with connector reference."""
930
+ self._connector = connector
931
+
932
+ async def list(
933
+ self,
934
+ page: int | None = None,
935
+ exclude_deleted: bool | None = None,
936
+ **kwargs
937
+ ) -> GroupsListResult:
938
+ """
939
+ Returns a list of all groups in your account
940
+
941
+ Args:
942
+ page: Page number for pagination
943
+ exclude_deleted: Exclude deleted groups
944
+ **kwargs: Additional parameters
945
+
946
+ Returns:
947
+ GroupsListResult
948
+ """
949
+ params = {k: v for k, v in {
950
+ "page": page,
951
+ "exclude_deleted": exclude_deleted,
952
+ **kwargs
953
+ }.items() if v is not None}
954
+
955
+ result = await self._connector.execute("groups", "list", params)
956
+ # Cast generic envelope to concrete typed result
957
+ return GroupsListResult(
958
+ data=result.data,
959
+ meta=result.meta )
960
+
961
+
962
+
963
+ async def get(
964
+ self,
965
+ group_id: str,
966
+ **kwargs
967
+ ) -> GroupsGetResult:
968
+ """
969
+ Returns a group by its ID
970
+
971
+ Args:
972
+ group_id: The ID of the group
973
+ **kwargs: Additional parameters
974
+
975
+ Returns:
976
+ GroupsGetResult
977
+ """
978
+ params = {k: v for k, v in {
979
+ "group_id": group_id,
980
+ **kwargs
981
+ }.items() if v is not None}
982
+
983
+ result = await self._connector.execute("groups", "get", params)
984
+ # Cast generic envelope to concrete typed result
985
+ return GroupsGetResult(
986
+ data=result.data )
987
+
988
+
989
+
990
+ class TicketCommentsQuery:
991
+ """
992
+ Query class for TicketComments entity operations.
993
+ """
994
+
995
+ def __init__(self, connector: ZendeskSupportConnector):
996
+ """Initialize query with connector reference."""
997
+ self._connector = connector
998
+
999
+ async def list(
1000
+ self,
1001
+ ticket_id: str,
1002
+ page: int | None = None,
1003
+ include_inline_images: bool | None = None,
1004
+ sort: str | None = None,
1005
+ **kwargs
1006
+ ) -> TicketCommentsListResult:
1007
+ """
1008
+ Returns a list of comments for a specific ticket
1009
+
1010
+ Args:
1011
+ ticket_id: The ID of the ticket
1012
+ page: Page number for pagination
1013
+ include_inline_images: Include inline images in the response
1014
+ sort: Sort order
1015
+ **kwargs: Additional parameters
1016
+
1017
+ Returns:
1018
+ TicketCommentsListResult
1019
+ """
1020
+ params = {k: v for k, v in {
1021
+ "ticket_id": ticket_id,
1022
+ "page": page,
1023
+ "include_inline_images": include_inline_images,
1024
+ "sort": sort,
1025
+ **kwargs
1026
+ }.items() if v is not None}
1027
+
1028
+ result = await self._connector.execute("ticket_comments", "list", params)
1029
+ # Cast generic envelope to concrete typed result
1030
+ return TicketCommentsListResult(
1031
+ data=result.data,
1032
+ meta=result.meta )
1033
+
1034
+
1035
+
1036
+ class AttachmentsQuery:
1037
+ """
1038
+ Query class for Attachments entity operations.
1039
+ """
1040
+
1041
+ def __init__(self, connector: ZendeskSupportConnector):
1042
+ """Initialize query with connector reference."""
1043
+ self._connector = connector
1044
+
1045
+ async def get(
1046
+ self,
1047
+ attachment_id: str,
1048
+ **kwargs
1049
+ ) -> AttachmentsGetResult:
1050
+ """
1051
+ Returns an attachment by its ID
1052
+
1053
+ Args:
1054
+ attachment_id: The ID of the attachment
1055
+ **kwargs: Additional parameters
1056
+
1057
+ Returns:
1058
+ AttachmentsGetResult
1059
+ """
1060
+ params = {k: v for k, v in {
1061
+ "attachment_id": attachment_id,
1062
+ **kwargs
1063
+ }.items() if v is not None}
1064
+
1065
+ result = await self._connector.execute("attachments", "get", params)
1066
+ # Cast generic envelope to concrete typed result
1067
+ return AttachmentsGetResult(
1068
+ data=result.data )
1069
+
1070
+
1071
+
1072
+ async def download(
1073
+ self,
1074
+ attachment_id: str,
1075
+ range_header: str | None = None,
1076
+ **kwargs
1077
+ ) -> AsyncIterator[bytes]:
1078
+ """
1079
+ Downloads the file content of a ticket attachment
1080
+
1081
+ Args:
1082
+ attachment_id: The ID of the attachment
1083
+ range_header: Optional Range header for partial downloads (e.g., 'bytes=0-99')
1084
+ **kwargs: Additional parameters
1085
+
1086
+ Returns:
1087
+ AsyncIterator[bytes]
1088
+ """
1089
+ params = {k: v for k, v in {
1090
+ "attachment_id": attachment_id,
1091
+ "range_header": range_header,
1092
+ **kwargs
1093
+ }.items() if v is not None}
1094
+
1095
+ result = await self._connector.execute("attachments", "download", params)
1096
+ return result
1097
+
1098
+
1099
+ async def download_local(
1100
+ self,
1101
+ attachment_id: str,
1102
+ path: str,
1103
+ range_header: str | None = None,
1104
+ **kwargs
1105
+ ) -> Path:
1106
+ """
1107
+ Downloads the file content of a ticket attachment and save to file.
1108
+
1109
+ Args:
1110
+ attachment_id: The ID of the attachment
1111
+ range_header: Optional Range header for partial downloads (e.g., 'bytes=0-99')
1112
+ path: File path to save downloaded content
1113
+ **kwargs: Additional parameters
1114
+
1115
+ Returns:
1116
+ str: Path to the downloaded file
1117
+ """
1118
+ from ._vendored.connector_sdk import save_download
1119
+
1120
+ # Get the async iterator
1121
+ content_iterator = await self.download(
1122
+ attachment_id=attachment_id,
1123
+ range_header=range_header,
1124
+ **kwargs
1125
+ )
1126
+
1127
+ return await save_download(content_iterator, path)
1128
+
1129
+
1130
+ class TicketAuditsQuery:
1131
+ """
1132
+ Query class for TicketAudits entity operations.
1133
+ """
1134
+
1135
+ def __init__(self, connector: ZendeskSupportConnector):
1136
+ """Initialize query with connector reference."""
1137
+ self._connector = connector
1138
+
1139
+ async def list(
1140
+ self,
1141
+ page: int | None = None,
1142
+ **kwargs
1143
+ ) -> TicketAuditsListResult:
1144
+ """
1145
+ Returns a list of all ticket audits
1146
+
1147
+ Args:
1148
+ page: Page number for pagination
1149
+ **kwargs: Additional parameters
1150
+
1151
+ Returns:
1152
+ TicketAuditsListResult
1153
+ """
1154
+ params = {k: v for k, v in {
1155
+ "page": page,
1156
+ **kwargs
1157
+ }.items() if v is not None}
1158
+
1159
+ result = await self._connector.execute("ticket_audits", "list", params)
1160
+ # Cast generic envelope to concrete typed result
1161
+ return TicketAuditsListResult(
1162
+ data=result.data,
1163
+ meta=result.meta )
1164
+
1165
+
1166
+
1167
+ async def list(
1168
+ self,
1169
+ ticket_id: str,
1170
+ page: int | None = None,
1171
+ **kwargs
1172
+ ) -> TicketAuditsListResult:
1173
+ """
1174
+ Returns a list of audits for a specific ticket
1175
+
1176
+ Args:
1177
+ ticket_id: The ID of the ticket
1178
+ page: Page number for pagination
1179
+ **kwargs: Additional parameters
1180
+
1181
+ Returns:
1182
+ TicketAuditsListResult
1183
+ """
1184
+ params = {k: v for k, v in {
1185
+ "ticket_id": ticket_id,
1186
+ "page": page,
1187
+ **kwargs
1188
+ }.items() if v is not None}
1189
+
1190
+ result = await self._connector.execute("ticket_audits", "list", params)
1191
+ # Cast generic envelope to concrete typed result
1192
+ return TicketAuditsListResult(
1193
+ data=result.data,
1194
+ meta=result.meta )
1195
+
1196
+
1197
+
1198
+ class TicketMetricsQuery:
1199
+ """
1200
+ Query class for TicketMetrics entity operations.
1201
+ """
1202
+
1203
+ def __init__(self, connector: ZendeskSupportConnector):
1204
+ """Initialize query with connector reference."""
1205
+ self._connector = connector
1206
+
1207
+ async def list(
1208
+ self,
1209
+ page: int | None = None,
1210
+ **kwargs
1211
+ ) -> TicketMetricsListResult:
1212
+ """
1213
+ Returns a list of all ticket metrics
1214
+
1215
+ Args:
1216
+ page: Page number for pagination
1217
+ **kwargs: Additional parameters
1218
+
1219
+ Returns:
1220
+ TicketMetricsListResult
1221
+ """
1222
+ params = {k: v for k, v in {
1223
+ "page": page,
1224
+ **kwargs
1225
+ }.items() if v is not None}
1226
+
1227
+ result = await self._connector.execute("ticket_metrics", "list", params)
1228
+ # Cast generic envelope to concrete typed result
1229
+ return TicketMetricsListResult(
1230
+ data=result.data,
1231
+ meta=result.meta )
1232
+
1233
+
1234
+
1235
+ class TicketFieldsQuery:
1236
+ """
1237
+ Query class for TicketFields entity operations.
1238
+ """
1239
+
1240
+ def __init__(self, connector: ZendeskSupportConnector):
1241
+ """Initialize query with connector reference."""
1242
+ self._connector = connector
1243
+
1244
+ async def list(
1245
+ self,
1246
+ page: int | None = None,
1247
+ locale: str | None = None,
1248
+ **kwargs
1249
+ ) -> TicketFieldsListResult:
1250
+ """
1251
+ Returns a list of all ticket fields
1252
+
1253
+ Args:
1254
+ page: Page number for pagination
1255
+ locale: Locale for the results
1256
+ **kwargs: Additional parameters
1257
+
1258
+ Returns:
1259
+ TicketFieldsListResult
1260
+ """
1261
+ params = {k: v for k, v in {
1262
+ "page": page,
1263
+ "locale": locale,
1264
+ **kwargs
1265
+ }.items() if v is not None}
1266
+
1267
+ result = await self._connector.execute("ticket_fields", "list", params)
1268
+ # Cast generic envelope to concrete typed result
1269
+ return TicketFieldsListResult(
1270
+ data=result.data,
1271
+ meta=result.meta )
1272
+
1273
+
1274
+
1275
+ async def get(
1276
+ self,
1277
+ ticket_field_id: str,
1278
+ **kwargs
1279
+ ) -> TicketFieldsGetResult:
1280
+ """
1281
+ Returns a ticket field by its ID
1282
+
1283
+ Args:
1284
+ ticket_field_id: The ID of the ticket field
1285
+ **kwargs: Additional parameters
1286
+
1287
+ Returns:
1288
+ TicketFieldsGetResult
1289
+ """
1290
+ params = {k: v for k, v in {
1291
+ "ticket_field_id": ticket_field_id,
1292
+ **kwargs
1293
+ }.items() if v is not None}
1294
+
1295
+ result = await self._connector.execute("ticket_fields", "get", params)
1296
+ # Cast generic envelope to concrete typed result
1297
+ return TicketFieldsGetResult(
1298
+ data=result.data )
1299
+
1300
+
1301
+
1302
+ class BrandsQuery:
1303
+ """
1304
+ Query class for Brands entity operations.
1305
+ """
1306
+
1307
+ def __init__(self, connector: ZendeskSupportConnector):
1308
+ """Initialize query with connector reference."""
1309
+ self._connector = connector
1310
+
1311
+ async def list(
1312
+ self,
1313
+ page: int | None = None,
1314
+ **kwargs
1315
+ ) -> BrandsListResult:
1316
+ """
1317
+ Returns a list of all brands for the account
1318
+
1319
+ Args:
1320
+ page: Page number for pagination
1321
+ **kwargs: Additional parameters
1322
+
1323
+ Returns:
1324
+ BrandsListResult
1325
+ """
1326
+ params = {k: v for k, v in {
1327
+ "page": page,
1328
+ **kwargs
1329
+ }.items() if v is not None}
1330
+
1331
+ result = await self._connector.execute("brands", "list", params)
1332
+ # Cast generic envelope to concrete typed result
1333
+ return BrandsListResult(
1334
+ data=result.data,
1335
+ meta=result.meta )
1336
+
1337
+
1338
+
1339
+ async def get(
1340
+ self,
1341
+ brand_id: str,
1342
+ **kwargs
1343
+ ) -> BrandsGetResult:
1344
+ """
1345
+ Returns a brand by its ID
1346
+
1347
+ Args:
1348
+ brand_id: The ID of the brand
1349
+ **kwargs: Additional parameters
1350
+
1351
+ Returns:
1352
+ BrandsGetResult
1353
+ """
1354
+ params = {k: v for k, v in {
1355
+ "brand_id": brand_id,
1356
+ **kwargs
1357
+ }.items() if v is not None}
1358
+
1359
+ result = await self._connector.execute("brands", "get", params)
1360
+ # Cast generic envelope to concrete typed result
1361
+ return BrandsGetResult(
1362
+ data=result.data )
1363
+
1364
+
1365
+
1366
+ class ViewsQuery:
1367
+ """
1368
+ Query class for Views entity operations.
1369
+ """
1370
+
1371
+ def __init__(self, connector: ZendeskSupportConnector):
1372
+ """Initialize query with connector reference."""
1373
+ self._connector = connector
1374
+
1375
+ async def list(
1376
+ self,
1377
+ page: int | None = None,
1378
+ access: str | None = None,
1379
+ active: bool | None = None,
1380
+ group_id: int | None = None,
1381
+ sort_by: str | None = None,
1382
+ sort_order: str | None = None,
1383
+ **kwargs
1384
+ ) -> ViewsListResult:
1385
+ """
1386
+ Returns a list of all views for the account
1387
+
1388
+ Args:
1389
+ page: Page number for pagination
1390
+ access: Filter by access level
1391
+ active: Filter by active status
1392
+ group_id: Filter by group ID
1393
+ sort_by: Sort results
1394
+ sort_order: Sort order
1395
+ **kwargs: Additional parameters
1396
+
1397
+ Returns:
1398
+ ViewsListResult
1399
+ """
1400
+ params = {k: v for k, v in {
1401
+ "page": page,
1402
+ "access": access,
1403
+ "active": active,
1404
+ "group_id": group_id,
1405
+ "sort_by": sort_by,
1406
+ "sort_order": sort_order,
1407
+ **kwargs
1408
+ }.items() if v is not None}
1409
+
1410
+ result = await self._connector.execute("views", "list", params)
1411
+ # Cast generic envelope to concrete typed result
1412
+ return ViewsListResult(
1413
+ data=result.data,
1414
+ meta=result.meta )
1415
+
1416
+
1417
+
1418
+ async def get(
1419
+ self,
1420
+ view_id: str,
1421
+ **kwargs
1422
+ ) -> ViewsGetResult:
1423
+ """
1424
+ Returns a view by its ID
1425
+
1426
+ Args:
1427
+ view_id: The ID of the view
1428
+ **kwargs: Additional parameters
1429
+
1430
+ Returns:
1431
+ ViewsGetResult
1432
+ """
1433
+ params = {k: v for k, v in {
1434
+ "view_id": view_id,
1435
+ **kwargs
1436
+ }.items() if v is not None}
1437
+
1438
+ result = await self._connector.execute("views", "get", params)
1439
+ # Cast generic envelope to concrete typed result
1440
+ return ViewsGetResult(
1441
+ data=result.data )
1442
+
1443
+
1444
+
1445
+ class MacrosQuery:
1446
+ """
1447
+ Query class for Macros entity operations.
1448
+ """
1449
+
1450
+ def __init__(self, connector: ZendeskSupportConnector):
1451
+ """Initialize query with connector reference."""
1452
+ self._connector = connector
1453
+
1454
+ async def list(
1455
+ self,
1456
+ page: int | None = None,
1457
+ access: str | None = None,
1458
+ active: bool | None = None,
1459
+ category: int | None = None,
1460
+ group_id: int | None = None,
1461
+ only_viewable: bool | None = None,
1462
+ sort_by: str | None = None,
1463
+ sort_order: str | None = None,
1464
+ **kwargs
1465
+ ) -> MacrosListResult:
1466
+ """
1467
+ Returns a list of all macros for the account
1468
+
1469
+ Args:
1470
+ page: Page number for pagination
1471
+ access: Filter by access level
1472
+ active: Filter by active status
1473
+ category: Filter by category
1474
+ group_id: Filter by group ID
1475
+ only_viewable: Return only viewable macros
1476
+ sort_by: Sort results
1477
+ sort_order: Sort order
1478
+ **kwargs: Additional parameters
1479
+
1480
+ Returns:
1481
+ MacrosListResult
1482
+ """
1483
+ params = {k: v for k, v in {
1484
+ "page": page,
1485
+ "access": access,
1486
+ "active": active,
1487
+ "category": category,
1488
+ "group_id": group_id,
1489
+ "only_viewable": only_viewable,
1490
+ "sort_by": sort_by,
1491
+ "sort_order": sort_order,
1492
+ **kwargs
1493
+ }.items() if v is not None}
1494
+
1495
+ result = await self._connector.execute("macros", "list", params)
1496
+ # Cast generic envelope to concrete typed result
1497
+ return MacrosListResult(
1498
+ data=result.data,
1499
+ meta=result.meta )
1500
+
1501
+
1502
+
1503
+ async def get(
1504
+ self,
1505
+ macro_id: str,
1506
+ **kwargs
1507
+ ) -> MacrosGetResult:
1508
+ """
1509
+ Returns a macro by its ID
1510
+
1511
+ Args:
1512
+ macro_id: The ID of the macro
1513
+ **kwargs: Additional parameters
1514
+
1515
+ Returns:
1516
+ MacrosGetResult
1517
+ """
1518
+ params = {k: v for k, v in {
1519
+ "macro_id": macro_id,
1520
+ **kwargs
1521
+ }.items() if v is not None}
1522
+
1523
+ result = await self._connector.execute("macros", "get", params)
1524
+ # Cast generic envelope to concrete typed result
1525
+ return MacrosGetResult(
1526
+ data=result.data )
1527
+
1528
+
1529
+
1530
+ class TriggersQuery:
1531
+ """
1532
+ Query class for Triggers entity operations.
1533
+ """
1534
+
1535
+ def __init__(self, connector: ZendeskSupportConnector):
1536
+ """Initialize query with connector reference."""
1537
+ self._connector = connector
1538
+
1539
+ async def list(
1540
+ self,
1541
+ page: int | None = None,
1542
+ active: bool | None = None,
1543
+ category_id: str | None = None,
1544
+ sort: str | None = None,
1545
+ **kwargs
1546
+ ) -> TriggersListResult:
1547
+ """
1548
+ Returns a list of all triggers for the account
1549
+
1550
+ Args:
1551
+ page: Page number for pagination
1552
+ active: Filter by active status
1553
+ category_id: Filter by category ID
1554
+ sort: Sort results
1555
+ **kwargs: Additional parameters
1556
+
1557
+ Returns:
1558
+ TriggersListResult
1559
+ """
1560
+ params = {k: v for k, v in {
1561
+ "page": page,
1562
+ "active": active,
1563
+ "category_id": category_id,
1564
+ "sort": sort,
1565
+ **kwargs
1566
+ }.items() if v is not None}
1567
+
1568
+ result = await self._connector.execute("triggers", "list", params)
1569
+ # Cast generic envelope to concrete typed result
1570
+ return TriggersListResult(
1571
+ data=result.data,
1572
+ meta=result.meta )
1573
+
1574
+
1575
+
1576
+ async def get(
1577
+ self,
1578
+ trigger_id: str,
1579
+ **kwargs
1580
+ ) -> TriggersGetResult:
1581
+ """
1582
+ Returns a trigger by its ID
1583
+
1584
+ Args:
1585
+ trigger_id: The ID of the trigger
1586
+ **kwargs: Additional parameters
1587
+
1588
+ Returns:
1589
+ TriggersGetResult
1590
+ """
1591
+ params = {k: v for k, v in {
1592
+ "trigger_id": trigger_id,
1593
+ **kwargs
1594
+ }.items() if v is not None}
1595
+
1596
+ result = await self._connector.execute("triggers", "get", params)
1597
+ # Cast generic envelope to concrete typed result
1598
+ return TriggersGetResult(
1599
+ data=result.data )
1600
+
1601
+
1602
+
1603
+ class AutomationsQuery:
1604
+ """
1605
+ Query class for Automations entity operations.
1606
+ """
1607
+
1608
+ def __init__(self, connector: ZendeskSupportConnector):
1609
+ """Initialize query with connector reference."""
1610
+ self._connector = connector
1611
+
1612
+ async def list(
1613
+ self,
1614
+ page: int | None = None,
1615
+ active: bool | None = None,
1616
+ sort: str | None = None,
1617
+ **kwargs
1618
+ ) -> AutomationsListResult:
1619
+ """
1620
+ Returns a list of all automations for the account
1621
+
1622
+ Args:
1623
+ page: Page number for pagination
1624
+ active: Filter by active status
1625
+ sort: Sort results
1626
+ **kwargs: Additional parameters
1627
+
1628
+ Returns:
1629
+ AutomationsListResult
1630
+ """
1631
+ params = {k: v for k, v in {
1632
+ "page": page,
1633
+ "active": active,
1634
+ "sort": sort,
1635
+ **kwargs
1636
+ }.items() if v is not None}
1637
+
1638
+ result = await self._connector.execute("automations", "list", params)
1639
+ # Cast generic envelope to concrete typed result
1640
+ return AutomationsListResult(
1641
+ data=result.data,
1642
+ meta=result.meta )
1643
+
1644
+
1645
+
1646
+ async def get(
1647
+ self,
1648
+ automation_id: str,
1649
+ **kwargs
1650
+ ) -> AutomationsGetResult:
1651
+ """
1652
+ Returns an automation by its ID
1653
+
1654
+ Args:
1655
+ automation_id: The ID of the automation
1656
+ **kwargs: Additional parameters
1657
+
1658
+ Returns:
1659
+ AutomationsGetResult
1660
+ """
1661
+ params = {k: v for k, v in {
1662
+ "automation_id": automation_id,
1663
+ **kwargs
1664
+ }.items() if v is not None}
1665
+
1666
+ result = await self._connector.execute("automations", "get", params)
1667
+ # Cast generic envelope to concrete typed result
1668
+ return AutomationsGetResult(
1669
+ data=result.data )
1670
+
1671
+
1672
+
1673
+ class TagsQuery:
1674
+ """
1675
+ Query class for Tags entity operations.
1676
+ """
1677
+
1678
+ def __init__(self, connector: ZendeskSupportConnector):
1679
+ """Initialize query with connector reference."""
1680
+ self._connector = connector
1681
+
1682
+ async def list(
1683
+ self,
1684
+ page: int | None = None,
1685
+ **kwargs
1686
+ ) -> TagsListResult:
1687
+ """
1688
+ Returns a list of all tags used in the account
1689
+
1690
+ Args:
1691
+ page: Page number for pagination
1692
+ **kwargs: Additional parameters
1693
+
1694
+ Returns:
1695
+ TagsListResult
1696
+ """
1697
+ params = {k: v for k, v in {
1698
+ "page": page,
1699
+ **kwargs
1700
+ }.items() if v is not None}
1701
+
1702
+ result = await self._connector.execute("tags", "list", params)
1703
+ # Cast generic envelope to concrete typed result
1704
+ return TagsListResult(
1705
+ data=result.data,
1706
+ meta=result.meta )
1707
+
1708
+
1709
+
1710
+ class SatisfactionRatingsQuery:
1711
+ """
1712
+ Query class for SatisfactionRatings entity operations.
1713
+ """
1714
+
1715
+ def __init__(self, connector: ZendeskSupportConnector):
1716
+ """Initialize query with connector reference."""
1717
+ self._connector = connector
1718
+
1719
+ async def list(
1720
+ self,
1721
+ page: int | None = None,
1722
+ score: str | None = None,
1723
+ start_time: int | None = None,
1724
+ end_time: int | None = None,
1725
+ **kwargs
1726
+ ) -> SatisfactionRatingsListResult:
1727
+ """
1728
+ Returns a list of all satisfaction ratings
1729
+
1730
+ Args:
1731
+ page: Page number for pagination
1732
+ score: Filter by score
1733
+ start_time: Start time (Unix epoch)
1734
+ end_time: End time (Unix epoch)
1735
+ **kwargs: Additional parameters
1736
+
1737
+ Returns:
1738
+ SatisfactionRatingsListResult
1739
+ """
1740
+ params = {k: v for k, v in {
1741
+ "page": page,
1742
+ "score": score,
1743
+ "start_time": start_time,
1744
+ "end_time": end_time,
1745
+ **kwargs
1746
+ }.items() if v is not None}
1747
+
1748
+ result = await self._connector.execute("satisfaction_ratings", "list", params)
1749
+ # Cast generic envelope to concrete typed result
1750
+ return SatisfactionRatingsListResult(
1751
+ data=result.data,
1752
+ meta=result.meta )
1753
+
1754
+
1755
+
1756
+ async def get(
1757
+ self,
1758
+ satisfaction_rating_id: str,
1759
+ **kwargs
1760
+ ) -> SatisfactionRatingsGetResult:
1761
+ """
1762
+ Returns a satisfaction rating by its ID
1763
+
1764
+ Args:
1765
+ satisfaction_rating_id: The ID of the satisfaction rating
1766
+ **kwargs: Additional parameters
1767
+
1768
+ Returns:
1769
+ SatisfactionRatingsGetResult
1770
+ """
1771
+ params = {k: v for k, v in {
1772
+ "satisfaction_rating_id": satisfaction_rating_id,
1773
+ **kwargs
1774
+ }.items() if v is not None}
1775
+
1776
+ result = await self._connector.execute("satisfaction_ratings", "get", params)
1777
+ # Cast generic envelope to concrete typed result
1778
+ return SatisfactionRatingsGetResult(
1779
+ data=result.data )
1780
+
1781
+
1782
+
1783
+ class GroupMembershipsQuery:
1784
+ """
1785
+ Query class for GroupMemberships entity operations.
1786
+ """
1787
+
1788
+ def __init__(self, connector: ZendeskSupportConnector):
1789
+ """Initialize query with connector reference."""
1790
+ self._connector = connector
1791
+
1792
+ async def list(
1793
+ self,
1794
+ page: int | None = None,
1795
+ **kwargs
1796
+ ) -> GroupMembershipsListResult:
1797
+ """
1798
+ Returns a list of all group memberships
1799
+
1800
+ Args:
1801
+ page: Page number for pagination
1802
+ **kwargs: Additional parameters
1803
+
1804
+ Returns:
1805
+ GroupMembershipsListResult
1806
+ """
1807
+ params = {k: v for k, v in {
1808
+ "page": page,
1809
+ **kwargs
1810
+ }.items() if v is not None}
1811
+
1812
+ result = await self._connector.execute("group_memberships", "list", params)
1813
+ # Cast generic envelope to concrete typed result
1814
+ return GroupMembershipsListResult(
1815
+ data=result.data,
1816
+ meta=result.meta )
1817
+
1818
+
1819
+
1820
+ class OrganizationMembershipsQuery:
1821
+ """
1822
+ Query class for OrganizationMemberships entity operations.
1823
+ """
1824
+
1825
+ def __init__(self, connector: ZendeskSupportConnector):
1826
+ """Initialize query with connector reference."""
1827
+ self._connector = connector
1828
+
1829
+ async def list(
1830
+ self,
1831
+ page: int | None = None,
1832
+ **kwargs
1833
+ ) -> OrganizationMembershipsListResult:
1834
+ """
1835
+ Returns a list of all organization memberships
1836
+
1837
+ Args:
1838
+ page: Page number for pagination
1839
+ **kwargs: Additional parameters
1840
+
1841
+ Returns:
1842
+ OrganizationMembershipsListResult
1843
+ """
1844
+ params = {k: v for k, v in {
1845
+ "page": page,
1846
+ **kwargs
1847
+ }.items() if v is not None}
1848
+
1849
+ result = await self._connector.execute("organization_memberships", "list", params)
1850
+ # Cast generic envelope to concrete typed result
1851
+ return OrganizationMembershipsListResult(
1852
+ data=result.data,
1853
+ meta=result.meta )
1854
+
1855
+
1856
+
1857
+ class SlaPoliciesQuery:
1858
+ """
1859
+ Query class for SlaPolicies entity operations.
1860
+ """
1861
+
1862
+ def __init__(self, connector: ZendeskSupportConnector):
1863
+ """Initialize query with connector reference."""
1864
+ self._connector = connector
1865
+
1866
+ async def list(
1867
+ self,
1868
+ page: int | None = None,
1869
+ **kwargs
1870
+ ) -> SlaPoliciesListResult:
1871
+ """
1872
+ Returns a list of all SLA policies
1873
+
1874
+ Args:
1875
+ page: Page number for pagination
1876
+ **kwargs: Additional parameters
1877
+
1878
+ Returns:
1879
+ SlaPoliciesListResult
1880
+ """
1881
+ params = {k: v for k, v in {
1882
+ "page": page,
1883
+ **kwargs
1884
+ }.items() if v is not None}
1885
+
1886
+ result = await self._connector.execute("sla_policies", "list", params)
1887
+ # Cast generic envelope to concrete typed result
1888
+ return SlaPoliciesListResult(
1889
+ data=result.data,
1890
+ meta=result.meta )
1891
+
1892
+
1893
+
1894
+ async def get(
1895
+ self,
1896
+ sla_policy_id: str,
1897
+ **kwargs
1898
+ ) -> SlaPoliciesGetResult:
1899
+ """
1900
+ Returns an SLA policy by its ID
1901
+
1902
+ Args:
1903
+ sla_policy_id: The ID of the SLA policy
1904
+ **kwargs: Additional parameters
1905
+
1906
+ Returns:
1907
+ SlaPoliciesGetResult
1908
+ """
1909
+ params = {k: v for k, v in {
1910
+ "sla_policy_id": sla_policy_id,
1911
+ **kwargs
1912
+ }.items() if v is not None}
1913
+
1914
+ result = await self._connector.execute("sla_policies", "get", params)
1915
+ # Cast generic envelope to concrete typed result
1916
+ return SlaPoliciesGetResult(
1917
+ data=result.data )
1918
+
1919
+
1920
+
1921
+ class TicketFormsQuery:
1922
+ """
1923
+ Query class for TicketForms entity operations.
1924
+ """
1925
+
1926
+ def __init__(self, connector: ZendeskSupportConnector):
1927
+ """Initialize query with connector reference."""
1928
+ self._connector = connector
1929
+
1930
+ async def list(
1931
+ self,
1932
+ page: int | None = None,
1933
+ active: bool | None = None,
1934
+ end_user_visible: bool | None = None,
1935
+ **kwargs
1936
+ ) -> TicketFormsListResult:
1937
+ """
1938
+ Returns a list of all ticket forms for the account
1939
+
1940
+ Args:
1941
+ page: Page number for pagination
1942
+ active: Filter by active status
1943
+ end_user_visible: Filter by end user visibility
1944
+ **kwargs: Additional parameters
1945
+
1946
+ Returns:
1947
+ TicketFormsListResult
1948
+ """
1949
+ params = {k: v for k, v in {
1950
+ "page": page,
1951
+ "active": active,
1952
+ "end_user_visible": end_user_visible,
1953
+ **kwargs
1954
+ }.items() if v is not None}
1955
+
1956
+ result = await self._connector.execute("ticket_forms", "list", params)
1957
+ # Cast generic envelope to concrete typed result
1958
+ return TicketFormsListResult(
1959
+ data=result.data,
1960
+ meta=result.meta )
1961
+
1962
+
1963
+
1964
+ async def get(
1965
+ self,
1966
+ ticket_form_id: str,
1967
+ **kwargs
1968
+ ) -> TicketFormsGetResult:
1969
+ """
1970
+ Returns a ticket form by its ID
1971
+
1972
+ Args:
1973
+ ticket_form_id: The ID of the ticket form
1974
+ **kwargs: Additional parameters
1975
+
1976
+ Returns:
1977
+ TicketFormsGetResult
1978
+ """
1979
+ params = {k: v for k, v in {
1980
+ "ticket_form_id": ticket_form_id,
1981
+ **kwargs
1982
+ }.items() if v is not None}
1983
+
1984
+ result = await self._connector.execute("ticket_forms", "get", params)
1985
+ # Cast generic envelope to concrete typed result
1986
+ return TicketFormsGetResult(
1987
+ data=result.data )
1988
+
1989
+
1990
+
1991
+ class ArticlesQuery:
1992
+ """
1993
+ Query class for Articles entity operations.
1994
+ """
1995
+
1996
+ def __init__(self, connector: ZendeskSupportConnector):
1997
+ """Initialize query with connector reference."""
1998
+ self._connector = connector
1999
+
2000
+ async def list(
2001
+ self,
2002
+ page: int | None = None,
2003
+ sort_by: str | None = None,
2004
+ sort_order: str | None = None,
2005
+ **kwargs
2006
+ ) -> ArticlesListResult:
2007
+ """
2008
+ Returns a list of all articles in the Help Center
2009
+
2010
+ Args:
2011
+ page: Page number for pagination
2012
+ sort_by: Sort articles by field
2013
+ sort_order: Sort order
2014
+ **kwargs: Additional parameters
2015
+
2016
+ Returns:
2017
+ ArticlesListResult
2018
+ """
2019
+ params = {k: v for k, v in {
2020
+ "page": page,
2021
+ "sort_by": sort_by,
2022
+ "sort_order": sort_order,
2023
+ **kwargs
2024
+ }.items() if v is not None}
2025
+
2026
+ result = await self._connector.execute("articles", "list", params)
2027
+ # Cast generic envelope to concrete typed result
2028
+ return ArticlesListResult(
2029
+ data=result.data,
2030
+ meta=result.meta )
2031
+
2032
+
2033
+
2034
+ async def get(
2035
+ self,
2036
+ id: str | None = None,
2037
+ **kwargs
2038
+ ) -> ArticlesGetResult:
2039
+ """
2040
+ Retrieves the details of a specific article
2041
+
2042
+ Args:
2043
+ id: The unique ID of the article
2044
+ **kwargs: Additional parameters
2045
+
2046
+ Returns:
2047
+ ArticlesGetResult
2048
+ """
2049
+ params = {k: v for k, v in {
2050
+ "id": id,
2051
+ **kwargs
2052
+ }.items() if v is not None}
2053
+
2054
+ result = await self._connector.execute("articles", "get", params)
2055
+ # Cast generic envelope to concrete typed result
2056
+ return ArticlesGetResult(
2057
+ data=result.data )
2058
+
2059
+
2060
+
2061
+ class ArticleAttachmentsQuery:
2062
+ """
2063
+ Query class for ArticleAttachments entity operations.
2064
+ """
2065
+
2066
+ def __init__(self, connector: ZendeskSupportConnector):
2067
+ """Initialize query with connector reference."""
2068
+ self._connector = connector
2069
+
2070
+ async def list(
2071
+ self,
2072
+ article_id: str,
2073
+ page: int | None = None,
2074
+ **kwargs
2075
+ ) -> ArticleAttachmentsListResult:
2076
+ """
2077
+ Returns a list of all attachments for a specific article
2078
+
2079
+ Args:
2080
+ article_id: The unique ID of the article
2081
+ page: Page number for pagination
2082
+ **kwargs: Additional parameters
2083
+
2084
+ Returns:
2085
+ ArticleAttachmentsListResult
2086
+ """
2087
+ params = {k: v for k, v in {
2088
+ "article_id": article_id,
2089
+ "page": page,
2090
+ **kwargs
2091
+ }.items() if v is not None}
2092
+
2093
+ result = await self._connector.execute("article_attachments", "list", params)
2094
+ # Cast generic envelope to concrete typed result
2095
+ return ArticleAttachmentsListResult(
2096
+ data=result.data,
2097
+ meta=result.meta )
2098
+
2099
+
2100
+
2101
+ async def get(
2102
+ self,
2103
+ article_id: str,
2104
+ attachment_id: str,
2105
+ **kwargs
2106
+ ) -> ArticleAttachmentsGetResult:
2107
+ """
2108
+ Retrieves the metadata of a specific attachment for a specific article
2109
+
2110
+ Args:
2111
+ article_id: The unique ID of the article
2112
+ attachment_id: The unique ID of the attachment
2113
+ **kwargs: Additional parameters
2114
+
2115
+ Returns:
2116
+ ArticleAttachmentsGetResult
2117
+ """
2118
+ params = {k: v for k, v in {
2119
+ "article_id": article_id,
2120
+ "attachment_id": attachment_id,
2121
+ **kwargs
2122
+ }.items() if v is not None}
2123
+
2124
+ result = await self._connector.execute("article_attachments", "get", params)
2125
+ # Cast generic envelope to concrete typed result
2126
+ return ArticleAttachmentsGetResult(
2127
+ data=result.data )
2128
+
2129
+
2130
+
2131
+ async def download(
2132
+ self,
2133
+ article_id: str,
2134
+ attachment_id: str,
2135
+ range_header: str | None = None,
2136
+ **kwargs
2137
+ ) -> AsyncIterator[bytes]:
2138
+ """
2139
+ Downloads the file content of a specific attachment
2140
+
2141
+ Args:
2142
+ article_id: The unique ID of the article
2143
+ attachment_id: The unique ID of the attachment
2144
+ range_header: Optional Range header for partial downloads (e.g., 'bytes=0-99')
2145
+ **kwargs: Additional parameters
2146
+
2147
+ Returns:
2148
+ AsyncIterator[bytes]
2149
+ """
2150
+ params = {k: v for k, v in {
2151
+ "article_id": article_id,
2152
+ "attachment_id": attachment_id,
2153
+ "range_header": range_header,
2154
+ **kwargs
2155
+ }.items() if v is not None}
2156
+
2157
+ result = await self._connector.execute("article_attachments", "download", params)
2158
+ return result
2159
+
2160
+
2161
+ async def download_local(
2162
+ self,
2163
+ article_id: str,
2164
+ attachment_id: str,
2165
+ path: str,
2166
+ range_header: str | None = None,
2167
+ **kwargs
2168
+ ) -> Path:
2169
+ """
2170
+ Downloads the file content of a specific attachment and save to file.
2171
+
2172
+ Args:
2173
+ article_id: The unique ID of the article
2174
+ attachment_id: The unique ID of the attachment
2175
+ range_header: Optional Range header for partial downloads (e.g., 'bytes=0-99')
2176
+ path: File path to save downloaded content
2177
+ **kwargs: Additional parameters
2178
+
2179
+ Returns:
2180
+ str: Path to the downloaded file
2181
+ """
2182
+ from ._vendored.connector_sdk import save_download
2183
+
2184
+ # Get the async iterator
2185
+ content_iterator = await self.download(
2186
+ article_id=article_id,
2187
+ attachment_id=attachment_id,
2188
+ range_header=range_header,
2189
+ **kwargs
2190
+ )
2191
+
2192
+ return await save_download(content_iterator, path)
2193
+