sdkrouter 0.1.13__tar.gz → 0.1.17__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 (189) hide show
  1. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/PKG-INFO +311 -5
  2. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/README.md +309 -0
  3. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/pyproject.toml +2 -5
  4. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/__init__.py +28 -0
  5. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/client.py +9 -2
  6. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/__init__.py +4 -0
  7. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/cdn/__init__.py +8 -8
  8. sdkrouter-0.1.17/src/sdkrouter/_api/generated/cdn/cdn__api__cdn/__init__.py +27 -0
  9. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/cdn/cdn__api__cdn/client.py +60 -12
  10. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/cdn/cdn__api__cdn/models.py +28 -16
  11. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/cdn/cdn__api__cdn/sync_client.py +60 -12
  12. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/cdn/client.py +9 -10
  13. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/cdn/enums.py +4 -5
  14. sdkrouter-0.1.17/src/sdkrouter/_api/generated/cdn/helpers/__init__.py +11 -0
  15. {sdkrouter-0.1.13/src/sdkrouter/_api/generated/cleaner → sdkrouter-0.1.17/src/sdkrouter/_api/generated/cdn/helpers}/logger.py +11 -10
  16. {sdkrouter-0.1.13/src/sdkrouter/_api/generated/cleaner → sdkrouter-0.1.17/src/sdkrouter/_api/generated/cdn/helpers}/retry.py +22 -17
  17. {sdkrouter-0.1.13/src/sdkrouter/_api/generated/image_gen → sdkrouter-0.1.17/src/sdkrouter/_api/generated/cdn}/pyproject.toml +1 -0
  18. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/cdn/sync_client.py +5 -6
  19. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/cleaner/__init__.py +12 -8
  20. sdkrouter-0.1.17/src/sdkrouter/_api/generated/cleaner/cleaner__api__cleaner/__init__.py +29 -0
  21. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/cleaner/cleaner__api__cleaner/client.py +57 -11
  22. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/cleaner/cleaner__api__cleaner/models.py +16 -12
  23. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/cleaner/cleaner__api__cleaner/sync_client.py +57 -11
  24. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/cleaner/client.py +9 -10
  25. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/cleaner/enums.py +4 -5
  26. sdkrouter-0.1.17/src/sdkrouter/_api/generated/cleaner/helpers/__init__.py +11 -0
  27. {sdkrouter-0.1.13/src/sdkrouter/_api/generated/image_gen → sdkrouter-0.1.17/src/sdkrouter/_api/generated/cleaner/helpers}/logger.py +11 -10
  28. {sdkrouter-0.1.13/src/sdkrouter/_api/generated/image_gen → sdkrouter-0.1.17/src/sdkrouter/_api/generated/cleaner/helpers}/retry.py +22 -17
  29. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/cleaner/pyproject.toml +1 -0
  30. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/cleaner/sync_client.py +5 -6
  31. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/image_gen/__init__.py +12 -8
  32. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/image_gen/client.py +9 -10
  33. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/image_gen/enums.py +4 -5
  34. sdkrouter-0.1.17/src/sdkrouter/_api/generated/image_gen/helpers/__init__.py +11 -0
  35. {sdkrouter-0.1.13/src/sdkrouter/_api/generated/models → sdkrouter-0.1.17/src/sdkrouter/_api/generated/image_gen/helpers}/logger.py +11 -10
  36. {sdkrouter-0.1.13/src/sdkrouter/_api/generated/models → sdkrouter-0.1.17/src/sdkrouter/_api/generated/image_gen/helpers}/retry.py +22 -17
  37. sdkrouter-0.1.17/src/sdkrouter/_api/generated/image_gen/image_gen__api__image_gen/__init__.py +25 -0
  38. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/image_gen/image_gen__api__image_gen/client.py +46 -10
  39. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/image_gen/image_gen__api__image_gen/models.py +83 -27
  40. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/image_gen/image_gen__api__image_gen/sync_client.py +42 -9
  41. {sdkrouter-0.1.13/src/sdkrouter/_api/generated/cdn → sdkrouter-0.1.17/src/sdkrouter/_api/generated/image_gen}/pyproject.toml +1 -0
  42. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/image_gen/sync_client.py +5 -6
  43. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/models/__init__.py +14 -8
  44. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/models/client.py +9 -10
  45. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/models/enums.py +6 -5
  46. sdkrouter-0.1.17/src/sdkrouter/_api/generated/models/helpers/__init__.py +11 -0
  47. {sdkrouter-0.1.13/src/sdkrouter/_api/generated/cdn → sdkrouter-0.1.17/src/sdkrouter/_api/generated/models/helpers}/logger.py +11 -10
  48. {sdkrouter-0.1.13/src/sdkrouter/_api/generated/cdn → sdkrouter-0.1.17/src/sdkrouter/_api/generated/models/helpers}/retry.py +22 -17
  49. sdkrouter-0.1.17/src/sdkrouter/_api/generated/models/models__api__llm_models/__init__.py +33 -0
  50. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/models/models__api__llm_models/client.py +68 -13
  51. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/models/models__api__llm_models/models.py +82 -42
  52. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/models/models__api__llm_models/sync_client.py +68 -13
  53. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/models/pyproject.toml +1 -0
  54. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/models/sync_client.py +5 -6
  55. sdkrouter-0.1.17/src/sdkrouter/_api/generated/payments/__init__.py +220 -0
  56. sdkrouter-0.1.17/src/sdkrouter/_api/generated/payments/client.py +74 -0
  57. sdkrouter-0.1.17/src/sdkrouter/_api/generated/payments/enums.py +96 -0
  58. sdkrouter-0.1.17/src/sdkrouter/_api/generated/payments/helpers/__init__.py +11 -0
  59. sdkrouter-0.1.17/src/sdkrouter/_api/generated/payments/helpers/logger.py +257 -0
  60. sdkrouter-0.1.17/src/sdkrouter/_api/generated/payments/helpers/retry.py +277 -0
  61. sdkrouter-0.1.17/src/sdkrouter/_api/generated/payments/payments__api__payments/__init__.py +61 -0
  62. sdkrouter-0.1.17/src/sdkrouter/_api/generated/payments/payments__api__payments/client.py +609 -0
  63. sdkrouter-0.1.17/src/sdkrouter/_api/generated/payments/payments__api__payments/models.py +727 -0
  64. sdkrouter-0.1.17/src/sdkrouter/_api/generated/payments/payments__api__payments/sync_client.py +601 -0
  65. sdkrouter-0.1.17/src/sdkrouter/_api/generated/payments/pyproject.toml +56 -0
  66. sdkrouter-0.1.17/src/sdkrouter/_api/generated/payments/sync_client.py +57 -0
  67. sdkrouter-0.1.17/src/sdkrouter/_api/generated/proxies/__init__.py +218 -0
  68. sdkrouter-0.1.17/src/sdkrouter/_api/generated/proxies/client.py +74 -0
  69. sdkrouter-0.1.17/src/sdkrouter/_api/generated/proxies/enums.py +72 -0
  70. sdkrouter-0.1.17/src/sdkrouter/_api/generated/proxies/helpers/__init__.py +11 -0
  71. sdkrouter-0.1.17/src/sdkrouter/_api/generated/proxies/helpers/logger.py +257 -0
  72. sdkrouter-0.1.17/src/sdkrouter/_api/generated/proxies/helpers/retry.py +277 -0
  73. sdkrouter-0.1.17/src/sdkrouter/_api/generated/proxies/proxies__api__proxies/__init__.py +43 -0
  74. sdkrouter-0.1.17/src/sdkrouter/_api/generated/proxies/proxies__api__proxies/client.py +655 -0
  75. sdkrouter-0.1.17/src/sdkrouter/_api/generated/proxies/proxies__api__proxies/models.py +727 -0
  76. sdkrouter-0.1.17/src/sdkrouter/_api/generated/proxies/proxies__api__proxies/sync_client.py +647 -0
  77. sdkrouter-0.1.17/src/sdkrouter/_api/generated/proxies/pyproject.toml +56 -0
  78. sdkrouter-0.1.17/src/sdkrouter/_api/generated/proxies/sync_client.py +57 -0
  79. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/sdk_keys/__init__.py +8 -8
  80. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/sdk_keys/client.py +9 -10
  81. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/sdk_keys/enums.py +4 -5
  82. sdkrouter-0.1.17/src/sdkrouter/_api/generated/sdk_keys/helpers/__init__.py +11 -0
  83. sdkrouter-0.1.17/src/sdkrouter/_api/generated/sdk_keys/helpers/logger.py +257 -0
  84. sdkrouter-0.1.17/src/sdkrouter/_api/generated/sdk_keys/helpers/retry.py +277 -0
  85. sdkrouter-0.1.17/src/sdkrouter/_api/generated/sdk_keys/pyproject.toml +56 -0
  86. sdkrouter-0.1.17/src/sdkrouter/_api/generated/sdk_keys/sdk_keys__api__sdk_keys/__init__.py +21 -0
  87. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/sdk_keys/sdk_keys__api__sdk_keys/client.py +53 -11
  88. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/sdk_keys/sdk_keys__api__sdk_keys/models.py +45 -25
  89. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/sdk_keys/sdk_keys__api__sdk_keys/sync_client.py +53 -11
  90. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/sdk_keys/sync_client.py +5 -6
  91. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/search/__init__.py +8 -8
  92. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/search/client.py +9 -10
  93. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/search/enums.py +4 -5
  94. sdkrouter-0.1.17/src/sdkrouter/_api/generated/search/helpers/__init__.py +11 -0
  95. sdkrouter-0.1.17/src/sdkrouter/_api/generated/search/helpers/logger.py +257 -0
  96. sdkrouter-0.1.17/src/sdkrouter/_api/generated/search/helpers/retry.py +277 -0
  97. sdkrouter-0.1.17/src/sdkrouter/_api/generated/search/pyproject.toml +56 -0
  98. sdkrouter-0.1.17/src/sdkrouter/_api/generated/search/search__api__search/__init__.py +31 -0
  99. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/search/search__api__search/client.py +53 -11
  100. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/search/search__api__search/models.py +89 -71
  101. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/search/search__api__search/sync_client.py +49 -10
  102. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/search/sync_client.py +5 -6
  103. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/shortlinks/__init__.py +4 -5
  104. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/shortlinks/client.py +9 -10
  105. sdkrouter-0.1.17/src/sdkrouter/_api/generated/shortlinks/helpers/__init__.py +11 -0
  106. sdkrouter-0.1.17/src/sdkrouter/_api/generated/shortlinks/helpers/logger.py +257 -0
  107. sdkrouter-0.1.17/src/sdkrouter/_api/generated/shortlinks/helpers/retry.py +277 -0
  108. sdkrouter-0.1.17/src/sdkrouter/_api/generated/shortlinks/pyproject.toml +56 -0
  109. sdkrouter-0.1.17/src/sdkrouter/_api/generated/shortlinks/shortlinks__api__shortlinks/__init__.py +23 -0
  110. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/shortlinks/shortlinks__api__shortlinks/client.py +50 -10
  111. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/shortlinks/shortlinks__api__shortlinks/models.py +11 -11
  112. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/shortlinks/shortlinks__api__shortlinks/sync_client.py +50 -10
  113. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/shortlinks/sync_client.py +5 -6
  114. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/vision/__init__.py +10 -8
  115. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/vision/client.py +9 -10
  116. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/vision/enums.py +4 -5
  117. sdkrouter-0.1.17/src/sdkrouter/_api/generated/vision/helpers/__init__.py +11 -0
  118. sdkrouter-0.1.17/src/sdkrouter/_api/generated/vision/helpers/logger.py +257 -0
  119. sdkrouter-0.1.17/src/sdkrouter/_api/generated/vision/helpers/retry.py +277 -0
  120. sdkrouter-0.1.17/src/sdkrouter/_api/generated/vision/pyproject.toml +56 -0
  121. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/vision/sync_client.py +5 -6
  122. sdkrouter-0.1.17/src/sdkrouter/_api/generated/vision/vision__api__vision/__init__.py +21 -0
  123. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/vision/vision__api__vision/client.py +23 -5
  124. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/vision/vision__api__vision/models.py +25 -8
  125. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/generated/vision/vision__api__vision/sync_client.py +19 -4
  126. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_client.py +34 -0
  127. sdkrouter-0.1.17/src/sdkrouter/helpers/__init__.py +16 -0
  128. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/tools/__init__.py +64 -0
  129. sdkrouter-0.1.17/src/sdkrouter/tools/payments.py +840 -0
  130. sdkrouter-0.1.17/src/sdkrouter/tools/proxies.py +1153 -0
  131. sdkrouter-0.1.13/src/sdkrouter/_api/generated/cdn/cdn__api__cdn/__init__.py +0 -7
  132. sdkrouter-0.1.13/src/sdkrouter/_api/generated/cleaner/cleaner__api__cleaner/__init__.py +0 -7
  133. sdkrouter-0.1.13/src/sdkrouter/_api/generated/image_gen/image_gen__api__image_gen/__init__.py +0 -7
  134. sdkrouter-0.1.13/src/sdkrouter/_api/generated/models/models__api__llm_models/__init__.py +0 -7
  135. sdkrouter-0.1.13/src/sdkrouter/_api/generated/sdk_keys/logger.py +0 -256
  136. sdkrouter-0.1.13/src/sdkrouter/_api/generated/sdk_keys/pyproject.toml +0 -55
  137. sdkrouter-0.1.13/src/sdkrouter/_api/generated/sdk_keys/retry.py +0 -272
  138. sdkrouter-0.1.13/src/sdkrouter/_api/generated/sdk_keys/sdk_keys__api__sdk_keys/__init__.py +0 -7
  139. sdkrouter-0.1.13/src/sdkrouter/_api/generated/search/logger.py +0 -256
  140. sdkrouter-0.1.13/src/sdkrouter/_api/generated/search/pyproject.toml +0 -55
  141. sdkrouter-0.1.13/src/sdkrouter/_api/generated/search/retry.py +0 -272
  142. sdkrouter-0.1.13/src/sdkrouter/_api/generated/search/search__api__search/__init__.py +0 -7
  143. sdkrouter-0.1.13/src/sdkrouter/_api/generated/shortlinks/logger.py +0 -256
  144. sdkrouter-0.1.13/src/sdkrouter/_api/generated/shortlinks/pyproject.toml +0 -55
  145. sdkrouter-0.1.13/src/sdkrouter/_api/generated/shortlinks/retry.py +0 -272
  146. sdkrouter-0.1.13/src/sdkrouter/_api/generated/shortlinks/shortlinks__api__shortlinks/__init__.py +0 -7
  147. sdkrouter-0.1.13/src/sdkrouter/_api/generated/vision/logger.py +0 -256
  148. sdkrouter-0.1.13/src/sdkrouter/_api/generated/vision/pyproject.toml +0 -55
  149. sdkrouter-0.1.13/src/sdkrouter/_api/generated/vision/retry.py +0 -272
  150. sdkrouter-0.1.13/src/sdkrouter/_api/generated/vision/vision__api__vision/__init__.py +0 -7
  151. sdkrouter-0.1.13/src/sdkrouter/helpers/__init__.py +0 -13
  152. sdkrouter-0.1.13/src/sdkrouter/helpers/formatting.py +0 -15
  153. sdkrouter-0.1.13/src/sdkrouter/helpers/html.py +0 -104
  154. sdkrouter-0.1.13/src/sdkrouter/helpers/json_cleaner.py +0 -53
  155. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/.gitignore +0 -0
  156. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_api/__init__.py +0 -0
  157. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_config.py +0 -0
  158. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_constants.py +0 -0
  159. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_types/__init__.py +0 -0
  160. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_types/audio.py +0 -0
  161. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_types/cdn.py +0 -0
  162. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_types/models.py +0 -0
  163. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_types/ocr.py +0 -0
  164. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_types/parsed.py +0 -0
  165. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_types/shortlinks.py +0 -0
  166. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_types/vision.py +0 -0
  167. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/_version.py +0 -0
  168. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/exceptions/__init__.py +0 -0
  169. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/exceptions/handlers.py +0 -0
  170. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/exceptions/mappings.py +0 -0
  171. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/exceptions/types.py +0 -0
  172. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/logging.py +0 -0
  173. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/models/__init__.py +0 -0
  174. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/models/audio.py +0 -0
  175. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/models/llm.py +0 -0
  176. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/tools/_polling.py +0 -0
  177. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/tools/audio.py +0 -0
  178. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/tools/cdn.py +0 -0
  179. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/tools/cleaner.py +0 -0
  180. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/tools/embeddings.py +0 -0
  181. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/tools/image_gen.py +0 -0
  182. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/tools/keys.py +0 -0
  183. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/tools/models.py +0 -0
  184. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/tools/search.py +0 -0
  185. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/tools/shortlinks.py +0 -0
  186. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/tools/vision.py +0 -0
  187. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/utils/__init__.py +0 -0
  188. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/utils/parsing.py +0 -0
  189. {sdkrouter-0.1.13 → sdkrouter-0.1.17}/src/sdkrouter/utils/tokens.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sdkrouter
3
- Version: 0.1.13
3
+ Version: 0.1.17
4
4
  Summary: Unified SDK for AI services with OpenAI compatibility
5
5
  Project-URL: Homepage, https://github.com/markolofsen/sdkrouter
6
6
  Project-URL: Documentation, https://sdkrouter.com
@@ -17,17 +17,14 @@ Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
18
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
19
19
  Requires-Python: >=3.10
20
- Requires-Dist: beautifulsoup4>=4.12.0
21
20
  Requires-Dist: httpx<1.0.0,>=0.28.0
22
- Requires-Dist: lxml>=5.3.0
23
- Requires-Dist: markdownify>=0.14.0
24
21
  Requires-Dist: openai<3.0.0,>=2.0.0
25
22
  Requires-Dist: pydantic-settings>=2.7.0
26
23
  Requires-Dist: pydantic<3.0.0,>=2.10.0
27
24
  Requires-Dist: rich>=14.0.0
25
+ Requires-Dist: sdkrouter-tools>=0.1.0
28
26
  Requires-Dist: tenacity>=9.1.0
29
27
  Requires-Dist: tiktoken>=0.8.0
30
- Requires-Dist: toon-python>=0.1.2
31
28
  Provides-Extra: dev
32
29
  Requires-Dist: build>=1.2.0; extra == 'dev'
33
30
  Requires-Dist: ipykernel>=6.0.0; extra == 'dev'
@@ -750,6 +747,284 @@ result = client.embeddings.create(
750
747
  | `openai/text-embedding-3-large` | 3072 | Higher quality |
751
748
  | `openai/text-embedding-ada-002` | 1536 | Legacy |
752
749
 
750
+ ### Payments (Crypto)
751
+
752
+ Accept cryptocurrency payments and manage withdrawals:
753
+
754
+ ```python
755
+ # Get current balance
756
+ balance = client.payments.get_balance()
757
+ print(f"Balance: ${balance.balance_usd}")
758
+ print(f"Total deposited: ${balance.total_deposited}")
759
+
760
+ # List available currencies
761
+ currencies = client.payments.list_currencies()
762
+ for c in currencies.results:
763
+ print(f"{c.code}: {c.name} ({c.network})")
764
+
765
+ # Get deposit estimate
766
+ estimate = client.payments.get_deposit_estimate(
767
+ currency_code="USDTTRC20",
768
+ amount_usd=100.00,
769
+ )
770
+ print(f"Crypto amount: {estimate.crypto_amount}")
771
+ ```
772
+
773
+ #### Create Payment Invoice
774
+
775
+ ```python
776
+ # Create a payment invoice
777
+ result = client.payments.create(
778
+ amount_usd="25.00",
779
+ currency_code="USDTTRC20",
780
+ description="Premium subscription",
781
+ client_reference_id="order_12345",
782
+ )
783
+
784
+ if result.success:
785
+ payment = result.payment
786
+ print(f"Pay {payment.pay_amount} to: {payment.pay_address}")
787
+ print(f"Payment URL: {payment.payment_url}")
788
+ print(f"Expires: {payment.expires_at}")
789
+
790
+ # Check payment status
791
+ status = client.payments.check_status(payment.id, refresh=True)
792
+ print(f"Status: {status.status}")
793
+ if status.transaction_hash:
794
+ print(f"Transaction: {status.transaction_hash}")
795
+
796
+ # List all payments
797
+ payments = client.payments.list(page=1, page_size=10)
798
+ for p in payments.results:
799
+ print(f"{p.internal_payment_id}: ${p.amount_usd} - {p.status}")
800
+ ```
801
+
802
+ #### Transaction History
803
+
804
+ ```python
805
+ # List transactions
806
+ transactions = client.payments.list_transactions(page=1, page_size=10)
807
+ for tx in transactions.results:
808
+ sign = "+" if float(tx.amount_usd) > 0 else ""
809
+ print(f"{tx.transaction_type}: {sign}${tx.amount_usd}")
810
+ print(f"Balance after: ${tx.balance_after}")
811
+ ```
812
+
813
+ #### Withdrawals
814
+
815
+ ```python
816
+ # Get withdrawal estimate
817
+ estimate = client.payments.get_withdrawal_estimate(
818
+ currency_code="USDTTRC20",
819
+ amount_usd=50.00,
820
+ )
821
+ print(f"Network fee: ${estimate.network_fee_usd}")
822
+ print(f"Final amount: ${estimate.final_amount_usd}")
823
+
824
+ # Create withdrawal request
825
+ result = client.payments.create_withdrawal(
826
+ amount_usd="50.00",
827
+ currency_code="USDTTRC20",
828
+ wallet_address="TYourWalletAddress123",
829
+ )
830
+ if result.success:
831
+ print(f"Withdrawal ID: {result.withdrawal.internal_withdrawal_id}")
832
+ print(f"Status: {result.withdrawal.status}") # pending (requires admin approval)
833
+
834
+ # List withdrawals
835
+ withdrawals = client.payments.list_withdrawals()
836
+ for w in withdrawals.results:
837
+ print(f"{w.internal_withdrawal_id}: ${w.amount_usd} - {w.status}")
838
+ ```
839
+
840
+ #### Provider Credentials
841
+
842
+ ```python
843
+ # List provider credentials
844
+ credentials = client.payments.list_credentials()
845
+ for cred in credentials.results:
846
+ print(f"{cred.name}: {cred.provider.name}")
847
+ print(f"Total payments: {cred.total_payments}")
848
+ print(f"Total volume: ${cred.total_volume_usd}")
849
+
850
+ # Test credential connection
851
+ test = client.payments.test_credential(cred.id)
852
+ print(f"Connection: {'OK' if test.success else 'Failed'}")
853
+ ```
854
+
855
+ #### Payments API Summary
856
+
857
+ | Method | Description |
858
+ |--------|-------------|
859
+ | `get_balance()` | Current balance and totals |
860
+ | `list_currencies()` | Available cryptocurrencies |
861
+ | `get_deposit_estimate(...)` | Estimate crypto amount for USD |
862
+ | `create(...)` | Create payment invoice |
863
+ | `check_status(id)` | Check payment status |
864
+ | `list()` | List all payments |
865
+ | `list_transactions()` | Transaction history |
866
+ | `get_withdrawal_estimate(...)` | Estimate withdrawal fees |
867
+ | `create_withdrawal(...)` | Request withdrawal |
868
+ | `list_withdrawals()` | List withdrawals |
869
+ | `list_credentials()` | Provider credentials |
870
+ | `test_credential(id)` | Test provider connection |
871
+
872
+ ### Proxies
873
+
874
+ Manage proxies with rotation, assignments, and health monitoring:
875
+
876
+ ```python
877
+ # List all proxies
878
+ proxies = client.proxies.list(page=1, page_size=10)
879
+ for p in proxies.results:
880
+ print(f"{p.host}:{p.port} - {p.country} - {p.status}")
881
+ print(f"Success rate: {p.success_rate}%")
882
+
883
+ # Get healthy proxies (active, good success rate, fast response)
884
+ healthy = client.proxies.get_healthy()
885
+ for p in healthy:
886
+ print(f"{p.host}:{p.port}")
887
+
888
+ # Get Korean proxies
889
+ korean = client.proxies.get_korean()
890
+
891
+ # Get performance statistics
892
+ stats = client.proxies.get_performance_stats()
893
+ print(f"Stats: {stats}")
894
+ ```
895
+
896
+ #### Create and Update Proxies
897
+
898
+ ```python
899
+ # Create a new proxy
900
+ proxy = client.proxies.create(
901
+ host="192.168.1.100",
902
+ port=8080,
903
+ proxy_type="http", # http, https, socks4, socks5
904
+ proxy_mode="static", # static, rotating, mobile
905
+ country="KR",
906
+ username="user",
907
+ password="pass",
908
+ is_active=True,
909
+ )
910
+ print(f"Created: {proxy.id}")
911
+
912
+ # Update proxy
913
+ updated = client.proxies.update(
914
+ proxy.id,
915
+ status="active",
916
+ max_concurrent_requests=100,
917
+ )
918
+
919
+ # Delete proxy
920
+ client.proxies.delete(proxy.id)
921
+ ```
922
+
923
+ #### Rotation Configurations
924
+
925
+ Configure automatic proxy rotation based on criteria:
926
+
927
+ ```python
928
+ # List rotation configurations
929
+ rotations = client.proxies.list_rotations()
930
+ for r in rotations.results:
931
+ print(f"{r.name}: {r.allowed_countries}")
932
+
933
+ # Create rotation configuration
934
+ rotation = client.proxies.create_rotation(
935
+ name="Korean Fast Proxies",
936
+ allowed_countries=["KR"],
937
+ min_success_rate=95.0,
938
+ max_response_time_ms=1000,
939
+ rotation_interval_minutes=30,
940
+ is_active=True,
941
+ )
942
+
943
+ # Get available proxies matching rotation criteria
944
+ available = client.proxies.get_available_proxies_for_rotation(rotation.id)
945
+ print(f"Available: {len(available)} proxies")
946
+
947
+ # Update rotation
948
+ client.proxies.update_rotation(rotation.id, is_active=False)
949
+
950
+ # Delete rotation
951
+ client.proxies.delete_rotation(rotation.id)
952
+ ```
953
+
954
+ #### Proxy Assignments
955
+
956
+ Track proxy usage by parser:
957
+
958
+ ```python
959
+ # List assignments
960
+ assignments = client.proxies.list_assignments()
961
+ for a in assignments.results:
962
+ print(f"{a.parser_id} -> {a.proxy.host}:{a.proxy.port}")
963
+
964
+ # Get active assignments
965
+ active = client.proxies.get_active_assignments()
966
+
967
+ # Create assignment
968
+ assignment = client.proxies.create_assignment(
969
+ proxy=proxy.id,
970
+ parser_id="encar_parser",
971
+ is_active=True,
972
+ priority=5,
973
+ )
974
+
975
+ # Update assignment
976
+ client.proxies.update_assignment(assignment.id, priority=10)
977
+
978
+ # Delete assignment
979
+ client.proxies.delete_assignment(assignment.id)
980
+ ```
981
+
982
+ #### Proxy Tests
983
+
984
+ Test proxy connectivity and performance:
985
+
986
+ ```python
987
+ # List recent tests
988
+ tests = client.proxies.list_tests()
989
+ for t in tests.results:
990
+ status = "PASS" if t.is_successful else "FAIL"
991
+ print(f"[{status}] {t.proxy.host} - {t.response_time_ms}ms")
992
+
993
+ # Run a test
994
+ test = client.proxies.create_test(
995
+ proxy=proxy.id,
996
+ test_type="connectivity", # connectivity, speed, anonymity, geolocation
997
+ )
998
+ print(f"Test {'passed' if test.is_successful else 'failed'}")
999
+ print(f"Response time: {test.response_time_ms}ms")
1000
+ ```
1001
+
1002
+ #### Proxies API Summary
1003
+
1004
+ | Method | Description |
1005
+ |--------|-------------|
1006
+ | `list()` | List all proxies |
1007
+ | `get(id)` | Get proxy details |
1008
+ | `create(...)` | Create new proxy |
1009
+ | `update(id, ...)` | Update proxy |
1010
+ | `delete(id)` | Delete proxy |
1011
+ | `get_healthy()` | Get healthy proxies |
1012
+ | `get_korean()` | Get Korean proxies |
1013
+ | `get_by_country(code)` | Get by country |
1014
+ | `get_performance_stats()` | Overall stats |
1015
+ | `list_rotations()` | List rotation configs |
1016
+ | `create_rotation(...)` | Create rotation |
1017
+ | `update_rotation(id, ...)` | Update rotation |
1018
+ | `delete_rotation(id)` | Delete rotation |
1019
+ | `get_available_proxies_for_rotation(id)` | Matching proxies |
1020
+ | `list_assignments()` | List assignments |
1021
+ | `create_assignment(...)` | Create assignment |
1022
+ | `update_assignment(id, ...)` | Update assignment |
1023
+ | `delete_assignment(id)` | Delete assignment |
1024
+ | `get_active_assignments()` | Active assignments |
1025
+ | `list_tests()` | List tests |
1026
+ | `create_test(...)` | Run proxy test |
1027
+
753
1028
  ### LLM Models API
754
1029
 
755
1030
  ```python
@@ -943,6 +1218,31 @@ gen.cost_usd # str (decimal)
943
1218
  gen.duration_ms # int
944
1219
  ```
945
1220
 
1221
+ ### Helpers
1222
+
1223
+ Re-exported parsing utilities from `sdkrouter_cleaner`:
1224
+
1225
+ ```python
1226
+ from sdkrouter import json_to_toon, JsonCleaner, html_to_text, extract_links, extract_images
1227
+
1228
+ # Convert JSON/dict to TOON format
1229
+ toon_str = json_to_toon({"name": "Product", "price": 29.99})
1230
+
1231
+ # Clean and normalize messy JSON strings
1232
+ cleaner = JsonCleaner()
1233
+ cleaned = cleaner.clean(messy_json_string)
1234
+
1235
+ # Extract plain text from HTML
1236
+ text = html_to_text("<p>Hello <b>world</b></p>")
1237
+ # "Hello world"
1238
+
1239
+ # Extract all links from HTML
1240
+ links = extract_links("<a href='/page'>Link</a>", base_url="https://example.com")
1241
+
1242
+ # Extract all image URLs from HTML
1243
+ images = extract_images("<img src='/img.png'>", base_url="https://example.com")
1244
+ ```
1245
+
946
1246
  ## Exports
947
1247
 
948
1248
  ```python
@@ -976,6 +1276,12 @@ from sdkrouter import (
976
1276
  AudioAnalysisFrame,
977
1277
  TranscriptionResponse,
978
1278
  VerboseTranscriptionResponse,
1279
+ # Helpers
1280
+ json_to_toon,
1281
+ JsonCleaner,
1282
+ html_to_text,
1283
+ extract_links,
1284
+ extract_images,
979
1285
  # And more...
980
1286
  )
981
1287
  ```
@@ -706,6 +706,284 @@ result = client.embeddings.create(
706
706
  | `openai/text-embedding-3-large` | 3072 | Higher quality |
707
707
  | `openai/text-embedding-ada-002` | 1536 | Legacy |
708
708
 
709
+ ### Payments (Crypto)
710
+
711
+ Accept cryptocurrency payments and manage withdrawals:
712
+
713
+ ```python
714
+ # Get current balance
715
+ balance = client.payments.get_balance()
716
+ print(f"Balance: ${balance.balance_usd}")
717
+ print(f"Total deposited: ${balance.total_deposited}")
718
+
719
+ # List available currencies
720
+ currencies = client.payments.list_currencies()
721
+ for c in currencies.results:
722
+ print(f"{c.code}: {c.name} ({c.network})")
723
+
724
+ # Get deposit estimate
725
+ estimate = client.payments.get_deposit_estimate(
726
+ currency_code="USDTTRC20",
727
+ amount_usd=100.00,
728
+ )
729
+ print(f"Crypto amount: {estimate.crypto_amount}")
730
+ ```
731
+
732
+ #### Create Payment Invoice
733
+
734
+ ```python
735
+ # Create a payment invoice
736
+ result = client.payments.create(
737
+ amount_usd="25.00",
738
+ currency_code="USDTTRC20",
739
+ description="Premium subscription",
740
+ client_reference_id="order_12345",
741
+ )
742
+
743
+ if result.success:
744
+ payment = result.payment
745
+ print(f"Pay {payment.pay_amount} to: {payment.pay_address}")
746
+ print(f"Payment URL: {payment.payment_url}")
747
+ print(f"Expires: {payment.expires_at}")
748
+
749
+ # Check payment status
750
+ status = client.payments.check_status(payment.id, refresh=True)
751
+ print(f"Status: {status.status}")
752
+ if status.transaction_hash:
753
+ print(f"Transaction: {status.transaction_hash}")
754
+
755
+ # List all payments
756
+ payments = client.payments.list(page=1, page_size=10)
757
+ for p in payments.results:
758
+ print(f"{p.internal_payment_id}: ${p.amount_usd} - {p.status}")
759
+ ```
760
+
761
+ #### Transaction History
762
+
763
+ ```python
764
+ # List transactions
765
+ transactions = client.payments.list_transactions(page=1, page_size=10)
766
+ for tx in transactions.results:
767
+ sign = "+" if float(tx.amount_usd) > 0 else ""
768
+ print(f"{tx.transaction_type}: {sign}${tx.amount_usd}")
769
+ print(f"Balance after: ${tx.balance_after}")
770
+ ```
771
+
772
+ #### Withdrawals
773
+
774
+ ```python
775
+ # Get withdrawal estimate
776
+ estimate = client.payments.get_withdrawal_estimate(
777
+ currency_code="USDTTRC20",
778
+ amount_usd=50.00,
779
+ )
780
+ print(f"Network fee: ${estimate.network_fee_usd}")
781
+ print(f"Final amount: ${estimate.final_amount_usd}")
782
+
783
+ # Create withdrawal request
784
+ result = client.payments.create_withdrawal(
785
+ amount_usd="50.00",
786
+ currency_code="USDTTRC20",
787
+ wallet_address="TYourWalletAddress123",
788
+ )
789
+ if result.success:
790
+ print(f"Withdrawal ID: {result.withdrawal.internal_withdrawal_id}")
791
+ print(f"Status: {result.withdrawal.status}") # pending (requires admin approval)
792
+
793
+ # List withdrawals
794
+ withdrawals = client.payments.list_withdrawals()
795
+ for w in withdrawals.results:
796
+ print(f"{w.internal_withdrawal_id}: ${w.amount_usd} - {w.status}")
797
+ ```
798
+
799
+ #### Provider Credentials
800
+
801
+ ```python
802
+ # List provider credentials
803
+ credentials = client.payments.list_credentials()
804
+ for cred in credentials.results:
805
+ print(f"{cred.name}: {cred.provider.name}")
806
+ print(f"Total payments: {cred.total_payments}")
807
+ print(f"Total volume: ${cred.total_volume_usd}")
808
+
809
+ # Test credential connection
810
+ test = client.payments.test_credential(cred.id)
811
+ print(f"Connection: {'OK' if test.success else 'Failed'}")
812
+ ```
813
+
814
+ #### Payments API Summary
815
+
816
+ | Method | Description |
817
+ |--------|-------------|
818
+ | `get_balance()` | Current balance and totals |
819
+ | `list_currencies()` | Available cryptocurrencies |
820
+ | `get_deposit_estimate(...)` | Estimate crypto amount for USD |
821
+ | `create(...)` | Create payment invoice |
822
+ | `check_status(id)` | Check payment status |
823
+ | `list()` | List all payments |
824
+ | `list_transactions()` | Transaction history |
825
+ | `get_withdrawal_estimate(...)` | Estimate withdrawal fees |
826
+ | `create_withdrawal(...)` | Request withdrawal |
827
+ | `list_withdrawals()` | List withdrawals |
828
+ | `list_credentials()` | Provider credentials |
829
+ | `test_credential(id)` | Test provider connection |
830
+
831
+ ### Proxies
832
+
833
+ Manage proxies with rotation, assignments, and health monitoring:
834
+
835
+ ```python
836
+ # List all proxies
837
+ proxies = client.proxies.list(page=1, page_size=10)
838
+ for p in proxies.results:
839
+ print(f"{p.host}:{p.port} - {p.country} - {p.status}")
840
+ print(f"Success rate: {p.success_rate}%")
841
+
842
+ # Get healthy proxies (active, good success rate, fast response)
843
+ healthy = client.proxies.get_healthy()
844
+ for p in healthy:
845
+ print(f"{p.host}:{p.port}")
846
+
847
+ # Get Korean proxies
848
+ korean = client.proxies.get_korean()
849
+
850
+ # Get performance statistics
851
+ stats = client.proxies.get_performance_stats()
852
+ print(f"Stats: {stats}")
853
+ ```
854
+
855
+ #### Create and Update Proxies
856
+
857
+ ```python
858
+ # Create a new proxy
859
+ proxy = client.proxies.create(
860
+ host="192.168.1.100",
861
+ port=8080,
862
+ proxy_type="http", # http, https, socks4, socks5
863
+ proxy_mode="static", # static, rotating, mobile
864
+ country="KR",
865
+ username="user",
866
+ password="pass",
867
+ is_active=True,
868
+ )
869
+ print(f"Created: {proxy.id}")
870
+
871
+ # Update proxy
872
+ updated = client.proxies.update(
873
+ proxy.id,
874
+ status="active",
875
+ max_concurrent_requests=100,
876
+ )
877
+
878
+ # Delete proxy
879
+ client.proxies.delete(proxy.id)
880
+ ```
881
+
882
+ #### Rotation Configurations
883
+
884
+ Configure automatic proxy rotation based on criteria:
885
+
886
+ ```python
887
+ # List rotation configurations
888
+ rotations = client.proxies.list_rotations()
889
+ for r in rotations.results:
890
+ print(f"{r.name}: {r.allowed_countries}")
891
+
892
+ # Create rotation configuration
893
+ rotation = client.proxies.create_rotation(
894
+ name="Korean Fast Proxies",
895
+ allowed_countries=["KR"],
896
+ min_success_rate=95.0,
897
+ max_response_time_ms=1000,
898
+ rotation_interval_minutes=30,
899
+ is_active=True,
900
+ )
901
+
902
+ # Get available proxies matching rotation criteria
903
+ available = client.proxies.get_available_proxies_for_rotation(rotation.id)
904
+ print(f"Available: {len(available)} proxies")
905
+
906
+ # Update rotation
907
+ client.proxies.update_rotation(rotation.id, is_active=False)
908
+
909
+ # Delete rotation
910
+ client.proxies.delete_rotation(rotation.id)
911
+ ```
912
+
913
+ #### Proxy Assignments
914
+
915
+ Track proxy usage by parser:
916
+
917
+ ```python
918
+ # List assignments
919
+ assignments = client.proxies.list_assignments()
920
+ for a in assignments.results:
921
+ print(f"{a.parser_id} -> {a.proxy.host}:{a.proxy.port}")
922
+
923
+ # Get active assignments
924
+ active = client.proxies.get_active_assignments()
925
+
926
+ # Create assignment
927
+ assignment = client.proxies.create_assignment(
928
+ proxy=proxy.id,
929
+ parser_id="encar_parser",
930
+ is_active=True,
931
+ priority=5,
932
+ )
933
+
934
+ # Update assignment
935
+ client.proxies.update_assignment(assignment.id, priority=10)
936
+
937
+ # Delete assignment
938
+ client.proxies.delete_assignment(assignment.id)
939
+ ```
940
+
941
+ #### Proxy Tests
942
+
943
+ Test proxy connectivity and performance:
944
+
945
+ ```python
946
+ # List recent tests
947
+ tests = client.proxies.list_tests()
948
+ for t in tests.results:
949
+ status = "PASS" if t.is_successful else "FAIL"
950
+ print(f"[{status}] {t.proxy.host} - {t.response_time_ms}ms")
951
+
952
+ # Run a test
953
+ test = client.proxies.create_test(
954
+ proxy=proxy.id,
955
+ test_type="connectivity", # connectivity, speed, anonymity, geolocation
956
+ )
957
+ print(f"Test {'passed' if test.is_successful else 'failed'}")
958
+ print(f"Response time: {test.response_time_ms}ms")
959
+ ```
960
+
961
+ #### Proxies API Summary
962
+
963
+ | Method | Description |
964
+ |--------|-------------|
965
+ | `list()` | List all proxies |
966
+ | `get(id)` | Get proxy details |
967
+ | `create(...)` | Create new proxy |
968
+ | `update(id, ...)` | Update proxy |
969
+ | `delete(id)` | Delete proxy |
970
+ | `get_healthy()` | Get healthy proxies |
971
+ | `get_korean()` | Get Korean proxies |
972
+ | `get_by_country(code)` | Get by country |
973
+ | `get_performance_stats()` | Overall stats |
974
+ | `list_rotations()` | List rotation configs |
975
+ | `create_rotation(...)` | Create rotation |
976
+ | `update_rotation(id, ...)` | Update rotation |
977
+ | `delete_rotation(id)` | Delete rotation |
978
+ | `get_available_proxies_for_rotation(id)` | Matching proxies |
979
+ | `list_assignments()` | List assignments |
980
+ | `create_assignment(...)` | Create assignment |
981
+ | `update_assignment(id, ...)` | Update assignment |
982
+ | `delete_assignment(id)` | Delete assignment |
983
+ | `get_active_assignments()` | Active assignments |
984
+ | `list_tests()` | List tests |
985
+ | `create_test(...)` | Run proxy test |
986
+
709
987
  ### LLM Models API
710
988
 
711
989
  ```python
@@ -899,6 +1177,31 @@ gen.cost_usd # str (decimal)
899
1177
  gen.duration_ms # int
900
1178
  ```
901
1179
 
1180
+ ### Helpers
1181
+
1182
+ Re-exported parsing utilities from `sdkrouter_cleaner`:
1183
+
1184
+ ```python
1185
+ from sdkrouter import json_to_toon, JsonCleaner, html_to_text, extract_links, extract_images
1186
+
1187
+ # Convert JSON/dict to TOON format
1188
+ toon_str = json_to_toon({"name": "Product", "price": 29.99})
1189
+
1190
+ # Clean and normalize messy JSON strings
1191
+ cleaner = JsonCleaner()
1192
+ cleaned = cleaner.clean(messy_json_string)
1193
+
1194
+ # Extract plain text from HTML
1195
+ text = html_to_text("<p>Hello <b>world</b></p>")
1196
+ # "Hello world"
1197
+
1198
+ # Extract all links from HTML
1199
+ links = extract_links("<a href='/page'>Link</a>", base_url="https://example.com")
1200
+
1201
+ # Extract all image URLs from HTML
1202
+ images = extract_images("<img src='/img.png'>", base_url="https://example.com")
1203
+ ```
1204
+
902
1205
  ## Exports
903
1206
 
904
1207
  ```python
@@ -932,6 +1235,12 @@ from sdkrouter import (
932
1235
  AudioAnalysisFrame,
933
1236
  TranscriptionResponse,
934
1237
  VerboseTranscriptionResponse,
1238
+ # Helpers
1239
+ json_to_toon,
1240
+ JsonCleaner,
1241
+ html_to_text,
1242
+ extract_links,
1243
+ extract_images,
935
1244
  # And more...
936
1245
  )
937
1246
  ```
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sdkrouter"
7
- version = "0.1.13"
7
+ version = "0.1.17"
8
8
  description = "Unified SDK for AI services with OpenAI compatibility"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -29,13 +29,10 @@ dependencies = [
29
29
  "httpx>=0.28.0,<1.0.0",
30
30
  "pydantic>=2.10.0,<3.0.0",
31
31
  "pydantic-settings>=2.7.0",
32
- "beautifulsoup4>=4.12.0",
33
- "markdownify>=0.14.0",
34
32
  "rich>=14.0.0",
35
33
  "tenacity>=9.1.0",
36
- "toon-python>=0.1.2",
37
- "lxml>=5.3.0",
38
34
  "tiktoken>=0.8.0",
35
+ "sdkrouter-tools>=0.1.0",
39
36
  ]
40
37
 
41
38
  [project.optional-dependencies]