fastapi-startkit 0.45.0__tar.gz → 0.46.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.46.0}/PKG-INFO +3 -4
  2. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/pyproject.toml +5 -4
  3. fastapi_startkit-0.46.0/src/fastapi_startkit/ai/__init__.py +45 -0
  4. fastapi_startkit-0.46.0/src/fastapi_startkit/ai/agent.py +299 -0
  5. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/ai/audio.py +2 -13
  6. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/ai/audio_factory.py +8 -14
  7. fastapi_startkit-0.46.0/src/fastapi_startkit/ai/config/ai.py +24 -0
  8. {fastapi_startkit-0.45.0/src/fastapi_startkit/ai → fastapi_startkit-0.46.0/src/fastapi_startkit/ai/config}/config.py +23 -18
  9. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/ai/decorators.py +6 -16
  10. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/ai/document.py +14 -11
  11. fastapi_startkit-0.46.0/src/fastapi_startkit/ai/fakes.py +53 -0
  12. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/ai/image.py +2 -13
  13. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/ai/image_factory.py +1 -2
  14. fastapi_startkit-0.46.0/src/fastapi_startkit/ai/lab.py +54 -0
  15. fastapi_startkit-0.46.0/src/fastapi_startkit/ai/model_builder.py +47 -0
  16. fastapi_startkit-0.46.0/src/fastapi_startkit/ai/pipeline.py +101 -0
  17. fastapi_startkit-0.46.0/src/fastapi_startkit/ai/providers/ai_provider.py +18 -0
  18. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/ai/response.py +3 -2
  19. fastapi_startkit-0.46.0/src/fastapi_startkit/ai/runner.py +59 -0
  20. fastapi_startkit-0.46.0/src/fastapi_startkit/ai/testing.py +190 -0
  21. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/AI.pyi +1 -1
  22. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/testing/test_response.py +78 -0
  23. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +5 -3
  24. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/__init__.py +17 -1
  25. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/vite/__init__.py +2 -0
  26. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/vite/config/vite.py +2 -0
  27. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/vite/providers/provider.py +20 -1
  28. fastapi_startkit-0.45.0/src/fastapi_startkit/ai/__init__.py +0 -53
  29. fastapi_startkit-0.45.0/src/fastapi_startkit/ai/agent.py +0 -498
  30. fastapi_startkit-0.45.0/src/fastapi_startkit/ai/providers/ai_provider.py +0 -30
  31. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/.DS_Store +0 -0
  32. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/__init__.py +0 -0
  33. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/ai/providers/__init__.py +0 -0
  34. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/application.py +0 -0
  35. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/__init__.py +0 -0
  36. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/auth.py +0 -0
  37. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/channels.py +0 -0
  38. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/config.py +0 -0
  39. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/drivers/__init__.py +0 -0
  40. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/drivers/log_driver.py +0 -0
  41. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/drivers/reverb_driver.py +0 -0
  42. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/event.py +0 -0
  43. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/helpers.py +0 -0
  44. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/manager.py +0 -0
  45. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/provider.py +0 -0
  46. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/reverb/__init__.py +0 -0
  47. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/reverb/channel_manager.py +0 -0
  48. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/reverb/connection.py +0 -0
  49. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/reverb/server.py +0 -0
  50. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/stubs/__init__.py +0 -0
  51. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/stubs/channels.py +0 -0
  52. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/carbon/__init__.py +0 -0
  53. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/carbon/carbon.py +0 -0
  54. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/config/__init__.py +0 -0
  55. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/config/app.py +0 -0
  56. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/configuration/Configuration.py +0 -0
  57. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/configuration/__init__.py +0 -0
  58. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/configuration/config.py +0 -0
  59. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/configuration/helpers.py +0 -0
  60. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py +0 -0
  61. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/configuration/providers/__init__.py +0 -0
  62. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/console/__init__.py +0 -0
  63. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/console/application.py +0 -0
  64. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/console/can_override_config.py +0 -0
  65. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/console/can_override_default_options.py +0 -0
  66. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/console/command.py +0 -0
  67. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/console/publish_command.py +0 -0
  68. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/container/__init__.py +0 -0
  69. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/container/container.py +0 -0
  70. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/environment/__init__.py +0 -0
  71. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/environment/environment.py +0 -0
  72. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/exceptions/__init__.py +0 -0
  73. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/exceptions/exceptions.py +0 -0
  74. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/exceptions/handler.py +0 -0
  75. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/AI.py +0 -0
  76. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Cache.py +0 -0
  77. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Config.py +0 -0
  78. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Config.pyi +0 -0
  79. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Dump.py +0 -0
  80. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Dump.pyi +0 -0
  81. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Facade.py +0 -0
  82. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Gate.py +0 -0
  83. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Gate.pyi +0 -0
  84. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Hash.py +0 -0
  85. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Hash.pyi +0 -0
  86. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Loader.py +0 -0
  87. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Loader.pyi +0 -0
  88. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Mail.py +0 -0
  89. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Mail.pyi +0 -0
  90. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Notification.py +0 -0
  91. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Notification.pyi +0 -0
  92. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Queue.py +0 -0
  93. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Queue.pyi +0 -0
  94. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/RateLimiter.py +0 -0
  95. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/RateLimiter.pyi +0 -0
  96. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Request.py +0 -0
  97. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Request.pyi +0 -0
  98. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Response.py +0 -0
  99. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Response.pyi +0 -0
  100. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Session.py +0 -0
  101. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Session.pyi +0 -0
  102. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Url.py +0 -0
  103. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Url.pyi +0 -0
  104. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/View.py +0 -0
  105. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/View.pyi +0 -0
  106. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Vite.py +0 -0
  107. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Vite.pyi +0 -0
  108. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/__init__.py +0 -0
  109. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/__init__.py +0 -0
  110. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/commands/__init__.py +0 -0
  111. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/commands/serve_command.py +0 -0
  112. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/config/__init__.py +0 -0
  113. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/config/fastapi.py +0 -0
  114. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/exceptions.py +0 -0
  115. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +0 -0
  116. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/requests/model.py +0 -0
  117. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/routers/router.py +0 -0
  118. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/testing/__init__.py +0 -0
  119. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/testing/assertable_json.py +0 -0
  120. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/testing/test_case.py +0 -0
  121. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/helpers/app.py +0 -0
  122. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/helpers/dataclass.py +0 -0
  123. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/inertia/__init__.py +0 -0
  124. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/inertia/constant.py +0 -0
  125. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/inertia/context.py +0 -0
  126. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/inertia/inertia.py +0 -0
  127. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/inertia/middleware.py +0 -0
  128. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/inertia/props/props.py +0 -0
  129. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/inertia/provider.py +0 -0
  130. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/jsonapi/__init__.py +0 -0
  131. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/jsonapi/response.py +0 -0
  132. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/loader/Loader.py +0 -0
  133. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/loader/__init__.py +0 -0
  134. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/ChannelFactory.py +0 -0
  135. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/__init__.py +0 -0
  136. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/channels/BaseChannel.py +0 -0
  137. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/channels/DailyChannel.py +0 -0
  138. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/channels/MultiBaseChannel.py +0 -0
  139. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/channels/SingleChannel.py +0 -0
  140. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/channels/SlackChannel.py +0 -0
  141. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/channels/StackChannel.py +0 -0
  142. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/channels/SyslogChannel.py +0 -0
  143. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/channels/TerminalChannel.py +0 -0
  144. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/channels/__init__.py +0 -0
  145. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/config/__init__.py +0 -0
  146. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/config/channels.py +0 -0
  147. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/config/logging.py +0 -0
  148. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/drivers/BaseDriver.py +0 -0
  149. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +0 -0
  150. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +0 -0
  151. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py +0 -0
  152. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/drivers/__init__.py +0 -0
  153. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/factory.py +0 -0
  154. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/file.py +0 -0
  155. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/handler.py +0 -0
  156. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/listeners.py +0 -0
  157. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/logger.py +0 -0
  158. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/managers/LoggingManager.py +0 -0
  159. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/managers/__init__.py +0 -0
  160. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/providers/__init__.py +0 -0
  161. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/providers/log_provider.py +0 -0
  162. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/collection/Collection.py +0 -0
  163. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/collection/__init__.py +0 -0
  164. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py +0 -0
  165. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +0 -0
  166. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py +0 -0
  167. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +0 -0
  168. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelDocstringCommand.py +0 -0
  169. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py +0 -0
  170. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +0 -0
  171. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +0 -0
  172. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +0 -0
  173. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py +0 -0
  174. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py +0 -0
  175. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py +0 -0
  176. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py +0 -0
  177. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/__init__.py +0 -0
  178. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_migration.stub +0 -0
  179. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub +0 -0
  180. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/stubs/model.stub +0 -0
  181. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/stubs/observer.stub +0 -0
  182. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/stubs/table_migration.stub +0 -0
  183. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/config/__init__.py +0 -0
  184. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/config/config.py +0 -0
  185. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/config/database.py +0 -0
  186. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/connections/connection.py +0 -0
  187. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/connections/factory.py +0 -0
  188. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/connections/manager.py +0 -0
  189. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/connections/mysql_connection.py +0 -0
  190. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py +0 -0
  191. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py +0 -0
  192. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/exceptions.py +0 -0
  193. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/expressions/__init__.py +0 -0
  194. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/expressions/expressions.py +0 -0
  195. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/facades/DB.py +0 -0
  196. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/facades/Schema.py +0 -0
  197. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/facades/__init__.py +0 -0
  198. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/factory/__init__.py +0 -0
  199. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/factory/factory.py +0 -0
  200. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/helpers/__init__.py +0 -0
  201. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/helpers/misc.py +0 -0
  202. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/migrations/Migration.py +0 -0
  203. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/migrations/Migrator.py +0 -0
  204. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/migrations/__init__.py +0 -0
  205. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/MigrationModel.py +0 -0
  206. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/__init__.py +0 -0
  207. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/attribute.py +0 -0
  208. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/builder.py +0 -0
  209. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/caster.py +0 -0
  210. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/fields.py +0 -0
  211. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/model.py +0 -0
  212. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/observer.py +0 -0
  213. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/pivot.py +0 -0
  214. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/registry.py +0 -0
  215. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/relationship.py +0 -0
  216. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py +0 -0
  217. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/observers/__init__.py +0 -0
  218. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/pagination/BasePaginator.py +0 -0
  219. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py +0 -0
  220. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py +0 -0
  221. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/pagination/__init__.py +0 -0
  222. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py +0 -0
  223. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/providers/__init__.py +0 -0
  224. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/EagerLoadMixin.py +0 -0
  225. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/EagerRelation.py +0 -0
  226. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/__init__.py +0 -0
  227. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py +0 -0
  228. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/grammars/MSSQLGrammar.py +0 -0
  229. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py +0 -0
  230. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py +0 -0
  231. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/grammars/SQLiteGrammar.py +0 -0
  232. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/grammars/__init__.py +0 -0
  233. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py +0 -0
  234. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py +0 -0
  235. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/processors/PostgresPostProcessor.py +0 -0
  236. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py +0 -0
  237. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/processors/__init__.py +0 -0
  238. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/support.py +0 -0
  239. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py +0 -0
  240. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py +0 -0
  241. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py +0 -0
  242. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/HasMany.py +0 -0
  243. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +0 -0
  244. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/HasOne.py +0 -0
  245. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py +0 -0
  246. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py +0 -0
  247. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py +0 -0
  248. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py +0 -0
  249. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py +0 -0
  250. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/__init__.py +0 -0
  251. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/Blueprint.py +0 -0
  252. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/Column.py +0 -0
  253. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/ColumnDiff.py +0 -0
  254. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/Constraint.py +0 -0
  255. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/ForeignKeyConstraint.py +0 -0
  256. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/Index.py +0 -0
  257. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/Table.py +0 -0
  258. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/TableDiff.py +0 -0
  259. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/__init__.py +0 -0
  260. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py +0 -0
  261. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py +0 -0
  262. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py +0 -0
  263. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py +0 -0
  264. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py +0 -0
  265. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/platforms/__init__.py +0 -0
  266. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/schema.py +0 -0
  267. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/seeds/Seeder.py +0 -0
  268. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/seeds/__init__.py +0 -0
  269. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/stubs/create-migration.html +0 -0
  270. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/stubs/table-migration.html +0 -0
  271. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/testing/__init__.py +0 -0
  272. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/testing/transaction.py +0 -0
  273. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/.gitignore +0 -0
  274. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/CACHEDIR.TAG +0 -0
  275. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/README.md +0 -0
  276. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/v/cache/lastfailed +0 -0
  277. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/v/cache/nodeids +0 -0
  278. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/__init__.py +0 -0
  279. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/config/database.py +0 -0
  280. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/config.py +0 -0
  281. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/exceptions.py +0 -0
  282. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/factories/Factory.py +0 -0
  283. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/factories/__init__.py +0 -0
  284. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/schema/Schema.py +0 -0
  285. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/scopes/BaseScope.py +0 -0
  286. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeleteScope.py +0 -0
  287. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeletesMixin.py +0 -0
  288. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyMixin.py +0 -0
  289. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyScope.py +0 -0
  290. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/scopes/__init__.py +0 -0
  291. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/scopes/scope.py +0 -0
  292. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/testing/BaseTestCaseSelectGrammar.py +0 -0
  293. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/testing/Database.py +0 -0
  294. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/testing/TestCase.py +0 -0
  295. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/testing/__init__.py +0 -0
  296. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/User.py +0 -0
  297. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/connections/test_base_connections.py +0 -0
  298. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/eagers/test_eager.py +0 -0
  299. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/models/test_models.py +0 -0
  300. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.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.46.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.46.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.46.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.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_qmark.py +0 -0
  305. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.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.46.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.46.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.46.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.46.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.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder.py +0 -0
  311. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.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.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_transactions.py +0 -0
  313. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.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.46.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.46.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.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_qmark.py +0 -0
  317. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.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.46.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.46.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.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_model.py +0 -0
  321. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.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.46.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.46.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.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_relationships.py +0 -0
  325. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.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.46.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.46.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.46.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.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_soft_delete.py +0 -0
  330. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.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.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_transaction.py +0 -0
  332. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_delete_grammar.py +0 -0
  333. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_insert_grammar.py +0 -0
  334. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_select_grammar.py +0 -0
  335. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_update_grammar.py +0 -0
  336. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/relationships/test_postgres_relationships.py +0 -0
  337. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.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.46.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.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/scopes/test_default_global_scopes.py +0 -0
  340. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/seeds/test_seeds.py +0 -0
  341. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/utils.py +0 -0
  342. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/__init__.py +0 -0
  343. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/argument.py +0 -0
  344. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/prompt.py +0 -0
  345. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/protocol.py +0 -0
  346. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/providers/__init__.py +0 -0
  347. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/providers/mcp_provider.py +0 -0
  348. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/request.py +0 -0
  349. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/resource.py +0 -0
  350. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/response.py +0 -0
  351. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/server.py +0 -0
  352. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/tool.py +0 -0
  353. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/process/__init__.py +0 -0
  354. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/process/exception.py +0 -0
  355. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/process/fake.py +0 -0
  356. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/process/process.py +0 -0
  357. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/process/result.py +0 -0
  358. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/providers/Provider.py +0 -0
  359. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/providers/__init__.py +0 -0
  360. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/providers/app_provider.py +0 -0
  361. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/__init__.py +0 -0
  362. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/adapters/__init__.py +0 -0
  363. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/adapters/base.py +0 -0
  364. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/adapters/claude.py +0 -0
  365. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/adapters/gemini.py +0 -0
  366. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/commands/__init__.py +0 -0
  367. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/commands/skills.py +0 -0
  368. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/parser.py +0 -0
  369. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/provider.py +0 -0
  370. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/registry.py +0 -0
  371. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/database/SKILL.md +0 -0
  372. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/fastapi/SKILL.md +0 -0
  373. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/inertia/SKILL.md +0 -0
  374. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/__init__.py +0 -0
  375. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/config/__init__.py +0 -0
  376. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/config/storage.py +0 -0
  377. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/data/mime.types +0 -0
  378. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/drivers/__init__.py +0 -0
  379. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/drivers/fake.py +0 -0
  380. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/drivers/local.py +0 -0
  381. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/drivers/s3.py +0 -0
  382. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/file.py +0 -0
  383. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/filestream.py +0 -0
  384. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/helper.py +0 -0
  385. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/providers/provider.py +0 -0
  386. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/storage.py +0 -0
  387. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/support/__init__.py +0 -0
  388. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/support/collection.py +0 -0
  389. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/support/string.py +0 -0
  390. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/support/uri.py +0 -0
  391. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/testing/__init__.py +0 -0
  392. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/testing/test_case.py +0 -0
  393. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/utils/structures.py +0 -0
  394. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/vite/exceptions.py +0 -0
  395. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/vite/stubs/package.json +0 -0
  396. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/vite/stubs/resources/css/app.css +0 -0
  397. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.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.46.0/src/fastapi_startkit/vite/stubs/resources}/templates/index.html +0 -0
  399. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/vite/stubs/tsconfig.json +0 -0
  400. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/vite/stubs/vite.config.ts +0 -0
  401. {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/vite/vite.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fastapi-startkit
3
- Version: 0.45.0
3
+ Version: 0.46.0
4
4
  Summary: Fastapi Starter kit components
5
5
  Author: Bedram Tamang
6
6
  Author-email: Bedram Tamang <tmgbedu@gmail.com>
@@ -11,9 +11,8 @@ Requires-Dist: requests>=2.32.5,<3.0.0
11
11
  Requires-Dist: cleo>=2.1.0,<3.0.0
12
12
  Requires-Dist: dotenv>=0.9.9
13
13
  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'
14
+ Requires-Dist: langchain>=1.0.0 ; extra == 'ai'
15
+ Requires-Dist: langchain-core>=1.0.0 ; extra == 'ai'
17
16
  Requires-Dist: faker>=40.13.0 ; extra == 'database'
18
17
  Requires-Dist: sqlalchemy[asyncio]>=2.0.38 ; extra == 'database'
19
18
  Requires-Dist: fastapi[standard]>=0.124.4,<0.125.0 ; extra == 'fastapi'
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fastapi-startkit"
3
- version = "0.45.0"
3
+ version = "0.46.0"
4
4
  description = "Fastapi Starter kit components"
5
5
  authors = [
6
6
  {name = "Bedram Tamang", email = "tmgbedu@gmail.com"}
@@ -48,9 +48,8 @@ inertia = [
48
48
  ]
49
49
 
50
50
  ai = [
51
- "anthropic>=0.49.0",
52
- "openai>=1.0.0",
53
- "google-generativeai>=0.8.0",
51
+ "langchain>=1.0.0",
52
+ "langchain-core>=1.0.0",
54
53
  ]
55
54
 
56
55
  [dependency-groups]
@@ -68,6 +67,8 @@ dev = [
68
67
  "sqlalchemy[asyncio]>=2.0.38",
69
68
  "fastapi[standard]>=0.124.4",
70
69
  "faker>=40.13.0",
70
+ "langchain>=1.0.0",
71
+ "langchain-core>=1.0.0",
71
72
  ]
72
73
 
73
74
 
@@ -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"))
@@ -7,7 +7,7 @@ def provider(name: str):
7
7
  """Set the LLM provider: 'anthropic', 'openai', 'google', etc."""
8
8
 
9
9
  def decorator(cls):
10
- cls._provider = name
10
+ cls.provider = name
11
11
  return cls
12
12
 
13
13
  return decorator
@@ -17,7 +17,7 @@ def model(name: str = ""):
17
17
  """Set the model identifier (e.g. 'claude-sonnet-4-6', 'gpt-4o')."""
18
18
 
19
19
  def decorator(cls):
20
- cls._model = name
20
+ cls.model = name
21
21
  return cls
22
22
 
23
23
  return decorator
@@ -27,7 +27,7 @@ def max_steps(n: int = 10):
27
27
  """Maximum agentic loop iterations before stopping."""
28
28
 
29
29
  def decorator(cls):
30
- cls._max_steps = n
30
+ cls.max_steps = n
31
31
  return cls
32
32
 
33
33
  return decorator
@@ -37,7 +37,7 @@ def max_tokens(n: int = 4096):
37
37
  """Maximum output tokens per response."""
38
38
 
39
39
  def decorator(cls):
40
- cls._max_tokens = n
40
+ cls.max_tokens = n
41
41
  return cls
42
42
 
43
43
  return decorator
@@ -47,7 +47,7 @@ def timeout(seconds: float = 30.0):
47
47
  """Request timeout in seconds."""
48
48
 
49
49
  def decorator(cls):
50
- cls._timeout = seconds
50
+ cls.timeout = seconds
51
51
  return cls
52
52
 
53
53
  return decorator
@@ -57,17 +57,7 @@ def top_p(value: float = 1.0):
57
57
  """Top-p nucleus sampling parameter."""
58
58
 
59
59
  def decorator(cls):
60
- cls._top_p = value
61
- return cls
62
-
63
- return decorator
64
-
65
-
66
- def memory(backend: str = ""):
67
- """Attach a named memory backend to this agent."""
68
-
69
- def decorator(cls):
70
- cls._memory_backend = backend
60
+ cls.top_p = value
71
61
  return cls
72
62
 
73
63
  return decorator