openfree commited on
Commit
6880659
ยท
verified ยท
1 Parent(s): 490ab49

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +89 -60
app.py CHANGED
@@ -754,7 +754,7 @@ Provide specific, practical improvements."""
754
 
755
  # --- Random theme generator ---
756
  def generate_random_webnovel_theme(genre: str, language: str) -> str:
757
- """Generate random web novel theme using novel_themes.json"""
758
  try:
759
  # Load novel_themes.json
760
  json_path = Path("novel_themes.json")
@@ -767,7 +767,7 @@ def generate_random_webnovel_theme(genre: str, language: str) -> str:
767
 
768
  # Map genres to theme data
769
  genre_mapping = {
770
- "๋กœ๋งจ์Šค": ["romance_fantasy_villainess", "villainess_wants_to_be_lazy"],
771
  "๋กœํŒ": ["romance_fantasy_villainess", "BL_novel_transmigration", "regression_childcare"],
772
  "ํŒํƒ€์ง€": ["system_constellation_hunter", "tower_ascension_challenger", "necromancer_solo_leveling"],
773
  "ํ˜„ํŒ": ["system_constellation_hunter", "chaebol_family_intrigue", "post_apocalypse_survival"],
@@ -792,17 +792,25 @@ def generate_random_webnovel_theme(genre: str, language: str) -> str:
792
  character_data = themes_data["characters"].get(selected_character_key, {})
793
  character_variations = character_data.get("variations", [])
794
  character_desc = random.choice(character_variations) if character_variations else ""
 
795
 
796
  # Get settings
797
  settings = compatible_elements.get("settings", [])
798
  selected_setting = random.choice(settings) if settings else ""
799
 
 
 
 
 
 
 
 
800
  # Get mechanics
801
  mechanics_keys = list(themes_data.get("core_mechanics", {}).keys())
802
  selected_mechanic = random.choice(mechanics_keys) if mechanics_keys else ""
803
  mechanic_data = themes_data["core_mechanics"].get(selected_mechanic, {})
804
  plot_points = mechanic_data.get("plot_points", [])
805
- selected_plot = random.choice(plot_points[:2]) if plot_points else ""
806
 
807
  # Get hooks
808
  hook_types = list(themes_data.get("episode_hooks", {}).keys())
@@ -812,72 +820,93 @@ def generate_random_webnovel_theme(genre: str, language: str) -> str:
812
 
813
  # Get items/artifacts
814
  item_categories = list(themes_data.get("key_items_and_artifacts", {}).keys())
815
- if item_categories:
816
  selected_category = random.choice(item_categories)
817
  items = themes_data["key_items_and_artifacts"].get(selected_category, [])
818
  selected_item = random.choice(items) if items else ""
819
  else:
820
  selected_item = ""
821
 
822
- # Construct theme based on language
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
823
  if language == "Korean":
824
- # Create engaging theme description
825
- theme_parts = []
826
-
827
- # Add hook if available
828
- if selected_hook:
829
- theme_parts.append(f"ใ€๋„์ž…ใ€‘{selected_hook[:100]}...")
830
-
831
- # Add main description
832
- if character_desc:
833
- theme_parts.append(f"\nใ€์„ค์ •ใ€‘{character_desc}")
834
-
835
- # Add setting
836
- if selected_setting:
837
- theme_parts.append(f"\nใ€๋ฐฐ๊ฒฝใ€‘{selected_setting}")
838
-
839
- # Add key item if relevant
840
- if selected_item and genre in ["ํŒํƒ€์ง€", "ํ˜„ํŒ", "๋ฌดํ˜‘"]:
841
- theme_parts.append(f"\nใ€ํ•ต์‹ฌ ์•„์ดํ…œใ€‘{selected_item}")
842
-
843
- # Add plot direction
844
- if selected_plot:
845
- theme_parts.append(f"\nใ€์ „๊ฐœใ€‘{selected_plot}")
846
-
847
- theme = "\n".join(theme_parts)
848
-
 
 
 
 
849
  else: # English
850
- theme_parts = []
851
-
852
- if selected_hook:
853
- theme_parts.append(f"ใ€Openingใ€‘{selected_hook[:100]}...")
854
-
855
- if character_desc:
856
- # Simple translation of key concepts
857
- trans_desc = character_desc.replace("ํšŒ๊ท€", "regression")
858
- trans_desc = trans_desc.replace("๋น™์˜", "transmigration")
859
- trans_desc = trans_desc.replace("๊ฐ์„ฑ", "awakening")
860
- theme_parts.append(f"\nใ€Settingใ€‘{trans_desc}")
861
-
862
- if selected_setting:
863
- theme_parts.append(f"\nใ€Backgroundใ€‘{selected_setting}")
864
-
865
- if selected_item and genre in ["ํŒํƒ€์ง€", "ํ˜„ํŒ", "๋ฌดํ˜‘"]:
866
- theme_parts.append(f"\nใ€Key Itemใ€‘{selected_item}")
867
-
868
- if selected_plot:
869
- theme_parts.append(f"\nใ€Plotใ€‘{selected_plot}")
870
-
871
- theme = "\n".join(theme_parts)
872
-
873
- # If theme is too short, add fusion genre
874
- if len(theme) < 200 and "fusion_genres" in themes_data:
875
- fusion_options = list(themes_data["fusion_genres"].values())
876
- if fusion_options:
877
- fusion = random.choice(fusion_options)
878
- theme += f"\n\nใ€ํŠน๋ณ„ ์„ค์ •ใ€‘{fusion}" if language == "Korean" else f"\n\nใ€Special Settingใ€‘{fusion}"
879
 
880
- return theme
881
 
882
  except Exception as e:
883
  logger.error(f"Error generating theme from JSON: {e}")
 
754
 
755
  # --- Random theme generator ---
756
  def generate_random_webnovel_theme(genre: str, language: str) -> str:
757
+ """Generate random web novel theme using novel_themes.json and LLM"""
758
  try:
759
  # Load novel_themes.json
760
  json_path = Path("novel_themes.json")
 
767
 
768
  # Map genres to theme data
769
  genre_mapping = {
770
+ "๋กœ๋งจ์Šค": ["romance_fantasy_villainess", "villainess_wants_to_be_lazy", "chaebol_family_intrigue"],
771
  "๋กœํŒ": ["romance_fantasy_villainess", "BL_novel_transmigration", "regression_childcare"],
772
  "ํŒํƒ€์ง€": ["system_constellation_hunter", "tower_ascension_challenger", "necromancer_solo_leveling"],
773
  "ํ˜„ํŒ": ["system_constellation_hunter", "chaebol_family_intrigue", "post_apocalypse_survival"],
 
792
  character_data = themes_data["characters"].get(selected_character_key, {})
793
  character_variations = character_data.get("variations", [])
794
  character_desc = random.choice(character_variations) if character_variations else ""
795
+ character_traits = character_data.get("traits", [])
796
 
797
  # Get settings
798
  settings = compatible_elements.get("settings", [])
799
  selected_setting = random.choice(settings) if settings else ""
800
 
801
+ # Get all available settings for more variety
802
+ all_settings = themes_data.get("settings", {})
803
+ setting_details = []
804
+ for setting_list in all_settings.values():
805
+ setting_details.extend(setting_list)
806
+ specific_setting = random.choice(setting_details) if setting_details else selected_setting
807
+
808
  # Get mechanics
809
  mechanics_keys = list(themes_data.get("core_mechanics", {}).keys())
810
  selected_mechanic = random.choice(mechanics_keys) if mechanics_keys else ""
811
  mechanic_data = themes_data["core_mechanics"].get(selected_mechanic, {})
812
  plot_points = mechanic_data.get("plot_points", [])
813
+ reader_questions = mechanic_data.get("reader_questions", [])
814
 
815
  # Get hooks
816
  hook_types = list(themes_data.get("episode_hooks", {}).keys())
 
820
 
821
  # Get items/artifacts
822
  item_categories = list(themes_data.get("key_items_and_artifacts", {}).keys())
823
+ if item_categories and genre in ["ํŒํƒ€์ง€", "ํ˜„ํŒ", "๋ฌดํ˜‘"]:
824
  selected_category = random.choice(item_categories)
825
  items = themes_data["key_items_and_artifacts"].get(selected_category, [])
826
  selected_item = random.choice(items) if items else ""
827
  else:
828
  selected_item = ""
829
 
830
+ # Get plot twists
831
+ twist_categories = list(themes_data.get("plot_twists_and_cliches", {}).keys())
832
+ if twist_categories:
833
+ selected_twist_cat = random.choice(twist_categories)
834
+ twists = themes_data["plot_twists_and_cliches"].get(selected_twist_cat, [])
835
+ selected_twist = random.choice(twists) if twists else ""
836
+ else:
837
+ selected_twist = ""
838
+
839
+ # Check for fusion genres
840
+ fusion_genres = themes_data.get("fusion_genres", {})
841
+ fusion_options = list(fusion_genres.values())
842
+ selected_fusion = random.choice(fusion_options) if fusion_options and random.random() > 0.7 else ""
843
+
844
+ # Now use LLM to create a coherent theme from these elements
845
+ system = WebNovelSystem()
846
+
847
+ # Create prompt for LLM
848
  if language == "Korean":
849
+ prompt = f"""๋‹ค์Œ ์š”์†Œ๋“ค์„ ํ™œ์šฉํ•˜์—ฌ {genre} ์žฅ๋ฅด์˜ ๋งค๋ ฅ์ ์ธ ์›น์†Œ์„ค ํ…Œ๋งˆ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”:
850
+
851
+ ใ€์„ ํƒ๋œ ์š”์†Œ๋“คใ€‘
852
+ - ํ•ต์‹ฌ ์žฅ๋ฅด: {selected_genre_key}
853
+ - ์บ๋ฆญํ„ฐ: {character_desc}
854
+ - ์บ๋ฆญํ„ฐ ํŠน์„ฑ: {', '.join(character_traits[:3])}
855
+ - ๋ฐฐ๊ฒฝ: {specific_setting}
856
+ - ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜: {selected_mechanic}
857
+ {"- ์•„์ดํ…œ: " + selected_item if selected_item else ""}
858
+ {"- ๋ฐ˜์ „ ์š”์†Œ: " + selected_twist if selected_twist else ""}
859
+ {"- ํ“จ์ „ ์„ค์ •: " + selected_fusion if selected_fusion else ""}
860
+
861
+ ใ€์ฐธ๊ณ  ํ›…ใ€‘
862
+ {selected_hook}
863
+
864
+ ใ€๋…์ž๋ฅผ ์‚ฌ๋กœ์žก์„ ์งˆ๋ฌธ๋“คใ€‘
865
+ {chr(10).join(reader_questions[:2]) if reader_questions else ""}
866
+
867
+ ์š”๊ตฌ์‚ฌํ•ญ:
868
+ 1. ์œ„ ์š”์†Œ๋“ค์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์œตํ•ฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ๋งค๋ ฅ์ ์ธ ์Šคํ† ๋ฆฌ๋กœ ๋งŒ๋“œ์„ธ์š”
869
+ 2. ํ•œ๊ตญ ์›น์†Œ์„ค ๋…์ž๋“ค์ด ์ข‹์•„ํ•  ๋งŒํ•œ ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”
870
+ 3. ์ œ๋ชฉ์ด ๋– ์˜ค๋ฅผ ์ •๋„๋กœ ๊ตฌ์ฒด์ ์ด๋ฉด์„œ๋„ ํฅ๋ฏธ๋กœ์šด ์„ค์ •์„ ๋งŒ๋“œ์„ธ์š”
871
+ 4. 200-300์ž ๋‚ด์™ธ๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์„ธ์š”
872
+
873
+ ํ˜•์‹:
874
+ ํ•œ ์ค„์˜ ๊ฐ•๋ ฌํ•œ ๋„์ž…๋ฌธ์œผ๋กœ ์‹œ์ž‘ํ•˜์„ธ์š”.
875
+ ๊ทธ ๋‹ค์Œ ์ฃผ์ธ๊ณต์˜ ์ƒํ™ฉ๊ณผ ๋ชฉํ‘œ๋ฅผ ๋ช…ํ™•ํžˆ ์ œ์‹œํ•˜์„ธ์š”.
876
+ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋…์ž์˜ ๊ธฐ๋Œ€๊ฐ์„ ์ž๊ทนํ•˜๋Š” ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”."""
877
+
878
  else: # English
879
+ prompt = f"""Create an engaging web novel theme for {genre} genre using these elements:
880
+
881
+ ใ€Selected Elementsใ€‘
882
+ - Core genre: {selected_genre_key}
883
+ - Character: {character_desc}
884
+ - Character traits: {', '.join(character_traits[:3])}
885
+ - Setting: {specific_setting}
886
+ - Core mechanism: {selected_mechanic}
887
+ {"- Item: " + selected_item if selected_item else ""}
888
+ {"- Twist: " + selected_twist if selected_twist else ""}
889
+ {"- Fusion: " + selected_fusion if selected_fusion else ""}
890
+
891
+ ใ€Reference Hookใ€‘
892
+ {selected_hook}
893
+
894
+ Requirements:
895
+ 1. Naturally blend these elements into one attractive story
896
+ 2. Add settings that Korean web novel readers would love
897
+ 3. Make it specific and intriguing enough to suggest a title
898
+ 4. Keep it concise, around 200-300 characters
899
+
900
+ Format:
901
+ Start with one powerful opening line.
902
+ Then clearly present the protagonist's situation and goal.
903
+ Finally add elements that spark reader anticipation."""
904
+
905
+ # Call LLM to generate theme
906
+ messages = [{"role": "user", "content": prompt}]
907
+ generated_theme = system.call_llm_sync(messages, "writer", language)
908
 
909
+ return generated_theme
910
 
911
  except Exception as e:
912
  logger.error(f"Error generating theme from JSON: {e}")