airbyte-agent-zendesk-support 0.18.48__tar.gz → 0.18.49__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.
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/CHANGELOG.md +5 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/PKG-INFO +3 -3
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/README.md +2 -2
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/local_executor.py +101 -20
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http_client.py +11 -6
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/pyproject.toml +1 -1
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/.gitignore +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/REFERENCE.md +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/__init__.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/__init__.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/__init__.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_strategies.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_template.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/cloud_utils/__init__.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/cloud_utils/client.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/connector_model_loader.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/constants.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/exceptions.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/__init__.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/hosted_executor.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/executor/models.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/extensions.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/__init__.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/adapters/__init__.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/adapters/httpx_adapter.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/config.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/exceptions.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/protocols.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/http/response.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/introspection.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/__init__.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/logger.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/logging/types.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/__init__.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/config.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/models.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/redactor.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/observability/session.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/__init__.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/instrumentation.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/performance/metrics.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/__init__.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/base.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/components.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/connector.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/extensions.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/operations.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/security.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/secrets.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/__init__.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/config.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/events.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/tracker.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/types.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/utils.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/_vendored/connector_sdk/validation.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/connector.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/connector_model.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/models.py +0 -0
- {airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/airbyte_agent_zendesk_support/types.py +0 -0
{airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/CHANGELOG.md
RENAMED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# Zendesk Support changelog
|
|
2
2
|
|
|
3
|
+
## [0.18.49] - 2026-01-16
|
|
4
|
+
- Updated connector definition (YAML version 0.1.6)
|
|
5
|
+
- Source commit: 49673b7b
|
|
6
|
+
- SDK version: 0.1.0
|
|
7
|
+
|
|
3
8
|
## [0.18.48] - 2026-01-16
|
|
4
9
|
- Updated connector definition (YAML version 0.1.6)
|
|
5
10
|
- Source commit: 05c940e3
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: airbyte-agent-zendesk-support
|
|
3
|
-
Version: 0.18.
|
|
3
|
+
Version: 0.18.49
|
|
4
4
|
Summary: Airbyte Zendesk-Support Connector for AI platforms
|
|
5
5
|
Project-URL: Homepage, https://github.com/airbytehq/airbyte-agent-connectors
|
|
6
6
|
Project-URL: Documentation, https://docs.airbyte.com/ai-agents/
|
|
@@ -140,6 +140,6 @@ For the service's official API docs, see the [Zendesk-Support API reference](htt
|
|
|
140
140
|
|
|
141
141
|
## Version information
|
|
142
142
|
|
|
143
|
-
- **Package version:** 0.18.
|
|
143
|
+
- **Package version:** 0.18.49
|
|
144
144
|
- **Connector version:** 0.1.6
|
|
145
|
-
- **Generated with Connector SDK commit SHA:**
|
|
145
|
+
- **Generated with Connector SDK commit SHA:** 49673b7bd7003c15994897987408c7722319c739
|
|
@@ -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.
|
|
110
|
+
- **Package version:** 0.18.49
|
|
111
111
|
- **Connector version:** 0.1.6
|
|
112
|
-
- **Generated with Connector SDK commit SHA:**
|
|
112
|
+
- **Generated with Connector SDK commit SHA:** 49673b7bd7003c15994897987408c7722319c739
|
|
@@ -1222,15 +1222,22 @@ class LocalExecutor:
|
|
|
1222
1222
|
def _extract_metadata(
|
|
1223
1223
|
self,
|
|
1224
1224
|
response_data: dict[str, Any],
|
|
1225
|
+
response_headers: dict[str, str],
|
|
1225
1226
|
endpoint: EndpointDefinition,
|
|
1226
1227
|
) -> dict[str, Any] | None:
|
|
1227
1228
|
"""Extract metadata from response using meta extractor.
|
|
1228
1229
|
|
|
1229
|
-
Each field in meta_extractor dict is independently extracted using JSONPath
|
|
1230
|
+
Each field in meta_extractor dict is independently extracted using JSONPath
|
|
1231
|
+
for body extraction, or special prefixes for header extraction:
|
|
1232
|
+
- @link.{rel}: Extract URL from RFC 5988 Link header by rel type
|
|
1233
|
+
- @header.{name}: Extract raw header value by header name
|
|
1234
|
+
- Otherwise: JSONPath expression for body extraction
|
|
1235
|
+
|
|
1230
1236
|
Missing or invalid paths result in None for that field (no crash).
|
|
1231
1237
|
|
|
1232
1238
|
Args:
|
|
1233
1239
|
response_data: Full API response (before record extraction)
|
|
1240
|
+
response_headers: HTTP response headers
|
|
1234
1241
|
endpoint: Endpoint with optional meta extractor configuration
|
|
1235
1242
|
|
|
1236
1243
|
Returns:
|
|
@@ -1241,11 +1248,15 @@ class LocalExecutor:
|
|
|
1241
1248
|
Example:
|
|
1242
1249
|
meta_extractor = {
|
|
1243
1250
|
"pagination": "$.records",
|
|
1244
|
-
"request_id": "$.requestId"
|
|
1251
|
+
"request_id": "$.requestId",
|
|
1252
|
+
"next_page_url": "@link.next",
|
|
1253
|
+
"rate_limit": "@header.X-RateLimit-Remaining"
|
|
1245
1254
|
}
|
|
1246
1255
|
Returns: {
|
|
1247
1256
|
"pagination": {"cursor": "abc", "total": 100},
|
|
1248
|
-
"request_id": "xyz123"
|
|
1257
|
+
"request_id": "xyz123",
|
|
1258
|
+
"next_page_url": "https://api.example.com/data?cursor=abc",
|
|
1259
|
+
"rate_limit": "99"
|
|
1249
1260
|
}
|
|
1250
1261
|
"""
|
|
1251
1262
|
# Check if endpoint has meta extractor
|
|
@@ -1255,26 +1266,96 @@ class LocalExecutor:
|
|
|
1255
1266
|
extracted_meta: dict[str, Any] = {}
|
|
1256
1267
|
|
|
1257
1268
|
# Extract each field independently
|
|
1258
|
-
for field_name,
|
|
1269
|
+
for field_name, extractor_expr in endpoint.meta_extractor.items():
|
|
1259
1270
|
try:
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
#
|
|
1266
|
-
|
|
1271
|
+
if extractor_expr.startswith("@link."):
|
|
1272
|
+
# RFC 5988 Link header extraction
|
|
1273
|
+
rel = extractor_expr[6:]
|
|
1274
|
+
extracted_meta[field_name] = self._extract_link_url(response_headers, rel)
|
|
1275
|
+
elif extractor_expr.startswith("@header."):
|
|
1276
|
+
# Raw header value extraction (case-insensitive lookup)
|
|
1277
|
+
header_name = extractor_expr[8:]
|
|
1278
|
+
extracted_meta[field_name] = self._get_header_value(response_headers, header_name)
|
|
1267
1279
|
else:
|
|
1268
|
-
#
|
|
1269
|
-
|
|
1280
|
+
# JSONPath body extraction
|
|
1281
|
+
jsonpath_expr = parse_jsonpath(extractor_expr)
|
|
1282
|
+
matches = [match.value for match in jsonpath_expr.find(response_data)]
|
|
1283
|
+
|
|
1284
|
+
if matches:
|
|
1285
|
+
# Return first match (most common case)
|
|
1286
|
+
extracted_meta[field_name] = matches[0]
|
|
1287
|
+
else:
|
|
1288
|
+
# Path not found - set to None
|
|
1289
|
+
extracted_meta[field_name] = None
|
|
1270
1290
|
|
|
1271
1291
|
except Exception as e:
|
|
1272
1292
|
# Log error but continue with other fields
|
|
1273
|
-
logging.warning(f"Failed to apply meta extractor for field '{field_name}' with
|
|
1293
|
+
logging.warning(f"Failed to apply meta extractor for field '{field_name}' with expression '{extractor_expr}': {e}. Setting to None.")
|
|
1274
1294
|
extracted_meta[field_name] = None
|
|
1275
1295
|
|
|
1276
1296
|
return extracted_meta
|
|
1277
1297
|
|
|
1298
|
+
@staticmethod
|
|
1299
|
+
def _extract_link_url(headers: dict[str, str], rel: str) -> str | None:
|
|
1300
|
+
"""Extract URL from RFC 5988 Link header by rel type.
|
|
1301
|
+
|
|
1302
|
+
Parses Link header format: <url>; param1="value1"; rel="next"; param2="value2"
|
|
1303
|
+
|
|
1304
|
+
Supports:
|
|
1305
|
+
- Multiple parameters per link in any order
|
|
1306
|
+
- Both quoted and unquoted rel values
|
|
1307
|
+
- Multiple links separated by commas
|
|
1308
|
+
|
|
1309
|
+
Args:
|
|
1310
|
+
headers: Response headers dict
|
|
1311
|
+
rel: The rel type to extract (e.g., "next", "prev", "first", "last")
|
|
1312
|
+
|
|
1313
|
+
Returns:
|
|
1314
|
+
The URL for the specified rel type, or None if not found
|
|
1315
|
+
"""
|
|
1316
|
+
link_header = headers.get("Link") or headers.get("link", "")
|
|
1317
|
+
if not link_header:
|
|
1318
|
+
return None
|
|
1319
|
+
|
|
1320
|
+
for link_segment in re.split(r",(?=\s*<)", link_header):
|
|
1321
|
+
link_segment = link_segment.strip()
|
|
1322
|
+
|
|
1323
|
+
url_match = re.match(r"<([^>]+)>", link_segment)
|
|
1324
|
+
if not url_match:
|
|
1325
|
+
continue
|
|
1326
|
+
|
|
1327
|
+
url = url_match.group(1)
|
|
1328
|
+
params_str = link_segment[url_match.end() :]
|
|
1329
|
+
|
|
1330
|
+
rel_match = re.search(r';\s*rel="?([^";,]+)"?', params_str, re.IGNORECASE)
|
|
1331
|
+
if rel_match and rel_match.group(1).strip() == rel:
|
|
1332
|
+
return url
|
|
1333
|
+
|
|
1334
|
+
return None
|
|
1335
|
+
|
|
1336
|
+
@staticmethod
|
|
1337
|
+
def _get_header_value(headers: dict[str, str], header_name: str) -> str | None:
|
|
1338
|
+
"""Get header value with case-insensitive lookup.
|
|
1339
|
+
|
|
1340
|
+
Args:
|
|
1341
|
+
headers: Response headers dict
|
|
1342
|
+
header_name: Header name to look up
|
|
1343
|
+
|
|
1344
|
+
Returns:
|
|
1345
|
+
Header value or None if not found
|
|
1346
|
+
"""
|
|
1347
|
+
# Try exact match first
|
|
1348
|
+
if header_name in headers:
|
|
1349
|
+
return headers[header_name]
|
|
1350
|
+
|
|
1351
|
+
# Case-insensitive lookup
|
|
1352
|
+
header_name_lower = header_name.lower()
|
|
1353
|
+
for key, value in headers.items():
|
|
1354
|
+
if key.lower() == header_name_lower:
|
|
1355
|
+
return value
|
|
1356
|
+
|
|
1357
|
+
return None
|
|
1358
|
+
|
|
1278
1359
|
def _validate_required_body_fields(self, endpoint: Any, params: dict[str, Any], action: Action, entity: str) -> None:
|
|
1279
1360
|
"""Validate that required body fields are present for CREATE/UPDATE operations.
|
|
1280
1361
|
|
|
@@ -1402,7 +1483,7 @@ class _StandardOperationHandler:
|
|
|
1402
1483
|
request_kwargs = self.ctx.determine_request_format(endpoint, body)
|
|
1403
1484
|
|
|
1404
1485
|
# Execute async HTTP request
|
|
1405
|
-
|
|
1486
|
+
response_data, response_headers = await self.ctx.http_client.request(
|
|
1406
1487
|
method=endpoint.method,
|
|
1407
1488
|
path=path,
|
|
1408
1489
|
params=query_params if query_params else None,
|
|
@@ -1411,10 +1492,10 @@ class _StandardOperationHandler:
|
|
|
1411
1492
|
)
|
|
1412
1493
|
|
|
1413
1494
|
# Extract metadata from original response (before record extraction)
|
|
1414
|
-
metadata = self.ctx.executor._extract_metadata(
|
|
1495
|
+
metadata = self.ctx.executor._extract_metadata(response_data, response_headers, endpoint)
|
|
1415
1496
|
|
|
1416
1497
|
# Extract records if extractor configured
|
|
1417
|
-
response = self.ctx.extract_records(
|
|
1498
|
+
response = self.ctx.extract_records(response_data, endpoint)
|
|
1418
1499
|
|
|
1419
1500
|
# Assume success with 200 status code if no exception raised
|
|
1420
1501
|
status_code = 200
|
|
@@ -1540,7 +1621,7 @@ class _DownloadOperationHandler:
|
|
|
1540
1621
|
request_format = self.ctx.determine_request_format(operation, request_body)
|
|
1541
1622
|
self.ctx.validate_required_body_fields(operation, params, action, entity)
|
|
1542
1623
|
|
|
1543
|
-
metadata_response = await self.ctx.http_client.request(
|
|
1624
|
+
metadata_response, _ = await self.ctx.http_client.request(
|
|
1544
1625
|
method=operation.method,
|
|
1545
1626
|
path=path,
|
|
1546
1627
|
params=query_params,
|
|
@@ -1555,7 +1636,7 @@ class _DownloadOperationHandler:
|
|
|
1555
1636
|
)
|
|
1556
1637
|
|
|
1557
1638
|
# Step 3: Stream file from extracted URL
|
|
1558
|
-
file_response = await self.ctx.http_client.request(
|
|
1639
|
+
file_response, _ = await self.ctx.http_client.request(
|
|
1559
1640
|
method="GET",
|
|
1560
1641
|
path=file_url,
|
|
1561
1642
|
headers=headers,
|
|
@@ -1563,7 +1644,7 @@ class _DownloadOperationHandler:
|
|
|
1563
1644
|
)
|
|
1564
1645
|
else:
|
|
1565
1646
|
# One-step direct download: stream file directly from endpoint
|
|
1566
|
-
file_response = await self.ctx.http_client.request(
|
|
1647
|
+
file_response, _ = await self.ctx.http_client.request(
|
|
1567
1648
|
method=operation.method,
|
|
1568
1649
|
path=path,
|
|
1569
1650
|
params=query_params,
|
|
@@ -421,10 +421,14 @@ class HTTPClient:
|
|
|
421
421
|
headers: dict[str, str] | None = None,
|
|
422
422
|
*,
|
|
423
423
|
stream: bool = False,
|
|
424
|
-
):
|
|
424
|
+
) -> tuple[dict[str, Any], dict[str, str]]:
|
|
425
425
|
"""Execute a single HTTP request attempt (no retries).
|
|
426
426
|
|
|
427
427
|
This is the core request logic, separated from retry handling.
|
|
428
|
+
|
|
429
|
+
Returns:
|
|
430
|
+
Tuple of (response_data, response_headers) for non-streaming requests.
|
|
431
|
+
For streaming requests, returns (response_object, response_headers).
|
|
428
432
|
"""
|
|
429
433
|
# Ensure auth credentials are initialized (proactive refresh if needed)
|
|
430
434
|
await self._ensure_auth_initialized()
|
|
@@ -475,7 +479,7 @@ class HTTPClient:
|
|
|
475
479
|
status_code=status_code,
|
|
476
480
|
response_body=f"<binary content, {response.headers.get('content-length', 'unknown')} bytes>",
|
|
477
481
|
)
|
|
478
|
-
return response
|
|
482
|
+
return response, dict(response.headers)
|
|
479
483
|
|
|
480
484
|
# Parse response - handle non-JSON responses gracefully
|
|
481
485
|
content_type = response.headers.get("content-type", "")
|
|
@@ -501,7 +505,7 @@ class HTTPClient:
|
|
|
501
505
|
status_code=status_code,
|
|
502
506
|
response_body=response_data,
|
|
503
507
|
)
|
|
504
|
-
return response_data
|
|
508
|
+
return response_data, dict(response.headers)
|
|
505
509
|
|
|
506
510
|
except AuthenticationError as e:
|
|
507
511
|
# Auth error (401, 403) - handle token refresh
|
|
@@ -631,7 +635,7 @@ class HTTPClient:
|
|
|
631
635
|
*,
|
|
632
636
|
stream: bool = False,
|
|
633
637
|
_auth_retry_attempted: bool = False,
|
|
634
|
-
):
|
|
638
|
+
) -> tuple[dict[str, Any], dict[str, str]]:
|
|
635
639
|
"""Make an async HTTP request with optional streaming and automatic retries.
|
|
636
640
|
|
|
637
641
|
Args:
|
|
@@ -644,8 +648,9 @@ class HTTPClient:
|
|
|
644
648
|
stream: If True, do not eagerly read the body (useful for downloads)
|
|
645
649
|
|
|
646
650
|
Returns:
|
|
647
|
-
|
|
648
|
-
- If stream=
|
|
651
|
+
Tuple of (response_data, response_headers):
|
|
652
|
+
- If stream=False: (parsed JSON dict or empty dict, response headers dict)
|
|
653
|
+
- If stream=True: (response object suitable for streaming, response headers dict)
|
|
649
654
|
|
|
650
655
|
Raises:
|
|
651
656
|
HTTPStatusError: If request fails with 4xx/5xx status after all retries
|
|
File without changes
|
{airbyte_agent_zendesk_support-0.18.48 → airbyte_agent_zendesk_support-0.18.49}/REFERENCE.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|