fastapi-fullstack 0.1.7__py3-none-any.whl → 0.1.15__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. {fastapi_fullstack-0.1.7.dist-info → fastapi_fullstack-0.1.15.dist-info}/METADATA +9 -2
  2. {fastapi_fullstack-0.1.7.dist-info → fastapi_fullstack-0.1.15.dist-info}/RECORD +71 -55
  3. fastapi_gen/__init__.py +6 -1
  4. fastapi_gen/cli.py +9 -0
  5. fastapi_gen/config.py +154 -2
  6. fastapi_gen/generator.py +34 -14
  7. fastapi_gen/prompts.py +172 -31
  8. fastapi_gen/template/VARIABLES.md +33 -4
  9. fastapi_gen/template/cookiecutter.json +10 -0
  10. fastapi_gen/template/hooks/post_gen_project.py +87 -2
  11. fastapi_gen/template/{{cookiecutter.project_slug}}/.env.prod.example +9 -0
  12. fastapi_gen/template/{{cookiecutter.project_slug}}/.gitlab-ci.yml +178 -0
  13. fastapi_gen/template/{{cookiecutter.project_slug}}/CLAUDE.md +3 -0
  14. fastapi_gen/template/{{cookiecutter.project_slug}}/README.md +334 -0
  15. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/.env.example +32 -0
  16. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/alembic/env.py +10 -1
  17. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/admin.py +1 -1
  18. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/agents/__init__.py +31 -0
  19. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/agents/crewai_assistant.py +563 -0
  20. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/agents/deepagents_assistant.py +526 -0
  21. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/agents/langchain_assistant.py +4 -3
  22. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/agents/langgraph_assistant.py +371 -0
  23. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/agent.py +1472 -0
  24. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/oauth.py +3 -7
  25. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/commands/cleanup.py +2 -2
  26. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/commands/seed.py +7 -2
  27. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/core/config.py +44 -7
  28. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/__init__.py +7 -0
  29. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/base.py +42 -0
  30. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/models/conversation.py +262 -1
  31. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/models/item.py +76 -1
  32. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/models/session.py +118 -1
  33. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/models/user.py +158 -1
  34. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/models/webhook.py +185 -3
  35. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/main.py +29 -2
  36. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/repositories/base.py +6 -0
  37. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/repositories/session.py +4 -4
  38. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/services/conversation.py +9 -9
  39. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/services/session.py +6 -6
  40. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/services/webhook.py +7 -7
  41. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/worker/__init__.py +1 -1
  42. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/worker/arq_app.py +165 -0
  43. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/worker/tasks/__init__.py +10 -1
  44. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/pyproject.toml +40 -0
  45. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/tests/api/test_metrics.py +53 -0
  46. fastapi_gen/template/{{cookiecutter.project_slug}}/backend/tests/test_agents.py +2 -0
  47. fastapi_gen/template/{{cookiecutter.project_slug}}/docker-compose.dev.yml +6 -0
  48. fastapi_gen/template/{{cookiecutter.project_slug}}/docker-compose.prod.yml +100 -0
  49. fastapi_gen/template/{{cookiecutter.project_slug}}/docker-compose.yml +39 -0
  50. fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/.env.example +5 -0
  51. fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/chat-container.tsx +28 -1
  52. fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/index.ts +1 -0
  53. fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/message-item.tsx +22 -4
  54. fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/message-list.tsx +23 -3
  55. fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/tool-approval-dialog.tsx +138 -0
  56. fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/hooks/use-chat.ts +242 -18
  57. fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/hooks/use-local-chat.ts +242 -17
  58. fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/lib/constants.ts +1 -1
  59. fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/types/chat.ts +57 -1
  60. fastapi_gen/template/{{cookiecutter.project_slug}}/kubernetes/configmap.yaml +63 -0
  61. fastapi_gen/template/{{cookiecutter.project_slug}}/kubernetes/deployment.yaml +242 -0
  62. fastapi_gen/template/{{cookiecutter.project_slug}}/kubernetes/ingress.yaml +44 -0
  63. fastapi_gen/template/{{cookiecutter.project_slug}}/kubernetes/kustomization.yaml +28 -0
  64. fastapi_gen/template/{{cookiecutter.project_slug}}/kubernetes/namespace.yaml +12 -0
  65. fastapi_gen/template/{{cookiecutter.project_slug}}/kubernetes/secret.yaml +59 -0
  66. fastapi_gen/template/{{cookiecutter.project_slug}}/kubernetes/service.yaml +23 -0
  67. fastapi_gen/template/{{cookiecutter.project_slug}}/nginx/nginx.conf +225 -0
  68. fastapi_gen/template/{{cookiecutter.project_slug}}/nginx/ssl/.gitkeep +18 -0
  69. {fastapi_fullstack-0.1.7.dist-info → fastapi_fullstack-0.1.15.dist-info}/WHEEL +0 -0
  70. {fastapi_fullstack-0.1.7.dist-info → fastapi_fullstack-0.1.15.dist-info}/entry_points.txt +0 -0
  71. {fastapi_fullstack-0.1.7.dist-info → fastapi_fullstack-0.1.15.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-fullstack
3
- Version: 0.1.7
3
+ Version: 0.1.15
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
@@ -186,6 +186,10 @@ cd my_ai_app
186
186
  make install
187
187
  ```
188
188
 
189
+ > **Windows Users:** The `make` command requires GNU Make which is not available by default on Windows.
190
+ > Install via [Chocolatey](https://chocolatey.org/) (`choco install make`), use WSL, or run raw commands manually.
191
+ > Each generated project includes a "Manual Commands Reference" section in its README with all commands.
192
+
189
193
  #### 2. Start the database
190
194
 
191
195
  ```bash
@@ -195,8 +199,10 @@ make docker-db
195
199
 
196
200
  #### 3. Create and apply database migrations
197
201
 
202
+ > ⚠️ **Important:** Both commands are required! `db-migrate` creates the migration file, `db-upgrade` applies it to the database.
203
+
198
204
  ```bash
199
- # Create initial migration (first time only)
205
+ # Create initial migration (REQUIRED first time)
200
206
  make db-migrate
201
207
  # Enter message: "Initial migration"
202
208
 
@@ -656,6 +662,7 @@ generated_at = "2024-12-21T10:30:00+00:00"
656
662
  | Option | Values | Description |
657
663
  |--------|--------|-------------|
658
664
  | **Database** | `postgresql`, `mongodb`, `sqlite`, `none` | Async by default |
665
+ | **ORM** | `sqlalchemy`, `sqlmodel` | SQLModel for simplified syntax |
659
666
  | **Auth** | `jwt`, `api_key`, `both`, `none` | JWT includes user management |
660
667
  | **OAuth** | `none`, `google` | Social login |
661
668
  | **AI Framework** | `pydantic_ai`, `langchain` | Choose your AI agent framework |
@@ -1,37 +1,41 @@
1
- fastapi_gen/__init__.py,sha256=KO63JpxBpq1-pKZUxhgGQ_1b5Xu0GWOeNnfCfKJCkTI,83
2
- fastapi_gen/cli.py,sha256=IOUoAF54yNur8yTIm5OpbKLExu5ehGrKWjQcG0Fr51Y,15731
3
- fastapi_gen/config.py,sha256=FD8d5Py24jIWlDa_UqUMn-2490WGCXHdsPN_RMjjhKs,13346
4
- fastapi_gen/generator.py,sha256=mTrdRNjCkm8TO6l165oA3AifrMtOKiS_7e8k30-Ic3Q,7403
5
- fastapi_gen/prompts.py,sha256=ETB0HRzi3HWxGVMywzEoH5fR217gGXDLqYzqKnYfg0c,27757
6
- fastapi_gen/template/VARIABLES.md,sha256=LRxs3tuNWMF_knTIVBuIRN_Q2noRELOBF_mKuT-Sl_Y,12984
7
- fastapi_gen/template/cookiecutter.json,sha256=1iMy3TcfCYQvFNfdYzRH_Y08ubGAsjtcVCdNYYYEtNU,2690
8
- fastapi_gen/template/hooks/post_gen_project.py,sha256=3igpUKF6KLp3LQqPWmfkmzN_p_VfLTYD0pgKoDijEl8,13924
9
- fastapi_gen/template/{{cookiecutter.project_slug}}/.env.prod.example,sha256=XYirMiKHvV7OQ_E19bs17OOzis3Swlb_mR2W9VQ3nHc,1400
1
+ fastapi_gen/__init__.py,sha256=P8oQOck29jCkbJJfYdi4nmHDmr2DZ8TsyYzmailbC5o,271
2
+ fastapi_gen/cli.py,sha256=bE3zXuii9aJnHw6Gik6GSBYt9JvqUeEtrjlVfGf1rI0,15997
3
+ fastapi_gen/config.py,sha256=thc1faYZrwgqVRPPO9f_iAU2ftGmZQ3PwZatw-Y1PGQ,19882
4
+ fastapi_gen/generator.py,sha256=7N_4spT4xnfFRK5f2ZKiDmyje6G4bja0bIOmrnOi5xI,8297
5
+ fastapi_gen/prompts.py,sha256=6oNrYiaur-lGSCmxdgGMg24X8VTuuWP81pFU4JWsTFs,31780
6
+ fastapi_gen/template/VARIABLES.md,sha256=i6RT1b0B50T_Xdx3lzJdD9sYMvfZXcNDDuBQcyJMG4c,15069
7
+ fastapi_gen/template/cookiecutter.json,sha256=_8RCeDLDwIVO9MErKtJ0bhpr2OPSqOuWwa5ZA3uReSc,2957
8
+ fastapi_gen/template/hooks/post_gen_project.py,sha256=Mmx8PfRRYRwt6SYHeingh5fYVuTqh7SUvzAzLyuF4U4,17771
9
+ fastapi_gen/template/{{cookiecutter.project_slug}}/.env.prod.example,sha256=DmY3oxFJ8BsXN8Vd_agZJsqOssSNcLiVzQBPui4kV14,1637
10
10
  fastapi_gen/template/{{cookiecutter.project_slug}}/.gitignore,sha256=InfbjRDaumEu7EsgiUiBEbDAb8uwcJV2j6Mt2Y1EcIU,1091
11
+ fastapi_gen/template/{{cookiecutter.project_slug}}/.gitlab-ci.yml,sha256=-LsuRAEva_sH4dPs54qx3RY3YV_-_YF4UqdISpiaGKo,4835
11
12
  fastapi_gen/template/{{cookiecutter.project_slug}}/AGENTS.md,sha256=bQAXADBmMDuxT57Fw8BwNnuN1lOGY4NLgDlXPycfvTE,1432
12
- fastapi_gen/template/{{cookiecutter.project_slug}}/CLAUDE.md,sha256=kz5f9rrzuRpMrN228ULj49rUUBWmchvPLtbyk2hwuMU,2929
13
+ fastapi_gen/template/{{cookiecutter.project_slug}}/CLAUDE.md,sha256=gHn0tyMOpl7cGNvJWH_eSlD3mAdoyg5DZk9fE2r0Z1E,3204
13
14
  fastapi_gen/template/{{cookiecutter.project_slug}}/Makefile,sha256=kgHIPSDVaTQrZZR__fVpziZZWzjtQDpfPYsTGOmJ6BM,9352
14
- fastapi_gen/template/{{cookiecutter.project_slug}}/README.md,sha256=hnTtD1Jch9O9mI1O2Lf6QgnC6niC6uLq3gm9HWLnxfM,24236
15
- fastapi_gen/template/{{cookiecutter.project_slug}}/docker-compose.dev.yml,sha256=2Lnu8rjR_HVGZszEOMWZ30CQiZpK-b3GBdvEWrW30FM,6232
15
+ fastapi_gen/template/{{cookiecutter.project_slug}}/README.md,sha256=_kw_6EbF2FdIVZxaDDqoEA2nksou23mGbETzNAsVIQo,34070
16
+ fastapi_gen/template/{{cookiecutter.project_slug}}/docker-compose.dev.yml,sha256=w4lZB6cLaN7DA3xrBw7eDQ6CSMMO0joNPCkG_C9iYLE,6424
16
17
  fastapi_gen/template/{{cookiecutter.project_slug}}/docker-compose.frontend.yml,sha256=4EpP7yqPXUj8K_-fYEjZLZdBMsPuDZpblsamNQRxUgk,1069
17
- fastapi_gen/template/{{cookiecutter.project_slug}}/docker-compose.prod.yml,sha256=VdGUlTaas23zXaKRWqZVMGCyhMk-aGOQBANK4tNZp7s,14177
18
- fastapi_gen/template/{{cookiecutter.project_slug}}/docker-compose.yml,sha256=TzNNGBU7BWcBttnTjwGEbiSXMRJpc0UAc4FA1KzPW3o,6190
18
+ fastapi_gen/template/{{cookiecutter.project_slug}}/docker-compose.prod.yml,sha256=VLjV7fUpwBENC4MxrptoL-mGDoUMvNYtVdlmmRdED9k,16850
19
+ fastapi_gen/template/{{cookiecutter.project_slug}}/docker-compose.yml,sha256=e4IYnAmL4KTDM4G4PqJge84mFp9IJ75KkMzu6LeWvSk,7140
19
20
  fastapi_gen/template/{{cookiecutter.project_slug}}/.github/workflows/ci.yml,sha256=MuR0odXZfg49c9q0eSqtSF5WzhneR8MMJhOzRM7-29Q,3789
20
21
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/.dockerignore,sha256=_iRaYQqTvt8_2yhJZUp60PPaL5XLiUFg0OSa-J_9XIQ,523
21
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/.env.example,sha256=uYGdLYedTIti20UAkWsBtMFAPZ8U7qmipPgcPMUUsiY,3536
22
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/.env.example,sha256=Bv8YfZTFUSOYTpqpFi1ejv4kP1N5KXxppdYhlGVUt0k,4488
22
23
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/.pre-commit-config.yaml,sha256=KL9PoA9VtzqzL3M99O_0JPyVh6uo_Pp52JflfzCK7qA,821
23
24
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/Dockerfile,sha256=cDwsmfoQzXZ220-oFZUmomfg0Plo-Z5sTRzoo2jxuiY,1529
24
25
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/alembic.ini,sha256=Ol5tRsSTj20-C-9YOyQV17oEPFhPRi0aY859ZNc3cUs,872
25
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/pyproject.toml,sha256=Xze6cTsBsv7pCS9WO5M8IEzksCt6NvPlj-TrrTj5bns,4807
26
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/alembic/env.py,sha256=z14Zu3SXTMMqOkwGht54av8u7UBBMCry4EuPHCcgfX4,1939
26
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/pyproject.toml,sha256=T1IytshdwC4JXbI5pgMS97Xn6Amlnj-ajpHWy5HNU0A,5946
27
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/alembic/env.py,sha256=NjdHh6uPtdz-hp8b3Hjg-6rGxT0Ls8MTyj4BGc7NjpI,2163
27
28
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/alembic/script.py.mako,sha256=zYHP43PVmdbq194tp6gdxIhFFGUF2fecyFtL012Ig8A,752
28
29
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/alembic/versions/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
30
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/__init__.py,sha256=vNnuyVXC5oZ3yq46meWLNhkUYlMgod70TgvWyvgNhBk,68
30
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/admin.py,sha256=t-6ADK4jjVjblQkWFeXIixbRFMHyCyVckqSFrvA4NdI,14014
31
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/main.py,sha256=7zb8nDh9h7WhJJkVrj7qU3bYqg8FAahxqFxVBH9IdgA,10337
32
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/agents/__init__.py,sha256=WWJoWoXqRuliz946je3JxWnIkc7UrvOy5GCb0hr6rBQ,756
31
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/admin.py,sha256=5qKXaU6rMzO_AhM4fjnuIIjzSCeOeEsJKj54lLG_otU,14075
32
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/main.py,sha256=-sVnDGHcfCo4TwXLY3M4H12KDNaM8oHlokLjSCcGObA,11294
33
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/agents/__init__.py,sha256=QTyO1YABDNSEeJeiHwZT91VQHviY-ai6GiFgPuj8ZG0,1938
33
34
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/agents/assistant.py,sha256=8diknxhBhFCEGGO6FPLosgwGVmrgEouEOt67Mv7l4AY,7170
34
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/agents/langchain_assistant.py,sha256=YXgQB67uH3WB58gTpnUiE4yqFJwgc7vTBhH2_VxrAKM,6831
35
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/agents/crewai_assistant.py,sha256=X7tkOOpnfL3Ja5Lr0P3EqyX6u5ph1kYJSUaCILwXH4U,20488
36
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/agents/deepagents_assistant.py,sha256=lFIEqIbjuZSQs8t5BjyNRteCr5AI7KGmaeKFIBPsPh0,19063
37
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/agents/langchain_assistant.py,sha256=FQsnQl6eL5pV11KtsLpxBLKhpWCWHJ9BbgWPeSUFU0U,6871
38
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/agents/langgraph_assistant.py,sha256=UduWADnaGAZc70KWnzw9zzdOLq4S-z5qNaooXmlmohk,12483
35
39
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/agents/prompts.py,sha256=XA-6oNqTKHWi1MQYtby-PqDC0Sy9LZvYizl5-UpeqMg,284
36
40
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/agents/tools/__init__.py,sha256=ZYuSAD6eFLP3QrIkZ6VSC8GM_FNlPflHplCo2qRFQPQ,375
37
41
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/agents/tools/datetime_tool.py,sha256=JhSwnmbdbw1Aockl4woYbAKAVjOEV-W3e92B1FGFkc8,444
@@ -42,12 +46,12 @@ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/api/router.py,sha
42
46
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/api/versioning.py,sha256=6O8-Bf6RwF5syME-0RFupmtoyXuIQOl2Q3jmLP-g5HM,7110
43
47
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/api/routes/__init__.py,sha256=wIJD_xpViBStOBb4iWBX_hxdPfSKJyAGlcOw81NTWXo,207
44
48
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/__init__.py,sha256=jISsw5fOhd32mr4hdAFetoZ5eVcFRKmEIiIu21V0Icw,2846
45
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/agent.py,sha256=TpWbFlxBrTfTv0NfkHY8_kMT_paeMXTKkKxRoOa-Dmc,40998
49
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/agent.py,sha256=R4z2nNi8t0UZu7rulTrraFxrY4UysBz9CtTDNemQDbs,107624
46
50
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/auth.py,sha256=lF_vfrPd_x7C-049FK8dht4lC-pKmwefV3viP7KDlrI,12946
47
51
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/conversations.py,sha256=tFCZG81hdPQvImDkmaMM31Qq5coRCdrCgXd35nY-IwU,14368
48
52
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/health.py,sha256=dFJI0ZpC4I8yXDA4RPg8pZYoFJ9PBxRcB5SvWXsz6Gg,6512
49
53
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/items.py,sha256=YWoLNEbjyaERuiy91coHRTIHsG28pEiBxMUo4M4c2yo,6743
50
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/oauth.py,sha256=ok6b4BNXAD_p5hJ12hIjIFFc90q_4x5ouXqXLdIT6Ak,6926
54
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/oauth.py,sha256=xFmYPlO-7NSAMkdrn2I1rGy2Tk1UQCs7Ej9S6Cpv0Ps,6830
51
55
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/sessions.py,sha256=RaTjCVCwIdZYAByYOadb79SLAmQlJTMz46S8jLkH1OE,4869
52
56
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/users.py,sha256=hu1OBOq6DBPgpmpkO9ervN_PcSoh1bVBJ8dcrda-lsk,8468
53
57
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/webhooks.py,sha256=0pC2piprVjv5pxcLeaavpINbsstCFOcdtsoHP2hLl2c,13237
@@ -55,12 +59,12 @@ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/api/routes/v1/ws.
55
59
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/clients/__init__.py,sha256=gA4EUVDQQoTzeaLzFHZEA6Ps0eO7eo8NYjhNUDkzwzs,281
56
60
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/clients/redis.py,sha256=SiOE_YSSlIMsvP7BM17ZG3z35dunUwWHrMpbIc3UeOY,2636
57
61
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/commands/__init__.py,sha256=qTHo8rqGxoWGVyi5t1Z99zP1invUw_9osgQ7nLGEb6A,3032
58
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/commands/cleanup.py,sha256=ATNo0N_ys__81j5hXGzE5kjBfd9AXCdx7JQPIKebzIg,2447
62
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/commands/cleanup.py,sha256=uLjJV_2i8NlLPCF0UdJdhzxoB7VRcbwZ8qmvXs_19G0,2452
59
63
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/commands/example.py,sha256=sx49u9oUIqvTfkurkIrFsZ4HFP1946kclkNVp6-zW28,733
60
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/commands/seed.py,sha256=OMgE9bAgXsPI1OeHInc58sjO7FgTx_bUmpyd2WK7gXI,9342
64
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/commands/seed.py,sha256=YdvCOOMc-hEwucLOnpQ6tVAlJIw16fSKhY400mVQT18,9646
61
65
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/core/__init__.py,sha256=0KTMN04rekcigOT6xO5DRXZ_Hj5vVBPvNBVYIQ6FGeg,106
62
66
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/core/cache.py,sha256=VYZfvIdLdtb1Y8h09IoxqPkDyG8pZtY96hR15Hff8YM,626
63
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/core/config.py,sha256=i-QU1hfqt7WcbEWIy-wnav8QCtapHWwz8RG_a_55VfU,8989
67
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/core/config.py,sha256=Rq6R2UyIKg8pBe49FXR_i8BCFcbFCb8mjairRcjuFO4,10565
64
68
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/core/csrf.py,sha256=NMB7xWuj2tS69YJKFsILcU3J06gemGi6oFIwaUHIDCY,4914
65
69
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/core/exceptions.py,sha256=jjsFTjpqRxlp4XU2NR4lK_hmteJLZcO3DKJIZZ9T2Pk,2842
66
70
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/core/logfire_setup.py,sha256=hMCIK7pIJx30RmJi9pLNP0XWTMrPld2SSMvSGMTUG-s,2183
@@ -69,22 +73,22 @@ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/core/oauth.py,sha
69
73
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/core/rate_limit.py,sha256=emmc2orBEIT6yfrZvy1jxdr52_eVawYAQJx9MiFsQKk,1689
70
74
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/core/sanitize.py,sha256=wQn3h1pFL3aqemr6W2jWMqGPJGVnb8ipZwLOwHdr6aI,7372
71
75
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/core/security.py,sha256=AqT0q6y1PmhyhZeV97Ujtc2PQx8EdUKMeAa2VC2sCQY,2769
72
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/__init__.py,sha256=zBa6f3gUffZ1vMyxnqmWVPtW7YI05rbzmgibbUwmN4s,151
73
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/base.py,sha256=luNUjdB1nPU-6cWdUzdpuUdOG0chponk3O7MpXIEPZQ,1190
76
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/__init__.py,sha256=y9by535cwbinmqOftskTk0iALAtckQfpjW-KmyzGwhw,362
77
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/base.py,sha256=GhD2e6qTX5EaAbkDxGkZAySHmO36mx04Z4afgSA8u2I,2345
74
78
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/session.py,sha256=am1aFndCCNOJ3fGn3e7H4cZZi-fsUnWPsTEy2h-GzAY,3075
75
79
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/models/__init__.py,sha256=PubozE1RaMhf4U0aGNAiLkNHpOAH1hNsrO5IRuro8cc,1134
76
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/models/conversation.py,sha256=6OY79EeIBvy9x6noc0fwHK26rkIoF7yv5y2P6cw8umk,10761
77
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/models/item.py,sha256=LTWMetmbFIqlNnCJDsLQE8usct-cnvsj-SsXRh559QA,2889
78
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/models/session.py,sha256=dsazLLu5RFguzyg8e60fua2HnLYWcBK6te8oc3wkNA4,4423
79
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/models/user.py,sha256=8j_-NUB5lyDLSqYvxSdeJtxZmDefWJROsmxj2duk_Fk,6651
80
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/models/webhook.py,sha256=gw-rrqNIsGeBzNUxLUVevF5E-ZtAKXfBh1TvWXFckeE,7893
80
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/models/conversation.py,sha256=Vb15rHz0jjlXKoHooZDWUbPiVNJI5iCMRQL5pY-skbg,19748
81
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/models/item.py,sha256=7jNXPkMOv4XTacItXwQoJLh7edEW0u-UYZg5uajVIgY,5090
82
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/models/session.py,sha256=YxXbniTvH7R9vn58aNPFz830AI-3Ua2GIb-e_3IToe0,8287
83
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/models/user.py,sha256=2vlvRRcBNjJb70PMsrc35UVtsY3ofev_x6hyb93hOko,11278
84
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/db/models/webhook.py,sha256=VLHlun1o0qVir4Gvis5dOsP7n8QO_EKT4CSHVTfGM9Q,13795
81
85
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/pipelines/__init__.py,sha256=aUxx4qSMxaxP9SygICOQvvcQgI75-zqP1cdGAGCmkdo,262
82
86
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/pipelines/base.py,sha256=_CssyDyeqdJiBPN0tsx7E4q9Z1db5BRUweq6IAJbc6g,1944
83
87
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/repositories/__init__.py,sha256=rNHPw6j2o1ppubBsms0r3F_0AbdHjDsUoaE0LsdATpM,1754
84
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/repositories/base.py,sha256=4rIFieAle9LO2fDB_s7BOw9bNSYA_NPwHv33hKBbD8I,4190
88
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/repositories/base.py,sha256=ZZDoCP0HWadELmazyIhYawPK8HtDoB_kUbqoFHHXmSU,4331
85
89
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/repositories/conversation.py,sha256=H1_N1qtefivNd-g8dcmRXUkcDdmqxdDq7DGMwj2zzcs,23140
86
90
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/repositories/item.py,sha256=USac17QKifFRqs65s_QEBgSZWgD8XlurnkGgVIyF3wU,4853
87
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/repositories/session.py,sha256=hSg3qBBSulcuYgQpAHByegDMR16WY-AqQvSf3DjJemY,8829
91
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/repositories/session.py,sha256=HKw2HeTIzsH5CR5poTXeM7gJPbkfelLGBeJaI4TF1t4,8839
88
92
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/repositories/user.py,sha256=JdS0sXJg08bwHLk5dJjjYVhRWE-1jW89GAVAqCE25AI,7652
89
93
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/repositories/webhook.py,sha256=1KLbmFj9fhEoNSWXbC2k940ssof00W99Av4sg0qXw-Y,9238
90
94
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/schemas/__init__.py,sha256=GC_buyJRRpDKZLwFcX4EK4PMdYKdsZVjQJ77xWJD4C8,1956
@@ -96,15 +100,16 @@ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/schemas/token.py,
96
100
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/schemas/user.py,sha256=yHA2GcOqER9XD1TdyEo_8VDEqYudb9rMk7pftYEdsxI,1581
97
101
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/schemas/webhook.py,sha256=OG1Cauhfj1h-RVqCO97vABO253uzHZ0htgNO1f1dFqs,1969
98
102
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/services/__init__.py,sha256=EOjL4YcFmpgYh-7rDv4VAD5zcA8t4ff-eAAabPNEK70,1378
99
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/services/conversation.py,sha256=at8UJ7jtYTcBjtyotGO6t1Qm4V56DSWGgxAldwDV7iY,26292
103
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/services/conversation.py,sha256=Swx75GA2qqWimhbR2i--NGZsXz0yXEeWsPjeicEL3j0,26307
100
104
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/services/item.py,sha256=OnGnoPCOJE8YGSOM8soH_HN-J1z35OFA2XXuT8U9Urw,7146
101
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/services/session.py,sha256=BQbWMPuAnOL4_6YvXGmEgmmRg2HqtgM35Ue5bjGIAvo,11333
105
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/services/session.py,sha256=n-ICXvEr2S2t_rUo8Za5WknZSs4YBYkZ24iH5jWVTN8,11343
102
106
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/services/user.py,sha256=xsPpoGef3t-6dA1CQW_QRWP4rt_NI3ZYnbamv1BZ1bs,13809
103
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/services/webhook.py,sha256=xCygcLy4UpiCsybqUkQ8Ib3BJfsSceIZ8OfYSlxpjLs,17062
104
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/worker/__init__.py,sha256=P5Ac2zozpWW1MwW3AoRstB-GEyOtPF011t44l74pF6s,145
107
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/services/webhook.py,sha256=vLyl3ohfP_FSE06L3mYxmGlSgjAsT1RaFnAOdEHWWrk,17072
108
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/worker/__init__.py,sha256=RRfSOD2hWUqo_rYkOc9KaE5BgqK7UkRC--Ni-BjMC3Q,169
109
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/worker/arq_app.py,sha256=zRhVkK9OyuxIDu6ItDZ3myYeIRRugHovG8S3Nn2g4Wg,4127
105
110
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/worker/celery_app.py,sha256=64eaF-rfTMsf60AsnvvJ1var8roNNG10DGCiIMvAXuA,1668
106
111
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/worker/taskiq_app.py,sha256=XfCdeoG14FgABKnsH7b0a38IaQzc45z166WLKS4otd0,851
107
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/worker/tasks/__init__.py,sha256=cWtcaSaaQIKjpbt8fHgL6w_Sh2eRRkssu76KiCdxMYE,692
112
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/worker/tasks/__init__.py,sha256=e-CXzHwP2qsgiIIWDNNTv2LYSVOopbZ9s4X4MPhxnPc,996
108
113
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/worker/tasks/examples.py,sha256=T-VHMulRamX0bbq0UDw4EKAGyNRHlM7sLorSfkiiojY,2433
109
114
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/worker/tasks/schedules.py,sha256=oa6mpit4TXg_R4jTkncYuKakHMgOJuSopyMOnKWLdHo,887
110
115
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/app/worker/tasks/taskiq_examples.py,sha256=7gVfUToHbphzCk8TzunDmDGyaW8dFT3F7DafoYdCr28,1929
@@ -114,7 +119,7 @@ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/scripts/.gitkeep,sha2
114
119
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/tests/__init__.py,sha256=xqsJPT1QR2TH_5GYK8tiHp-Lb29chxGsr147MWoLAZw,21
115
120
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/tests/conftest.py,sha256=dHJhMgAoU6JBp-_-3JsOkqTgvCH9RD7flJy_z1-8JiI,4099
116
121
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/tests/test_admin.py,sha256=0bR-5XlVyo2JaDuy02kfPqRW12dRAG3jhCDl8Qr-cEc,30802
117
- fastapi_gen/template/{{cookiecutter.project_slug}}/backend/tests/test_agents.py,sha256=uhJg8LoKBc1qeBSwebO4B5-CiWjUNI7C0Oa5EPPanxc,9084
122
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/tests/test_agents.py,sha256=qLklIWbWcXNj6aTuGDwaPHiAkUmCOHJ92Z83thSadlg,9208
118
123
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/tests/test_clients.py,sha256=qKU2z4YVQMWdnNE9aH5lnACsdzQ1G4fcE9_sK8x7K2U,6282
119
124
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/tests/test_commands.py,sha256=45TvE15OGGd3p2HS4bpnUnVToW24L5rjMOQXaJpkWyk,5014
120
125
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/tests/test_core.py,sha256=eU7FHHGCpW4eH8zK3fZvjN7EmM_Ys7C-DCBkJ1b6xRI,4107
@@ -128,13 +133,14 @@ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/tests/api/test_auth.p
128
133
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/tests/api/test_exceptions.py,sha256=yTbtQ0jxj2Ah0zwNu831nSbd1Sb7yWIKwdlZhPzLBtQ,4599
129
134
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/tests/api/test_health.py,sha256=XwkFvoezYip-YT977rlLB9o46uGV77MSijt_bNlowT0,3678
130
135
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/tests/api/test_items.py,sha256=lFMdUaayDDEw7msuVj3po6pYa8TgvE9XjTKc-GiaWk4,9202
136
+ fastapi_gen/template/{{cookiecutter.project_slug}}/backend/tests/api/test_metrics.py,sha256=nikYPuAynnvHWSRFWsuFuqBYY3jyN5sJH2dgiONaVdA,1835
131
137
  fastapi_gen/template/{{cookiecutter.project_slug}}/backend/tests/api/test_users.py,sha256=JLcPKnk14aPSyyWpjEHfFJcBBDEdHMLM41Tuua7nbnM,7343
132
138
  fastapi_gen/template/{{cookiecutter.project_slug}}/docs/adding_features.md,sha256=ZFz9VFo1S0i3LMbMszL4Wps9gxoPDAkJAjiHOhq3npE,3474
133
139
  fastapi_gen/template/{{cookiecutter.project_slug}}/docs/architecture.md,sha256=teK1lOMMiLJWBRGmj5HNsj8MvVAUcbeRTjMTevDKL6w,1901
134
140
  fastapi_gen/template/{{cookiecutter.project_slug}}/docs/patterns.md,sha256=MVUfe2lkLZoUqKIVmwk2YTksQ-OyOx1tIqn9hw3WQYI,3828
135
141
  fastapi_gen/template/{{cookiecutter.project_slug}}/docs/testing.md,sha256=2vdwICbfw4Q6HcvJUpwpgpomXcAwr30kd0pcRjL14vA,2330
136
142
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/.dockerignore,sha256=aPWb-zCIZu6TI0jiXFs481-eMrOO-FxVvRL3992jrDY,343
137
- fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/.env.example,sha256=zdNGfQl6TPssMN8NV0wjpuqB90ZUHvKo2bDHLsGsvy0,516
143
+ fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/.env.example,sha256=cIdaKDEZ8eBCi2r3yOEhvwrLwZxTx2gicDSm6Mk4gQY,693
138
144
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/.gitignore,sha256=fZEN8HisQjcSmxEB3IDWoKA5dTYDzEAXLtqYKvdsprs,439
139
145
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/.prettierignore,sha256=wYnkkZcvXw2mtuFVzYAjH-eFldFkK5Xn26fsZZ19BK0,161
140
146
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/.prettierrc,sha256=cjszu9uAT0HddFAatvqg7KjdgnC99AGuOhZL9SE8eL8,227
@@ -183,15 +189,16 @@ fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/langu
183
189
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/auth/index.ts,sha256=7h7J1ATCCYrVwGYr1j6k-TuVBxWKoLgmRwQS21tJF5Y,90
184
190
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/auth/login-form.tsx,sha256=_MX_XBLB22cvHWmvn_WUooATFqaFM-G4D8HKSVnJBsg,3760
185
191
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/auth/register-form.tsx,sha256=EofAzSHxNlM8LrRAKYmQ5-jVJnsnjy0ZERPXZ_22uxY,4911
186
- fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/chat-container.tsx,sha256=z9uB3lcctihCBGyqp15GB6YIUDphjDX2RRUAjZn8R0c,6958
192
+ fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/chat-container.tsx,sha256=7pDAh6Dkh06kAd8CH1b_Hwsb4skmojeH_dWK2dMzQcg,7953
187
193
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/chat-input.tsx,sha256=sJwS6E7zF_2K-z6nfHdVXhw71XLu5EY_7UQlsub13JE,2049
188
194
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/conversation-sidebar.tsx,sha256=lVDX8O_UP7UwCwr6grcZevo6Z04aafOEruTMSlH6giM,9318
189
195
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/copy-button.tsx,sha256=FELAI5pT_AI9RU3oP7sTJoIg-IqcC0PGAytMna0JTf8,1093
190
- fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/index.ts,sha256=QF891FMso3jTolplkISbjwL08kp-EvOVIGTbpiTxTGQ,583
196
+ fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/index.ts,sha256=nOy9indoaJa7K_i0wJzxMNv8qpNi_5usiW7RE4bmSKc,644
191
197
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/local-conversation-sidebar.tsx,sha256=kOkTqlIaDq9lPyDldU6_SmpvAXYRTqhz-WkMfMwffj4,8281
192
198
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/markdown-content.tsx,sha256=aCftdRUJ1mROHFtegXZw5oNpOPt0ekIk-CIUhmbZZhk,4583
193
- fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/message-item.tsx,sha256=QMqvrJbvn7cDF6zSn2n6UyWtRe2rbh8qoPQDA5I6BKE,2724
194
- fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/message-list.tsx,sha256=sF_lmB_5xo5VyGAjKJo96z4jznrJ4JYqoENO_2tVk-E,392
199
+ fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/message-item.tsx,sha256=HpFdJmG9QPi6dzgimV1A4pBbhRIn5xTLXYu5bNcpLPU,3445
200
+ fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/message-list.tsx,sha256=EMW8ZKs8_8PDQlUzUtWsT_DWoBZs6Qas9-LvhBL-Xdg,1062
201
+ fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/tool-approval-dialog.tsx,sha256=lC3VHL-2r6QJGKcvCarrbEyZq7VtH7JPnW3NQYOAXqA,3987
195
202
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/chat/tool-call-card.tsx,sha256=WIY6o13Q8Grwj6ht4Fdehodr32Jbnve-XbkH2XcFD24,2763
196
203
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/icons/google-icon.tsx,sha256=1N1bjOHSbRT0yinxoCZUTTc2aOTsjzNFRdSUNrll0J0,1073
197
204
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/icons/index.ts,sha256=HHElTMcT04ZHmI9mX5_Rf0re7wRaI_HHTISocPlhFYM,100
@@ -211,12 +218,12 @@ fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/ui/la
211
218
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/components/ui/sheet.tsx,sha256=zdFQbRSWq1oLzWnp_flNFN24EEY8pHvG4KY47iugzgU,2295
212
219
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/hooks/index.ts,sha256=8Fm2aSVrCWazkE3PJ0K8cYjUrZw2VOTXvXg8CFUdDbo,327
213
220
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/hooks/use-auth.ts,sha256=e3KWyCC1sS6AHiPWX1XkW93-v1xJ1sbiqqpvf0RW_eM,2334
214
- fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/hooks/use-chat.ts,sha256=WTbdDMChDYI5UvYPZrhBxq4JBHgwLLBb-uBZPvyncPo,5944
221
+ fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/hooks/use-chat.ts,sha256=69UUzRvR8qszYPKwBZ7entJm9TOGfImqtYPY1qJ8p7k,13619
215
222
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/hooks/use-conversations.ts,sha256=_6jas8lDilJA-h-kozMxoGp9jGA4lNAQvHNANzvke6k,4935
216
- fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/hooks/use-local-chat.ts,sha256=eNzmxCeapKVAie7-3qQ5y1Eit8M7rFwHlFyHtFzcluA,4346
223
+ fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/hooks/use-local-chat.ts,sha256=hUEq1Bk_zMRgt25Po4JHL4q89udBtos0NvN2lX8PhvY,12124
217
224
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/hooks/use-websocket.ts,sha256=wVOXjPF1uBULis4ec9O3gZkU_68rKMIjw3wtCJG5Fo4,2648
218
225
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/lib/api-client.ts,sha256=X2x9mbmHfjWbsQEA1ILilHky5ak8QCj-owI65ZqrdEo,2275
219
- fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/lib/constants.ts,sha256=fjMHkXcCsBp0Q4kDfRLbNEQBRd2kNmDhZaHuWmid_i0,847
226
+ fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/lib/constants.ts,sha256=FCT3JGCthALrAMK1cCF524glPih4SIqgGu8P1Bh6q74,874
220
227
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/lib/server-api.ts,sha256=4e2SNaXoEEe1F4Z1SWLXvjHAzYOcK4QiG3QjyIYpr-g,1851
221
228
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/lib/utils.test.ts,sha256=S4hLcI8u5-sPixqyPyedi6mZRSjJlLhRTPkVY-8DV1g,1299
222
229
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/lib/utils.ts,sha256=bZ_gCiWlxvrEzbmHOFX8zhuRigCq1da2NZFpv4jyU-U,1090
@@ -231,11 +238,20 @@ fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/stores/sidebar-s
231
238
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/stores/theme-store.ts,sha256=-xY0kYXZMks-Qh1qrcMDwcdh_svF1ww498aR3u7MKOU,985
232
239
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/types/api.ts,sha256=h_WXzUWJ67lDJ2hKi5It2hlTWhGnm_YMa0nTYJn3TDM,396
233
240
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/types/auth.ts,sha256=anNUBMNJ5Y3zlX6e174Acre7P2lo4Vfa4w0KSJW-sRo,839
234
- fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/types/chat.ts,sha256=J4B19_ReDlTcPXJQDzlxxvlhVZjPQ5tRJHeIUTjEEcc,1463
241
+ fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/types/chat.ts,sha256=dTDX6-lfYgX0Cz6Cs7cKx1WKyCZsuE3Ri2rrBQp28zM,2754
235
242
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/types/conversation.ts,sha256=0kBX-7qYowZOrBGMDjH_7dA8FEujtXqlfbRBpT4FBng,1150
236
243
  fastapi_gen/template/{{cookiecutter.project_slug}}/frontend/src/types/index.ts,sha256=W0lBPMjlZ0wt-eqGBqQvt648q90n2i9v0Bh25pdm8S4,234
237
- fastapi_fullstack-0.1.7.dist-info/METADATA,sha256=aiYIcEmM1_UP-xb8Ah1dB6rxqp4-iQHVlVfYAeFfCyU,23837
238
- fastapi_fullstack-0.1.7.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
239
- fastapi_fullstack-0.1.7.dist-info/entry_points.txt,sha256=s9JXrISZp8LMYJGeVofOAd1wPTzpq-jwjSgSf4hWzjs,59
240
- fastapi_fullstack-0.1.7.dist-info/licenses/LICENSE,sha256=bL4JuK_rcA8y__Gg7PEuTs3g2Qf6VvSz2w2Jajd6nVU,1063
241
- fastapi_fullstack-0.1.7.dist-info/RECORD,,
244
+ fastapi_gen/template/{{cookiecutter.project_slug}}/kubernetes/configmap.yaml,sha256=aqw1YN_1MWA0yDrLg7_lHEcJ3DYw4puvK7VEf4IUtHw,1697
245
+ fastapi_gen/template/{{cookiecutter.project_slug}}/kubernetes/deployment.yaml,sha256=sXulLkJdtgzWySwtcmhmJoNc12Uq4sJpNLWe3p1iFec,7328
246
+ fastapi_gen/template/{{cookiecutter.project_slug}}/kubernetes/ingress.yaml,sha256=4_ccXQP5G1m6lqHn4YrmnkHFffjtSbO9Ui4yh_pMjJM,1499
247
+ fastapi_gen/template/{{cookiecutter.project_slug}}/kubernetes/kustomization.yaml,sha256=t5BdtyNrDagRufe1kmPF0kVD8CNtr9Lv7sRo4xh9C9c,699
248
+ fastapi_gen/template/{{cookiecutter.project_slug}}/kubernetes/namespace.yaml,sha256=hS9-TeXJNgu28AB0Pv43ob6lLDiavlYu0bwSRI804sA,360
249
+ fastapi_gen/template/{{cookiecutter.project_slug}}/kubernetes/secret.yaml,sha256=ySr8O3ih6qYvZjbzUSWL-VtwCPOzdxiqbbjO6uxYR-o,1482
250
+ fastapi_gen/template/{{cookiecutter.project_slug}}/kubernetes/service.yaml,sha256=o3bCXguj8E5aQ0H1o3cBD3z_iZ_RA_Pmx1bc0sVzK28,682
251
+ fastapi_gen/template/{{cookiecutter.project_slug}}/nginx/nginx.conf,sha256=gJWUMMqNvr9TwNZOcc_WPPGZvdAlRUH3jLhbllOb_YY,7359
252
+ fastapi_gen/template/{{cookiecutter.project_slug}}/nginx/ssl/.gitkeep,sha256=o_WQQOgVGOLttT48x0EXSC4BbbDFemApFpmwhybcVUU,617
253
+ fastapi_fullstack-0.1.15.dist-info/METADATA,sha256=wZy-vmNueVjOKQCpaWC7JlzRLdZ9-muP7CB1vEWNSq0,24374
254
+ fastapi_fullstack-0.1.15.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
255
+ fastapi_fullstack-0.1.15.dist-info/entry_points.txt,sha256=s9JXrISZp8LMYJGeVofOAd1wPTzpq-jwjSgSf4hWzjs,59
256
+ fastapi_fullstack-0.1.15.dist-info/licenses/LICENSE,sha256=bL4JuK_rcA8y__Gg7PEuTs3g2Qf6VvSz2w2Jajd6nVU,1063
257
+ fastapi_fullstack-0.1.15.dist-info/RECORD,,
fastapi_gen/__init__.py CHANGED
@@ -1,3 +1,8 @@
1
1
  """FastAPI Project Generator with Logfire observability."""
2
2
 
3
- __version__ = "0.1.0"
3
+ from importlib.metadata import PackageNotFoundError, version
4
+
5
+ try:
6
+ __version__ = version("fastapi-fullstack")
7
+ except PackageNotFoundError:
8
+ __version__ = "0.0.0" # Development/editable install fallback
fastapi_gen/cli.py CHANGED
@@ -15,6 +15,7 @@ from .config import (
15
15
  FrontendType,
16
16
  LLMProviderType,
17
17
  OAuthProvider,
18
+ OrmType,
18
19
  ProjectConfig,
19
20
  )
20
21
  from .generator import generate_project, post_generation_tasks
@@ -87,6 +88,12 @@ def new(output: Path | None, no_input: bool, name: str | None) -> None:
87
88
  default="postgresql",
88
89
  help="Database type",
89
90
  )
91
+ @click.option(
92
+ "--orm",
93
+ type=click.Choice(["sqlalchemy", "sqlmodel"]),
94
+ default="sqlalchemy",
95
+ help="ORM library (sqlalchemy or sqlmodel). SQLModel only works with PostgreSQL/SQLite",
96
+ )
90
97
  @click.option(
91
98
  "--auth",
92
99
  type=click.Choice(["jwt", "api_key", "both", "none"]),
@@ -188,6 +195,7 @@ def create(
188
195
  name: str,
189
196
  output: Path | None,
190
197
  database: str,
198
+ orm: str,
191
199
  auth: str,
192
200
  no_logfire: bool,
193
201
  no_docker: bool,
@@ -295,6 +303,7 @@ def create(
295
303
  config = ProjectConfig(
296
304
  project_name=name,
297
305
  database=DatabaseType(database),
306
+ orm_type=OrmType(orm),
298
307
  auth=AuthType(auth),
299
308
  enable_logfire=not no_logfire,
300
309
  enable_docker=not no_docker,
fastapi_gen/config.py CHANGED
@@ -89,6 +89,9 @@ class AIFrameworkType(str, Enum):
89
89
 
90
90
  PYDANTIC_AI = "pydantic_ai"
91
91
  LANGCHAIN = "langchain"
92
+ LANGGRAPH = "langgraph"
93
+ CREWAI = "crewai"
94
+ DEEPAGENTS = "deepagents"
92
95
 
93
96
 
94
97
  class LLMProviderType(str, Enum):
@@ -111,9 +114,18 @@ class ReverseProxyType(str, Enum):
111
114
 
112
115
  TRAEFIK_INCLUDED = "traefik_included" # Include Traefik service + labels
113
116
  TRAEFIK_EXTERNAL = "traefik_external" # External Traefik, include labels only
117
+ NGINX_INCLUDED = "nginx_included" # Include Nginx service in docker-compose
118
+ NGINX_EXTERNAL = "nginx_external" # External Nginx, config template only
114
119
  NONE = "none" # No reverse proxy, expose ports directly
115
120
 
116
121
 
122
+ class OrmType(str, Enum):
123
+ """Supported ORM libraries for SQL databases."""
124
+
125
+ SQLALCHEMY = "sqlalchemy"
126
+ SQLMODEL = "sqlmodel"
127
+
128
+
117
129
  class LogfireFeatures(BaseModel):
118
130
  """Logfire instrumentation features."""
119
131
 
@@ -136,6 +148,7 @@ class ProjectConfig(BaseModel):
136
148
 
137
149
  # Database
138
150
  database: DatabaseType = DatabaseType.POSTGRESQL
151
+ orm_type: OrmType = OrmType.SQLALCHEMY
139
152
  db_pool_size: int = 5
140
153
  db_max_overflow: int = 10
141
154
  db_pool_timeout: int = 30
@@ -167,7 +180,7 @@ class ProjectConfig(BaseModel):
167
180
  admin_require_auth: bool = True
168
181
  enable_websockets: bool = False
169
182
  enable_file_storage: bool = False
170
- enable_ai_agent: bool = False
183
+ enable_ai_agent: bool = True
171
184
  ai_framework: AIFrameworkType = AIFrameworkType.PYDANTIC_AI
172
185
  llm_provider: LLMProviderType = LLMProviderType.OPENAI
173
186
  enable_conversation_persistence: bool = False
@@ -196,7 +209,7 @@ class ProjectConfig(BaseModel):
196
209
  python_version: str = "3.12"
197
210
 
198
211
  # Frontend
199
- frontend: FrontendType = FrontendType.NONE
212
+ frontend: FrontendType = FrontendType.NEXTJS
200
213
  frontend_port: int = 3000
201
214
 
202
215
  # Backend
@@ -208,6 +221,18 @@ class ProjectConfig(BaseModel):
208
221
  """Return project slug (underscores instead of hyphens)."""
209
222
  return self.project_name.replace("-", "_")
210
223
 
224
+ @computed_field
225
+ @property
226
+ def use_sqlalchemy(self) -> bool:
227
+ """Check if SQLAlchemy ORM is selected."""
228
+ return self.orm_type == OrmType.SQLALCHEMY
229
+
230
+ @computed_field
231
+ @property
232
+ def use_sqlmodel(self) -> bool:
233
+ """Check if SQLModel ORM is selected."""
234
+ return self.orm_type == OrmType.SQLMODEL
235
+
211
236
  @model_validator(mode="after")
212
237
  def validate_option_combinations(self) -> "ProjectConfig":
213
238
  """Validate that option combinations are valid.
@@ -218,11 +243,17 @@ class ProjectConfig(BaseModel):
218
243
  - Caching requires Redis to be enabled
219
244
  - Session management requires a database
220
245
  - Conversation persistence requires a database
246
+ - SQLModel requires a SQL database (PostgreSQL or SQLite)
221
247
  """
222
248
  if self.enable_admin_panel and self.database == DatabaseType.NONE:
223
249
  raise ValueError("Admin panel requires a database")
224
250
  if self.enable_admin_panel and self.database == DatabaseType.MONGODB:
225
251
  raise ValueError("Admin panel (SQLAdmin) requires PostgreSQL or SQLite")
252
+ if self.orm_type == OrmType.SQLMODEL and self.database not in (
253
+ DatabaseType.POSTGRESQL,
254
+ DatabaseType.SQLITE,
255
+ ):
256
+ raise ValueError("SQLModel requires PostgreSQL or SQLite database")
226
257
  if self.enable_caching and not self.enable_redis:
227
258
  raise ValueError("Caching requires Redis to be enabled")
228
259
  if self.enable_session_management and self.database == DatabaseType.NONE:
@@ -235,12 +266,119 @@ class ProjectConfig(BaseModel):
235
266
  and self.llm_provider == LLMProviderType.OPENROUTER
236
267
  ):
237
268
  raise ValueError("OpenRouter is not supported with LangChain")
269
+ if (
270
+ self.enable_ai_agent
271
+ and self.ai_framework == AIFrameworkType.LANGGRAPH
272
+ and self.llm_provider == LLMProviderType.OPENROUTER
273
+ ):
274
+ raise ValueError("OpenRouter is not supported with LangGraph")
275
+ if (
276
+ self.enable_ai_agent
277
+ and self.ai_framework == AIFrameworkType.CREWAI
278
+ and self.llm_provider == LLMProviderType.OPENROUTER
279
+ ):
280
+ raise ValueError("OpenRouter is not supported with CrewAI")
281
+ if (
282
+ self.enable_ai_agent
283
+ and self.ai_framework == AIFrameworkType.DEEPAGENTS
284
+ and self.llm_provider == LLMProviderType.OPENROUTER
285
+ ):
286
+ raise ValueError(
287
+ "DeepAgents does not support OpenRouter. Use OpenAI or Anthropic provider instead."
288
+ )
238
289
  if (
239
290
  self.enable_rate_limiting
240
291
  and self.rate_limit_storage == RateLimitStorageType.REDIS
241
292
  and not self.enable_redis
242
293
  ):
243
294
  raise ValueError("Rate limiting with Redis storage requires Redis to be enabled")
295
+
296
+ # WebSocket JWT auth requires main JWT auth
297
+ if self.websocket_auth == WebSocketAuthType.JWT and self.auth not in (
298
+ AuthType.JWT,
299
+ AuthType.BOTH,
300
+ ):
301
+ raise ValueError("WebSocket JWT authentication requires JWT auth to be enabled")
302
+
303
+ # WebSocket API key auth requires main API key auth
304
+ if self.websocket_auth == WebSocketAuthType.API_KEY and self.auth not in (
305
+ AuthType.API_KEY,
306
+ AuthType.BOTH,
307
+ ):
308
+ raise ValueError("WebSocket API key authentication requires API key auth to be enabled")
309
+
310
+ # Admin panel authentication requires JWT (for User model and security functions)
311
+ if (
312
+ self.enable_admin_panel
313
+ and self.admin_require_auth
314
+ and self.auth not in (AuthType.JWT, AuthType.BOTH)
315
+ ):
316
+ raise ValueError(
317
+ "Admin panel authentication requires JWT auth to be enabled. "
318
+ "Either enable JWT auth or set admin_require_auth=False"
319
+ )
320
+
321
+ # Conversation persistence requires AI agent
322
+ if self.enable_conversation_persistence and not self.enable_ai_agent:
323
+ raise ValueError("Conversation persistence requires AI agent to be enabled")
324
+
325
+ # Admin panel requires SQLAlchemy (SQLAdmin doesn't fully support SQLModel)
326
+ if self.enable_admin_panel and self.orm_type == OrmType.SQLMODEL:
327
+ raise ValueError(
328
+ "Admin panel (SQLAdmin) requires SQLAlchemy ORM. "
329
+ "SQLModel is not fully supported. Use orm_type=sqlalchemy or disable admin panel."
330
+ )
331
+
332
+ # Session management requires JWT auth
333
+ if self.enable_session_management and self.auth not in (AuthType.JWT, AuthType.BOTH):
334
+ raise ValueError("Session management requires JWT auth to be enabled")
335
+
336
+ # Webhooks require a database
337
+ if self.enable_webhooks and self.database == DatabaseType.NONE:
338
+ raise ValueError(
339
+ "Webhooks require a database to store subscriptions and delivery history"
340
+ )
341
+
342
+ # OAuth requires JWT authentication
343
+ if self.oauth_provider != OAuthProvider.NONE and self.auth not in (
344
+ AuthType.JWT,
345
+ AuthType.BOTH,
346
+ ):
347
+ raise ValueError(
348
+ "OAuth authentication requires JWT auth to be enabled. "
349
+ "OAuth uses JWT tokens for session management after social login."
350
+ )
351
+
352
+ # Background task queues require Redis
353
+ if (
354
+ self.background_tasks
355
+ in (
356
+ BackgroundTaskType.CELERY,
357
+ BackgroundTaskType.TASKIQ,
358
+ BackgroundTaskType.ARQ,
359
+ )
360
+ and not self.enable_redis
361
+ ):
362
+ raise ValueError(
363
+ f"{self.background_tasks.value.title()} requires Redis to be enabled. "
364
+ "All task queue systems use Redis as broker/backend."
365
+ )
366
+
367
+ # Logfire feature-specific validations (only when logfire is enabled)
368
+ if self.enable_logfire:
369
+ if self.logfire_features.database and self.database == DatabaseType.NONE:
370
+ raise ValueError(
371
+ "Logfire database instrumentation requires a database to be enabled"
372
+ )
373
+
374
+ if self.logfire_features.redis and not self.enable_redis:
375
+ raise ValueError("Logfire Redis instrumentation requires Redis to be enabled")
376
+
377
+ if self.logfire_features.celery and self.background_tasks != BackgroundTaskType.CELERY:
378
+ raise ValueError(
379
+ "Logfire Celery instrumentation requires Celery as background task system"
380
+ )
381
+
244
382
  return self
245
383
 
246
384
  def to_cookiecutter_context(self) -> dict[str, Any]:
@@ -265,6 +403,10 @@ class ProjectConfig(BaseModel):
265
403
  "db_pool_size": self.db_pool_size,
266
404
  "db_max_overflow": self.db_max_overflow,
267
405
  "db_pool_timeout": self.db_pool_timeout,
406
+ # ORM
407
+ "orm_type": self.orm_type.value,
408
+ "use_sqlalchemy": self.use_sqlalchemy,
409
+ "use_sqlmodel": self.use_sqlmodel,
268
410
  # Auth
269
411
  "auth": self.auth.value,
270
412
  "use_jwt": self.auth in (AuthType.JWT, AuthType.BOTH),
@@ -313,6 +455,9 @@ class ProjectConfig(BaseModel):
313
455
  "ai_framework": self.ai_framework.value,
314
456
  "use_pydantic_ai": self.ai_framework == AIFrameworkType.PYDANTIC_AI,
315
457
  "use_langchain": self.ai_framework == AIFrameworkType.LANGCHAIN,
458
+ "use_langgraph": self.ai_framework == AIFrameworkType.LANGGRAPH,
459
+ "use_crewai": self.ai_framework == AIFrameworkType.CREWAI,
460
+ "use_deepagents": self.ai_framework == AIFrameworkType.DEEPAGENTS,
316
461
  "llm_provider": self.llm_provider.value,
317
462
  "use_openai": self.llm_provider == LLMProviderType.OPENAI,
318
463
  "use_anthropic": self.llm_provider == LLMProviderType.ANTHROPIC,
@@ -339,6 +484,13 @@ class ProjectConfig(BaseModel):
339
484
  "include_traefik_service": self.reverse_proxy == ReverseProxyType.TRAEFIK_INCLUDED,
340
485
  "include_traefik_labels": self.reverse_proxy
341
486
  in (ReverseProxyType.TRAEFIK_INCLUDED, ReverseProxyType.TRAEFIK_EXTERNAL),
487
+ "use_traefik": self.reverse_proxy
488
+ in (ReverseProxyType.TRAEFIK_INCLUDED, ReverseProxyType.TRAEFIK_EXTERNAL),
489
+ "include_nginx_service": self.reverse_proxy == ReverseProxyType.NGINX_INCLUDED,
490
+ "include_nginx_config": self.reverse_proxy
491
+ in (ReverseProxyType.NGINX_INCLUDED, ReverseProxyType.NGINX_EXTERNAL),
492
+ "use_nginx": self.reverse_proxy
493
+ in (ReverseProxyType.NGINX_INCLUDED, ReverseProxyType.NGINX_EXTERNAL),
342
494
  "ci_type": self.ci_type.value,
343
495
  "use_github_actions": self.ci_type == CIType.GITHUB,
344
496
  "use_gitlab_ci": self.ci_type == CIType.GITLAB,