tempest-fastapi-sdk 0.95.0__tar.gz → 0.97.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 (529) hide show
  1. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/CHANGELOG.md +49 -0
  2. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/CLAUDE.md +19 -0
  3. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/PKG-INFO +18 -2
  4. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/README.md +5 -1
  5. tempest_fastapi_sdk-0.97.0/docs/recipes/genai.en.md +167 -0
  6. tempest_fastapi_sdk-0.97.0/docs/recipes/genai.md +168 -0
  7. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/mkdocs.yml +1 -0
  8. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/pyproject.toml +32 -1
  9. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/__init__.py +1 -1
  10. tempest_fastapi_sdk-0.97.0/tempest_fastapi_sdk/genai/__init__.py +51 -0
  11. tempest_fastapi_sdk-0.97.0/tempest_fastapi_sdk/genai/hardware.py +344 -0
  12. tempest_fastapi_sdk-0.97.0/tempest_fastapi_sdk/genai/rag/__init__.py +39 -0
  13. tempest_fastapi_sdk-0.97.0/tempest_fastapi_sdk/genai/rag/context.py +85 -0
  14. tempest_fastapi_sdk-0.97.0/tempest_fastapi_sdk/genai/rag/extract.py +111 -0
  15. tempest_fastapi_sdk-0.97.0/tempest_fastapi_sdk/genai/rag/pdf.py +165 -0
  16. tempest_fastapi_sdk-0.97.0/tempest_fastapi_sdk/genai/rag/schemas.py +80 -0
  17. tempest_fastapi_sdk-0.97.0/tempest_fastapi_sdk/genai/rag/search.py +166 -0
  18. tempest_fastapi_sdk-0.97.0/tempest_fastapi_sdk/genai/schemas.py +102 -0
  19. tempest_fastapi_sdk-0.97.0/tests/genai/test_hardware.py +117 -0
  20. tempest_fastapi_sdk-0.97.0/tests/genai/test_rag.py +160 -0
  21. tempest_fastapi_sdk-0.97.0/tests/websockets/__init__.py +0 -0
  22. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/uv.lock +898 -6
  23. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/.github/workflows/ci.yml +0 -0
  24. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/.github/workflows/docs.yml +0 -0
  25. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/.github/workflows/release-pypi.yml +0 -0
  26. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/.gitignore +0 -0
  27. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/.python-version +0 -0
  28. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/Makefile +0 -0
  29. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/architecture.en.md +0 -0
  30. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/architecture.md +0 -0
  31. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/changelog.en.md +0 -0
  32. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/changelog.md +0 -0
  33. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/contributing.en.md +0 -0
  34. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/contributing.md +0 -0
  35. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/index.en.md +0 -0
  36. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/index.md +0 -0
  37. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/installation.en.md +0 -0
  38. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/installation.md +0 -0
  39. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/learning/index.en.md +0 -0
  40. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/learning/index.md +0 -0
  41. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/learning/marketplace/api.en.md +0 -0
  42. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/learning/marketplace/api.md +0 -0
  43. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/learning/marketplace/business-rules.en.md +0 -0
  44. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/learning/marketplace/business-rules.md +0 -0
  45. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/learning/marketplace/domain.en.md +0 -0
  46. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/learning/marketplace/domain.md +0 -0
  47. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/learning/marketplace/flows.en.md +0 -0
  48. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/learning/marketplace/flows.md +0 -0
  49. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/learning/marketplace/index.en.md +0 -0
  50. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/learning/marketplace/index.md +0 -0
  51. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/migration.en.md +0 -0
  52. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/migration.md +0 -0
  53. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/admin.en.md +0 -0
  54. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/admin.md +0 -0
  55. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/audit-trail.en.md +0 -0
  56. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/audit-trail.md +0 -0
  57. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/auth-flow.en.md +0 -0
  58. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/auth-flow.md +0 -0
  59. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/br-helpers.en.md +0 -0
  60. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/br-helpers.md +0 -0
  61. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/cache.en.md +0 -0
  62. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/cache.md +0 -0
  63. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/cli.en.md +0 -0
  64. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/cli.md +0 -0
  65. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/database.en.md +0 -0
  66. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/database.md +0 -0
  67. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/deploy-safety.en.md +0 -0
  68. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/deploy-safety.md +0 -0
  69. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/downloads.en.md +0 -0
  70. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/downloads.md +0 -0
  71. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/email.en.md +0 -0
  72. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/email.md +0 -0
  73. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/feature-flags.en.md +0 -0
  74. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/feature-flags.md +0 -0
  75. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/fields.en.md +0 -0
  76. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/fields.md +0 -0
  77. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/file-store.en.md +0 -0
  78. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/file-store.md +0 -0
  79. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/http-client.en.md +0 -0
  80. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/http-client.md +0 -0
  81. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/http.en.md +0 -0
  82. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/http.md +0 -0
  83. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/idempotency.en.md +0 -0
  84. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/idempotency.md +0 -0
  85. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/index.en.md +0 -0
  86. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/index.md +0 -0
  87. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/logging.en.md +0 -0
  88. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/logging.md +0 -0
  89. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/metrics.en.md +0 -0
  90. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/metrics.md +0 -0
  91. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/mfa.en.md +0 -0
  92. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/mfa.md +0 -0
  93. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/multi-tenant.en.md +0 -0
  94. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/multi-tenant.md +0 -0
  95. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/observability.en.md +0 -0
  96. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/observability.md +0 -0
  97. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/offline-sync.en.md +0 -0
  98. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/offline-sync.md +0 -0
  99. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/outbox.en.md +0 -0
  100. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/outbox.md +0 -0
  101. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/queue-tasks.en.md +0 -0
  102. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/queue-tasks.md +0 -0
  103. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/realtime.en.md +0 -0
  104. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/realtime.md +0 -0
  105. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/refresh-tokens.en.md +0 -0
  106. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/refresh-tokens.md +0 -0
  107. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/security.en.md +0 -0
  108. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/security.md +0 -0
  109. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/sessions.en.md +0 -0
  110. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/sessions.md +0 -0
  111. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/sse.en.md +0 -0
  112. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/sse.md +0 -0
  113. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/storage.en.md +0 -0
  114. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/storage.md +0 -0
  115. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/stored-files.en.md +0 -0
  116. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/stored-files.md +0 -0
  117. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/testing.en.md +0 -0
  118. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/testing.md +0 -0
  119. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/typing.en.md +0 -0
  120. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/typing.md +0 -0
  121. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/uploads.en.md +0 -0
  122. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/uploads.md +0 -0
  123. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/utilities.en.md +0 -0
  124. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/utilities.md +0 -0
  125. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/vision.en.md +0 -0
  126. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/vision.md +0 -0
  127. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/webpush.en.md +0 -0
  128. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/webpush.md +0 -0
  129. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/websocket.en.md +0 -0
  130. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/recipes/websocket.md +0 -0
  131. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/reference.en.md +0 -0
  132. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/reference.md +0 -0
  133. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/roadmap.en.md +0 -0
  134. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/roadmap.md +0 -0
  135. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/ssr.en.md +0 -0
  136. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/ssr.md +0 -0
  137. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/tutorial.en.md +0 -0
  138. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/docs/tutorial.md +0 -0
  139. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/mkdocs_hooks/llmstxt.py +0 -0
  140. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/scripts/extract_recipe.py +0 -0
  141. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/__init__.py +0 -0
  142. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/actions.py +0 -0
  143. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/auth.py +0 -0
  144. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/config.py +0 -0
  145. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/discovery.py +0 -0
  146. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/forms.py +0 -0
  147. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/router.py +0 -0
  148. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/session.py +0 -0
  149. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/site.py +0 -0
  150. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/static/admin.css +0 -0
  151. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/templates/base.html +0 -0
  152. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/templates/dashboard.html +0 -0
  153. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/templates/detail.html +0 -0
  154. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/templates/form.html +0 -0
  155. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/templates/list.html +0 -0
  156. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/templates/login.html +0 -0
  157. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/templates/logs.html +0 -0
  158. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/templates/mfa.html +0 -0
  159. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/admin/theme.py +0 -0
  160. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/__init__.py +0 -0
  161. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/cookies.py +0 -0
  162. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/dependencies/__init__.py +0 -0
  163. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/dependencies/auth.py +0 -0
  164. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/handlers.py +0 -0
  165. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/middlewares/__init__.py +0 -0
  166. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/middlewares/body_size.py +0 -0
  167. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/middlewares/cors.py +0 -0
  168. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/middlewares/csrf.py +0 -0
  169. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/middlewares/graceful.py +0 -0
  170. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/middlewares/idempotency.py +0 -0
  171. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/middlewares/rate_limit.py +0 -0
  172. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/middlewares/request_id.py +0 -0
  173. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/oauth.py +0 -0
  174. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/routers/__init__.py +0 -0
  175. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/routers/health.py +0 -0
  176. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/routers/logs.py +0 -0
  177. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/routers/metrics.py +0 -0
  178. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/routers/tool_spec.py +0 -0
  179. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/server.py +0 -0
  180. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/static.py +0 -0
  181. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/tracing.py +0 -0
  182. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/api/webhooks.py +0 -0
  183. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/__init__.py +0 -0
  184. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/guards.py +0 -0
  185. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/locale.py +0 -0
  186. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/page_renderer.py +0 -0
  187. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/router.py +0 -0
  188. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/schemas.py +0 -0
  189. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/service.py +0 -0
  190. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/en-US/activation.html +0 -0
  191. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/en-US/activation_error.html +0 -0
  192. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/en-US/activation_success.html +0 -0
  193. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/en-US/email_change.html +0 -0
  194. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/en-US/email_change_error.html +0 -0
  195. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/en-US/email_change_success.html +0 -0
  196. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/en-US/email_changed_notice.html +0 -0
  197. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/en-US/email_verification.html +0 -0
  198. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/en-US/email_verification_error.html +0 -0
  199. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/en-US/email_verification_success.html +0 -0
  200. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset.html +0 -0
  201. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_error.html +0 -0
  202. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_form.html +0 -0
  203. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_success.html +0 -0
  204. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation.html +0 -0
  205. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_error.html +0 -0
  206. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_success.html +0 -0
  207. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change.html +0 -0
  208. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change_error.html +0 -0
  209. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change_success.html +0 -0
  210. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_changed_notice.html +0 -0
  211. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification.html +0 -0
  212. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification_error.html +0 -0
  213. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification_success.html +0 -0
  214. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset.html +0 -0
  215. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_error.html +0 -0
  216. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_form.html +0 -0
  217. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_success.html +0 -0
  218. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/auth/token_delivery.py +0 -0
  219. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cache/__init__.py +0 -0
  220. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cache/decorator.py +0 -0
  221. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cache/invalidation.py +0 -0
  222. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cache/redis_manager.py +0 -0
  223. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/__init__.py +0 -0
  224. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/Dockerfile.tmpl +0 -0
  225. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/README.md.tmpl +0 -0
  226. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/dockerignore.tmpl +0 -0
  227. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/env.example.tmpl +0 -0
  228. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/gitignore.tmpl +0 -0
  229. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/main.py.tmpl +0 -0
  230. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/pyproject.toml.tmpl +0 -0
  231. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/__init__.py.tmpl +0 -0
  232. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/api/__init__.py.tmpl +0 -0
  233. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/api/app.py.tmpl +0 -0
  234. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/__init__.py.tmpl +0 -0
  235. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/auth.py.tmpl +0 -0
  236. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/resources.py.tmpl +0 -0
  237. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/api/routers/__init__.py.tmpl +0 -0
  238. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/controllers/__init__.py.tmpl +0 -0
  239. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/core/__init__.py.tmpl +0 -0
  240. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/core/exceptions.py.tmpl +0 -0
  241. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/core/settings.py.tmpl +0 -0
  242. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/db/__init__.py.tmpl +0 -0
  243. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/db/models/__init__.py.tmpl +0 -0
  244. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/db/models/user.py.tmpl +0 -0
  245. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/db/repositories/__init__.py.tmpl +0 -0
  246. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/schemas/__init__.py.tmpl +0 -0
  247. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/server.py.tmpl +0 -0
  248. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/services/__init__.py.tmpl +0 -0
  249. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/src/utils/__init__.py.tmpl +0 -0
  250. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/tests/__init__.py.tmpl +0 -0
  251. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/_templates/tests/test_smoke.py.tmpl +0 -0
  252. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/config.py +0 -0
  253. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/db.py +0 -0
  254. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/docker_compose.py +0 -0
  255. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/generate.py +0 -0
  256. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/lint.py +0 -0
  257. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/main.py +0 -0
  258. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/new.py +0 -0
  259. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/secrets.py +0 -0
  260. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/src_layers.py +0 -0
  261. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/cli/user.py +0 -0
  262. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/controllers/__init__.py +0 -0
  263. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/controllers/base.py +0 -0
  264. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/core/__init__.py +0 -0
  265. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/core/context.py +0 -0
  266. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/core/enums.py +0 -0
  267. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/core/logging.py +0 -0
  268. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/core/typed.py +0 -0
  269. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/__init__.py +0 -0
  270. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/_alembic_templates/__init__.py +0 -0
  271. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/_alembic_templates/env.py.template +0 -0
  272. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/alembic_hooks.py +0 -0
  273. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/audit.py +0 -0
  274. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/backup.py +0 -0
  275. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/connection.py +0 -0
  276. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/migrations.py +0 -0
  277. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/mixins.py +0 -0
  278. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/model.py +0 -0
  279. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/outbox.py +0 -0
  280. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/repository.py +0 -0
  281. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/slow_query.py +0 -0
  282. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/tenant.py +0 -0
  283. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/user_model.py +0 -0
  284. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/user_recovery_code_model.py +0 -0
  285. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/user_refresh_token_model.py +0 -0
  286. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/user_token_model.py +0 -0
  287. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/db/webpush_subscription_model.py +0 -0
  288. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/exceptions/__init__.py +0 -0
  289. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/exceptions/base.py +0 -0
  290. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/exceptions/conflict.py +0 -0
  291. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/exceptions/forbidden.py +0 -0
  292. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/exceptions/i18n.py +0 -0
  293. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/exceptions/jwt.py +0 -0
  294. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/exceptions/not_found.py +0 -0
  295. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/exceptions/too_many_requests.py +0 -0
  296. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/exceptions/unauthorized.py +0 -0
  297. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/exceptions/upload.py +0 -0
  298. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/exceptions/validation.py +0 -0
  299. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/flags/__init__.py +0 -0
  300. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/flags/backends.py +0 -0
  301. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/flags/dependencies.py +0 -0
  302. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/flags/service.py +0 -0
  303. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/py.typed +0 -0
  304. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/queue/__init__.py +0 -0
  305. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/queue/broker.py +0 -0
  306. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/queue/consumer.py +0 -0
  307. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/queue/manager.py +0 -0
  308. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/schemas/__init__.py +0 -0
  309. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/schemas/base.py +0 -0
  310. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/schemas/link_headers.py +0 -0
  311. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/schemas/logs.py +0 -0
  312. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/schemas/pagination.py +0 -0
  313. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/schemas/response.py +0 -0
  314. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/services/__init__.py +0 -0
  315. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/services/base.py +0 -0
  316. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/services/file_mixin.py +0 -0
  317. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/sessions/__init__.py +0 -0
  318. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/sessions/dependencies.py +0 -0
  319. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/sessions/middleware.py +0 -0
  320. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/sessions/router.py +0 -0
  321. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/sessions/schemas.py +0 -0
  322. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/sessions/service.py +0 -0
  323. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/sessions/store.py +0 -0
  324. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/settings/__init__.py +0 -0
  325. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/settings/base.py +0 -0
  326. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/settings/mixins.py +0 -0
  327. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/sse/__init__.py +0 -0
  328. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/sse/broker.py +0 -0
  329. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/sse/event_stream.py +0 -0
  330. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/ssr/__init__.py +0 -0
  331. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/ssr/_static/htmx.min.js +0 -0
  332. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/ssr/assets.py +0 -0
  333. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/ssr/page.py +0 -0
  334. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/ssr/response.py +0 -0
  335. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/storage/__init__.py +0 -0
  336. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/storage/minio_client.py +0 -0
  337. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/tasks/__init__.py +0 -0
  338. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/tasks/cron.py +0 -0
  339. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/tasks/manager.py +0 -0
  340. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/tasks/oop.py +0 -0
  341. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/tasks/queue.py +0 -0
  342. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/tasks/scheduler.py +0 -0
  343. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/testing/__init__.py +0 -0
  344. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/testing/database.py +0 -0
  345. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/__init__.py +0 -0
  346. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/client_ip.py +0 -0
  347. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/data/br_locations.json +0 -0
  348. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/datetime.py +0 -0
  349. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/dict.py +0 -0
  350. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/download.py +0 -0
  351. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/email.py +0 -0
  352. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/fields.py +0 -0
  353. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/file_store.py +0 -0
  354. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/http_client.py +0 -0
  355. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/jwt.py +0 -0
  356. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/locations.py +0 -0
  357. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/log.py +0 -0
  358. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/metrics.py +0 -0
  359. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/opaque_token.py +0 -0
  360. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/password.py +0 -0
  361. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/regex.py +0 -0
  362. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/storage_backends.py +0 -0
  363. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/throttle.py +0 -0
  364. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/totp.py +0 -0
  365. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/utils/upload.py +0 -0
  366. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/vision/__init__.py +0 -0
  367. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/vision/mapping.py +0 -0
  368. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/vision/schemas.py +0 -0
  369. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/webpush/__init__.py +0 -0
  370. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/webpush/dispatcher.py +0 -0
  371. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/webpush/router.py +0 -0
  372. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/webpush/schemas.py +0 -0
  373. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/webpush/service.py +0 -0
  374. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/websockets/__init__.py +0 -0
  375. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/websockets/hub.py +0 -0
  376. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/websockets/router.py +0 -0
  377. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tempest_fastapi_sdk/websockets/schemas.py +0 -0
  378. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/__init__.py +0 -0
  379. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/admin/__init__.py +0 -0
  380. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/admin/test_actions.py +0 -0
  381. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/admin/test_auth.py +0 -0
  382. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/admin/test_discovery.py +0 -0
  383. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/admin/test_forms.py +0 -0
  384. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/admin/test_logs_nav.py +0 -0
  385. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/admin/test_mfa.py +0 -0
  386. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/admin/test_rich_filters.py +0 -0
  387. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/admin/test_router.py +0 -0
  388. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/admin/test_site.py +0 -0
  389. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/admin/test_theme.py +0 -0
  390. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/admin/test_upload_field.py +0 -0
  391. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/admin/test_user_model.py +0 -0
  392. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/__init__.py +0 -0
  393. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_body_size.py +0 -0
  394. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_cookies.py +0 -0
  395. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_cors.py +0 -0
  396. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_csrf.py +0 -0
  397. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_dependencies_auth.py +0 -0
  398. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_graceful.py +0 -0
  399. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_handlers.py +0 -0
  400. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_health_router.py +0 -0
  401. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_idempotency.py +0 -0
  402. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_jwt_dependency.py +0 -0
  403. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_logs_router.py +0 -0
  404. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_oauth.py +0 -0
  405. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_prometheus.py +0 -0
  406. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_rate_limit.py +0 -0
  407. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_rate_limit_extras.py +0 -0
  408. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_request_id_middleware.py +0 -0
  409. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_role_dependency.py +0 -0
  410. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_server.py +0 -0
  411. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_static.py +0 -0
  412. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_tool_spec.py +0 -0
  413. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_tracing.py +0 -0
  414. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_webhooks.py +0 -0
  415. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/api/test_webhooks_rsa.py +0 -0
  416. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/auth/__init__.py +0 -0
  417. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/auth/test_cookie_delivery.py +0 -0
  418. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/auth/test_email_change.py +0 -0
  419. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/auth/test_guards.py +0 -0
  420. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/auth/test_locale.py +0 -0
  421. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/auth/test_mfa.py +0 -0
  422. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/auth/test_refresh.py +0 -0
  423. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/auth/test_refresh_db.py +0 -0
  424. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/auth/test_service.py +0 -0
  425. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/cache/__init__.py +0 -0
  426. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/cache/test_decorator.py +0 -0
  427. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/cache/test_invalidation.py +0 -0
  428. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/cache/test_redis_manager.py +0 -0
  429. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/cli/__init__.py +0 -0
  430. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/cli/test_config.py +0 -0
  431. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/cli/test_db.py +0 -0
  432. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/cli/test_db_seed.py +0 -0
  433. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/cli/test_docker_compose.py +0 -0
  434. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/cli/test_generate.py +0 -0
  435. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/cli/test_lint_strictness.py +0 -0
  436. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/cli/test_main.py +0 -0
  437. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/cli/test_secrets.py +0 -0
  438. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/cli/test_user.py +0 -0
  439. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/conftest.py +0 -0
  440. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/controllers/__init__.py +0 -0
  441. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/controllers/test_base.py +0 -0
  442. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/core/__init__.py +0 -0
  443. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/core/test_context.py +0 -0
  444. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/core/test_enums.py +0 -0
  445. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/core/test_logging.py +0 -0
  446. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/core/test_typed.py +0 -0
  447. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/db/__init__.py +0 -0
  448. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/db/test_alembic_hooks.py +0 -0
  449. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/db/test_audit.py +0 -0
  450. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/db/test_backup.py +0 -0
  451. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/db/test_bulk_ops.py +0 -0
  452. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/db/test_connection.py +0 -0
  453. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/db/test_migrations.py +0 -0
  454. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/db/test_mixins.py +0 -0
  455. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/db/test_model.py +0 -0
  456. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/db/test_outbox.py +0 -0
  457. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/db/test_repository.py +0 -0
  458. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/db/test_safe_upgrade.py +0 -0
  459. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/db/test_slow_query.py +0 -0
  460. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/db/test_tenant.py +0 -0
  461. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/exceptions/__init__.py +0 -0
  462. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/exceptions/test_exceptions.py +0 -0
  463. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/exceptions/test_i18n.py +0 -0
  464. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/flags/__init__.py +0 -0
  465. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/flags/test_flags.py +0 -0
  466. {tempest_fastapi_sdk-0.95.0/tests/queue → tempest_fastapi_sdk-0.97.0/tests/genai}/__init__.py +0 -0
  467. {tempest_fastapi_sdk-0.95.0/tests/schemas → tempest_fastapi_sdk-0.97.0/tests/queue}/__init__.py +0 -0
  468. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/queue/test_broker.py +0 -0
  469. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/queue/test_consumer.py +0 -0
  470. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/queue/test_manager.py +0 -0
  471. {tempest_fastapi_sdk-0.95.0/tests/services → tempest_fastapi_sdk-0.97.0/tests/schemas}/__init__.py +0 -0
  472. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/schemas/test_base.py +0 -0
  473. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/schemas/test_cursor_pagination.py +0 -0
  474. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/schemas/test_link_headers.py +0 -0
  475. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/schemas/test_pagination.py +0 -0
  476. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/schemas/test_response.py +0 -0
  477. {tempest_fastapi_sdk-0.95.0/tests/sessions → tempest_fastapi_sdk-0.97.0/tests/services}/__init__.py +0 -0
  478. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/services/test_base.py +0 -0
  479. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/services/test_file_mixin.py +0 -0
  480. {tempest_fastapi_sdk-0.95.0/tests/settings → tempest_fastapi_sdk-0.97.0/tests/sessions}/__init__.py +0 -0
  481. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/sessions/test_sessions.py +0 -0
  482. {tempest_fastapi_sdk-0.95.0/tests/sse → tempest_fastapi_sdk-0.97.0/tests/settings}/__init__.py +0 -0
  483. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/settings/test_base.py +0 -0
  484. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/settings/test_mixins.py +0 -0
  485. {tempest_fastapi_sdk-0.95.0/tests/ssr → tempest_fastapi_sdk-0.97.0/tests/sse}/__init__.py +0 -0
  486. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/sse/test_broker.py +0 -0
  487. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/sse/test_event_stream.py +0 -0
  488. {tempest_fastapi_sdk-0.95.0/tests/storage → tempest_fastapi_sdk-0.97.0/tests/ssr}/__init__.py +0 -0
  489. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/ssr/test_integration.py +0 -0
  490. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/ssr/test_page.py +0 -0
  491. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/ssr/test_response.py +0 -0
  492. {tempest_fastapi_sdk-0.95.0/tests/tasks → tempest_fastapi_sdk-0.97.0/tests/storage}/__init__.py +0 -0
  493. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/storage/test_minio_client.py +0 -0
  494. {tempest_fastapi_sdk-0.95.0/tests/testing → tempest_fastapi_sdk-0.97.0/tests/tasks}/__init__.py +0 -0
  495. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/tasks/test_cron.py +0 -0
  496. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/tasks/test_manager.py +0 -0
  497. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/tasks/test_oop.py +0 -0
  498. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/tasks/test_queue.py +0 -0
  499. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/tasks/test_scheduler.py +0 -0
  500. {tempest_fastapi_sdk-0.95.0/tests/utils → tempest_fastapi_sdk-0.97.0/tests/testing}/__init__.py +0 -0
  501. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/testing/test_database.py +0 -0
  502. {tempest_fastapi_sdk-0.95.0/tests/vision → tempest_fastapi_sdk-0.97.0/tests/utils}/__init__.py +0 -0
  503. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_client_ip.py +0 -0
  504. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_datetime.py +0 -0
  505. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_dict.py +0 -0
  506. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_download.py +0 -0
  507. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_email.py +0 -0
  508. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_fields.py +0 -0
  509. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_file_store.py +0 -0
  510. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_http_client.py +0 -0
  511. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_jwt.py +0 -0
  512. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_lazy_extras.py +0 -0
  513. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_locations.py +0 -0
  514. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_log.py +0 -0
  515. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_metrics.py +0 -0
  516. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_opaque_token.py +0 -0
  517. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_password.py +0 -0
  518. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_regex.py +0 -0
  519. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_storage_backends.py +0 -0
  520. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_throttle.py +0 -0
  521. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/utils/test_upload.py +0 -0
  522. {tempest_fastapi_sdk-0.95.0/tests/webpush → tempest_fastapi_sdk-0.97.0/tests/vision}/__init__.py +0 -0
  523. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/vision/test_vision.py +0 -0
  524. {tempest_fastapi_sdk-0.95.0/tests/websockets → tempest_fastapi_sdk-0.97.0/tests/webpush}/__init__.py +0 -0
  525. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/webpush/test_dispatcher.py +0 -0
  526. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/webpush/test_router.py +0 -0
  527. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/webpush/test_schemas.py +0 -0
  528. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/webpush/test_service.py +0 -0
  529. {tempest_fastapi_sdk-0.95.0 → tempest_fastapi_sdk-0.97.0}/tests/websockets/test_hub_and_router.py +0 -0
@@ -5,6 +5,55 @@ 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.97.0] — 2026-07-05
9
+
10
+ ### Added
11
+
12
+ - **Self-hosted GenAI — RAG context (`tempest_fastapi_sdk.genai.rag`)**,
13
+ slice 2: feed a local LLM with web + PDF knowledge, without shipping
14
+ data to a third party.
15
+ - **Web search** — `WebSearchBackend` Protocol + `SearxngBackend` (the
16
+ leviathan pattern: SearXNG JSON API over an injected `httpx` client)
17
+ + `WebSearch` facade. Returns `SearchResult`s.
18
+ - **Content extraction** — `ContentExtractor` fetches a URL and pulls
19
+ the clean article body via `trafilatura`; failures surface as
20
+ `ExtractionResult(failed=True)`, never raised.
21
+ - **PDF reading** — `PdfReader` (PyMuPDF, detailed reading-order
22
+ extraction) → `Document` (text + per-page + metadata) and overlapping
23
+ `Chunk`s (`read` / `chunks`).
24
+ - **Context assembly** — `build_context(question, sources)` renders
25
+ `SearchResult`s and/or `Chunk`s into one prompt-ready, source-labeled
26
+ block (mix web + PDF, optional per-source truncation).
27
+ - New `[genai-rag]` extra (httpx + trafilatura + pymupdf); everything
28
+ imports lazily without it. Import from `tempest_fastapi_sdk.genai.rag`.
29
+
30
+ ## [0.96.0] — 2026-07-05
31
+
32
+ ### Added
33
+
34
+ - **Self-hosted GenAI — capacity check (`tempest_fastapi_sdk.genai`)**,
35
+ the first slice of running HuggingFace models on your own hardware.
36
+ Before downloading gigabytes of weights, check whether the host can run
37
+ a model:
38
+ - `probe_hardware()` → `HardwareInfo` (CPU, total/available RAM, CUDA
39
+ GPUs with per-device VRAM, Apple MPS, free disk). Degrades gracefully
40
+ without `psutil` / `torch`.
41
+ - `can_run(...)` → `CapacityReport` (`fits`, chosen `device`, estimated
42
+ vs available bytes, `headroom_pct`, and a concrete `suggestion` when
43
+ it doesn't fit — quantize, offload, or pick a smaller model).
44
+ - `recommend(...)` picks the first precision (`bfloat16` → `int8` →
45
+ `int4`) that fits.
46
+ - `estimate_model_bytes` / `bytes_per_param` (the estimation math) and
47
+ `fetch_num_params` (reads a model's parameter count from the Hub via
48
+ `huggingface_hub`, without downloading weights). `ModelDtype` enum.
49
+ - New `[genai]` extra (transformers + torch + accelerate + safetensors +
50
+ huggingface-hub) and `[genai-quant]` (bitsandbytes). The capacity
51
+ functions import **without** the extra — `torch` is only used to probe
52
+ real GPUs. Import from `tempest_fastapi_sdk.genai`.
53
+ - Upcoming slices: `TextGenerator` (+ quantization), `Embedder`,
54
+ model/result caching, `BatchScheduler`, and RAG context (web search +
55
+ PDF reading).
56
+
8
57
  ## [0.95.0] — 2026-07-05
9
58
 
10
59
  ### Added
@@ -129,6 +129,25 @@ 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). Classes-only (no bundled router). Submodule import like
143
+ queue/tasks/vision. **Shipped (v0.97) — RAG context**
144
+ (`tempest_fastapi_sdk.genai.rag`, `[genai-rag]` extra = httpx +
145
+ trafilatura + pymupdf): `WebSearchBackend` Protocol + `SearxngBackend`
146
+ (SearXNG JSON API, leviathan pattern) + `WebSearch`; `ContentExtractor`
147
+ (trafilatura, failures never raise); `PdfReader` (PyMuPDF detailed
148
+ extraction → `Document`/`Chunk`, `read`/`chunks` with overlap);
149
+ `build_context(question, sources)` → prompt block mixing web +
150
+ PDF. All import lazily.
132
151
  - **SSR** (`[ssr]` extra) — `tempest_fastapi_sdk.ssr`: typed Python
133
152
  pages rendered to HTML via `tempestweb`'s `render_to_html` /
134
153
  `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.97.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,18 @@ 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'
80
+ Provides-Extra: genai-rag
81
+ Requires-Dist: httpx>=0.28.0; extra == 'genai-rag'
82
+ Requires-Dist: pymupdf>=1.24.0; extra == 'genai-rag'
83
+ Requires-Dist: trafilatura>=1.12.0; extra == 'genai-rag'
72
84
  Provides-Extra: http
73
85
  Requires-Dist: httpx>=0.28.0; extra == 'http'
74
86
  Provides-Extra: metrics
@@ -226,6 +238,8 @@ Feature-rich helpers pull in third-party dependencies that you only need when yo
226
238
  | `[prometheus]` | `prometheus-client` | `PrometheusMiddleware`, `make_prometheus_router`, `make_prometheus_registry` |
227
239
  | `[mfa]` | `pyotp` | `TOTPHelper` + MFA/2FA endpoints on the bundled auth flow |
228
240
  | `[vision]` | `ort-vision-sdk` | `Detector` / `Classifier` / `Segmenter` (ONNX) + prediction schemas |
241
+ | `[genai]` (+ `[genai-quant]`) | `transformers`, `torch`, `accelerate`, `safetensors`, `huggingface-hub` (+ `bitsandbytes`) | Self-hosted GenAI — hardware capacity check (`probe_hardware` / `can_run` / `recommend`); model runners upcoming |
242
+ | `[genai-rag]` | `httpx`, `trafilatura`, `pymupdf` | RAG context for local LLMs — SearXNG web search, page extraction, PDF reading, `build_context` |
229
243
  | `[ssr]` | `tempestweb` | `Page`, `html_response`, `make_htmx_router` — typed Python pages rendered to HTML |
230
244
  | `[otel]` | `opentelemetry-sdk` + OTLP/gRPC exporter + FastAPI/SQLAlchemy/httpx instrumentors | `setup_tracing` — distributed tracing |
231
245
  | `[sqlite]` | `aiosqlite` | SQLite async driver for `sqlite+aiosqlite://` URLs (dev default) |
@@ -268,11 +282,13 @@ Since `0.7.1` every optional dependency is imported lazily at first instantiatio
268
282
  | `tempest_fastapi_sdk.utils.storage_backends` *(extra: `[upload]`)* | `UploadStorage` protocol, `LocalUploadStorage`, `MinIOUploadStorage`, `UploadResult`, `ContentValidator` |
269
283
  | `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
284
  | `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` |
285
+ | `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 and batching in upcoming slices |
286
+ | `tempest_fastapi_sdk.genai.rag` *(extra: `[genai-rag]`)* | RAG context for local LLMs: `WebSearch`/`SearxngBackend`/`WebSearchBackend` + `SearchResult`, `ContentExtractor` (trafilatura), `PdfReader` (PyMuPDF) + `Document`/`Chunk`/`PdfPage`, `build_context` |
271
287
  | `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
288
  | `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
289
  | `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
290
 
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`).
291
+ 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
292
 
277
293
  ---
278
294
 
@@ -117,6 +117,8 @@ 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 |
121
+ | `[genai-rag]` | `httpx`, `trafilatura`, `pymupdf` | RAG context for local LLMs — SearXNG web search, page extraction, PDF reading, `build_context` |
120
122
  | `[ssr]` | `tempestweb` | `Page`, `html_response`, `make_htmx_router` — typed Python pages rendered to HTML |
121
123
  | `[otel]` | `opentelemetry-sdk` + OTLP/gRPC exporter + FastAPI/SQLAlchemy/httpx instrumentors | `setup_tracing` — distributed tracing |
122
124
  | `[sqlite]` | `aiosqlite` | SQLite async driver for `sqlite+aiosqlite://` URLs (dev default) |
@@ -159,11 +161,13 @@ Since `0.7.1` every optional dependency is imported lazily at first instantiatio
159
161
  | `tempest_fastapi_sdk.utils.storage_backends` *(extra: `[upload]`)* | `UploadStorage` protocol, `LocalUploadStorage`, `MinIOUploadStorage`, `UploadResult`, `ContentValidator` |
160
162
  | `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
163
  | `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` |
164
+ | `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 and batching in upcoming slices |
165
+ | `tempest_fastapi_sdk.genai.rag` *(extra: `[genai-rag]`)* | RAG context for local LLMs: `WebSearch`/`SearxngBackend`/`WebSearchBackend` + `SearchResult`, `ContentExtractor` (trafilatura), `PdfReader` (PyMuPDF) + `Document`/`Chunk`/`PdfPage`, `build_context` |
162
166
  | `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
167
  | `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
168
  | `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
169
 
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`).
170
+ 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
171
 
168
172
  ---
169
173
 
@@ -0,0 +1,167 @@
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
+ - **v0.96:** `genai.hardware` — probing + `can_run` / `recommend`.
10
+ - **v0.97:** `genai.rag` — RAG context (SearXNG web search + PDF
11
+ reading) to inject into LLMs (this page, [RAG context](#rag-context)).
12
+ - **Coming:** `TextGenerator` (LLM + int4/int8 quantization),
13
+ `Embedder`, model/result caching, `BatchScheduler`.
14
+
15
+ The `[genai]` extra (transformers + torch + accelerate) is only needed to
16
+ **run** models. The capacity functions **import without the extra** —
17
+ `torch` is only used (when present) to read real GPU VRAM.
18
+
19
+ ## "Can the machine handle it?"
20
+
21
+ Loading a too-large model ends in an OOM minutes into the download.
22
+ `can_run` answers first:
23
+
24
+ ```python
25
+ from tempest_fastapi_sdk.genai import can_run, ModelDtype
26
+
27
+ report = can_run(model_id="Qwen/Qwen2.5-7B-Instruct", dtype=ModelDtype.BFLOAT16)
28
+
29
+ if report.fits:
30
+ print(f"OK on {report.device} — {report.headroom_pct:.0f}% headroom")
31
+ else:
32
+ print(report.reason)
33
+ print("Suggestion:", report.suggestion) # e.g. "Quantize to int4 ..."
34
+ ```
35
+
36
+ `CapacityReport` carries: `fits`, `device` (`cuda`/`mps`/`cpu`),
37
+ `estimated_bytes` vs `available_bytes`, `headroom_pct`, `reason`, and a
38
+ concrete `suggestion` when it doesn't fit (quantize, offload to CPU, or
39
+ pick a smaller model).
40
+
41
+ !!! tip "Let the SDK pick the precision"
42
+ `recommend(...)` tries `bfloat16` → `int8` → `int4` on the best
43
+ available device and returns the **first** config that fits:
44
+
45
+ ```python
46
+ from tempest_fastapi_sdk.genai import recommend
47
+
48
+ best = recommend(model_id="meta-llama/Llama-3.1-8B")
49
+ print(best.device, best.dtype, best.fits) # e.g. cuda int8 True
50
+ ```
51
+
52
+ ## Probing the hardware
53
+
54
+ ```python
55
+ from tempest_fastapi_sdk.genai import probe_hardware
56
+
57
+ hw = probe_hardware()
58
+ print(hw.cpu_cores, hw.ram_available_bytes)
59
+ print(hw.has_cuda, [g.name for g in hw.gpus]) # per-GPU VRAM when CUDA is present
60
+ ```
61
+
62
+ `HardwareInfo` reports CPU, total/available RAM, CUDA GPUs (name +
63
+ total/free VRAM), MPS (Apple), and free disk space. Without `psutil` or
64
+ `torch` installed, the matching fields fall back to safe defaults (`0` /
65
+ `False` / empty list) — nothing breaks.
66
+
67
+ ## Estimate without downloading weights
68
+
69
+ The math is `params × bytes-per-param × overhead`. Bytes per param come
70
+ from the precision (`float32`=4, `float16`/`bfloat16`=2, `int8`=1,
71
+ `int4`≈0.6); the overhead (×1.25) covers activations, KV cache and
72
+ runtime context.
73
+
74
+ ```python
75
+ from tempest_fastapi_sdk.genai import estimate_model_bytes, ModelDtype
76
+
77
+ gb = estimate_model_bytes(7_000_000_000, ModelDtype.INT4) / 1e9
78
+ print(f"~{gb:.1f} GB") # 7B in int4
79
+ ```
80
+
81
+ The parameter count can be passed explicitly (`num_params=`) or read from
82
+ the Hub by `model_id` (via `huggingface_hub`, without downloading the
83
+ weights — safetensors metadata).
84
+
85
+ ## RAG context
86
+
87
+ A local LLM only knows what it trained on. For current, grounded answers,
88
+ inject context: `tempest_fastapi_sdk.genai.rag` searches the web
89
+ (self-hosted SearXNG), extracts page bodies, reads PDFs, and assembles a
90
+ prompt-ready block — without sending data outside. Needs the `[genai-rag]`
91
+ extra (httpx + trafilatura + pymupdf); the pieces import lazily.
92
+
93
+ ### Web search (SearXNG)
94
+
95
+ ```python
96
+ import httpx
97
+ from tempest_fastapi_sdk.genai.rag import SearxngBackend, WebSearch, build_context
98
+
99
+ client = httpx.AsyncClient()
100
+ search = WebSearch(SearxngBackend("http://localhost:8080", http_client=client))
101
+
102
+ results = await search.search("what is PIX?", max_results=5) # list[SearchResult]
103
+ context = build_context("what is PIX?", results, long_text=False, max_chars=2000)
104
+ # -> a string ready to inject into your TextGenerator prompt
105
+ ```
106
+
107
+ The backend is a `Protocol` (`WebSearchBackend`) — swap SearXNG for another
108
+ provider without touching call sites. The `httpx.AsyncClient` is injected
109
+ (pool reuse; wire it in the FastAPI lifespan).
110
+
111
+ ### Extract page bodies
112
+
113
+ Search snippets are thin. To give the LLM ground truth, fetch each page
114
+ and extract the clean text (via `trafilatura`):
115
+
116
+ ```python
117
+ from tempest_fastapi_sdk.genai.rag import ContentExtractor
118
+
119
+ extractor = ContentExtractor(http_client=client)
120
+ for result in results:
121
+ outcome = await extractor.extract(result.url)
122
+ result.content = outcome.text # "" on failure; outcome.failed marks it
123
+ context = build_context("what is PIX?", results) # now with full bodies
124
+ ```
125
+
126
+ Failures (timeout, 4xx/5xx, empty page) **never** raise — they come back
127
+ as `ExtractionResult(text="", failed=True)`, so no source is silently
128
+ dropped.
129
+
130
+ ### Read PDFs (knowledge base)
131
+
132
+ `PdfReader` (PyMuPDF — detailed, reading-order extraction) turns PDF paths
133
+ into text and prompt/embedding-ready chunks:
134
+
135
+ ```python
136
+ from tempest_fastapi_sdk.genai.rag import PdfReader, build_context
137
+
138
+ reader = PdfReader()
139
+ doc = reader.read("/kb/manual.pdf") # Document: text + pages + metadata
140
+ chunks = reader.chunks("/kb/manual.pdf", max_chars=2000, overlap=200)
141
+
142
+ context = build_context("how to refund?", chunks) # cites "file (page N)"
143
+ ```
144
+
145
+ `chunks(..., overlap=200)` shares characters between neighbors so a fact on
146
+ a boundary isn't cut in half; `per_page=True` (default) keeps each chunk on
147
+ a single page and records its page number.
148
+
149
+ !!! tip "Mix web + PDF in one context"
150
+ `build_context` accepts `SearchResult` and `Chunk` in the same list —
151
+ it delimits each source with `---` and labels the origin (URL or `file
152
+ (page N)`) so the LLM can cite. Pass `long_text=False` to truncate each
153
+ source to `max_chars`.
154
+
155
+ ## Recap
156
+
157
+ - **`can_run` / `recommend`** — answer whether the host runs the model
158
+ and what to do if not, **before** the download.
159
+ - **RAG** — `WebSearch`/`SearxngBackend` (search), `ContentExtractor`
160
+ (page bodies), `PdfReader` (PDF → text/chunks) and `build_context`
161
+ (prompt block), all under the `[genai-rag]` extra.
162
+ - **`probe_hardware`** — a CPU/RAM/GPU/disk snapshot; degrades without the
163
+ extras.
164
+ - **`estimate_model_bytes` / `bytes_per_param`** — the estimation math,
165
+ testable and reusable.
166
+ - Everything imports without the `[genai]` extra; install it to actually
167
+ run models (upcoming module slices).
@@ -0,0 +1,168 @@
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
+ - **v0.96:** `genai.hardware` — sondagem + `can_run` / `recommend`.
10
+ - **v0.97:** `genai.rag` — contexto RAG (busca web SearXNG + leitura de
11
+ PDF) pra injetar nas LLMs (esta página, seção [Contexto RAG](#contexto-rag)).
12
+ - **Em breve:** `TextGenerator` (LLM + quantização int4/int8),
13
+ `Embedder`, cache de modelo/resultado, `BatchScheduler`.
14
+
15
+ O extra `[genai]` (transformers + torch + accelerate) só é necessário pra
16
+ **rodar** modelos. As funções de capacidade **importam sem o extra** — o
17
+ `torch` só é usado (quando presente) pra ver a VRAM real da GPU.
18
+
19
+ ## "A máquina aguenta?"
20
+
21
+ Carregar um modelo grande demais termina num OOM minutos depois do
22
+ download começar. `can_run` responde antes:
23
+
24
+ ```python
25
+ from tempest_fastapi_sdk.genai import can_run, ModelDtype
26
+
27
+ report = can_run(model_id="Qwen/Qwen2.5-7B-Instruct", dtype=ModelDtype.BFLOAT16)
28
+
29
+ if report.fits:
30
+ print(f"OK em {report.device} — {report.headroom_pct:.0f}% de folga")
31
+ else:
32
+ print(report.reason)
33
+ print("Sugestão:", report.suggestion) # ex.: "Quantize to int4 ..."
34
+ ```
35
+
36
+ O `CapacityReport` traz: `fits`, `device` (`cuda`/`mps`/`cpu`),
37
+ `estimated_bytes` vs `available_bytes`, `headroom_pct`, `reason` e uma
38
+ `suggestion` concreta quando não cabe (quantizar, offload pra CPU, ou
39
+ trocar de modelo).
40
+
41
+ !!! tip "Deixe o SDK escolher a precisão"
42
+ `recommend(...)` tenta `bfloat16` → `int8` → `int4` no melhor device
43
+ disponível e devolve a **primeira** config que cabe:
44
+
45
+ ```python
46
+ from tempest_fastapi_sdk.genai import recommend
47
+
48
+ best = recommend(model_id="meta-llama/Llama-3.1-8B")
49
+ print(best.device, best.dtype, best.fits) # ex.: cuda int8 True
50
+ ```
51
+
52
+ ## Sondando o hardware
53
+
54
+ ```python
55
+ from tempest_fastapi_sdk.genai import probe_hardware
56
+
57
+ hw = probe_hardware()
58
+ print(hw.cpu_cores, hw.ram_available_bytes)
59
+ print(hw.has_cuda, [g.name for g in hw.gpus]) # VRAM por GPU quando há CUDA
60
+ ```
61
+
62
+ `HardwareInfo` reporta CPU, RAM total/disponível, GPUs CUDA (nome +
63
+ VRAM total/livre), MPS (Apple) e espaço livre em disco. Sem `psutil` ou
64
+ `torch` instalados, os campos correspondentes caem pra defaults seguros
65
+ (`0` / `False` / lista vazia) — nada quebra.
66
+
67
+ ## Estimativa sem baixar pesos
68
+
69
+ A conta é `nº de parâmetros × bytes por parâmetro × overhead`. Os bytes
70
+ por parâmetro vêm da precisão (`float32`=4, `float16`/`bfloat16`=2,
71
+ `int8`=1, `int4`≈0.6); o overhead (×1.25) cobre ativações, KV-cache e
72
+ contexto de runtime.
73
+
74
+ ```python
75
+ from tempest_fastapi_sdk.genai import estimate_model_bytes, ModelDtype
76
+
77
+ gb = estimate_model_bytes(7_000_000_000, ModelDtype.INT4) / 1e9
78
+ print(f"~{gb:.1f} GB") # 7B em int4
79
+ ```
80
+
81
+ O número de parâmetros pode vir explícito (`num_params=`) ou ser lido do
82
+ Hub por `model_id` (via `huggingface_hub`, sem baixar os pesos —
83
+ metadados safetensors).
84
+
85
+ ## Contexto RAG
86
+
87
+ Uma LLM local só sabe o que treinou. Pra respostas atuais e fundamentadas,
88
+ injete contexto: `tempest_fastapi_sdk.genai.rag` busca na web (SearXNG
89
+ self-hosted), extrai o corpo das páginas, lê PDFs e monta um bloco pronto
90
+ pro prompt — tudo sem enviar dados pra fora. Requer o extra `[genai-rag]`
91
+ (httpx + trafilatura + pymupdf); as peças importam preguiçosamente.
92
+
93
+ ### Busca web (SearXNG)
94
+
95
+ ```python
96
+ import httpx
97
+ from tempest_fastapi_sdk.genai.rag import SearxngBackend, WebSearch, build_context
98
+
99
+ client = httpx.AsyncClient()
100
+ search = WebSearch(SearxngBackend("http://localhost:8080", http_client=client))
101
+
102
+ results = await search.search("o que é PIX?", max_results=5) # list[SearchResult]
103
+ context = build_context("o que é PIX?", results, long_text=False, max_chars=2000)
104
+ # -> string pronta pra injetar no prompt do seu TextGenerator
105
+ ```
106
+
107
+ O backend é um `Protocol` (`WebSearchBackend`) — troque o SearXNG por
108
+ outro provedor sem mexer no call site. O `httpx.AsyncClient` é injetado
109
+ (reaproveita o pool; ligue no lifespan do FastAPI).
110
+
111
+ ### Extrair o corpo das páginas
112
+
113
+ O snippet do buscador é raso. Pra dar "verdade" pra LLM, busque cada
114
+ página e extraia o texto limpo (via `trafilatura`):
115
+
116
+ ```python
117
+ from tempest_fastapi_sdk.genai.rag import ContentExtractor
118
+
119
+ extractor = ContentExtractor(http_client=client)
120
+ for result in results:
121
+ outcome = await extractor.extract(result.url)
122
+ result.content = outcome.text # "" quando falha; outcome.failed marca
123
+ context = build_context("o que é PIX?", results) # agora com corpo completo
124
+ ```
125
+
126
+ Falhas (timeout, 4xx/5xx, página sem corpo) **nunca** levantam — voltam
127
+ como `ExtractionResult(text="", failed=True)`, então nenhuma fonte some
128
+ silenciosamente.
129
+
130
+ ### Ler PDFs (base de conhecimento)
131
+
132
+ `PdfReader` (PyMuPDF — extração detalhada, ordem de leitura) transforma
133
+ caminhos de PDF em texto e em chunks prontos pra prompt ou índice de
134
+ embeddings:
135
+
136
+ ```python
137
+ from tempest_fastapi_sdk.genai.rag import PdfReader, build_context
138
+
139
+ reader = PdfReader()
140
+ doc = reader.read("/base/manual.pdf") # Document: text + pages + metadata
141
+ chunks = reader.chunks("/base/manual.pdf", max_chars=2000, overlap=200)
142
+
143
+ context = build_context("como estornar?", chunks) # cita "arquivo (page N)"
144
+ ```
145
+
146
+ `chunks(..., overlap=200)` compartilha caracteres entre pedaços vizinhos,
147
+ pra um fato na fronteira não ser cortado ao meio; `per_page=True` (padrão)
148
+ mantém cada chunk numa página só, carregando o número dela.
149
+
150
+ !!! tip "Misture web + PDF no mesmo contexto"
151
+ `build_context` aceita `SearchResult` e `Chunk` na mesma lista —
152
+ delimita cada fonte com `---` e rotula a origem (URL ou `arquivo
153
+ (page N)`), pra LLM citar. Passe `long_text=False` pra truncar cada
154
+ fonte a `max_chars`.
155
+
156
+ ## Recap
157
+
158
+ - **`can_run` / `recommend`** — respondem se o host roda o modelo e o que
159
+ fazer se não rodar, **antes** do download.
160
+ - **RAG** — `WebSearch`/`SearxngBackend` (busca), `ContentExtractor`
161
+ (corpo das páginas), `PdfReader` (PDF → texto/chunks) e `build_context`
162
+ (bloco pro prompt), todos sob o extra `[genai-rag]`.
163
+ - **`probe_hardware`** — snapshot de CPU/RAM/GPU/disco; degrada sem os
164
+ extras.
165
+ - **`estimate_model_bytes` / `bytes_per_param`** — a matemática da
166
+ estimativa, testável e reutilizável.
167
+ - Tudo importa sem o extra `[genai]`; instale-o pra rodar modelos de fato
168
+ (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.97.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,21 @@ 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
+ ]
104
+ genai-rag = [
105
+ "httpx>=0.28.0",
106
+ "trafilatura>=1.12.0",
107
+ "pymupdf>=1.24.0",
108
+ ]
94
109
  ssr = [
95
110
  "tempestweb>=0.9.0",
96
111
  ]
@@ -195,6 +210,8 @@ dev = [
195
210
  "nvidia-ml-py>=12.560.30",
196
211
  "redis>=5.0.0",
197
212
  "ruff>=0.8.0",
213
+ "trafilatura>=1.12.0",
214
+ "pymupdf>=1.24.0",
198
215
  "faststream[rabbit]>=0.7.1",
199
216
  "taskiq>=0.11.0",
200
217
  "taskiq-aio-pika>=0.4.0",
@@ -300,6 +317,20 @@ module = [
300
317
  "faststream.*",
301
318
  "taskiq_redis",
302
319
  "taskiq_redis.*",
320
+ "typer._click",
321
+ "typer._click.*",
322
+ "torch",
323
+ "torch.*",
324
+ "transformers",
325
+ "transformers.*",
326
+ "huggingface_hub",
327
+ "huggingface_hub.*",
328
+ "accelerate",
329
+ "accelerate.*",
330
+ "trafilatura",
331
+ "trafilatura.*",
332
+ "pymupdf",
333
+ "fitz",
303
334
  "pyotp",
304
335
  "pyotp.*",
305
336
  "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.97.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
+ ]