airbyte-agent-hubspot 0.15.25__py3-none-any.whl → 0.15.28__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.
@@ -22,9 +22,9 @@ from .models import (
22
22
  Ticket,
23
23
  TicketsList,
24
24
  SchemaAssociationsItem,
25
- SchemaLabels,
26
25
  SchemaPropertiesItemModificationmetadata,
27
26
  SchemaPropertiesItem,
27
+ SchemaLabels,
28
28
  Schema,
29
29
  SchemasList,
30
30
  CRMObjectProperties,
@@ -83,4 +83,4 @@ from .types import (
83
83
  ObjectsGetParams
84
84
  )
85
85
 
86
- __all__ = ["HubspotConnector", "HubspotAuthConfig", "ContactProperties", "Contact", "PagingNext", "Paging", "ContactsList", "CompanyProperties", "Company", "CompaniesList", "DealProperties", "Deal", "DealsList", "TicketProperties", "Ticket", "TicketsList", "SchemaAssociationsItem", "SchemaLabels", "SchemaPropertiesItemModificationmetadata", "SchemaPropertiesItem", "Schema", "SchemasList", "CRMObjectProperties", "CRMObject", "ObjectsList", "ContactsListResultMeta", "ContactsSearchResultMeta", "CompaniesListResultMeta", "CompaniesSearchResultMeta", "DealsListResultMeta", "DealsSearchResultMeta", "TicketsListResultMeta", "TicketsSearchResultMeta", "ObjectsListResultMeta", "HubspotExecuteResult", "HubspotExecuteResultWithMeta", "ContactsListResult", "ContactsSearchResult", "CompaniesListResult", "CompaniesSearchResult", "DealsListResult", "DealsSearchResult", "TicketsListResult", "TicketsSearchResult", "SchemasListResult", "ObjectsListResult", "ContactsSearchParamsFiltergroupsItemFiltersItem", "ContactsSearchParamsFiltergroupsItem", "ContactsSearchParamsSortsItem", "CompaniesSearchParamsFiltergroupsItemFiltersItem", "CompaniesSearchParamsFiltergroupsItem", "CompaniesSearchParamsSortsItem", "DealsSearchParamsFiltergroupsItemFiltersItem", "DealsSearchParamsFiltergroupsItem", "DealsSearchParamsSortsItem", "TicketsSearchParamsFiltergroupsItemFiltersItem", "TicketsSearchParamsFiltergroupsItem", "TicketsSearchParamsSortsItem", "ContactsListParams", "ContactsGetParams", "ContactsSearchParams", "CompaniesListParams", "CompaniesGetParams", "CompaniesSearchParams", "DealsListParams", "DealsGetParams", "DealsSearchParams", "TicketsListParams", "TicketsGetParams", "TicketsSearchParams", "SchemasListParams", "SchemasGetParams", "ObjectsListParams", "ObjectsGetParams"]
86
+ __all__ = ["HubspotConnector", "HubspotAuthConfig", "ContactProperties", "Contact", "PagingNext", "Paging", "ContactsList", "CompanyProperties", "Company", "CompaniesList", "DealProperties", "Deal", "DealsList", "TicketProperties", "Ticket", "TicketsList", "SchemaAssociationsItem", "SchemaPropertiesItemModificationmetadata", "SchemaPropertiesItem", "SchemaLabels", "Schema", "SchemasList", "CRMObjectProperties", "CRMObject", "ObjectsList", "ContactsListResultMeta", "ContactsSearchResultMeta", "CompaniesListResultMeta", "CompaniesSearchResultMeta", "DealsListResultMeta", "DealsSearchResultMeta", "TicketsListResultMeta", "TicketsSearchResultMeta", "ObjectsListResultMeta", "HubspotExecuteResult", "HubspotExecuteResultWithMeta", "ContactsListResult", "ContactsSearchResult", "CompaniesListResult", "CompaniesSearchResult", "DealsListResult", "DealsSearchResult", "TicketsListResult", "TicketsSearchResult", "SchemasListResult", "ObjectsListResult", "ContactsSearchParamsFiltergroupsItemFiltersItem", "ContactsSearchParamsFiltergroupsItem", "ContactsSearchParamsSortsItem", "CompaniesSearchParamsFiltergroupsItemFiltersItem", "CompaniesSearchParamsFiltergroupsItem", "CompaniesSearchParamsSortsItem", "DealsSearchParamsFiltergroupsItemFiltersItem", "DealsSearchParamsFiltergroupsItem", "DealsSearchParamsSortsItem", "TicketsSearchParamsFiltergroupsItemFiltersItem", "TicketsSearchParamsFiltergroupsItem", "TicketsSearchParamsSortsItem", "ContactsListParams", "ContactsGetParams", "ContactsSearchParams", "CompaniesListParams", "CompaniesGetParams", "CompaniesSearchParams", "DealsListParams", "DealsGetParams", "DealsSearchParams", "TicketsListParams", "TicketsGetParams", "TicketsSearchParams", "SchemasListParams", "SchemasGetParams", "ObjectsListParams", "ObjectsGetParams"]
@@ -674,16 +674,16 @@ class LocalExecutor:
674
674
  return {key: value for key, value in params.items() if key in allowed_params}
675
675
 
676
676
  def _extract_body(self, allowed_fields: list[str], params: dict[str, Any]) -> dict[str, Any]:
677
- """Extract body fields from params.
677
+ """Extract body fields from params, filtering out None values.
678
678
 
679
679
  Args:
680
680
  allowed_fields: List of allowed body field names
681
681
  params: All parameters
682
682
 
683
683
  Returns:
684
- Dictionary of body fields
684
+ Dictionary of body fields with None values filtered out
685
685
  """
686
- return {key: value for key, value in params.items() if key in allowed_fields}
686
+ return {key: value for key, value in params.items() if key in allowed_fields and value is not None}
687
687
 
688
688
  def _serialize_deep_object_params(self, params: dict[str, Any], deep_object_param_names: list[str]) -> dict[str, Any]:
689
689
  """Serialize deepObject parameters to bracket notation format.
@@ -837,7 +837,9 @@ class LocalExecutor:
837
837
  Request body dict or None if no body needed
838
838
  """
839
839
  if endpoint.graphql_body:
840
- return self._build_graphql_body(endpoint.graphql_body, params)
840
+ # Extract defaults from query_params_schema for GraphQL variable interpolation
841
+ param_defaults = {name: schema.get("default") for name, schema in endpoint.query_params_schema.items() if "default" in schema}
842
+ return self._build_graphql_body(endpoint.graphql_body, params, param_defaults)
841
843
  elif endpoint.body_fields:
842
844
  return self._extract_body(endpoint.body_fields, params)
843
845
  return None
@@ -903,12 +905,18 @@ class LocalExecutor:
903
905
 
904
906
  return query
905
907
 
906
- def _build_graphql_body(self, graphql_config: dict[str, Any], params: dict[str, Any]) -> dict[str, Any]:
908
+ def _build_graphql_body(
909
+ self,
910
+ graphql_config: dict[str, Any],
911
+ params: dict[str, Any],
912
+ param_defaults: dict[str, Any] | None = None,
913
+ ) -> dict[str, Any]:
907
914
  """Build GraphQL request body with variable substitution and field selection.
908
915
 
909
916
  Args:
910
917
  graphql_config: GraphQL configuration from x-airbyte-body-type extension
911
918
  params: Parameters from execute() call
919
+ param_defaults: Default values for params from query_params_schema
912
920
 
913
921
  Returns:
914
922
  GraphQL request body: {"query": "...", "variables": {...}}
@@ -922,7 +930,7 @@ class LocalExecutor:
922
930
 
923
931
  # Substitute variables from params
924
932
  if "variables" in graphql_config and graphql_config["variables"]:
925
- body["variables"] = self._interpolate_variables(graphql_config["variables"], params)
933
+ body["variables"] = self._interpolate_variables(graphql_config["variables"], params, param_defaults)
926
934
 
927
935
  # Add operation name if specified
928
936
  if "operationName" in graphql_config:
@@ -981,7 +989,12 @@ class LocalExecutor:
981
989
  fields_str = " ".join(graphql_fields)
982
990
  return query.replace("{{ fields }}", fields_str)
983
991
 
984
- def _interpolate_variables(self, variables: dict[str, Any], params: dict[str, Any]) -> dict[str, Any]:
992
+ def _interpolate_variables(
993
+ self,
994
+ variables: dict[str, Any],
995
+ params: dict[str, Any],
996
+ param_defaults: dict[str, Any] | None = None,
997
+ ) -> dict[str, Any]:
985
998
  """Recursively interpolate variables using params.
986
999
 
987
1000
  Preserves types (doesn't stringify everything).
@@ -990,15 +1003,18 @@ class LocalExecutor:
990
1003
  - Direct replacement: "{{ owner }}" → params["owner"] (preserves type)
991
1004
  - Nested objects: {"input": {"name": "{{ name }}"}}
992
1005
  - Arrays: [{"id": "{{ id }}"}]
993
- - Unsubstituted placeholders: "{{ states }}" → None (for optional params)
1006
+ - Default values: "{{ per_page }}" → param_defaults["per_page"] if not in params
1007
+ - Unsubstituted placeholders: "{{ states }}" → None (for optional params without defaults)
994
1008
 
995
1009
  Args:
996
1010
  variables: Variables dict with template placeholders
997
1011
  params: Parameters to substitute
1012
+ param_defaults: Default values for params from query_params_schema
998
1013
 
999
1014
  Returns:
1000
1015
  Interpolated variables dict with types preserved
1001
1016
  """
1017
+ defaults = param_defaults or {}
1002
1018
 
1003
1019
  def interpolate_value(value: Any) -> Any:
1004
1020
  if isinstance(value, str):
@@ -1012,8 +1028,15 @@ class LocalExecutor:
1012
1028
  value = value.replace(placeholder, str(param_value))
1013
1029
 
1014
1030
  # Check if any unsubstituted placeholders remain
1015
- # If so, return None (treats as "not provided" for optional params)
1016
1031
  if re.search(r"\{\{\s*\w+\s*\}\}", value):
1032
+ # Extract placeholder name and check for default value
1033
+ match = re.search(r"\{\{\s*(\w+)\s*\}\}", value)
1034
+ if match:
1035
+ param_name = match.group(1)
1036
+ if param_name in defaults:
1037
+ # Use default value (preserves type)
1038
+ return defaults[param_name]
1039
+ # No default found - return None (for optional params)
1017
1040
  return None
1018
1041
 
1019
1042
  return value
@@ -1151,21 +1174,18 @@ class LocalExecutor:
1151
1174
  if action not in (Action.CREATE, Action.UPDATE):
1152
1175
  return
1153
1176
 
1154
- # Check if endpoint has body fields defined
1155
- if not endpoint.body_fields:
1177
+ # Get the request schema to find truly required fields
1178
+ request_schema = endpoint.request_schema
1179
+ if not request_schema:
1156
1180
  return
1157
1181
 
1158
- # For now, we treat all body_fields as potentially required for CREATE/UPDATE
1159
- # In a more advanced implementation, we could parse the request schema
1160
- # to identify truly required fields
1161
- missing_fields = []
1162
- for field in endpoint.body_fields:
1163
- if field not in params:
1164
- missing_fields.append(field)
1182
+ # Only validate fields explicitly marked as required in the schema
1183
+ required_fields = request_schema.get("required", [])
1184
+ missing_fields = [field for field in required_fields if field not in params]
1165
1185
 
1166
1186
  if missing_fields:
1167
1187
  raise MissingParameterError(
1168
- f"Missing required body fields for {entity}.{action.value}: {missing_fields}. Provided parameters: {list(params.keys())}"
1188
+ f"Missing required body fields for {entity}.{action.value}: {missing_fields}. " f"Provided parameters: {list(params.keys())}"
1169
1189
  )
1170
1190
 
1171
1191
  async def close(self):
@@ -200,13 +200,6 @@ class SchemaAssociationsItem(BaseModel):
200
200
  created_at: Union[str | None, Any] = Field(default=None, alias="createdAt")
201
201
  updated_at: Union[str | None, Any] = Field(default=None, alias="updatedAt")
202
202
 
203
- class SchemaLabels(BaseModel):
204
- """Display labels"""
205
- model_config = ConfigDict(extra="allow", populate_by_name=True)
206
-
207
- singular: Union[str, Any] = Field(default=None)
208
- plural: Union[str, Any] = Field(default=None)
209
-
210
203
  class SchemaPropertiesItemModificationmetadata(BaseModel):
211
204
  """Nested schema for SchemaPropertiesItem.modificationMetadata"""
212
205
  model_config = ConfigDict(extra="allow", populate_by_name=True)
@@ -243,6 +236,13 @@ class SchemaPropertiesItem(BaseModel):
243
236
  show_currency_symbol: Union[bool, Any] = Field(default=None, alias="showCurrencySymbol")
244
237
  modification_metadata: Union[SchemaPropertiesItemModificationmetadata, Any] = Field(default=None, alias="modificationMetadata")
245
238
 
239
+ class SchemaLabels(BaseModel):
240
+ """Display labels"""
241
+ model_config = ConfigDict(extra="allow", populate_by_name=True)
242
+
243
+ singular: Union[str, Any] = Field(default=None)
244
+ plural: Union[str, Any] = Field(default=None)
245
+
246
246
  class Schema(BaseModel):
247
247
  """Custom object schema definition"""
248
248
  model_config = ConfigDict(extra="allow", populate_by_name=True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: airbyte-agent-hubspot
3
- Version: 0.15.25
3
+ Version: 0.15.28
4
4
  Summary: Airbyte Hubspot 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
@@ -41,10 +41,12 @@ tickets, and custom objects for customer relationship management and sales analy
41
41
 
42
42
  ## Example questions
43
43
 
44
- - Show me all deals from {company} this quarter
44
+ The Hubspot connector is optimized to handle prompts like these.
45
+
46
+ - Show me all deals from \{company\} this quarter
45
47
  - What are the top 5 most valuable deals in my pipeline right now?
46
- - List recent tickets from {customer} and analyze their support trends
47
- - Search for contacts in the marketing department at {company}
48
+ - List recent tickets from \{customer\} and analyze their support trends
49
+ - Search for contacts in the marketing department at \{company\}
48
50
  - Give me an overview of my sales team's deals in the last 30 days
49
51
  - Identify the most active companies in our CRM this month
50
52
  - Compare the number of deals closed by different sales representatives
@@ -52,8 +54,10 @@ tickets, and custom objects for customer relationship management and sales analy
52
54
 
53
55
  ## Unsupported questions
54
56
 
55
- - Create a new contact record for {person}
56
- - Update the contact information for {customer}
57
+ The Hubspot connector isn't currently able to handle prompts like these.
58
+
59
+ - Create a new contact record for \{person\}
60
+ - Update the contact information for \{customer\}
57
61
  - Delete the ticket from last week's support case
58
62
  - Schedule a follow-up task for this deal
59
63
  - Send an email to all contacts in the sales pipeline
@@ -101,6 +105,6 @@ For the service's official API docs, see the [Hubspot API reference](https://dev
101
105
 
102
106
  ## Version information
103
107
 
104
- - **Package version:** 0.15.25
108
+ - **Package version:** 0.15.28
105
109
  - **Connector version:** 0.1.3
106
- - **Generated with Connector SDK commit SHA:** 0eb1b1c4afe2ae6607371288233ef427ccad1b80
110
+ - **Generated with Connector SDK commit SHA:** 0580c7278394ff52ee3bec5d5192905ac3b15878
@@ -1,7 +1,7 @@
1
- airbyte_agent_hubspot/__init__.py,sha256=SodomsSvXuO0pxQ1XTEGkHTReAIKYl90OCPzP-1bWXU,3861
1
+ airbyte_agent_hubspot/__init__.py,sha256=4x_auxNYOqSh44LecxxBfCRXPj9lbAbVEwQoOoM3fn4,3861
2
2
  airbyte_agent_hubspot/connector.py,sha256=SRJ9EUfM9xrnj4H5KtEmu_TMU60eXKlCCGMygWBxw9w,43498
3
3
  airbyte_agent_hubspot/connector_model.py,sha256=BH4zHfe9M8HNNdhdz0v3eiMpKTHua9Vn675uAKJnbIY,148176
4
- airbyte_agent_hubspot/models.py,sha256=6SrRxsH1riRB0E1M_hEJeeR_RU5k-dpRk3So2RvrTm0,20452
4
+ airbyte_agent_hubspot/models.py,sha256=7FqeeCTwWtWhyk8xs21wkhWZvv7m9xmkgOckKWyDj2o,20452
5
5
  airbyte_agent_hubspot/types.py,sha256=SraBhiq24dhJwB0nh8jysVFJ7UyCI8zSimb78yhel1c,7569
6
6
  airbyte_agent_hubspot/_vendored/__init__.py,sha256=ILl7AHXMui__swyrjxrh9yRa4dLiwBvV6axPWFWty80,38
7
7
  airbyte_agent_hubspot/_vendored/connector_sdk/__init__.py,sha256=T5o7roU6NSpH-lCAGZ338sE5dlh4ZU6i6IkeG1zpems,1949
@@ -20,7 +20,7 @@ airbyte_agent_hubspot/_vendored/connector_sdk/cloud_utils/__init__.py,sha256=479
20
20
  airbyte_agent_hubspot/_vendored/connector_sdk/cloud_utils/client.py,sha256=HoDgZuEgGHj78P-BGwUf6HGPVWynbdKjGOmjb-JDk58,7188
21
21
  airbyte_agent_hubspot/_vendored/connector_sdk/executor/__init__.py,sha256=EmG9YQNAjSuYCVB4D5VoLm4qpD1KfeiiOf7bpALj8p8,702
22
22
  airbyte_agent_hubspot/_vendored/connector_sdk/executor/hosted_executor.py,sha256=YQ-qfT7PZh9izNFHHe7SAcETiZOKrWjTU-okVb0_VL8,7079
23
- airbyte_agent_hubspot/_vendored/connector_sdk/executor/local_executor.py,sha256=hHlBTtvykrUcfypzyW0e61fU4e3vlxc90mypCFzgSl0,61879
23
+ airbyte_agent_hubspot/_vendored/connector_sdk/executor/local_executor.py,sha256=Y79sYM63U_hmWKG6v-gFg24lfasafkJqzRK2U80tHOE,63003
24
24
  airbyte_agent_hubspot/_vendored/connector_sdk/executor/models.py,sha256=lYVT_bNcw-PoIks4WHNyl2VY-lJVf2FntzINSOBIheE,5845
25
25
  airbyte_agent_hubspot/_vendored/connector_sdk/http/__init__.py,sha256=y8fbzZn-3yV9OxtYz8Dy6FFGI5v6TOqADd1G3xHH3Hw,911
26
26
  airbyte_agent_hubspot/_vendored/connector_sdk/http/config.py,sha256=6J7YIIwHC6sRu9i-yKa5XvArwK2KU60rlnmxzDZq3lw,3283
@@ -50,6 +50,6 @@ airbyte_agent_hubspot/_vendored/connector_sdk/telemetry/__init__.py,sha256=RaLgk
50
50
  airbyte_agent_hubspot/_vendored/connector_sdk/telemetry/config.py,sha256=tLmQwAFD0kP1WyBGWBS3ysaudN9H3e-3EopKZi6cGKg,885
51
51
  airbyte_agent_hubspot/_vendored/connector_sdk/telemetry/events.py,sha256=NvqjlUbkm6cbGh4ffKxYxtjdwwgzfPF4MKJ2GfgWeFg,1285
52
52
  airbyte_agent_hubspot/_vendored/connector_sdk/telemetry/tracker.py,sha256=KacNdbHatvPPhnNrycp5YUuD5xpkp56AFcHd-zguBgk,5247
53
- airbyte_agent_hubspot-0.15.25.dist-info/METADATA,sha256=kfLt7B6qX7LoOMXad6XuH8MEa8QLKULFqf7i7_-LAJk,4177
54
- airbyte_agent_hubspot-0.15.25.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
55
- airbyte_agent_hubspot-0.15.25.dist-info/RECORD,,
53
+ airbyte_agent_hubspot-0.15.28.dist-info/METADATA,sha256=guaeouPgdAp3VStJVxaFWwC5uK9qBxjw54zxC7ADw_w,4327
54
+ airbyte_agent_hubspot-0.15.28.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
55
+ airbyte_agent_hubspot-0.15.28.dist-info/RECORD,,