nextrec 0.5.3__tar.gz → 0.5.5__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 (228) hide show
  1. {nextrec-0.5.3 → nextrec-0.5.5}/.gitignore +3 -1
  2. {nextrec-0.5.3 → nextrec-0.5.5}/PKG-INFO +4 -4
  3. {nextrec-0.5.3 → nextrec-0.5.5}/README.md +3 -3
  4. {nextrec-0.5.3 → nextrec-0.5.5}/README_en.md +3 -3
  5. {nextrec-0.5.3 → nextrec-0.5.5}/docs/rtd/conf.py +1 -1
  6. nextrec-0.5.5/nextrec/__version__.py +1 -0
  7. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/basic/model.py +38 -16
  8. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/cli.py +6 -8
  9. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/utils/config.py +5 -1
  10. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/feature_config.yaml +13 -13
  11. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/predict_config_template.yaml +1 -1
  12. {nextrec-0.5.3 → nextrec-0.5.5}/pyproject.toml +1 -1
  13. nextrec-0.5.5/ui/nextrec-ui/Dockerfile +11 -0
  14. nextrec-0.5.5/ui/nextrec-ui/docker-compose.yml +7 -0
  15. nextrec-0.5.5/ui/nextrec-ui/index.html +16 -0
  16. nextrec-0.5.5/ui/nextrec-ui/src/App.vue +152 -0
  17. nextrec-0.5.5/ui/nextrec-ui/src/assets/logo.png +0 -0
  18. nextrec-0.5.5/ui/nextrec-ui/src/main.js +6 -0
  19. nextrec-0.5.5/ui/nextrec-ui/src/pages/FeaturePage.vue +253 -0
  20. nextrec-0.5.5/ui/nextrec-ui/src/pages/ModelPage.vue +365 -0
  21. nextrec-0.5.5/ui/nextrec-ui/src/pages/PredictPage.vue +141 -0
  22. nextrec-0.5.5/ui/nextrec-ui/src/pages/TrainPage.vue +377 -0
  23. nextrec-0.5.5/ui/nextrec-ui/src/presets/afm.yaml +24 -0
  24. nextrec-0.5.5/ui/nextrec-ui/src/presets/apg.yaml +14 -0
  25. nextrec-0.5.5/ui/nextrec-ui/src/presets/autoint.yaml +34 -0
  26. nextrec-0.5.5/ui/nextrec-ui/src/presets/cross_stitch.yaml +25 -0
  27. nextrec-0.5.5/ui/nextrec-ui/src/presets/dcn.yaml +33 -0
  28. nextrec-0.5.5/ui/nextrec-ui/src/presets/deepfm.yaml +28 -0
  29. nextrec-0.5.5/ui/nextrec-ui/src/presets/din.yaml +35 -0
  30. nextrec-0.5.5/ui/nextrec-ui/src/presets/escm.yaml +21 -0
  31. nextrec-0.5.5/ui/nextrec-ui/src/presets/esmm.yaml +32 -0
  32. nextrec-0.5.5/ui/nextrec-ui/src/presets/fibinet.yaml +26 -0
  33. nextrec-0.5.5/ui/nextrec-ui/src/presets/fm.yaml +23 -0
  34. nextrec-0.5.5/ui/nextrec-ui/src/presets/hmoe.yaml +35 -0
  35. nextrec-0.5.5/ui/nextrec-ui/src/presets/masknet.yaml +40 -0
  36. nextrec-0.5.5/ui/nextrec-ui/src/presets/mmoe.yaml +38 -0
  37. nextrec-0.5.5/ui/nextrec-ui/src/presets/pepnet.yaml +26 -0
  38. nextrec-0.5.5/ui/nextrec-ui/src/presets/ple.yaml +50 -0
  39. nextrec-0.5.5/ui/nextrec-ui/src/presets/pnn.yaml +20 -0
  40. nextrec-0.5.5/ui/nextrec-ui/src/presets/poso.yaml +52 -0
  41. nextrec-0.5.5/ui/nextrec-ui/src/presets/share_bottom.yaml +35 -0
  42. nextrec-0.5.5/ui/nextrec-ui/src/presets/widedeep.yaml +26 -0
  43. nextrec-0.5.5/ui/nextrec-ui/src/presets/xdeepfm.yaml +33 -0
  44. nextrec-0.5.5/ui/nextrec-ui/src/router/index.js +20 -0
  45. nextrec-0.5.5/ui/nextrec-ui/src/store/configStore.js +192 -0
  46. nextrec-0.5.5/ui/nextrec-ui/src/styles.css +410 -0
  47. nextrec-0.5.5/ui/nextrec-ui/src/utils/buildTrainConfig.js +65 -0
  48. nextrec-0.5.5/ui/nextrec-ui/src/utils/download.js +11 -0
  49. nextrec-0.5.5/ui/nextrec-ui/src/utils/yaml.js +16 -0
  50. nextrec-0.5.5/ui/nextrec-ui/src/utils/zip.js +17 -0
  51. nextrec-0.5.5/ui/nextrec-ui/vite.config.js +9 -0
  52. nextrec-0.5.3/nextrec/__version__.py +0 -1
  53. {nextrec-0.5.3 → nextrec-0.5.5}/.github/workflows/publish.yml +0 -0
  54. {nextrec-0.5.3 → nextrec-0.5.5}/.github/workflows/tests.yml +0 -0
  55. {nextrec-0.5.3 → nextrec-0.5.5}/.readthedocs.yaml +0 -0
  56. {nextrec-0.5.3 → nextrec-0.5.5}/CODE_OF_CONDUCT.md +0 -0
  57. {nextrec-0.5.3 → nextrec-0.5.5}/CONTRIBUTING.md +0 -0
  58. {nextrec-0.5.3 → nextrec-0.5.5}/LICENSE +0 -0
  59. {nextrec-0.5.3 → nextrec-0.5.5}/MANIFEST.in +0 -0
  60. {nextrec-0.5.3 → nextrec-0.5.5}/assets/Feature Configuration.png +0 -0
  61. {nextrec-0.5.3 → nextrec-0.5.5}/assets/Model Parameters.png +0 -0
  62. {nextrec-0.5.3 → nextrec-0.5.5}/assets/Training Configuration.png +0 -0
  63. {nextrec-0.5.3 → nextrec-0.5.5}/assets/Training logs.png +0 -0
  64. {nextrec-0.5.3 → nextrec-0.5.5}/assets/logo.png +0 -0
  65. {nextrec-0.5.3 → nextrec-0.5.5}/assets/mmoe_tutorial.png +0 -0
  66. {nextrec-0.5.3 → nextrec-0.5.5}/assets/nextrec_diagram.png +0 -0
  67. {nextrec-0.5.3 → nextrec-0.5.5}/assets/test data.png +0 -0
  68. {nextrec-0.5.3 → nextrec-0.5.5}/dataset/ctcvr_task.csv +0 -0
  69. {nextrec-0.5.3 → nextrec-0.5.5}/dataset/ecommerce_task.csv +0 -0
  70. {nextrec-0.5.3 → nextrec-0.5.5}/dataset/match_task.csv +0 -0
  71. {nextrec-0.5.3 → nextrec-0.5.5}/dataset/movielens_100k.csv +0 -0
  72. {nextrec-0.5.3 → nextrec-0.5.5}/dataset/multitask_task.csv +0 -0
  73. {nextrec-0.5.3 → nextrec-0.5.5}/dataset/ranking_task.csv +0 -0
  74. {nextrec-0.5.3 → nextrec-0.5.5}/docs/en/Getting started guide.md +0 -0
  75. {nextrec-0.5.3 → nextrec-0.5.5}/docs/rtd/Makefile +0 -0
  76. {nextrec-0.5.3 → nextrec-0.5.5}/docs/rtd/index.md +0 -0
  77. {nextrec-0.5.3 → nextrec-0.5.5}/docs/rtd/make.bat +0 -0
  78. {nextrec-0.5.3 → nextrec-0.5.5}/docs/rtd/modules.rst +0 -0
  79. {nextrec-0.5.3 → nextrec-0.5.5}/docs/rtd/nextrec.basic.rst +0 -0
  80. {nextrec-0.5.3 → nextrec-0.5.5}/docs/rtd/nextrec.data.rst +0 -0
  81. {nextrec-0.5.3 → nextrec-0.5.5}/docs/rtd/nextrec.loss.rst +0 -0
  82. {nextrec-0.5.3 → nextrec-0.5.5}/docs/rtd/nextrec.rst +0 -0
  83. {nextrec-0.5.3 → nextrec-0.5.5}/docs/rtd/nextrec.utils.rst +0 -0
  84. {nextrec-0.5.3 → nextrec-0.5.5}/docs/rtd/requirements.txt +0 -0
  85. {nextrec-0.5.3 → nextrec-0.5.5}/docs/zh//345/277/253/351/200/237/344/270/212/346/211/213.md" +0 -0
  86. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/__init__.py +0 -0
  87. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/basic/__init__.py +0 -0
  88. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/basic/activation.py +0 -0
  89. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/basic/asserts.py +0 -0
  90. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/basic/callback.py +0 -0
  91. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/basic/features.py +0 -0
  92. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/basic/heads.py +0 -0
  93. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/basic/layers.py +0 -0
  94. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/basic/loggers.py +0 -0
  95. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/basic/metrics.py +0 -0
  96. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/basic/session.py +0 -0
  97. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/basic/summary.py +0 -0
  98. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/data/__init__.py +0 -0
  99. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/data/batch_utils.py +0 -0
  100. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/data/data_processing.py +0 -0
  101. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/data/data_utils.py +0 -0
  102. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/data/dataloader.py +0 -0
  103. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/data/preprocessor.py +0 -0
  104. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/loss/__init__.py +0 -0
  105. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/loss/grad_norm.py +0 -0
  106. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/loss/listwise.py +0 -0
  107. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/loss/pairwise.py +0 -0
  108. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/loss/pointwise.py +0 -0
  109. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/generative/__init__.py +0 -0
  110. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/generative/tiger.py +0 -0
  111. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/multi_task/[pre]aitm.py +0 -0
  112. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/multi_task/[pre]snr_trans.py +0 -0
  113. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/multi_task/__init__.py +0 -0
  114. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/multi_task/apg.py +0 -0
  115. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/multi_task/cross_stitch.py +0 -0
  116. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/multi_task/escm.py +0 -0
  117. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/multi_task/esmm.py +0 -0
  118. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/multi_task/hmoe.py +0 -0
  119. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/multi_task/mmoe.py +0 -0
  120. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/multi_task/pepnet.py +0 -0
  121. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/multi_task/ple.py +0 -0
  122. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/multi_task/poso.py +0 -0
  123. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/multi_task/share_bottom.py +0 -0
  124. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/ranking/__init__.py +0 -0
  125. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/ranking/afm.py +0 -0
  126. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/ranking/autoint.py +0 -0
  127. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/ranking/dcn.py +0 -0
  128. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/ranking/dcn_v2.py +0 -0
  129. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/ranking/deepfm.py +0 -0
  130. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/ranking/dien.py +0 -0
  131. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/ranking/din.py +0 -0
  132. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/ranking/eulernet.py +0 -0
  133. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/ranking/ffm.py +0 -0
  134. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/ranking/fibinet.py +0 -0
  135. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/ranking/fm.py +0 -0
  136. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/ranking/lr.py +0 -0
  137. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/ranking/masknet.py +0 -0
  138. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/ranking/pnn.py +0 -0
  139. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/ranking/widedeep.py +0 -0
  140. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/ranking/xdeepfm.py +0 -0
  141. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/representation/__init__.py +0 -0
  142. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/representation/rqvae.py +0 -0
  143. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/retrieval/__init__.py +0 -0
  144. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/retrieval/dssm.py +0 -0
  145. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/retrieval/dssm_v2.py +0 -0
  146. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/retrieval/mind.py +0 -0
  147. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/retrieval/sdm.py +0 -0
  148. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/retrieval/youtube_dnn.py +0 -0
  149. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/sequential/hstu.py +0 -0
  150. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/tree_base/__init__.py +0 -0
  151. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/tree_base/base.py +0 -0
  152. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/tree_base/catboost.py +0 -0
  153. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/tree_base/lightgbm.py +0 -0
  154. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/models/tree_base/xgboost.py +0 -0
  155. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/utils/__init__.py +0 -0
  156. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/utils/console.py +0 -0
  157. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/utils/data.py +0 -0
  158. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/utils/embedding.py +0 -0
  159. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/utils/loss.py +0 -0
  160. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/utils/model.py +0 -0
  161. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/utils/onnx_utils.py +0 -0
  162. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/utils/torch_utils.py +0 -0
  163. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec/utils/types.py +0 -0
  164. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/NextRec-CLI.md +0 -0
  165. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/NextRec-CLI_zh.md +0 -0
  166. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/afm.yaml +0 -0
  167. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/apg.yaml +0 -0
  168. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/autoint.yaml +0 -0
  169. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/cross_stitch.yaml +0 -0
  170. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/dcn.yaml +0 -0
  171. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/deepfm.yaml +0 -0
  172. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/din.yaml +0 -0
  173. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/escm.yaml +0 -0
  174. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/esmm.yaml +0 -0
  175. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/fibinet.yaml +0 -0
  176. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/fm.yaml +0 -0
  177. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/hmoe.yaml +0 -0
  178. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/masknet.yaml +0 -0
  179. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/mmoe.yaml +0 -0
  180. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/pepnet.yaml +0 -0
  181. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/ple.yaml +0 -0
  182. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/pnn.yaml +0 -0
  183. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/poso.yaml +0 -0
  184. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/share_bottom.yaml +0 -0
  185. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/widedeep.yaml +0 -0
  186. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/model_configs/xdeepfm.yaml +0 -0
  187. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/predict_config.yaml +0 -0
  188. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/train_config.yaml +0 -0
  189. {nextrec-0.5.3 → nextrec-0.5.5}/nextrec_cli_preset/train_config_template.yaml +0 -0
  190. {nextrec-0.5.3 → nextrec-0.5.5}/pytest.ini +0 -0
  191. {nextrec-0.5.3 → nextrec-0.5.5}/requirements.txt +0 -0
  192. {nextrec-0.5.3 → nextrec-0.5.5}/scripts/format_code.py +0 -0
  193. {nextrec-0.5.3 → nextrec-0.5.5}/scripts/profile_predict.py +0 -0
  194. {nextrec-0.5.3 → nextrec-0.5.5}/test/__init__.py +0 -0
  195. {nextrec-0.5.3 → nextrec-0.5.5}/test/conftest.py +0 -0
  196. {nextrec-0.5.3 → nextrec-0.5.5}/test/helpers.py +0 -0
  197. {nextrec-0.5.3 → nextrec-0.5.5}/test/run_tests.py +0 -0
  198. {nextrec-0.5.3 → nextrec-0.5.5}/test/test_base_model_regularization.py +0 -0
  199. {nextrec-0.5.3 → nextrec-0.5.5}/test/test_generative_models.py +0 -0
  200. {nextrec-0.5.3 → nextrec-0.5.5}/test/test_layers.py +0 -0
  201. {nextrec-0.5.3 → nextrec-0.5.5}/test/test_losses.py +0 -0
  202. {nextrec-0.5.3 → nextrec-0.5.5}/test/test_match_models.py +0 -0
  203. {nextrec-0.5.3 → nextrec-0.5.5}/test/test_multitask_models.py +0 -0
  204. {nextrec-0.5.3 → nextrec-0.5.5}/test/test_onnx_models.py +0 -0
  205. {nextrec-0.5.3 → nextrec-0.5.5}/test/test_preprocessor.py +0 -0
  206. {nextrec-0.5.3 → nextrec-0.5.5}/test/test_ranking_models.py +0 -0
  207. {nextrec-0.5.3 → nextrec-0.5.5}/test/test_utils_console.py +0 -0
  208. {nextrec-0.5.3 → nextrec-0.5.5}/test/test_utils_data.py +0 -0
  209. {nextrec-0.5.3 → nextrec-0.5.5}/test/test_utils_embedding.py +0 -0
  210. {nextrec-0.5.3 → nextrec-0.5.5}/test_requirements.txt +0 -0
  211. {nextrec-0.5.3 → nextrec-0.5.5}/tutorials/distributed/example_distributed_training.py +0 -0
  212. {nextrec-0.5.3 → nextrec-0.5.5}/tutorials/distributed/example_distributed_training_large_dataset.py +0 -0
  213. {nextrec-0.5.3 → nextrec-0.5.5}/tutorials/example_match.py +0 -0
  214. {nextrec-0.5.3 → nextrec-0.5.5}/tutorials/example_multitask.py +0 -0
  215. {nextrec-0.5.3 → nextrec-0.5.5}/tutorials/example_onnx.py +0 -0
  216. {nextrec-0.5.3 → nextrec-0.5.5}/tutorials/example_ranking_din.py +0 -0
  217. {nextrec-0.5.3 → nextrec-0.5.5}/tutorials/example_tree.py +0 -0
  218. {nextrec-0.5.3 → nextrec-0.5.5}/tutorials/movielen_match_dssm.py +0 -0
  219. {nextrec-0.5.3 → nextrec-0.5.5}/tutorials/movielen_ranking_deepfm.py +0 -0
  220. {nextrec-0.5.3 → nextrec-0.5.5}/tutorials/notebooks/en/Build semantic ID with RQ-VAE.ipynb +0 -0
  221. {nextrec-0.5.3 → nextrec-0.5.5}/tutorials/notebooks/en/Hands on dataprocessor.ipynb +0 -0
  222. {nextrec-0.5.3 → nextrec-0.5.5}/tutorials/notebooks/en/Hands on nextrec.ipynb +0 -0
  223. {nextrec-0.5.3 → nextrec-0.5.5}/tutorials/notebooks/zh//344/275/277/347/224/250RQ-VAE/346/236/204/345/273/272/350/257/255/344/271/211ID.ipynb" +0 -0
  224. {nextrec-0.5.3 → nextrec-0.5.5}/tutorials/notebooks/zh//345/246/202/344/275/225/344/275/277/347/224/250DataProcessor/350/277/233/350/241/214/351/242/204/345/244/204/347/220/206.ipynb" +0 -0
  225. {nextrec-0.5.3 → nextrec-0.5.5}/tutorials/notebooks/zh//345/277/253/351/200/237/345/205/245/351/227/250nextrec.ipynb" +0 -0
  226. {nextrec-0.5.3 → nextrec-0.5.5}/tutorials/run_all_match_models.py +0 -0
  227. {nextrec-0.5.3 → nextrec-0.5.5}/tutorials/run_all_multitask_models.py +0 -0
  228. {nextrec-0.5.3 → nextrec-0.5.5}/tutorials/run_all_ranking_models.py +0 -0
@@ -130,4 +130,6 @@ pypirc.template
130
130
  docs/rtd/_build/
131
131
 
132
132
  *.onnx
133
- artifacts/
133
+ artifacts/
134
+
135
+ node_modules/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nextrec
3
- Version: 0.5.3
3
+ Version: 0.5.5
4
4
  Summary: A comprehensive recommendation library with match, ranking, and multi-task learning models
5
5
  Project-URL: Homepage, https://github.com/zerolovesea/NextRec
6
6
  Project-URL: Repository, https://github.com/zerolovesea/NextRec
@@ -73,7 +73,7 @@ Description-Content-Type: text/markdown
73
73
  ![Python](https://img.shields.io/badge/Python-3.10+-blue.svg)
74
74
  ![PyTorch](https://img.shields.io/badge/PyTorch-1.10+-ee4c2c.svg)
75
75
  ![License](https://img.shields.io/badge/License-Apache%202.0-green.svg)
76
- ![Version](https://img.shields.io/badge/Version-0.5.3-orange.svg)
76
+ ![Version](https://img.shields.io/badge/Version-0.5.5-orange.svg)
77
77
  [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/zerolovesea/NextRec)
78
78
 
79
79
  中文文档 | [English Version](README_en.md)
@@ -259,11 +259,11 @@ nextrec --mode=predict --predict_config=path/to/predict_config.yaml
259
259
 
260
260
  预测结果固定保存到 `{checkpoint_path}/predictions/{name}.{save_data_format}`。
261
261
 
262
- > 截止当前版本0.5.3,NextRec CLI支持单机训练,分布式训练相关功能尚在开发中。
262
+ > 截止当前版本0.5.5,NextRec CLI支持单机训练,分布式训练相关功能尚在开发中。
263
263
 
264
264
  ## 兼容平台
265
265
 
266
- 当前最新版本为0.5.3,所有模型和测试代码均已在以下平台通过验证,如果开发者在使用中遇到兼容问题,请在issue区提出错误报告及系统版本:
266
+ 当前最新版本为0.5.5,所有模型和测试代码均已在以下平台通过验证,如果开发者在使用中遇到兼容问题,请在issue区提出错误报告及系统版本:
267
267
 
268
268
  | 平台 | 配置 |
269
269
  |------|------|
@@ -8,7 +8,7 @@
8
8
  ![Python](https://img.shields.io/badge/Python-3.10+-blue.svg)
9
9
  ![PyTorch](https://img.shields.io/badge/PyTorch-1.10+-ee4c2c.svg)
10
10
  ![License](https://img.shields.io/badge/License-Apache%202.0-green.svg)
11
- ![Version](https://img.shields.io/badge/Version-0.5.3-orange.svg)
11
+ ![Version](https://img.shields.io/badge/Version-0.5.5-orange.svg)
12
12
  [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/zerolovesea/NextRec)
13
13
 
14
14
  中文文档 | [English Version](README_en.md)
@@ -194,11 +194,11 @@ nextrec --mode=predict --predict_config=path/to/predict_config.yaml
194
194
 
195
195
  预测结果固定保存到 `{checkpoint_path}/predictions/{name}.{save_data_format}`。
196
196
 
197
- > 截止当前版本0.5.3,NextRec CLI支持单机训练,分布式训练相关功能尚在开发中。
197
+ > 截止当前版本0.5.5,NextRec CLI支持单机训练,分布式训练相关功能尚在开发中。
198
198
 
199
199
  ## 兼容平台
200
200
 
201
- 当前最新版本为0.5.3,所有模型和测试代码均已在以下平台通过验证,如果开发者在使用中遇到兼容问题,请在issue区提出错误报告及系统版本:
201
+ 当前最新版本为0.5.5,所有模型和测试代码均已在以下平台通过验证,如果开发者在使用中遇到兼容问题,请在issue区提出错误报告及系统版本:
202
202
 
203
203
  | 平台 | 配置 |
204
204
  |------|------|
@@ -8,7 +8,7 @@
8
8
  ![Python](https://img.shields.io/badge/Python-3.10+-blue.svg)
9
9
  ![PyTorch](https://img.shields.io/badge/PyTorch-1.10+-ee4c2c.svg)
10
10
  ![License](https://img.shields.io/badge/License-Apache%202.0-green.svg)
11
- ![Version](https://img.shields.io/badge/Version-0.5.3-orange.svg)
11
+ ![Version](https://img.shields.io/badge/Version-0.5.5-orange.svg)
12
12
  [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/zerolovesea/NextRec)
13
13
 
14
14
  English | [中文文档](README.md)
@@ -197,11 +197,11 @@ nextrec --mode=predict --predict_config=path/to/predict_config.yaml
197
197
 
198
198
  Prediction outputs are saved under `{checkpoint_path}/predictions/{name}.{save_data_format}`.
199
199
 
200
- > As of version 0.5.3, NextRec CLI supports single-machine training; distributed training features are currently under development.
200
+ > As of version 0.5.5, NextRec CLI supports single-machine training; distributed training features are currently under development.
201
201
 
202
202
  ## Platform Compatibility
203
203
 
204
- The current version is 0.5.3. All models and test code have been validated on the following platforms. If you encounter compatibility issues, please report them in the issue tracker with your system version:
204
+ The current version is 0.5.5. All models and test code have been validated on the following platforms. If you encounter compatibility issues, please report them in the issue tracker with your system version:
205
205
 
206
206
  | Platform | Configuration |
207
207
  |----------|---------------|
@@ -11,7 +11,7 @@ sys.path.insert(0, str(PROJECT_ROOT / "nextrec"))
11
11
  project = "NextRec"
12
12
  copyright = "2026, Yang Zhou"
13
13
  author = "Yang Zhou"
14
- release = "0.5.3"
14
+ release = "0.5.5"
15
15
 
16
16
  extensions = [
17
17
  "myst_parser",
@@ -0,0 +1 @@
1
+ __version__ = "0.5.5"
@@ -2099,6 +2099,7 @@ class BaseModel(SummarySet, FeatureSet, nn.Module):
2099
2099
  ]
2100
2100
 
2101
2101
  ctx = mp.get_context("spawn")
2102
+ error_queue = ctx.SimpleQueue()
2102
2103
  processes = []
2103
2104
  for rank in range(num_processes):
2104
2105
  process = ctx.Process(
@@ -2115,6 +2116,7 @@ class BaseModel(SummarySet, FeatureSet, nn.Module):
2115
2116
  processor,
2116
2117
  rank,
2117
2118
  num_processes,
2119
+ error_queue,
2118
2120
  ),
2119
2121
  )
2120
2122
  process.start()
@@ -2127,8 +2129,18 @@ class BaseModel(SummarySet, FeatureSet, nn.Module):
2127
2129
 
2128
2130
  for process in processes:
2129
2131
  if process.exitcode not in (0, None):
2132
+ errors = []
2133
+ try:
2134
+ while not error_queue.empty():
2135
+ errors.append(error_queue.get_nowait())
2136
+ except Exception:
2137
+ pass
2138
+ error_text = (
2139
+ "\n\n".join(errors) if errors else "No worker traceback captured."
2140
+ )
2130
2141
  raise RuntimeError(
2131
- "[BaseModel-predict-streaming Error] One or more inference processes failed."
2142
+ "[BaseModel-predict-streaming Error] One or more inference processes failed.\n"
2143
+ + error_text
2132
2144
  )
2133
2145
  # Merge part files
2134
2146
  existing_parts = [p for p in part_paths if p.exists()]
@@ -2827,22 +2839,32 @@ def predict_streaming_worker(
2827
2839
  processor: Any | None,
2828
2840
  shard_rank: int,
2829
2841
  shard_count: int,
2842
+ error_queue: "mp.SimpleQueue[str] | None" = None,
2830
2843
  ) -> None:
2831
- model.eval()
2832
- model.predict_streaming(
2833
- data=data_path,
2834
- batch_size=batch_size,
2835
- save_path=save_path,
2836
- save_format=save_format,
2837
- stream_chunk_size=stream_chunk_size,
2838
- return_dataframe=False,
2839
- num_workers=num_workers,
2840
- prefetch_factor=prefetch_factor,
2841
- processor=processor,
2842
- num_processes=1,
2843
- shard_rank=shard_rank,
2844
- shard_count=shard_count,
2845
- )
2844
+ try:
2845
+ model.eval()
2846
+ model.predict_streaming(
2847
+ data=data_path,
2848
+ batch_size=batch_size,
2849
+ save_path=save_path,
2850
+ save_format=save_format,
2851
+ stream_chunk_size=stream_chunk_size,
2852
+ return_dataframe=False,
2853
+ num_workers=num_workers,
2854
+ prefetch_factor=prefetch_factor,
2855
+ processor=processor,
2856
+ num_processes=1,
2857
+ shard_rank=shard_rank,
2858
+ shard_count=shard_count,
2859
+ )
2860
+ except Exception:
2861
+ if error_queue is not None:
2862
+ import traceback
2863
+
2864
+ error_queue.put(
2865
+ f"[PredictWorker Error] rank={shard_rank}\n{traceback.format_exc()}"
2866
+ )
2867
+ raise
2846
2868
 
2847
2869
 
2848
2870
  class BaseMatchModel(BaseModel):
@@ -25,7 +25,7 @@ import resource
25
25
  import sys
26
26
  import time
27
27
  from pathlib import Path
28
- from typing import Any, Dict, List
28
+ from typing import Any, Dict
29
29
 
30
30
  import pandas as pd
31
31
 
@@ -137,7 +137,7 @@ def train_model(train_config_path: str) -> None:
137
137
  model_cfg = read_yaml(model_cfg_path)
138
138
 
139
139
  # Extract id_column from data config for GAUC metrics
140
- id_column = data_cfg.get("id_column") or data_cfg.get("user_id_column")
140
+ id_column = data_cfg.get("id_column")
141
141
  id_columns = [id_column] if id_column else []
142
142
 
143
143
  log_cli_section("Data")
@@ -378,6 +378,7 @@ def train_model(train_config_path: str) -> None:
378
378
  sparse_features,
379
379
  sequence_features,
380
380
  target,
381
+ id_columns,
381
382
  device,
382
383
  )
383
384
 
@@ -585,19 +586,16 @@ def predict_model(predict_config_path: str) -> None:
585
586
  sparse_features=sparse_features,
586
587
  sequence_features=sequence_features,
587
588
  target=target_cols,
589
+ id_columns=id_columns,
588
590
  device=predict_cfg.get("device", "cpu"),
589
591
  )
590
- model.id_columns = id_columns
592
+
591
593
  model.load_model(
592
594
  model_file, map_location=predict_cfg.get("device", "cpu"), verbose=True
593
595
  )
594
596
 
595
- id_columns = []
596
- if predict_cfg.get("id_column"):
597
- id_columns = [predict_cfg["id_column"]]
598
- model.id_columns = id_columns
599
-
600
597
  effective_id_columns = id_columns or model.id_columns
598
+
601
599
  log_cli_section("Features")
602
600
  log_kv_lines(
603
601
  [
@@ -388,6 +388,7 @@ def build_model_instance(
388
388
  sparse_features: List["SparseFeature"],
389
389
  sequence_features: List["SequenceFeature"],
390
390
  target: List[str],
391
+ id_columns: list[str] | str | None,
391
392
  device: str,
392
393
  ) -> Any:
393
394
  """
@@ -400,6 +401,7 @@ def build_model_instance(
400
401
  sparse_features: List of sparse feature objects
401
402
  sequence_features: List of sequence feature objects
402
403
  target: List of target column names
404
+ id_columns: Identifier column name(s) for GAUC or ID passthrough
403
405
  device: Device string (e.g., 'cpu', 'cuda:0')
404
406
  """
405
407
  dense_map = {f.name: f for f in dense_features}
@@ -436,7 +438,7 @@ def build_model_instance(
436
438
  param.kind == inspect.Parameter.VAR_KEYWORD for param in sig_params.values()
437
439
  )
438
440
 
439
- init_kwargs: Dict[str, Any] = dict(params_cfg)
441
+ init_kwargs = dict(params_cfg)
440
442
 
441
443
  # Explicit bindings (model_config.feature_bindings) take priority
442
444
  for param_name, binding in feature_bindings_cfg.items():
@@ -517,6 +519,8 @@ def build_model_instance(
517
519
 
518
520
  if accepts("target"):
519
521
  init_kwargs.setdefault("target", target)
522
+ if accepts("id_columns") or accepts_var_kwargs:
523
+ init_kwargs.setdefault("id_columns", id_columns)
520
524
  if accepts("device"):
521
525
  init_kwargs.setdefault("device", device)
522
526
 
@@ -7,44 +7,44 @@
7
7
  dense:
8
8
  user_active_days_7:
9
9
  processor_config: {type: numeric, scaler: standard}
10
- embedding_config: {name: user_active_days_7, input_dim: 1, embedding_dim: 8, use_projection: false}
10
+ embedding_config: {input_dim: 1, proj_dim: 8, use_projection: false}
11
11
  user_ctr:
12
12
  processor_config: {type: numeric, scaler: standard}
13
- embedding_config: {name: user_ctr, input_dim: 1, embedding_dim: 8, use_projection: false}
13
+ embedding_config: {input_dim: 1, proj_dim: 8, use_projection: false}
14
14
  item_price:
15
15
  processor_config: {type: numeric, scaler: standard}
16
- embedding_config: {name: item_price, input_dim: 1, embedding_dim: 8, use_projection: false}
16
+ embedding_config: {input_dim: 1, proj_dim: 8, use_projection: false}
17
17
  item_popularity:
18
18
  processor_config: {type: numeric, scaler: standard}
19
- embedding_config: {name: item_popularity, input_dim: 1, embedding_dim: 8, use_projection: false}
19
+ embedding_config: {input_dim: 1, proj_dim: 8, use_projection: false}
20
20
  time_since_last_click:
21
21
  processor_config: {type: numeric, scaler: standard}
22
- embedding_config: {name: time_since_last_click, input_dim: 1, embedding_dim: 8, use_projection: false}
22
+ embedding_config: {input_dim: 1, proj_dim: 8, use_projection: false}
23
23
 
24
24
  sparse:
25
25
  user_id:
26
26
  processor_config: {type: sparse, encode_method: hash, hash_size: 100000, min_freq: 1}
27
- embedding_config: {name: user_id, embedding_dim: 8, padding_idx: 0}
27
+ embedding_config: {name: user_id, embedding_name: user_id, embedding_dim: 8, padding_idx: 0}
28
28
  item:
29
29
  processor_config: {type: sparse, encode_method: hash, hash_size: 5000, min_freq: 1}
30
- embedding_config: {name: item, embedding_dim: 8, padding_idx: 0}
30
+ embedding_config: {name: item, embedding_name: item, embedding_dim: 8, padding_idx: 0}
31
31
  gender:
32
32
  processor_config: {type: sparse, encode_method: hash, hash_size: 10, min_freq: 1}
33
- embedding_config: {name: gender, embedding_dim: 8, padding_idx: 0}
33
+ embedding_config: {name: gender, embedding_name: gender, embedding_dim: 8, padding_idx: 0}
34
34
  city:
35
35
  processor_config: {type: sparse, encode_method: hash, hash_size: 20, min_freq: 1}
36
- embedding_config: {name: city, embedding_dim: 8, padding_idx: 0}
36
+ embedding_config: {name: city, embedding_name: city, embedding_dim: 8, padding_idx: 0}
37
37
  device:
38
38
  processor_config: {type: sparse, encode_method: hash, hash_size: 10, min_freq: 1}
39
- embedding_config: {name: device, embedding_dim: 8, padding_idx: 0}
39
+ embedding_config: {name: device, embedding_name: device, embedding_dim: 8, padding_idx: 0}
40
40
  channel:
41
41
  processor_config: {type: sparse, encode_method: hash, hash_size: 10, min_freq: 1}
42
- embedding_config: {name: channel, embedding_dim: 8, padding_idx: 0}
42
+ embedding_config: {name: channel, embedding_name: channel, embedding_dim: 8, padding_idx: 0}
43
43
  age_bucket:
44
44
  processor_config: {type: sparse, encode_method: hash, hash_size: 20, min_freq: 1}
45
- embedding_config: {name: age_bucket, embedding_dim: 8, padding_idx: 0}
45
+ embedding_config: {name: age_bucket, embedding_name: age_bucket, embedding_dim: 8, padding_idx: 0}
46
46
 
47
47
  sequence:
48
48
  hist_item_seq:
49
49
  processor_config: {type: sequence, encode_method: hash, hash_size: 5000, min_freq: 1, max_len: 30, pad_value: 0, truncate: post, separator: ','}
50
- embedding_config: {name: hist_item_seq, vocab_size: 5000, max_len: 30, combiner: mean, embedding_dim: 8, padding_idx: 0, shared_with: item}
50
+ embedding_config: {name: hist_item_seq, embedding_name: hist_item_seq, vocab_size: 5000, max_len: 30, combiner: mean, embedding_dim: 8, padding_idx: 0}
@@ -30,7 +30,7 @@ predict:
30
30
  # ----- Data Format Settings -----
31
31
  source_data_format: parquet # Input data format: csv, parquet, etc.
32
32
  # Use 'auto' for automatic detection
33
-
33
+
34
34
  # ----- Identification Settings -----
35
35
  id_column: user_id # Column name for user/sample IDs
36
36
  # Will be included in prediction output
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "nextrec"
3
- version = "0.5.3"
3
+ version = "0.5.5"
4
4
  description = "A comprehensive recommendation library with match, ranking, and multi-task learning models"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -0,0 +1,11 @@
1
+ FROM node:20-alpine
2
+
3
+ WORKDIR /app
4
+
5
+ COPY package*.json ./
6
+ RUN npm install
7
+
8
+ COPY . .
9
+
10
+ EXPOSE 15173
11
+ CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0", "--port", "15173"]
@@ -0,0 +1,7 @@
1
+ services:
2
+ nextrec-ui:
3
+ build: .
4
+ ports:
5
+ - "15173:15173"
6
+ environment:
7
+ - NODE_ENV=development
@@ -0,0 +1,16 @@
1
+ <!doctype html>
2
+ <html lang="zh">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>NextRec Studio</title>
7
+ <link rel="icon" type="image/png" href="/src/assets/logo.png" />
8
+ <link rel="preconnect" href="https://fonts.googleapis.com">
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
+ <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500&display=swap" rel="stylesheet">
11
+ </head>
12
+ <body>
13
+ <div id="app"></div>
14
+ <script type="module" src="/src/main.js"></script>
15
+ </body>
16
+ </html>
@@ -0,0 +1,152 @@
1
+ <template>
2
+ <div class="app-shell">
3
+ <aside class="sidebar" ref="sidebarRef">
4
+ <div class="brand">
5
+ <img :src="logoUrl" alt="NextRec Logo" />
6
+ </div>
7
+ <nav class="nav">
8
+ <RouterLink to="/train">{{ t('训练配置', 'Training') }}</RouterLink>
9
+ <RouterLink to="/feature">{{ t('特征配置', 'Features') }}</RouterLink>
10
+ <RouterLink to="/model">{{ t('模型配置', 'Models') }}</RouterLink>
11
+ <RouterLink to="/predict">{{ t('推理配置', 'Prediction') }}</RouterLink>
12
+ </nav>
13
+ <div class="lang-switch">
14
+ <button class="lang-pill" :class="{ active: store.ui.lang === 'zh' }" @click="store.ui.lang = 'zh'">中文</button>
15
+ <button class="lang-pill" :class="{ active: store.ui.lang === 'en' }" @click="store.ui.lang = 'en'">EN</button>
16
+ </div>
17
+ </aside>
18
+ <main class="main" ref="mainRef">
19
+ <div class="hero">
20
+ <h1>NextRec Studio</h1>
21
+ <p>为训练、特征、模型、推理提供标准化的 YAML 文件配置。</p>
22
+ <div v-if="bundleError" class="alert">{{ bundleError }}</div>
23
+ <div class="actions">
24
+ <button class="primary" @click="downloadBundle" :disabled="!!bundleError">打包下载 4 个 YAML</button>
25
+ </div>
26
+ </div>
27
+ <RouterView />
28
+ </main>
29
+ </div>
30
+ </template>
31
+
32
+ <script setup>
33
+ import { computed, ref, watch } from 'vue';
34
+ import { RouterLink, RouterView } from 'vue-router';
35
+ import { store } from './store/configStore.js';
36
+ import { dumpYaml, parseYaml } from './utils/yaml.js';
37
+ import { buildTrainConfig } from './utils/buildTrainConfig.js';
38
+ import { downloadZip } from './utils/zip.js';
39
+ import logoUrl from './assets/logo.png';
40
+
41
+ const mainRef = ref(null);
42
+ const sidebarRef = ref(null);
43
+ const lang = computed(() => store.ui.lang);
44
+ const t = (zh, en) => (lang.value === 'zh' ? zh : en);
45
+
46
+ watch(
47
+ () => store.ui.lang,
48
+ () => {
49
+ if (!mainRef.value) return;
50
+ mainRef.value.classList.remove('lang-flash');
51
+ // force reflow to restart animation
52
+ void mainRef.value.offsetWidth;
53
+ mainRef.value.classList.add('lang-flash');
54
+ if (sidebarRef.value) {
55
+ sidebarRef.value.classList.remove('lang-flash');
56
+ void sidebarRef.value.offsetWidth;
57
+ sidebarRef.value.classList.add('lang-flash');
58
+ }
59
+ }
60
+ );
61
+
62
+ function buildFeatureSection(items) {
63
+ const section = {};
64
+ for (const item of items) {
65
+ if (!item.name) {
66
+ continue;
67
+ }
68
+ section[item.name] = {
69
+ processor_config: { ...item.processor },
70
+ embedding_config: { ...item.embedding }
71
+ };
72
+ }
73
+ return section;
74
+ }
75
+
76
+ const trainYamlResult = computed(() => {
77
+ try {
78
+ return { text: buildTrainConfig(store.train), error: '' };
79
+ } catch (err) {
80
+ return { text: '', error: `训练配置解析失败: ${err.message}` };
81
+ }
82
+ });
83
+
84
+ const featureYamlResult = computed(() => {
85
+ try {
86
+ const obj = {
87
+ dense: buildFeatureSection(store.feature.dense),
88
+ sparse: buildFeatureSection(store.feature.sparse),
89
+ sequence: buildFeatureSection(store.feature.sequence)
90
+ };
91
+ return { text: dumpYaml(obj), error: '' };
92
+ } catch (err) {
93
+ return { text: '', error: `特征配置解析失败: ${err.message}` };
94
+ }
95
+ });
96
+
97
+ const modelYamlResult = computed(() => {
98
+ try {
99
+ const params = parseYaml(store.model.paramsText) || {};
100
+ const obj = {
101
+ model: store.model.model,
102
+ params
103
+ };
104
+ return { text: dumpYaml(obj), error: '' };
105
+ } catch (err) {
106
+ return { text: '', error: `模型配置解析失败: ${err.message}` };
107
+ }
108
+ });
109
+
110
+ const predictYaml = computed(() => {
111
+ const output = {
112
+ checkpoint_path: store.predict.checkpoint_path,
113
+ predict: { ...store.predict.predict }
114
+ };
115
+
116
+ if (store.predict.model_config) {
117
+ output.model_config = store.predict.model_config;
118
+ }
119
+
120
+ if (store.predict.session.id) {
121
+ output.session = { id: store.predict.session.id };
122
+ }
123
+
124
+ return dumpYaml(output);
125
+ });
126
+
127
+ const bundleError = computed(() => {
128
+ if (trainYamlResult.value.error) {
129
+ return trainYamlResult.value.error;
130
+ }
131
+ if (featureYamlResult.value.error) {
132
+ return featureYamlResult.value.error;
133
+ }
134
+ if (modelYamlResult.value.error) {
135
+ return modelYamlResult.value.error;
136
+ }
137
+ return '';
138
+ });
139
+
140
+ async function downloadBundle() {
141
+ if (bundleError.value) {
142
+ return;
143
+ }
144
+ await downloadZip('nextrec-configs.zip', {
145
+ 'train_config.yaml': trainYamlResult.value.text,
146
+ 'feature_config.yaml': featureYamlResult.value.text,
147
+ 'model_config.yaml': modelYamlResult.value.text,
148
+ 'predict_config.yaml': predictYaml.value
149
+ });
150
+ }
151
+
152
+ </script>
@@ -0,0 +1,6 @@
1
+ import { createApp } from 'vue';
2
+ import App from './App.vue';
3
+ import router from './router/index.js';
4
+ import './styles.css';
5
+
6
+ createApp(App).use(router).mount('#app');