tempest-fastapi-sdk 0.95.0__tar.gz → 0.96.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 (522) hide show
  1. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/CHANGELOG.md +27 -0
  2. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/CLAUDE.md +13 -0
  3. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/PKG-INFO +12 -2
  4. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/README.md +3 -1
  5. tempest_fastapi_sdk-0.96.0/docs/recipes/genai.en.md +93 -0
  6. tempest_fastapi_sdk-0.96.0/docs/recipes/genai.md +93 -0
  7. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/mkdocs.yml +1 -0
  8. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/pyproject.toml +21 -1
  9. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/__init__.py +1 -1
  10. tempest_fastapi_sdk-0.96.0/tempest_fastapi_sdk/genai/__init__.py +51 -0
  11. tempest_fastapi_sdk-0.96.0/tempest_fastapi_sdk/genai/hardware.py +344 -0
  12. tempest_fastapi_sdk-0.96.0/tempest_fastapi_sdk/genai/schemas.py +102 -0
  13. tempest_fastapi_sdk-0.96.0/tests/genai/test_hardware.py +117 -0
  14. tempest_fastapi_sdk-0.96.0/tests/websockets/__init__.py +0 -0
  15. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/uv.lock +636 -6
  16. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/.github/workflows/ci.yml +0 -0
  17. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/.github/workflows/docs.yml +0 -0
  18. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/.github/workflows/release-pypi.yml +0 -0
  19. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/.gitignore +0 -0
  20. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/.python-version +0 -0
  21. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/Makefile +0 -0
  22. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/architecture.en.md +0 -0
  23. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/architecture.md +0 -0
  24. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/changelog.en.md +0 -0
  25. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/changelog.md +0 -0
  26. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/contributing.en.md +0 -0
  27. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/contributing.md +0 -0
  28. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/index.en.md +0 -0
  29. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/index.md +0 -0
  30. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/installation.en.md +0 -0
  31. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/installation.md +0 -0
  32. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/learning/index.en.md +0 -0
  33. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/learning/index.md +0 -0
  34. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/learning/marketplace/api.en.md +0 -0
  35. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/learning/marketplace/api.md +0 -0
  36. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/learning/marketplace/business-rules.en.md +0 -0
  37. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/learning/marketplace/business-rules.md +0 -0
  38. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/learning/marketplace/domain.en.md +0 -0
  39. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/learning/marketplace/domain.md +0 -0
  40. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/learning/marketplace/flows.en.md +0 -0
  41. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/learning/marketplace/flows.md +0 -0
  42. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/learning/marketplace/index.en.md +0 -0
  43. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/learning/marketplace/index.md +0 -0
  44. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/migration.en.md +0 -0
  45. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/migration.md +0 -0
  46. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/admin.en.md +0 -0
  47. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/admin.md +0 -0
  48. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/audit-trail.en.md +0 -0
  49. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/audit-trail.md +0 -0
  50. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/auth-flow.en.md +0 -0
  51. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/auth-flow.md +0 -0
  52. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/br-helpers.en.md +0 -0
  53. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/br-helpers.md +0 -0
  54. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/cache.en.md +0 -0
  55. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/cache.md +0 -0
  56. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/cli.en.md +0 -0
  57. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/cli.md +0 -0
  58. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/database.en.md +0 -0
  59. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/database.md +0 -0
  60. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/deploy-safety.en.md +0 -0
  61. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/deploy-safety.md +0 -0
  62. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/downloads.en.md +0 -0
  63. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/downloads.md +0 -0
  64. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/email.en.md +0 -0
  65. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/email.md +0 -0
  66. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/feature-flags.en.md +0 -0
  67. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/feature-flags.md +0 -0
  68. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/fields.en.md +0 -0
  69. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/fields.md +0 -0
  70. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/file-store.en.md +0 -0
  71. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/file-store.md +0 -0
  72. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/http-client.en.md +0 -0
  73. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/http-client.md +0 -0
  74. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/http.en.md +0 -0
  75. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/http.md +0 -0
  76. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/idempotency.en.md +0 -0
  77. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/idempotency.md +0 -0
  78. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/index.en.md +0 -0
  79. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/index.md +0 -0
  80. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/logging.en.md +0 -0
  81. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/logging.md +0 -0
  82. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/metrics.en.md +0 -0
  83. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/metrics.md +0 -0
  84. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/mfa.en.md +0 -0
  85. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/mfa.md +0 -0
  86. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/multi-tenant.en.md +0 -0
  87. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/multi-tenant.md +0 -0
  88. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/observability.en.md +0 -0
  89. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/observability.md +0 -0
  90. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/offline-sync.en.md +0 -0
  91. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/offline-sync.md +0 -0
  92. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/outbox.en.md +0 -0
  93. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/outbox.md +0 -0
  94. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/queue-tasks.en.md +0 -0
  95. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/queue-tasks.md +0 -0
  96. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/realtime.en.md +0 -0
  97. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/realtime.md +0 -0
  98. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/refresh-tokens.en.md +0 -0
  99. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/refresh-tokens.md +0 -0
  100. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/security.en.md +0 -0
  101. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/security.md +0 -0
  102. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/sessions.en.md +0 -0
  103. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/sessions.md +0 -0
  104. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/sse.en.md +0 -0
  105. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/sse.md +0 -0
  106. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/storage.en.md +0 -0
  107. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/storage.md +0 -0
  108. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/stored-files.en.md +0 -0
  109. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/stored-files.md +0 -0
  110. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/testing.en.md +0 -0
  111. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/testing.md +0 -0
  112. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/typing.en.md +0 -0
  113. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/typing.md +0 -0
  114. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/uploads.en.md +0 -0
  115. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/uploads.md +0 -0
  116. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/utilities.en.md +0 -0
  117. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/utilities.md +0 -0
  118. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/vision.en.md +0 -0
  119. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/vision.md +0 -0
  120. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/webpush.en.md +0 -0
  121. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/webpush.md +0 -0
  122. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/websocket.en.md +0 -0
  123. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/recipes/websocket.md +0 -0
  124. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/reference.en.md +0 -0
  125. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/reference.md +0 -0
  126. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/roadmap.en.md +0 -0
  127. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/roadmap.md +0 -0
  128. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/ssr.en.md +0 -0
  129. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/ssr.md +0 -0
  130. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/tutorial.en.md +0 -0
  131. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/docs/tutorial.md +0 -0
  132. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/mkdocs_hooks/llmstxt.py +0 -0
  133. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/scripts/extract_recipe.py +0 -0
  134. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/__init__.py +0 -0
  135. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/actions.py +0 -0
  136. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/auth.py +0 -0
  137. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/config.py +0 -0
  138. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/discovery.py +0 -0
  139. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/forms.py +0 -0
  140. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/router.py +0 -0
  141. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/session.py +0 -0
  142. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/site.py +0 -0
  143. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/static/admin.css +0 -0
  144. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/templates/base.html +0 -0
  145. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/templates/dashboard.html +0 -0
  146. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/templates/detail.html +0 -0
  147. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/templates/form.html +0 -0
  148. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/templates/list.html +0 -0
  149. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/templates/login.html +0 -0
  150. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/templates/logs.html +0 -0
  151. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/templates/mfa.html +0 -0
  152. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/admin/theme.py +0 -0
  153. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/__init__.py +0 -0
  154. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/cookies.py +0 -0
  155. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/dependencies/__init__.py +0 -0
  156. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/dependencies/auth.py +0 -0
  157. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/handlers.py +0 -0
  158. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/middlewares/__init__.py +0 -0
  159. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/middlewares/body_size.py +0 -0
  160. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/middlewares/cors.py +0 -0
  161. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/middlewares/csrf.py +0 -0
  162. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/middlewares/graceful.py +0 -0
  163. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/middlewares/idempotency.py +0 -0
  164. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/middlewares/rate_limit.py +0 -0
  165. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/middlewares/request_id.py +0 -0
  166. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/oauth.py +0 -0
  167. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/routers/__init__.py +0 -0
  168. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/routers/health.py +0 -0
  169. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/routers/logs.py +0 -0
  170. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/routers/metrics.py +0 -0
  171. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/routers/tool_spec.py +0 -0
  172. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/server.py +0 -0
  173. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/static.py +0 -0
  174. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/tracing.py +0 -0
  175. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/api/webhooks.py +0 -0
  176. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/__init__.py +0 -0
  177. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/guards.py +0 -0
  178. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/locale.py +0 -0
  179. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/page_renderer.py +0 -0
  180. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/router.py +0 -0
  181. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/schemas.py +0 -0
  182. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/service.py +0 -0
  183. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/en-US/activation.html +0 -0
  184. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/en-US/activation_error.html +0 -0
  185. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/en-US/activation_success.html +0 -0
  186. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/en-US/email_change.html +0 -0
  187. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/en-US/email_change_error.html +0 -0
  188. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/en-US/email_change_success.html +0 -0
  189. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/en-US/email_changed_notice.html +0 -0
  190. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/en-US/email_verification.html +0 -0
  191. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/en-US/email_verification_error.html +0 -0
  192. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/en-US/email_verification_success.html +0 -0
  193. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset.html +0 -0
  194. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_error.html +0 -0
  195. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_form.html +0 -0
  196. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_success.html +0 -0
  197. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation.html +0 -0
  198. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_error.html +0 -0
  199. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_success.html +0 -0
  200. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change.html +0 -0
  201. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change_error.html +0 -0
  202. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change_success.html +0 -0
  203. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_changed_notice.html +0 -0
  204. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification.html +0 -0
  205. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification_error.html +0 -0
  206. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification_success.html +0 -0
  207. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset.html +0 -0
  208. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_error.html +0 -0
  209. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_form.html +0 -0
  210. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_success.html +0 -0
  211. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/auth/token_delivery.py +0 -0
  212. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cache/__init__.py +0 -0
  213. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cache/decorator.py +0 -0
  214. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cache/invalidation.py +0 -0
  215. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cache/redis_manager.py +0 -0
  216. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/__init__.py +0 -0
  217. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/Dockerfile.tmpl +0 -0
  218. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/README.md.tmpl +0 -0
  219. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/dockerignore.tmpl +0 -0
  220. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/env.example.tmpl +0 -0
  221. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/gitignore.tmpl +0 -0
  222. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/main.py.tmpl +0 -0
  223. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/pyproject.toml.tmpl +0 -0
  224. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/__init__.py.tmpl +0 -0
  225. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/api/__init__.py.tmpl +0 -0
  226. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/api/app.py.tmpl +0 -0
  227. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/__init__.py.tmpl +0 -0
  228. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/auth.py.tmpl +0 -0
  229. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/resources.py.tmpl +0 -0
  230. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/api/routers/__init__.py.tmpl +0 -0
  231. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/controllers/__init__.py.tmpl +0 -0
  232. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/core/__init__.py.tmpl +0 -0
  233. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/core/exceptions.py.tmpl +0 -0
  234. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/core/settings.py.tmpl +0 -0
  235. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/db/__init__.py.tmpl +0 -0
  236. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/db/models/__init__.py.tmpl +0 -0
  237. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/db/models/user.py.tmpl +0 -0
  238. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/db/repositories/__init__.py.tmpl +0 -0
  239. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/schemas/__init__.py.tmpl +0 -0
  240. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/server.py.tmpl +0 -0
  241. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/services/__init__.py.tmpl +0 -0
  242. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/src/utils/__init__.py.tmpl +0 -0
  243. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/tests/__init__.py.tmpl +0 -0
  244. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/_templates/tests/test_smoke.py.tmpl +0 -0
  245. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/config.py +0 -0
  246. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/db.py +0 -0
  247. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/docker_compose.py +0 -0
  248. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/generate.py +0 -0
  249. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/lint.py +0 -0
  250. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/main.py +0 -0
  251. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/new.py +0 -0
  252. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/secrets.py +0 -0
  253. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/src_layers.py +0 -0
  254. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/cli/user.py +0 -0
  255. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/controllers/__init__.py +0 -0
  256. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/controllers/base.py +0 -0
  257. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/core/__init__.py +0 -0
  258. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/core/context.py +0 -0
  259. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/core/enums.py +0 -0
  260. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/core/logging.py +0 -0
  261. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/core/typed.py +0 -0
  262. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/__init__.py +0 -0
  263. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/_alembic_templates/__init__.py +0 -0
  264. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/_alembic_templates/env.py.template +0 -0
  265. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/alembic_hooks.py +0 -0
  266. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/audit.py +0 -0
  267. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/backup.py +0 -0
  268. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/connection.py +0 -0
  269. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/migrations.py +0 -0
  270. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/mixins.py +0 -0
  271. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/model.py +0 -0
  272. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/outbox.py +0 -0
  273. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/repository.py +0 -0
  274. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/slow_query.py +0 -0
  275. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/tenant.py +0 -0
  276. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/user_model.py +0 -0
  277. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/user_recovery_code_model.py +0 -0
  278. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/user_refresh_token_model.py +0 -0
  279. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/user_token_model.py +0 -0
  280. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/db/webpush_subscription_model.py +0 -0
  281. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/exceptions/__init__.py +0 -0
  282. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/exceptions/base.py +0 -0
  283. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/exceptions/conflict.py +0 -0
  284. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/exceptions/forbidden.py +0 -0
  285. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/exceptions/i18n.py +0 -0
  286. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/exceptions/jwt.py +0 -0
  287. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/exceptions/not_found.py +0 -0
  288. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/exceptions/too_many_requests.py +0 -0
  289. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/exceptions/unauthorized.py +0 -0
  290. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/exceptions/upload.py +0 -0
  291. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/exceptions/validation.py +0 -0
  292. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/flags/__init__.py +0 -0
  293. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/flags/backends.py +0 -0
  294. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/flags/dependencies.py +0 -0
  295. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/flags/service.py +0 -0
  296. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/py.typed +0 -0
  297. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/queue/__init__.py +0 -0
  298. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/queue/broker.py +0 -0
  299. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/queue/consumer.py +0 -0
  300. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/queue/manager.py +0 -0
  301. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/schemas/__init__.py +0 -0
  302. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/schemas/base.py +0 -0
  303. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/schemas/link_headers.py +0 -0
  304. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/schemas/logs.py +0 -0
  305. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/schemas/pagination.py +0 -0
  306. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/schemas/response.py +0 -0
  307. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/services/__init__.py +0 -0
  308. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/services/base.py +0 -0
  309. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/services/file_mixin.py +0 -0
  310. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/sessions/__init__.py +0 -0
  311. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/sessions/dependencies.py +0 -0
  312. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/sessions/middleware.py +0 -0
  313. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/sessions/router.py +0 -0
  314. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/sessions/schemas.py +0 -0
  315. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/sessions/service.py +0 -0
  316. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/sessions/store.py +0 -0
  317. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/settings/__init__.py +0 -0
  318. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/settings/base.py +0 -0
  319. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/settings/mixins.py +0 -0
  320. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/sse/__init__.py +0 -0
  321. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/sse/broker.py +0 -0
  322. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/sse/event_stream.py +0 -0
  323. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/ssr/__init__.py +0 -0
  324. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/ssr/_static/htmx.min.js +0 -0
  325. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/ssr/assets.py +0 -0
  326. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/ssr/page.py +0 -0
  327. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/ssr/response.py +0 -0
  328. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/storage/__init__.py +0 -0
  329. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/storage/minio_client.py +0 -0
  330. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/tasks/__init__.py +0 -0
  331. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/tasks/cron.py +0 -0
  332. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/tasks/manager.py +0 -0
  333. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/tasks/oop.py +0 -0
  334. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/tasks/queue.py +0 -0
  335. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/tasks/scheduler.py +0 -0
  336. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/testing/__init__.py +0 -0
  337. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/testing/database.py +0 -0
  338. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/__init__.py +0 -0
  339. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/client_ip.py +0 -0
  340. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/data/br_locations.json +0 -0
  341. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/datetime.py +0 -0
  342. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/dict.py +0 -0
  343. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/download.py +0 -0
  344. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/email.py +0 -0
  345. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/fields.py +0 -0
  346. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/file_store.py +0 -0
  347. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/http_client.py +0 -0
  348. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/jwt.py +0 -0
  349. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/locations.py +0 -0
  350. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/log.py +0 -0
  351. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/metrics.py +0 -0
  352. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/opaque_token.py +0 -0
  353. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/password.py +0 -0
  354. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/regex.py +0 -0
  355. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/storage_backends.py +0 -0
  356. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/throttle.py +0 -0
  357. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/totp.py +0 -0
  358. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/utils/upload.py +0 -0
  359. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/vision/__init__.py +0 -0
  360. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/vision/mapping.py +0 -0
  361. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/vision/schemas.py +0 -0
  362. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/webpush/__init__.py +0 -0
  363. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/webpush/dispatcher.py +0 -0
  364. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/webpush/router.py +0 -0
  365. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/webpush/schemas.py +0 -0
  366. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/webpush/service.py +0 -0
  367. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/websockets/__init__.py +0 -0
  368. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/websockets/hub.py +0 -0
  369. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/websockets/router.py +0 -0
  370. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tempest_fastapi_sdk/websockets/schemas.py +0 -0
  371. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/__init__.py +0 -0
  372. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/admin/__init__.py +0 -0
  373. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/admin/test_actions.py +0 -0
  374. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/admin/test_auth.py +0 -0
  375. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/admin/test_discovery.py +0 -0
  376. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/admin/test_forms.py +0 -0
  377. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/admin/test_logs_nav.py +0 -0
  378. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/admin/test_mfa.py +0 -0
  379. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/admin/test_rich_filters.py +0 -0
  380. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/admin/test_router.py +0 -0
  381. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/admin/test_site.py +0 -0
  382. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/admin/test_theme.py +0 -0
  383. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/admin/test_upload_field.py +0 -0
  384. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/admin/test_user_model.py +0 -0
  385. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/__init__.py +0 -0
  386. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_body_size.py +0 -0
  387. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_cookies.py +0 -0
  388. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_cors.py +0 -0
  389. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_csrf.py +0 -0
  390. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_dependencies_auth.py +0 -0
  391. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_graceful.py +0 -0
  392. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_handlers.py +0 -0
  393. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_health_router.py +0 -0
  394. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_idempotency.py +0 -0
  395. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_jwt_dependency.py +0 -0
  396. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_logs_router.py +0 -0
  397. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_oauth.py +0 -0
  398. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_prometheus.py +0 -0
  399. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_rate_limit.py +0 -0
  400. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_rate_limit_extras.py +0 -0
  401. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_request_id_middleware.py +0 -0
  402. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_role_dependency.py +0 -0
  403. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_server.py +0 -0
  404. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_static.py +0 -0
  405. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_tool_spec.py +0 -0
  406. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_tracing.py +0 -0
  407. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_webhooks.py +0 -0
  408. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/api/test_webhooks_rsa.py +0 -0
  409. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/auth/__init__.py +0 -0
  410. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/auth/test_cookie_delivery.py +0 -0
  411. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/auth/test_email_change.py +0 -0
  412. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/auth/test_guards.py +0 -0
  413. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/auth/test_locale.py +0 -0
  414. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/auth/test_mfa.py +0 -0
  415. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/auth/test_refresh.py +0 -0
  416. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/auth/test_refresh_db.py +0 -0
  417. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/auth/test_service.py +0 -0
  418. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/cache/__init__.py +0 -0
  419. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/cache/test_decorator.py +0 -0
  420. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/cache/test_invalidation.py +0 -0
  421. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/cache/test_redis_manager.py +0 -0
  422. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/cli/__init__.py +0 -0
  423. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/cli/test_config.py +0 -0
  424. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/cli/test_db.py +0 -0
  425. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/cli/test_db_seed.py +0 -0
  426. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/cli/test_docker_compose.py +0 -0
  427. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/cli/test_generate.py +0 -0
  428. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/cli/test_lint_strictness.py +0 -0
  429. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/cli/test_main.py +0 -0
  430. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/cli/test_secrets.py +0 -0
  431. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/cli/test_user.py +0 -0
  432. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/conftest.py +0 -0
  433. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/controllers/__init__.py +0 -0
  434. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/controllers/test_base.py +0 -0
  435. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/core/__init__.py +0 -0
  436. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/core/test_context.py +0 -0
  437. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/core/test_enums.py +0 -0
  438. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/core/test_logging.py +0 -0
  439. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/core/test_typed.py +0 -0
  440. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/db/__init__.py +0 -0
  441. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/db/test_alembic_hooks.py +0 -0
  442. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/db/test_audit.py +0 -0
  443. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/db/test_backup.py +0 -0
  444. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/db/test_bulk_ops.py +0 -0
  445. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/db/test_connection.py +0 -0
  446. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/db/test_migrations.py +0 -0
  447. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/db/test_mixins.py +0 -0
  448. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/db/test_model.py +0 -0
  449. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/db/test_outbox.py +0 -0
  450. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/db/test_repository.py +0 -0
  451. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/db/test_safe_upgrade.py +0 -0
  452. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/db/test_slow_query.py +0 -0
  453. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/db/test_tenant.py +0 -0
  454. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/exceptions/__init__.py +0 -0
  455. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/exceptions/test_exceptions.py +0 -0
  456. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/exceptions/test_i18n.py +0 -0
  457. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/flags/__init__.py +0 -0
  458. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/flags/test_flags.py +0 -0
  459. {tempest_fastapi_sdk-0.95.0/tests/queue → tempest_fastapi_sdk-0.96.0/tests/genai}/__init__.py +0 -0
  460. {tempest_fastapi_sdk-0.95.0/tests/schemas → tempest_fastapi_sdk-0.96.0/tests/queue}/__init__.py +0 -0
  461. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/queue/test_broker.py +0 -0
  462. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/queue/test_consumer.py +0 -0
  463. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/queue/test_manager.py +0 -0
  464. {tempest_fastapi_sdk-0.95.0/tests/services → tempest_fastapi_sdk-0.96.0/tests/schemas}/__init__.py +0 -0
  465. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/schemas/test_base.py +0 -0
  466. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/schemas/test_cursor_pagination.py +0 -0
  467. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/schemas/test_link_headers.py +0 -0
  468. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/schemas/test_pagination.py +0 -0
  469. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/schemas/test_response.py +0 -0
  470. {tempest_fastapi_sdk-0.95.0/tests/sessions → tempest_fastapi_sdk-0.96.0/tests/services}/__init__.py +0 -0
  471. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/services/test_base.py +0 -0
  472. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/services/test_file_mixin.py +0 -0
  473. {tempest_fastapi_sdk-0.95.0/tests/settings → tempest_fastapi_sdk-0.96.0/tests/sessions}/__init__.py +0 -0
  474. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/sessions/test_sessions.py +0 -0
  475. {tempest_fastapi_sdk-0.95.0/tests/sse → tempest_fastapi_sdk-0.96.0/tests/settings}/__init__.py +0 -0
  476. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/settings/test_base.py +0 -0
  477. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/settings/test_mixins.py +0 -0
  478. {tempest_fastapi_sdk-0.95.0/tests/ssr → tempest_fastapi_sdk-0.96.0/tests/sse}/__init__.py +0 -0
  479. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/sse/test_broker.py +0 -0
  480. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/sse/test_event_stream.py +0 -0
  481. {tempest_fastapi_sdk-0.95.0/tests/storage → tempest_fastapi_sdk-0.96.0/tests/ssr}/__init__.py +0 -0
  482. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/ssr/test_integration.py +0 -0
  483. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/ssr/test_page.py +0 -0
  484. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/ssr/test_response.py +0 -0
  485. {tempest_fastapi_sdk-0.95.0/tests/tasks → tempest_fastapi_sdk-0.96.0/tests/storage}/__init__.py +0 -0
  486. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/storage/test_minio_client.py +0 -0
  487. {tempest_fastapi_sdk-0.95.0/tests/testing → tempest_fastapi_sdk-0.96.0/tests/tasks}/__init__.py +0 -0
  488. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/tasks/test_cron.py +0 -0
  489. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/tasks/test_manager.py +0 -0
  490. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/tasks/test_oop.py +0 -0
  491. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/tasks/test_queue.py +0 -0
  492. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/tasks/test_scheduler.py +0 -0
  493. {tempest_fastapi_sdk-0.95.0/tests/utils → tempest_fastapi_sdk-0.96.0/tests/testing}/__init__.py +0 -0
  494. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/testing/test_database.py +0 -0
  495. {tempest_fastapi_sdk-0.95.0/tests/vision → tempest_fastapi_sdk-0.96.0/tests/utils}/__init__.py +0 -0
  496. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_client_ip.py +0 -0
  497. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_datetime.py +0 -0
  498. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_dict.py +0 -0
  499. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_download.py +0 -0
  500. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_email.py +0 -0
  501. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_fields.py +0 -0
  502. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_file_store.py +0 -0
  503. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_http_client.py +0 -0
  504. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_jwt.py +0 -0
  505. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_lazy_extras.py +0 -0
  506. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_locations.py +0 -0
  507. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_log.py +0 -0
  508. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_metrics.py +0 -0
  509. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_opaque_token.py +0 -0
  510. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_password.py +0 -0
  511. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_regex.py +0 -0
  512. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_storage_backends.py +0 -0
  513. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_throttle.py +0 -0
  514. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/utils/test_upload.py +0 -0
  515. {tempest_fastapi_sdk-0.95.0/tests/webpush → tempest_fastapi_sdk-0.96.0/tests/vision}/__init__.py +0 -0
  516. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/vision/test_vision.py +0 -0
  517. {tempest_fastapi_sdk-0.95.0/tests/websockets → tempest_fastapi_sdk-0.96.0/tests/webpush}/__init__.py +0 -0
  518. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/webpush/test_dispatcher.py +0 -0
  519. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/webpush/test_router.py +0 -0
  520. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/webpush/test_schemas.py +0 -0
  521. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/webpush/test_service.py +0 -0
  522. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.96.0}/tests/websockets/test_hub_and_router.py +0 -0
@@ -5,6 +5,33 @@ All notable changes to **tempest-fastapi-sdk** are listed below.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.96.0] — 2026-07-05
9
+
10
+ ### Added
11
+
12
+ - **Self-hosted GenAI — capacity check (`tempest_fastapi_sdk.genai`)**,
13
+ the first slice of running HuggingFace models on your own hardware.
14
+ Before downloading gigabytes of weights, check whether the host can run
15
+ a model:
16
+ - `probe_hardware()` → `HardwareInfo` (CPU, total/available RAM, CUDA
17
+ GPUs with per-device VRAM, Apple MPS, free disk). Degrades gracefully
18
+ without `psutil` / `torch`.
19
+ - `can_run(...)` → `CapacityReport` (`fits`, chosen `device`, estimated
20
+ vs available bytes, `headroom_pct`, and a concrete `suggestion` when
21
+ it doesn't fit — quantize, offload, or pick a smaller model).
22
+ - `recommend(...)` picks the first precision (`bfloat16` → `int8` →
23
+ `int4`) that fits.
24
+ - `estimate_model_bytes` / `bytes_per_param` (the estimation math) and
25
+ `fetch_num_params` (reads a model's parameter count from the Hub via
26
+ `huggingface_hub`, without downloading weights). `ModelDtype` enum.
27
+ - New `[genai]` extra (transformers + torch + accelerate + safetensors +
28
+ huggingface-hub) and `[genai-quant]` (bitsandbytes). The capacity
29
+ functions import **without** the extra — `torch` is only used to probe
30
+ real GPUs. Import from `tempest_fastapi_sdk.genai`.
31
+ - Upcoming slices: `TextGenerator` (+ quantization), `Embedder`,
32
+ model/result caching, `BatchScheduler`, and RAG context (web search +
33
+ PDF reading).
34
+
8
35
  ## [0.95.0] — 2026-07-05
9
36
 
10
37
  ### Added
@@ -129,6 +129,19 @@ The SDK currently covers (Sep 2025+, post-v0.31.x):
129
129
  `ort-vision-sdk`: lazy `Detector`/`Classifier`/`Segmenter` + prediction
130
130
  schemas + `to_detection_schemas`/`to_classification_schema`/
131
131
  `to_segmentation_schemas` mappers.
132
+ - **GenAI self-hosted** (`[genai]` extra: transformers+torch+accelerate;
133
+ `[genai-quant]` = bitsandbytes) — `tempest_fastapi_sdk.genai`, delivered
134
+ in slices. **Shipped (v0.96):** hardware capacity check — `probe_hardware`
135
+ → `HardwareInfo` (CPU/RAM/CUDA-VRAM/MPS/disk, degrades without
136
+ psutil/torch), `can_run`/`recommend` → `CapacityReport` (fits? device,
137
+ estimate vs available, suggestion to quantize/offload), `estimate_model_bytes`/
138
+ `bytes_per_param`/`fetch_num_params` (Hub metadata, no weight download),
139
+ `ModelDtype`. Capacity fns import WITHOUT the extra. **Planned slices:**
140
+ `TextGenerator` (LLM + int4/int8 quant, lazy load + idle-unload),
141
+ `Embedder`, model/result cache, `BatchScheduler` (coalesce concurrent
142
+ calls), RAG context (pluggable web search "leviathan-style" + PDF
143
+ reader → chunks) to inject into LLMs. Classes-only (no bundled router).
144
+ Submodule import like queue/tasks/vision.
132
145
  - **SSR** (`[ssr]` extra) — `tempest_fastapi_sdk.ssr`: typed Python
133
146
  pages rendered to HTML via `tempestweb`'s `render_to_html` /
134
147
  `render_document`. `Page` (typed `Component` base — `body()` +
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tempest-fastapi-sdk
3
- Version: 0.95.0
3
+ Version: 0.96.0
4
4
  Summary: Shared FastAPI building blocks: base schemas, ORM model, async repository, exceptions, pagination and settings — the conventions used across Tempest projects.
5
5
  Project-URL: Homepage, https://github.com/mauriciobenjamin700/tempest-fastapi-sdk
6
6
  Project-URL: Repository, https://github.com/mauriciobenjamin700/tempest-fastapi-sdk
@@ -69,6 +69,14 @@ Provides-Extra: email
69
69
  Requires-Dist: aiosmtplib>=4.0.0; extra == 'email'
70
70
  Requires-Dist: email-validator>=2.0.0; extra == 'email'
71
71
  Requires-Dist: jinja2>=3.1.0; extra == 'email'
72
+ Provides-Extra: genai
73
+ Requires-Dist: accelerate>=0.33.0; extra == 'genai'
74
+ Requires-Dist: huggingface-hub>=0.24.0; extra == 'genai'
75
+ Requires-Dist: safetensors>=0.4.0; extra == 'genai'
76
+ Requires-Dist: torch>=2.2.0; extra == 'genai'
77
+ Requires-Dist: transformers>=4.44.0; extra == 'genai'
78
+ Provides-Extra: genai-quant
79
+ Requires-Dist: bitsandbytes>=0.43.0; extra == 'genai-quant'
72
80
  Provides-Extra: http
73
81
  Requires-Dist: httpx>=0.28.0; extra == 'http'
74
82
  Provides-Extra: metrics
@@ -226,6 +234,7 @@ Feature-rich helpers pull in third-party dependencies that you only need when yo
226
234
  | `[prometheus]` | `prometheus-client` | `PrometheusMiddleware`, `make_prometheus_router`, `make_prometheus_registry` |
227
235
  | `[mfa]` | `pyotp` | `TOTPHelper` + MFA/2FA endpoints on the bundled auth flow |
228
236
  | `[vision]` | `ort-vision-sdk` | `Detector` / `Classifier` / `Segmenter` (ONNX) + prediction schemas |
237
+ | `[genai]` (+ `[genai-quant]`) | `transformers`, `torch`, `accelerate`, `safetensors`, `huggingface-hub` (+ `bitsandbytes`) | Self-hosted GenAI — hardware capacity check (`probe_hardware` / `can_run` / `recommend`); model runners upcoming |
229
238
  | `[ssr]` | `tempestweb` | `Page`, `html_response`, `make_htmx_router` — typed Python pages rendered to HTML |
230
239
  | `[otel]` | `opentelemetry-sdk` + OTLP/gRPC exporter + FastAPI/SQLAlchemy/httpx instrumentors | `setup_tracing` — distributed tracing |
231
240
  | `[sqlite]` | `aiosqlite` | SQLite async driver for `sqlite+aiosqlite://` URLs (dev default) |
@@ -268,11 +277,12 @@ Since `0.7.1` every optional dependency is imported lazily at first instantiatio
268
277
  | `tempest_fastapi_sdk.utils.storage_backends` *(extra: `[upload]`)* | `UploadStorage` protocol, `LocalUploadStorage`, `MinIOUploadStorage`, `UploadResult`, `ContentValidator` |
269
278
  | `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `TaskQueue` (typed TaskIQ facade — `.rabbitmq`/`.redis`/`.memory`, `@tq.task` → `Task.enqueue`/`.run`, `@tq.cron`/`@tq.interval`, `start_scheduler`), `Task`; class-based tasks (`TaskDef` + `@task_method` + `TaskQueue.register`); cron helpers (`Cron` / `CronOffset` / `Weekday` + `daily`/`weekdays`/`every_n_minutes`/… builders); `AsyncTaskBrokerManager` / `AsyncTaskScheduler` (legacy wrappers) |
270
279
  | `tempest_fastapi_sdk.vision` *(extra: `[vision]`)* | `Detector`, `Classifier`, `Segmenter` (ONNX, lazy), `DetectionSchema`/`ClassificationSchema`/`SegmentationSchema`/`BoundingBoxSchema`/`ClassProbabilitySchema`, `to_detection_schemas`/`to_classification_schema`/`to_segmentation_schemas` |
280
+ | `tempest_fastapi_sdk.genai` *(extra: `[genai]`; capacity check imports without it)* | Self-hosted GenAI capacity check: `probe_hardware`/`HardwareInfo`, `can_run`/`recommend`/`CapacityReport`, `estimate_model_bytes`/`bytes_per_param`/`fetch_num_params`, `ModelDtype` — model runners (`TextGenerator`, `Embedder`), caching, batching and RAG context in upcoming slices |
271
281
  | `tempest_fastapi_sdk.ssr` *(extra: `[ssr]`)* | `Page` (typed component base), `html_response` (widget tree → `HTMLResponse`, full document or HTMX fragment), `make_htmx_router` (serves bundled HTMX locally, no CDN) |
272
282
  | `tempest_fastapi_sdk.utils` | `to_utc`, `utcnow`, `modify_dict`, `LogUtils`, `AttemptThrottle`/`ThrottleBackend`/`ThrottleStatus`, `generate_opaque_token`/`hash_opaque_token`/`verify_opaque_token`, `get_client_ip`/`get_client_ip_from_scope`, `PasswordUtils` *(extra: `[auth]`)*, `JWTUtils` *(extra: `[auth]`)*, `TOTPHelper` *(extra: `[mfa]`)*, `EmailUtils` *(extra: `[email]`)*, `UploadUtils`/`sniff_mime` *(extra: `[upload]`)*, `DownloadUtils`/`build_content_disposition` *(no extra)*, `FileStoreUtils` — unified upload+download+presign facade *(extra: `[upload]` local / `[minio]` MinIO)*, `MetricsUtils`/`CPUMetrics`/`MemoryMetrics`/`DiskMetrics`/`GPUMetrics`/`SystemMetrics` *(extra: `[metrics]`)*, validated field types (`PositiveIntField`, `NonNegativeIntField`, `CentsField`, `PortField`, `PositiveFloatField`, `NonNegativeFloatField`, `PercentField`, `RatioField`, `LatitudeField`, `LongitudeField`, `PriceField`, `NonEmptyStrField`, `SlugField`, `HexColorField`), BR regex helpers (`CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField`, `PixKeyField` — old names without the suffix kept as deprecated aliases — `PixKeyType`/`detect_pix_key_type`/`is_valid_pix_key`, `is_valid_*`, `normalize_*`, `only_digits`, `*_PATTERN`), BR states/cities (`UF`, `Region`, `StateBR`, `CityBR`, `ChoiceBR`, `UFField`, `CityNameField`, `list_states`, `get_state`, `cities_by_uf`, `states_by_region`, `uf_choices`/`region_choices`/`city_choices`, `is_valid_uf`/`normalize_uf`, `is_valid_city`/`normalize_city`) |
273
283
  | `tempest_fastapi_sdk.cli` | `tempest` console script — `new <name>` (scaffold layered service), `lint` / `format` / `fmt-check` / `type` / `test` / `check` (run preferred quality gates), `version` / `--version` |
274
284
 
275
- Core primitives are re-exported from `tempest_fastapi_sdk` at the top level — `from tempest_fastapi_sdk import BaseModel, BaseRepository, AppException` always works. The extras-gated managers in `tempest_fastapi_sdk.cache`, `tempest_fastapi_sdk.queue`, `tempest_fastapi_sdk.tasks`, `tempest_fastapi_sdk.vision` and `tempest_fastapi_sdk.ssr` must be imported from their own submodule (`from tempest_fastapi_sdk.queue import MessageBroker`).
285
+ Core primitives are re-exported from `tempest_fastapi_sdk` at the top level — `from tempest_fastapi_sdk import BaseModel, BaseRepository, AppException` always works. The extras-gated managers in `tempest_fastapi_sdk.cache`, `tempest_fastapi_sdk.queue`, `tempest_fastapi_sdk.tasks`, `tempest_fastapi_sdk.vision`, `tempest_fastapi_sdk.genai` and `tempest_fastapi_sdk.ssr` must be imported from their own submodule (`from tempest_fastapi_sdk.queue import MessageBroker`).
276
286
 
277
287
  ---
278
288
 
@@ -117,6 +117,7 @@ Feature-rich helpers pull in third-party dependencies that you only need when yo
117
117
  | `[prometheus]` | `prometheus-client` | `PrometheusMiddleware`, `make_prometheus_router`, `make_prometheus_registry` |
118
118
  | `[mfa]` | `pyotp` | `TOTPHelper` + MFA/2FA endpoints on the bundled auth flow |
119
119
  | `[vision]` | `ort-vision-sdk` | `Detector` / `Classifier` / `Segmenter` (ONNX) + prediction schemas |
120
+ | `[genai]` (+ `[genai-quant]`) | `transformers`, `torch`, `accelerate`, `safetensors`, `huggingface-hub` (+ `bitsandbytes`) | Self-hosted GenAI — hardware capacity check (`probe_hardware` / `can_run` / `recommend`); model runners upcoming |
120
121
  | `[ssr]` | `tempestweb` | `Page`, `html_response`, `make_htmx_router` — typed Python pages rendered to HTML |
121
122
  | `[otel]` | `opentelemetry-sdk` + OTLP/gRPC exporter + FastAPI/SQLAlchemy/httpx instrumentors | `setup_tracing` — distributed tracing |
122
123
  | `[sqlite]` | `aiosqlite` | SQLite async driver for `sqlite+aiosqlite://` URLs (dev default) |
@@ -159,11 +160,12 @@ Since `0.7.1` every optional dependency is imported lazily at first instantiatio
159
160
  | `tempest_fastapi_sdk.utils.storage_backends` *(extra: `[upload]`)* | `UploadStorage` protocol, `LocalUploadStorage`, `MinIOUploadStorage`, `UploadResult`, `ContentValidator` |
160
161
  | `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `TaskQueue` (typed TaskIQ facade — `.rabbitmq`/`.redis`/`.memory`, `@tq.task` → `Task.enqueue`/`.run`, `@tq.cron`/`@tq.interval`, `start_scheduler`), `Task`; class-based tasks (`TaskDef` + `@task_method` + `TaskQueue.register`); cron helpers (`Cron` / `CronOffset` / `Weekday` + `daily`/`weekdays`/`every_n_minutes`/… builders); `AsyncTaskBrokerManager` / `AsyncTaskScheduler` (legacy wrappers) |
161
162
  | `tempest_fastapi_sdk.vision` *(extra: `[vision]`)* | `Detector`, `Classifier`, `Segmenter` (ONNX, lazy), `DetectionSchema`/`ClassificationSchema`/`SegmentationSchema`/`BoundingBoxSchema`/`ClassProbabilitySchema`, `to_detection_schemas`/`to_classification_schema`/`to_segmentation_schemas` |
163
+ | `tempest_fastapi_sdk.genai` *(extra: `[genai]`; capacity check imports without it)* | Self-hosted GenAI capacity check: `probe_hardware`/`HardwareInfo`, `can_run`/`recommend`/`CapacityReport`, `estimate_model_bytes`/`bytes_per_param`/`fetch_num_params`, `ModelDtype` — model runners (`TextGenerator`, `Embedder`), caching, batching and RAG context in upcoming slices |
162
164
  | `tempest_fastapi_sdk.ssr` *(extra: `[ssr]`)* | `Page` (typed component base), `html_response` (widget tree → `HTMLResponse`, full document or HTMX fragment), `make_htmx_router` (serves bundled HTMX locally, no CDN) |
163
165
  | `tempest_fastapi_sdk.utils` | `to_utc`, `utcnow`, `modify_dict`, `LogUtils`, `AttemptThrottle`/`ThrottleBackend`/`ThrottleStatus`, `generate_opaque_token`/`hash_opaque_token`/`verify_opaque_token`, `get_client_ip`/`get_client_ip_from_scope`, `PasswordUtils` *(extra: `[auth]`)*, `JWTUtils` *(extra: `[auth]`)*, `TOTPHelper` *(extra: `[mfa]`)*, `EmailUtils` *(extra: `[email]`)*, `UploadUtils`/`sniff_mime` *(extra: `[upload]`)*, `DownloadUtils`/`build_content_disposition` *(no extra)*, `FileStoreUtils` — unified upload+download+presign facade *(extra: `[upload]` local / `[minio]` MinIO)*, `MetricsUtils`/`CPUMetrics`/`MemoryMetrics`/`DiskMetrics`/`GPUMetrics`/`SystemMetrics` *(extra: `[metrics]`)*, validated field types (`PositiveIntField`, `NonNegativeIntField`, `CentsField`, `PortField`, `PositiveFloatField`, `NonNegativeFloatField`, `PercentField`, `RatioField`, `LatitudeField`, `LongitudeField`, `PriceField`, `NonEmptyStrField`, `SlugField`, `HexColorField`), BR regex helpers (`CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField`, `PixKeyField` — old names without the suffix kept as deprecated aliases — `PixKeyType`/`detect_pix_key_type`/`is_valid_pix_key`, `is_valid_*`, `normalize_*`, `only_digits`, `*_PATTERN`), BR states/cities (`UF`, `Region`, `StateBR`, `CityBR`, `ChoiceBR`, `UFField`, `CityNameField`, `list_states`, `get_state`, `cities_by_uf`, `states_by_region`, `uf_choices`/`region_choices`/`city_choices`, `is_valid_uf`/`normalize_uf`, `is_valid_city`/`normalize_city`) |
164
166
  | `tempest_fastapi_sdk.cli` | `tempest` console script — `new <name>` (scaffold layered service), `lint` / `format` / `fmt-check` / `type` / `test` / `check` (run preferred quality gates), `version` / `--version` |
165
167
 
166
- Core primitives are re-exported from `tempest_fastapi_sdk` at the top level — `from tempest_fastapi_sdk import BaseModel, BaseRepository, AppException` always works. The extras-gated managers in `tempest_fastapi_sdk.cache`, `tempest_fastapi_sdk.queue`, `tempest_fastapi_sdk.tasks`, `tempest_fastapi_sdk.vision` and `tempest_fastapi_sdk.ssr` must be imported from their own submodule (`from tempest_fastapi_sdk.queue import MessageBroker`).
168
+ Core primitives are re-exported from `tempest_fastapi_sdk` at the top level — `from tempest_fastapi_sdk import BaseModel, BaseRepository, AppException` always works. The extras-gated managers in `tempest_fastapi_sdk.cache`, `tempest_fastapi_sdk.queue`, `tempest_fastapi_sdk.tasks`, `tempest_fastapi_sdk.vision`, `tempest_fastapi_sdk.genai` and `tempest_fastapi_sdk.ssr` must be imported from their own submodule (`from tempest_fastapi_sdk.queue import MessageBroker`).
167
169
 
168
170
  ---
169
171
 
@@ -0,0 +1,93 @@
1
+ # Self-hosted generative AI
2
+
3
+ Run HuggingFace models on **your own hardware** — no external API, no data
4
+ leaving your servers. The `tempest_fastapi_sdk.genai` module ships in
5
+ slices; this page covers the **first**: knowing, *before* you download
6
+ gigabytes of weights, whether the machine can handle the model.
7
+
8
+ !!! info "Module roadmap"
9
+ - **Now (v0.96):** `genai.hardware` — probing + `can_run` / `recommend`.
10
+ - **Coming:** `TextGenerator` (LLM + int4/int8 quantization),
11
+ `Embedder`, model/result caching, `BatchScheduler`, and RAG context
12
+ (web search + PDF reading) to inject into LLMs.
13
+
14
+ The `[genai]` extra (transformers + torch + accelerate) is only needed to
15
+ **run** models. The capacity functions **import without the extra** —
16
+ `torch` is only used (when present) to read real GPU VRAM.
17
+
18
+ ## "Can the machine handle it?"
19
+
20
+ Loading a too-large model ends in an OOM minutes into the download.
21
+ `can_run` answers first:
22
+
23
+ ```python
24
+ from tempest_fastapi_sdk.genai import can_run, ModelDtype
25
+
26
+ report = can_run(model_id="Qwen/Qwen2.5-7B-Instruct", dtype=ModelDtype.BFLOAT16)
27
+
28
+ if report.fits:
29
+ print(f"OK on {report.device} — {report.headroom_pct:.0f}% headroom")
30
+ else:
31
+ print(report.reason)
32
+ print("Suggestion:", report.suggestion) # e.g. "Quantize to int4 ..."
33
+ ```
34
+
35
+ `CapacityReport` carries: `fits`, `device` (`cuda`/`mps`/`cpu`),
36
+ `estimated_bytes` vs `available_bytes`, `headroom_pct`, `reason`, and a
37
+ concrete `suggestion` when it doesn't fit (quantize, offload to CPU, or
38
+ pick a smaller model).
39
+
40
+ !!! tip "Let the SDK pick the precision"
41
+ `recommend(...)` tries `bfloat16` → `int8` → `int4` on the best
42
+ available device and returns the **first** config that fits:
43
+
44
+ ```python
45
+ from tempest_fastapi_sdk.genai import recommend
46
+
47
+ best = recommend(model_id="meta-llama/Llama-3.1-8B")
48
+ print(best.device, best.dtype, best.fits) # e.g. cuda int8 True
49
+ ```
50
+
51
+ ## Probing the hardware
52
+
53
+ ```python
54
+ from tempest_fastapi_sdk.genai import probe_hardware
55
+
56
+ hw = probe_hardware()
57
+ print(hw.cpu_cores, hw.ram_available_bytes)
58
+ print(hw.has_cuda, [g.name for g in hw.gpus]) # per-GPU VRAM when CUDA is present
59
+ ```
60
+
61
+ `HardwareInfo` reports CPU, total/available RAM, CUDA GPUs (name +
62
+ total/free VRAM), MPS (Apple), and free disk space. Without `psutil` or
63
+ `torch` installed, the matching fields fall back to safe defaults (`0` /
64
+ `False` / empty list) — nothing breaks.
65
+
66
+ ## Estimate without downloading weights
67
+
68
+ The math is `params × bytes-per-param × overhead`. Bytes per param come
69
+ from the precision (`float32`=4, `float16`/`bfloat16`=2, `int8`=1,
70
+ `int4`≈0.6); the overhead (×1.25) covers activations, KV cache and
71
+ runtime context.
72
+
73
+ ```python
74
+ from tempest_fastapi_sdk.genai import estimate_model_bytes, ModelDtype
75
+
76
+ gb = estimate_model_bytes(7_000_000_000, ModelDtype.INT4) / 1e9
77
+ print(f"~{gb:.1f} GB") # 7B in int4
78
+ ```
79
+
80
+ The parameter count can be passed explicitly (`num_params=`) or read from
81
+ the Hub by `model_id` (via `huggingface_hub`, without downloading the
82
+ weights — safetensors metadata).
83
+
84
+ ## Recap
85
+
86
+ - **`can_run` / `recommend`** — answer whether the host runs the model
87
+ and what to do if not, **before** the download.
88
+ - **`probe_hardware`** — a CPU/RAM/GPU/disk snapshot; degrades without the
89
+ extras.
90
+ - **`estimate_model_bytes` / `bytes_per_param`** — the estimation math,
91
+ testable and reusable.
92
+ - Everything imports without the `[genai]` extra; install it to actually
93
+ run models (upcoming module slices).
@@ -0,0 +1,93 @@
1
+ # IA generativa self-hosted
2
+
3
+ Rodar modelos do HuggingFace no **seu próprio hardware** — sem API
4
+ externa, sem enviar dados pra fora. O módulo `tempest_fastapi_sdk.genai`
5
+ está sendo entregue em fatias; esta página cobre a **primeira**: saber,
6
+ *antes* de baixar gigabytes de pesos, se a máquina aguenta o modelo.
7
+
8
+ !!! info "Roadmap do módulo"
9
+ - **Agora (v0.96):** `genai.hardware` — sondagem + `can_run` / `recommend`.
10
+ - **Em breve:** `TextGenerator` (LLM + quantização int4/int8),
11
+ `Embedder`, cache de modelo/resultado, `BatchScheduler`, e
12
+ contexto RAG (busca web + leitura de PDF) pra injetar nas LLMs.
13
+
14
+ O extra `[genai]` (transformers + torch + accelerate) só é necessário pra
15
+ **rodar** modelos. As funções de capacidade **importam sem o extra** — o
16
+ `torch` só é usado (quando presente) pra ver a VRAM real da GPU.
17
+
18
+ ## "A máquina aguenta?"
19
+
20
+ Carregar um modelo grande demais termina num OOM minutos depois do
21
+ download começar. `can_run` responde antes:
22
+
23
+ ```python
24
+ from tempest_fastapi_sdk.genai import can_run, ModelDtype
25
+
26
+ report = can_run(model_id="Qwen/Qwen2.5-7B-Instruct", dtype=ModelDtype.BFLOAT16)
27
+
28
+ if report.fits:
29
+ print(f"OK em {report.device} — {report.headroom_pct:.0f}% de folga")
30
+ else:
31
+ print(report.reason)
32
+ print("Sugestão:", report.suggestion) # ex.: "Quantize to int4 ..."
33
+ ```
34
+
35
+ O `CapacityReport` traz: `fits`, `device` (`cuda`/`mps`/`cpu`),
36
+ `estimated_bytes` vs `available_bytes`, `headroom_pct`, `reason` e uma
37
+ `suggestion` concreta quando não cabe (quantizar, offload pra CPU, ou
38
+ trocar de modelo).
39
+
40
+ !!! tip "Deixe o SDK escolher a precisão"
41
+ `recommend(...)` tenta `bfloat16` → `int8` → `int4` no melhor device
42
+ disponível e devolve a **primeira** config que cabe:
43
+
44
+ ```python
45
+ from tempest_fastapi_sdk.genai import recommend
46
+
47
+ best = recommend(model_id="meta-llama/Llama-3.1-8B")
48
+ print(best.device, best.dtype, best.fits) # ex.: cuda int8 True
49
+ ```
50
+
51
+ ## Sondando o hardware
52
+
53
+ ```python
54
+ from tempest_fastapi_sdk.genai import probe_hardware
55
+
56
+ hw = probe_hardware()
57
+ print(hw.cpu_cores, hw.ram_available_bytes)
58
+ print(hw.has_cuda, [g.name for g in hw.gpus]) # VRAM por GPU quando há CUDA
59
+ ```
60
+
61
+ `HardwareInfo` reporta CPU, RAM total/disponível, GPUs CUDA (nome +
62
+ VRAM total/livre), MPS (Apple) e espaço livre em disco. Sem `psutil` ou
63
+ `torch` instalados, os campos correspondentes caem pra defaults seguros
64
+ (`0` / `False` / lista vazia) — nada quebra.
65
+
66
+ ## Estimativa sem baixar pesos
67
+
68
+ A conta é `nº de parâmetros × bytes por parâmetro × overhead`. Os bytes
69
+ por parâmetro vêm da precisão (`float32`=4, `float16`/`bfloat16`=2,
70
+ `int8`=1, `int4`≈0.6); o overhead (×1.25) cobre ativações, KV-cache e
71
+ contexto de runtime.
72
+
73
+ ```python
74
+ from tempest_fastapi_sdk.genai import estimate_model_bytes, ModelDtype
75
+
76
+ gb = estimate_model_bytes(7_000_000_000, ModelDtype.INT4) / 1e9
77
+ print(f"~{gb:.1f} GB") # 7B em int4
78
+ ```
79
+
80
+ O número de parâmetros pode vir explícito (`num_params=`) ou ser lido do
81
+ Hub por `model_id` (via `huggingface_hub`, sem baixar os pesos —
82
+ metadados safetensors).
83
+
84
+ ## Recap
85
+
86
+ - **`can_run` / `recommend`** — respondem se o host roda o modelo e o que
87
+ fazer se não rodar, **antes** do download.
88
+ - **`probe_hardware`** — snapshot de CPU/RAM/GPU/disco; degrada sem os
89
+ extras.
90
+ - **`estimate_model_bytes` / `bytes_per_param`** — a matemática da
91
+ estimativa, testável e reutilizável.
92
+ - Tudo importa sem o extra `[genai]`; instale-o pra rodar modelos de fato
93
+ (fatias seguintes do módulo).
@@ -229,6 +229,7 @@ nav:
229
229
  - Fila e Tarefas: recipes/queue-tasks.md
230
230
  - Helpers brasileiros: recipes/br-helpers.md
231
231
  - "HTTP client (saída)": recipes/http-client.md
232
+ - "IA generativa self-hosted": recipes/genai.md
232
233
  - Idempotência: recipes/idempotency.md
233
234
  - Logging: recipes/logging.md
234
235
  - Métricas: recipes/metrics.md
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tempest-fastapi-sdk"
3
- version = "0.95.0"
3
+ version = "0.96.0"
4
4
  description = "Shared FastAPI building blocks: base schemas, ORM model, async repository, exceptions, pagination and settings — the conventions used across Tempest projects."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -91,6 +91,16 @@ mfa = [
91
91
  vision = [
92
92
  "ort-vision-sdk>=0.4.0",
93
93
  ]
94
+ genai = [
95
+ "transformers>=4.44.0",
96
+ "torch>=2.2.0",
97
+ "accelerate>=0.33.0",
98
+ "safetensors>=0.4.0",
99
+ "huggingface-hub>=0.24.0",
100
+ ]
101
+ genai-quant = [
102
+ "bitsandbytes>=0.43.0",
103
+ ]
94
104
  ssr = [
95
105
  "tempestweb>=0.9.0",
96
106
  ]
@@ -300,6 +310,16 @@ module = [
300
310
  "faststream.*",
301
311
  "taskiq_redis",
302
312
  "taskiq_redis.*",
313
+ "typer._click",
314
+ "typer._click.*",
315
+ "torch",
316
+ "torch.*",
317
+ "transformers",
318
+ "transformers.*",
319
+ "huggingface_hub",
320
+ "huggingface_hub.*",
321
+ "accelerate",
322
+ "accelerate.*",
303
323
  "pyotp",
304
324
  "pyotp.*",
305
325
  "ort_vision_sdk",
@@ -372,7 +372,7 @@ from tempest_fastapi_sdk.websockets import (
372
372
  make_websocket_router,
373
373
  )
374
374
 
375
- __version__: str = "0.95.0"
375
+ __version__: str = "0.96.0"
376
376
 
377
377
  __all__: list[str] = [
378
378
  "BASE_COLUMN_ORDER",
@@ -0,0 +1,51 @@
1
+ """Self-hosted generative AI — run HuggingFace models on your own hardware.
2
+
3
+ The first slice ships the **capacity check**: before you download and
4
+ load a model, ask whether the host can actually run it. Everything here
5
+ imports without the ``[genai]`` extra; ``torch`` / ``transformers`` are
6
+ only needed to probe real GPUs and (later) run inference.
7
+ """
8
+
9
+ from tempest_fastapi_sdk.genai.hardware import (
10
+ bytes_per_param as bytes_per_param,
11
+ )
12
+ from tempest_fastapi_sdk.genai.hardware import (
13
+ can_run as can_run,
14
+ )
15
+ from tempest_fastapi_sdk.genai.hardware import (
16
+ estimate_model_bytes as estimate_model_bytes,
17
+ )
18
+ from tempest_fastapi_sdk.genai.hardware import (
19
+ fetch_num_params as fetch_num_params,
20
+ )
21
+ from tempest_fastapi_sdk.genai.hardware import (
22
+ probe_hardware as probe_hardware,
23
+ )
24
+ from tempest_fastapi_sdk.genai.hardware import (
25
+ recommend as recommend,
26
+ )
27
+ from tempest_fastapi_sdk.genai.schemas import (
28
+ CapacityReport as CapacityReport,
29
+ )
30
+ from tempest_fastapi_sdk.genai.schemas import (
31
+ GPUInfo as GPUInfo,
32
+ )
33
+ from tempest_fastapi_sdk.genai.schemas import (
34
+ HardwareInfo as HardwareInfo,
35
+ )
36
+ from tempest_fastapi_sdk.genai.schemas import (
37
+ ModelDtype as ModelDtype,
38
+ )
39
+
40
+ __all__: list[str] = [
41
+ "CapacityReport",
42
+ "GPUInfo",
43
+ "HardwareInfo",
44
+ "ModelDtype",
45
+ "bytes_per_param",
46
+ "can_run",
47
+ "estimate_model_bytes",
48
+ "fetch_num_params",
49
+ "probe_hardware",
50
+ "recommend",
51
+ ]