cnhkmcp 2.1.3__py3-none-any.whl → 2.1.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. cnhkmcp/__init__.py +126 -0
  2. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/README.md +38 -0
  3. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/ace.log +0 -0
  4. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/config.json +6 -0
  5. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/get_knowledgeBase_tool/ace_lib.py +1514 -0
  6. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/get_knowledgeBase_tool/fetch_all_datasets.py +157 -0
  7. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/get_knowledgeBase_tool/fetch_all_documentation.py +132 -0
  8. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/get_knowledgeBase_tool/fetch_all_operators.py +99 -0
  9. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/get_knowledgeBase_tool/helpful_functions.py +180 -0
  10. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/icon.ico +0 -0
  11. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/icon.png +0 -0
  12. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/001_10_Steps_to_Start_on_BRAIN_documentation.json +14 -0
  13. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/001_Intermediate_Pack_-_Improve_your_Alpha_2_2_documentation.json +174 -0
  14. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/001_Intermediate_Pack_-_Understand_Results_1_2_documentation.json +167 -0
  15. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/001_Introduction_to_Alphas_documentation.json +145 -0
  16. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/001_Introduction_to_BRAIN_Expression_Language_documentation.json +107 -0
  17. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/001_WorldQuant_Challenge_documentation.json +56 -0
  18. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/001__Read_this_First_-_Starter_Pack_documentation.json +404 -0
  19. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/002_How_to_choose_the_Simulation_Settings_documentation.json +268 -0
  20. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/002_Simulate_your_first_Alpha_documentation.json +88 -0
  21. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/002__Alpha_Examples_for_Beginners_documentation.json +254 -0
  22. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/002__Alpha_Examples_for_Bronze_Users_documentation.json +114 -0
  23. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/002__Alpha_Examples_for_Silver_Users_documentation.json +79 -0
  24. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/002__How_BRAIN_works_documentation.json +184 -0
  25. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/003_Clear_these_tests_before_submitting_an_Alpha_documentation.json +388 -0
  26. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/003_Parameters_in_the_Simulation_results_documentation.json +243 -0
  27. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/004_Group_Data_Fields_documentation.json +69 -0
  28. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/004_How_to_use_the_Data_Explorer_documentation.json +142 -0
  29. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/004_Model77_dataset_documentation.json +14 -0
  30. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/004_Sentiment1_dataset_documentation.json +14 -0
  31. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/004_Understanding_Data_in_BRAIN_Key_Concepts_and_Tips_documentation.json +182 -0
  32. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/004_Vector_Data_Fields_documentation.json +30 -0
  33. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/005_Crowding_Risk-Neutralized_Alphas_documentation.json +64 -0
  34. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/005_D0_documentation.json +66 -0
  35. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/005_Double_Neutralization_documentation.json +53 -0
  36. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/005_Fast_D1_Documentation_documentation.json +304 -0
  37. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/005_Investability_Constrained_Metrics_documentation.json +129 -0
  38. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/005_Must-read_posts_How_to_improve_your_Alphas_documentation.json +14 -0
  39. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/005_Neutralization_documentation.json +29 -0
  40. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/005_RAM_Risk-Neutralized_Alphas_documentation.json +64 -0
  41. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/005_Risk_Neutralization_Default_setting_documentation.json +75 -0
  42. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/005_Risk_Neutralized_Alphas_documentation.json +171 -0
  43. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/005_Statistical_Risk-Neutralized_Alphas_documentation.json +51 -0
  44. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/006_EUR_TOP2500_Universe_documentation.json +35 -0
  45. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/006_GLB_TOPDIV3000_Universe_documentation.json +48 -0
  46. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/006_Getting_Started_China_Research_for_Consultants_Gold_documentation.json +142 -0
  47. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/006_Getting_started_on_Illiquid_Universes_Gold_documentation.json +46 -0
  48. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/006_Getting_started_with_USA_TOPSP500_universe_Gold_documentation.json +62 -0
  49. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/006_Global_Alphas_Gold_documentation.json +66 -0
  50. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/006_India_Alphas_documentation.json +35 -0
  51. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/007_Consultant_Dos_and_Don_ts_documentation.json +35 -0
  52. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/007_Consultant_Features_documentation.json +239 -0
  53. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/007_Consultant_Simulation_Features_documentation.json +149 -0
  54. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/007_Consultant_Submission_Tests_documentation.json +363 -0
  55. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/007_Finding_Consultant_Alphas_documentation.json +333 -0
  56. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/007_Power_Pool_Alphas_documentation.json +14 -0
  57. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/007_Research_Advisory_Program_documentation.json +35 -0
  58. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/007_Starting_Guide_for_Research_Consultants_documentation.json +14 -0
  59. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/007_Visualization_Tool_documentation.json +99 -0
  60. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/007_Your_Advisor_-_Kunqi_Jiang_documentation.json +53 -0
  61. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/007__Brain_Genius_documentation.json +288 -0
  62. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/007__Single_Dataset_Alphas_documentation.json +41 -0
  63. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/008_Advisory_Theme_Calendar_documentation.json +14 -0
  64. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/008_Multiplier_Rules_documentation.json +14 -0
  65. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/008_Overview_of_Themes_documentation.json +14 -0
  66. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/008_Theme_Calendar_documentation.json +14 -0
  67. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/009_Combo_Expression_documentation.json +272 -0
  68. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/009_Global_SuperAlphas_documentation.json +14 -0
  69. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/009_Helpful_Tips_documentation.json +58 -0
  70. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/009_Selection_Expression_documentation.json +1546 -0
  71. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/009_SuperAlpha_Operators_documentation.json +890 -0
  72. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/009_SuperAlpha_Results_documentation.json +83 -0
  73. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/009_What_is_a_SuperAlpha_documentation.json +261 -0
  74. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/010_BRAIN_API_documentation.json +515 -0
  75. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/010_Documentation_for_ACE_API_Library_Gold_documentation.json +27 -0
  76. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/010__Understanding_simulation_limits_documentation.json +210 -0
  77. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/arithmetic_operators.json +209 -0
  78. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/cross_sectional_operators.json +98 -0
  79. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/group_operators.json +121 -0
  80. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/logical_operators.json +145 -0
  81. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/reduce_operators.json +156 -0
  82. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/special_operators.json +35 -0
  83. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/test.txt +1 -0
  84. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/time_series_operators.json +386 -0
  85. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/transformational_operators.json +61 -0
  86. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/knowledge/vector_operators.json +38 -0
  87. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/main.py +576 -0
  88. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/process_knowledge_base.py +281 -0
  89. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/rag_engine.py +408 -0
  90. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/requirements.txt +7 -0
  91. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/run.bat +3 -0
  92. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/vector_db/_manifest.json +302 -0
  93. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/vector_db/_meta.json +1 -0
  94. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242/vector_db/chroma.sqlite3 +0 -0
  95. cnhkmcp/untracked/AI/321/206/320/261/320/234/321/211/320/255/320/262/321/206/320/237/320/242/321/204/342/225/227/342/225/242//321/211/320/266/320/246/321/206/320/274/320/261/321/210/342/224/220/320/240/321/210/320/261/320/234/321/206/320/231/320/243/321/205/342/225/235/320/220/321/206/320/230/320/241.py +265 -0
  96. cnhkmcp/untracked/APP/.gitignore +32 -0
  97. cnhkmcp/untracked/APP/MODULAR_STRUCTURE.md +112 -0
  98. cnhkmcp/untracked/APP/README.md +309 -0
  99. cnhkmcp/untracked/APP/Tranformer/Transformer.py +4989 -0
  100. cnhkmcp/untracked/APP/Tranformer/ace.log +0 -0
  101. cnhkmcp/untracked/APP/Tranformer/ace_lib.py +1514 -0
  102. cnhkmcp/untracked/APP/Tranformer/helpful_functions.py +180 -0
  103. cnhkmcp/untracked/APP/Tranformer/output/Alpha_candidates.json +7187 -0
  104. cnhkmcp/untracked/APP/Tranformer/output/Alpha_candidates_/321/207/320/264/342/225/221/321/204/342/225/233/320/233.json +654 -0
  105. cnhkmcp/untracked/APP/Tranformer/output/Alpha_generated_expressions_error.json +1 -0
  106. cnhkmcp/untracked/APP/Tranformer/output/Alpha_generated_expressions_success.json +47312 -0
  107. cnhkmcp/untracked/APP/Tranformer/output/Alpha_generated_expressions_/321/207/320/264/342/225/221/321/204/342/225/233/320/233/321/205/320/237/320/277/321/207/320/253/342/224/244/321/206/320/236/320/265/321/210/342/225/234/342/225/234/321/205/320/225/320/265Machine_lib.json +22 -0
  108. cnhkmcp/untracked/APP/Tranformer/parsetab.py +60 -0
  109. cnhkmcp/untracked/APP/Tranformer/template_summary.txt +3182 -0
  110. cnhkmcp/untracked/APP/Tranformer/transformer_config.json +7 -0
  111. cnhkmcp/untracked/APP/Tranformer/validator.py +889 -0
  112. cnhkmcp/untracked/APP/ace.log +69 -0
  113. cnhkmcp/untracked/APP/ace_lib.py +1514 -0
  114. cnhkmcp/untracked/APP/blueprints/__init__.py +6 -0
  115. cnhkmcp/untracked/APP/blueprints/feature_engineering.py +347 -0
  116. cnhkmcp/untracked/APP/blueprints/idea_house.py +221 -0
  117. cnhkmcp/untracked/APP/blueprints/inspiration_house.py +432 -0
  118. cnhkmcp/untracked/APP/blueprints/paper_analysis.py +570 -0
  119. cnhkmcp/untracked/APP/custom_templates/templates.json +1257 -0
  120. cnhkmcp/untracked/APP/give_me_idea/BRAIN_Alpha_Template_Expert_SystemPrompt.md +400 -0
  121. cnhkmcp/untracked/APP/give_me_idea/ace_lib.py +1514 -0
  122. cnhkmcp/untracked/APP/give_me_idea/alpha_data_specific_template_master.py +252 -0
  123. cnhkmcp/untracked/APP/give_me_idea/fetch_all_datasets.py +157 -0
  124. cnhkmcp/untracked/APP/give_me_idea/fetch_all_operators.py +99 -0
  125. cnhkmcp/untracked/APP/give_me_idea/helpful_functions.py +180 -0
  126. cnhkmcp/untracked/APP/give_me_idea/what_is_Alpha_template.md +11 -0
  127. cnhkmcp/untracked/APP/helpful_functions.py +180 -0
  128. cnhkmcp/untracked/APP/hkSimulator/ace_lib.py +1501 -0
  129. cnhkmcp/untracked/APP/hkSimulator/autosimulator.py +447 -0
  130. cnhkmcp/untracked/APP/hkSimulator/helpful_functions.py +180 -0
  131. cnhkmcp/untracked/APP/mirror_config.txt +20 -0
  132. cnhkmcp/untracked/APP/operaters.csv +129 -0
  133. cnhkmcp/untracked/APP/requirements.txt +53 -0
  134. cnhkmcp/untracked/APP/run_app.bat +28 -0
  135. cnhkmcp/untracked/APP/run_app.sh +34 -0
  136. cnhkmcp/untracked/APP/setup_tsinghua.bat +39 -0
  137. cnhkmcp/untracked/APP/setup_tsinghua.sh +43 -0
  138. cnhkmcp/untracked/APP/simulator/alpha_submitter.py +404 -0
  139. cnhkmcp/untracked/APP/simulator/simulator_wqb.py +618 -0
  140. cnhkmcp/untracked/APP/ssrn-3332513.pdf +109188 -19
  141. cnhkmcp/untracked/APP/static/brain.js +589 -0
  142. cnhkmcp/untracked/APP/static/decoder.js +1540 -0
  143. cnhkmcp/untracked/APP/static/feature_engineering.js +1729 -0
  144. cnhkmcp/untracked/APP/static/idea_house.js +937 -0
  145. cnhkmcp/untracked/APP/static/inspiration.js +465 -0
  146. cnhkmcp/untracked/APP/static/inspiration_house.js +868 -0
  147. cnhkmcp/untracked/APP/static/paper_analysis.js +390 -0
  148. cnhkmcp/untracked/APP/static/script.js +3082 -0
  149. cnhkmcp/untracked/APP/static/simulator.js +597 -0
  150. cnhkmcp/untracked/APP/static/styles.css +3127 -0
  151. cnhkmcp/untracked/APP/static/usage_widget.js +508 -0
  152. cnhkmcp/untracked/APP/templates/alpha_inspector.html +511 -0
  153. cnhkmcp/untracked/APP/templates/feature_engineering.html +960 -0
  154. cnhkmcp/untracked/APP/templates/idea_house.html +564 -0
  155. cnhkmcp/untracked/APP/templates/index.html +932 -0
  156. cnhkmcp/untracked/APP/templates/inspiration_house.html +861 -0
  157. cnhkmcp/untracked/APP/templates/paper_analysis.html +91 -0
  158. cnhkmcp/untracked/APP/templates/simulator.html +343 -0
  159. cnhkmcp/untracked/APP/templates/transformer_web.html +580 -0
  160. cnhkmcp/untracked/APP/usage.md +351 -0
  161. cnhkmcp/untracked/APP//321/207/342/225/235/320/250/321/205/320/230/320/226/321/204/342/225/225/320/220/321/211/320/221/320/243/321/206/320/261/320/265/ace_lib.py +1514 -0
  162. cnhkmcp/untracked/APP//321/207/342/225/235/320/250/321/205/320/230/320/226/321/204/342/225/225/320/220/321/211/320/221/320/243/321/206/320/261/320/265/brain_alpha_inspector.py +712 -0
  163. cnhkmcp/untracked/APP//321/207/342/225/235/320/250/321/205/320/230/320/226/321/204/342/225/225/320/220/321/211/320/221/320/243/321/206/320/261/320/265/helpful_functions.py +180 -0
  164. cnhkmcp/untracked/APP//321/210/342/224/220/320/240/321/210/320/261/320/234/321/206/320/231/320/243/321/205/342/225/235/320/220/321/206/320/230/320/241.py +2460 -0
  165. cnhkmcp/untracked/__init__.py +0 -0
  166. cnhkmcp/untracked/arXiv_API_Tool_Manual.md +490 -0
  167. cnhkmcp/untracked/arxiv_api.py +229 -0
  168. cnhkmcp/untracked/back_up/forum_functions.py +998 -0
  169. cnhkmcp/untracked/back_up/platform_functions.py +2886 -0
  170. cnhkmcp/untracked/brain-consultant.md +31 -0
  171. cnhkmcp/untracked/forum_functions.py +407 -0
  172. cnhkmcp/untracked/mcp/321/206/320/246/320/227/321/204/342/225/227/342/225/242/321/210/320/276/342/225/221/321/205/320/255/320/253/321/207/320/231/320/2302_/321/205/320/266/320/222/321/206/320/256/320/254/321/205/320/236/320/257/321/207/320/231/320/230/321/205/320/240/320/277/321/205/320/232/320/270/321/204/342/225/225/320/235/321/204/342/225/221/320/226/321/206/342/225/241/320/237/321/210/320/267/320/230/321/205/320/251/320/270/321/205/342/226/221/342/226/222/321/210/320/277/320/245/321/210/342/224/220/320/251/321/204/342/225/225/320/272/forum_functions.py +407 -0
  173. cnhkmcp/untracked/mcp/321/206/320/246/320/227/321/204/342/225/227/342/225/242/321/210/320/276/342/225/221/321/205/320/255/320/253/321/207/320/231/320/2302_/321/205/320/266/320/222/321/206/320/256/320/254/321/205/320/236/320/257/321/207/320/231/320/230/321/205/320/240/320/277/321/205/320/232/320/270/321/204/342/225/225/320/235/321/204/342/225/221/320/226/321/206/342/225/241/320/237/321/210/320/267/320/230/321/205/320/251/320/270/321/205/342/226/221/342/226/222/321/210/320/277/320/245/321/210/342/224/220/320/251/321/204/342/225/225/320/272/platform_functions.py +2601 -0
  174. cnhkmcp/untracked/mcp/321/206/320/246/320/227/321/204/342/225/227/342/225/242/321/210/320/276/342/225/221/321/205/320/255/320/253/321/207/320/231/320/2302_/321/205/320/266/320/222/321/206/320/256/320/254/321/205/320/236/320/257/321/207/320/231/320/230/321/205/320/240/320/277/321/205/320/232/320/270/321/204/342/225/225/320/235/321/204/342/225/221/320/226/321/206/342/225/241/320/237/321/210/320/267/320/230/321/205/320/251/320/270/321/205/342/226/221/342/226/222/321/210/320/277/320/245/321/210/342/224/220/320/251/321/204/342/225/225/320/272/user_config.json +31 -0
  175. cnhkmcp/untracked/mcp/321/206/320/246/320/227/321/204/342/225/227/342/225/242/321/210/320/276/342/225/221/321/205/320/255/320/253/321/207/320/231/320/2302_/321/205/320/266/320/222/321/206/320/256/320/254/321/205/320/236/320/257/321/207/320/231/320/230/321/205/320/240/320/277/321/205/320/232/320/270/321/204/342/225/225/320/235/321/204/342/225/221/320/226/321/206/342/225/241/320/237/321/210/320/267/320/230/321/205/320/251/320/270/321/205/342/226/221/342/226/222/321/210/320/277/320/245/321/210/342/224/220/320/251/321/204/342/225/225/320/272//321/210/320/276/320/271AI/321/210/320/277/342/225/227/321/210/342/224/220/320/251/321/204/342/225/225/320/272/321/206/320/246/320/227/321/206/320/261/320/263/321/206/320/255/320/265/321/205/320/275/320/266/321/204/342/225/235/320/252/321/204/342/225/225/320/233/321/210/342/225/234/342/225/234/321/206/342/225/241/320/237/321/210/320/267/320/230/321/205/320/251/320/270.md +101 -0
  176. cnhkmcp/untracked/mcp/321/206/320/246/320/227/321/204/342/225/227/342/225/242/321/210/320/276/342/225/221/321/205/320/255/320/253/321/207/320/231/320/2302_/321/205/320/266/320/222/321/206/320/256/320/254/321/205/320/236/320/257/321/207/320/231/320/230/321/205/320/240/320/277/321/205/320/232/320/270/321/204/342/225/225/320/235/321/204/342/225/221/320/226/321/206/342/225/241/320/237/321/210/320/267/320/230/321/205/320/251/320/270/321/205/342/226/221/342/226/222/321/210/320/277/320/245/321/210/342/224/220/320/251/321/204/342/225/225/320/272//321/211/320/225/320/235/321/207/342/225/234/320/276/321/205/320/231/320/235/321/210/342/224/220/320/240/321/210/320/261/320/234/321/206/320/230/320/241_/321/205/320/276/320/231/321/210/320/263/320/225/321/205/342/224/220/320/225/321/210/320/266/320/221/321/204/342/225/233/320/255/321/210/342/225/241/320/246/321/205/320/234/320/225.py +190 -0
  177. cnhkmcp/untracked/platform_functions.py +2601 -0
  178. cnhkmcp/untracked/sample_mcp_config.json +11 -0
  179. cnhkmcp/untracked/user_config.json +31 -0
  180. cnhkmcp/untracked//321/207/320/264/342/225/221/321/204/342/225/233/320/233/321/205/320/237/320/222/321/210/320/220/320/223/321/206/320/246/320/227/321/206/320/261/320/263_BRAIN_Alpha_Test_Requirements_and_Tips.md +202 -0
  181. cnhkmcp/untracked//321/207/320/264/342/225/221/321/204/342/225/233/320/233/321/205/342/225/226/320/265/321/204/342/225/234/320/254/321/206/342/225/241/320/221_Alpha_explaination_workflow.md +56 -0
  182. cnhkmcp/untracked//321/207/320/264/342/225/221/321/204/342/225/233/320/233/321/205/342/225/226/320/265/321/204/342/225/234/320/254/321/206/342/225/241/320/221_BRAIN_6_Tips_Datafield_Exploration_Guide.md +194 -0
  183. cnhkmcp/untracked//321/207/320/264/342/225/221/321/204/342/225/233/320/233/321/205/342/225/226/320/265/321/204/342/225/234/320/254/321/206/342/225/241/320/221_BRAIN_Alpha_Improvement_Workflow.md +101 -0
  184. cnhkmcp/untracked//321/207/320/264/342/225/221/321/204/342/225/233/320/233/321/205/342/225/226/320/265/321/204/342/225/234/320/254/321/206/342/225/241/320/221_Dataset_Exploration_Expert_Manual.md +436 -0
  185. cnhkmcp/untracked//321/207/320/264/342/225/221/321/204/342/225/233/320/233/321/205/342/225/226/320/265/321/204/342/225/234/320/254/321/206/342/225/241/320/221_daily_report_workflow.md +128 -0
  186. cnhkmcp/untracked//321/211/320/225/320/235/321/207/342/225/234/320/276/321/205/320/231/320/235/321/210/342/224/220/320/240/321/210/320/261/320/234/321/206/320/230/320/241_/321/205/320/276/320/231/321/210/320/263/320/225/321/205/342/224/220/320/225/321/210/320/266/320/221/321/204/342/225/233/320/255/321/210/342/225/241/320/246/321/205/320/234/320/225.py +192 -0
  187. {cnhkmcp-2.1.3.dist-info → cnhkmcp-2.1.5.dist-info}/METADATA +1 -1
  188. cnhkmcp-2.1.5.dist-info/RECORD +192 -0
  189. cnhkmcp-2.1.5.dist-info/top_level.txt +1 -0
  190. cnhkmcp-2.1.3.dist-info/RECORD +0 -6
  191. cnhkmcp-2.1.3.dist-info/top_level.txt +0 -1
  192. {cnhkmcp-2.1.3.dist-info → cnhkmcp-2.1.5.dist-info}/WHEEL +0 -0
  193. {cnhkmcp-2.1.3.dist-info → cnhkmcp-2.1.5.dist-info}/entry_points.txt +0 -0
  194. {cnhkmcp-2.1.3.dist-info → cnhkmcp-2.1.5.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,465 @@
1
+ /**
2
+ * Inspiration Master - Frontend Logic
3
+ */
4
+
5
+ // Global state for inspiration feature
6
+ let inspirationState = {
7
+ isLoggedIn: false,
8
+ llmConfig: {
9
+ baseUrl: "https://api.moonshot.cn/v1",
10
+ model: "kimi-k2-turbo-preview",
11
+ apiKey: ""
12
+ },
13
+ options: null,
14
+ selectedDataset: null
15
+ };
16
+
17
+ document.addEventListener('DOMContentLoaded', function() {
18
+ const inspirationBtn = document.getElementById('inspirationBtn');
19
+ if (inspirationBtn) {
20
+ inspirationBtn.addEventListener('click', openInspirationModal);
21
+ }
22
+
23
+ // Initialize event listeners for the modal
24
+ document.getElementById('inspire-region').addEventListener('change', updateUniversesAndDelays);
25
+ document.getElementById('inspire-search-dataset').addEventListener('click', searchDatasets);
26
+ document.getElementById('inspire-generate').addEventListener('click', generateAlphaTemplates);
27
+ document.getElementById('inspire-download').addEventListener('click', downloadInspirationResult);
28
+ document.getElementById('inspire-new-task').addEventListener('click', resetInspirationTask);
29
+ document.getElementById('inspire-close').addEventListener('click', closeInspirationModal);
30
+
31
+ const testBtn = document.getElementById('inspire-test-llm');
32
+ if (testBtn) {
33
+ testBtn.addEventListener('click', testLLMConnection);
34
+ }
35
+
36
+ // Initially disable generate button until tested
37
+ const genBtn = document.getElementById('inspire-generate');
38
+ if (genBtn) {
39
+ genBtn.disabled = true;
40
+ genBtn.title = "Please test LLM connection first";
41
+ }
42
+
43
+ // Initially disable new task button
44
+ const newTaskBtn = document.getElementById('inspire-new-task');
45
+ if (newTaskBtn) {
46
+ newTaskBtn.disabled = true;
47
+ newTaskBtn.style.opacity = '0.5';
48
+ newTaskBtn.style.cursor = 'not-allowed';
49
+ }
50
+
51
+ // Check login status periodically or on load to update button state
52
+ checkLoginAndUpdateButton();
53
+ });
54
+
55
+ function getHeaders() {
56
+ const headers = {'Content-Type': 'application/json'};
57
+ const sessionId = localStorage.getItem('brain_session_id');
58
+ if (sessionId) {
59
+ headers['Session-ID'] = sessionId;
60
+ }
61
+ return headers;
62
+ }
63
+
64
+ function checkLoginAndUpdateButton() {
65
+ fetch('/api/check_login', { headers: getHeaders() })
66
+ .then(response => response.json())
67
+ .then(data => {
68
+ const btn = document.getElementById('inspirationBtn');
69
+ if (data.logged_in) {
70
+ inspirationState.isLoggedIn = true;
71
+ if (btn) {
72
+ btn.style.opacity = '1';
73
+ btn.style.cursor = 'pointer';
74
+ // Add a visual indicator of logged-in state if desired, e.g., change icon color
75
+ }
76
+ } else {
77
+ inspirationState.isLoggedIn = false;
78
+ if (btn) {
79
+ // Keep it clickable but maybe visually distinct
80
+ btn.style.opacity = '1';
81
+ btn.style.cursor = 'pointer';
82
+ }
83
+ }
84
+ // Always ensure it's enabled
85
+ if (btn) btn.disabled = false;
86
+ })
87
+ .catch(err => console.error("Error checking login status:", err));
88
+ }
89
+
90
+ // Expose this function globally so other scripts (like brain.js) can call it after login
91
+ window.updateInspirationButtonState = checkLoginAndUpdateButton;
92
+
93
+ function openInspirationModal() {
94
+ if (!inspirationState.isLoggedIn) {
95
+ // Double check
96
+ fetch('/api/check_login', { headers: getHeaders() })
97
+ .then(response => response.json())
98
+ .then(data => {
99
+ if (data.logged_in) {
100
+ inspirationState.isLoggedIn = true;
101
+ document.getElementById('inspirationModal').style.display = 'block';
102
+ loadInspirationOptions();
103
+ } else {
104
+ // Trigger Brain Login Modal
105
+ if (typeof openBrainLoginModal === 'function') {
106
+ openBrainLoginModal();
107
+ } else {
108
+ alert("请先登录 BRAIN。");
109
+ }
110
+ }
111
+ });
112
+ return;
113
+ }
114
+ document.getElementById('inspirationModal').style.display = 'block';
115
+ loadInspirationOptions();
116
+ }
117
+
118
+ function closeInspirationModal() {
119
+ document.getElementById('inspirationModal').style.display = 'none';
120
+ }
121
+
122
+ function loadInspirationOptions() {
123
+ if (inspirationState.options) return; // Already loaded
124
+
125
+ fetch('/api/inspiration/options', { headers: getHeaders() })
126
+ .then(res => res.json())
127
+ .then(data => {
128
+ inspirationState.options = data;
129
+ populateRegionDropdown(data);
130
+ })
131
+ .catch(err => console.error("Failed to load options:", err));
132
+ }
133
+
134
+ function populateRegionDropdown(data) {
135
+ const regionSelect = document.getElementById('inspire-region');
136
+ regionSelect.innerHTML = '<option value="">Select Region</option>';
137
+
138
+ // Assuming data structure matches what we get from ace_lib
139
+ // Structure: { "EQUITY": { "USA": { ... }, "CHN": { ... } } }
140
+ // We'll focus on EQUITY for now or iterate all
141
+
142
+ let regions = new Set();
143
+ if (data.EQUITY) {
144
+ Object.keys(data.EQUITY).forEach(r => regions.add(r));
145
+ }
146
+
147
+ regions.forEach(r => {
148
+ const option = document.createElement('option');
149
+ option.value = r;
150
+ option.textContent = r;
151
+ regionSelect.appendChild(option);
152
+ });
153
+ }
154
+
155
+ function updateUniversesAndDelays() {
156
+ const region = document.getElementById('inspire-region').value;
157
+ const universeSelect = document.getElementById('inspire-universe');
158
+ const delaySelect = document.getElementById('inspire-delay');
159
+
160
+ universeSelect.innerHTML = '<option value="">Select Universe</option>';
161
+ delaySelect.innerHTML = '<option value="">Select Delay</option>';
162
+
163
+ if (!region || !inspirationState.options || !inspirationState.options.EQUITY || !inspirationState.options.EQUITY[region]) return;
164
+
165
+ const data = inspirationState.options.EQUITY[region];
166
+
167
+ data.universes.forEach(u => {
168
+ const option = document.createElement('option');
169
+ option.value = u;
170
+ option.textContent = u;
171
+ universeSelect.appendChild(option);
172
+ });
173
+
174
+ data.delays.forEach(d => {
175
+ const option = document.createElement('option');
176
+ option.value = d;
177
+ option.textContent = d;
178
+ delaySelect.appendChild(option);
179
+ });
180
+ }
181
+
182
+ function searchDatasets() {
183
+ const region = document.getElementById('inspire-region').value;
184
+ const delay = document.getElementById('inspire-delay').value;
185
+ const universe = document.getElementById('inspire-universe').value;
186
+ const search = document.getElementById('inspire-dataset-search').value;
187
+
188
+ if (!region || !delay || !universe) {
189
+ alert("请先选择区域、延迟和股票池。");
190
+ return;
191
+ }
192
+
193
+ const resultsDiv = document.getElementById('inspire-dataset-results');
194
+ resultsDiv.innerHTML = '正在加载数据集...';
195
+
196
+ fetch('/api/inspiration/datasets', {
197
+ method: 'POST',
198
+ headers: getHeaders(),
199
+ body: JSON.stringify({ region, delay, universe, search })
200
+ })
201
+ .then(res => res.json())
202
+ .then(data => {
203
+ displayDatasetResults(data);
204
+ })
205
+ .catch(err => {
206
+ resultsDiv.innerHTML = '加载数据集出错: ' + err;
207
+ });
208
+ }
209
+
210
+ function displayDatasetResults(datasets) {
211
+ const resultsDiv = document.getElementById('inspire-dataset-results');
212
+ resultsDiv.innerHTML = '';
213
+
214
+ if (datasets.length === 0) {
215
+ resultsDiv.innerHTML = '未找到数据集。';
216
+ return;
217
+ }
218
+
219
+ const table = document.createElement('table');
220
+ table.className = 'dataset-table';
221
+ table.style.width = '100%'; // Ensure full width
222
+ table.style.borderCollapse = 'collapse';
223
+
224
+ table.innerHTML = `
225
+ <thead>
226
+ <tr style="text-align: left; background: #f1f1f1;">
227
+ <th style="padding: 8px; border-bottom: 1px solid #ddd;">ID</th>
228
+ <th style="padding: 8px; border-bottom: 1px solid #ddd;">Name</th>
229
+ <th style="padding: 8px; border-bottom: 1px solid #ddd;">Category</th>
230
+ </tr>
231
+ </thead>
232
+ <tbody></tbody>
233
+ `;
234
+
235
+ const tbody = table.querySelector('tbody');
236
+
237
+ datasets.forEach(ds => {
238
+ const tr = document.createElement('tr');
239
+ tr.dataset.id = ds.id;
240
+ tr.style.cursor = 'pointer';
241
+ tr.style.transition = 'background-color 0.2s';
242
+
243
+ // Fix [object Object] issue for category
244
+ let category = ds.category;
245
+ if (typeof category === 'object' && category !== null) {
246
+ // Try to find a meaningful string representation
247
+ category = category.name || category.id || JSON.stringify(category);
248
+ }
249
+
250
+ tr.innerHTML = `
251
+ <td style="padding: 8px; border-bottom: 1px solid #eee; color: #007bff; font-weight: bold;">${ds.id}</td>
252
+ <td style="padding: 8px; border-bottom: 1px solid #eee;">${ds.name}</td>
253
+ <td style="padding: 8px; border-bottom: 1px solid #eee;">${category}</td>
254
+ `;
255
+
256
+ tr.addEventListener('click', function() {
257
+ selectDataset(ds.id);
258
+ });
259
+
260
+ tr.addEventListener('mouseenter', function() {
261
+ if (inspirationState.selectedDataset !== ds.id) {
262
+ this.style.backgroundColor = '#f8f9fa';
263
+ }
264
+ });
265
+
266
+ tr.addEventListener('mouseleave', function() {
267
+ if (inspirationState.selectedDataset !== ds.id) {
268
+ this.style.backgroundColor = '';
269
+ }
270
+ });
271
+
272
+ tbody.appendChild(tr);
273
+ });
274
+
275
+ resultsDiv.appendChild(table);
276
+ }
277
+
278
+ function selectDataset(id) {
279
+ inspirationState.selectedDataset = id;
280
+ const display = document.getElementById('inspire-selected-dataset');
281
+ if (display) {
282
+ display.textContent = "已选数据集: " + id;
283
+ display.style.display = 'block';
284
+ }
285
+
286
+ // Highlight the selected row
287
+ document.querySelectorAll('.dataset-table tr').forEach(tr => tr.style.backgroundColor = '');
288
+ const row = document.querySelector(`.dataset-table tr[data-id="${id}"]`);
289
+ if (row) {
290
+ row.style.backgroundColor = '#e7f1ff';
291
+ }
292
+ }
293
+
294
+ // Removed toggleAccordion as we are moving to a horizontal layout
295
+
296
+ function generateAlphaTemplates() {
297
+ if (!inspirationState.selectedDataset) {
298
+ alert("请先选择一个数据集。");
299
+ return;
300
+ }
301
+
302
+ const apiKey = document.getElementById('inspire-llm-key').value;
303
+ const baseUrl = document.getElementById('inspire-llm-url').value;
304
+ const model = document.getElementById('inspire-llm-model').value;
305
+
306
+ if (!apiKey) {
307
+ alert("请输入 LLM API Key。");
308
+ return;
309
+ }
310
+
311
+ const region = document.getElementById('inspire-region').value;
312
+ const delay = document.getElementById('inspire-delay').value;
313
+ const universe = document.getElementById('inspire-universe').value;
314
+
315
+ const outputDiv = document.getElementById('inspire-output');
316
+ outputDiv.innerHTML = '正在生成模板... 这可能需要几分钟...';
317
+
318
+ fetch('/api/inspiration/generate', {
319
+ method: 'POST',
320
+ headers: getHeaders(),
321
+ body: JSON.stringify({
322
+ apiKey, baseUrl, model,
323
+ region, delay, universe,
324
+ datasetId: inspirationState.selectedDataset
325
+ })
326
+ })
327
+ .then(res => res.json())
328
+ .then(data => {
329
+ if (data.error) {
330
+ outputDiv.innerHTML = '错误: ' + data.error;
331
+ } else {
332
+ // Render Markdown
333
+ // Assuming marked.js or similar is available, or just text for now
334
+ // If you have a markdown renderer, use it.
335
+ // For now, simple text or basic HTML replacement
336
+ outputDiv.innerHTML = formatMarkdown(data.result);
337
+ inspirationState.lastResult = data.result;
338
+ const dlBtn = document.getElementById('inspire-download');
339
+ if (dlBtn) dlBtn.style.display = 'inline-block';
340
+
341
+ const newTaskBtn = document.getElementById('inspire-new-task');
342
+ if (newTaskBtn) {
343
+ newTaskBtn.disabled = false;
344
+ newTaskBtn.style.opacity = '1';
345
+ newTaskBtn.style.cursor = 'pointer';
346
+ }
347
+ }
348
+ })
349
+ .catch(err => {
350
+ outputDiv.innerHTML = '生成模板出错: ' + err;
351
+ });
352
+ }
353
+
354
+ function formatMarkdown(text) {
355
+ if (typeof marked !== 'undefined') {
356
+ // Split text by code blocks (triple backticks or single backticks)
357
+ // We want to escape < and > in normal text, but NOT in code blocks
358
+ const parts = text.split(/(```[\s\S]*?```|`[^`]*`)/g);
359
+
360
+ const escapedParts = parts.map(part => {
361
+ // If it starts with backtick, it's a code block -> return as is
362
+ if (part.startsWith('`')) {
363
+ return part;
364
+ }
365
+ // Otherwise, escape < and >
366
+ return part.replace(/</g, '&lt;').replace(/>/g, '&gt;');
367
+ });
368
+
369
+ return marked.parse(escapedParts.join(''));
370
+ }
371
+
372
+ // Fallback simple formatter
373
+ // Here we DO need to escape because we are building HTML manually
374
+ const escapedText = text.replace(/</g, '&lt;').replace(/>/g, '&gt;');
375
+ let html = escapedText
376
+ .replace(/```([\s\S]*?)```/g, '<pre><code>$1</code></pre>')
377
+ .replace(/\n/g, '<br>');
378
+ return html;
379
+ }
380
+
381
+ function testLLMConnection() {
382
+ const apiKey = document.getElementById('inspire-llm-key').value;
383
+ const baseUrl = document.getElementById('inspire-llm-url').value;
384
+ const model = document.getElementById('inspire-llm-model').value;
385
+ const testBtn = document.getElementById('inspire-test-llm');
386
+ const generateBtn = document.getElementById('inspire-generate');
387
+
388
+ if (!apiKey) {
389
+ alert("请先输入 API Key。");
390
+ return;
391
+ }
392
+
393
+ testBtn.textContent = "测试中...";
394
+ testBtn.disabled = true;
395
+
396
+ fetch('/api/inspiration/test_llm', {
397
+ method: 'POST',
398
+ headers: getHeaders(),
399
+ body: JSON.stringify({ apiKey, baseUrl, model })
400
+ })
401
+ .then(res => res.json())
402
+ .then(data => {
403
+ testBtn.disabled = false;
404
+ if (data.success) {
405
+ testBtn.textContent = "成功";
406
+ testBtn.className = "btn btn-success";
407
+ generateBtn.disabled = false;
408
+ setTimeout(() => { testBtn.textContent = "测试连接"; testBtn.className = "btn btn-secondary"; }, 3000);
409
+ } else {
410
+ testBtn.textContent = "失败";
411
+ testBtn.className = "btn btn-danger";
412
+ alert("连接失败: " + data.error);
413
+ generateBtn.disabled = true;
414
+ setTimeout(() => { testBtn.textContent = "测试连接"; testBtn.className = "btn btn-secondary"; }, 3000);
415
+ }
416
+ })
417
+ .catch(err => {
418
+ testBtn.disabled = false;
419
+ testBtn.textContent = "错误";
420
+ alert("错误: " + err);
421
+ });
422
+ }
423
+
424
+ function downloadInspirationResult() {
425
+ if (!inspirationState.lastResult) return;
426
+
427
+ const blob = new Blob([inspirationState.lastResult], { type: 'text/markdown' });
428
+ const url = URL.createObjectURL(blob);
429
+ const a = document.createElement('a');
430
+ a.href = url;
431
+ a.download = `alpha_inspiration_${inspirationState.selectedDataset}.md`;
432
+ document.body.appendChild(a);
433
+ a.click();
434
+ document.body.removeChild(a);
435
+ URL.revokeObjectURL(url);
436
+ }
437
+
438
+ function resetInspirationTask() {
439
+ inspirationState.selectedDataset = null;
440
+ const display = document.getElementById('inspire-selected-dataset');
441
+ if (display) {
442
+ display.textContent = "";
443
+ display.style.display = 'none';
444
+ }
445
+ document.getElementById('inspire-output').innerHTML = "";
446
+ document.getElementById('inspire-dataset-results').innerHTML = "";
447
+
448
+ const dlBtn = document.getElementById('inspire-download');
449
+ if (dlBtn) dlBtn.style.display = 'none';
450
+
451
+ const newTaskBtn = document.getElementById('inspire-new-task');
452
+ if (newTaskBtn) {
453
+ newTaskBtn.disabled = true;
454
+ newTaskBtn.style.opacity = '0.5';
455
+ newTaskBtn.style.cursor = 'not-allowed';
456
+ }
457
+ // Keep LLM config and Region/Universe selections
458
+ }
459
+
460
+ function toggleInspireColumn(colId) {
461
+ const col = document.getElementById(colId);
462
+ if (col) {
463
+ col.classList.toggle('collapsed');
464
+ }
465
+ }