projectdavid-orm 1.5.0__tar.gz → 1.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. projectdavid_orm-1.6.0/CHANGELOG.md +244 -0
  2. {projectdavid_orm-1.5.0/src/projectdavid_orm.egg-info → projectdavid_orm-1.6.0}/PKG-INFO +10 -5
  3. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/pyproject.toml +22 -11
  4. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/src/projectdavid_common.egg-info/PKG-INFO +2 -2
  5. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/src/projectdavid_common.egg-info/SOURCES.txt +1 -1
  6. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/src/projectdavid_orm/projectdavid_orm/models.py +79 -131
  7. projectdavid_orm-1.6.0/src/projectdavid_orm/utilities/__init__.py +0 -0
  8. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0/src/projectdavid_orm.egg-info}/PKG-INFO +10 -5
  9. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/src/projectdavid_orm.egg-info/requires.txt +5 -2
  10. projectdavid_orm-1.5.0/CHANGELOG.md +0 -156
  11. projectdavid_orm-1.5.0/src/projectdavid_orm.egg-info/dependency_links.txt +0 -1
  12. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/LICENSE +0 -0
  13. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/MANIFEST.in +0 -0
  14. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/README.md +0 -0
  15. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/setup.cfg +0 -0
  16. /projectdavid_orm-1.5.0/src/projectdavid_orm/projectdavid_orm/__init__.py → /projectdavid_orm-1.6.0/src/projectdavid_common.egg-info/dependency_links.txt +0 -0
  17. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/src/projectdavid_common.egg-info/entry_points.txt +0 -0
  18. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/src/projectdavid_common.egg-info/requires.txt +0 -0
  19. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/src/projectdavid_common.egg-info/top_level.txt +0 -0
  20. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/src/projectdavid_orm/__init__.py +0 -0
  21. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/src/projectdavid_orm/constants/__init__.py +0 -0
  22. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/src/projectdavid_orm/ormInterface.py +0 -0
  23. {projectdavid_orm-1.5.0/src/projectdavid_orm/utilities → projectdavid_orm-1.6.0/src/projectdavid_orm/projectdavid_orm}/__init__.py +0 -0
  24. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/src/projectdavid_orm/projectdavid_orm/base.py +0 -0
  25. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/src/projectdavid_orm.egg-info/SOURCES.txt +0 -0
  26. {projectdavid_orm-1.5.0/src/projectdavid_common.egg-info → projectdavid_orm-1.6.0/src/projectdavid_orm.egg-info}/dependency_links.txt +0 -0
  27. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/src/projectdavid_orm.egg-info/top_level.txt +0 -0
  28. {projectdavid_orm-1.5.0 → projectdavid_orm-1.6.0}/tests/test_clients.py +0 -0
@@ -0,0 +1,244 @@
1
+ # [1.6.0](https://github.com/project-david-ai/projectdavid-orm/compare/v1.5.0...v1.6.0) (2026-03-29)
2
+
3
+
4
+ ### Features
5
+
6
+ * publish v1.6.0 — skip duplicate v1.5.0 on PyPI ([636aaf6](https://github.com/project-david-ai/projectdavid-orm/commit/636aaf67a7cedfdd094d47229984074b1305b491))
7
+
8
+ # [1.5.0](https://github.com/project-david-ai/projectdavid-orm/compare/v1.4.0...v1.5.0) (2026-03-29)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * correct semantic-release script path to update_version.py ([59af721](https://github.com/project-david-ai/projectdavid-orm/commit/59af721199849f06c89804df3b28d287e2aa47f6))
14
+
15
+
16
+ ### Features
17
+
18
+ * add max_tokens to Assistant, fix temperature and top_p Integer to Float on Assistant and Run ([b990759](https://github.com/project-david-ai/projectdavid-orm/commit/b9907590bdf46c1d20f908faac7dcfe3ed70d404))
19
+ * add nullable endpoint field to BaseModel ([a902d5b](https://github.com/project-david-ai/projectdavid-orm/commit/a902d5ba45852cfbb8f6cd31ebcfed3850fc2354))
20
+ * add nullable endpoint field to BaseModel ([6f4aa94](https://github.com/project-david-ai/projectdavid-orm/commit/6f4aa949a7167cdce9311c8d9b03ecd16d373830))
21
+ * bump to v1.6.0 — clear duplicate PyPI artefact ([0e616e3](https://github.com/project-david-ai/projectdavid-orm/commit/0e616e36e2a1007e4276223f25443f00c01e727d))
22
+ * max_tokens on Assistant, temperature/top_p Integer to Float, remove BatfishSnapshot, Gold Standard CI, PolyForm licence, COMMERCIAL.md, SECURITY.md, pre-commit, mypy ([edf837a](https://github.com/project-david-ai/projectdavid-orm/commit/edf837a7810ee744df011d81f56e5f761ba4135a))
23
+ * max_tokens on Assistant, temperature/top_p Integer to Float, remove BatfishSnapshot, Gold Standard CI, PolyForm licence, COMMERCIAL.md, SECURITY.md, pre-commit, mypy ([f4165da](https://github.com/project-david-ai/projectdavid-orm/commit/f4165da7a1784b2e9e89b01384a2a9fb2d898b61))
24
+ * max_tokens on Assistant, temperature/top_p Integer to Float, remove BatfishSnapshot, Gold Standard CI, PolyForm licence, COMMERCIAL.md, SECURITY.md, pre-commit, mypy ([ff4a08b](https://github.com/project-david-ai/projectdavid-orm/commit/ff4a08b6b92cb4355568cc299c2e6b51f248cd34))
25
+ * Phase 4 ([fb58012](https://github.com/project-david-ai/projectdavid-orm/commit/fb580125b975369c3a3a089f177c31e74561c72e))
26
+ * Phase 4 ([6c0c17c](https://github.com/project-david-ai/projectdavid-orm/commit/6c0c17cae3f4560b6dbed4621a4e6844a982d525))
27
+ * Phase 5a ([0ea00c5](https://github.com/project-david-ai/projectdavid-orm/commit/0ea00c5ccde65c4e9d191ed1239e0fe1d069c4d0))
28
+ * Phase 5a ([32cd97b](https://github.com/project-david-ai/projectdavid-orm/commit/32cd97b97e6fdff515318a61d902d3eb755447d8))
29
+ * trigger fresh publish after tag cleanup ([3ad924b](https://github.com/project-david-ai/projectdavid-orm/commit/3ad924be92635c8e4b2f870a021f47496cab32cb))
30
+ * trigger release — max_tokens, Float fix, remove BatfishSnapshot, Gold Standard CI ([1569cff](https://github.com/project-david-ai/projectdavid-orm/commit/1569cffcf18bb4fc44f897707ee2aa6e362edc72))
31
+
32
+ # [1.5.0](https://github.com/project-david-ai/projectdavid-orm/compare/v1.4.0...v1.5.0) (2026-03-29)
33
+
34
+
35
+ ### Bug Fixes
36
+
37
+ * correct semantic-release script path to update_version.py ([59af721](https://github.com/project-david-ai/projectdavid-orm/commit/59af721199849f06c89804df3b28d287e2aa47f6))
38
+
39
+
40
+ ### Features
41
+
42
+ * add max_tokens to Assistant, fix temperature and top_p Integer to Float on Assistant and Run ([b990759](https://github.com/project-david-ai/projectdavid-orm/commit/b9907590bdf46c1d20f908faac7dcfe3ed70d404))
43
+ * add nullable endpoint field to BaseModel ([a902d5b](https://github.com/project-david-ai/projectdavid-orm/commit/a902d5ba45852cfbb8f6cd31ebcfed3850fc2354))
44
+ * add nullable endpoint field to BaseModel ([6f4aa94](https://github.com/project-david-ai/projectdavid-orm/commit/6f4aa949a7167cdce9311c8d9b03ecd16d373830))
45
+ * bump to v1.6.0 — clear duplicate PyPI artefact ([0e616e3](https://github.com/project-david-ai/projectdavid-orm/commit/0e616e36e2a1007e4276223f25443f00c01e727d))
46
+ * max_tokens on Assistant, temperature/top_p Integer to Float, remove BatfishSnapshot, Gold Standard CI, PolyForm licence, COMMERCIAL.md, SECURITY.md, pre-commit, mypy ([edf837a](https://github.com/project-david-ai/projectdavid-orm/commit/edf837a7810ee744df011d81f56e5f761ba4135a))
47
+ * max_tokens on Assistant, temperature/top_p Integer to Float, remove BatfishSnapshot, Gold Standard CI, PolyForm licence, COMMERCIAL.md, SECURITY.md, pre-commit, mypy ([f4165da](https://github.com/project-david-ai/projectdavid-orm/commit/f4165da7a1784b2e9e89b01384a2a9fb2d898b61))
48
+ * max_tokens on Assistant, temperature/top_p Integer to Float, remove BatfishSnapshot, Gold Standard CI, PolyForm licence, COMMERCIAL.md, SECURITY.md, pre-commit, mypy ([ff4a08b](https://github.com/project-david-ai/projectdavid-orm/commit/ff4a08b6b92cb4355568cc299c2e6b51f248cd34))
49
+ * Phase 4 ([fb58012](https://github.com/project-david-ai/projectdavid-orm/commit/fb580125b975369c3a3a089f177c31e74561c72e))
50
+ * Phase 4 ([6c0c17c](https://github.com/project-david-ai/projectdavid-orm/commit/6c0c17cae3f4560b6dbed4621a4e6844a982d525))
51
+ * Phase 5a ([0ea00c5](https://github.com/project-david-ai/projectdavid-orm/commit/0ea00c5ccde65c4e9d191ed1239e0fe1d069c4d0))
52
+ * Phase 5a ([32cd97b](https://github.com/project-david-ai/projectdavid-orm/commit/32cd97b97e6fdff515318a61d902d3eb755447d8))
53
+ * trigger release — max_tokens, Float fix, remove BatfishSnapshot, Gold Standard CI ([1569cff](https://github.com/project-david-ai/projectdavid-orm/commit/1569cffcf18bb4fc44f897707ee2aa6e362edc72))
54
+
55
+ # [1.5.0](https://github.com/project-david-ai/projectdavid-orm/compare/v1.4.0...v1.5.0) (2026-03-29)
56
+
57
+
58
+ ### Bug Fixes
59
+
60
+ * correct semantic-release script path to update_version.py ([59af721](https://github.com/project-david-ai/projectdavid-orm/commit/59af721199849f06c89804df3b28d287e2aa47f6))
61
+
62
+
63
+ ### Features
64
+
65
+ * add max_tokens to Assistant, fix temperature and top_p Integer to Float on Assistant and Run ([b990759](https://github.com/project-david-ai/projectdavid-orm/commit/b9907590bdf46c1d20f908faac7dcfe3ed70d404))
66
+ * add nullable endpoint field to BaseModel ([a902d5b](https://github.com/project-david-ai/projectdavid-orm/commit/a902d5ba45852cfbb8f6cd31ebcfed3850fc2354))
67
+ * add nullable endpoint field to BaseModel ([6f4aa94](https://github.com/project-david-ai/projectdavid-orm/commit/6f4aa949a7167cdce9311c8d9b03ecd16d373830))
68
+ * max_tokens on Assistant, temperature/top_p Integer to Float, remove BatfishSnapshot, Gold Standard CI, PolyForm licence, COMMERCIAL.md, SECURITY.md, pre-commit, mypy ([edf837a](https://github.com/project-david-ai/projectdavid-orm/commit/edf837a7810ee744df011d81f56e5f761ba4135a))
69
+ * max_tokens on Assistant, temperature/top_p Integer to Float, remove BatfishSnapshot, Gold Standard CI, PolyForm licence, COMMERCIAL.md, SECURITY.md, pre-commit, mypy ([f4165da](https://github.com/project-david-ai/projectdavid-orm/commit/f4165da7a1784b2e9e89b01384a2a9fb2d898b61))
70
+ * max_tokens on Assistant, temperature/top_p Integer to Float, remove BatfishSnapshot, Gold Standard CI, PolyForm licence, COMMERCIAL.md, SECURITY.md, pre-commit, mypy ([ff4a08b](https://github.com/project-david-ai/projectdavid-orm/commit/ff4a08b6b92cb4355568cc299c2e6b51f248cd34))
71
+ * Phase 4 ([fb58012](https://github.com/project-david-ai/projectdavid-orm/commit/fb580125b975369c3a3a089f177c31e74561c72e))
72
+ * Phase 4 ([6c0c17c](https://github.com/project-david-ai/projectdavid-orm/commit/6c0c17cae3f4560b6dbed4621a4e6844a982d525))
73
+ * Phase 5a ([0ea00c5](https://github.com/project-david-ai/projectdavid-orm/commit/0ea00c5ccde65c4e9d191ed1239e0fe1d069c4d0))
74
+ * Phase 5a ([32cd97b](https://github.com/project-david-ai/projectdavid-orm/commit/32cd97b97e6fdff515318a61d902d3eb755447d8))
75
+ * trigger release — max_tokens, Float fix, remove BatfishSnapshot, Gold Standard CI ([1569cff](https://github.com/project-david-ai/projectdavid-orm/commit/1569cffcf18bb4fc44f897707ee2aa6e362edc72))
76
+
77
+ # [1.5.0](https://github.com/project-david-ai/projectdavid-orm/compare/v1.4.0...v1.5.0) (2026-03-28)
78
+
79
+
80
+ ### Bug Fixes
81
+
82
+ * correct semantic-release script path to update_version.py ([59af721](https://github.com/project-david-ai/projectdavid-orm/commit/59af721199849f06c89804df3b28d287e2aa47f6))
83
+
84
+
85
+ ### Features
86
+
87
+ * add max_tokens to Assistant, fix temperature and top_p Integer to Float on Assistant and Run ([b990759](https://github.com/project-david-ai/projectdavid-orm/commit/b9907590bdf46c1d20f908faac7dcfe3ed70d404))
88
+ * add nullable endpoint field to BaseModel ([a902d5b](https://github.com/project-david-ai/projectdavid-orm/commit/a902d5ba45852cfbb8f6cd31ebcfed3850fc2354))
89
+ * add nullable endpoint field to BaseModel ([6f4aa94](https://github.com/project-david-ai/projectdavid-orm/commit/6f4aa949a7167cdce9311c8d9b03ecd16d373830))
90
+ * max_tokens on Assistant, temperature/top_p Integer to Float, remove BatfishSnapshot, Gold Standard CI, PolyForm licence, COMMERCIAL.md, SECURITY.md, pre-commit, mypy ([edf837a](https://github.com/project-david-ai/projectdavid-orm/commit/edf837a7810ee744df011d81f56e5f761ba4135a))
91
+ * max_tokens on Assistant, temperature/top_p Integer to Float, remove BatfishSnapshot, Gold Standard CI, PolyForm licence, COMMERCIAL.md, SECURITY.md, pre-commit, mypy ([f4165da](https://github.com/project-david-ai/projectdavid-orm/commit/f4165da7a1784b2e9e89b01384a2a9fb2d898b61))
92
+ * max_tokens on Assistant, temperature/top_p Integer to Float, remove BatfishSnapshot, Gold Standard CI, PolyForm licence, COMMERCIAL.md, SECURITY.md, pre-commit, mypy ([ff4a08b](https://github.com/project-david-ai/projectdavid-orm/commit/ff4a08b6b92cb4355568cc299c2e6b51f248cd34))
93
+ * Phase 4 ([fb58012](https://github.com/project-david-ai/projectdavid-orm/commit/fb580125b975369c3a3a089f177c31e74561c72e))
94
+ * Phase 4 ([6c0c17c](https://github.com/project-david-ai/projectdavid-orm/commit/6c0c17cae3f4560b6dbed4621a4e6844a982d525))
95
+ * Phase 5a ([0ea00c5](https://github.com/project-david-ai/projectdavid-orm/commit/0ea00c5ccde65c4e9d191ed1239e0fe1d069c4d0))
96
+ * Phase 5a ([32cd97b](https://github.com/project-david-ai/projectdavid-orm/commit/32cd97b97e6fdff515318a61d902d3eb755447d8))
97
+
98
+ # [1.4.0](https://github.com/project-david-ai/projectdavid-orm/compare/v1.3.0...v1.4.0) (2026-03-23)
99
+
100
+
101
+ ### Features
102
+
103
+ * Phase 5a ([7213c69](https://github.com/project-david-ai/projectdavid-orm/commit/7213c698beb56eddb5230bbcf609f250e6b20c5e))
104
+
105
+ # [1.3.0](https://github.com/project-david-ai/projectdavid-orm/compare/v1.2.0...v1.3.0) (2026-03-23)
106
+
107
+
108
+ ### Features
109
+
110
+ * Phase 4 ([235a547](https://github.com/project-david-ai/projectdavid-orm/commit/235a54724dee1555c6e23febc9dec5d85dda5328))
111
+
112
+ # [1.2.0](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.12...v1.2.0) (2026-03-22)
113
+
114
+
115
+ ### Features
116
+
117
+ * add internal_hostname to InferenceDeployment ([20aa5d2](https://github.com/project-david-ai/projectdavid-orm/commit/20aa5d23fae57e510b63bcb59b24ff0c1544be9b))
118
+
119
+ ## [1.1.12](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.11...v1.1.12) (2026-03-21)
120
+
121
+
122
+ ### Bug Fixes
123
+
124
+ * clean up column formatting and relationships in models for improved readability and consistency ([fb5a873](https://github.com/project-david-ai/projectdavid-orm/commit/fb5a8736c6d3fa726c806e6bba7de06f00f234e4))
125
+ * clean up column formatting and relationships in models for improved readability and consistency ([fb5e05f](https://github.com/project-david-ai/projectdavid-orm/commit/fb5e05f5b0c94d05f1ce4b32ce46b61f8f33f96d))
126
+ * clean up column formatting and relationships in models for improved readability and consistency ([bca098e](https://github.com/project-david-ai/projectdavid-orm/commit/bca098e76a04011bff6a3d719100d76dbbc650b9))
127
+ * standardize timestamp columns, add soft-delete logic, and improve comments in models ([480baa1](https://github.com/project-david-ai/projectdavid-orm/commit/480baa17f1f34b575d3e6ba921ba6df9be3ac13b))
128
+ * standardize timestamp columns, add soft-delete logic, and improve comments in models ([568c93d](https://github.com/project-david-ai/projectdavid-orm/commit/568c93dc8523c159ebc0c67f5a6b909cc2fe6352))
129
+
130
+ ## [1.1.11](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.10...v1.1.11) (2026-03-20)
131
+
132
+
133
+ ### Bug Fixes
134
+
135
+ * add updated_at column to TrainingJobs table. ([18f38b7](https://github.com/project-david-ai/projectdavid-orm/commit/18f38b77802200038a3bd30bea01492f431d79f0))
136
+ * remove projectdavid_common dependency from pyproject.toml ([8550789](https://github.com/project-david-ai/projectdavid-orm/commit/85507896809a78ff44b0ca07258c3a727d7a2819))
137
+ * standardize timestamp columns, add soft-delete logic, and improve comments in models ([b9859c7](https://github.com/project-david-ai/projectdavid-orm/commit/b9859c74802dde63945d22485db9b426f447c971))
138
+ * update model imports and clean up column definitions in models ([5cc9fff](https://github.com/project-david-ai/projectdavid-orm/commit/5cc9fff84411a36e486742a6736934d41191ade6))
139
+
140
+ ## [1.1.10](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.9...v1.1.10) (2026-03-20)
141
+
142
+
143
+ ### Bug Fixes
144
+
145
+ * standardize timestamp columns, add soft-delete logic, and improve comments in models ([0aa5983](https://github.com/project-david-ai/projectdavid-orm/commit/0aa59836c1f37c5ee70a90cea269bfa2a2a8fb1f))
146
+ * standardize timestamp columns, add soft-delete logic, and improve comments in models ([d28dbc2](https://github.com/project-david-ai/projectdavid-orm/commit/d28dbc28a8413a67790f46627b0f35b2e828427c))
147
+
148
+ ## [1.1.9](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.8...v1.1.9) (2026-03-19)
149
+
150
+
151
+ ### Bug Fixes
152
+
153
+ * add updated_at column to TrainingJobs table. ([bf438d8](https://github.com/project-david-ai/projectdavid-orm/commit/bf438d8856af88a03d41dab3b7cf4d5bd56ce339))
154
+ * remove projectdavid_common dependency from pyproject.toml ([6537c42](https://github.com/project-david-ai/projectdavid-orm/commit/6537c42a1a7437c19a601fd154e655739c8f005b))
155
+
156
+ ## [1.1.8](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.7...v1.1.8) (2026-03-19)
157
+
158
+
159
+ ### Bug Fixes
160
+
161
+ * remove projectdavid_common dependency from pyproject.toml ([8f6faa1](https://github.com/project-david-ai/projectdavid-orm/commit/8f6faa1d494a864998e31aa073308c13c65889cf))
162
+
163
+ ## [1.1.7](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.6...v1.1.7) (2026-03-19)
164
+
165
+
166
+ ### Bug Fixes
167
+
168
+ * remove projectdavid_common dependency from pyproject.toml ([15fe2f7](https://github.com/project-david-ai/projectdavid-orm/commit/15fe2f79d6d2ac6ed5fdc59f71a8df891727aeb0))
169
+
170
+ ## [1.1.6](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.5...v1.1.6) (2026-03-19)
171
+
172
+
173
+ ### Bug Fixes
174
+
175
+ * remove redundant newline in README.md instructions ([81a423f](https://github.com/project-david-ai/projectdavid-orm/commit/81a423fb14dc4d46640b3a8d6b5748ddb794f720))
176
+ * upgrade projectdavid_common to v0.53.0 and remove redundant comments in models.py ([ac95695](https://github.com/project-david-ai/projectdavid-orm/commit/ac9569594868bbcbcefe5987195518482fad962b))
177
+
178
+ ## [1.1.5](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.4...v1.1.5) (2026-03-18)
179
+
180
+
181
+ ### Bug Fixes
182
+
183
+ * streamline test_tag_release workflow by removing `dev` branch logic and updating PyPI token configuration ([89a1be2](https://github.com/project-david-ai/projectdavid-orm/commit/89a1be2b410a1ce275f36e224fa407a4be4a1a26))
184
+
185
+ ## [1.1.4](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.3...v1.1.4) (2026-03-18)
186
+
187
+
188
+ ### Bug Fixes
189
+
190
+ * remove unused id-token permission from test_tag_release workflow ([c7225e7](https://github.com/project-david-ai/projectdavid-orm/commit/c7225e7432a26bf1fe32d429347ab79c286bced1))
191
+
192
+ ## [1.1.3](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.2...v1.1.3) (2026-03-18)
193
+
194
+
195
+ ### Bug Fixes
196
+
197
+ * remove unused id-token permission from test_tag_release workflow ([cd79ff9](https://github.com/project-david-ai/projectdavid-orm/commit/cd79ff9465b532031c64a7add2a9785a8bfef567))
198
+
199
+ ## [1.1.2](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.1...v1.1.2) (2026-03-18)
200
+
201
+
202
+ ### Bug Fixes
203
+
204
+ * remove unused id-token permission from test_tag_release workflow ([a34000d](https://github.com/project-david-ai/projectdavid-orm/commit/a34000da052f404db798da691ab2c5fa5815eeeb))
205
+
206
+ ## [1.1.1](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.0...v1.1.1) (2026-03-18)
207
+
208
+
209
+ ### Bug Fixes
210
+
211
+ * update PyPI repository URLs and add attestations flag in test_tag_release workflow ([a2dca7e](https://github.com/project-david-ai/projectdavid-orm/commit/a2dca7e521732302f8d0acb86390f3f061aae07e))
212
+
213
+ # [1.1.0](https://github.com/project-david-ai/projectdavid-orm/compare/v1.0.0...v1.1.0) (2026-03-18)
214
+
215
+
216
+ ### Bug Fixes
217
+
218
+ * remove redundant newline in README.md instructions ([dea758d](https://github.com/project-david-ai/projectdavid-orm/commit/dea758d4d80eb0e6f2b75e80e712652779afbe63))
219
+
220
+
221
+ ### Features
222
+
223
+ * add version.py for managing application versioning ([6ec6e42](https://github.com/project-david-ai/projectdavid-orm/commit/6ec6e425eba9e790e2a4a4c24aea5fa60c1f1057))
224
+
225
+ # 1.0.0 (2026-03-18)
226
+
227
+
228
+ ### Bug Fixes
229
+
230
+ * codebase for improved readability by consistently formatting SQLAlchemy column definitions and relationships. Adjust test log messages for clarity. ([e302b55](https://github.com/project-david-ai/projectdavid-orm/commit/e302b5580d35537db028a4cbea23d2d7f833cffc))
231
+
232
+
233
+ ### Features
234
+
235
+ * Set up release automation and project metadata files, including .releaserc.json, scripts, and editor configurations. ([4a747bb](https://github.com/project-david-ai/projectdavid-orm/commit/4a747bbf133f19c31629587955dd009545e241b5))
236
+
237
+ # Changelog
238
+
239
+ All notable changes to this project will be documented in this file.
240
+
241
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
242
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
243
+
244
+ ---
@@ -1,10 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: projectdavid-orm
3
- Version: 1.5.0
3
+ Version: 1.6.0
4
4
  Summary: Shared SQLAlchemy ORM models for ProjectDavid services
5
- Author-email: "Francis N." <francis.neequaye@projectdavid.co.uk>
6
- License: Polyform
5
+ Author-email: "Francis N." <engineering@projectdavid.co.uk>
6
+ License: PolyForm Noncommercial License 1.0.0
7
7
  Project-URL: Homepage, https://github.com/project-david-ai/projectdavid-orm
8
+ Project-URL: Documentation, https://docs.projectdavid.co.uk/docs
9
+ Project-URL: Changelog, https://github.com/project-david-ai/projectdavid-orm/blob/main/CHANGELOG.md
8
10
  Keywords: orm,sqlalchemy,models,projectdavid,internal
9
11
  Requires-Python: >=3.10
10
12
  Description-Content-Type: text/markdown
@@ -15,8 +17,11 @@ Requires-Dist: pydantic>=2.0
15
17
  Requires-Dist: python-dotenv
16
18
  Provides-Extra: dev
17
19
  Requires-Dist: pytest; extra == "dev"
18
- Requires-Dist: black; extra == "dev"
19
- Requires-Dist: isort; extra == "dev"
20
+ Requires-Dist: black==24.1.1; extra == "dev"
21
+ Requires-Dist: isort==5.13.2; extra == "dev"
22
+ Requires-Dist: bandit==1.7.7; extra == "dev"
23
+ Requires-Dist: mypy>=1.0; extra == "dev"
24
+ Requires-Dist: pre-commit; extra == "dev"
20
25
  Dynamic: license-file
21
26
 
22
27
  # projectdavid-orm
@@ -4,13 +4,13 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "projectdavid-orm"
7
- version = "1.5.0"
7
+ version = "1.6.0"
8
8
  description = "Shared SQLAlchemy ORM models for ProjectDavid services"
9
9
  readme = "README.md"
10
10
  authors = [
11
- { name = "Francis N.", email = "francis.neequaye@projectdavid.co.uk" }
11
+ { name = "Francis N.", email = "engineering@projectdavid.co.uk" }
12
12
  ]
13
- license = { text = "Polyform" }
13
+ license = { text = "PolyForm Noncommercial License 1.0.0" }
14
14
  keywords = ["orm", "sqlalchemy", "models", "projectdavid", "internal"]
15
15
  requires-python = ">=3.10"
16
16
 
@@ -19,18 +19,22 @@ dependencies = [
19
19
  "pymysql",
20
20
  "pydantic>=2.0",
21
21
  "python-dotenv",
22
-
23
22
  ]
24
23
 
25
24
  [project.optional-dependencies]
26
25
  dev = [
27
26
  "pytest",
28
- "black",
29
- "isort"
27
+ "black==24.1.1",
28
+ "isort==5.13.2",
29
+ "bandit==1.7.7",
30
+ "mypy>=1.0",
31
+ "pre-commit",
30
32
  ]
31
33
 
32
34
  [project.urls]
33
35
  Homepage = "https://github.com/project-david-ai/projectdavid-orm"
36
+ Documentation = "https://docs.projectdavid.co.uk/docs"
37
+ Changelog = "https://github.com/project-david-ai/projectdavid-orm/blob/main/CHANGELOG.md"
34
38
 
35
39
  [tool.setuptools]
36
40
  package-dir = { "" = "src" }
@@ -40,14 +44,21 @@ where = ["src"]
40
44
  include = ["projectdavid_orm", "projectdavid_orm.*"]
41
45
 
42
46
  [tool.black]
43
- line-length = 100
44
- target-version = ["py310"]
45
- skip-string-normalization = true
47
+ line-length = 88
48
+ target-version = ["py310", "py311", "py312"]
46
49
 
47
50
  [tool.flake8]
48
- max-line-length = 200
51
+ max-line-length = 88
49
52
  extend-ignore = ["E203"]
50
53
  exclude = [".venv", ".git", "__pycache__", "build", "dist"]
51
54
 
52
55
  [tool.isort]
53
- profile = "black"
56
+ profile = "black"
57
+ line_length = 88
58
+
59
+ [tool.mypy]
60
+ python_version = "3.11"
61
+ warn_return_any = false
62
+ warn_unused_configs = true
63
+ ignore_missing_imports = true
64
+ exclude = ["tests/"]
@@ -17,8 +17,8 @@ Requires-Dist: pytest; extra == "dev"
17
17
  [![Test, Tag, Publish Status](https://github.com/frankie336/entities_common/actions/workflows/test_tag_release.yml/badge.svg)](https://github.com/frankie336/entitites_sdk/actions/workflows/test_tag_release.yml)
18
18
 
19
19
  The **Projectdavid Common** SDK is a shared library that serves as a central resource for multiple components within the same
20
- project. It consolidates common functionality across disparate parts of the project, reducing duplication and improving
21
- maintainability. By providing a unified interface, Entities Common simplifies interactions with the
20
+ project. It consolidates common functionality across disparate parts of the project, reducing duplication and improving
21
+ maintainability. By providing a unified interface, Entities Common simplifies interactions with the
22
22
  and future related products.
23
23
 
24
24
  [Entities API](https://github.com/frankie336/entities_api), the [projectdavid SDK](https://github.com/frankie336/entitites_sdk) ,
@@ -29,4 +29,4 @@ src/projectdavid_common/schemas/vectors.py
29
29
  src/projectdavid_common/utilities/__init__.py
30
30
  src/projectdavid_common/utilities/identifier_service.py
31
31
  src/projectdavid_common/utilities/logging_service.py
32
- tests/test_vector_store_models.py
32
+ tests/test_vector_store_models.py
@@ -8,13 +8,7 @@ from projectdavid_common import ValidationInterface
8
8
  from projectdavid_common.projectdavid_orm.base import Base
9
9
  from projectdavid_common.schemas.enums import StatusEnum
10
10
  from projectdavid_common.utilities.logging_service import LoggingUtility
11
- from sqlalchemy import (
12
- JSON,
13
- BigInteger,
14
- Boolean,
15
- Column,
16
- DateTime,
17
- )
11
+ from sqlalchemy import JSON, BigInteger, Boolean, Column, DateTime
18
12
  from sqlalchemy import Enum as SAEnum
19
13
  from sqlalchemy import (
20
14
  Float,
@@ -116,7 +110,9 @@ class User(Base):
116
110
  comment="Internal unique identifier for the user (e.g., user_...)",
117
111
  )
118
112
  created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
119
- updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
113
+ updated_at = Column(
114
+ DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False
115
+ )
120
116
  is_admin = Column(
121
117
  Boolean,
122
118
  default=False,
@@ -141,7 +137,9 @@ class User(Base):
141
137
  full_name = Column(String(255), nullable=True, comment="User's full display name")
142
138
  given_name = Column(String(128), nullable=True, comment="First name")
143
139
  family_name = Column(String(128), nullable=True, comment="Last name")
144
- picture_url = Column(Text, nullable=True, comment="URL to the user's profile picture")
140
+ picture_url = Column(
141
+ Text, nullable=True, comment="URL to the user's profile picture"
142
+ )
145
143
 
146
144
  oauth_provider = Column(
147
145
  String(50),
@@ -175,13 +173,17 @@ class User(Base):
175
173
  "Sandbox", back_populates="user", cascade="all, delete-orphan", lazy="select"
176
174
  )
177
175
  vector_stores = relationship("VectorStore", back_populates="user", lazy="select")
178
- files = relationship("File", back_populates="user", cascade="all, delete-orphan", lazy="select")
176
+ files = relationship(
177
+ "File", back_populates="user", cascade="all, delete-orphan", lazy="select"
178
+ )
179
179
  runs = relationship("Run", back_populates="user", lazy="select")
180
180
 
181
181
  audit_logs = relationship("AuditLog", back_populates="user", lazy="dynamic")
182
182
 
183
183
  __table_args__ = (
184
- UniqueConstraint("oauth_provider", "provider_user_id", name="uq_user_oauth_provider_id"),
184
+ UniqueConstraint(
185
+ "oauth_provider", "provider_user_id", name="uq_user_oauth_provider_id"
186
+ ),
185
187
  Index("idx_user_email", "email"),
186
188
  Index("idx_user_is_admin", "is_admin"),
187
189
  )
@@ -203,8 +205,6 @@ class AuditLog(Base):
203
205
 
204
206
  id = Column(BigInteger, primary_key=True, index=True, autoincrement=True)
205
207
 
206
- # Who performed the action.
207
- # Nullable: SET NULL when the user is erased (record survives, identity is anonymised).
208
208
  user_id = Column(
209
209
  String(64),
210
210
  ForeignKey("users.id", ondelete="SET NULL"),
@@ -212,7 +212,6 @@ class AuditLog(Base):
212
212
  index=True,
213
213
  )
214
214
 
215
- # What was done
216
215
  action = Column(
217
216
  String(32),
218
217
  nullable=False,
@@ -220,22 +219,18 @@ class AuditLog(Base):
220
219
  comment="e.g. CREATE, UPDATE, DELETE, HARD_DELETE, ERASE",
221
220
  )
222
221
 
223
- # What entity was affected
224
222
  entity_type = Column(
225
223
  String(64), nullable=False, index=True, comment="e.g. Assistant, User, Thread"
226
224
  )
227
225
  entity_id = Column(String(64), nullable=False, index=True)
228
226
 
229
- # Context
230
227
  timestamp = Column(DateTime, default=datetime.utcnow, nullable=False, index=True)
231
228
  ip_address = Column(String(45), nullable=True)
232
229
 
233
- # Detailed Payload (snapshot of changes)
234
230
  details = Column(
235
231
  JSON, nullable=True, comment="Stores before/after state or reasoning for action"
236
232
  )
237
233
 
238
- # Relationship
239
234
  user = relationship("User", back_populates="audit_logs")
240
235
 
241
236
 
@@ -246,10 +241,10 @@ class Thread(Base):
246
241
  meta_data = Column(JSON, nullable=False, default={})
247
242
  object = Column(String(64), nullable=False)
248
243
  tool_resources = Column(JSON, nullable=False, default={})
249
- participants = relationship("User", secondary=thread_participants, back_populates="threads")
244
+ participants = relationship(
245
+ "User", secondary=thread_participants, back_populates="threads"
246
+ )
250
247
 
251
- # SET NULL on user deletion — thread record is preserved, ownership is cleared.
252
- # Application-level erase_user() handles physical cleanup of thread content.
253
248
  owner_id = Column(
254
249
  String(64),
255
250
  ForeignKey("users.id", ondelete="SET NULL"),
@@ -267,7 +262,6 @@ class Message(Base):
267
262
  attachments = Column(JSON, default=[])
268
263
  completed_at = Column(Integer, nullable=True)
269
264
 
270
- # --- The "Brain" Output ---
271
265
  content = Column(Text(length=4294967295), nullable=False)
272
266
  reasoning = Column(
273
267
  Text(length=4294967295),
@@ -275,7 +269,6 @@ class Message(Base):
275
269
  comment="Stores the internal 'thinking' or reasoning tokens from the model.",
276
270
  )
277
271
 
278
- # --- Native Tool Metadata (Critical for Stage 2/Level 3) ---
279
272
  tool_calls = Column(
280
273
  JSON,
281
274
  nullable=True,
@@ -295,15 +288,10 @@ class Message(Base):
295
288
  role = Column(String(32), nullable=False)
296
289
  run_id = Column(String(64), nullable=True)
297
290
 
298
- # Kept as simple String, no longer linked to deleted Tool table
299
291
  tool_id = Column(String(64), nullable=True)
300
292
 
301
293
  status = Column(String(32), nullable=True)
302
294
 
303
- # NOTE: thread_id is intentionally stored as a plain string with no FK constraint.
304
- # Orphaned messages (after thread deletion) are handled by:
305
- # a) application-level erase_user() during right-to-erasure
306
- # b) purge_orphaned_threads daemon (periodic background cleanup)
307
295
  thread_id = Column(String(64), nullable=False)
308
296
  sender_id = Column(String(64), nullable=True)
309
297
 
@@ -311,7 +299,6 @@ class Message(Base):
311
299
  class Run(Base):
312
300
  __tablename__ = "runs"
313
301
 
314
- # CASCADE: runs are deleted when their owning user is erased.
315
302
  user_id = Column(
316
303
  String(64),
317
304
  ForeignKey("users.id", ondelete="CASCADE"),
@@ -323,7 +310,6 @@ class Run(Base):
323
310
  id = Column(String(64), primary_key=True)
324
311
  assistant_id = Column(String(64), nullable=False)
325
312
 
326
- # timestamps as epoch seconds (ints)
327
313
  cancelled_at = Column(Integer, nullable=True)
328
314
  completed_at = Column(Integer, nullable=True)
329
315
  created_at = Column(Integer, default=lambda: int(time.time()))
@@ -348,13 +334,11 @@ class Run(Base):
348
334
 
349
335
  status = Column(SAEnum(validation.StatusEnum), nullable=False)
350
336
 
351
- # NOTE: thread_id stored as plain string — no FK constraint (mirrors Message.thread_id).
352
337
  thread_id = Column(String(64), nullable=False)
353
338
  tool_choice = Column(String(64), nullable=True)
354
339
 
355
340
  tools = Column(JSON, nullable=True)
356
341
 
357
- # --- Agentic Behavior State (Level 3) ---
358
342
  current_turn = Column(
359
343
  Integer,
360
344
  default=0,
@@ -382,8 +366,11 @@ class Run(Base):
382
366
  )
383
367
 
384
368
  usage = Column(JSON, nullable=True)
385
- temperature = Column(Integer, nullable=True)
386
- top_p = Column(Integer, nullable=True)
369
+
370
+ # Fixed: Float not Integer — supports values like 0.7, 0.95
371
+ temperature = Column(Float, nullable=True)
372
+ top_p = Column(Float, nullable=True)
373
+
387
374
  tool_resources = Column(JSON, nullable=True)
388
375
 
389
376
  actions = relationship("Action", back_populates="run")
@@ -403,19 +390,28 @@ class Assistant(Base):
403
390
 
404
391
  tool_configs = Column(JSON)
405
392
  meta_data = Column(JSON)
406
- top_p = Column(Integer)
407
- temperature = Column(Integer)
393
+
394
+ # Fixed: Float not Integer — supports values like 0.7, 0.95
395
+ top_p = Column(Float, nullable=True)
396
+ temperature = Column(Float, nullable=True)
397
+
408
398
  response_format = Column(String(64))
409
399
 
400
+ # Added: max_tokens — bubbles up to inference at runtime
401
+ max_tokens = Column(
402
+ Integer,
403
+ nullable=True,
404
+ default=2048,
405
+ server_default="2048",
406
+ comment="Maximum tokens to generate per inference pass. Overrides provider defaults at runtime.",
407
+ )
408
+
410
409
  tool_resources = Column(
411
410
  JSON,
412
411
  nullable=True,
413
412
  comment='Resource map keyed by tool type, e.g. {"file_search": {"vector_store_ids": ["vs_123","vs_456"]}}',
414
413
  )
415
414
 
416
- # SET NULL on user deletion — assistant record is preserved (may be shared with
417
- # other users via user_assistants). Application-level erase_user() decides
418
- # whether to soft-delete exclusively-owned assistants.
419
415
  owner_id = Column(
420
416
  String(64),
421
417
  ForeignKey("users.id", ondelete="SET NULL"),
@@ -499,14 +495,12 @@ class Action(Base):
499
495
 
500
496
  id = Column(String(64), primary_key=True, index=True)
501
497
 
502
- # CASCADE: actions are deleted when their parent run is deleted.
503
498
  run_id = Column(
504
499
  String(64),
505
500
  ForeignKey("runs.id", ondelete="CASCADE"),
506
501
  nullable=True,
507
502
  )
508
503
 
509
- # --- Agentic Tracking (Level 3) ---
510
504
  tool_call_id = Column(
511
505
  String(64),
512
506
  nullable=True,
@@ -548,7 +542,6 @@ class Action(Base):
548
542
  function_args = Column(JSON, nullable=True)
549
543
  result = Column(JSON, nullable=True)
550
544
 
551
- # --- Relationships ---
552
545
  run = relationship("Run", back_populates="actions")
553
546
 
554
547
  @staticmethod
@@ -560,7 +553,6 @@ class Sandbox(Base):
560
553
  __tablename__ = "sandboxes"
561
554
  id = Column(String(64), primary_key=True, index=True)
562
555
 
563
- # CASCADE: sandboxes are deleted when their owning user is erased.
564
556
  user_id = Column(
565
557
  String(64),
566
558
  ForeignKey("users.id", ondelete="CASCADE"),
@@ -584,7 +576,6 @@ class File(Base):
584
576
  purpose = Column(String(64), nullable=False)
585
577
  mime_type = Column(String(255))
586
578
 
587
- # ── GDPR / Lifecycle ────────────────────────────────────────────
588
579
  deleted_at = Column(
589
580
  Integer,
590
581
  nullable=True,
@@ -608,7 +599,6 @@ class FileStorage(Base):
608
599
  __tablename__ = "file_storage"
609
600
  id = Column(Integer, primary_key=True, autoincrement=True)
610
601
 
611
- # CASCADE: storage records are deleted when their parent file is deleted.
612
602
  file_id = Column(
613
603
  String(64),
614
604
  ForeignKey("files.id", ondelete="CASCADE"),
@@ -640,69 +630,6 @@ class FileStorage(Base):
640
630
  __table_args__ = (Index("idx_file_storage_file_id", "file_id"),)
641
631
 
642
632
 
643
- class BatfishSnapshot(Base):
644
- __tablename__ = "batfish_snapshots"
645
-
646
- id = Column(
647
- String(64),
648
- primary_key=True,
649
- index=True,
650
- comment="Opaque snapshot ID returned to caller e.g. snap_abc123",
651
- )
652
-
653
- snapshot_name = Column(
654
- String(128),
655
- nullable=False,
656
- comment="Caller-supplied label e.g. 'incident_001'",
657
- )
658
-
659
- snapshot_key = Column(
660
- String(256),
661
- nullable=False,
662
- unique=True,
663
- index=True,
664
- comment="Namespaced isolation key: {user_id}_{id}",
665
- )
666
-
667
- # CASCADE: snapshots are deleted when their owning user is erased.
668
- user_id = Column(
669
- String(64),
670
- ForeignKey("users.id", ondelete="CASCADE"),
671
- nullable=False,
672
- index=True,
673
- )
674
-
675
- configs_root = Column(String(512), nullable=True)
676
-
677
- device_count = Column(Integer, default=0, nullable=False)
678
- devices = Column(
679
- JSON,
680
- default=list,
681
- nullable=False,
682
- comment="List of hostnames ingested into this snapshot",
683
- )
684
-
685
- status = Column(
686
- SAEnum(StatusEnum),
687
- nullable=False,
688
- default=StatusEnum.pending,
689
- )
690
-
691
- error_message = Column(Text, nullable=True)
692
-
693
- created_at = Column(BigInteger, default=lambda: int(time.time()), nullable=False)
694
- updated_at = Column(BigInteger, default=lambda: int(time.time()), nullable=False)
695
- last_ingested_at = Column(BigInteger, nullable=True)
696
-
697
- user = relationship("User", lazy="select")
698
-
699
- __table_args__ = (
700
- UniqueConstraint("user_id", "snapshot_name", name="uq_batfish_user_snapshot_name"),
701
- Index("idx_batfish_user_id", "user_id"),
702
- Index("idx_batfish_status", "status"),
703
- )
704
-
705
-
706
633
  class VectorStore(Base):
707
634
  __tablename__ = "vector_stores"
708
635
  id = Column(String(64), primary_key=True, index=True)
@@ -722,7 +649,6 @@ class VectorStore(Base):
722
649
  config = Column(JSON, nullable=True)
723
650
  file_count = Column(Integer, default=0, nullable=False)
724
651
 
725
- # ── GDPR / Lifecycle ────────────────────────────────────────────────────
726
652
  deleted_at = Column(
727
653
  Integer,
728
654
  nullable=True,
@@ -744,7 +670,6 @@ class VectorStoreFile(Base):
744
670
  __tablename__ = "vector_store_files"
745
671
  id = Column(String(64), primary_key=True, index=True)
746
672
 
747
- # CASCADE: vector store files are deleted when their parent store is deleted.
748
673
  vector_store_id = Column(
749
674
  String(64),
750
675
  ForeignKey("vector_stores.id", ondelete="CASCADE"),
@@ -766,7 +691,10 @@ class Dataset(Base):
766
691
  __tablename__ = "datasets"
767
692
  id = Column(String(64), primary_key=True, index=True)
768
693
  user_id = Column(
769
- String(64), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True
694
+ String(64),
695
+ ForeignKey("users.id", ondelete="CASCADE"),
696
+ nullable=False,
697
+ index=True,
770
698
  )
771
699
  name = Column(String(128), nullable=False)
772
700
  description = Column(Text, nullable=True)
@@ -787,17 +715,25 @@ class Dataset(Base):
787
715
  )
788
716
  deleted_at = Column(Integer, nullable=True, default=None, index=True)
789
717
 
790
- training_jobs = relationship("TrainingJob", back_populates="dataset", lazy="dynamic")
718
+ training_jobs = relationship(
719
+ "TrainingJob", back_populates="dataset", lazy="dynamic"
720
+ )
791
721
 
792
722
 
793
723
  class TrainingJob(Base):
794
724
  __tablename__ = "training_jobs"
795
725
  id = Column(String(64), primary_key=True, index=True)
796
726
  user_id = Column(
797
- String(64), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True
727
+ String(64),
728
+ ForeignKey("users.id", ondelete="CASCADE"),
729
+ nullable=False,
730
+ index=True,
798
731
  )
799
732
  dataset_id = Column(
800
- String(64), ForeignKey("datasets.id", ondelete="SET NULL"), nullable=True, index=True
733
+ String(64),
734
+ ForeignKey("datasets.id", ondelete="SET NULL"),
735
+ nullable=True,
736
+ index=True,
801
737
  )
802
738
  base_model = Column(String(256), nullable=False)
803
739
  framework = Column(String(32), nullable=False, default="axolotl")
@@ -820,9 +756,9 @@ class TrainingJob(Base):
820
756
  metrics = Column(JSON, nullable=True)
821
757
  output_path = Column(String(512), nullable=True)
822
758
 
823
- # Phase 4: node_id stores the Ray node ID (hex string) for traceability.
824
- # FK to compute_nodes retained for legacy compatibility — dropped in Phase 5.
825
- node_id = Column(String(64), ForeignKey("compute_nodes.id", ondelete="SET NULL"), nullable=True)
759
+ node_id = Column(
760
+ String(64), ForeignKey("compute_nodes.id", ondelete="SET NULL"), nullable=True
761
+ )
826
762
 
827
763
  dataset = relationship("Dataset", back_populates="training_jobs", lazy="select")
828
764
  fine_tuned_model = relationship(
@@ -840,10 +776,16 @@ class FineTunedModel(Base):
840
776
  __tablename__ = "fine_tuned_models"
841
777
  id = Column(String(64), primary_key=True, index=True)
842
778
  user_id = Column(
843
- String(64), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True
779
+ String(64),
780
+ ForeignKey("users.id", ondelete="CASCADE"),
781
+ nullable=False,
782
+ index=True,
844
783
  )
845
784
  training_job_id = Column(
846
- String(64), ForeignKey("training_jobs.id", ondelete="SET NULL"), nullable=True, index=True
785
+ String(64),
786
+ ForeignKey("training_jobs.id", ondelete="SET NULL"),
787
+ nullable=True,
788
+ index=True,
847
789
  )
848
790
  name = Column(String(128), nullable=False)
849
791
  description = Column(Text, nullable=True)
@@ -863,11 +805,13 @@ class FineTunedModel(Base):
863
805
  )
864
806
  deleted_at = Column(Integer, nullable=True, default=None, index=True)
865
807
 
866
- # Phase 4: stores Ray node ID for traceability. FK retained for legacy
867
- # compatibility until Phase 5 drops compute_nodes.
868
- node_id = Column(String(64), ForeignKey("compute_nodes.id", ondelete="SET NULL"), nullable=True)
808
+ node_id = Column(
809
+ String(64), ForeignKey("compute_nodes.id", ondelete="SET NULL"), nullable=True
810
+ )
869
811
 
870
- training_job = relationship("TrainingJob", back_populates="fine_tuned_model", lazy="select")
812
+ training_job = relationship(
813
+ "TrainingJob", back_populates="fine_tuned_model", lazy="select"
814
+ )
871
815
  node = relationship("ComputeNode", back_populates="active_models")
872
816
 
873
817
 
@@ -894,7 +838,9 @@ class ComputeNode(Base):
894
838
  status = Column(SAEnum(StatusEnum), default=StatusEnum.active)
895
839
  last_heartbeat = Column(BigInteger, default=lambda: int(time.time()))
896
840
 
897
- allocations = relationship("GPUAllocation", back_populates="node", cascade="all, delete-orphan")
841
+ allocations = relationship(
842
+ "GPUAllocation", back_populates="node", cascade="all, delete-orphan"
843
+ )
898
844
  training_jobs = relationship("TrainingJob", back_populates="node")
899
845
  active_models = relationship("FineTunedModel", back_populates="node")
900
846
 
@@ -909,9 +855,13 @@ class GPUAllocation(Base):
909
855
  __tablename__ = "gpu_allocations"
910
856
  id = Column(Integer, primary_key=True, autoincrement=True)
911
857
  node_id = Column(String(64), ForeignKey("compute_nodes.id", ondelete="CASCADE"))
912
- job_id = Column(String(64), ForeignKey("training_jobs.id", ondelete="CASCADE"), nullable=True)
858
+ job_id = Column(
859
+ String(64), ForeignKey("training_jobs.id", ondelete="CASCADE"), nullable=True
860
+ )
913
861
  model_id = Column(
914
- String(64), ForeignKey("fine_tuned_models.id", ondelete="CASCADE"), nullable=True
862
+ String(64),
863
+ ForeignKey("fine_tuned_models.id", ondelete="CASCADE"),
864
+ nullable=True,
915
865
  )
916
866
  vram_reserved_gb = Column(Float, nullable=False)
917
867
  created_at = Column(BigInteger, default=lambda: int(time.time()))
@@ -941,20 +891,18 @@ class InferenceDeployment(Base):
941
891
  __tablename__ = "inference_deployments"
942
892
  id = Column(String(64), primary_key=True, index=True)
943
893
 
944
- # Phase 4: plain string storing the Ray node ID (hex). No FK constraint.
945
894
  node_id = Column(String(128), nullable=True)
946
895
 
947
896
  internal_hostname = Column(String(128), nullable=True)
948
897
  base_model_id = Column(String(128), ForeignKey("base_models.id"))
949
- fine_tuned_model_id = Column(String(64), ForeignKey("fine_tuned_models.id"), nullable=True)
898
+ fine_tuned_model_id = Column(
899
+ String(64), ForeignKey("fine_tuned_models.id"), nullable=True
900
+ )
950
901
  port = Column(Integer, default=8000)
951
902
  status = Column(SAEnum(StatusEnum), default=StatusEnum.active)
952
903
  current_throughput = Column(Float, default=0.0)
953
904
  last_seen = Column(BigInteger, default=lambda: int(time.time()))
954
905
 
955
- # Inference sharding: number of GPUs this deployment spans.
956
- # 1 = single GPU (default, backward compatible).
957
- # N > 1 = tensor parallel across N GPUs via vLLM --tensor-parallel-size.
958
906
  tensor_parallel_size = Column(Integer, nullable=False, default=1)
959
907
 
960
908
  base_model = relationship("BaseModel")
@@ -1,10 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: projectdavid-orm
3
- Version: 1.5.0
3
+ Version: 1.6.0
4
4
  Summary: Shared SQLAlchemy ORM models for ProjectDavid services
5
- Author-email: "Francis N." <francis.neequaye@projectdavid.co.uk>
6
- License: Polyform
5
+ Author-email: "Francis N." <engineering@projectdavid.co.uk>
6
+ License: PolyForm Noncommercial License 1.0.0
7
7
  Project-URL: Homepage, https://github.com/project-david-ai/projectdavid-orm
8
+ Project-URL: Documentation, https://docs.projectdavid.co.uk/docs
9
+ Project-URL: Changelog, https://github.com/project-david-ai/projectdavid-orm/blob/main/CHANGELOG.md
8
10
  Keywords: orm,sqlalchemy,models,projectdavid,internal
9
11
  Requires-Python: >=3.10
10
12
  Description-Content-Type: text/markdown
@@ -15,8 +17,11 @@ Requires-Dist: pydantic>=2.0
15
17
  Requires-Dist: python-dotenv
16
18
  Provides-Extra: dev
17
19
  Requires-Dist: pytest; extra == "dev"
18
- Requires-Dist: black; extra == "dev"
19
- Requires-Dist: isort; extra == "dev"
20
+ Requires-Dist: black==24.1.1; extra == "dev"
21
+ Requires-Dist: isort==5.13.2; extra == "dev"
22
+ Requires-Dist: bandit==1.7.7; extra == "dev"
23
+ Requires-Dist: mypy>=1.0; extra == "dev"
24
+ Requires-Dist: pre-commit; extra == "dev"
20
25
  Dynamic: license-file
21
26
 
22
27
  # projectdavid-orm
@@ -5,5 +5,8 @@ python-dotenv
5
5
 
6
6
  [dev]
7
7
  pytest
8
- black
9
- isort
8
+ black==24.1.1
9
+ isort==5.13.2
10
+ bandit==1.7.7
11
+ mypy>=1.0
12
+ pre-commit
@@ -1,156 +0,0 @@
1
- # [1.5.0](https://github.com/project-david-ai/projectdavid-orm/compare/v1.4.0...v1.5.0) (2026-03-24)
2
-
3
-
4
- ### Features
5
-
6
- * add nullable endpoint field to BaseModel ([a902d5b](https://github.com/project-david-ai/projectdavid-orm/commit/a902d5ba45852cfbb8f6cd31ebcfed3850fc2354))
7
- * Phase 4 ([fb58012](https://github.com/project-david-ai/projectdavid-orm/commit/fb580125b975369c3a3a089f177c31e74561c72e))
8
- * Phase 5a ([0ea00c5](https://github.com/project-david-ai/projectdavid-orm/commit/0ea00c5ccde65c4e9d191ed1239e0fe1d069c4d0))
9
-
10
- # [1.4.0](https://github.com/project-david-ai/projectdavid-orm/compare/v1.3.0...v1.4.0) (2026-03-23)
11
-
12
-
13
- ### Features
14
-
15
- * Phase 5a ([7213c69](https://github.com/project-david-ai/projectdavid-orm/commit/7213c698beb56eddb5230bbcf609f250e6b20c5e))
16
-
17
- # [1.3.0](https://github.com/project-david-ai/projectdavid-orm/compare/v1.2.0...v1.3.0) (2026-03-23)
18
-
19
-
20
- ### Features
21
-
22
- * Phase 4 ([235a547](https://github.com/project-david-ai/projectdavid-orm/commit/235a54724dee1555c6e23febc9dec5d85dda5328))
23
-
24
- # [1.2.0](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.12...v1.2.0) (2026-03-22)
25
-
26
-
27
- ### Features
28
-
29
- * add internal_hostname to InferenceDeployment ([20aa5d2](https://github.com/project-david-ai/projectdavid-orm/commit/20aa5d23fae57e510b63bcb59b24ff0c1544be9b))
30
-
31
- ## [1.1.12](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.11...v1.1.12) (2026-03-21)
32
-
33
-
34
- ### Bug Fixes
35
-
36
- * clean up column formatting and relationships in models for improved readability and consistency ([fb5a873](https://github.com/project-david-ai/projectdavid-orm/commit/fb5a8736c6d3fa726c806e6bba7de06f00f234e4))
37
- * clean up column formatting and relationships in models for improved readability and consistency ([fb5e05f](https://github.com/project-david-ai/projectdavid-orm/commit/fb5e05f5b0c94d05f1ce4b32ce46b61f8f33f96d))
38
- * clean up column formatting and relationships in models for improved readability and consistency ([bca098e](https://github.com/project-david-ai/projectdavid-orm/commit/bca098e76a04011bff6a3d719100d76dbbc650b9))
39
- * standardize timestamp columns, add soft-delete logic, and improve comments in models ([480baa1](https://github.com/project-david-ai/projectdavid-orm/commit/480baa17f1f34b575d3e6ba921ba6df9be3ac13b))
40
- * standardize timestamp columns, add soft-delete logic, and improve comments in models ([568c93d](https://github.com/project-david-ai/projectdavid-orm/commit/568c93dc8523c159ebc0c67f5a6b909cc2fe6352))
41
-
42
- ## [1.1.11](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.10...v1.1.11) (2026-03-20)
43
-
44
-
45
- ### Bug Fixes
46
-
47
- * add updated_at column to TrainingJobs table. ([18f38b7](https://github.com/project-david-ai/projectdavid-orm/commit/18f38b77802200038a3bd30bea01492f431d79f0))
48
- * remove projectdavid_common dependency from pyproject.toml ([8550789](https://github.com/project-david-ai/projectdavid-orm/commit/85507896809a78ff44b0ca07258c3a727d7a2819))
49
- * standardize timestamp columns, add soft-delete logic, and improve comments in models ([b9859c7](https://github.com/project-david-ai/projectdavid-orm/commit/b9859c74802dde63945d22485db9b426f447c971))
50
- * update model imports and clean up column definitions in models ([5cc9fff](https://github.com/project-david-ai/projectdavid-orm/commit/5cc9fff84411a36e486742a6736934d41191ade6))
51
-
52
- ## [1.1.10](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.9...v1.1.10) (2026-03-20)
53
-
54
-
55
- ### Bug Fixes
56
-
57
- * standardize timestamp columns, add soft-delete logic, and improve comments in models ([0aa5983](https://github.com/project-david-ai/projectdavid-orm/commit/0aa59836c1f37c5ee70a90cea269bfa2a2a8fb1f))
58
- * standardize timestamp columns, add soft-delete logic, and improve comments in models ([d28dbc2](https://github.com/project-david-ai/projectdavid-orm/commit/d28dbc28a8413a67790f46627b0f35b2e828427c))
59
-
60
- ## [1.1.9](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.8...v1.1.9) (2026-03-19)
61
-
62
-
63
- ### Bug Fixes
64
-
65
- * add updated_at column to TrainingJobs table. ([bf438d8](https://github.com/project-david-ai/projectdavid-orm/commit/bf438d8856af88a03d41dab3b7cf4d5bd56ce339))
66
- * remove projectdavid_common dependency from pyproject.toml ([6537c42](https://github.com/project-david-ai/projectdavid-orm/commit/6537c42a1a7437c19a601fd154e655739c8f005b))
67
-
68
- ## [1.1.8](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.7...v1.1.8) (2026-03-19)
69
-
70
-
71
- ### Bug Fixes
72
-
73
- * remove projectdavid_common dependency from pyproject.toml ([8f6faa1](https://github.com/project-david-ai/projectdavid-orm/commit/8f6faa1d494a864998e31aa073308c13c65889cf))
74
-
75
- ## [1.1.7](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.6...v1.1.7) (2026-03-19)
76
-
77
-
78
- ### Bug Fixes
79
-
80
- * remove projectdavid_common dependency from pyproject.toml ([15fe2f7](https://github.com/project-david-ai/projectdavid-orm/commit/15fe2f79d6d2ac6ed5fdc59f71a8df891727aeb0))
81
-
82
- ## [1.1.6](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.5...v1.1.6) (2026-03-19)
83
-
84
-
85
- ### Bug Fixes
86
-
87
- * remove redundant newline in README.md instructions ([81a423f](https://github.com/project-david-ai/projectdavid-orm/commit/81a423fb14dc4d46640b3a8d6b5748ddb794f720))
88
- * upgrade projectdavid_common to v0.53.0 and remove redundant comments in models.py ([ac95695](https://github.com/project-david-ai/projectdavid-orm/commit/ac9569594868bbcbcefe5987195518482fad962b))
89
-
90
- ## [1.1.5](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.4...v1.1.5) (2026-03-18)
91
-
92
-
93
- ### Bug Fixes
94
-
95
- * streamline test_tag_release workflow by removing `dev` branch logic and updating PyPI token configuration ([89a1be2](https://github.com/project-david-ai/projectdavid-orm/commit/89a1be2b410a1ce275f36e224fa407a4be4a1a26))
96
-
97
- ## [1.1.4](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.3...v1.1.4) (2026-03-18)
98
-
99
-
100
- ### Bug Fixes
101
-
102
- * remove unused id-token permission from test_tag_release workflow ([c7225e7](https://github.com/project-david-ai/projectdavid-orm/commit/c7225e7432a26bf1fe32d429347ab79c286bced1))
103
-
104
- ## [1.1.3](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.2...v1.1.3) (2026-03-18)
105
-
106
-
107
- ### Bug Fixes
108
-
109
- * remove unused id-token permission from test_tag_release workflow ([cd79ff9](https://github.com/project-david-ai/projectdavid-orm/commit/cd79ff9465b532031c64a7add2a9785a8bfef567))
110
-
111
- ## [1.1.2](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.1...v1.1.2) (2026-03-18)
112
-
113
-
114
- ### Bug Fixes
115
-
116
- * remove unused id-token permission from test_tag_release workflow ([a34000d](https://github.com/project-david-ai/projectdavid-orm/commit/a34000da052f404db798da691ab2c5fa5815eeeb))
117
-
118
- ## [1.1.1](https://github.com/project-david-ai/projectdavid-orm/compare/v1.1.0...v1.1.1) (2026-03-18)
119
-
120
-
121
- ### Bug Fixes
122
-
123
- * update PyPI repository URLs and add attestations flag in test_tag_release workflow ([a2dca7e](https://github.com/project-david-ai/projectdavid-orm/commit/a2dca7e521732302f8d0acb86390f3f061aae07e))
124
-
125
- # [1.1.0](https://github.com/project-david-ai/projectdavid-orm/compare/v1.0.0...v1.1.0) (2026-03-18)
126
-
127
-
128
- ### Bug Fixes
129
-
130
- * remove redundant newline in README.md instructions ([dea758d](https://github.com/project-david-ai/projectdavid-orm/commit/dea758d4d80eb0e6f2b75e80e712652779afbe63))
131
-
132
-
133
- ### Features
134
-
135
- * add version.py for managing application versioning ([6ec6e42](https://github.com/project-david-ai/projectdavid-orm/commit/6ec6e425eba9e790e2a4a4c24aea5fa60c1f1057))
136
-
137
- # 1.0.0 (2026-03-18)
138
-
139
-
140
- ### Bug Fixes
141
-
142
- * codebase for improved readability by consistently formatting SQLAlchemy column definitions and relationships. Adjust test log messages for clarity. ([e302b55](https://github.com/project-david-ai/projectdavid-orm/commit/e302b5580d35537db028a4cbea23d2d7f833cffc))
143
-
144
-
145
- ### Features
146
-
147
- * Set up release automation and project metadata files, including .releaserc.json, scripts, and editor configurations. ([4a747bb](https://github.com/project-david-ai/projectdavid-orm/commit/4a747bbf133f19c31629587955dd009545e241b5))
148
-
149
- # Changelog
150
-
151
- All notable changes to this project will be documented in this file.
152
-
153
- The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
154
- and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
155
-
156
- ---