openfree commited on
Commit
73f06f2
ยท
verified ยท
1 Parent(s): b1fb01e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +85 -46
app.py CHANGED
@@ -42,10 +42,10 @@ API_URL = "https://api.friendli.ai/dedicated/v1/chat/completions"
42
  MODEL_ID = "dep86pjolcjjnv8"
43
  DB_PATH = "webnovel_sessions_v1.db"
44
 
45
- # Target settings for web novel
46
  TARGET_EPISODES = 40 # 40ํ™” ์™„๊ฒฐ
47
- WORDS_PER_EPISODE = 200 # ๊ฐ ํ™”๋‹น 200-300 ๋‹จ์–ด
48
- TARGET_WORDS = TARGET_EPISODES * WORDS_PER_EPISODE # ์ด 8000 ๋‹จ์–ด
49
 
50
  # Web novel genres
51
  WEBNOVEL_GENRES = {
@@ -397,7 +397,7 @@ class WebNovelSystem:
397
 
398
  **์ฃผ์ œ:** {query}
399
  **์žฅ๋ฅด:** {genre}
400
- **๋ชฉํ‘œ:** 40ํ™” ์™„๊ฒฐ, ์ด 8,000๋‹จ์–ด
401
 
402
  **์žฅ๋ฅด ํ•„์ˆ˜ ์š”์†Œ:**
403
  - ํ•ต์‹ฌ ์š”์†Œ: {', '.join(genre_info.get('key_elements', []))}
@@ -405,25 +405,26 @@ class WebNovelSystem:
405
  - ํ•„์ˆ˜ ํฌํ•จ: {', '.join(genre_info.get('must_have', []))}
406
 
407
  **์ „์ฒด ๊ตฌ์„ฑ:**
408
- 1. **1-5ํ™”**: ํฅ๋ฏธ๋กœ์šด ๋„์ž…๋ถ€, ์ฃผ์ธ๊ณต๊ณผ ์„ธ๊ณ„๊ด€ ์†Œ๊ฐœ
409
- 2. **6-15ํ™”**: ๊ฐˆ๋“ฑ ์ƒ์Šน, ์ฃผ์š” ์ธ๋ฌผ ๊ด€๊ณ„ ํ˜•์„ฑ
410
- 3. **16-25ํ™”**: ์ค‘๊ฐ„ ํด๋ผ์ด๋งฅ์Šค, ๋ฐ˜์ „
411
- 4. **26-35ํ™”**: ์ตœ์ข… ๊ฐˆ๋“ฑ์œผ๋กœ ์น˜๋‹ซ๊ธฐ
412
- 5. **36-40ํ™”**: ํด๋ผ์ด๋งฅ์Šค์™€ ๊ฒฐ๋ง
413
 
414
  **๊ฐ ํ™” ๊ตฌ์„ฑ ์›์น™:**
415
- - 200-300๋‹จ์–ด ๋ถ„๋Ÿ‰
 
416
  - ๋งค ํ™” ๋ ๊ฐ•๋ ฅํ•œ ํ›„ํฌ
417
  - ๋น ๋ฅธ ์ „๊ฐœ์™€ ๋ชฐ์ž…๊ฐ
418
  - ๋…์ž๊ฐ€ ๋‹ค์Œ ํ™”๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋งŒ๋“ค๊ธฐ
419
 
420
- ๊ตฌ์ฒด์ ์ธ 40ํ™” ํ”Œ๋กฏ๋ผ์ธ์„ ์ œ์‹œํ•˜์„ธ์š”.""",
421
 
422
  "English": f"""Plan a Korean-style web novel for {genre} genre.
423
 
424
  **Theme:** {query}
425
  **Genre:** {genre}
426
- **Goal:** 40 episodes, total 8,000 words
427
 
428
  **Genre Requirements:**
429
  - Key elements: {', '.join(genre_info.get('key_elements', []))}
@@ -431,26 +432,27 @@ class WebNovelSystem:
431
  - Must include: {', '.join(genre_info.get('must_have', []))}
432
 
433
  **Overall Structure:**
434
- 1. **Episodes 1-5**: Engaging introduction, protagonist and world
435
- 2. **Episodes 6-15**: Rising conflict, main relationships
436
- 3. **Episodes 16-25**: Mid climax, plot twist
437
- 4. **Episodes 26-35**: Building to final conflict
438
- 5. **Episodes 36-40**: Climax and resolution
439
 
440
  **Episode Principles:**
441
- - 200-300 words each
 
442
  - Strong hook at episode end
443
  - Fast pacing and immersion
444
  - Make readers crave next episode
445
 
446
- Provide detailed 40-episode plotline."""
447
  }
448
 
449
  return lang_prompts.get(language, lang_prompts["Korean"])
450
 
451
  def create_episode_prompt(self, episode_num: int, plot_outline: str,
452
  previous_content: str, genre: str, language: str) -> str:
453
- """Create prompt for individual episode"""
454
  genre_info = GENRE_ELEMENTS.get(genre, {})
455
  hooks = EPISODE_HOOKS.get(genre, ["๋‹ค์Œ ์ˆœ๊ฐ„, ์ถฉ๊ฒฉ์ ์ธ ์ผ์ด..."])
456
 
@@ -458,48 +460,78 @@ Provide detailed 40-episode plotline."""
458
  "Korean": f"""์›น์†Œ์„ค {episode_num}ํ™”๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.
459
 
460
  **์žฅ๋ฅด:** {genre}
461
- **๋ถ„๋Ÿ‰:** 200-300๋‹จ์–ด (์—„๊ฒฉํžˆ ์ค€์ˆ˜)
462
 
463
  **์ „์ฒด ํ”Œ๋กฏ์—์„œ {episode_num}ํ™” ๋‚ด์šฉ:**
464
  {self._extract_episode_plan(plot_outline, episode_num)}
465
 
466
  **์ด์ „ ๋‚ด์šฉ ์š”์•ฝ:**
467
- {previous_content[-1000:] if previous_content else "์ฒซ ํ™”์ž…๋‹ˆ๋‹ค"}
468
 
469
  **์ž‘์„ฑ ์ง€์นจ:**
470
- 1. ์ฆ‰์‹œ ๋ณธ๋ก ์œผ๋กœ - ๋ถˆํ•„์š”ํ•œ ๋ฌ˜์‚ฌ ๊ธˆ์ง€
471
- 2. ๋Œ€ํ™”์™€ ํ–‰๋™ ์ค‘์‹ฌ
472
- 3. ๋…์ž๋ฅผ ์‚ฌ๋กœ์žก๋Š” ์ „๊ฐœ
473
- 4. ๊ฐ์ •์  ๋ชฐ์ž… ์œ ๋„
474
- 5. ๋งˆ์ง€๋ง‰์€ ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ ํ™”๋ฅผ ์ฝ๊ณ  ์‹ถ๊ฒŒ ๋งŒ๋“œ๋Š” ํ›„ํฌ
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
475
 
476
  **์ฐธ๊ณ  ํ›„ํฌ ์˜ˆ์‹œ:**
477
  {random.choice(hooks)}
478
 
479
- ๋น ๋ฅด๊ณ  ์ค‘๋…์„ฑ ์žˆ๋Š” {episode_num}ํ™”๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.""",
480
 
481
  "English": f"""Write episode {episode_num} of the web novel.
482
 
483
  **Genre:** {genre}
484
- **Length:** 200-300 words (strict)
485
 
486
  **Episode {episode_num} from plot:**
487
  {self._extract_episode_plan(plot_outline, episode_num)}
488
 
489
  **Previous content:**
490
- {previous_content[-1000:] if previous_content else "First episode"}
491
 
492
  **Guidelines:**
493
- 1. Jump straight to action - no filler
494
- 2. Dialogue and action focused
495
- 3. Gripping development
496
- 4. Emotional immersion
497
- 5. End with hook for next episode
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
498
 
499
  **Hook example:**
500
  {random.choice(hooks)}
501
 
502
- Write fast-paced, addictive episode {episode_num}."""
503
  }
504
 
505
  return lang_prompts.get(language, lang_prompts["Korean"])
@@ -577,7 +609,8 @@ Provide specific improvements."""
577
  system_prompts = self.get_system_prompts(language)
578
  full_messages = [{"role": "system", "content": system_prompts.get(role, "")}, *messages]
579
 
580
- max_tokens = 3000 if role == "writer" else 10000
 
581
 
582
  payload = {
583
  "model": self.model_id,
@@ -639,18 +672,21 @@ Provide specific improvements."""
639
  yield f"โŒ Error occurred: {str(e)}"
640
 
641
  def get_system_prompts(self, language: str) -> Dict[str, str]:
642
- """System prompts for web novel roles"""
643
  base_prompts = {
644
  "Korean": {
645
  "planner": """๋‹น์‹ ์€ ํ•œ๊ตญ ์›น์†Œ์„ค ์‹œ์žฅ์„ ์™„๋ฒฝํžˆ ์ดํ•ดํ•˜๋Š” ๊ธฐํš์ž์ž…๋‹ˆ๋‹ค.
646
  ๋…์ž๋ฅผ ์ค‘๋…์‹œํ‚ค๋Š” ํ”Œ๋กฏ๊ณผ ์ „๊ฐœ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.
647
  ์žฅ๋ฅด๋ณ„ ๊ด€์Šต๊ณผ ๋…์ž ๊ธฐ๋Œ€๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค.
648
- 40ํ™” ์™„๊ฒฐ ๊ตฌ์กฐ๋กœ ์™„๋ฒฝํ•œ ๊ธฐ์Šน์ „๊ฒฐ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.""",
 
649
 
650
  "writer": """๋‹น์‹ ์€ ๋…์ž๋ฅผ ์‚ฌ๋กœ์žก๋Š” ์›น์†Œ์„ค ์ž‘๊ฐ€์ž…๋‹ˆ๋‹ค.
651
- ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ชฐ์ž…๊ฐ ์žˆ๋Š” ๋ฌธ์ฒด๋ฅผ ๊ตฌ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
652
- ๋งค ํ™” ๋์— ๋‹ค์Œ ํ™”๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
653
- ๋Œ€ํ™”์™€ ํ–‰๋™์œผ๋กœ ์ด์•ผ๊ธฐ๋ฅผ ์ „๊ฐœํ•ฉ๋‹ˆ๋‹ค.""",
 
 
654
 
655
  "critic": """๋‹น์‹ ์€ ์›น์†Œ์„ค ๋…์ž์˜ ๋งˆ์Œ์„ ์ฝ๋Š” ํ‰๋ก ๊ฐ€์ž…๋‹ˆ๋‹ค.
656
  ์žฌ๋ฏธ์™€ ๋ชฐ์ž…๊ฐ์„ ์ตœ์šฐ์„ ์œผ๋กœ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
@@ -661,12 +697,15 @@ Provide specific improvements."""
661
  "planner": """You perfectly understand the Korean web novel market.
662
  Design addictive plots and developments.
663
  Accurately grasp genre conventions and reader expectations.
664
- Create perfect story structure in 40 episodes.""",
 
665
 
666
  "writer": """You are a web novelist who captivates readers.
667
- Use concise and immersive writing style.
668
- Make readers crave the next episode.
669
- Develop story through dialogue and action.""",
 
 
670
 
671
  "critic": """You read web novel readers' minds.
672
  Prioritize fun and immersion in evaluation.
 
42
  MODEL_ID = "dep86pjolcjjnv8"
43
  DB_PATH = "webnovel_sessions_v1.db"
44
 
45
+ # Target settings for web novel - UPDATED FOR LONGER EPISODES
46
  TARGET_EPISODES = 40 # 40ํ™” ์™„๊ฒฐ
47
+ WORDS_PER_EPISODE = 400 # ๊ฐ ํ™”๋‹น 400-600 ๋‹จ์–ด (๊ธฐ์กด 200-300์—์„œ ์ฆ๊ฐ€)
48
+ TARGET_WORDS = TARGET_EPISODES * WORDS_PER_EPISODE # ์ด 16000 ๋‹จ์–ด
49
 
50
  # Web novel genres
51
  WEBNOVEL_GENRES = {
 
397
 
398
  **์ฃผ์ œ:** {query}
399
  **์žฅ๋ฅด:** {genre}
400
+ **๋ชฉํ‘œ:** 40ํ™” ์™„๊ฒฐ, ์ด 16,000๋‹จ์–ด
401
 
402
  **์žฅ๋ฅด ํ•„์ˆ˜ ์š”์†Œ:**
403
  - ํ•ต์‹ฌ ์š”์†Œ: {', '.join(genre_info.get('key_elements', []))}
 
405
  - ํ•„์ˆ˜ ํฌํ•จ: {', '.join(genre_info.get('must_have', []))}
406
 
407
  **์ „์ฒด ๊ตฌ์„ฑ:**
408
+ 1. **1-5ํ™”**: ํฅ๋ฏธ๋กœ์šด ๋„์ž…๋ถ€, ์ฃผ์ธ๊ณต๊ณผ ์„ธ๊ณ„๊ด€ ์†Œ๊ฐœ, ํ•ต์‹ฌ ๊ฐˆ๋“ฑ ์ œ์‹œ
409
+ 2. **6-15ํ™”**: ๊ฐˆ๋“ฑ ์ƒ์Šน, ์ฃผ์š” ์ธ๋ฌผ ๊ด€๊ณ„ ํ˜•์„ฑ, ์ฒซ ๋ฒˆ์งธ ์œ„๊ธฐ
410
+ 3. **16-25ํ™”**: ์ค‘๊ฐ„ ํด๋ผ์ด๋งฅ์Šค, ๋ฐ˜์ „, ์ƒˆ๋กœ์šด ์ง„์‹ค ๋ฐœ๊ฒฌ
411
+ 4. **26-35ํ™”**: ์ตœ์ข… ๊ฐˆ๋“ฑ์œผ๋กœ ์น˜๋‹ซ๊ธฐ, ๋ชจ๋“  ๊ฐˆ๋“ฑ์˜ ์ˆ˜๋ ด
412
+ 5. **36-40ํ™”**: ๋Œ€๊ฒฐ์ „, ํด๋ผ์ด๋งฅ์Šค์™€ ๊ฒฐ๋ง, ๊ฐ๋™์  ๋งˆ๋ฌด๋ฆฌ
413
 
414
  **๊ฐ ํ™” ๊ตฌ์„ฑ ์›์น™:**
415
+ - 400-600๋‹จ์–ด ๋ถ„๋Ÿ‰ (์ถฉ์‹คํ•œ ๋‚ด์šฉ)
416
+ - 3-4๊ฐœ์˜ ์ฃผ์š” ์žฅ๋ฉด ํฌํ•จ
417
  - ๋งค ํ™” ๋ ๊ฐ•๋ ฅํ•œ ํ›„ํฌ
418
  - ๋น ๋ฅธ ์ „๊ฐœ์™€ ๋ชฐ์ž…๊ฐ
419
  - ๋…์ž๊ฐ€ ๋‹ค์Œ ํ™”๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋งŒ๋“ค๊ธฐ
420
 
421
+ ๊ตฌ์ฒด์ ์ธ 40ํ™” ํ”Œ๋กฏ๋ผ์ธ์„ ์ œ์‹œํ•˜์„ธ์š”. ๊ฐ ํ™”๋งˆ๋‹ค ํ•ต์‹ฌ ์‚ฌ๊ฑด๊ณผ ์ „๊ฐœ๋ฅผ ๋ช…์‹œํ•˜์„ธ์š”.""",
422
 
423
  "English": f"""Plan a Korean-style web novel for {genre} genre.
424
 
425
  **Theme:** {query}
426
  **Genre:** {genre}
427
+ **Goal:** 40 episodes, total 16,000 words
428
 
429
  **Genre Requirements:**
430
  - Key elements: {', '.join(genre_info.get('key_elements', []))}
 
432
  - Must include: {', '.join(genre_info.get('must_have', []))}
433
 
434
  **Overall Structure:**
435
+ 1. **Episodes 1-5**: Engaging introduction, protagonist and world, core conflict
436
+ 2. **Episodes 6-15**: Rising conflict, main relationships, first crisis
437
+ 3. **Episodes 16-25**: Mid climax, plot twist, new revelations
438
+ 4. **Episodes 26-35**: Building to final conflict, convergence of all conflicts
439
+ 5. **Episodes 36-40**: Final battle, climax and resolution, emotional closure
440
 
441
  **Episode Principles:**
442
+ - 400-600 words each (substantial content)
443
+ - 3-4 major scenes per episode
444
  - Strong hook at episode end
445
  - Fast pacing and immersion
446
  - Make readers crave next episode
447
 
448
+ Provide detailed 40-episode plotline with key events for each episode."""
449
  }
450
 
451
  return lang_prompts.get(language, lang_prompts["Korean"])
452
 
453
  def create_episode_prompt(self, episode_num: int, plot_outline: str,
454
  previous_content: str, genre: str, language: str) -> str:
455
+ """Create prompt for individual episode - UPDATED FOR LONGER CONTENT"""
456
  genre_info = GENRE_ELEMENTS.get(genre, {})
457
  hooks = EPISODE_HOOKS.get(genre, ["๋‹ค์Œ ์ˆœ๊ฐ„, ์ถฉ๊ฒฉ์ ์ธ ์ผ์ด..."])
458
 
 
460
  "Korean": f"""์›น์†Œ์„ค {episode_num}ํ™”๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.
461
 
462
  **์žฅ๋ฅด:** {genre}
463
+ **๋ถ„๋Ÿ‰:** 400-600๋‹จ์–ด (์—„๊ฒฉํžˆ ์ค€์ˆ˜ - ์ถฉ์‹คํ•œ ๋‚ด์šฉ์œผ๋กœ)
464
 
465
  **์ „์ฒด ํ”Œ๋กฏ์—์„œ {episode_num}ํ™” ๋‚ด์šฉ:**
466
  {self._extract_episode_plan(plot_outline, episode_num)}
467
 
468
  **์ด์ „ ๋‚ด์šฉ ์š”์•ฝ:**
469
+ {previous_content[-1500:] if previous_content else "์ฒซ ํ™”์ž…๋‹ˆ๋‹ค"}
470
 
471
  **์ž‘์„ฑ ์ง€์นจ:**
472
+ 1. **๊ตฌ์„ฑ**: 3-4๊ฐœ์˜ ์ฃผ์š” ์žฅ๋ฉด์œผ๋กœ ๊ตฌ์„ฑ
473
+ - ๋„์ž…๋ถ€: ์ด์ „ ํ™” ์—ฐ๊ฒฐ ๋ฐ ํ˜„์žฌ ์ƒํ™ฉ
474
+ - ์ „๊ฐœ๋ถ€: 2-3๊ฐœ์˜ ํ•ต์‹ฌ ์‚ฌ๊ฑด/๋Œ€ํ™”
475
+ - ํด๋ผ์ด๋งฅ์Šค: ๊ธด์žฅ๊ฐ ์ตœ๊ณ ์กฐ
476
+ - ํ›„ํฌ: ๋‹ค์Œ ํ™” ์˜ˆ๊ณ 
477
+
478
+ 2. **ํ•„์ˆ˜ ์š”์†Œ:**
479
+ - ์ƒ์ƒํ•œ ๋Œ€ํ™”์™€ ํ–‰๋™ ๋ฌ˜์‚ฌ
480
+ - ์บ๋ฆญํ„ฐ ๊ฐ์ •๊ณผ ๋‚ด๋ฉด ๊ฐˆ๋“ฑ
481
+ - ์žฅ๋ฉด ์ „ํ™˜๊ณผ ํ…œํฌ ์กฐ์ ˆ
482
+ - ๋…์ž ๋ชฐ์ž…์„ ์œ„ํ•œ ๊ฐ๊ฐ์  ๋ฌ˜์‚ฌ
483
+
484
+ 3. **์žฅ๋ฅด๋ณ„ ํŠน์ƒ‰:**
485
+ - {genre_info.get('episode_structure', '๋น ๋ฅธ ์ „๊ฐœ')}
486
+ - ํ•ต์‹ฌ ์š”์†Œ 1๊ฐœ ์ด์ƒ ํฌํ•จ
487
+
488
+ 4. **๋ถ„๋Ÿ‰ ๋ฐฐ๋ถ„:**
489
+ - ๋„์ž… (50-80๋‹จ์–ด)
490
+ - ์ฃผ์š” ์ „๊ฐœ (250-350๋‹จ์–ด)
491
+ - ํด๋ผ์ด๋งฅ์Šค์™€ ํ›„ํฌ (100-150๋‹จ์–ด)
492
 
493
  **์ฐธ๊ณ  ํ›„ํฌ ์˜ˆ์‹œ:**
494
  {random.choice(hooks)}
495
 
496
+ {episode_num}ํ™”๋ฅผ ํ’์„ฑํ•˜๊ณ  ๋ชฐ์ž…๊ฐ ์žˆ๊ฒŒ ์ž‘์„ฑํ•˜์„ธ์š”. ๋ฐ˜๋“œ์‹œ 400-600๋‹จ์–ด๋กœ ์ž‘์„ฑํ•˜์„ธ์š”.""",
497
 
498
  "English": f"""Write episode {episode_num} of the web novel.
499
 
500
  **Genre:** {genre}
501
+ **Length:** 400-600 words (strict - with substantial content)
502
 
503
  **Episode {episode_num} from plot:**
504
  {self._extract_episode_plan(plot_outline, episode_num)}
505
 
506
  **Previous content:**
507
+ {previous_content[-1500:] if previous_content else "First episode"}
508
 
509
  **Guidelines:**
510
+ 1. **Structure**: 3-4 major scenes
511
+ - Opening: Connect from previous, current situation
512
+ - Development: 2-3 key events/dialogues
513
+ - Climax: Peak tension
514
+ - Hook: Next episode teaser
515
+
516
+ 2. **Essential elements:**
517
+ - Vivid dialogue and action
518
+ - Character emotions and conflicts
519
+ - Scene transitions and pacing
520
+ - Sensory details for immersion
521
+
522
+ 3. **Genre specifics:**
523
+ - {genre_info.get('episode_structure', 'Fast pacing')}
524
+ - Include at least 1 core element
525
+
526
+ 4. **Word distribution:**
527
+ - Opening (50-80 words)
528
+ - Main development (250-350 words)
529
+ - Climax and hook (100-150 words)
530
 
531
  **Hook example:**
532
  {random.choice(hooks)}
533
 
534
+ Write rich, immersive episode {episode_num}. Must be 400-600 words."""
535
  }
536
 
537
  return lang_prompts.get(language, lang_prompts["Korean"])
 
609
  system_prompts = self.get_system_prompts(language)
610
  full_messages = [{"role": "system", "content": system_prompts.get(role, "")}, *messages]
611
 
612
+ # Increased max_tokens for longer episodes
613
+ max_tokens = 5000 if role == "writer" else 10000
614
 
615
  payload = {
616
  "model": self.model_id,
 
672
  yield f"โŒ Error occurred: {str(e)}"
673
 
674
  def get_system_prompts(self, language: str) -> Dict[str, str]:
675
+ """System prompts for web novel roles - UPDATED FOR LONGER EPISODES"""
676
  base_prompts = {
677
  "Korean": {
678
  "planner": """๋‹น์‹ ์€ ํ•œ๊ตญ ์›น์†Œ์„ค ์‹œ์žฅ์„ ์™„๋ฒฝํžˆ ์ดํ•ดํ•˜๋Š” ๊ธฐํš์ž์ž…๋‹ˆ๋‹ค.
679
  ๋…์ž๋ฅผ ์ค‘๋…์‹œํ‚ค๋Š” ํ”Œ๋กฏ๊ณผ ์ „๊ฐœ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.
680
  ์žฅ๋ฅด๋ณ„ ๊ด€์Šต๊ณผ ๋…์ž ๊ธฐ๋Œ€๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค.
681
+ 40ํ™” ์™„๊ฒฐ ๊ตฌ์กฐ๋กœ ์™„๋ฒฝํ•œ ๊ธฐ์Šน์ „๊ฒฐ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
682
+ ๊ฐ ํ™”๋งˆ๋‹ค ์ถฉ์‹คํ•œ ๋‚ด์šฉ๊ณผ ์ „๊ฐœ๋ฅผ ๊ณ„ํšํ•ฉ๋‹ˆ๋‹ค.""",
683
 
684
  "writer": """๋‹น์‹ ์€ ๋…์ž๋ฅผ ์‚ฌ๋กœ์žก๋Š” ์›น์†Œ์„ค ์ž‘๊ฐ€์ž…๋‹ˆ๋‹ค.
685
+ ํ’๋ถ€ํ•˜๊ณ  ๋ชฐ์ž…๊ฐ ์žˆ๋Š” ๋ฌธ์ฒด๋ฅผ ๊ตฌ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
686
+ ๊ฐ ํ™”๋ฅผ 400-600๋‹จ์–ด๋กœ ์ถฉ์‹คํ•˜๊ฒŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
687
+ ์—ฌ๋Ÿฌ ์žฅ๋ฉด๊ณผ ์ „ํ™˜์„ ํ†ตํ•ด ์ด์•ผ๊ธฐ๋ฅผ ์ „๊ฐœํ•ฉ๋‹ˆ๋‹ค.
688
+ ๋Œ€ํ™”, ํ–‰๋™, ๋‚ด๋ฉด ๋ฌ˜์‚ฌ๋ฅผ ๊ท ํ˜•์žˆ๊ฒŒ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.
689
+ ๋งค ํ™” ๋์— ๊ฐ•๋ ฅํ•œ ํ›„ํฌ๋กœ ๋‹ค์Œ ํ™”๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.""",
690
 
691
  "critic": """๋‹น์‹ ์€ ์›น์†Œ์„ค ๋…์ž์˜ ๋งˆ์Œ์„ ์ฝ๋Š” ํ‰๋ก ๊ฐ€์ž…๋‹ˆ๋‹ค.
692
  ์žฌ๋ฏธ์™€ ๋ชฐ์ž…๊ฐ์„ ์ตœ์šฐ์„ ์œผ๋กœ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
 
697
  "planner": """You perfectly understand the Korean web novel market.
698
  Design addictive plots and developments.
699
  Accurately grasp genre conventions and reader expectations.
700
+ Create perfect story structure in 40 episodes.
701
+ Plan substantial content and development for each episode.""",
702
 
703
  "writer": """You are a web novelist who captivates readers.
704
+ Use rich and immersive writing style.
705
+ Write each episode with 400-600 words faithfully.
706
+ Develop story through multiple scenes and transitions.
707
+ Balance dialogue, action, and inner descriptions.
708
+ End each episode with powerful hook for next.""",
709
 
710
  "critic": """You read web novel readers' minds.
711
  Prioritize fun and immersion in evaluation.