fastapi-fullstack 0.1.10__tar.gz → 0.1.12__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_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/PKG-INFO +1 -1
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/fastapi_gen/config.py +18 -2
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/fastapi_gen/prompts.py +8 -4
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/pyproject.toml +4 -1
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/VARIABLES.md +6 -2
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/cookiecutter.json +2 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/CLAUDE.md +2 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/agents/__init__.py +20 -0
- fastapi_fullstack-0.1.12/template/{{cookiecutter.project_slug}}/backend/app/agents/crewai_assistant.py +563 -0
- fastapi_fullstack-0.1.12/template/{{cookiecutter.project_slug}}/backend/app/agents/langgraph_assistant.py +371 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/agent.py +903 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/pyproject.toml +20 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/test_agents.py +2 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/message-item.tsx +22 -4
- fastapi_fullstack-0.1.12/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/message-list.tsx +38 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/hooks/use-chat.ts +164 -17
- fastapi_fullstack-0.1.12/template/{{cookiecutter.project_slug}}/frontend/src/hooks/use-local-chat.ts +313 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/types/chat.ts +16 -1
- fastapi_fullstack-0.1.10/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/message-list.tsx +0 -18
- fastapi_fullstack-0.1.10/template/{{cookiecutter.project_slug}}/frontend/src/hooks/use-local-chat.ts +0 -165
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/.gitignore +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/LICENSE +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/README.md +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/fastapi_gen/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/fastapi_gen/cli.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/fastapi_gen/generator.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/hooks/post_gen_project.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/.env.prod.example +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/.github/workflows/ci.yml +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/.gitignore +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/.gitlab-ci.yml +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/AGENTS.md +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/Makefile +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/README.md +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/.dockerignore +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/.env.example +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/.pre-commit-config.yaml +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/Dockerfile +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/alembic/env.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/alembic/script.py.mako +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/alembic/versions/.gitkeep +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/alembic.ini +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/admin.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/agents/assistant.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/agents/langchain_assistant.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/agents/prompts.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/agents/tools/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/agents/tools/datetime_tool.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/api/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/api/deps.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/api/exception_handlers.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/api/router.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/api/routes/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/auth.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/conversations.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/health.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/items.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/oauth.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/sessions.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/users.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/webhooks.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/ws.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/api/versioning.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/clients/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/clients/redis.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/commands/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/commands/cleanup.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/commands/example.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/commands/seed.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/core/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/core/cache.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/core/config.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/core/csrf.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/core/exceptions.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/core/logfire_setup.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/core/middleware.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/core/oauth.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/core/rate_limit.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/core/sanitize.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/core/security.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/db/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/db/base.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/db/models/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/db/models/conversation.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/db/models/item.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/db/models/session.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/db/models/user.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/db/models/webhook.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/db/session.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/main.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/pipelines/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/pipelines/base.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/repositories/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/repositories/base.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/repositories/conversation.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/repositories/item.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/repositories/session.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/repositories/user.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/repositories/webhook.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/schemas/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/schemas/base.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/schemas/conversation.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/schemas/item.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/schemas/session.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/schemas/token.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/schemas/user.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/schemas/webhook.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/services/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/services/conversation.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/services/item.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/services/session.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/services/user.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/services/webhook.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/worker/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/worker/arq_app.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/worker/celery_app.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/worker/taskiq_app.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/worker/tasks/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/worker/tasks/examples.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/worker/tasks/schedules.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/app/worker/tasks/taskiq_examples.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/cli/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/cli/commands.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/scripts/.gitkeep +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/api/__init__.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/api/test_auth.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/api/test_exceptions.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/api/test_health.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/api/test_items.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/api/test_metrics.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/api/test_users.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/conftest.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/test_admin.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/test_clients.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/test_commands.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/test_core.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/test_pipelines.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/test_repositories.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/test_security.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/test_services.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/backend/tests/test_worker.py +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/docker-compose.dev.yml +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/docker-compose.frontend.yml +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/docker-compose.prod.yml +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/docker-compose.yml +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/docs/adding_features.md +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/docs/architecture.md +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/docs/patterns.md +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/docs/testing.md +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/.dockerignore +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/.env.example +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/.gitignore +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/.prettierignore +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/.prettierrc +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/Dockerfile +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/README.md +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/e2e/auth.setup.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/e2e/auth.spec.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/e2e/chat.spec.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/e2e/home.spec.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/instrumentation.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/messages/en.json +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/messages/pl.json +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/next.config.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/package.json +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/playwright.config.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/postcss.config.mjs +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/[locale]/(auth)/layout.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/[locale]/(auth)/login/page.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/[locale]/(auth)/register/page.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/[locale]/(dashboard)/chat/page.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/[locale]/(dashboard)/dashboard/page.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/[locale]/(dashboard)/layout.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/[locale]/(dashboard)/profile/page.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/[locale]/auth/callback/page.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/[locale]/layout.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/[locale]/page.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/api/auth/login/route.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/api/auth/logout/route.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/api/auth/me/route.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/api/auth/oauth-callback/route.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/api/auth/refresh/route.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/api/auth/register/route.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/api/conversations/[id]/messages/route.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/api/conversations/[id]/route.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/api/conversations/route.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/api/health/route.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/globals.css +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/layout.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/app/providers.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/auth/index.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/auth/login-form.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/auth/register-form.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/chat-container.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/chat-input.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/conversation-sidebar.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/copy-button.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/index.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/local-conversation-sidebar.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/markdown-content.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/tool-call-card.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/icons/google-icon.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/icons/index.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/language-switcher.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/layout/header.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/layout/index.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/layout/sidebar.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/theme/index.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/theme/theme-provider.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/theme/theme-toggle.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/ui/badge.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/ui/button.test.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/ui/button.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/ui/card.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/ui/index.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/ui/input.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/ui/label.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/components/ui/sheet.tsx +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/hooks/index.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/hooks/use-auth.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/hooks/use-conversations.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/hooks/use-websocket.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/i18n.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/lib/api-client.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/lib/constants.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/lib/server-api.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/lib/utils.test.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/lib/utils.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/middleware.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/stores/auth-store.test.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/stores/auth-store.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/stores/chat-sidebar-store.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/stores/chat-store.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/stores/conversation-store.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/stores/index.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/stores/local-chat-store.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/stores/sidebar-store.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/stores/theme-store.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/types/api.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/types/auth.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/types/conversation.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/src/types/index.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/tsconfig.json +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/vitest.config.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/frontend/vitest.setup.ts +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/kubernetes/configmap.yaml +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/kubernetes/deployment.yaml +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/kubernetes/ingress.yaml +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/kubernetes/kustomization.yaml +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/kubernetes/namespace.yaml +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/kubernetes/secret.yaml +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/kubernetes/service.yaml +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/nginx/nginx.conf +0 -0
- {fastapi_fullstack-0.1.10 → fastapi_fullstack-0.1.12}/template/{{cookiecutter.project_slug}}/nginx/ssl/.gitkeep +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fastapi-fullstack
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.12
|
|
4
4
|
Summary: Full-stack FastAPI + Next.js template generator with PydanticAI/LangChain agents, WebSocket streaming, 20+ enterprise integrations, and Logfire/LangSmith observability. Ship AI apps fast. CLI tool to generate production-ready FastAPI + Next.js projects with AI agents, auth, and observability.
|
|
5
5
|
Project-URL: Homepage, https://github.com/vstorm-co/full-stack-fastapi-nextjs-llm-template
|
|
6
6
|
Project-URL: Documentation, https://github.com/vstorm-co/full-stack-fastapi-nextjs-llm-template#readme
|
|
@@ -89,6 +89,8 @@ class AIFrameworkType(str, Enum):
|
|
|
89
89
|
|
|
90
90
|
PYDANTIC_AI = "pydantic_ai"
|
|
91
91
|
LANGCHAIN = "langchain"
|
|
92
|
+
LANGGRAPH = "langgraph"
|
|
93
|
+
CREWAI = "crewai"
|
|
92
94
|
|
|
93
95
|
|
|
94
96
|
class LLMProviderType(str, Enum):
|
|
@@ -177,7 +179,7 @@ class ProjectConfig(BaseModel):
|
|
|
177
179
|
admin_require_auth: bool = True
|
|
178
180
|
enable_websockets: bool = False
|
|
179
181
|
enable_file_storage: bool = False
|
|
180
|
-
enable_ai_agent: bool =
|
|
182
|
+
enable_ai_agent: bool = True
|
|
181
183
|
ai_framework: AIFrameworkType = AIFrameworkType.PYDANTIC_AI
|
|
182
184
|
llm_provider: LLMProviderType = LLMProviderType.OPENAI
|
|
183
185
|
enable_conversation_persistence: bool = False
|
|
@@ -206,7 +208,7 @@ class ProjectConfig(BaseModel):
|
|
|
206
208
|
python_version: str = "3.12"
|
|
207
209
|
|
|
208
210
|
# Frontend
|
|
209
|
-
frontend: FrontendType = FrontendType.
|
|
211
|
+
frontend: FrontendType = FrontendType.NEXTJS
|
|
210
212
|
frontend_port: int = 3000
|
|
211
213
|
|
|
212
214
|
# Backend
|
|
@@ -263,6 +265,18 @@ class ProjectConfig(BaseModel):
|
|
|
263
265
|
and self.llm_provider == LLMProviderType.OPENROUTER
|
|
264
266
|
):
|
|
265
267
|
raise ValueError("OpenRouter is not supported with LangChain")
|
|
268
|
+
if (
|
|
269
|
+
self.enable_ai_agent
|
|
270
|
+
and self.ai_framework == AIFrameworkType.LANGGRAPH
|
|
271
|
+
and self.llm_provider == LLMProviderType.OPENROUTER
|
|
272
|
+
):
|
|
273
|
+
raise ValueError("OpenRouter is not supported with LangGraph")
|
|
274
|
+
if (
|
|
275
|
+
self.enable_ai_agent
|
|
276
|
+
and self.ai_framework == AIFrameworkType.CREWAI
|
|
277
|
+
and self.llm_provider == LLMProviderType.OPENROUTER
|
|
278
|
+
):
|
|
279
|
+
raise ValueError("OpenRouter is not supported with CrewAI")
|
|
266
280
|
if (
|
|
267
281
|
self.enable_rate_limiting
|
|
268
282
|
and self.rate_limit_storage == RateLimitStorageType.REDIS
|
|
@@ -345,6 +359,8 @@ class ProjectConfig(BaseModel):
|
|
|
345
359
|
"ai_framework": self.ai_framework.value,
|
|
346
360
|
"use_pydantic_ai": self.ai_framework == AIFrameworkType.PYDANTIC_AI,
|
|
347
361
|
"use_langchain": self.ai_framework == AIFrameworkType.LANGCHAIN,
|
|
362
|
+
"use_langgraph": self.ai_framework == AIFrameworkType.LANGGRAPH,
|
|
363
|
+
"use_crewai": self.ai_framework == AIFrameworkType.CREWAI,
|
|
348
364
|
"llm_provider": self.llm_provider.value,
|
|
349
365
|
"use_openai": self.llm_provider == LLMProviderType.OPENAI,
|
|
350
366
|
"use_anthropic": self.llm_provider == LLMProviderType.ANTHROPIC,
|
|
@@ -310,7 +310,9 @@ def prompt_integrations() -> dict[str, bool]:
|
|
|
310
310
|
questionary.Choice("Admin Panel (SQLAdmin)", value="admin_panel"),
|
|
311
311
|
questionary.Choice("WebSockets", value="websockets"),
|
|
312
312
|
questionary.Choice("File Storage (S3/MinIO)", value="file_storage"),
|
|
313
|
-
questionary.Choice(
|
|
313
|
+
questionary.Choice(
|
|
314
|
+
"AI Agent (PydanticAI/LangGraph/CrewAI)", value="ai_agent", checked=True
|
|
315
|
+
),
|
|
314
316
|
questionary.Choice("Webhooks (outbound events)", value="webhooks"),
|
|
315
317
|
questionary.Choice("Example CRUD (Item model)", value="example_crud", checked=True),
|
|
316
318
|
questionary.Choice("CORS middleware", value="cors", checked=True),
|
|
@@ -485,8 +487,8 @@ def prompt_frontend() -> FrontendType:
|
|
|
485
487
|
console.print()
|
|
486
488
|
|
|
487
489
|
choices = [
|
|
488
|
-
questionary.Choice("None (API only)", value=FrontendType.NONE),
|
|
489
490
|
questionary.Choice("Next.js 15 (App Router, TypeScript, Bun)", value=FrontendType.NEXTJS),
|
|
491
|
+
questionary.Choice("None (API only)", value=FrontendType.NONE),
|
|
490
492
|
]
|
|
491
493
|
|
|
492
494
|
return cast(
|
|
@@ -530,6 +532,8 @@ def prompt_ai_framework() -> AIFrameworkType:
|
|
|
530
532
|
choices = [
|
|
531
533
|
questionary.Choice("PydanticAI (recommended)", value=AIFrameworkType.PYDANTIC_AI),
|
|
532
534
|
questionary.Choice("LangChain", value=AIFrameworkType.LANGCHAIN),
|
|
535
|
+
questionary.Choice("LangGraph (ReAct agent)", value=AIFrameworkType.LANGGRAPH),
|
|
536
|
+
questionary.Choice("CrewAI (multi-agent crews)", value=AIFrameworkType.CREWAI),
|
|
533
537
|
]
|
|
534
538
|
|
|
535
539
|
return cast(
|
|
@@ -549,7 +553,7 @@ def prompt_llm_provider(ai_framework: AIFrameworkType) -> LLMProviderType:
|
|
|
549
553
|
|
|
550
554
|
Args:
|
|
551
555
|
ai_framework: The selected AI framework. OpenRouter is only
|
|
552
|
-
available for PydanticAI.
|
|
556
|
+
available for PydanticAI (not LangChain, LangGraph, or CrewAI).
|
|
553
557
|
"""
|
|
554
558
|
console.print()
|
|
555
559
|
console.print("[bold cyan]LLM Provider[/]")
|
|
@@ -560,7 +564,7 @@ def prompt_llm_provider(ai_framework: AIFrameworkType) -> LLMProviderType:
|
|
|
560
564
|
questionary.Choice("Anthropic (claude-sonnet-4-5)", value=LLMProviderType.ANTHROPIC),
|
|
561
565
|
]
|
|
562
566
|
|
|
563
|
-
# OpenRouter only available for PydanticAI
|
|
567
|
+
# OpenRouter only available for PydanticAI (not LangChain, LangGraph, or CrewAI)
|
|
564
568
|
if ai_framework == AIFrameworkType.PYDANTIC_AI:
|
|
565
569
|
choices.append(
|
|
566
570
|
questionary.Choice("OpenRouter (multi-provider)", value=LLMProviderType.OPENROUTER)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "fastapi-fullstack"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.12"
|
|
4
4
|
description = "Full-stack FastAPI + Next.js template generator with PydanticAI/LangChain agents, WebSocket streaming, 20+ enterprise integrations, and Logfire/LangSmith observability. Ship AI apps fast. CLI tool to generate production-ready FastAPI + Next.js projects with AI agents, auth, and observability."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -149,6 +149,9 @@ testpaths = ["tests"]
|
|
|
149
149
|
python_files = ["test_*.py"]
|
|
150
150
|
python_functions = ["test_*"]
|
|
151
151
|
addopts = "-v --tb=short"
|
|
152
|
+
markers = [
|
|
153
|
+
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
|
|
154
|
+
]
|
|
152
155
|
|
|
153
156
|
[tool.coverage.run]
|
|
154
157
|
source = ["fastapi_gen"]
|
|
@@ -187,9 +187,11 @@ These variables are set automatically by the generator.
|
|
|
187
187
|
| Variable | Type | Default | Description | Dependencies |
|
|
188
188
|
|----------|------|---------|-------------|--------------|
|
|
189
189
|
| `enable_ai_agent` | bool | `false` | Enable AI agent functionality | - |
|
|
190
|
-
| `ai_framework` | enum | `"pydantic_ai"` | AI framework. Values: `pydantic_ai`, `langchain` | Requires `enable_ai_agent` |
|
|
190
|
+
| `ai_framework` | enum | `"pydantic_ai"` | AI framework. Values: `pydantic_ai`, `langchain`, `langgraph`, `crewai` | Requires `enable_ai_agent` |
|
|
191
191
|
| `use_pydantic_ai` | bool | `true` | PydanticAI is selected | Computed from `ai_framework` |
|
|
192
192
|
| `use_langchain` | bool | `false` | LangChain is selected | Computed from `ai_framework` |
|
|
193
|
+
| `use_langgraph` | bool | `false` | LangGraph (ReAct agent) is selected | Computed from `ai_framework` |
|
|
194
|
+
| `use_crewai` | bool | `false` | CrewAI (multi-agent crews) is selected | Computed from `ai_framework` |
|
|
193
195
|
| `llm_provider` | enum | `"openai"` | LLM provider. Values: `openai`, `anthropic`, `openrouter` | Requires `enable_ai_agent` |
|
|
194
196
|
| `use_openai` | bool | `true` | OpenAI is selected | Computed from `llm_provider` |
|
|
195
197
|
| `use_anthropic` | bool | `false` | Anthropic is selected | Computed from `llm_provider` |
|
|
@@ -198,7 +200,9 @@ These variables are set automatically by the generator.
|
|
|
198
200
|
|
|
199
201
|
**Notes:**
|
|
200
202
|
- PydanticAI uses `iter()` for full event streaming over WebSocket
|
|
201
|
-
-
|
|
203
|
+
- LangGraph implements a ReAct (Reasoning + Acting) agent pattern with graph-based architecture
|
|
204
|
+
- CrewAI enables multi-agent teams that collaborate on complex tasks
|
|
205
|
+
- OpenRouter with LangChain, LangGraph, or CrewAI is not supported
|
|
202
206
|
|
|
203
207
|
---
|
|
204
208
|
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
{%- if cookiecutter.enable_redis %}, Redis{%- endif %}
|
|
13
13
|
{%- if cookiecutter.enable_ai_agent and cookiecutter.use_pydantic_ai %}, PydanticAI{%- endif %}
|
|
14
14
|
{%- if cookiecutter.enable_ai_agent and cookiecutter.use_langchain %}, LangChain{%- endif %}
|
|
15
|
+
{%- if cookiecutter.enable_ai_agent and cookiecutter.use_langgraph %}, LangGraph{%- endif %}
|
|
16
|
+
{%- if cookiecutter.enable_ai_agent and cookiecutter.use_crewai %}, CrewAI{%- endif %}
|
|
15
17
|
{%- if cookiecutter.use_celery %}, Celery{%- endif %}
|
|
16
18
|
{%- if cookiecutter.use_taskiq %}, Taskiq{%- endif %}
|
|
17
19
|
{%- if cookiecutter.use_frontend %}, Next.js 15{%- endif %}
|
|
@@ -18,6 +18,26 @@ Tools are defined in the tools/ subdirectory.
|
|
|
18
18
|
from app.agents.langchain_assistant import AgentContext, AgentState, LangChainAssistant
|
|
19
19
|
|
|
20
20
|
__all__ = ["LangChainAssistant", "AgentContext", "AgentState"]
|
|
21
|
+
{%- elif cookiecutter.enable_ai_agent and cookiecutter.use_langgraph %}
|
|
22
|
+
"""AI Agents module using LangGraph.
|
|
23
|
+
|
|
24
|
+
This module contains a ReAct agent built with LangGraph.
|
|
25
|
+
Tools are defined in the tools/ subdirectory.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from app.agents.langgraph_assistant import AgentContext, AgentState, LangGraphAssistant
|
|
29
|
+
|
|
30
|
+
__all__ = ["LangGraphAssistant", "AgentContext", "AgentState"]
|
|
31
|
+
{%- elif cookiecutter.enable_ai_agent and cookiecutter.use_crewai %}
|
|
32
|
+
"""AI Agents module using CrewAI.
|
|
33
|
+
|
|
34
|
+
This module contains a multi-agent crew built with CrewAI.
|
|
35
|
+
Agents work together in a team to accomplish complex tasks.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
from app.agents.crewai_assistant import CrewAIAssistant, CrewConfig, CrewContext
|
|
39
|
+
|
|
40
|
+
__all__ = ["CrewAIAssistant", "CrewConfig", "CrewContext"]
|
|
21
41
|
{%- else %}
|
|
22
42
|
"""AI Agents - not configured."""
|
|
23
43
|
{%- endif %}
|