hypelabs-connect 0.1.0__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.
Files changed (138) hide show
  1. hypelabs_connect-0.1.0/.github/workflows/publish.yml +39 -0
  2. hypelabs_connect-0.1.0/.gitignore +10 -0
  3. hypelabs_connect-0.1.0/LICENSE +21 -0
  4. hypelabs_connect-0.1.0/PKG-INFO +68 -0
  5. hypelabs_connect-0.1.0/README.md +56 -0
  6. hypelabs_connect-0.1.0/pyproject.toml +22 -0
  7. hypelabs_connect-0.1.0/src/hypelabs_connect/__init__.py +5 -0
  8. hypelabs_connect-0.1.0/src/hypelabs_connect/api_key_authentication_provider.py +17 -0
  9. hypelabs_connect-0.1.0/src/hypelabs_connect/client.py +26 -0
  10. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/announcements/announcements_request_builder.py +75 -0
  11. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/catalog/capabilities/capabilities_request_builder.py +107 -0
  12. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/catalog/catalog_request_builder.py +73 -0
  13. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/catalog/datacenters/datacenters_request_builder.py +113 -0
  14. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/catalog/isps/isps_request_builder.py +113 -0
  15. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/catalog/locations/locations_request_builder.py +108 -0
  16. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/catalog/products/products_request_builder.py +95 -0
  17. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/connect_api_client.py +113 -0
  18. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/customers/authenticate/authenticate_request_builder.py +109 -0
  19. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/customers/authenticate/oauth/oauth_request_builder.py +89 -0
  20. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/customers/authenticate/telegram/telegram_request_builder.py +90 -0
  21. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/customers/customers_request_builder.py +179 -0
  22. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/customers/item/billing/billing_request_builder.py +90 -0
  23. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/customers/item/defaults/defaults_request_builder.py +89 -0
  24. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/customers/item/kyc/kyc_request_builder.py +89 -0
  25. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/customers/item/metadata/metadata_request_builder.py +89 -0
  26. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/customers/item/password/password_request_builder.py +86 -0
  27. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/customers/item/reset_password/reset_password_request_builder.py +81 -0
  28. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/customers/item/send_verification/send_verification_request_builder.py +87 -0
  29. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/customers/item/with_customer_item_request_builder.py +278 -0
  30. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/incidents/incidents_request_builder.py +150 -0
  31. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/incidents/item/dismiss/dismiss_request_builder.py +81 -0
  32. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/incidents/item/metadata/metadata_request_builder.py +89 -0
  33. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/incidents/item/resolve/resolve_request_builder.py +89 -0
  34. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/incidents/item/with_incident_item_request_builder.py +111 -0
  35. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/kiota-lock.json +35 -0
  36. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/announcement.py +93 -0
  37. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/announcement_metadata.py +43 -0
  38. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/announcement_statuses.py +7 -0
  39. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/api_error.py +51 -0
  40. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/api_response.py +78 -0
  41. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/authenticate_customer_o_auth_request.py +70 -0
  42. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/authenticate_customer_request.py +58 -0
  43. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/authenticate_customer_telegram_request.py +50 -0
  44. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/billing_cycles.py +10 -0
  45. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/cancel_order_request.py +54 -0
  46. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/capability.py +90 -0
  47. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/capability_types.py +6 -0
  48. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/create_customer_request.py +85 -0
  49. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/create_incident_request.py +62 -0
  50. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/create_order_request.py +81 -0
  51. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/create_order_response.py +55 -0
  52. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/create_review_request.py +67 -0
  53. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/create_trial_response.py +60 -0
  54. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/customer.py +162 -0
  55. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/customer_auth_response.py +80 -0
  56. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/customer_billing.py +78 -0
  57. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/customer_external_logins.py +46 -0
  58. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/customer_kyc.py +66 -0
  59. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/customer_metadata.py +43 -0
  60. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/datacenter.py +83 -0
  61. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/extend_order_request.py +64 -0
  62. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/extend_order_response.py +55 -0
  63. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/grace_period_policies.py +8 -0
  64. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/incident.py +102 -0
  65. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/incident_metadata.py +43 -0
  66. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/incident_statuses.py +7 -0
  67. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/ip_information.py +99 -0
  68. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/ip_rotation_link_response.py +54 -0
  69. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/isp.py +79 -0
  70. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/location.py +87 -0
  71. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/order.py +149 -0
  72. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/order_criteria.py +92 -0
  73. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/order_intents.py +7 -0
  74. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/order_item.py +77 -0
  75. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/order_item_metadata.py +43 -0
  76. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/order_metadata.py +43 -0
  77. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/order_statuses.py +10 -0
  78. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/password_hash_schemes.py +6 -0
  79. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/patch_customer_billing_request.py +78 -0
  80. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/patch_customer_defaults_request.py +54 -0
  81. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/patch_customer_request.py +50 -0
  82. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/patch_metadata_request.py +57 -0
  83. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/patch_metadata_request_metadata.py +46 -0
  84. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/patch_password_request.py +50 -0
  85. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/patch_proxy_annotation_request.py +54 -0
  86. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/payment_methods.py +9 -0
  87. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/payment_processors.py +8 -0
  88. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/preview_order_request.py +73 -0
  89. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/preview_order_response.py +78 -0
  90. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/pricing_types.py +6 -0
  91. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/product.py +97 -0
  92. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/product_kinds.py +6 -0
  93. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/proxy.py +117 -0
  94. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/proxy_credential_response.py +67 -0
  95. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/proxy_datacenter.py +55 -0
  96. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/proxy_features.py +57 -0
  97. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/proxy_ip_rotation_feature.py +54 -0
  98. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/proxy_ip_rotation_response.py +54 -0
  99. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/proxy_isp.py +59 -0
  100. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/proxy_location.py +59 -0
  101. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/proxy_options.py +73 -0
  102. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/proxy_options_metadata.py +43 -0
  103. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/proxy_ping_response.py +62 -0
  104. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/proxy_product.py +66 -0
  105. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/request_details.py +68 -0
  106. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/reset_password_response.py +50 -0
  107. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/resolution_modes.py +6 -0
  108. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/resolve_incident_request.py +54 -0
  109. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/review.py +90 -0
  110. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/review_kyc_request.py +50 -0
  111. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/review_metadata.py +43 -0
  112. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/send_verification_request.py +50 -0
  113. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/trial_order_request.py +73 -0
  114. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/update_customer_request.py +88 -0
  115. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/update_customer_request_external_logins.py +46 -0
  116. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/update_proxy_credentials_request.py +58 -0
  117. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/update_proxy_ip_rotation_request.py +50 -0
  118. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/models/update_proxy_options_request.py +57 -0
  119. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/orders/item/extend/extend_request_builder.py +91 -0
  120. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/orders/item/orders_item_request_builder.py +146 -0
  121. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/orders/item/proxies/proxies_request_builder.py +81 -0
  122. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/orders/orders_request_builder.py +192 -0
  123. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/orders/preview/preview_request_builder.py +90 -0
  124. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/orders/trial/trial_request_builder.py +91 -0
  125. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/proxies/item/annotations/annotations_request_builder.py +79 -0
  126. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/proxies/item/credentials/credentials_request_builder.py +113 -0
  127. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/proxies/item/ip_info/ip_info_request_builder.py +82 -0
  128. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/proxies/item/ip_rotation/ip_rotation_request_builder.py +133 -0
  129. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/proxies/item/ip_rotation/link/link_request_builder.py +75 -0
  130. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/proxies/item/ip_rotation/trigger/trigger_request_builder.py +69 -0
  131. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/proxies/item/options/options_request_builder.py +120 -0
  132. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/proxies/item/ping/ping_request_builder.py +82 -0
  133. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/proxies/item/with_proxy_item_request_builder.py +135 -0
  134. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/proxies/proxies_request_builder.py +91 -0
  135. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/reviews/item/approve/approve_request_builder.py +81 -0
  136. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/reviews/item/metadata/metadata_request_builder.py +89 -0
  137. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/reviews/item/with_review_item_request_builder.py +98 -0
  138. hypelabs_connect-0.1.0/src/hypelabs_connect/generated/reviews/reviews_request_builder.py +138 -0
@@ -0,0 +1,39 @@
1
+ name: Publish
2
+
3
+ # Publishes the SDK to PyPI when a version tag (e.g. v1.2.3) is pushed.
4
+ # Authentication uses PyPI Trusted Publishing (OIDC) — no long-lived API token is stored.
5
+ on:
6
+ push:
7
+ tags:
8
+ - "v*"
9
+
10
+ jobs:
11
+ publish:
12
+ runs-on: ubuntu-latest
13
+ permissions:
14
+ id-token: write # required for GitHub to issue the OIDC token PyPI exchanges
15
+ contents: read
16
+
17
+ steps:
18
+ - name: Checkout
19
+ uses: actions/checkout@v4
20
+
21
+ - name: Setup Python
22
+ uses: actions/setup-python@v5
23
+ with:
24
+ python-version: "3.12"
25
+
26
+ # Pin the package version to the tag (refs/tags/v1.2.3 -> 1.2.3) so the artifact matches the release.
27
+ - name: Set version from tag
28
+ run: |
29
+ version="${GITHUB_REF_NAME#v}"
30
+ sed -i "s/^version = \".*\"/version = \"${version}\"/" pyproject.toml
31
+
32
+ - name: Build
33
+ run: |
34
+ python -m pip install --upgrade build
35
+ python -m build
36
+
37
+ # No token: the action exchanges the OIDC token and uploads to PyPI.
38
+ - name: Publish to PyPI
39
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,10 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .venv/
4
+ venv/
5
+ dist/
6
+ build/
7
+ *.egg-info/
8
+ regen.sh
9
+ openapi.json
10
+ **/.kiota.log
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 HypeLabs, LLC
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,68 @@
1
+ Metadata-Version: 2.5
2
+ Name: hypelabs-connect
3
+ Version: 0.1.0
4
+ Summary: The Python client for the HypeLabs Connect API.
5
+ Project-URL: Homepage, https://github.com/hypelabs-llc/python-sdk
6
+ Project-URL: Repository, https://github.com/hypelabs-llc/python-sdk
7
+ License-Expression: MIT
8
+ License-File: LICENSE
9
+ Requires-Python: >=3.10
10
+ Requires-Dist: microsoft-kiota-bundle==1.15.0
11
+ Description-Content-Type: text/markdown
12
+
13
+ <p align="center">
14
+ <img src="https://i.imgur.com/NtKvmk2.png" height="100" alt="HypeLabs" />
15
+ </p>
16
+ <h3 align="center">
17
+ HypeLabs Connect SDK
18
+ </h3>
19
+ <p align="center">
20
+ The Python client for the HypeLabs Connect API.
21
+ </p>
22
+ <p align="center">
23
+ <a href="https://pypi.org/project/hypelabs-connect/"><img src="https://img.shields.io/pypi/v/hypelabs-connect?color=3775a9&label=pypi" /></a>
24
+ <a href="https://pypi.org/project/hypelabs-connect/"><img src="https://img.shields.io/pypi/dm/hypelabs-connect?color=3775a9&label=Downloads" /></a>
25
+ <a href="https://connect.hypelabs.network"><img src="https://img.shields.io/badge/API-connect.hypelabs.network-6366f1" /></a>
26
+ <a href="https://learn.microsoft.com/openapi/kiota/"><img src="https://img.shields.io/badge/Generated%20With-Kiota-0078d4" /></a>
27
+ <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-lightgrey.svg" /></a>
28
+ </p>
29
+
30
+ ## Requirements
31
+
32
+ - Python 3.10 or later
33
+ - A HypeLabs Connect API key (`hl_live_…`)
34
+
35
+ > The client authenticates with an API key, so run it **server-side** (a backend or a job) — never ship your
36
+ > key to a browser or a client app.
37
+
38
+ ## Install
39
+
40
+ 1. **Add the package:**
41
+
42
+ ```bash
43
+ pip install hypelabs-connect
44
+ ```
45
+
46
+ 2. **Create your organization** on the [HypeLabs Console](https://console.hypelabs.network/?utm_source=github&utm_medium=readme&utm_campaign=python-sdk) and generate an API key.
47
+
48
+ ## Usage
49
+
50
+ Create a client with your API key and call the API. Every call is async and returns typed models.
51
+
52
+ ```python
53
+ import asyncio
54
+ from hypelabs_connect import create_connect_client
55
+
56
+ client = create_connect_client("hl_live_...")
57
+
58
+
59
+ async def main():
60
+ proxies = await client.proxies.get()
61
+ for proxy in proxies or []:
62
+ print(proxy.id)
63
+
64
+
65
+ asyncio.run(main())
66
+ ```
67
+
68
+ The API is authenticated with the `X-Api-Key` header, wired up internally — you never touch the Kiota plumbing.
@@ -0,0 +1,56 @@
1
+ <p align="center">
2
+ <img src="https://i.imgur.com/NtKvmk2.png" height="100" alt="HypeLabs" />
3
+ </p>
4
+ <h3 align="center">
5
+ HypeLabs Connect SDK
6
+ </h3>
7
+ <p align="center">
8
+ The Python client for the HypeLabs Connect API.
9
+ </p>
10
+ <p align="center">
11
+ <a href="https://pypi.org/project/hypelabs-connect/"><img src="https://img.shields.io/pypi/v/hypelabs-connect?color=3775a9&label=pypi" /></a>
12
+ <a href="https://pypi.org/project/hypelabs-connect/"><img src="https://img.shields.io/pypi/dm/hypelabs-connect?color=3775a9&label=Downloads" /></a>
13
+ <a href="https://connect.hypelabs.network"><img src="https://img.shields.io/badge/API-connect.hypelabs.network-6366f1" /></a>
14
+ <a href="https://learn.microsoft.com/openapi/kiota/"><img src="https://img.shields.io/badge/Generated%20With-Kiota-0078d4" /></a>
15
+ <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-lightgrey.svg" /></a>
16
+ </p>
17
+
18
+ ## Requirements
19
+
20
+ - Python 3.10 or later
21
+ - A HypeLabs Connect API key (`hl_live_…`)
22
+
23
+ > The client authenticates with an API key, so run it **server-side** (a backend or a job) — never ship your
24
+ > key to a browser or a client app.
25
+
26
+ ## Install
27
+
28
+ 1. **Add the package:**
29
+
30
+ ```bash
31
+ pip install hypelabs-connect
32
+ ```
33
+
34
+ 2. **Create your organization** on the [HypeLabs Console](https://console.hypelabs.network/?utm_source=github&utm_medium=readme&utm_campaign=python-sdk) and generate an API key.
35
+
36
+ ## Usage
37
+
38
+ Create a client with your API key and call the API. Every call is async and returns typed models.
39
+
40
+ ```python
41
+ import asyncio
42
+ from hypelabs_connect import create_connect_client
43
+
44
+ client = create_connect_client("hl_live_...")
45
+
46
+
47
+ async def main():
48
+ proxies = await client.proxies.get()
49
+ for proxy in proxies or []:
50
+ print(proxy.id)
51
+
52
+
53
+ asyncio.run(main())
54
+ ```
55
+
56
+ The API is authenticated with the `X-Api-Key` header, wired up internally — you never touch the Kiota plumbing.
@@ -0,0 +1,22 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "hypelabs-connect"
7
+ version = "0.1.0"
8
+ description = "The Python client for the HypeLabs Connect API."
9
+ readme = "README.md"
10
+ license = "MIT"
11
+ requires-python = ">=3.10"
12
+ dependencies = [
13
+ "microsoft-kiota-bundle==1.15.0",
14
+ ]
15
+
16
+ [project.urls]
17
+ Homepage = "https://github.com/hypelabs-llc/python-sdk"
18
+ Repository = "https://github.com/hypelabs-llc/python-sdk"
19
+
20
+ [tool.hatch.build.targets.wheel]
21
+ packages = ["src/hypelabs_connect"]
22
+ exclude = ["**/.kiota.log", "**/kiota-lock.json"]
@@ -0,0 +1,5 @@
1
+ from .client import create_connect_client
2
+ from .api_key_authentication_provider import ApiKeyAuthenticationProvider
3
+ from .generated.connect_api_client import ConnectApiClient
4
+
5
+ __all__ = ["create_connect_client", "ApiKeyAuthenticationProvider", "ConnectApiClient"]
@@ -0,0 +1,17 @@
1
+ from __future__ import annotations
2
+
3
+ from kiota_abstractions.authentication import AuthenticationProvider
4
+ from kiota_abstractions.request_information import RequestInformation
5
+
6
+
7
+ class ApiKeyAuthenticationProvider(AuthenticationProvider):
8
+ """Authenticates every request with the Connect API's ``X-Api-Key`` header. Kiota calls this before each
9
+ outgoing request; the key is supplied once when the client is created."""
10
+
11
+ def __init__(self, api_key: str) -> None:
12
+ self._api_key = api_key
13
+
14
+ async def authenticate_request(
15
+ self, request: RequestInformation, additional_authentication_context: dict | None = None
16
+ ) -> None:
17
+ request.headers.try_add("X-Api-Key", self._api_key)
@@ -0,0 +1,26 @@
1
+ from __future__ import annotations
2
+
3
+ from kiota_bundle.default_request_adapter import DefaultRequestAdapter
4
+
5
+ from .api_key_authentication_provider import ApiKeyAuthenticationProvider
6
+ from .generated.connect_api_client import ConnectApiClient
7
+
8
+
9
+ def create_connect_client(api_key: str) -> ConnectApiClient:
10
+ """The entry point to the HypeLabs Connect API. Create one with your API key and use the fluent request
11
+ builders it returns: ``client.proxies.get()``, ``client.customers.post(...)``, and so on.
12
+
13
+ .. code-block:: python
14
+
15
+ client = create_connect_client("hl_live_...")
16
+ proxies = await client.proxies.get()
17
+
18
+ The request adapter and the ``X-Api-Key`` authentication are wired up internally, so callers never touch
19
+ the generated Kiota plumbing directly.
20
+
21
+ :param api_key: A Connect API key (e.g. ``hl_live_…``).
22
+ """
23
+ if not api_key or not api_key.strip():
24
+ raise ValueError("An API key is required.")
25
+ adapter = DefaultRequestAdapter(ApiKeyAuthenticationProvider(api_key))
26
+ return ConnectApiClient(adapter)
@@ -0,0 +1,75 @@
1
+ from __future__ import annotations
2
+ from collections.abc import Callable
3
+ from dataclasses import dataclass, field
4
+ from kiota_abstractions.base_request_builder import BaseRequestBuilder
5
+ from kiota_abstractions.base_request_configuration import RequestConfiguration
6
+ from kiota_abstractions.default_query_parameters import QueryParameters
7
+ from kiota_abstractions.get_path_parameters import get_path_parameters
8
+ from kiota_abstractions.method import Method
9
+ from kiota_abstractions.request_adapter import RequestAdapter
10
+ from kiota_abstractions.request_information import RequestInformation
11
+ from kiota_abstractions.request_option import RequestOption
12
+ from kiota_abstractions.serialization import Parsable, ParsableFactory
13
+ from typing import Any, Optional, TYPE_CHECKING, Union
14
+ from warnings import warn
15
+
16
+ if TYPE_CHECKING:
17
+ from ..models.announcement import Announcement
18
+
19
+ class AnnouncementsRequestBuilder(BaseRequestBuilder):
20
+ """
21
+ Builds and executes requests for operations under /announcements
22
+ """
23
+ def __init__(self,request_adapter: RequestAdapter, path_parameters: Union[str, dict[str, Any]]) -> None:
24
+ """
25
+ Instantiates a new AnnouncementsRequestBuilder and sets the default values.
26
+ param path_parameters: The raw url or the url-template parameters for the request.
27
+ param request_adapter: The request adapter to use to execute the requests.
28
+ Returns: None
29
+ """
30
+ super().__init__(request_adapter, "{+baseurl}/announcements", path_parameters)
31
+
32
+ async def get(self,request_configuration: Optional[RequestConfiguration[QueryParameters]] = None) -> Optional[list[Announcement]]:
33
+ """
34
+ Returns the published announcements to show in the dashboard, most recent first.
35
+ param request_configuration: Configuration for the request such as headers, query parameters, and middleware options.
36
+ Returns: Optional[list[Announcement]]
37
+ """
38
+ request_info = self.to_get_request_information(
39
+ request_configuration
40
+ )
41
+ if not self.request_adapter:
42
+ raise Exception("Http core is null")
43
+ from ..models.announcement import Announcement
44
+
45
+ return await self.request_adapter.send_collection_async(request_info, Announcement, None)
46
+
47
+ def to_get_request_information(self,request_configuration: Optional[RequestConfiguration[QueryParameters]] = None) -> RequestInformation:
48
+ """
49
+ Returns the published announcements to show in the dashboard, most recent first.
50
+ param request_configuration: Configuration for the request such as headers, query parameters, and middleware options.
51
+ Returns: RequestInformation
52
+ """
53
+ request_info = RequestInformation(Method.GET, self.url_template, self.path_parameters)
54
+ request_info.configure(request_configuration)
55
+ request_info.headers.try_add("Accept", "text/plain;q=0.9")
56
+ return request_info
57
+
58
+ def with_url(self,raw_url: str) -> AnnouncementsRequestBuilder:
59
+ """
60
+ Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
61
+ param raw_url: The raw URL to use for the request builder.
62
+ Returns: AnnouncementsRequestBuilder
63
+ """
64
+ if raw_url is None:
65
+ raise TypeError("raw_url cannot be null.")
66
+ return AnnouncementsRequestBuilder(self.request_adapter, raw_url)
67
+
68
+ @dataclass
69
+ class AnnouncementsRequestBuilderGetRequestConfiguration(RequestConfiguration[QueryParameters]):
70
+ """
71
+ Configuration for the request such as headers, query parameters, and middleware options.
72
+ """
73
+ warn("This class is deprecated. Please use the generic RequestConfiguration class generated by the generator.", DeprecationWarning)
74
+
75
+
@@ -0,0 +1,107 @@
1
+ from __future__ import annotations
2
+ from collections.abc import Callable
3
+ from dataclasses import dataclass, field
4
+ from kiota_abstractions.base_request_builder import BaseRequestBuilder
5
+ from kiota_abstractions.base_request_configuration import RequestConfiguration
6
+ from kiota_abstractions.default_query_parameters import QueryParameters
7
+ from kiota_abstractions.get_path_parameters import get_path_parameters
8
+ from kiota_abstractions.method import Method
9
+ from kiota_abstractions.request_adapter import RequestAdapter
10
+ from kiota_abstractions.request_information import RequestInformation
11
+ from kiota_abstractions.request_option import RequestOption
12
+ from kiota_abstractions.serialization import Parsable, ParsableFactory
13
+ from typing import Any, Optional, TYPE_CHECKING, Union
14
+ from uuid import UUID
15
+ from warnings import warn
16
+
17
+ if TYPE_CHECKING:
18
+ from ...models.capability import Capability
19
+
20
+ class CapabilitiesRequestBuilder(BaseRequestBuilder):
21
+ """
22
+ Builds and executes requests for operations under /catalog/capabilities
23
+ """
24
+ def __init__(self,request_adapter: RequestAdapter, path_parameters: Union[str, dict[str, Any]]) -> None:
25
+ """
26
+ Instantiates a new CapabilitiesRequestBuilder and sets the default values.
27
+ param path_parameters: The raw url or the url-template parameters for the request.
28
+ param request_adapter: The request adapter to use to execute the requests.
29
+ Returns: None
30
+ """
31
+ super().__init__(request_adapter, "{+baseurl}/catalog/capabilities{?datacenterId*,ispId*,locationId*}", path_parameters)
32
+
33
+ async def get(self,request_configuration: Optional[RequestConfiguration[CapabilitiesRequestBuilderGetQueryParameters]] = None) -> Optional[list[Capability]]:
34
+ """
35
+ Returns the sellable proxy capabilities (title, description, icon) with their stock for the selection.
36
+ param request_configuration: Configuration for the request such as headers, query parameters, and middleware options.
37
+ Returns: Optional[list[Capability]]
38
+ """
39
+ request_info = self.to_get_request_information(
40
+ request_configuration
41
+ )
42
+ if not self.request_adapter:
43
+ raise Exception("Http core is null")
44
+ from ...models.capability import Capability
45
+
46
+ return await self.request_adapter.send_collection_async(request_info, Capability, None)
47
+
48
+ def to_get_request_information(self,request_configuration: Optional[RequestConfiguration[CapabilitiesRequestBuilderGetQueryParameters]] = None) -> RequestInformation:
49
+ """
50
+ Returns the sellable proxy capabilities (title, description, icon) with their stock for the selection.
51
+ param request_configuration: Configuration for the request such as headers, query parameters, and middleware options.
52
+ Returns: RequestInformation
53
+ """
54
+ request_info = RequestInformation(Method.GET, self.url_template, self.path_parameters)
55
+ request_info.configure(request_configuration)
56
+ request_info.headers.try_add("Accept", "text/plain;q=0.9")
57
+ return request_info
58
+
59
+ def with_url(self,raw_url: str) -> CapabilitiesRequestBuilder:
60
+ """
61
+ Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
62
+ param raw_url: The raw URL to use for the request builder.
63
+ Returns: CapabilitiesRequestBuilder
64
+ """
65
+ if raw_url is None:
66
+ raise TypeError("raw_url cannot be null.")
67
+ return CapabilitiesRequestBuilder(self.request_adapter, raw_url)
68
+
69
+ @dataclass
70
+ class CapabilitiesRequestBuilderGetQueryParameters():
71
+ """
72
+ Returns the sellable proxy capabilities (title, description, icon) with their stock for the selection.
73
+ """
74
+ def get_query_parameter(self,original_name: str) -> str:
75
+ """
76
+ Maps the query parameters names to their encoded names for the URI template parsing.
77
+ param original_name: The original query parameter name in the class.
78
+ Returns: str
79
+ """
80
+ if original_name is None:
81
+ raise TypeError("original_name cannot be null.")
82
+ if original_name == "datacenter_id":
83
+ return "datacenterId"
84
+ if original_name == "isp_id":
85
+ return "ispId"
86
+ if original_name == "location_id":
87
+ return "locationId"
88
+ return original_name
89
+
90
+ # Narrow the stock to this datacenter (optional).
91
+ datacenter_id: Optional[UUID] = None
92
+
93
+ # Narrow the stock to this ISP (optional).
94
+ isp_id: Optional[UUID] = None
95
+
96
+ # Narrow the stock to this location (optional).
97
+ location_id: Optional[UUID] = None
98
+
99
+
100
+ @dataclass
101
+ class CapabilitiesRequestBuilderGetRequestConfiguration(RequestConfiguration[CapabilitiesRequestBuilderGetQueryParameters]):
102
+ """
103
+ Configuration for the request such as headers, query parameters, and middleware options.
104
+ """
105
+ warn("This class is deprecated. Please use the generic RequestConfiguration class generated by the generator.", DeprecationWarning)
106
+
107
+
@@ -0,0 +1,73 @@
1
+ from __future__ import annotations
2
+ from collections.abc import Callable
3
+ from kiota_abstractions.base_request_builder import BaseRequestBuilder
4
+ from kiota_abstractions.get_path_parameters import get_path_parameters
5
+ from kiota_abstractions.request_adapter import RequestAdapter
6
+ from typing import Any, Optional, TYPE_CHECKING, Union
7
+
8
+ if TYPE_CHECKING:
9
+ from .capabilities.capabilities_request_builder import CapabilitiesRequestBuilder
10
+ from .datacenters.datacenters_request_builder import DatacentersRequestBuilder
11
+ from .isps.isps_request_builder import IspsRequestBuilder
12
+ from .locations.locations_request_builder import LocationsRequestBuilder
13
+ from .products.products_request_builder import ProductsRequestBuilder
14
+
15
+ class CatalogRequestBuilder(BaseRequestBuilder):
16
+ """
17
+ Builds and executes requests for operations under /catalog
18
+ """
19
+ def __init__(self,request_adapter: RequestAdapter, path_parameters: Union[str, dict[str, Any]]) -> None:
20
+ """
21
+ Instantiates a new CatalogRequestBuilder and sets the default values.
22
+ param path_parameters: The raw url or the url-template parameters for the request.
23
+ param request_adapter: The request adapter to use to execute the requests.
24
+ Returns: None
25
+ """
26
+ super().__init__(request_adapter, "{+baseurl}/catalog", path_parameters)
27
+
28
+ @property
29
+ def capabilities(self) -> CapabilitiesRequestBuilder:
30
+ """
31
+ The capabilities property
32
+ """
33
+ from .capabilities.capabilities_request_builder import CapabilitiesRequestBuilder
34
+
35
+ return CapabilitiesRequestBuilder(self.request_adapter, self.path_parameters)
36
+
37
+ @property
38
+ def datacenters(self) -> DatacentersRequestBuilder:
39
+ """
40
+ The datacenters property
41
+ """
42
+ from .datacenters.datacenters_request_builder import DatacentersRequestBuilder
43
+
44
+ return DatacentersRequestBuilder(self.request_adapter, self.path_parameters)
45
+
46
+ @property
47
+ def isps(self) -> IspsRequestBuilder:
48
+ """
49
+ The isps property
50
+ """
51
+ from .isps.isps_request_builder import IspsRequestBuilder
52
+
53
+ return IspsRequestBuilder(self.request_adapter, self.path_parameters)
54
+
55
+ @property
56
+ def locations(self) -> LocationsRequestBuilder:
57
+ """
58
+ The locations property
59
+ """
60
+ from .locations.locations_request_builder import LocationsRequestBuilder
61
+
62
+ return LocationsRequestBuilder(self.request_adapter, self.path_parameters)
63
+
64
+ @property
65
+ def products(self) -> ProductsRequestBuilder:
66
+ """
67
+ The products property
68
+ """
69
+ from .products.products_request_builder import ProductsRequestBuilder
70
+
71
+ return ProductsRequestBuilder(self.request_adapter, self.path_parameters)
72
+
73
+
@@ -0,0 +1,113 @@
1
+ from __future__ import annotations
2
+ from collections.abc import Callable
3
+ from dataclasses import dataclass, field
4
+ from kiota_abstractions.base_request_builder import BaseRequestBuilder
5
+ from kiota_abstractions.base_request_configuration import RequestConfiguration
6
+ from kiota_abstractions.default_query_parameters import QueryParameters
7
+ from kiota_abstractions.get_path_parameters import get_path_parameters
8
+ from kiota_abstractions.method import Method
9
+ from kiota_abstractions.request_adapter import RequestAdapter
10
+ from kiota_abstractions.request_information import RequestInformation
11
+ from kiota_abstractions.request_option import RequestOption
12
+ from kiota_abstractions.serialization import Parsable, ParsableFactory
13
+ from typing import Any, Optional, TYPE_CHECKING, Union
14
+ from uuid import UUID
15
+ from warnings import warn
16
+
17
+ if TYPE_CHECKING:
18
+ from ...models.api_response import ApiResponse
19
+ from ...models.datacenter import Datacenter
20
+
21
+ class DatacentersRequestBuilder(BaseRequestBuilder):
22
+ """
23
+ Builds and executes requests for operations under /catalog/datacenters
24
+ """
25
+ def __init__(self,request_adapter: RequestAdapter, path_parameters: Union[str, dict[str, Any]]) -> None:
26
+ """
27
+ Instantiates a new DatacentersRequestBuilder and sets the default values.
28
+ param path_parameters: The raw url or the url-template parameters for the request.
29
+ param request_adapter: The request adapter to use to execute the requests.
30
+ Returns: None
31
+ """
32
+ super().__init__(request_adapter, "{+baseurl}/catalog/datacenters?ispId={ispId}&locationId={locationId}&productId={productId}", path_parameters)
33
+
34
+ async def get(self,request_configuration: Optional[RequestConfiguration[DatacentersRequestBuilderGetQueryParameters]] = None) -> Optional[list[Datacenter]]:
35
+ """
36
+ Returns the available datacenters for a product, location and ISP.
37
+ param request_configuration: Configuration for the request such as headers, query parameters, and middleware options.
38
+ Returns: Optional[list[Datacenter]]
39
+ """
40
+ request_info = self.to_get_request_information(
41
+ request_configuration
42
+ )
43
+ from ...models.api_response import ApiResponse
44
+
45
+ error_mapping: dict[str, type[ParsableFactory]] = {
46
+ "404": ApiResponse,
47
+ }
48
+ if not self.request_adapter:
49
+ raise Exception("Http core is null")
50
+ from ...models.datacenter import Datacenter
51
+
52
+ return await self.request_adapter.send_collection_async(request_info, Datacenter, error_mapping)
53
+
54
+ def to_get_request_information(self,request_configuration: Optional[RequestConfiguration[DatacentersRequestBuilderGetQueryParameters]] = None) -> RequestInformation:
55
+ """
56
+ Returns the available datacenters for a product, location and ISP.
57
+ param request_configuration: Configuration for the request such as headers, query parameters, and middleware options.
58
+ Returns: RequestInformation
59
+ """
60
+ request_info = RequestInformation(Method.GET, self.url_template, self.path_parameters)
61
+ request_info.configure(request_configuration)
62
+ request_info.headers.try_add("Accept", "application/json")
63
+ return request_info
64
+
65
+ def with_url(self,raw_url: str) -> DatacentersRequestBuilder:
66
+ """
67
+ Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
68
+ param raw_url: The raw URL to use for the request builder.
69
+ Returns: DatacentersRequestBuilder
70
+ """
71
+ if raw_url is None:
72
+ raise TypeError("raw_url cannot be null.")
73
+ return DatacentersRequestBuilder(self.request_adapter, raw_url)
74
+
75
+ @dataclass
76
+ class DatacentersRequestBuilderGetQueryParameters():
77
+ """
78
+ Returns the available datacenters for a product, location and ISP.
79
+ """
80
+ def get_query_parameter(self,original_name: str) -> str:
81
+ """
82
+ Maps the query parameters names to their encoded names for the URI template parsing.
83
+ param original_name: The original query parameter name in the class.
84
+ Returns: str
85
+ """
86
+ if original_name is None:
87
+ raise TypeError("original_name cannot be null.")
88
+ if original_name == "isp_id":
89
+ return "ispId"
90
+ if original_name == "location_id":
91
+ return "locationId"
92
+ if original_name == "product_id":
93
+ return "productId"
94
+ return original_name
95
+
96
+ # Identifier of the selected ISP.
97
+ isp_id: Optional[UUID] = None
98
+
99
+ # Identifier of the selected location.
100
+ location_id: Optional[UUID] = None
101
+
102
+ # Identifier of the product being priced.
103
+ product_id: Optional[UUID] = None
104
+
105
+
106
+ @dataclass
107
+ class DatacentersRequestBuilderGetRequestConfiguration(RequestConfiguration[DatacentersRequestBuilderGetQueryParameters]):
108
+ """
109
+ Configuration for the request such as headers, query parameters, and middleware options.
110
+ """
111
+ warn("This class is deprecated. Please use the generic RequestConfiguration class generated by the generator.", DeprecationWarning)
112
+
113
+