airbyte-agent-hubspot 0.15.20__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.
- airbyte_agent_hubspot/__init__.py +2 -2
- airbyte_agent_hubspot/_vendored/connector_sdk/executor/local_executor.py +39 -19
- airbyte_agent_hubspot/_vendored/connector_sdk/http_client.py +50 -43
- airbyte_agent_hubspot/connector.py +1 -1
- airbyte_agent_hubspot/connector_model.py +1 -1
- airbyte_agent_hubspot/models.py +17 -17
- {airbyte_agent_hubspot-0.15.20.dist-info → airbyte_agent_hubspot-0.15.28.dist-info}/METADATA +14 -9
- {airbyte_agent_hubspot-0.15.20.dist-info → airbyte_agent_hubspot-0.15.28.dist-info}/RECORD +9 -9
- {airbyte_agent_hubspot-0.15.20.dist-info → airbyte_agent_hubspot-0.15.28.dist-info}/WHEEL +0 -0
|
@@ -21,9 +21,9 @@ from .models import (
|
|
|
21
21
|
TicketProperties,
|
|
22
22
|
Ticket,
|
|
23
23
|
TicketsList,
|
|
24
|
+
SchemaAssociationsItem,
|
|
24
25
|
SchemaPropertiesItemModificationmetadata,
|
|
25
26
|
SchemaPropertiesItem,
|
|
26
|
-
SchemaAssociationsItem,
|
|
27
27
|
SchemaLabels,
|
|
28
28
|
Schema,
|
|
29
29
|
SchemasList,
|
|
@@ -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", "
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
-
-
|
|
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
|
-
#
|
|
1155
|
-
|
|
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
|
-
#
|
|
1159
|
-
|
|
1160
|
-
|
|
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):
|
|
@@ -147,6 +147,9 @@ class HTTPClient:
|
|
|
147
147
|
self.base_url = self.base_url.replace(f"{{{var_name}}}", var_value)
|
|
148
148
|
|
|
149
149
|
self.auth_config = auth_config
|
|
150
|
+
assert (
|
|
151
|
+
self.auth_config.type is not None
|
|
152
|
+
), "auth_config.type cannot be None" # Should never be None when instantiated via the local executor flow
|
|
150
153
|
self.secrets = secrets
|
|
151
154
|
self.logger = logger or NullLogger()
|
|
152
155
|
self.metrics = HTTPMetrics()
|
|
@@ -296,12 +299,12 @@ class HTTPClient:
|
|
|
296
299
|
|
|
297
300
|
# Support both sync and async callbacks
|
|
298
301
|
callback_result = self.on_token_refresh(callback_data)
|
|
299
|
-
if hasattr(callback_result, "__await__"):
|
|
302
|
+
if callback_result is not None and hasattr(callback_result, "__await__"):
|
|
300
303
|
await callback_result
|
|
301
304
|
except Exception as callback_error:
|
|
302
305
|
self.logger.log_error(
|
|
303
306
|
request_id=None,
|
|
304
|
-
error=("Token refresh callback failed during initialization:
|
|
307
|
+
error=(f"Token refresh callback failed during initialization: {callback_error!s}"),
|
|
305
308
|
status_code=None,
|
|
306
309
|
)
|
|
307
310
|
|
|
@@ -485,7 +488,7 @@ class HTTPClient:
|
|
|
485
488
|
elif "application/json" in content_type or not content_type:
|
|
486
489
|
response_data = await response.json()
|
|
487
490
|
else:
|
|
488
|
-
error_msg = f"Expected JSON response for {method.upper()} {url},
|
|
491
|
+
error_msg = f"Expected JSON response for {method.upper()} {url}, got content-type: {content_type}"
|
|
489
492
|
raise HTTPClientError(error_msg)
|
|
490
493
|
|
|
491
494
|
except ValueError as e:
|
|
@@ -556,6 +559,7 @@ class HTTPClient:
|
|
|
556
559
|
current_token = self.secrets.get("access_token")
|
|
557
560
|
strategy = AuthStrategyFactory.get_strategy(self.auth_config.type)
|
|
558
561
|
|
|
562
|
+
# Try to refresh credentials
|
|
559
563
|
try:
|
|
560
564
|
result = await strategy.handle_auth_error(
|
|
561
565
|
status_code=status_code,
|
|
@@ -564,53 +568,56 @@ class HTTPClient:
|
|
|
564
568
|
config_values=self.config_values,
|
|
565
569
|
http_client=None, # Let strategy create its own client
|
|
566
570
|
)
|
|
567
|
-
|
|
568
|
-
if result:
|
|
569
|
-
# Notify callback if provided (for persistence)
|
|
570
|
-
# Include both tokens AND extracted values for full persistence
|
|
571
|
-
if self.on_token_refresh is not None:
|
|
572
|
-
try:
|
|
573
|
-
# Build callback data with both tokens and extracted values
|
|
574
|
-
callback_data = dict(result.tokens)
|
|
575
|
-
if result.extracted_values:
|
|
576
|
-
callback_data.update(result.extracted_values)
|
|
577
|
-
|
|
578
|
-
# Support both sync and async callbacks
|
|
579
|
-
callback_result = self.on_token_refresh(callback_data)
|
|
580
|
-
if hasattr(callback_result, "__await__"):
|
|
581
|
-
await callback_result
|
|
582
|
-
except Exception as callback_error:
|
|
583
|
-
self.logger.log_error(
|
|
584
|
-
request_id=request_id,
|
|
585
|
-
error=f"Token refresh callback failed: {str(callback_error)}",
|
|
586
|
-
status_code=status_code,
|
|
587
|
-
)
|
|
588
|
-
|
|
589
|
-
# Update secrets with new tokens (in-memory)
|
|
590
|
-
self.secrets.update(result.tokens)
|
|
591
|
-
|
|
592
|
-
# Update config_values and re-render base_url with extracted values
|
|
593
|
-
if result.extracted_values:
|
|
594
|
-
self._apply_token_extract(result.extracted_values)
|
|
595
|
-
|
|
596
|
-
if self.secrets.get("access_token") != current_token:
|
|
597
|
-
# Retry with new token - this will go through full retry logic
|
|
598
|
-
return await self.request(
|
|
599
|
-
method=method,
|
|
600
|
-
path=path,
|
|
601
|
-
params=params,
|
|
602
|
-
json=json,
|
|
603
|
-
data=data,
|
|
604
|
-
headers=headers,
|
|
605
|
-
)
|
|
606
|
-
|
|
607
571
|
except Exception as refresh_error:
|
|
608
572
|
self.logger.log_error(
|
|
609
573
|
request_id=request_id,
|
|
610
574
|
error=f"Credential refresh failed: {str(refresh_error)}",
|
|
611
575
|
status_code=status_code,
|
|
612
576
|
)
|
|
577
|
+
result = None
|
|
578
|
+
|
|
579
|
+
# If refresh succeeded, update tokens and retry
|
|
580
|
+
if result:
|
|
581
|
+
# Notify callback if provided (for persistence)
|
|
582
|
+
# Include both tokens AND extracted values for full persistence
|
|
583
|
+
if self.on_token_refresh is not None:
|
|
584
|
+
try:
|
|
585
|
+
# Build callback data with both tokens and extracted values
|
|
586
|
+
callback_data = dict(result.tokens)
|
|
587
|
+
if result.extracted_values:
|
|
588
|
+
callback_data.update(result.extracted_values)
|
|
589
|
+
|
|
590
|
+
# Support both sync and async callbacks
|
|
591
|
+
callback_result = self.on_token_refresh(callback_data)
|
|
592
|
+
if callback_result is not None and hasattr(callback_result, "__await__"):
|
|
593
|
+
await callback_result
|
|
594
|
+
except Exception as callback_error:
|
|
595
|
+
self.logger.log_error(
|
|
596
|
+
request_id=request_id,
|
|
597
|
+
error=f"Token refresh callback failed: {str(callback_error)}",
|
|
598
|
+
status_code=status_code,
|
|
599
|
+
)
|
|
600
|
+
|
|
601
|
+
# Update secrets with new tokens (in-memory)
|
|
602
|
+
self.secrets.update(result.tokens)
|
|
603
|
+
|
|
604
|
+
# Update config_values and re-render base_url with extracted values
|
|
605
|
+
if result.extracted_values:
|
|
606
|
+
self._apply_token_extract(result.extracted_values)
|
|
613
607
|
|
|
608
|
+
if self.secrets.get("access_token") != current_token:
|
|
609
|
+
# Retry with new token - this will go through full retry logic
|
|
610
|
+
# Any errors from this retry will propagate to the caller
|
|
611
|
+
return await self.request(
|
|
612
|
+
method=method,
|
|
613
|
+
path=path,
|
|
614
|
+
params=params,
|
|
615
|
+
json=json,
|
|
616
|
+
data=data,
|
|
617
|
+
headers=headers,
|
|
618
|
+
)
|
|
619
|
+
|
|
620
|
+
# Refresh failed or token didn't change, log and let original error propagate
|
|
614
621
|
self.logger.log_error(request_id=request_id, error=str(error), status_code=status_code)
|
|
615
622
|
|
|
616
623
|
async def request(
|
|
@@ -72,7 +72,7 @@ class HubspotConnector:
|
|
|
72
72
|
"""
|
|
73
73
|
|
|
74
74
|
connector_name = "hubspot"
|
|
75
|
-
connector_version = "0.1.
|
|
75
|
+
connector_version = "0.1.3"
|
|
76
76
|
vendored_sdk_version = "0.1.0" # Version of vendored connector-sdk
|
|
77
77
|
|
|
78
78
|
# Map of (entity, action) -> has_extractors for envelope wrapping decision
|
|
@@ -26,7 +26,7 @@ from uuid import (
|
|
|
26
26
|
HubspotConnectorModel: ConnectorModel = ConnectorModel(
|
|
27
27
|
id=UUID('36c891d9-4bd9-43ac-bad2-10e12756272c'),
|
|
28
28
|
name='hubspot',
|
|
29
|
-
version='0.1.
|
|
29
|
+
version='0.1.3',
|
|
30
30
|
base_url='https://api.hubapi.com',
|
|
31
31
|
auth=AuthConfig(
|
|
32
32
|
type=AuthType.OAUTH2,
|
airbyte_agent_hubspot/models.py
CHANGED
|
@@ -183,6 +183,23 @@ class TicketsList(BaseModel):
|
|
|
183
183
|
paging: Union[Paging, Any] = Field(default=None)
|
|
184
184
|
total: Union[int, Any] = Field(default=None)
|
|
185
185
|
|
|
186
|
+
class SchemaAssociationsItem(BaseModel):
|
|
187
|
+
"""Nested schema for Schema.associations_item"""
|
|
188
|
+
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
189
|
+
|
|
190
|
+
from_object_type_id: Union[str, Any] = Field(default=None, alias="fromObjectTypeId")
|
|
191
|
+
to_object_type_id: Union[str, Any] = Field(default=None, alias="toObjectTypeId")
|
|
192
|
+
name: Union[str, Any] = Field(default=None)
|
|
193
|
+
cardinality: Union[str, Any] = Field(default=None)
|
|
194
|
+
id: Union[str, Any] = Field(default=None)
|
|
195
|
+
inverse_cardinality: Union[str, Any] = Field(default=None, alias="inverseCardinality")
|
|
196
|
+
has_user_enforced_max_to_object_ids: Union[bool, Any] = Field(default=None, alias="hasUserEnforcedMaxToObjectIds")
|
|
197
|
+
has_user_enforced_max_from_object_ids: Union[bool, Any] = Field(default=None, alias="hasUserEnforcedMaxFromObjectIds")
|
|
198
|
+
max_to_object_ids: Union[int, Any] = Field(default=None, alias="maxToObjectIds")
|
|
199
|
+
max_from_object_ids: Union[int, Any] = Field(default=None, alias="maxFromObjectIds")
|
|
200
|
+
created_at: Union[str | None, Any] = Field(default=None, alias="createdAt")
|
|
201
|
+
updated_at: Union[str | None, Any] = Field(default=None, alias="updatedAt")
|
|
202
|
+
|
|
186
203
|
class SchemaPropertiesItemModificationmetadata(BaseModel):
|
|
187
204
|
"""Nested schema for SchemaPropertiesItem.modificationMetadata"""
|
|
188
205
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
@@ -219,23 +236,6 @@ class SchemaPropertiesItem(BaseModel):
|
|
|
219
236
|
show_currency_symbol: Union[bool, Any] = Field(default=None, alias="showCurrencySymbol")
|
|
220
237
|
modification_metadata: Union[SchemaPropertiesItemModificationmetadata, Any] = Field(default=None, alias="modificationMetadata")
|
|
221
238
|
|
|
222
|
-
class SchemaAssociationsItem(BaseModel):
|
|
223
|
-
"""Nested schema for Schema.associations_item"""
|
|
224
|
-
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
225
|
-
|
|
226
|
-
from_object_type_id: Union[str, Any] = Field(default=None, alias="fromObjectTypeId")
|
|
227
|
-
to_object_type_id: Union[str, Any] = Field(default=None, alias="toObjectTypeId")
|
|
228
|
-
name: Union[str, Any] = Field(default=None)
|
|
229
|
-
cardinality: Union[str, Any] = Field(default=None)
|
|
230
|
-
id: Union[str, Any] = Field(default=None)
|
|
231
|
-
inverse_cardinality: Union[str, Any] = Field(default=None, alias="inverseCardinality")
|
|
232
|
-
has_user_enforced_max_to_object_ids: Union[bool, Any] = Field(default=None, alias="hasUserEnforcedMaxToObjectIds")
|
|
233
|
-
has_user_enforced_max_from_object_ids: Union[bool, Any] = Field(default=None, alias="hasUserEnforcedMaxFromObjectIds")
|
|
234
|
-
max_to_object_ids: Union[int, Any] = Field(default=None, alias="maxToObjectIds")
|
|
235
|
-
max_from_object_ids: Union[int, Any] = Field(default=None, alias="maxFromObjectIds")
|
|
236
|
-
created_at: Union[str | None, Any] = Field(default=None, alias="createdAt")
|
|
237
|
-
updated_at: Union[str | None, Any] = Field(default=None, alias="updatedAt")
|
|
238
|
-
|
|
239
239
|
class SchemaLabels(BaseModel):
|
|
240
240
|
"""Display labels"""
|
|
241
241
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
{airbyte_agent_hubspot-0.15.20.dist-info → airbyte_agent_hubspot-0.15.28.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: airbyte-agent-hubspot
|
|
3
|
-
Version: 0.15.
|
|
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
|
-
|
|
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
|
|
47
|
-
- Search for contacts in the marketing department at
|
|
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
|
-
|
|
56
|
-
|
|
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
|
|
@@ -80,6 +84,7 @@ connector = HubspotConnector(
|
|
|
80
84
|
result = await connector.contacts.list()
|
|
81
85
|
```
|
|
82
86
|
|
|
87
|
+
|
|
83
88
|
## Full documentation
|
|
84
89
|
|
|
85
90
|
This connector supports the following entities and actions.
|
|
@@ -100,6 +105,6 @@ For the service's official API docs, see the [Hubspot API reference](https://dev
|
|
|
100
105
|
|
|
101
106
|
## Version information
|
|
102
107
|
|
|
103
|
-
- **Package version:** 0.15.
|
|
104
|
-
- **Connector version:** 0.1.
|
|
105
|
-
- **Generated with Connector SDK commit SHA:**
|
|
108
|
+
- **Package version:** 0.15.28
|
|
109
|
+
- **Connector version:** 0.1.3
|
|
110
|
+
- **Generated with Connector SDK commit SHA:** 0580c7278394ff52ee3bec5d5192905ac3b15878
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
airbyte_agent_hubspot/__init__.py,sha256=
|
|
2
|
-
airbyte_agent_hubspot/connector.py,sha256=
|
|
3
|
-
airbyte_agent_hubspot/connector_model.py,sha256=
|
|
4
|
-
airbyte_agent_hubspot/models.py,sha256=
|
|
1
|
+
airbyte_agent_hubspot/__init__.py,sha256=4x_auxNYOqSh44LecxxBfCRXPj9lbAbVEwQoOoM3fn4,3861
|
|
2
|
+
airbyte_agent_hubspot/connector.py,sha256=SRJ9EUfM9xrnj4H5KtEmu_TMU60eXKlCCGMygWBxw9w,43498
|
|
3
|
+
airbyte_agent_hubspot/connector_model.py,sha256=BH4zHfe9M8HNNdhdz0v3eiMpKTHua9Vn675uAKJnbIY,148176
|
|
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
|
|
@@ -11,7 +11,7 @@ airbyte_agent_hubspot/_vendored/connector_sdk/connector_model_loader.py,sha256=B
|
|
|
11
11
|
airbyte_agent_hubspot/_vendored/connector_sdk/constants.py,sha256=uH4rjBX6WsBP8M0jt7AUJI9w5Adn4wvJwib7Gdfkr1M,2736
|
|
12
12
|
airbyte_agent_hubspot/_vendored/connector_sdk/exceptions.py,sha256=ss5MGv9eVPmsbLcLWetuu3sDmvturwfo6Pw3M37Oq5k,481
|
|
13
13
|
airbyte_agent_hubspot/_vendored/connector_sdk/extensions.py,sha256=iWA2i0kiiGZY84H8P25A6QmfbuZwu7euMcj4-Vx2DOQ,20185
|
|
14
|
-
airbyte_agent_hubspot/_vendored/connector_sdk/http_client.py,sha256=
|
|
14
|
+
airbyte_agent_hubspot/_vendored/connector_sdk/http_client.py,sha256=NdccrrBHI5rW56XnXcP54arCwywIVKnMeSQPas6KlOM,27466
|
|
15
15
|
airbyte_agent_hubspot/_vendored/connector_sdk/secrets.py,sha256=UWcO9fP-vZwcfkAuvlZahlOCTOwdNN860BIwe8X4jxw,6868
|
|
16
16
|
airbyte_agent_hubspot/_vendored/connector_sdk/types.py,sha256=sS9olOyT-kVemHmcFll2ePFRhTdGMbWcz7bSgV-MuSw,8114
|
|
17
17
|
airbyte_agent_hubspot/_vendored/connector_sdk/utils.py,sha256=G4LUXOC2HzPoND2v4tQW68R9uuPX9NQyCjaGxb7Kpl0,1958
|
|
@@ -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=
|
|
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.
|
|
54
|
-
airbyte_agent_hubspot-0.15.
|
|
55
|
-
airbyte_agent_hubspot-0.15.
|
|
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,,
|
|
File without changes
|