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.
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/PKG-INFO +3 -4
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/pyproject.toml +5 -4
- fastapi_startkit-0.46.0/src/fastapi_startkit/ai/__init__.py +45 -0
- fastapi_startkit-0.46.0/src/fastapi_startkit/ai/agent.py +299 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/ai/audio.py +2 -13
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/ai/audio_factory.py +8 -14
- fastapi_startkit-0.46.0/src/fastapi_startkit/ai/config/ai.py +24 -0
- {fastapi_startkit-0.45.0/src/fastapi_startkit/ai → fastapi_startkit-0.46.0/src/fastapi_startkit/ai/config}/config.py +23 -18
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/ai/decorators.py +6 -16
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/ai/document.py +14 -11
- fastapi_startkit-0.46.0/src/fastapi_startkit/ai/fakes.py +53 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/ai/image.py +2 -13
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/ai/image_factory.py +1 -2
- fastapi_startkit-0.46.0/src/fastapi_startkit/ai/lab.py +54 -0
- fastapi_startkit-0.46.0/src/fastapi_startkit/ai/model_builder.py +47 -0
- fastapi_startkit-0.46.0/src/fastapi_startkit/ai/pipeline.py +101 -0
- fastapi_startkit-0.46.0/src/fastapi_startkit/ai/providers/ai_provider.py +18 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/ai/response.py +3 -2
- fastapi_startkit-0.46.0/src/fastapi_startkit/ai/runner.py +59 -0
- fastapi_startkit-0.46.0/src/fastapi_startkit/ai/testing.py +190 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/AI.pyi +1 -1
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/testing/test_response.py +78 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +5 -3
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/__init__.py +17 -1
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/vite/__init__.py +2 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/vite/config/vite.py +2 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/vite/providers/provider.py +20 -1
- fastapi_startkit-0.45.0/src/fastapi_startkit/ai/__init__.py +0 -53
- fastapi_startkit-0.45.0/src/fastapi_startkit/ai/agent.py +0 -498
- fastapi_startkit-0.45.0/src/fastapi_startkit/ai/providers/ai_provider.py +0 -30
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/.DS_Store +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/ai/providers/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/application.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/auth.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/channels.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/config.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/drivers/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/drivers/log_driver.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/drivers/reverb_driver.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/event.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/helpers.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/manager.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/provider.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/reverb/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/reverb/channel_manager.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/reverb/connection.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/reverb/server.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/stubs/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/broadcasting/stubs/channels.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/carbon/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/carbon/carbon.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/config/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/config/app.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/configuration/Configuration.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/configuration/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/configuration/config.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/configuration/helpers.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/configuration/providers/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/console/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/console/application.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/console/can_override_config.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/console/can_override_default_options.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/console/command.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/console/publish_command.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/container/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/container/container.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/environment/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/environment/environment.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/exceptions/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/exceptions/exceptions.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/exceptions/handler.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/AI.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Cache.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Config.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Config.pyi +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Dump.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Dump.pyi +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Facade.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Gate.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Gate.pyi +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Hash.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Hash.pyi +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Loader.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Loader.pyi +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Mail.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Mail.pyi +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Notification.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Notification.pyi +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Queue.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Queue.pyi +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/RateLimiter.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/RateLimiter.pyi +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Request.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Request.pyi +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Response.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Response.pyi +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Session.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Session.pyi +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Url.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Url.pyi +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/View.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/View.pyi +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Vite.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/Vite.pyi +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/facades/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/commands/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/commands/serve_command.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/config/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/config/fastapi.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/exceptions.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/requests/model.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/routers/router.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/testing/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/testing/assertable_json.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/fastapi/testing/test_case.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/helpers/app.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/helpers/dataclass.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/inertia/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/inertia/constant.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/inertia/context.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/inertia/inertia.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/inertia/middleware.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/inertia/props/props.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/inertia/provider.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/jsonapi/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/jsonapi/response.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/loader/Loader.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/loader/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/ChannelFactory.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/channels/BaseChannel.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/channels/DailyChannel.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/channels/MultiBaseChannel.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/channels/SingleChannel.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/channels/SlackChannel.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/channels/StackChannel.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/channels/SyslogChannel.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/channels/TerminalChannel.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/channels/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/config/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/config/channels.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/config/logging.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/drivers/BaseDriver.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/drivers/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/factory.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/file.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/handler.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/listeners.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/logger.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/managers/LoggingManager.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/managers/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/providers/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/logging/providers/log_provider.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/collection/Collection.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/collection/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelDocstringCommand.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_migration.stub +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/stubs/model.stub +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/stubs/observer.stub +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/commands/stubs/table_migration.stub +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/config/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/config/config.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/config/database.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/connections/connection.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/connections/factory.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/connections/manager.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/connections/mysql_connection.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/exceptions.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/expressions/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/expressions/expressions.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/facades/DB.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/facades/Schema.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/facades/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/factory/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/factory/factory.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/helpers/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/helpers/misc.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/migrations/Migration.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/migrations/Migrator.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/migrations/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/MigrationModel.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/attribute.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/builder.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/caster.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/fields.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/model.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/observer.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/pivot.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/registry.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/models/relationship.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/observers/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/pagination/BasePaginator.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/pagination/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/providers/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/EagerLoadMixin.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/EagerRelation.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/grammars/MSSQLGrammar.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/grammars/SQLiteGrammar.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/grammars/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/processors/PostgresPostProcessor.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/processors/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/query/support.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/HasMany.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/HasOne.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/relationships/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/Blueprint.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/Column.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/ColumnDiff.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/Constraint.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/ForeignKeyConstraint.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/Index.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/Table.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/TableDiff.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/platforms/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/schema/schema.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/seeds/Seeder.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/seeds/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/stubs/create-migration.html +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/stubs/table-migration.html +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/testing/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm/testing/transaction.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/.gitignore +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/CACHEDIR.TAG +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/README.md +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/v/cache/lastfailed +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/v/cache/nodeids +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/config/database.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/config.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/exceptions.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/factories/Factory.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/factories/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/schema/Schema.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/scopes/BaseScope.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeleteScope.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeletesMixin.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyMixin.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyScope.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/scopes/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/scopes/scope.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/testing/BaseTestCaseSelectGrammar.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/testing/Database.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/testing/TestCase.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/testing/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/User.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/connections/test_base_connections.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/eagers/test_eager.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/models/test_models.py +0 -0
- {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
- {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
- {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
- {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
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_qmark.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder.py +0 -0
- {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
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_transactions.py +0 -0
- {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
- {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
- {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
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_qmark.py +0 -0
- {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
- {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
- {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
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_model.py +0 -0
- {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
- {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
- {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
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_relationships.py +0 -0
- {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
- {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
- {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
- {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
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_soft_delete.py +0 -0
- {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
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_transaction.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_delete_grammar.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_insert_grammar.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_select_grammar.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_update_grammar.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/relationships/test_postgres_relationships.py +0 -0
- {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
- {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
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/scopes/test_default_global_scopes.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/seeds/test_seeds.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/masoniteorm.backup/tests/utils.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/argument.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/prompt.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/protocol.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/providers/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/providers/mcp_provider.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/request.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/resource.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/response.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/server.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/mcp/tool.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/process/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/process/exception.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/process/fake.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/process/process.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/process/result.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/providers/Provider.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/providers/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/providers/app_provider.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/adapters/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/adapters/base.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/adapters/claude.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/adapters/gemini.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/commands/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/commands/skills.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/parser.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/provider.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/registry.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/database/SKILL.md +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/fastapi/SKILL.md +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/skills/stubs/.ai/fastapi-startkit/inertia/SKILL.md +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/config/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/config/storage.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/data/mime.types +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/drivers/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/drivers/fake.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/drivers/local.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/drivers/s3.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/file.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/filestream.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/helper.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/providers/provider.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/storage/storage.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/support/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/support/collection.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/support/string.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/support/uri.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/testing/__init__.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/testing/test_case.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/utils/structures.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/vite/exceptions.py +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/vite/stubs/package.json +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/vite/stubs/resources/css/app.css +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/vite/stubs/resources/js/app.ts +0 -0
- {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
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/vite/stubs/tsconfig.json +0 -0
- {fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/vite/stubs/vite.config.ts +0 -0
- {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.
|
|
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:
|
|
15
|
-
Requires-Dist:
|
|
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.
|
|
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
|
-
"
|
|
52
|
-
"
|
|
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.
|
|
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.
|
|
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
|
{fastapi_startkit-0.45.0 → fastapi_startkit-0.46.0}/src/fastapi_startkit/ai/audio_factory.py
RENAMED
|
@@ -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.
|
|
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",
|
|
193
|
-
"alloy": "EXAVITQu4vr4xnSDxMaL",
|
|
194
|
-
"shimmer": "MF3mGyEYCl7XYWbV9V6O",
|
|
195
|
-
"onyx": "pNInz6obpgDQGcFmaJgB",
|
|
196
|
-
"echo": "ErXwobaYiN019PkySvjV",
|
|
197
|
-
"fable": "VR6AewLTigWG4xSOukaG",
|
|
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,
|
|
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
|
-
"
|
|
53
|
-
"
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|