airbyte-agent-zendesk-support 0.18.61__py3-none-any.whl → 0.18.70__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.
@@ -62,6 +62,53 @@ class TokenExtractValidationError(ConnectorModelLoaderError):
62
62
  pass
63
63
 
64
64
 
65
+ # Expected auth_mapping keys for each auth type.
66
+ # These are the auth parameters that each security scheme expects, NOT the user's credential field names.
67
+ EXPECTED_AUTH_MAPPING_KEYS: dict[AuthType, set[str]] = {
68
+ AuthType.BEARER: {"token"},
69
+ AuthType.BASIC: {"username", "password"},
70
+ AuthType.API_KEY: {"api_key"},
71
+ AuthType.OAUTH2: {"access_token", "refresh_token", "client_id", "client_secret"},
72
+ }
73
+
74
+
75
+ def _validate_auth_mapping_keys(
76
+ auth_type: AuthType,
77
+ auth_config: AirbyteAuthConfig | None,
78
+ scheme_name: str = "default",
79
+ ) -> None:
80
+ """Validate that auth_mapping keys match expected parameters for the auth type.
81
+
82
+ The auth_mapping keys must be the parameters expected by the security scheme
83
+ (e.g., "token" for bearer), not the user's credential field names.
84
+
85
+ Args:
86
+ auth_type: The authentication type
87
+ auth_config: The x-airbyte-auth-config containing auth_mapping
88
+ scheme_name: Name of the security scheme for error messages
89
+
90
+ Raises:
91
+ InvalidOpenAPIError: If auth_mapping keys don't match expected parameters
92
+ """
93
+ if auth_config is None or auth_config.auth_mapping is None:
94
+ return # No explicit auth_mapping, will use defaults
95
+
96
+ expected_keys = EXPECTED_AUTH_MAPPING_KEYS.get(auth_type)
97
+ if expected_keys is None:
98
+ return # Unknown auth type, skip validation
99
+
100
+ actual_keys = set(auth_config.auth_mapping.keys())
101
+ invalid_keys = actual_keys - expected_keys
102
+
103
+ if invalid_keys:
104
+ raise InvalidOpenAPIError(
105
+ f"Invalid auth_mapping keys for {auth_type.value} auth in scheme '{scheme_name}': {invalid_keys}. "
106
+ f"Expected keys for {auth_type.value}: {sorted(expected_keys)}. "
107
+ f"Note: auth_mapping keys must be the auth parameters (e.g., 'token' for bearer), "
108
+ f'not your credential field names. Use template syntax to map: token: "${{your_field}}"'
109
+ )
110
+
111
+
65
112
  def extract_path_params(path: str) -> list[str]:
66
113
  """Extract parameter names from path template.
67
114
 
@@ -711,7 +758,6 @@ def _generate_default_auth_config(auth_type: AuthType) -> AirbyteAuthConfig:
711
758
  description="Authentication bearer token",
712
759
  format=None,
713
760
  pattern=None,
714
- airbyte_secret=False,
715
761
  default=None,
716
762
  )
717
763
  },
@@ -731,7 +777,6 @@ def _generate_default_auth_config(auth_type: AuthType) -> AirbyteAuthConfig:
731
777
  description="Authentication username",
732
778
  format=None,
733
779
  pattern=None,
734
- airbyte_secret=False,
735
780
  default=None,
736
781
  ),
737
782
  "password": AuthConfigFieldSpec(
@@ -740,7 +785,6 @@ def _generate_default_auth_config(auth_type: AuthType) -> AirbyteAuthConfig:
740
785
  description="Authentication password",
741
786
  format=None,
742
787
  pattern=None,
743
- airbyte_secret=False,
744
788
  default=None,
745
789
  ),
746
790
  },
@@ -760,7 +804,6 @@ def _generate_default_auth_config(auth_type: AuthType) -> AirbyteAuthConfig:
760
804
  description="API authentication key",
761
805
  format=None,
762
806
  pattern=None,
763
- airbyte_secret=False,
764
807
  default=None,
765
808
  )
766
809
  },
@@ -785,7 +828,6 @@ def _generate_default_auth_config(auth_type: AuthType) -> AirbyteAuthConfig:
785
828
  description="OAuth2 access token",
786
829
  format=None,
787
830
  pattern=None,
788
- airbyte_secret=False,
789
831
  default=None,
790
832
  ),
791
833
  "refresh_token": AuthConfigFieldSpec(
@@ -794,7 +836,6 @@ def _generate_default_auth_config(auth_type: AuthType) -> AirbyteAuthConfig:
794
836
  description="OAuth2 refresh token (optional)",
795
837
  format=None,
796
838
  pattern=None,
797
- airbyte_secret=False,
798
839
  default=None,
799
840
  ),
800
841
  "client_id": AuthConfigFieldSpec(
@@ -803,7 +844,6 @@ def _generate_default_auth_config(auth_type: AuthType) -> AirbyteAuthConfig:
803
844
  description="OAuth2 client ID (optional)",
804
845
  format=None,
805
846
  pattern=None,
806
- airbyte_secret=False,
807
847
  default=None,
808
848
  ),
809
849
  "client_secret": AuthConfigFieldSpec(
@@ -812,7 +852,6 @@ def _generate_default_auth_config(auth_type: AuthType) -> AirbyteAuthConfig:
812
852
  description="OAuth2 client secret (optional)",
813
853
  format=None,
814
854
  pattern=None,
815
- airbyte_secret=False,
816
855
  default=None,
817
856
  ),
818
857
  },
@@ -924,6 +963,9 @@ def _parse_single_security_scheme(scheme: Any) -> AuthConfig:
924
963
  oauth2_config = _parse_oauth2_config(scheme)
925
964
  # Use explicit x-airbyte-auth-config if present, otherwise generate default
926
965
  auth_config_obj = scheme.x_airbyte_auth_config or _generate_default_auth_config(AuthType.OAUTH2)
966
+ # Validate auth_mapping keys if explicitly provided
967
+ if scheme.x_airbyte_auth_config:
968
+ _validate_auth_mapping_keys(AuthType.OAUTH2, scheme.x_airbyte_auth_config)
927
969
  return AuthConfig(
928
970
  type=AuthType.OAUTH2,
929
971
  config=oauth2_config,
@@ -934,6 +976,10 @@ def _parse_single_security_scheme(scheme: Any) -> AuthConfig:
934
976
  # Use explicit x-airbyte-auth-config if present, otherwise generate default
935
977
  auth_config_obj = scheme.x_airbyte_auth_config or _generate_default_auth_config(auth_type)
936
978
 
979
+ # Validate auth_mapping keys if explicitly provided
980
+ if scheme.x_airbyte_auth_config:
981
+ _validate_auth_mapping_keys(auth_type, scheme.x_airbyte_auth_config)
982
+
937
983
  return AuthConfig(
938
984
  type=auth_type,
939
985
  config=auth_config,
@@ -490,7 +490,7 @@ class HTTPClient:
490
490
 
491
491
  if not response_text.strip():
492
492
  response_data = {}
493
- elif "application/json" in content_type or not content_type:
493
+ elif "application/json" in content_type or "+json" in content_type or not content_type:
494
494
  response_data = await response.json()
495
495
  else:
496
496
  error_msg = f"Expected JSON response for {method.upper()} {url}, got content-type: {content_type}"
@@ -380,7 +380,11 @@ def describe_entities(model: ConnectorModelProtocol) -> list[dict[str, Any]]:
380
380
  return entities
381
381
 
382
382
 
383
- def generate_tool_description(model: ConnectorModelProtocol) -> str:
383
+ def generate_tool_description(
384
+ model: ConnectorModelProtocol,
385
+ *,
386
+ enable_hosted_mode_features: bool = True,
387
+ ) -> str:
384
388
  """Generate AI tool description from connector metadata.
385
389
 
386
390
  Produces a detailed description that includes:
@@ -393,6 +397,7 @@ def generate_tool_description(model: ConnectorModelProtocol) -> str:
393
397
 
394
398
  Args:
395
399
  model: Object conforming to ConnectorModelProtocol (e.g., ConnectorModel)
400
+ enable_hosted_mode_features: When False, omit hosted-mode search guidance from the docstring.
396
401
 
397
402
  Returns:
398
403
  Formatted description string suitable for AI tool documentation
@@ -402,8 +407,9 @@ def generate_tool_description(model: ConnectorModelProtocol) -> str:
402
407
  # at the first empty line and only keeps the initial section.
403
408
 
404
409
  # Entity/action parameter details (including pagination params like limit, starting_after)
405
- search_field_paths = _collect_search_field_paths(model)
406
- lines.append("ENTITIES AND PARAMETERS:")
410
+ search_field_paths = _collect_search_field_paths(model) if enable_hosted_mode_features else {}
411
+ # Avoid a "PARAMETERS:" header because some docstring parsers treat it as a params section marker.
412
+ lines.append("ENTITIES (ACTIONS + PARAMS):")
407
413
  for entity in model.entities:
408
414
  lines.append(f" {entity.name}:")
409
415
  actions = getattr(entity, "actions", []) or []
@@ -427,8 +433,9 @@ def generate_tool_description(model: ConnectorModelProtocol) -> str:
427
433
  lines.append(" To paginate: pass starting_after=<last_id> while has_more is true")
428
434
 
429
435
  lines.append("GUIDELINES:")
430
- lines.append(' - Prefer cached search over direct API calls when using execute(): action="search" whenever possible.')
431
- lines.append(" - Direct API actions (list/get/download) are slower and should be used only if search cannot answer the query.")
436
+ if enable_hosted_mode_features:
437
+ lines.append(' - Prefer cached search over direct API calls when using execute(): action="search" whenever possible.')
438
+ lines.append(" - Direct API actions (list/get/download) are slower and should be used only if search cannot answer the query.")
432
439
  lines.append(" - Keep results small: use params.fields, params.query.filter, small params.limit, and cursor pagination.")
433
440
  lines.append(" - If output is too large, refine the query with tighter filters/fields/limit.")
434
441
 
@@ -55,7 +55,6 @@ class AuthConfigFieldSpec(BaseModel):
55
55
  description: str | None = None
56
56
  format: str | None = None # e.g., "email", "uri"
57
57
  pattern: str | None = None # Regex validation
58
- airbyte_secret: bool = Field(False, alias="airbyte_secret")
59
58
  default: Any | None = None
60
59
 
61
60
 
@@ -207,7 +207,7 @@ class ZendeskSupportConnector:
207
207
  """
208
208
 
209
209
  connector_name = "zendesk-support"
210
- connector_version = "0.1.8"
210
+ connector_version = "0.1.9"
211
211
  vendored_sdk_version = "0.1.0" # Version of vendored connector-sdk
212
212
 
213
213
  # Map of (entity, action) -> needs_envelope for envelope wrapping decision
@@ -817,6 +817,7 @@ class ZendeskSupportConnector:
817
817
  func: _F | None = None,
818
818
  *,
819
819
  update_docstring: bool = True,
820
+ enable_hosted_mode_features: bool = True,
820
821
  max_output_chars: int | None = DEFAULT_MAX_OUTPUT_CHARS,
821
822
  ) -> _F | Callable[[_F], _F]:
822
823
  """
@@ -835,12 +836,16 @@ class ZendeskSupportConnector:
835
836
 
836
837
  Args:
837
838
  update_docstring: When True, append connector capabilities to __doc__.
839
+ enable_hosted_mode_features: When False, omit hosted-mode search sections from docstrings.
838
840
  max_output_chars: Max serialized output size before raising. Use None to disable.
839
841
  """
840
842
 
841
843
  def decorate(inner: _F) -> _F:
842
844
  if update_docstring:
843
- description = generate_tool_description(ZendeskSupportConnectorModel)
845
+ description = generate_tool_description(
846
+ ZendeskSupportConnectorModel,
847
+ enable_hosted_mode_features=enable_hosted_mode_features,
848
+ )
844
849
  original_doc = inner.__doc__ or ""
845
850
  if original_doc.strip():
846
851
  full_doc = f"{original_doc.strip()}\n{description}"
@@ -30,7 +30,7 @@ from uuid import (
30
30
  ZendeskSupportConnectorModel: ConnectorModel = ConnectorModel(
31
31
  id=UUID('79c1aa37-dae3-42ae-b333-d1c105477715'),
32
32
  name='zendesk-support',
33
- version='0.1.8',
33
+ version='0.1.9',
34
34
  base_url='https://{subdomain}.zendesk.com/api/v2',
35
35
  auth=AuthConfig(
36
36
  options=[
@@ -51,12 +51,10 @@ ZendeskSupportConnectorModel: ConnectorModel = ConnectorModel(
51
51
  'access_token': AuthConfigFieldSpec(
52
52
  title='Access Token',
53
53
  description='OAuth 2.0 access token',
54
- airbyte_secret=True,
55
54
  ),
56
55
  'refresh_token': AuthConfigFieldSpec(
57
56
  title='Refresh Token',
58
57
  description='OAuth 2.0 refresh token (optional)',
59
- airbyte_secret=True,
60
58
  ),
61
59
  },
62
60
  auth_mapping={'access_token': '${access_token}', 'refresh_token': '${refresh_token}'},
@@ -80,7 +78,6 @@ ZendeskSupportConnectorModel: ConnectorModel = ConnectorModel(
80
78
  'api_token': AuthConfigFieldSpec(
81
79
  title='API Token',
82
80
  description='Your Zendesk API token from Admin Center',
83
- airbyte_secret=True,
84
81
  ),
85
82
  },
86
83
  auth_mapping={'username': '${email}/token', 'password': '${api_token}'},
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: airbyte-agent-zendesk-support
3
- Version: 0.18.61
3
+ Version: 0.18.70
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/
@@ -104,7 +104,7 @@ This example assumes you've already authenticated your connector with Airbyte. S
104
104
  from airbyte_agent_zendesk-support import ZendeskSupportConnector
105
105
 
106
106
  connector = ZendeskSupportConnector(
107
- external_user_id="<your-scoped-token>",
107
+ external_user_id="<your_external_user_id>",
108
108
  airbyte_client_id="<your-client-id>",
109
109
  airbyte_client_secret="<your-client-secret>"
110
110
  )
@@ -115,10 +115,11 @@ async def zendesk-support_execute(entity: str, action: str, params: dict | None
115
115
  return await connector.execute(entity, action, params or {})
116
116
  ```
117
117
 
118
-
119
118
  ## Full documentation
120
119
 
121
- This connector supports the following entities and actions.
120
+ ### Entities and actions
121
+
122
+ This connector supports the following entities and actions. For more details, see this connector's [full reference documentation](REFERENCE.md).
122
123
 
123
124
  | Entity | Actions |
124
125
  |--------|---------|
@@ -146,14 +147,16 @@ This connector supports the following entities and actions.
146
147
  | Article Attachments | [List](./REFERENCE.md#article-attachments-list), [Get](./REFERENCE.md#article-attachments-get), [Download](./REFERENCE.md#article-attachments-download) |
147
148
 
148
149
 
149
- For all authentication options, see the connector's [authentication documentation](AUTH.md).
150
+ ### Authentication and configuration
151
+
152
+ For all authentication and configuration options, see the connector's [authentication documentation](AUTH.md).
150
153
 
151
- For detailed documentation on available actions and parameters, see this connector's [full reference documentation](./REFERENCE.md).
154
+ ### Zendesk-Support API docs
152
155
 
153
- For the service's official API docs, see the [Zendesk-Support API reference](https://developer.zendesk.com/api-reference/ticketing/introduction/).
156
+ See the official [Zendesk-Support API reference](https://developer.zendesk.com/api-reference/ticketing/introduction/).
154
157
 
155
158
  ## Version information
156
159
 
157
- - **Package version:** 0.18.61
158
- - **Connector version:** 0.1.8
159
- - **Generated with Connector SDK commit SHA:** 609c1d86c76b36ff699b57123a5a8c2050d958c3
160
+ - **Package version:** 0.18.70
161
+ - **Connector version:** 0.1.9
162
+ - **Generated with Connector SDK commit SHA:** 97007bbdad3a6ac982ee2c0cdd667acdb5c12d3c
@@ -1,18 +1,18 @@
1
1
  airbyte_agent_zendesk_support/__init__.py,sha256=RRAGu8AUU7OjMyGJvktoZvll1v7qxgw25mzqjBdODy4,9451
2
- airbyte_agent_zendesk_support/connector.py,sha256=9GH3iQoh0qLuNIniIcsK0NrLtfj74cOgwgw_F9uLDvQ,112326
3
- airbyte_agent_zendesk_support/connector_model.py,sha256=VzQ5r4qcDwO4DX7kxZ_KvKKUQPkj75XYVorin6ZUkyk,248812
2
+ airbyte_agent_zendesk_support/connector.py,sha256=SUHbKrQDtPMKninrNViyZPo2ilrFbefQCFPJBu4CDjE,112595
3
+ airbyte_agent_zendesk_support/connector_model.py,sha256=XfzcAOuvFimu2t_502eRWeymlCd3z6Ts6oA4xr_WVos,248665
4
4
  airbyte_agent_zendesk_support/models.py,sha256=mUZBBOkxmXJWHc-AGTJheWfDQ_I7RiJSddyXp4Di8tI,63349
5
5
  airbyte_agent_zendesk_support/types.py,sha256=ZNi-YzBv9K0Tmkm5xfEomuWyG59VG4zxTsxh9q9zcHw,162971
6
6
  airbyte_agent_zendesk_support/_vendored/__init__.py,sha256=ILl7AHXMui__swyrjxrh9yRa4dLiwBvV6axPWFWty80,38
7
7
  airbyte_agent_zendesk_support/_vendored/connector_sdk/__init__.py,sha256=T5o7roU6NSpH-lCAGZ338sE5dlh4ZU6i6IkeG1zpems,1949
8
8
  airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_strategies.py,sha256=5Sb9moUp623o67Q2wMa8iZldJH08y4gQdoutoO_75Iw,42088
9
9
  airbyte_agent_zendesk_support/_vendored/connector_sdk/auth_template.py,sha256=nju4jqlFC_KI82ILNumNIyiUtRJcy7J94INIZ0QraI4,4454
10
- airbyte_agent_zendesk_support/_vendored/connector_sdk/connector_model_loader.py,sha256=nCu6oym6LoKrS94NTivU1vyQE_qnU-rhx8ExpuOX_LU,39544
10
+ airbyte_agent_zendesk_support/_vendored/connector_sdk/connector_model_loader.py,sha256=AW9bsdggzuc3ydy2bYYF33L6LxLKLQer9Wm47IOuQw0,41492
11
11
  airbyte_agent_zendesk_support/_vendored/connector_sdk/constants.py,sha256=AtzOvhDMWbRJgpsQNWl5tkogHD6mWgEY668PgRmgtOY,2737
12
12
  airbyte_agent_zendesk_support/_vendored/connector_sdk/exceptions.py,sha256=ss5MGv9eVPmsbLcLWetuu3sDmvturwfo6Pw3M37Oq5k,481
13
13
  airbyte_agent_zendesk_support/_vendored/connector_sdk/extensions.py,sha256=XWRRoJOOrwUHSKbuQt5DU7CCu8ePzhd_HuP7c_uD77w,21376
14
- airbyte_agent_zendesk_support/_vendored/connector_sdk/http_client.py,sha256=yucwu3OvJh5wLQa1mk-gTKjtqjKKucMw5ltmlE7mk1c,28000
15
- airbyte_agent_zendesk_support/_vendored/connector_sdk/introspection.py,sha256=kRVI4TDQDLdcCnTBUML8ycAtdqAQufVh-027sMkb4i8,19165
14
+ airbyte_agent_zendesk_support/_vendored/connector_sdk/http_client.py,sha256=09Fclbq4wrg38EM2Yh2kHiykQVXqdAGby024elcEz8E,28027
15
+ airbyte_agent_zendesk_support/_vendored/connector_sdk/introspection.py,sha256=e9uWn2ofpeehoBbzNgts_bjlKLn8ayA1Y3OpDC3b7ZA,19517
16
16
  airbyte_agent_zendesk_support/_vendored/connector_sdk/secrets.py,sha256=J9ezMu4xNnLW11xY5RCre6DHP7YMKZCqwGJfk7ufHAM,6855
17
17
  airbyte_agent_zendesk_support/_vendored/connector_sdk/types.py,sha256=in8gHsn5nsScujOfHZmkOgNmqmJKiPyNNjg59m5fGWc,8807
18
18
  airbyte_agent_zendesk_support/_vendored/connector_sdk/utils.py,sha256=G4LUXOC2HzPoND2v4tQW68R9uuPX9NQyCjaGxb7Kpl0,1958
@@ -47,11 +47,11 @@ airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/components.py,sha25
47
47
  airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/connector.py,sha256=mSZk1wr2YSdRj9tTRsPAuIlCzd_xZLw-Bzl1sMwE0rE,3731
48
48
  airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/extensions.py,sha256=5hgpFHK7fzpzegCkJk882DeIP79bCx_qairKJhvPMZ8,9590
49
49
  airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/operations.py,sha256=RpzGtAI4yvAtMHAfMUMcUwgHv_qJojnKlNb75_agUF8,5729
50
- airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/security.py,sha256=6ljzf_JHs4amnQX9AhePcEsT8P3ZnTSC4xeg7-cvsNQ,9100
50
+ airbyte_agent_zendesk_support/_vendored/connector_sdk/schema/security.py,sha256=1CVCavrPdHHyk7B6JtUD75yRS_hWLCemZF1zwGbdqxg,9036
51
51
  airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/__init__.py,sha256=RaLgkBU4dfxn1LC5Y0Q9rr2PJbrwjxvPgBLmq8_WafE,211
52
52
  airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/config.py,sha256=tLmQwAFD0kP1WyBGWBS3ysaudN9H3e-3EopKZi6cGKg,885
53
53
  airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/events.py,sha256=8Y1NbXiwISX-V_wRofY7PqcwEXD0dLMnntKkY6XFU2s,1328
54
54
  airbyte_agent_zendesk_support/_vendored/connector_sdk/telemetry/tracker.py,sha256=Ftrk0_ddfM7dZG8hF9xBuPwhbc9D6JZ7Q9qs5o3LEyA,5579
55
- airbyte_agent_zendesk_support-0.18.61.dist-info/METADATA,sha256=j8Se2o7sc1-FEzhl9DzvDlkceEgVHtCboutoEF_CXvY,7255
56
- airbyte_agent_zendesk_support-0.18.61.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
57
- airbyte_agent_zendesk_support-0.18.61.dist-info/RECORD,,
55
+ airbyte_agent_zendesk_support-0.18.70.dist-info/METADATA,sha256=zG-4n7FRXUS4Id8KLV-cKy079rPphbup8_3R7CraVeQ,7293
56
+ airbyte_agent_zendesk_support-0.18.70.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
57
+ airbyte_agent_zendesk_support-0.18.70.dist-info/RECORD,,