airbyte-agent-zendesk-support 0.18.28__tar.gz → 0.18.30__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 (59) hide show
  1. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/CHANGELOG.md +10 -0
  2. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/PKG-INFO +3 -3
  3. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/README.md +2 -2
  4. airbyte_agent_zendesk_support-0.18.30/airbyte_agent_zendesk_support/_vendored/connector_sdk/introspection.py +262 -0
  5. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/connector.py +88 -3
  6. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/pyproject.toml +1 -1
  7. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/.gitignore +0 -0
  8. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/REFERENCE.md +0 -0
  9. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/__init__.py +0 -0
  10. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/__init__.py +0 -0
  11. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/__init__.py +0 -0
  12. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_strategies.py +0 -0
  13. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_template.py +0 -0
  14. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/cloud_utils/__init__.py +0 -0
  15. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/cloud_utils/client.py +0 -0
  16. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/connector_model_loader.py +0 -0
  17. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/constants.py +0 -0
  18. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/exceptions.py +0 -0
  19. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/__init__.py +0 -0
  20. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/hosted_executor.py +0 -0
  21. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/local_executor.py +0 -0
  22. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/models.py +0 -0
  23. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/extensions.py +0 -0
  24. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/__init__.py +0 -0
  25. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/adapters/__init__.py +0 -0
  26. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/adapters/httpx_adapter.py +0 -0
  27. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/config.py +0 -0
  28. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/exceptions.py +0 -0
  29. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/protocols.py +0 -0
  30. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/response.py +0 -0
  31. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http_client.py +0 -0
  32. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/__init__.py +0 -0
  33. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/logger.py +0 -0
  34. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/types.py +0 -0
  35. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/__init__.py +0 -0
  36. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/models.py +0 -0
  37. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/redactor.py +0 -0
  38. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/session.py +0 -0
  39. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/__init__.py +0 -0
  40. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/instrumentation.py +0 -0
  41. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/metrics.py +0 -0
  42. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/__init__.py +0 -0
  43. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/base.py +0 -0
  44. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/components.py +0 -0
  45. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/connector.py +0 -0
  46. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/extensions.py +0 -0
  47. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/operations.py +0 -0
  48. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/security.py +0 -0
  49. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/secrets.py +0 -0
  50. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/__init__.py +0 -0
  51. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/config.py +0 -0
  52. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/events.py +0 -0
  53. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/tracker.py +0 -0
  54. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/types.py +0 -0
  55. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/utils.py +0 -0
  56. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/_vendored/connector_sdk/validation.py +0 -0
  57. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/connector_model.py +0 -0
  58. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/models.py +0 -0
  59. {airbyte_agent_zendesk_support-0.18.28 → airbyte_agent_zendesk_support-0.18.30}/airbyte_agent_zendesk_support/types.py +0 -0
@@ -1,5 +1,15 @@
1
1
  # Zendesk Support changelog
2
2
 
3
+ ## [0.18.30] - 2026-01-09
4
+ - Updated connector definition (YAML version 0.1.4)
5
+ - Source commit: da9b741b
6
+ - SDK version: 0.1.0
7
+
8
+ ## [0.18.29] - 2026-01-07
9
+ - Updated connector definition (YAML version 0.1.4)
10
+ - Source commit: d023e05f
11
+ - SDK version: 0.1.0
12
+
3
13
  ## [0.18.28] - 2026-01-06
4
14
  - Updated connector definition (YAML version 0.1.4)
5
15
  - Source commit: 0580c727
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: airbyte-agent-zendesk-support
3
- Version: 0.18.28
3
+ Version: 0.18.30
4
4
  Summary: Airbyte Zendesk-Support Connector for AI platforms
5
5
  Project-URL: Homepage, https://github.com/airbytehq/airbyte-embedded
6
6
  Project-URL: Documentation, https://github.com/airbytehq/airbyte-embedded/tree/main/integrations
@@ -141,6 +141,6 @@ For the service's official API docs, see the [Zendesk-Support API reference](htt
141
141
 
142
142
  ## Version information
143
143
 
144
- - **Package version:** 0.18.28
144
+ - **Package version:** 0.18.30
145
145
  - **Connector version:** 0.1.4
146
- - **Generated with Connector SDK commit SHA:** 0580c7278394ff52ee3bec5d5192905ac3b15878
146
+ - **Generated with Connector SDK commit SHA:** da9b741b7b9d8091113af16ba8ec5d5e5d13b749
@@ -107,6 +107,6 @@ For the service's official API docs, see the [Zendesk-Support API reference](htt
107
107
 
108
108
  ## Version information
109
109
 
110
- - **Package version:** 0.18.28
110
+ - **Package version:** 0.18.30
111
111
  - **Connector version:** 0.1.4
112
- - **Generated with Connector SDK commit SHA:** 0580c7278394ff52ee3bec5d5192905ac3b15878
112
+ - **Generated with Connector SDK commit SHA:** da9b741b7b9d8091113af16ba8ec5d5e5d13b749
@@ -0,0 +1,262 @@
1
+ """
2
+ Shared introspection utilities for connector metadata.
3
+
4
+ This module provides utilities for introspecting connector metadata,
5
+ generating descriptions, and formatting parameter signatures. These
6
+ functions are used by both the runtime decorators and the generated
7
+ connector code.
8
+
9
+ The module is designed to work with any object conforming to the
10
+ ConnectorModel and EndpointDefinition interfaces from connector_sdk.types.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ from typing import Any, Protocol
16
+
17
+ # Constants
18
+ MAX_EXAMPLE_QUESTIONS = 5 # Maximum number of example questions to include in description
19
+
20
+
21
+ class EndpointProtocol(Protocol):
22
+ """Protocol defining the expected interface for endpoint parameters.
23
+
24
+ This allows functions to work with any endpoint-like object
25
+ that has these attributes, including EndpointDefinition and mock objects.
26
+ """
27
+
28
+ path_params: list[str]
29
+ path_params_schema: dict[str, dict[str, Any]]
30
+ query_params: list[str]
31
+ query_params_schema: dict[str, dict[str, Any]]
32
+ body_fields: list[str]
33
+ request_schema: dict[str, Any] | None
34
+
35
+
36
+ class EntityProtocol(Protocol):
37
+ """Protocol defining the expected interface for entity definitions."""
38
+
39
+ name: str
40
+ actions: list[Any]
41
+ endpoints: dict[Any, EndpointProtocol]
42
+
43
+
44
+ class ConnectorModelProtocol(Protocol):
45
+ """Protocol defining the expected interface for connector model parameters.
46
+
47
+ This allows functions to work with any connector-like object
48
+ that has these attributes, including ConnectorModel and mock objects.
49
+ """
50
+
51
+ @property
52
+ def entities(self) -> list[EntityProtocol]: ...
53
+
54
+ @property
55
+ def openapi_spec(self) -> Any: ...
56
+
57
+
58
+ def format_param_signature(endpoint: EndpointProtocol) -> str:
59
+ """Format parameter signature for an endpoint action.
60
+
61
+ Returns a string like: (id*) or (limit?, starting_after?, email?)
62
+ where * = required, ? = optional
63
+
64
+ Args:
65
+ endpoint: Object conforming to EndpointProtocol (e.g., EndpointDefinition)
66
+
67
+ Returns:
68
+ Formatted parameter signature string
69
+ """
70
+ params = []
71
+
72
+ # Defensive: safely access attributes with defaults for malformed endpoints
73
+ path_params = getattr(endpoint, "path_params", []) or []
74
+ query_params = getattr(endpoint, "query_params", []) or []
75
+ query_params_schema = getattr(endpoint, "query_params_schema", {}) or {}
76
+ body_fields = getattr(endpoint, "body_fields", []) or []
77
+ request_schema = getattr(endpoint, "request_schema", None)
78
+
79
+ # Path params (always required)
80
+ for name in path_params:
81
+ params.append(f"{name}*")
82
+
83
+ # Query params
84
+ for name in query_params:
85
+ schema = query_params_schema.get(name, {})
86
+ required = schema.get("required", False)
87
+ params.append(f"{name}{'*' if required else '?'}")
88
+
89
+ # Body fields
90
+ if request_schema:
91
+ required_fields = set(request_schema.get("required", []))
92
+ for name in body_fields:
93
+ params.append(f"{name}{'*' if name in required_fields else '?'}")
94
+
95
+ return f"({', '.join(params)})" if params else "()"
96
+
97
+
98
+ def describe_entities(model: ConnectorModelProtocol) -> list[dict[str, Any]]:
99
+ """Generate entity descriptions from ConnectorModel.
100
+
101
+ Returns a list of entity descriptions with detailed parameter information
102
+ for each action. This is used by generated connectors' describe() method.
103
+
104
+ Args:
105
+ model: Object conforming to ConnectorModelProtocol (e.g., ConnectorModel)
106
+
107
+ Returns:
108
+ List of entity description dicts with keys:
109
+ - entity_name: Name of the entity (e.g., "contacts", "deals")
110
+ - description: Entity description from the first endpoint
111
+ - available_actions: List of actions (e.g., ["list", "get", "create"])
112
+ - parameters: Dict mapping action -> list of parameter dicts
113
+ """
114
+ entities = []
115
+ for entity_def in model.entities:
116
+ description = ""
117
+ parameters: dict[str, list[dict[str, Any]]] = {}
118
+
119
+ endpoints = getattr(entity_def, "endpoints", {}) or {}
120
+ if endpoints:
121
+ for action, endpoint in endpoints.items():
122
+ # Get description from first endpoint that has one
123
+ if not description:
124
+ endpoint_desc = getattr(endpoint, "description", None)
125
+ if endpoint_desc:
126
+ description = endpoint_desc
127
+
128
+ action_params: list[dict[str, Any]] = []
129
+
130
+ # Defensive: safely access endpoint attributes
131
+ path_params = getattr(endpoint, "path_params", []) or []
132
+ path_params_schema = getattr(endpoint, "path_params_schema", {}) or {}
133
+ query_params = getattr(endpoint, "query_params", []) or []
134
+ query_params_schema = getattr(endpoint, "query_params_schema", {}) or {}
135
+ body_fields = getattr(endpoint, "body_fields", []) or []
136
+ request_schema = getattr(endpoint, "request_schema", None)
137
+
138
+ # Path params (always required)
139
+ for param_name in path_params:
140
+ schema = path_params_schema.get(param_name, {})
141
+ action_params.append(
142
+ {
143
+ "name": param_name,
144
+ "in": "path",
145
+ "required": True,
146
+ "type": schema.get("type", "string"),
147
+ "description": schema.get("description", ""),
148
+ }
149
+ )
150
+
151
+ # Query params
152
+ for param_name in query_params:
153
+ schema = query_params_schema.get(param_name, {})
154
+ action_params.append(
155
+ {
156
+ "name": param_name,
157
+ "in": "query",
158
+ "required": schema.get("required", False),
159
+ "type": schema.get("type", "string"),
160
+ "description": schema.get("description", ""),
161
+ }
162
+ )
163
+
164
+ # Body fields
165
+ if request_schema:
166
+ required_fields = request_schema.get("required", [])
167
+ properties = request_schema.get("properties", {})
168
+ for param_name in body_fields:
169
+ prop = properties.get(param_name, {})
170
+ action_params.append(
171
+ {
172
+ "name": param_name,
173
+ "in": "body",
174
+ "required": param_name in required_fields,
175
+ "type": prop.get("type", "string"),
176
+ "description": prop.get("description", ""),
177
+ }
178
+ )
179
+
180
+ if action_params:
181
+ # Action is an enum, use .value to get string
182
+ action_key = action.value if hasattr(action, "value") else str(action)
183
+ parameters[action_key] = action_params
184
+
185
+ actions = getattr(entity_def, "actions", []) or []
186
+ entities.append(
187
+ {
188
+ "entity_name": entity_def.name,
189
+ "description": description,
190
+ "available_actions": [a.value if hasattr(a, "value") else str(a) for a in actions],
191
+ "parameters": parameters,
192
+ }
193
+ )
194
+
195
+ return entities
196
+
197
+
198
+ def generate_tool_description(model: ConnectorModelProtocol) -> str:
199
+ """Generate AI tool description from connector metadata.
200
+
201
+ Produces a detailed description that includes:
202
+ - Per-entity/action parameter signatures with required (*) and optional (?) markers
203
+ - Response structure documentation with pagination hints
204
+ - Example questions if available in the OpenAPI spec
205
+
206
+ This is used by the Connector.describe class method decorator to populate
207
+ function docstrings for AI framework integration.
208
+
209
+ Args:
210
+ model: Object conforming to ConnectorModelProtocol (e.g., ConnectorModel)
211
+
212
+ Returns:
213
+ Formatted description string suitable for AI tool documentation
214
+ """
215
+ lines = []
216
+
217
+ # Entity/action parameter details (including pagination params like limit, starting_after)
218
+ lines.append("ENTITIES AND PARAMETERS:")
219
+ for entity in model.entities:
220
+ lines.append(f" {entity.name}:")
221
+ actions = getattr(entity, "actions", []) or []
222
+ endpoints = getattr(entity, "endpoints", {}) or {}
223
+ for action in actions:
224
+ action_str = action.value if hasattr(action, "value") else str(action)
225
+ endpoint = endpoints.get(action)
226
+ if endpoint:
227
+ param_sig = format_param_signature(endpoint)
228
+ lines.append(f" - {action_str}{param_sig}")
229
+ else:
230
+ lines.append(f" - {action_str}()")
231
+
232
+ # Response structure (brief, includes pagination hint)
233
+ lines.append("")
234
+ lines.append("RESPONSE STRUCTURE:")
235
+ lines.append(" - list/search: {data: [...], meta: {has_more: bool}}")
236
+ lines.append(" - get: Returns entity directly (no envelope)")
237
+ lines.append(" To paginate: pass starting_after=<last_id> while has_more is true")
238
+
239
+ # Add example questions if available in openapi_spec
240
+ openapi_spec = getattr(model, "openapi_spec", None)
241
+ if openapi_spec:
242
+ info = getattr(openapi_spec, "info", None)
243
+ if info:
244
+ example_questions = getattr(info, "x_airbyte_example_questions", None)
245
+ if example_questions:
246
+ supported = getattr(example_questions, "supported", None)
247
+ if supported:
248
+ lines.append("")
249
+ lines.append("EXAMPLE QUESTIONS:")
250
+ for q in supported[:MAX_EXAMPLE_QUESTIONS]:
251
+ lines.append(f" - {q}")
252
+
253
+ # Generic parameter description for function signature
254
+ lines.append("")
255
+ lines.append("FUNCTION PARAMETERS:")
256
+ lines.append(" - entity: Entity name (string)")
257
+ lines.append(" - action: Operation to perform (string)")
258
+ lines.append(" - params: Operation parameters (dict) - see entity details above")
259
+ lines.append("")
260
+ lines.append("Parameter markers: * = required, ? = optional")
261
+
262
+ return "\n".join(lines)
@@ -4,14 +4,15 @@ zendesk-support connector.
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
- from typing import TYPE_CHECKING, Any, AsyncIterator, overload
7
+ import logging
8
+ from typing import TYPE_CHECKING, Any, Callable, TypeVar, AsyncIterator, overload
8
9
  try:
9
10
  from typing import Literal
10
11
  except ImportError:
11
12
  from typing_extensions import Literal
12
13
 
13
14
  from .connector_model import ZendeskSupportConnectorModel
14
-
15
+ from ._vendored.connector_sdk.introspection import describe_entities, generate_tool_description
15
16
  from .types import (
16
17
  ArticleAttachmentsDownloadParams,
17
18
  ArticleAttachmentsGetParams,
@@ -53,7 +54,6 @@ from .types import (
53
54
  ViewsGetParams,
54
55
  ViewsListParams,
55
56
  )
56
-
57
57
  if TYPE_CHECKING:
58
58
  from .models import ZendeskSupportAuthConfig
59
59
  # Import specific auth config classes for multi-auth isinstance checks
@@ -102,6 +102,9 @@ from .models import (
102
102
  ArticleAttachmentsGetResult,
103
103
  )
104
104
 
105
+ # TypeVar for decorator type preservation
106
+ _F = TypeVar("_F", bound=Callable[..., Any])
107
+
105
108
 
106
109
  class ZendeskSupportConnector:
107
110
  """
@@ -712,6 +715,88 @@ class ZendeskSupportConnector:
712
715
  # No extractors - return raw response data
713
716
  return result.data
714
717
 
718
+ # ===== INTROSPECTION METHODS =====
719
+
720
+ @classmethod
721
+ def describe(cls, func: _F) -> _F:
722
+ """
723
+ Decorator that populates a function's docstring with connector capabilities.
724
+
725
+ This class method can be used as a decorator to automatically generate
726
+ comprehensive documentation for AI tool functions.
727
+
728
+ Usage:
729
+ @mcp.tool()
730
+ @ZendeskSupportConnector.describe
731
+ async def execute(entity: str, action: str, params: dict):
732
+ '''Execute operations.'''
733
+ ...
734
+
735
+ The decorated function's __doc__ will be updated with:
736
+ - Available entities and their actions
737
+ - Parameter signatures with required (*) and optional (?) markers
738
+ - Response structure documentation
739
+ - Example questions (if available in OpenAPI spec)
740
+
741
+ Args:
742
+ func: The function to decorate
743
+
744
+ Returns:
745
+ The same function with updated __doc__
746
+ """
747
+ description = generate_tool_description(ZendeskSupportConnectorModel)
748
+
749
+ original_doc = func.__doc__ or ""
750
+ if original_doc.strip():
751
+ func.__doc__ = f"{original_doc.strip()}\n\n{description}"
752
+ else:
753
+ func.__doc__ = description
754
+
755
+ return func
756
+
757
+ def list_entities(self) -> list[dict[str, Any]]:
758
+ """
759
+ Get structured data about available entities, actions, and parameters.
760
+
761
+ Returns a list of entity descriptions with:
762
+ - entity_name: Name of the entity (e.g., "contacts", "deals")
763
+ - description: Entity description from the first endpoint
764
+ - available_actions: List of actions (e.g., ["list", "get", "create"])
765
+ - parameters: Dict mapping action -> list of parameter dicts
766
+
767
+ Example:
768
+ entities = connector.list_entities()
769
+ for entity in entities:
770
+ print(f"{entity['entity_name']}: {entity['available_actions']}")
771
+ """
772
+ return describe_entities(ZendeskSupportConnectorModel)
773
+
774
+ def entity_schema(self, entity: str) -> dict[str, Any] | None:
775
+ """
776
+ Get the JSON schema for an entity.
777
+
778
+ Args:
779
+ entity: Entity name (e.g., "contacts", "companies")
780
+
781
+ Returns:
782
+ JSON schema dict describing the entity structure, or None if not found.
783
+
784
+ Example:
785
+ schema = connector.entity_schema("contacts")
786
+ if schema:
787
+ print(f"Contact properties: {list(schema.get('properties', {}).keys())}")
788
+ """
789
+ entity_def = next(
790
+ (e for e in ZendeskSupportConnectorModel.entities if e.name == entity),
791
+ None
792
+ )
793
+ if entity_def is None:
794
+ logging.getLogger(__name__).warning(
795
+ f"Entity '{entity}' not found. Available entities: "
796
+ f"{[e.name for e in ZendeskSupportConnectorModel.entities]}"
797
+ )
798
+ return entity_def.entity_schema if entity_def else None
799
+
715
800
 
716
801
 
717
802
  class TicketsQuery:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "airbyte-agent-zendesk-support"
3
- version = "0.18.28"
3
+ version = "0.18.30"
4
4
  description = "Airbyte Zendesk-Support Connector for AI platforms"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.9"