airbyte-agent-hubspot 0.15.20__py3-none-any.whl → 0.15.25__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.
@@ -21,10 +21,10 @@ from .models import (
21
21
  TicketProperties,
22
22
  Ticket,
23
23
  TicketsList,
24
- SchemaPropertiesItemModificationmetadata,
25
- SchemaPropertiesItem,
26
24
  SchemaAssociationsItem,
27
25
  SchemaLabels,
26
+ SchemaPropertiesItemModificationmetadata,
27
+ SchemaPropertiesItem,
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", "SchemaPropertiesItemModificationmetadata", "SchemaPropertiesItem", "SchemaAssociationsItem", "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"]
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"]
@@ -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: " f"{callback_error!s}"),
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}, " f"got content-type: {content_type}"
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.2"
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.2',
29
+ version='0.1.3',
30
30
  base_url='https://api.hubapi.com',
31
31
  auth=AuthConfig(
32
32
  type=AuthType.OAUTH2,
@@ -183,6 +183,30 @@ 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
+
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
+
186
210
  class SchemaPropertiesItemModificationmetadata(BaseModel):
187
211
  """Nested schema for SchemaPropertiesItem.modificationMetadata"""
188
212
  model_config = ConfigDict(extra="allow", populate_by_name=True)
@@ -219,30 +243,6 @@ class SchemaPropertiesItem(BaseModel):
219
243
  show_currency_symbol: Union[bool, Any] = Field(default=None, alias="showCurrencySymbol")
220
244
  modification_metadata: Union[SchemaPropertiesItemModificationmetadata, Any] = Field(default=None, alias="modificationMetadata")
221
245
 
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
- 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.20
3
+ Version: 0.15.25
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,10 @@ 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
+ - Show me all deals from {company} this quarter
45
45
  - What are the top 5 most valuable deals in my pipeline right now?
46
- - List recent tickets from [customerX] and analyze their support trends
47
- - Search for contacts in the marketing department at [Company]
46
+ - List recent tickets from {customer} and analyze their support trends
47
+ - Search for contacts in the marketing department at {company}
48
48
  - Give me an overview of my sales team's deals in the last 30 days
49
49
  - Identify the most active companies in our CRM this month
50
50
  - Compare the number of deals closed by different sales representatives
@@ -52,8 +52,8 @@ tickets, and custom objects for customer relationship management and sales analy
52
52
 
53
53
  ## Unsupported questions
54
54
 
55
- - Create a new contact record for [personX]
56
- - Update the contact information for [customerY]
55
+ - Create a new contact record for {person}
56
+ - Update the contact information for {customer}
57
57
  - Delete the ticket from last week's support case
58
58
  - Schedule a follow-up task for this deal
59
59
  - Send an email to all contacts in the sales pipeline
@@ -80,6 +80,7 @@ connector = HubspotConnector(
80
80
  result = await connector.contacts.list()
81
81
  ```
82
82
 
83
+
83
84
  ## Full documentation
84
85
 
85
86
  This connector supports the following entities and actions.
@@ -100,6 +101,6 @@ For the service's official API docs, see the [Hubspot API reference](https://dev
100
101
 
101
102
  ## Version information
102
103
 
103
- - **Package version:** 0.15.20
104
- - **Connector version:** 0.1.2
105
- - **Generated with Connector SDK commit SHA:** af45652142962c8574c427e5e2e6eb2db22445eb
104
+ - **Package version:** 0.15.25
105
+ - **Connector version:** 0.1.3
106
+ - **Generated with Connector SDK commit SHA:** 0eb1b1c4afe2ae6607371288233ef427ccad1b80
@@ -1,7 +1,7 @@
1
- airbyte_agent_hubspot/__init__.py,sha256=lkQsg1pCcCOqDW44J1iJJpIsLHiI5xDLPe86TathTuo,3861
2
- airbyte_agent_hubspot/connector.py,sha256=LoWCrxEZiH0trs70U_GwXrsqJMmdpEq7rM9ykSY_2Tc,43498
3
- airbyte_agent_hubspot/connector_model.py,sha256=I47hW_rc_bTJ7-CjOpDlQsko6KIPxcYE5KBpap4e1Jw,148176
4
- airbyte_agent_hubspot/models.py,sha256=XB_rFV6j-DM4nLlBgIv6Qb9TVWiU0LB2m89QAPOsUXY,20452
1
+ airbyte_agent_hubspot/__init__.py,sha256=SodomsSvXuO0pxQ1XTEGkHTReAIKYl90OCPzP-1bWXU,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=6SrRxsH1riRB0E1M_hEJeeR_RU5k-dpRk3So2RvrTm0,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=Uv86Hye3uIs2F4TbXXFWnB4E6BHfvJQLBwak7J1_0kw,27073
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
@@ -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.20.dist-info/METADATA,sha256=JPNdP_4FNHIFHcY0gyZcBLK5BMImsO8Xqdx3wjewvdY,4179
54
- airbyte_agent_hubspot-0.15.20.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
55
- airbyte_agent_hubspot-0.15.20.dist-info/RECORD,,
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,,