fastapi-startkit 0.45.0__tar.gz → 0.47.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 (401) hide show
  1. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/PKG-INFO +12 -5
  2. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/pyproject.toml +16 -5
  3. fastapi_startkit-0.47.0/src/fastapi_startkit/ai/__init__.py +45 -0
  4. fastapi_startkit-0.47.0/src/fastapi_startkit/ai/agent.py +299 -0
  5. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/ai/audio.py +2 -13
  6. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/ai/audio_factory.py +8 -14
  7. fastapi_startkit-0.47.0/src/fastapi_startkit/ai/config/ai.py +24 -0
  8. {fastapi_startkit-0.45.0/src/fastapi_startkit/ai → fastapi_startkit-0.47.0/src/fastapi_startkit/ai/config}/config.py +23 -18
  9. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/ai/decorators.py +6 -16
  10. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/ai/document.py +14 -11
  11. fastapi_startkit-0.47.0/src/fastapi_startkit/ai/fakes.py +53 -0
  12. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/ai/image.py +2 -13
  13. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/ai/image_factory.py +1 -2
  14. fastapi_startkit-0.47.0/src/fastapi_startkit/ai/lab.py +54 -0
  15. fastapi_startkit-0.47.0/src/fastapi_startkit/ai/model_builder.py +47 -0
  16. fastapi_startkit-0.47.0/src/fastapi_startkit/ai/pipeline.py +101 -0
  17. fastapi_startkit-0.47.0/src/fastapi_startkit/ai/providers/ai_provider.py +18 -0
  18. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/ai/response.py +3 -2
  19. fastapi_startkit-0.47.0/src/fastapi_startkit/ai/runner.py +59 -0
  20. fastapi_startkit-0.47.0/src/fastapi_startkit/ai/testing.py +190 -0
  21. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/application.py +18 -0
  22. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/AI.pyi +1 -1
  23. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/fastapi/testing/test_response.py +78 -0
  24. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +5 -3
  25. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/__init__.py +17 -1
  26. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/vite/__init__.py +2 -0
  27. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/vite/config/vite.py +2 -0
  28. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/vite/providers/provider.py +20 -1
  29. fastapi_startkit-0.45.0/src/fastapi_startkit/ai/__init__.py +0 -53
  30. fastapi_startkit-0.45.0/src/fastapi_startkit/ai/agent.py +0 -498
  31. fastapi_startkit-0.45.0/src/fastapi_startkit/ai/providers/ai_provider.py +0 -30
  32. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/.DS_Store +0 -0
  33. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/__init__.py +0 -0
  34. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/ai/providers/__init__.py +0 -0
  35. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/broadcasting/__init__.py +0 -0
  36. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/broadcasting/auth.py +0 -0
  37. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/broadcasting/channels.py +0 -0
  38. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/broadcasting/config.py +0 -0
  39. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/broadcasting/drivers/__init__.py +0 -0
  40. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/broadcasting/drivers/log_driver.py +0 -0
  41. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/broadcasting/drivers/reverb_driver.py +0 -0
  42. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/broadcasting/event.py +0 -0
  43. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/broadcasting/helpers.py +0 -0
  44. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/broadcasting/manager.py +0 -0
  45. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/broadcasting/provider.py +0 -0
  46. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/broadcasting/reverb/__init__.py +0 -0
  47. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/broadcasting/reverb/channel_manager.py +0 -0
  48. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/broadcasting/reverb/connection.py +0 -0
  49. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/broadcasting/reverb/server.py +0 -0
  50. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/broadcasting/stubs/__init__.py +0 -0
  51. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/broadcasting/stubs/channels.py +0 -0
  52. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/carbon/__init__.py +0 -0
  53. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/carbon/carbon.py +0 -0
  54. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/config/__init__.py +0 -0
  55. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/config/app.py +0 -0
  56. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/configuration/Configuration.py +0 -0
  57. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/configuration/__init__.py +0 -0
  58. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/configuration/config.py +0 -0
  59. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/configuration/helpers.py +0 -0
  60. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py +0 -0
  61. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/configuration/providers/__init__.py +0 -0
  62. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/console/__init__.py +0 -0
  63. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/console/application.py +0 -0
  64. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/console/can_override_config.py +0 -0
  65. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/console/can_override_default_options.py +0 -0
  66. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/console/command.py +0 -0
  67. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/console/publish_command.py +0 -0
  68. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/container/__init__.py +0 -0
  69. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/container/container.py +0 -0
  70. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/environment/__init__.py +0 -0
  71. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/environment/environment.py +0 -0
  72. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/exceptions/__init__.py +0 -0
  73. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/exceptions/exceptions.py +0 -0
  74. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/exceptions/handler.py +0 -0
  75. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/AI.py +0 -0
  76. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Cache.py +0 -0
  77. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Config.py +0 -0
  78. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Config.pyi +0 -0
  79. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Dump.py +0 -0
  80. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Dump.pyi +0 -0
  81. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Facade.py +0 -0
  82. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Gate.py +0 -0
  83. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Gate.pyi +0 -0
  84. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Hash.py +0 -0
  85. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Hash.pyi +0 -0
  86. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Loader.py +0 -0
  87. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Loader.pyi +0 -0
  88. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Mail.py +0 -0
  89. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Mail.pyi +0 -0
  90. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Notification.py +0 -0
  91. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Notification.pyi +0 -0
  92. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Queue.py +0 -0
  93. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Queue.pyi +0 -0
  94. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/RateLimiter.py +0 -0
  95. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/RateLimiter.pyi +0 -0
  96. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Request.py +0 -0
  97. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Request.pyi +0 -0
  98. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Response.py +0 -0
  99. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Response.pyi +0 -0
  100. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Session.py +0 -0
  101. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Session.pyi +0 -0
  102. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Url.py +0 -0
  103. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Url.pyi +0 -0
  104. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/View.py +0 -0
  105. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/View.pyi +0 -0
  106. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Vite.py +0 -0
  107. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/Vite.pyi +0 -0
  108. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/facades/__init__.py +0 -0
  109. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/fastapi/__init__.py +0 -0
  110. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/fastapi/commands/__init__.py +0 -0
  111. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/fastapi/commands/serve_command.py +0 -0
  112. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/fastapi/config/__init__.py +0 -0
  113. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/fastapi/config/fastapi.py +0 -0
  114. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/fastapi/exceptions.py +0 -0
  115. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +0 -0
  116. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/fastapi/requests/model.py +0 -0
  117. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/fastapi/routers/router.py +0 -0
  118. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/fastapi/testing/__init__.py +0 -0
  119. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/fastapi/testing/assertable_json.py +0 -0
  120. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/fastapi/testing/test_case.py +0 -0
  121. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/helpers/app.py +0 -0
  122. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/helpers/dataclass.py +0 -0
  123. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/inertia/__init__.py +0 -0
  124. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/inertia/constant.py +0 -0
  125. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/inertia/context.py +0 -0
  126. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/inertia/inertia.py +0 -0
  127. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/inertia/middleware.py +0 -0
  128. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/inertia/props/props.py +0 -0
  129. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/inertia/provider.py +0 -0
  130. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/jsonapi/__init__.py +0 -0
  131. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/jsonapi/response.py +0 -0
  132. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/loader/Loader.py +0 -0
  133. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/loader/__init__.py +0 -0
  134. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/ChannelFactory.py +0 -0
  135. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/__init__.py +0 -0
  136. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/channels/BaseChannel.py +0 -0
  137. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/channels/DailyChannel.py +0 -0
  138. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/channels/MultiBaseChannel.py +0 -0
  139. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/channels/SingleChannel.py +0 -0
  140. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/channels/SlackChannel.py +0 -0
  141. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/channels/StackChannel.py +0 -0
  142. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/channels/SyslogChannel.py +0 -0
  143. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/channels/TerminalChannel.py +0 -0
  144. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/channels/__init__.py +0 -0
  145. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/config/__init__.py +0 -0
  146. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/config/channels.py +0 -0
  147. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/config/logging.py +0 -0
  148. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/drivers/BaseDriver.py +0 -0
  149. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +0 -0
  150. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +0 -0
  151. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py +0 -0
  152. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/drivers/__init__.py +0 -0
  153. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/factory.py +0 -0
  154. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/file.py +0 -0
  155. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/handler.py +0 -0
  156. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/listeners.py +0 -0
  157. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/logger.py +0 -0
  158. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/managers/LoggingManager.py +0 -0
  159. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/managers/__init__.py +0 -0
  160. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/providers/__init__.py +0 -0
  161. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/logging/providers/log_provider.py +0 -0
  162. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/collection/Collection.py +0 -0
  163. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/collection/__init__.py +0 -0
  164. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py +0 -0
  165. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +0 -0
  166. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py +0 -0
  167. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +0 -0
  168. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelDocstringCommand.py +0 -0
  169. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py +0 -0
  170. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +0 -0
  171. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +0 -0
  172. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +0 -0
  173. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py +0 -0
  174. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py +0 -0
  175. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py +0 -0
  176. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py +0 -0
  177. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/__init__.py +0 -0
  178. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_migration.stub +0 -0
  179. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub +0 -0
  180. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/stubs/model.stub +0 -0
  181. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/stubs/observer.stub +0 -0
  182. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/commands/stubs/table_migration.stub +0 -0
  183. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/config/__init__.py +0 -0
  184. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/config/config.py +0 -0
  185. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/config/database.py +0 -0
  186. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/connections/connection.py +0 -0
  187. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/connections/factory.py +0 -0
  188. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/connections/manager.py +0 -0
  189. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/connections/mysql_connection.py +0 -0
  190. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py +0 -0
  191. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py +0 -0
  192. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/exceptions.py +0 -0
  193. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/expressions/__init__.py +0 -0
  194. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/expressions/expressions.py +0 -0
  195. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/facades/DB.py +0 -0
  196. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/facades/Schema.py +0 -0
  197. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/facades/__init__.py +0 -0
  198. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/factory/__init__.py +0 -0
  199. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/factory/factory.py +0 -0
  200. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/helpers/__init__.py +0 -0
  201. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/helpers/misc.py +0 -0
  202. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/migrations/Migration.py +0 -0
  203. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/migrations/Migrator.py +0 -0
  204. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/migrations/__init__.py +0 -0
  205. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/models/MigrationModel.py +0 -0
  206. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/models/__init__.py +0 -0
  207. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/models/attribute.py +0 -0
  208. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/models/builder.py +0 -0
  209. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/models/caster.py +0 -0
  210. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/models/fields.py +0 -0
  211. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/models/model.py +0 -0
  212. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/models/observer.py +0 -0
  213. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/models/pivot.py +0 -0
  214. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/models/registry.py +0 -0
  215. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/models/relationship.py +0 -0
  216. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py +0 -0
  217. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/observers/__init__.py +0 -0
  218. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/pagination/BasePaginator.py +0 -0
  219. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py +0 -0
  220. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py +0 -0
  221. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/pagination/__init__.py +0 -0
  222. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py +0 -0
  223. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/providers/__init__.py +0 -0
  224. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/query/EagerLoadMixin.py +0 -0
  225. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/query/EagerRelation.py +0 -0
  226. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/query/__init__.py +0 -0
  227. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py +0 -0
  228. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/query/grammars/MSSQLGrammar.py +0 -0
  229. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py +0 -0
  230. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py +0 -0
  231. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/query/grammars/SQLiteGrammar.py +0 -0
  232. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/query/grammars/__init__.py +0 -0
  233. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py +0 -0
  234. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py +0 -0
  235. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/query/processors/PostgresPostProcessor.py +0 -0
  236. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py +0 -0
  237. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/query/processors/__init__.py +0 -0
  238. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/query/support.py +0 -0
  239. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py +0 -0
  240. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py +0 -0
  241. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py +0 -0
  242. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/relationships/HasMany.py +0 -0
  243. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +0 -0
  244. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/relationships/HasOne.py +0 -0
  245. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py +0 -0
  246. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py +0 -0
  247. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py +0 -0
  248. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py +0 -0
  249. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py +0 -0
  250. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/relationships/__init__.py +0 -0
  251. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/schema/Blueprint.py +0 -0
  252. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/schema/Column.py +0 -0
  253. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/schema/ColumnDiff.py +0 -0
  254. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/schema/Constraint.py +0 -0
  255. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/schema/ForeignKeyConstraint.py +0 -0
  256. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/schema/Index.py +0 -0
  257. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/schema/Table.py +0 -0
  258. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/schema/TableDiff.py +0 -0
  259. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/schema/__init__.py +0 -0
  260. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py +0 -0
  261. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py +0 -0
  262. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py +0 -0
  263. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py +0 -0
  264. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py +0 -0
  265. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/schema/platforms/__init__.py +0 -0
  266. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/schema/schema.py +0 -0
  267. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/seeds/Seeder.py +0 -0
  268. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/seeds/__init__.py +0 -0
  269. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/stubs/create-migration.html +0 -0
  270. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/stubs/table-migration.html +0 -0
  271. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/testing/__init__.py +0 -0
  272. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm/testing/transaction.py +0 -0
  273. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/.gitignore +0 -0
  274. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/CACHEDIR.TAG +0 -0
  275. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/README.md +0 -0
  276. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/v/cache/lastfailed +0 -0
  277. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/v/cache/nodeids +0 -0
  278. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/__init__.py +0 -0
  279. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/config/database.py +0 -0
  280. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/config.py +0 -0
  281. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/exceptions.py +0 -0
  282. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/factories/Factory.py +0 -0
  283. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/factories/__init__.py +0 -0
  284. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/schema/Schema.py +0 -0
  285. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/scopes/BaseScope.py +0 -0
  286. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeleteScope.py +0 -0
  287. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeletesMixin.py +0 -0
  288. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyMixin.py +0 -0
  289. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyScope.py +0 -0
  290. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/scopes/__init__.py +0 -0
  291. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/scopes/scope.py +0 -0
  292. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/testing/BaseTestCaseSelectGrammar.py +0 -0
  293. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/testing/Database.py +0 -0
  294. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/testing/TestCase.py +0 -0
  295. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/testing/__init__.py +0 -0
  296. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/User.py +0 -0
  297. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/connections/test_base_connections.py +0 -0
  298. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/eagers/test_eager.py +0 -0
  299. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/models/test_models.py +0 -0
  300. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder.py +0 -0
  301. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder_relationships.py +0 -0
  302. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_delete_grammar.py +0 -0
  303. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_insert_grammar.py +0 -0
  304. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_qmark.py +0 -0
  305. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_select_grammar.py +0 -0
  306. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_update_grammar.py +0 -0
  307. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder.py +0 -0
  308. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder_alter.py +0 -0
  309. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_mysql_builder_transaction.py +0 -0
  310. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder.py +0 -0
  311. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder_scopes.py +0 -0
  312. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_transactions.py +0 -0
  313. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/connections/test_mysql_connection_selects.py +0 -0
  314. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_delete_grammar.py +0 -0
  315. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_insert_grammar.py +0 -0
  316. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_qmark.py +0 -0
  317. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_select_grammar.py +0 -0
  318. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_update_grammar.py +0 -0
  319. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_accessors_and_mutators.py +0 -0
  320. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_model.py +0 -0
  321. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_belongs_to_many.py +0 -0
  322. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_many_through.py +0 -0
  323. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_one_through.py +0 -0
  324. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_relationships.py +0 -0
  325. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder.py +0 -0
  326. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder_alter.py +0 -0
  327. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_global_scopes.py +0 -0
  328. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_scopes.py +0 -0
  329. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_soft_delete.py +0 -0
  330. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_query_builder.py +0 -0
  331. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_transaction.py +0 -0
  332. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_delete_grammar.py +0 -0
  333. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_insert_grammar.py +0 -0
  334. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_select_grammar.py +0 -0
  335. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_update_grammar.py +0 -0
  336. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/relationships/test_postgres_relationships.py +0 -0
  337. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder.py +0 -0
  338. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder_alter.py +0 -0
  339. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/scopes/test_default_global_scopes.py +0 -0
  340. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/seeds/test_seeds.py +0 -0
  341. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/masoniteorm.backup/tests/utils.py +0 -0
  342. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/mcp/__init__.py +0 -0
  343. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/mcp/argument.py +0 -0
  344. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/mcp/prompt.py +0 -0
  345. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/mcp/protocol.py +0 -0
  346. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/mcp/providers/__init__.py +0 -0
  347. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/mcp/providers/mcp_provider.py +0 -0
  348. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/mcp/request.py +0 -0
  349. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/mcp/resource.py +0 -0
  350. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/mcp/response.py +0 -0
  351. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/mcp/server.py +0 -0
  352. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/mcp/tool.py +0 -0
  353. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/process/__init__.py +0 -0
  354. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/process/exception.py +0 -0
  355. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/process/fake.py +0 -0
  356. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/process/process.py +0 -0
  357. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/process/result.py +0 -0
  358. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/providers/Provider.py +0 -0
  359. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/providers/__init__.py +0 -0
  360. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/providers/app_provider.py +0 -0
  361. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/skills/__init__.py +0 -0
  362. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/skills/adapters/__init__.py +0 -0
  363. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/skills/adapters/base.py +0 -0
  364. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/skills/adapters/claude.py +0 -0
  365. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/skills/adapters/gemini.py +0 -0
  366. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/skills/commands/__init__.py +0 -0
  367. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/skills/commands/skills.py +0 -0
  368. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/skills/parser.py +0 -0
  369. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/skills/provider.py +0 -0
  370. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/skills/registry.py +0 -0
  371. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/database/SKILL.md +0 -0
  372. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/fastapi/SKILL.md +0 -0
  373. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/inertia/SKILL.md +0 -0
  374. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/storage/__init__.py +0 -0
  375. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/storage/config/__init__.py +0 -0
  376. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/storage/config/storage.py +0 -0
  377. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/storage/data/mime.types +0 -0
  378. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/storage/drivers/__init__.py +0 -0
  379. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/storage/drivers/fake.py +0 -0
  380. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/storage/drivers/local.py +0 -0
  381. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/storage/drivers/s3.py +0 -0
  382. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/storage/file.py +0 -0
  383. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/storage/filestream.py +0 -0
  384. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/storage/helper.py +0 -0
  385. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/storage/providers/provider.py +0 -0
  386. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/storage/storage.py +0 -0
  387. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/support/__init__.py +0 -0
  388. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/support/collection.py +0 -0
  389. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/support/string.py +0 -0
  390. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/support/uri.py +0 -0
  391. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/testing/__init__.py +0 -0
  392. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/testing/test_case.py +0 -0
  393. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/utils/structures.py +0 -0
  394. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/vite/exceptions.py +0 -0
  395. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/vite/stubs/package.json +0 -0
  396. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/vite/stubs/resources/css/app.css +0 -0
  397. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/vite/stubs/resources/js/app.ts +0 -0
  398. {fastapi_startkit-0.45.0/src/fastapi_startkit/vite/stubs → fastapi_startkit-0.47.0/src/fastapi_startkit/vite/stubs/resources}/templates/index.html +0 -0
  399. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/vite/stubs/tsconfig.json +0 -0
  400. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/vite/stubs/vite.config.ts +0 -0
  401. {fastapi_startkit-0.45.0 → fastapi_startkit-0.47.0}/src/fastapi_startkit/vite/vite.py +0 -0
@@ -1,9 +1,17 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fastapi-startkit
3
- Version: 0.45.0
3
+ Version: 0.47.0
4
4
  Summary: Fastapi Starter kit components
5
5
  Author: Bedram Tamang
6
6
  Author-email: Bedram Tamang <tmgbedu@gmail.com>
7
+ Classifier: Development Status :: 4 - Beta
8
+ Classifier: Framework :: FastAPI
9
+ Classifier: Intended Audience :: Developers
10
+ Classifier: Operating System :: OS Independent
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Programming Language :: Python :: 3.13
14
+ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
7
15
  Requires-Dist: dotty-dict>=1.3.1
8
16
  Requires-Dist: pendulum>=3.1.0,<4.0.0
9
17
  Requires-Dist: inflection>=0.5.1
@@ -11,12 +19,11 @@ Requires-Dist: requests>=2.32.5,<3.0.0
11
19
  Requires-Dist: cleo>=2.1.0,<3.0.0
12
20
  Requires-Dist: dotenv>=0.9.9
13
21
  Requires-Dist: pydantic>=2.12.5
14
- Requires-Dist: anthropic>=0.49.0 ; extra == 'ai'
15
- Requires-Dist: openai>=1.0.0 ; extra == 'ai'
16
- Requires-Dist: google-generativeai>=0.8.0 ; extra == 'ai'
22
+ Requires-Dist: langchain>=1.0.0 ; extra == 'ai'
23
+ Requires-Dist: langchain-core>=1.0.0 ; extra == 'ai'
17
24
  Requires-Dist: faker>=40.13.0 ; extra == 'database'
18
25
  Requires-Dist: sqlalchemy[asyncio]>=2.0.38 ; extra == 'database'
19
- Requires-Dist: fastapi[standard]>=0.124.4,<0.125.0 ; extra == 'fastapi'
26
+ Requires-Dist: fastapi[standard]>=0.124.4 ; extra == 'fastapi'
20
27
  Requires-Dist: itsdangerous>=2.2.0 ; extra == 'fastapi'
21
28
  Requires-Dist: jinja2>=3.1 ; extra == 'inertia'
22
29
  Requires-Dist: markupsafe>=2.0 ; extra == 'inertia'
@@ -1,11 +1,21 @@
1
1
  [project]
2
2
  name = "fastapi-startkit"
3
- version = "0.45.0"
3
+ version = "0.47.0"
4
4
  description = "Fastapi Starter kit components"
5
5
  authors = [
6
6
  {name = "Bedram Tamang", email = "tmgbedu@gmail.com"}
7
7
  ]
8
8
  requires-python = ">=3.12,<4.0"
9
+ classifiers = [
10
+ "Development Status :: 4 - Beta",
11
+ "Framework :: FastAPI",
12
+ "Intended Audience :: Developers",
13
+ "Operating System :: OS Independent",
14
+ "Programming Language :: Python :: 3",
15
+ "Programming Language :: Python :: 3.12",
16
+ "Programming Language :: Python :: 3.13",
17
+ "Topic :: Software Development :: Libraries :: Application Frameworks",
18
+ ]
9
19
  dependencies = [
10
20
  "dotty-dict>=1.3.1",
11
21
  "pendulum (>=3.1.0,<4.0.0)",
@@ -18,7 +28,7 @@ dependencies = [
18
28
 
19
29
  [project.optional-dependencies]
20
30
  fastapi = [
21
- "fastapi[standard] (>=0.124.4,<0.125.0)",
31
+ "fastapi[standard]>=0.124.4",
22
32
  "itsdangerous>=2.2.0",
23
33
  ]
24
34
  database = [
@@ -48,9 +58,8 @@ inertia = [
48
58
  ]
49
59
 
50
60
  ai = [
51
- "anthropic>=0.49.0",
52
- "openai>=1.0.0",
53
- "google-generativeai>=0.8.0",
61
+ "langchain>=1.0.0",
62
+ "langchain-core>=1.0.0",
54
63
  ]
55
64
 
56
65
  [dependency-groups]
@@ -68,6 +77,8 @@ dev = [
68
77
  "sqlalchemy[asyncio]>=2.0.38",
69
78
  "fastapi[standard]>=0.124.4",
70
79
  "faker>=40.13.0",
80
+ "langchain>=1.0.0",
81
+ "langchain-core>=1.0.0",
71
82
  ]
72
83
 
73
84
 
@@ -0,0 +1,45 @@
1
+ from .agent import Agent
2
+ from .pipeline import Middleware
3
+ from .audio import Audio, AudioResponse
4
+ from .audio_factory import AudioFactory
5
+ from .config.config import AnthropicConfig, ElevenLabsConfig, GoogleConfig, OpenAIConfig
6
+ from .config.ai import AIConfig
7
+ from .decorators import max_steps, max_tokens, model, provider, timeout, top_p
8
+ from .document import Document
9
+ from .fakes import fake_chat_model
10
+ from .image import Image, ImageResponse
11
+ from .image_factory import ImageFactory
12
+ from .providers.ai_provider import AIProvider
13
+ from .response import AgentResponse, AgentSnapshot
14
+ from .testing import AgentBinding, FakeAgent, NoFakeResponse, RecordingAgent
15
+
16
+ __all__ = [
17
+ "Agent",
18
+ "Middleware",
19
+ "AgentBinding",
20
+ "AgentResponse",
21
+ "AgentSnapshot",
22
+ "AIConfig",
23
+ "AIProvider",
24
+ "AnthropicConfig",
25
+ "FakeAgent",
26
+ "NoFakeResponse",
27
+ "RecordingAgent",
28
+ "Audio",
29
+ "AudioResponse",
30
+ "AudioFactory",
31
+ "Document",
32
+ "ElevenLabsConfig",
33
+ "fake_chat_model",
34
+ "GoogleConfig",
35
+ "Image",
36
+ "ImageFactory",
37
+ "ImageResponse",
38
+ "OpenAIConfig",
39
+ "max_steps",
40
+ "max_tokens",
41
+ "model",
42
+ "provider",
43
+ "timeout",
44
+ "top_p",
45
+ ]
@@ -0,0 +1,299 @@
1
+ from __future__ import annotations
2
+
3
+ import fnmatch
4
+ from typing import TYPE_CHECKING, Any, AsyncIterator, Callable, Optional, Type
5
+
6
+ from .document import Document
7
+ from .response import AgentResponse, AgentSnapshot
8
+ from .testing import AgentBinding
9
+
10
+ if TYPE_CHECKING:
11
+ from langchain_core.tools import BaseTool
12
+
13
+
14
+ class Agent:
15
+ provider: str | None = None
16
+ model: str | None = None
17
+ max_steps: int = 10
18
+ max_tokens: int = 4096
19
+ timeout: float = 30.0
20
+ top_p: float = 1.0
21
+
22
+ def __init__(self):
23
+ self._fakes: dict[str, AgentResponse | AgentSnapshot] = {}
24
+ self._call_log: list[dict] = []
25
+
26
+ def messages(self) -> list[dict]:
27
+ return []
28
+
29
+ def instructions(self) -> str | None:
30
+ return None
31
+
32
+ def schema(self) -> Optional[Type]:
33
+ return None
34
+
35
+ def tools(self) -> list[BaseTool]:
36
+ return []
37
+
38
+ def middleware(self) -> list[Callable]:
39
+ return []
40
+
41
+ def provider_options(self) -> dict:
42
+ return {}
43
+
44
+ async def prompt(
45
+ self,
46
+ message: str,
47
+ *,
48
+ model: str | None = None,
49
+ attachments: list[Document] | None = None,
50
+ provider_options: dict | None = None,
51
+ ) -> AgentResponse:
52
+ stand_in = self._faked()
53
+ if stand_in is not None:
54
+ response = await stand_in.prompt(message, attachments=attachments)
55
+ self._log_call("prompt", message)
56
+ return self._apply_schema(response)
57
+
58
+ _run_kwargs = dict(
59
+ model=model,
60
+ attachments=attachments,
61
+ provider_options=provider_options,
62
+ )
63
+
64
+ match = self._match_fake(message)
65
+ if match is not None:
66
+ if isinstance(match, AgentSnapshot):
67
+ response = await match.resolve(self, message, **_run_kwargs)
68
+ else:
69
+ response = match
70
+ self._log_call("prompt", message)
71
+ return self._apply_schema(response)
72
+
73
+ messages = self._build_messages(message, attachments)
74
+ chat_model = self._build_model(model, provider_options)
75
+
76
+ response = await self._run_pipeline(chat_model, messages)
77
+ self._log_call("prompt", message)
78
+ return self._apply_schema(response)
79
+
80
+ async def stream(
81
+ self,
82
+ message: str,
83
+ *,
84
+ model: str | None = None,
85
+ provider_options: dict | None = None,
86
+ ) -> AsyncIterator[str]:
87
+ self._log_call("stream", message)
88
+
89
+ swapped = self._faked()
90
+ if swapped is not None:
91
+ if hasattr(swapped, "stream"):
92
+ async for chunk in swapped.stream(message):
93
+ yield chunk
94
+ else:
95
+ response = await swapped.prompt(message)
96
+ yield response.content
97
+ return
98
+
99
+ fake = self._match_fake(message)
100
+ if fake is not None:
101
+ if isinstance(fake, AgentSnapshot):
102
+ response = await fake.resolve(self, message)
103
+ else:
104
+ response = fake
105
+ yield response.content
106
+ return
107
+ async for chunk in self._stream(message, model=model, provider_options=provider_options):
108
+ yield chunk
109
+
110
+ @classmethod
111
+ def fake(cls, responses: dict | None = None) -> "AgentBinding":
112
+ from .testing import AgentBinding, FakeAgent
113
+
114
+ return AgentBinding(cls, FakeAgent(responses))
115
+
116
+ @classmethod
117
+ def record(cls, cassette: str | None = None) -> "AgentBinding":
118
+ from .testing import AgentBinding, RecordingAgent
119
+
120
+ return AgentBinding(cls, RecordingAgent(cls(), cassette))
121
+
122
+ @classmethod
123
+ def _binding(cls) -> Any:
124
+ from fastapi_startkit.application import app
125
+
126
+ container = app()
127
+ return container.make(cls.__name__) if container.has(cls.__name__) else None
128
+
129
+ @classmethod
130
+ def make(cls) -> "Agent":
131
+ binding = cls._binding()
132
+ return binding if binding is not None else cls()
133
+
134
+ def _faked(self) -> Any:
135
+ binding = type(self)._binding()
136
+ return binding if binding is not self else None
137
+
138
+ def assert_prompted(self, times: int | None = None) -> None:
139
+ calls = [c for c in self._call_log if c["method"] in ("prompt", "stream")]
140
+ if times is not None:
141
+ assert len(calls) == times, f"Expected {times} prompt call(s), got {len(calls)}"
142
+ else:
143
+ assert len(calls) > 0, "Expected at least one prompt() or stream() call, but none were made"
144
+
145
+ def assert_not_prompted(self) -> None:
146
+ self.assert_prompted(times=0)
147
+
148
+ def reset(self) -> "Agent":
149
+ self._fakes.clear()
150
+ self._call_log.clear()
151
+ return self
152
+
153
+ def _match_fake(self, message: str) -> Optional[AgentResponse | AgentSnapshot]:
154
+ for pattern, value in self._fakes.items():
155
+ if fnmatch.fnmatch(message.lower(), pattern.lower()):
156
+ return value
157
+ return None
158
+
159
+ def _log_call(self, method: str, message: str) -> None:
160
+ self._call_log.append({"method": method, "message": message})
161
+
162
+ async def _run_pipeline(self, chat_model: Any, messages: list) -> AgentResponse:
163
+ from .pipeline import Response, build_pipeline # noqa: PLC0415
164
+ from .runner import Runner # noqa: PLC0415
165
+
166
+ chain = list(self.middleware())
167
+ if not chain:
168
+ return await self._invoke(chat_model, messages)
169
+
170
+ def core(model: Any) -> Response:
171
+ async def _run():
172
+ result = await Runner(self, model).run(messages)
173
+ yield result
174
+
175
+ return Response(_run)
176
+
177
+ pipeline = build_pipeline(chain, core)
178
+ raw = await pipeline(chat_model)
179
+ return self._to_agent_response(raw)
180
+
181
+ async def _apply_middleware(
182
+ self,
183
+ chat_model: Any,
184
+ final: Callable[[Any], Any],
185
+ ) -> AgentResponse:
186
+ chain = list(self.middleware())
187
+
188
+ def build(mw_list: list, fn: Callable) -> Callable:
189
+ if not mw_list:
190
+ return fn
191
+ head, *tail = mw_list
192
+ next_fn = build(tail, fn)
193
+ mw = head() if isinstance(head, type) else head
194
+ return lambda model: mw(model, next_fn)
195
+
196
+ return await build(chain, final)(chat_model)
197
+
198
+ def _build_instruction(self) -> str | None:
199
+ return self.instructions()
200
+
201
+ def _build_messages(
202
+ self,
203
+ message: str,
204
+ attachments: list[Document] | None = None,
205
+ ) -> list[dict]:
206
+ messages: list[dict] = []
207
+
208
+ instruction = self.instructions()
209
+ if instruction:
210
+ messages.append({"role": "system", "content": instruction})
211
+
212
+ messages.extend(self.messages() or [])
213
+
214
+ if message:
215
+ messages.append({"role": "user", "content": message})
216
+
217
+ if attachments:
218
+ content: Any = [{"type": "text", "text": message}]
219
+ for doc in attachments:
220
+ content.append(doc.to_langchain_block())
221
+ messages.append({"role": "user", "content": content})
222
+
223
+ return messages
224
+
225
+ def _build_model(self, model: str | None = None, provider_options: dict | None = None) -> Any:
226
+ from .model_builder import ModelBuilder # noqa: PLC0415
227
+
228
+ return ModelBuilder(agent=self).build(model, provider_options)
229
+
230
+ def _to_agent_response(self, result: Any) -> AgentResponse:
231
+ messages = result.get("messages", []) if isinstance(result, dict) else []
232
+ final = messages[-1] if messages else result
233
+
234
+ content = getattr(final, "content", "")
235
+ if not isinstance(content, str):
236
+ content = str(content)
237
+
238
+ tool_calls = list(getattr(final, "tool_calls", None) or [])
239
+
240
+ usage: dict[str, Any] = {}
241
+ meta = getattr(final, "usage_metadata", None)
242
+ if meta:
243
+ usage = {"input": meta.get("input_tokens", 0), "output": meta.get("output_tokens", 0)}
244
+
245
+ return AgentResponse(content=content, tool_calls=tool_calls, usage=usage, raw=result)
246
+
247
+ def _apply_schema(self, response: AgentResponse) -> AgentResponse:
248
+ schema = self.schema()
249
+ if schema is not None and response.parsed is None and response.content:
250
+ response.parsed = self._build_schema(schema, response.content)
251
+ return response
252
+
253
+ @staticmethod
254
+ def _build_schema(schema: Any, content: str) -> Any:
255
+ import json # noqa: PLC0415
256
+
257
+ if hasattr(schema, "model_validate_json"):
258
+ return schema.model_validate_json(content)
259
+ if hasattr(schema, "model_validate"):
260
+ return schema.model_validate(json.loads(content))
261
+ return schema(**json.loads(content))
262
+
263
+ async def _invoke(self, chat_model: Any, messages: list[dict]) -> AgentResponse:
264
+ from .runner import Runner # noqa: PLC0415
265
+
266
+ result = await Runner(self, chat_model).run(messages)
267
+ return self._to_agent_response(result)
268
+
269
+ async def _run(
270
+ self,
271
+ message: str,
272
+ model: str | None = None,
273
+ attachments: list[Document] | None = None,
274
+ provider_options: dict | None = None,
275
+ ) -> AgentResponse:
276
+ messages = self._build_messages(message, attachments)
277
+ chat_model = self._build_model(model, provider_options)
278
+ return await self._invoke(chat_model, messages)
279
+
280
+ async def _stream(
281
+ self,
282
+ message: str,
283
+ model: str | None = None,
284
+ provider_options: dict | None = None,
285
+ ) -> AsyncIterator[str]:
286
+ from .pipeline import Response, build_pipeline # noqa: PLC0415
287
+ from .runner import StreamRunner # noqa: PLC0415
288
+
289
+ messages = self._build_messages(message)
290
+ chat_model = self._build_model(model, provider_options)
291
+ chain = list(self.middleware())
292
+
293
+ def core(m: Any) -> Response:
294
+ return Response(lambda: StreamRunner(self, m).run(messages))
295
+
296
+ pipeline = build_pipeline(chain, core) if chain else core
297
+
298
+ async for chunk in pipeline(chat_model):
299
+ yield chunk
@@ -46,8 +46,6 @@ class AudioResponse:
46
46
  def _auto_filename(self) -> str:
47
47
  return f"{uuid.uuid4()}.{self._fmt}"
48
48
 
49
- # ── Storage helpers ────────────────────────────────────────────────────────
50
-
51
49
  async def store(self) -> str:
52
50
  """Save to the default private disk with an auto-generated filename."""
53
51
  return await self._save(self._auto_filename(), disk="local")
@@ -64,8 +62,6 @@ class AudioResponse:
64
62
  """Save to the public disk with a custom filename."""
65
63
  return await self._save(name, disk="public")
66
64
 
67
- # ── Internal ───────────────────────────────────────────────────────────────
68
-
69
65
  async def _save(self, name: str, disk: str = "local") -> str:
70
66
  return await asyncio.to_thread(self._save_sync, name, disk)
71
67
 
@@ -89,7 +85,7 @@ class AudioResponse:
89
85
  class Audio:
90
86
  """Fluent builder for text-to-speech generation.
91
87
 
92
- The active backend is selected from :attr:`~fastapi_startkit.ai.AIConfig.audio_provider`
88
+ The active backend is selected from :attr:`~fastapi_startkit.ai.AIConfig.default_audio`
93
89
  (env: ``AI_AUDIO_PROVIDER``). Defaults to OpenAI TTS.
94
90
 
95
91
  Usage::
@@ -102,7 +98,6 @@ class Audio:
102
98
  Available OpenAI TTS voices: alloy, echo, fable, onyx, nova, shimmer.
103
99
  """
104
100
 
105
- # OpenAI TTS voice presets
106
101
  _DEFAULT_VOICE = "alloy"
107
102
  _DEFAULT_FEMALE_VOICE = "nova"
108
103
  _DEFAULT_MALE_VOICE = "onyx"
@@ -119,8 +114,6 @@ class Audio:
119
114
  """Create an :class:`Audio` builder with the given input text."""
120
115
  return cls(text)
121
116
 
122
- # ── Modifier methods (chainable) ───────────────────────────────────────────
123
-
124
117
  def female(self) -> "Audio":
125
118
  """Use a female voice (``nova``)."""
126
119
  self._voice = self._DEFAULT_FEMALE_VOICE
@@ -158,8 +151,6 @@ class Audio:
158
151
  self._response_format = fmt
159
152
  return self
160
153
 
161
- # ── Generation ─────────────────────────────────────────────────────────────
162
-
163
154
  async def generate(self) -> AudioResponse:
164
155
  """Call the configured TTS provider and return an :class:`AudioResponse`."""
165
156
  provider = self._resolve_provider()
@@ -172,8 +163,6 @@ class Audio:
172
163
  )
173
164
  return AudioResponse(data=data, fmt=self._response_format)
174
165
 
175
- # ── Internal ───────────────────────────────────────────────────────────────
176
-
177
166
  def _resolve_provider(self) -> "AudioFactory":
178
167
  from .audio_factory import ( # noqa: PLC0415
179
168
  ElevenLabsAudioFactory,
@@ -191,7 +180,7 @@ class Audio:
191
180
  ai_config = Config.get("ai") if Config is not None else None # type: ignore[union-attr]
192
181
  if ai_config is None:
193
182
  raise RuntimeError("Config not available")
194
- provider_name = ai_config.audio_provider
183
+ provider_name = ai_config.default_audio
195
184
  openai_cfg = ai_config.providers.get("openai")
196
185
  if openai_cfg:
197
186
  api_key = openai_cfg.key or None
@@ -3,7 +3,7 @@
3
3
  Providers implement the :class:`AudioFactory` ABC so that the
4
4
  :class:`~fastapi_startkit.ai.Audio` builder is not hard-wired to a single
5
5
  vendor. Select the active provider via ``AI_AUDIO_PROVIDER`` in your
6
- ``.env`` (or ``AIConfig.audio_provider``).
6
+ ``.env`` (or ``AIConfig.default_audio``).
7
7
 
8
8
  Supported providers
9
9
  -------------------
@@ -100,7 +100,6 @@ class GoogleAudioFactory(AudioFactory):
100
100
  because Gemini TTS yields raw PCM16 which is wrapped in a WAV container.
101
101
  """
102
102
 
103
- # Map OpenAI-style voice aliases → Google Gemini voice names
104
103
  _VOICE_MAP: dict[str, str] = {
105
104
  "nova": "Aoede",
106
105
  "alloy": "Kore",
@@ -149,7 +148,6 @@ class GoogleAudioFactory(AudioFactory):
149
148
  ),
150
149
  )
151
150
 
152
- # Gemini TTS returns raw PCM16 samples — wrap in WAV container
153
151
  pcm_data = response.candidates[0].content.parts[0].inline_data.data
154
152
  return _pcm_to_wav(pcm_data)
155
153
 
@@ -187,14 +185,13 @@ class ElevenLabsAudioFactory(AudioFactory):
187
185
  not currently supported by ElevenLabs.
188
186
  """
189
187
 
190
- # Map OpenAI-style aliases → ElevenLabs voice IDs
191
188
  _VOICE_MAP: dict[str, str] = {
192
- "nova": "21m00Tcm4TlvDq8ikWAM", # Rachel — female
193
- "alloy": "EXAVITQu4vr4xnSDxMaL", # Bella — female
194
- "shimmer": "MF3mGyEYCl7XYWbV9V6O", # Elli — female
195
- "onyx": "pNInz6obpgDQGcFmaJgB", # Adam — male
196
- "echo": "ErXwobaYiN019PkySvjV", # Antoni — male
197
- "fable": "VR6AewLTigWG4xSOukaG", # Arnold — male
189
+ "nova": "21m00Tcm4TlvDq8ikWAM",
190
+ "alloy": "EXAVITQu4vr4xnSDxMaL",
191
+ "shimmer": "MF3mGyEYCl7XYWbV9V6O",
192
+ "onyx": "pNInz6obpgDQGcFmaJgB",
193
+ "echo": "ErXwobaYiN019PkySvjV",
194
+ "fable": "VR6AewLTigWG4xSOukaG",
198
195
  }
199
196
 
200
197
  def __init__(self, api_key: str | None = None):
@@ -223,9 +220,6 @@ class ElevenLabsAudioFactory(AudioFactory):
223
220
  return b"".join(audio_chunks)
224
221
 
225
222
 
226
- # ─── PCM → WAV helper ─────────────────────────────────────────────────────────
227
-
228
-
229
223
  def _pcm_to_wav(
230
224
  pcm_data: bytes,
231
225
  sample_rate: int = 24000,
@@ -248,7 +242,7 @@ def _pcm_to_wav(
248
242
  b"WAVE",
249
243
  b"fmt ",
250
244
  16,
251
- 1, # PCM
245
+ 1,
252
246
  channels,
253
247
  sample_rate,
254
248
  byte_rate,
@@ -0,0 +1,24 @@
1
+ from dataclasses import dataclass, field
2
+
3
+ from fastapi_startkit.environment import env
4
+
5
+ from fastapi_startkit.ai import AnthropicConfig, ElevenLabsConfig, GoogleConfig, OpenAIConfig
6
+
7
+
8
+ @dataclass
9
+ class AIConfig:
10
+ """Top-level AI configuration — selects the default provider per modality and holds per-provider configs."""
11
+
12
+ default: str = field(default_factory=lambda: env("AI_PROVIDER", "google"))
13
+ default_image: str = field(default_factory=lambda: env("AI_DEFAULT_IMAGE_PROVIDER", "openai"))
14
+ default_audio: str = field(default_factory=lambda: env("AI_DEFAULT_AUDIO_PROVIDER", "openai"))
15
+ default_transcribe: str = field(default_factory=lambda: env("AI_DEFAULT_TRANSCRIBE_PROVIDER", "openai"))
16
+
17
+ providers: dict = field(
18
+ default_factory=lambda: {
19
+ "google": GoogleConfig(),
20
+ "openai": OpenAIConfig(),
21
+ "anthropic": AnthropicConfig(),
22
+ "elevenlabs": ElevenLabsConfig(),
23
+ }
24
+ )
@@ -1,5 +1,3 @@
1
- """AI configuration dataclasses for the FastAPI Startkit AI module."""
2
-
3
1
  from __future__ import annotations
4
2
 
5
3
  from dataclasses import dataclass, field
@@ -15,6 +13,12 @@ class AnthropicConfig:
15
13
  key: str = field(default_factory=lambda: env("ANTHROPIC_API_KEY", ""))
16
14
  url: str = field(default_factory=lambda: env("ANTHROPIC_BASE_URL", "https://api.anthropic.com"))
17
15
 
16
+ models: dict = field(
17
+ default_factory=lambda: {
18
+ "default": "claude-sonnet-4-6",
19
+ }
20
+ )
21
+
18
22
 
19
23
  @dataclass
20
24
  class OpenAIConfig:
@@ -24,6 +28,13 @@ class OpenAIConfig:
24
28
  key: str = field(default_factory=lambda: env("OPENAI_API_KEY", ""))
25
29
  url: str = field(default_factory=lambda: env("OPENAI_BASE_URL", "https://api.openai.com/v1"))
26
30
 
31
+ models: dict = field(
32
+ default_factory=lambda: {
33
+ "default": "gpt-4o",
34
+ "default_image": "dall-e-3",
35
+ }
36
+ )
37
+
27
38
 
28
39
  @dataclass
29
40
  class GoogleConfig:
@@ -32,6 +43,13 @@ class GoogleConfig:
32
43
  driver: str = "google"
33
44
  key: str = field(default_factory=lambda: env("GEMINI_API_KEY", "") or env("GOOGLE_API_KEY", ""))
34
45
 
46
+ models: dict = field(
47
+ default_factory=lambda: {
48
+ "default": "gemini-2.5-flash-lite",
49
+ "default_image": "imagen-3.0-generate-002",
50
+ }
51
+ )
52
+
35
53
 
36
54
  @dataclass
37
55
  class ElevenLabsConfig:
@@ -40,22 +58,9 @@ class ElevenLabsConfig:
40
58
  driver: str = "elevenlabs"
41
59
  key: str = field(default_factory=lambda: env("ELEVENLABS_API_KEY", ""))
42
60
 
43
-
44
- @dataclass
45
- class AIConfig:
46
- """Top-level AI configuration — selects the default provider and holds per-provider configs."""
47
-
48
- default: str = field(default_factory=lambda: env("AI_PROVIDER", "google"))
49
-
50
- providers: dict = field(
61
+ models: dict = field(
51
62
  default_factory=lambda: {
52
- "openai": OpenAIConfig(),
53
- "anthropic": AnthropicConfig(),
54
- "google": GoogleConfig(),
55
- "elevenlabs": ElevenLabsConfig(),
63
+ "default_audio": "eleven_multilingual_v2",
64
+ "default_transcribe": "scribe_v1",
56
65
  }
57
66
  )
58
-
59
- # Media-generation provider selection
60
- image_provider: str = field(default_factory=lambda: env("AI_IMAGE_PROVIDER", "openai"))
61
- audio_provider: str = field(default_factory=lambda: env("AI_AUDIO_PROVIDER", "openai"))