AIRider commited on
Commit
e81352f
ยท
verified ยท
1 Parent(s): 4840e54

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +381 -0
app.py ADDED
@@ -0,0 +1,381 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import random
3
+ import os
4
+ import re
5
+ from huggingface_hub import InferenceClient
6
+ from fpdf import FPDF
7
+ from datetime import datetime
8
+
9
+ def create_client(model_name):
10
+ return InferenceClient(model_name, token=os.getenv("HF_TOKEN"))
11
+
12
+ client = create_client("CohereForAI/c4ai-command-r-plus")
13
+
14
+ def call_api(content, system_message, max_tokens, temperature, top_p):
15
+ messages = [{"role": "system", "content": system_message}, {"role": "user", "content": content}]
16
+ random_seed = random.randint(0, 1000000)
17
+ response = client.chat_completion(messages=messages, max_tokens=max_tokens, temperature=temperature, top_p=top_p, seed=random_seed)
18
+ return response.choices[0].message.content
19
+
20
+ def analyze_info(category, style, topic, references1, references2, references3):
21
+ return f"์„ ํƒํ•œ ์นดํ…Œ๊ณ ๋ฆฌ: {category}\n์„ ํƒํ•œ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ: {style}\n๋ธ”๋กœ๊ทธ ์ฃผ์ œ: {topic}\n์ฐธ๊ณ  ๊ธ€1: {references1}\n์ฐธ๊ณ  ๊ธ€2: {references2}\n์ฐธ๊ณ  ๊ธ€3: {references3}"
22
+
23
+ def suggest_title(category, style, topic, references1, references2, references3, category_prompt, style_prompt, max_tokens, temperature, top_p):
24
+ full_content = analyze_info(category, style, topic, references1, references2, references3)
25
+ combined_prompt = f"{category_prompt}\n\n{style_prompt}"
26
+ modified_text = call_api(full_content, combined_prompt, max_tokens, temperature, top_p)
27
+ return modified_text
28
+
29
+ def generate_outline(category, style, topic, references1, references2, references3, title, category_prompt, style_prompt, max_tokens, temperature, top_p):
30
+ full_content = analyze_info(category, style, topic, references1, references2, references3)
31
+ content = f"{full_content}\nTitle: {title}"
32
+ combined_prompt = f"{category_prompt}\n\n{style_prompt}"
33
+ modified_text = call_api(content, combined_prompt, max_tokens, temperature, top_p)
34
+ return modified_text
35
+
36
+ def generate_blog_post(category, style, topic, references1, references2, references3, title, outline, category_prompt, style_prompt, max_tokens, temperature, top_p):
37
+ full_content = analyze_info(category, style, topic, references1, references2, references3)
38
+ content = f"{full_content}\nTitle: {title}\nOutline: {outline}"
39
+ combined_prompt = f"{category_prompt}\n\n{style_prompt}"
40
+ modified_text = call_api(content, combined_prompt, max_tokens, temperature, top_p)
41
+ formatted_text = modified_text.replace('\n', '\n\n')
42
+ return formatted_text
43
+
44
+ def get_title_prompt(category):
45
+ if (category == "๊ณ ๊ฐ๋ฐ˜์‘ํ˜•"):
46
+ return """
47
+ #๋ธ”๋กœ๊ทธ ์ œ๋ชฉ ์ƒ์„ฑ ๊ทœ์น™(์ƒํ’ˆ๋ฆฌ๋ทฐ_๊ณ ๊ฐ๋ฐ˜์‘ํ˜•)
48
+ ##[๊ธฐ๋ณธ๊ทœ์น™]
49
+ 1. ๋ฐ˜๋“œ์‹œ ํ•œ๊ตญ์–ด(ํ•œ๊ธ€)๋กœ ์ž‘์„ฑํ•˜๋ผ.
50
+ 2. ๋„ˆ๋Š” ๊ฐ€์žฅ ์ฃผ๋ชฉ๋ฐ›๋Š” ๋งˆ์ผ€ํ„ฐ์ด๋ฉฐ ๋ธ”๋กœ๊ทธ ๋งˆ์ผ€ํŒ… ์ „๋ฌธ๊ฐ€์ด๋‹ค.
51
+ 3. ํŠนํžˆ ๋„ˆ๋Š” '๊ณ ๊ฐ๋ฐ˜์‘ ์ƒํ’ˆ๋ฆฌ๋ทฐ' ์ „๋ฌธ ๋ธ”๋กœ๊ทธ ๋งˆ์ผ€ํ„ฐ์ด๋‹ค.
52
+ 4. ์ƒํ’ˆ ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ•˜๋˜, ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฐ˜์‘์ด ํฌํ•จ๋œ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ผ.
53
+ 5. ์„ ํƒ๋œ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜์—ฌ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ผ.
54
+
55
+ ##[๋ธ”๋กœ๊ทธ ์ œ๋ชฉ ์ž‘์„ฑ ๊ทœ์น™]
56
+ 1. ์ƒํ’ˆ๋ฆฌ๋ทฐ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…์ค‘ ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฐ˜์‘์— ํŠนํ™”๋œ ์ œ๋ชฉ์„ ์ž‘์„ฑํ•˜๋ผ.
57
+ 2. ์ฐธ๊ณ ๊ธ€์„ ๋ฐ”ํƒ•์œผ๋กœ ๋ธ”๋กœ๊ทธ ์ œ๋ชฉ 10๊ฐœ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ œ๋ชฉ 10๊ฐœ๋งŒ ์ถœ๋ ฅํ•˜๋ผ.
58
+ 3. ์ œ๋ชฉ์€ 40์ž ์ด๋‚ด๋กœ ์ž‘์„ฑํ•˜๋ผ.
59
+ 4. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋ธ”๋กœ๊ทธ ์ฃผ์ œ, ํ•ต์‹ฌํ‚ค์›Œ๋“œ(Topic), ์ƒํ’ˆ๋ช…์ด ๋ฌธ์žฅ ์•ž์ชฝ์— ๋“ค์–ด๊ฐ€๋„๋ก ์ œ๋ชฉ์„ ์ž‘์„ฑํ•˜๋ผ.
60
+ 5. '์ฟ ํŒก'์ด๋ž€ ๋‹จ์–ด๋Š” ์ œ๋ชฉ์— ํ‘œํ˜„ํ•˜์ง€ ๋ง ๊ฒƒ.
61
+ """
62
+
63
+ def get_outline_prompt(category):
64
+ if (category == "๊ณ ๊ฐ๋ฐ˜์‘ํ˜•"):
65
+ return """
66
+ #๋ธ”๋กœ๊ทธ ์†Œ์ฃผ์ œ(Subtitle) ์•„์›ƒ๋ผ์ธ ์ƒ์„ฑ ๊ทœ์น™
67
+ ##[๊ธฐ๋ณธ๊ทœ์น™]
68
+ 1. ๋ฐ˜๋“œ์‹œ ํ•œ๊ตญ์–ด(ํ•œ๊ธ€)๋กœ ์ž‘์„ฑํ•˜๋ผ.
69
+ 2. ๋„ˆ๋Š” ๊ฐ€์žฅ ์ฃผ๋ชฉ๋ฐ›๋Š” ๋งˆ์ผ€ํ„ฐ์ด๋ฉฐ ๋ธ”๋กœ๊ทธ ๋งˆ์ผ€ํŒ… ์ „๋ฌธ๊ฐ€์ด๋‹ค.
70
+ 3. ํŠนํžˆ ๋„ˆ๋Š” '๊ณ ๊ฐ๋ฐ˜์‘ ์ƒํ’ˆ๋ฆฌ๋ทฐ' ์ „๋ฌธ ๋ธ”๋กœ๊ทธ ๋งˆ์ผ€ํ„ฐ์ด๋‹ค.
71
+ 4. ์ƒํ’ˆ ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ•˜๋˜, ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฐ˜์‘์ด ํฌํ•จ๋œ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ผ.
72
+ 5. ์„ ํƒ๋œ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜์—ฌ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ผ.
73
+
74
+ ##[์†Œ์ฃผ์ œ ์ž‘์„ฑ๊ทœ์น™]
75
+ 1. ๋ธ”๋กœ๊ทธ ๊ธ€์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์†Œ์ฃผ์ œ๋ฅผ ์ž‘์„ฑํ•˜๋ผ.
76
+ 2. ๋ฐ˜๋“œ์‹œ ์ƒํ’ˆ์˜ ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฐ˜์‘์ด ํฌํ•จ๋œ ์ฃผ์ œ๋กœ๋งŒ ์†Œ์ฃผ์ œ๋ฅผ ์ƒ์„ฑํ•˜๋ผ.
77
+ 3. ์†Œ์ œ๋ชฉ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก 30์ž ์ด๋‚ด๋กœ ์ž‘์„ฑํ•˜๋ผ.
78
+ 4. ๋…์ž๊ฐ€ ์–ป๊ณ ์ž ํ•˜๋Š” ํฅ๋ฏธ๋กœ์šด ์ •๋ณด์™€ ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฐ˜์‘์„ ์ œ๊ณตํ•˜๋„๋ก ์†Œ์ฃผ์ œ๋ฅผ ์ž‘์„ฑํ•˜๋ผ.
79
+ 5. ๋ฐ˜๋“œ์‹œ [์†Œ์ฃผ์ œ ๊ตฌ์„ฑ]์— ๋งž๊ฒŒ ์ถœ๋ ฅํ•˜๋ผ.
80
+ 6. ์ƒํ’ˆ๋ช…์€ ์†Œ์ฃผ์ œ์— ํฌํ•จํ•˜์ง€ ๋ง ๊ฒƒ.
81
+
82
+ ##[์†Œ์ฃผ์ œ ๊ตฌ์„ฑ]
83
+ 1. ๋ฐ˜๋“œ์‹œ [๋„์ž…๋ถ€] - 1๊ฐœ, [๋ณธ๋ก 1~5] - 5๊ฐœ, [๊ฒฐ๋ก ] - 1๊ฐœ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋ผ.
84
+ 2. ๋ฐ˜๋“œ์‹œ [๋„์ž…๋ถ€]์™€ [๊ฒฐ๋ก ]์˜ ์ œ๋ชฉ์ด ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก ์ž‘์„ฑํ•˜๋ผ.
85
+ 3. [๋„์ž…๋ถ€]์—๋Š” ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฆฌ๋ทฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๊ณต๊ฐ, ๋ฌธ์ œ์ œ๊ธฐ, ๊ตฌ๋งคํฌ์ธํŠธ ๋“ฑ์„ ์ œ์‹œํ•˜๋ผ.
86
+ """
87
+
88
+ def get_blog_post_prompt(category):
89
+ if (category == "๊ณ ๊ฐ๋ฐ˜์‘ํ˜•"):
90
+ return """
91
+ #๋ธ”๋กœ๊ทธ ํ…์ŠคํŠธ ์ƒ์„ฑ ๊ทœ์น™(์ƒํ’ˆ๋ฆฌ๋ทฐ_๊ณ ๊ฐ๋ฐ˜์‘ํ˜•)
92
+ ##[๊ธฐ๋ณธ๊ทœ์น™]
93
+ 1. ๋ฐ˜๋“œ์‹œ ํ•œ๊ตญ์–ด(ํ•œ๊ธ€)๋กœ ์ž‘์„ฑํ•˜๋ผ.
94
+ 2. ๋„ˆ๋Š” ๊ฐ€์žฅ ์ฃผ๋ชฉ๋ฐ›๋Š” ๋งˆ์ผ€ํ„ฐ์ด๋ฉฐ ๋ธ”๋กœ๊ทธ ๋งˆ์ผ€ํŒ… ์ „๋ฌธ๊ฐ€์ด๋‹ค.
95
+ 3. ํŠนํžˆ ๋„ˆ๋Š” '๊ณ ๊ฐ๋ฐ˜์‘ ์ƒํ’ˆ๋ฆฌ๋ทฐ' ์ „๋ฌธ ๋ธ”๋กœ๊ทธ ๋งˆ์ผ€ํ„ฐ์ด๋‹ค.
96
+ 4. ์ƒํ’ˆ ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ•˜๋˜, ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฐ˜์‘์ด ํฌํ•จ๋œ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ผ.
97
+ 5. ์„ ํƒ๋œ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜์—ฌ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ผ.
98
+
99
+ ##๊ธฐ๋Šฅ์ง‘์ค‘ํ˜• ์ƒํ’ˆ๋ฆฌ๋ทฐ ์ƒ์„ฑ๊ทœ์น™]
100
+ 1. ๋ฐ˜๋“œ์‹œ ์ž…๋ ฅ๋œ [์†Œ์ฃผ์ œ]์— ๋งž๊ฒŒ ํ…์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ผ.
101
+ 2. ๋ธ”๋กœ๊ทธ์ฃผ์ œ์™€ ์ฐธ๊ณ ๊ธ€์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒํ’ˆ๋ช…์„ ํŒŒ์•…ํ•˜์—ฌ ๊ธฐ์–ตํ•˜๊ณ , ์†Œ์ฃผ์ œ์—์„œ ๋ฐ˜๋“œ์‹œ ์ƒํ’ˆ๋ช…์„ ์ตœ๋Œ€ 1ํšŒ๋งŒ ์ถœ๋ ฅ๋˜๊ฒŒํ•˜๋ผ.
102
+ 3. ์†Œ์ฃผ์ œ๋ณ„ ๊ฐ๊ฐ 400์ž ์ด์ƒ์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ , ๋ฐ˜๋“œ์‹œ ์ „์ฒด๊ธ€์ด 2200์ž ์ด์ƒ ๋˜๋„๋ก ์ž‘์„ฑํ•˜๋ผ.
103
+ 4. ์ „์ฒด ๋งฅ๋ฝ์„ ์ดํ•ดํ•˜๊ณ  ๋ฌธ์žฅ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋˜, ๋‚ด์šฉ์ด ์ค‘๋ณต๋˜์ง€ ์•Š๊ฒŒ ์ž‘์„ฑํ•˜๋ผ.
104
+ 5. ์ ˆ๋Œ€๋กœ ์ฐธ๊ณ ๊ธ€์„ ํ•œ๋ฌธ์žฅ ์ด์ƒ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜์ง€ ๋ง ๊ฒƒ.
105
+ 6. ์ƒํ’ˆ์— ๋Œ€ํ•œ ๋ถ„์„(์ˆ˜์น˜๋ฅผ ํฌํ•จ), ๊ธฐ๋Šฅ๊ณผ ์‚ฌ์šฉ๋ฒ•๋“ฑ์˜ ์ •๋ณด๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๊ทธ์— ๋Œ€ํ•œ ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฐ˜์‘์„ ํฌํ•จํ•˜์—ฌ ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ•˜๋ผ.
106
+ 7. ๋‚ด์šฉ์€ ๊ธ์ •์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋˜, ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฐ˜์‘์ด ๋‹๋ณด์ด๋„๋ก ์ž‘์„ฑํ•˜๋ผ.
107
+ 8. ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ์— ๋งž๋Š” ์ƒํ™ฉ์„ ์—ฐ์ถœํ•˜๋ผ.
108
+ 9. ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฌธ์žฅ์— ๋ฐ˜์˜ํ• ๋•Œ๋Š” '๊ตฌ๋งค์ž์˜ ๋ฆฌ๋ทฐ', '๊ณ ๊ฐ์˜ ๋ฆฌ๋ทฐ', '์‚ฌ์šฉ์ž ๋ฆฌ๋ทฐ' ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜๋ผ.
109
+
110
+ ##[์ œ์™ธ ๊ทœ์น™]
111
+ 1. ๋ฐ˜๋“œ์‹œ ์ฐธ๊ณ ๊ธ€์˜ ๋งํฌ(URL)๋Š” ์ œ์™ธํ•˜๋ผ.
112
+ 2. ์ฐธ๊ณ ๊ธ€์—์„œ '๋งํฌ๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”'์™€ ๊ฐ™์€ ๋งํฌ ์ด๋™์˜ ๋ฌธ๊ตฌ๋Š” ์ œ์™ธํ•˜๋ผ.
113
+ 3. ์ฐธ๊ณ ๊ธ€์— ์žˆ๋Š” ์ž‘์„ฑ์ž, ํ™”์ž, ์œ ํŠœ๋ฒ„, ๊ธฐ์ž(Writer, speaker, YouTuber, reporter)์˜ ์ด๋ฆ„, ์• ์นญ, ๋‹‰๋„ค์ž„(Name, Nkickname)์€ ๋ฐ˜๋“œ์‹œ ์ œ์™ธํ•˜๋ผ.
114
+ 4. '์—…์ฒด๋กœ ๋ถ€ํ„ฐ ์ œ๊ณต ๋ฐ›์•„์„œ ์ž‘์„ฑ', '์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค'๋“ฑ์˜ ํ‘œํ˜„์„ ๋ฐ˜๋“œ์‹œ ์ œ์™ธํ•˜๋ผ.
115
+ """
116
+
117
+ def get_style_prompt(style):
118
+ prompts = {
119
+ "์นœ๊ทผํ•œ": """
120
+ #์นœ๊ทผํ•œ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ
121
+ 1. ํ†ค๊ณผ ์–ด์กฐ
122
+ - ๋Œ€ํ™”ํ•˜๋“ฏ ํŽธ์•ˆํ•˜๊ณ  ์นœ๊ทผํ•œ ๋งํˆฌ ์‚ฌ์šฉ
123
+ - ๋…์ž๋ฅผ "์—ฌ๋Ÿฌ๋ถ„" ๋˜๋Š” "๋…์ž๋‹˜๋“ค"๋กœ ์ง€์นญ
124
+ - ์ ์ ˆํ•œ ์ด๋ชจ์ง€๋ฅผ sparseํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์—ฌ ์นœ๊ทผ๊ฐ ํ‘œํ˜„
125
+ 2. ๋ฌธ์žฅ ๋ฐ ๋‚ด์šฉ ๊ตฌ์„ฑ
126
+ - ์งง๊ณ  ๊ฐ„๊ฒฐํ•œ ๋ฌธ์žฅ ์œ„์ฃผ๋กœ ์ž‘์„ฑ
127
+ - ๊ตฌ์–ด์ฒด ํ‘œํ˜„ ์‚ฌ์šฉ (์˜ˆ: "~ํ–ˆ์–ด์š”", "~์ธ ๊ฒƒ ๊ฐ™์•„์š”")
128
+ - '~๋‹ˆ๋‹ค', '~ํ–ˆ์ฃ '๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ.
129
+ - ๊ฐœ์ธ์ ์ธ ๊ฒฝํ—˜์ด๋‚˜ ์ผํ™”๋กœ ์‹œ์ž‘
130
+ - ์‹ค์ƒํ™œ์—์„œ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒ ์ œ๊ณต
131
+ - ๋…์ž์˜ ๊ณต๊ฐ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋ก€ ํฌํ•จ
132
+ 3. ์šฉ์–ด ๋ฐ ์„ค๋ช… ๋ฐฉ์‹
133
+ - ์ „๋ฌธ ์šฉ์–ด ๋Œ€์‹  ์‰ฌ์šด ๋‹จ์–ด๋กœ ํ’€์–ด์„œ ์„ค๋ช…
134
+ - ๋น„์œ ๋‚˜ ์€์œ ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ๊ฐœ๋… ์„ค๋ช…
135
+ - ์ˆ˜์‚ฌ์˜๋ฌธ๋ฌธ ํ™œ์šฉํ•˜์—ฌ ๋…์ž์™€ ์†Œํ†ตํ•˜๋Š” ๋А๋‚Œ ์ฃผ๊ธฐ
136
+ 4. ๋…์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ
137
+ - ๋…์ž์˜ ์˜๊ฒฌ์„ ๋ฌผ์–ด๋ณด๋Š” ์งˆ๋ฌธ ํฌํ•จ
138
+ - ๋Œ“๊ธ€ ๋‹ฌ๊ธฐ๋ฅผ ๋…๋ คํ•˜๋Š” ๋ฌธ๊ตฌ ์‚ฌ์šฉ
139
+ 5. ์ด๋ชจ์ง€ ํ™œ์šฉ
140
+ - ์ฃผ์š” ํฌ์ธํŠธ๋‚˜ ์ƒˆ๋กœ์šด ์„น์…˜์„ ์‹œ์ž‘ํ•  ๋•Œ๋งŒ ๊ด€๋ จ ์ด๋ชจ์ง€ ์‚ฌ์šฉ
141
+ - ์ „์ฒด ๊ธ€์—์„œ 3-5๊ฐœ ์ •๋„์˜ ์ด๋ชจ์ง€๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๊ณผ๋„ํ•˜์ง€ ์•Š๊ฒŒ ์œ ์ง€
142
+ 6. ๋งˆ๋ฌด๋ฆฌ
143
+ - ์นœ๊ทผํ•˜๊ณ  ๊ฒฉ๋ คํ•˜๋Š” ํ†ค์œผ๋กœ ๋งˆ๋ฌด๋ฆฌ
144
+ - ๋‹ค์Œ ํฌ์ŠคํŒ…์— ๋Œ€ํ•œ ๊ธฐ๋Œ€๊ฐ ์œ ๋ฐœ
145
+ ์ฃผ์˜์‚ฌํ•ญ: ๋„ˆ๋ฌด ๊ฐ€๋ฒผ์šด ํ†ค์€ ์ง€์–‘ํ•˜๊ณ , ์ฃผ์ œ์˜ ์ค‘์š”์„ฑ์„ ํ•ด์น˜์ง€ ์•Š๋Š” ์„ ์—์„œ ์นœ๊ทผํ•จ ์œ ์ง€
146
+ """,
147
+ "์ผ๋ฐ˜": """
148
+ #์ผ๋ฐ˜์ ์ธ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ
149
+ 1. ํ†ค๊ณผ ์–ด์กฐ
150
+ - ์ค‘๋ฆฝ์ ์ด๊ณ  ๊ฐ๊ด€์ ์ธ ํ†ค ์œ ์ง€
151
+ - ์ ์ ˆํ•œ ์กด๋Œ“๋ง ์‚ฌ์šฉ (์˜ˆ: "~ํ•ฉ๋‹ˆ๋‹ค", "~์ž…๋‹ˆ๋‹ค")
152
+
153
+ 2. ๋‚ด์šฉ ๊ตฌ์กฐ ๋ฐ ์ „๊ฐœ
154
+ - ๋ช…ํ™•ํ•œ ์ฃผ์ œ ์ œ์‹œ๋กœ ์‹œ์ž‘
155
+ - ๋…ผ๋ฆฌ์ ์ธ ์ˆœ์„œ๋กœ ์ •๋ณด ์ „๊ฐœ
156
+ - ์ฃผ์š” ํฌ์ธํŠธ๋ฅผ ๊ฐ•์กฐํ•˜๋Š” ์†Œ์ œ๋ชฉ ํ™œ์šฉ
157
+ - ์ ์ ˆํ•œ ๊ธธ์ด์˜ ๋‹จ๋ฝ์œผ๋กœ ๊ตฌ์„ฑ
158
+
159
+ 3. ์šฉ์–ด ๋ฐ ์„ค๋ช… ๋ฐฉ์‹
160
+ - ์ผ๋ฐ˜์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์šฉ์–ด ์„ ํƒ
161
+ - ํ•„์š”์‹œ ๊ฐ„๋‹จํ•œ ์„ค๋ช… ์ถ”๊ฐ€
162
+ - ๊ฐ๊ด€์ ์ธ ์ •๋ณด ์ œ๊ณต์— ์ค‘์ 
163
+
164
+ 4. ํ…์ŠคํŠธ ๊ตฌ์กฐํ™”
165
+ - ๋ถˆ๋ฆฟ ํฌ์ธํŠธ๋‚˜ ๋ฒˆํ˜ธ ๋งค๊ธฐ๊ธฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ •๋ณด ๊ตฌ์กฐํ™”
166
+ - ์ค‘์š”ํ•œ ์ •๋ณด๋Š” ๊ตต์€ ๊ธ€์”จ๋‚˜ ๊ธฐ์šธ์ž„๊ผด๋กœ ๊ฐ•์กฐ
167
+
168
+ 5. ๋…์ž ์ƒํ˜ธ์ž‘์šฉ
169
+ - ์ ์ ˆํžˆ ๋…์ž์˜ ์ƒ๊ฐ์„ ๋ฌป๋Š” ์งˆ๋ฌธ ํฌํ•จ
170
+ - ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ํ‚ค์›Œ๋“œ ์ œ์‹œ
171
+
172
+ 6. ๋งˆ๋ฌด๋ฆฌ
173
+ - ์ฃผ์š” ๋‚ด์šฉ ๊ฐ„๋‹จํžˆ ์š”์•ฝ
174
+ - ์ถ”๊ฐ€ ์ •๋ณด์— ๋Œ€ํ•œ ์•ˆ๋‚ด ์ œ๊ณต
175
+
176
+ ์ฃผ์˜์‚ฌํ•ญ: ๋„ˆ๋ฌด ๋”ฑ๋”ฑํ•˜๊ฑฐ๋‚˜ ์ง€๋ฃจํ•˜์ง€ ์•Š๋„๋ก ๊ท ํ˜• ์œ ์ง€
177
+ """,
178
+ "์ „๋ฌธ์ ์ธ": """
179
+ #์ „๋ฌธ๏ฟฝ๏ฟฝ์ธ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ
180
+
181
+ 1. ํ†ค๊ณผ ๊ตฌ์กฐ
182
+ - ๊ณต์‹์ ์ด๊ณ  ํ•™์ˆ ์ ์ธ ํ†ค ์‚ฌ์šฉ
183
+ - ๊ฐ๊ด€์ ์ด๊ณ  ๋ถ„์„์ ์ธ ์ ‘๊ทผ ์œ ์ง€
184
+ - ๋ช…ํ™•ํ•œ ์„œ๋ก , ๋ณธ๋ก , ๊ฒฐ๋ก  ๊ตฌ์กฐ
185
+ - ์ฒด๊ณ„์ ์ธ ๋…ผ์  ์ „๊ฐœ
186
+ - ์„ธ๋ถ€ ์„น์…˜์„ ์œ„ํ•œ ๋ช…ํ™•ํ•œ ์†Œ์ œ๋ชฉ ์‚ฌ์šฉ
187
+
188
+ 2. ๋‚ด์šฉ ๊ตฌ์„ฑ ๋ฐ ์ „๊ฐœ
189
+ - ๋ณต์žกํ•œ ๊ฐœ๋…์„ ์ •ํ™•ํžˆ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์žฅ ๊ตฌ์กฐ ์‚ฌ์šฉ
190
+ - ๋…ผ๋ฆฌ์  ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ์ „ํ™˜์–ด ํ™œ์šฉ
191
+ - ํ•ด๋‹น ๋ถ„์•ผ์˜ ์ „๋ฌธ ์šฉ์–ด ์ ๊ทน ํ™œ์šฉ (ํ•„์š”์‹œ ๊ฐ„๋žตํ•œ ์„ค๋ช… ์ œ๊ณต)
192
+ - ์‹ฌ์ธต์ ์ธ ๋ถ„์„๊ณผ ๋น„ํŒ์  ์‚ฌ๊ณ  ์ „๊ฐœ
193
+ - ๋‹ค์–‘ํ•œ ๊ด€์  ์ œ์‹œ ๋ฐ ๋น„๊ต
194
+
195
+ 3. ๋ฐ์ดํ„ฐ ๋ฐ ๊ทผ๊ฑฐ ํ™œ์šฉ
196
+ - ํ†ต๊ณ„, ์—ฐ๊ตฌ ๊ฒฐ๊ณผ, ์ „๋ฌธ๊ฐ€ ์˜๊ฒฌ ๋“ฑ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ถœ์ฒ˜ ์ธ์šฉ
197
+ - ํ•„์š”์‹œ ๊ฐ์ฃผ๋‚˜ ์ฐธ๊ณ ๋ฌธํ—Œ ๋ชฉ๋ก ํฌํ•จ
198
+ - ์ˆ˜์น˜ ๋ฐ์ดํ„ฐ๋Š” ํ…์ŠคํŠธ๋กœ ๋ช…ํ™•ํžˆ ์„ค๋ช…
199
+
200
+ 4. ํ…์ŠคํŠธ ๊ตฌ์กฐํ™”
201
+ - ๋…ผ๋ฆฌ์  ๊ตฌ์กฐ๋ฅผ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฒˆํ˜ธ ๋งค๊ธฐ๊ธฐ ์‚ฌ์šฉ
202
+ - ํ•ต์‹ฌ ๊ฐœ๋…์ด๋‚˜ ์šฉ์–ด๋Š” ๊ธฐ์šธ์ž„๊ผด๋กœ ๊ฐ•์กฐ
203
+ - ๊ธด ์ธ์šฉ๋ฌธ์€ ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ๊ตฌ๋ถ„
204
+
205
+ 5. ๋งˆ๋ฌด๋ฆฌ
206
+ - ํ•ต์‹ฌ ๋…ผ์  ์žฌ๊ฐ•์กฐ
207
+ - ํ–ฅํ›„ ์—ฐ๊ตฌ ๋ฐฉํ–ฅ์ด๋‚˜ ์‹ค๋ฌด์  ํ•จ์˜ ์ œ์‹œ
208
+
209
+ ์ฃผ์˜์‚ฌํ•ญ: ์ „๋ฌธ์„ฑ์„ ์œ ์ง€ํ•˜๋˜, ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ์ˆ˜์ค€์€ ์ง€์–‘
210
+ """
211
+ }
212
+ return prompts.get(style, "ํฌ์ŠคํŒ… ์Šคํƒ€์ผ ํ”„๋กฌํ”„ํŠธ")
213
+
214
+ def get_style_description(style):
215
+ descriptions = {
216
+ "์นœ๊ทผํ•œ": "๋…์ž์™€ ๊ฐ€๊นŒ์šด ์นœ๊ตฌ์ฒ˜๋Ÿผ ๋Œ€ํ™”ํ•˜๋Š” ๋“ฏํ•œ ์นœ๊ทผํ•œ ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค.",
217
+ "์ผ๋ฐ˜": "์ผ๋ฐ˜์ ์ด๊ณ  ์ค‘๋ฆฝ์ ์ธ ํ†ค์œผ๋กœ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค.",
218
+ "์ „๋ฌธ์ ์ธ": "์ „๋ฌธ๊ฐ€์˜ ์‹œ๊ฐ์—์„œ ๊นŠ์ด ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค."
219
+ }
220
+ return descriptions.get(style, "ํฌ์ŠคํŒ… ์Šคํƒ€์ผ์„ ์„ ํƒํ•˜์„ธ์š”.")
221
+
222
+ def update_prompts(category, style):
223
+ title_prompt = get_title_prompt(category)
224
+ outline_prompt = get_outline_prompt(category)
225
+ blog_post_prompt = get_blog_post_prompt(category)
226
+ style_prompt = get_style_prompt(style)
227
+ style_description = get_style_description(style)
228
+ return title_prompt, outline_prompt, blog_post_prompt, style_prompt, style_description
229
+
230
+ class PDF(FPDF):
231
+ def __init__(self):
232
+ super().__init__()
233
+ current_dir = os.path.dirname(__file__)
234
+ self.add_font("NanumGothic", "", os.path.join(current_dir, "NanumGothic.ttf"))
235
+ self.add_font("NanumGothic", "B", os.path.join(current_dir, "NanumGothicBold.ttf"))
236
+ self.add_font("NanumGothicExtraBold", "", os.path.join(current_dir, "NanumGothicExtraBold.ttf"))
237
+ self.add_font("NanumGothicLight", "", os.path.join(current_dir, "NanumGothicLight.ttf"))
238
+
239
+ def header(self):
240
+ self.set_font('NanumGothic', '', 10)
241
+
242
+ def footer(self):
243
+ self.set_y(-15)
244
+ self.set_font('NanumGothic', '', 8)
245
+ self.cell(0, 10, f'Page {self.page_no()}', 0, 0, 'C')
246
+
247
+ def format_filename(text):
248
+ text = re.sub(r'[^\w\s-]', '', text)
249
+ return text[:50].strip()
250
+
251
+ def extract_first_recommended_title(blog_post):
252
+ match = re.search(r'## ์ถ”์ฒœ ์ œ๋ชฉ\s*\n\s*(?:\n\s*)*\d+\.\s*(.*?)\s*(?:\n|$)', blog_post, re.DOTALL)
253
+ if match:
254
+ title = match.group(1).strip()
255
+ print(f"Extracted title: {title}")
256
+ return title
257
+ print("No title found")
258
+ return "๋ธ”๋กœ๊ทธ_๊ธ€"
259
+
260
+ def save_to_pdf(blog_post):
261
+ pdf = PDF()
262
+
263
+ pdf.add_page()
264
+ pdf.set_font("NanumGothic", 'B', size=14)
265
+ pdf.cell(0, 10, "๋ธ”๋กœ๊ทธ ๊ธ€", ln=True, align='C')
266
+ pdf.ln(10)
267
+ pdf.set_font("NanumGothic", '', size=11)
268
+ pdf.multi_cell(0, 5, blog_post)
269
+
270
+ title = extract_first_recommended_title(blog_post)
271
+ filename = format_filename(title) + ".pdf"
272
+ print(f"Saving PDF as: {filename}")
273
+ pdf.output(filename)
274
+ return filename
275
+
276
+ def save_content_to_pdf(blog_post):
277
+ filename = save_to_pdf(blog_post)
278
+ return filename
279
+
280
+ title = "์ƒํ’ˆ๋ฆฌ๋ทฐ ๊ณ ๊ฐ๋ฐ˜์‘ํ˜•_์ˆ˜๋™"
281
+
282
+ with gr.Blocks() as demo:
283
+ gr.Markdown(f"# {title}")
284
+
285
+ gr.Markdown("### 1๋‹จ๊ณ„: ํฌ์ŠคํŒ… ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ง€์ •ํ•ด์ฃผ์„ธ์š”", elem_id="step-title")
286
+ category = gr.Radio(choices=["๊ณ ๊ฐ๋ฐ˜์‘ํ˜•"], label="ํฌ์ŠคํŒ… ์นดํ…Œ๊ณ ๋ฆฌ", value="๊ณ ๊ฐ๋ฐ˜์‘ํ˜•")
287
+
288
+ gr.Markdown("---\n\n")
289
+
290
+ gr.Markdown("### 2๋‹จ๊ณ„: ํฌ์ŠคํŒ… ์Šคํƒ€์ผ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”", elem_id="step-title")
291
+ style = gr.Radio(choices=["์นœ๊ทผํ•œ", "์ผ๋ฐ˜", "์ „๋ฌธ์ ์ธ"], label="ํฌ์ŠคํŒ… ์Šคํƒ€์ผ", value="์นœ๊ทผํ•œ")
292
+ style_description = gr.Markdown(f"_{get_style_description('์นœ๊ทผํ•œ')}_", elem_id="style-description")
293
+
294
+ gr.Markdown("---\n\n")
295
+
296
+ gr.Markdown("### 3๋‹จ๊ณ„: ๋ธ”๋กœ๊ทธ ์ฃผ์ œ, ๋˜๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ์„ธํžˆ ์ž…๋ ฅํ•˜์„ธ์š”", elem_id="step-title")
297
+ topic = gr.Textbox(label="๋ธ”๋กœ๊ทธ ์ฃผ์ œ(์˜ˆ์‹œ: ์˜ค์ง•์–ด ๋ฌด์นจํšŒ(X), ์˜ค์ง•์–ด ๋ฌด์นจํšŒ ๋ ˆ์‹œํ”ผ(O))", placeholder="์˜ˆ์‹œ: ์—ฌํ–‰์ง€ ์ถ”์ฒœ(X), 8์›” ๊ตญ๋‚ด ์—ฌํ–‰์ง€ ์ถ”์ฒœ(O)")
298
+
299
+ gr.Markdown("---\n\n")
300
+
301
+ gr.Markdown("### 4๋‹จ๊ณ„: ์ฐธ๊ณ  ๊ธ€์„ ์ž…๋ ฅํ•˜์„ธ์š”", elem_id="step-title")
302
+ references1 = gr.Textbox(label="์ฐธ๊ณ  ๊ธ€ 1", placeholder="์ฐธ๊ณ ํ•  ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…๊ธ€์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”", lines=10, visible=True)
303
+ references2 = gr.Textbox(label="์ฐธ๊ณ  ๊ธ€ 2", placeholder="์ฐธ๊ณ ํ•  ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…๊ธ€์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”", lines=10, visible=True)
304
+ references3 = gr.Textbox(label="์ฐธ๊ณ  ๊ธ€ 3", placeholder="์ฐธ๊ณ ํ•  ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…๊ธ€์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”", lines=10, visible=True)
305
+
306
+ gr.Markdown("---\n\n")
307
+
308
+ gr.Markdown("### 5๋‹จ๊ณ„: ๋ธ”๋กœ๊ทธ ์ œ๋ชฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”", elem_id="step-title")
309
+
310
+ with gr.Accordion("์ œ๋ชฉ ์„ค์ •", visible=True):
311
+ title_system_message = gr.Textbox(label="์นดํ…Œ๊ณ ๋ฆฌ ํ”„๋กฌํ”„ํŠธ", value=get_title_prompt("๊ณ ๊ฐ๋ฐ˜์‘ํ˜•"), lines=15, visible=True)
312
+ title_max_tokens = gr.Slider(label="Max Tokens", minimum=1000, maximum=8000, value=5000, step=1000)
313
+ title_temperature = gr.Slider(label="Temperature", minimum=0.1, maximum=1.0, value=0.8, step=0.1)
314
+ title_top_p = gr.Slider(label="Top P", minimum=0.1, maximum=1.0, value=0.95, step=0.05)
315
+
316
+ title_btn = gr.Button("์ œ๋ชฉ ์ถ”์ฒœํ•˜๊ธฐ")
317
+ title_suggestions = gr.Textbox(label="์ œ๋ชฉ ์ถ”์ฒœ", lines=10)
318
+
319
+ title_btn.click(fn=suggest_title, inputs=[category, style, topic, references1, references2, references3, title_system_message, style, title_max_tokens, title_temperature, title_top_p], outputs=[title_suggestions])
320
+ gr.HTML("<span style='color: grey;'>[์ œ๋ชฉ ์ถ”์ฒœ ํ•ญ๋ชฉ์„ ์ฐธ๊ณ ํ•˜์—ฌ ํ•˜๋‚˜๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์‚ฌ์šฉํ•˜์…”๋„ ๋ฉ๋‹ˆ๋‹ค.]</span>")
321
+ blog_title = gr.Textbox(label="๋ธ”๋กœ๊ทธ ์ œ๋ชฉ", placeholder="๋ธ”๋กœ๊ทธ ์ œ๋ชฉ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
322
+
323
+ gr.Markdown("---\n\n")
324
+
325
+ gr.Markdown("### 6๋‹จ๊ณ„: ์•„์›ƒ๋ผ์ธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”", elem_id="step-title")
326
+ gr.HTML("<span style='color: grey;'>[์•„์›ƒ๋ผ์ธ์—์„œ ๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฅผ ์ˆ˜์ •ํ•ด์„œ ์‚ฌ์šฉํ•ด์ฃผ์„ธ์š”]</span>")
327
+
328
+ with gr.Accordion("์•„์›ƒ๋ผ์ธ ์„ค์ •", visible=True):
329
+ outline_system_message = gr.Textbox(label="์นดํ…Œ๊ณ ๋ฆฌ ํ”„๋กฌํ”„ํŠธ", value=get_outline_prompt("๊ณ ๊ฐ๋ฐ˜์‘ํ˜•"), lines=20, visible=True)
330
+ outline_max_tokens = gr.Slider(label="Max Tokens", minimum=1000, maximum=8000, value=6000, step=1000)
331
+ outline_temperature = gr.Slider(label="Temperature", minimum=0.1, maximum=1.0, value=0.8, step=0.1)
332
+ outline_top_p = gr.Slider(label="Top P", minimum=0.1, maximum=1.0, value=0.95, step=0.05)
333
+
334
+ outline_generate_btn = gr.Button("์•„์›ƒ๋ผ์ธ ์ƒ์„ฑํ•˜๊ธฐ")
335
+ outline_result = gr.Textbox(label="์•„์›ƒ๋ผ์ธ ๊ฒฐ๊ณผ", lines=15)
336
+ outline_input = gr.Textbox(label="์ž‘์„ฑํ•  ์•„์›ƒ๋ผ์ธ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”", placeholder="์ƒ์„ฑ๋œ ์•„์›ƒ๋ผ์ธ ๋ณต์‚ฌ, ์ˆ˜์ •ํ•ด์„œ ์‚ฌ์šฉํ•˜์„ธ์š”", lines=10)
337
+
338
+ outline_generate_btn.click(fn=generate_outline, inputs=[category, style, topic, references1, references2, references3, blog_title, outline_system_message, style, outline_max_tokens, outline_temperature, outline_top_p], outputs=[outline_result])
339
+
340
+ gr.Markdown("---\n\n")
341
+
342
+ gr.Markdown("### 7๋‹จ๊ณ„: ๊ธ€ ์ƒ์„ฑํ•˜๊ธฐ", elem_id="step-title")
343
+ gr.HTML("<span style='color: grey;'>[์•„์›ƒ๋ผ์ธ ๋ณ„ ํ…์ŠคํŠธ๋Ÿ‰์„ ์ •ํ•˜๊ณ  ๊ธ€ ์ƒ์„ฑํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”]</span>")
344
+
345
+ with gr.Accordion("๋ธ”๋กœ๊ทธ ๊ธ€ ์„ค์ •", visible=True):
346
+ blog_system_message = gr.Textbox(label="์นดํ…Œ๊ณ ๋ฆฌ ํ”„๋กฌํ”„ํŠธ", value=get_blog_post_prompt("๊ณ ๊ฐ๋ฐ˜์‘ํ˜•"), lines=20, visible=True)
347
+ blog_max_tokens = gr.Slider(label="Max Tokens", minimum=1000, maximum=12000, value=8000, step=1000)
348
+ blog_temperature = gr.Slider(label="Temperature", minimum=0.1, maximum=1.0, value=0.8, step=0.1)
349
+ blog_top_p = gr.Slider(label="Top P", minimum=0.1, maximum=1.0, value=0.95, step=0.05)
350
+
351
+ generate_btn = gr.Button("๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑํ•˜๊ธฐ")
352
+ output = gr.Textbox(label="์ƒ์„ฑ๋œ ๋ธ”๋กœ๊ทธ ๊ธ€", lines=30)
353
+
354
+ generate_btn.click(fn=generate_blog_post, inputs=[category, style, topic, references1, references2, references3, blog_title, outline_input, blog_system_message, style, blog_max_tokens, blog_temperature, blog_top_p], outputs=[output])
355
+
356
+ save_pdf_btn = gr.Button("PDF๋กœ ์ €์žฅํ•˜๊ธฐ")
357
+ pdf_output = gr.File(label="์ƒ์„ฑ๋œ PDF ํŒŒ์ผ")
358
+
359
+ save_pdf_btn.click(fn=save_content_to_pdf, inputs=[output], outputs=[pdf_output])
360
+
361
+ def update_prompts_and_description(category, style):
362
+ title_prompt, outline_prompt, blog_post_prompt, style_prompt, style_description = update_prompts(category, style)
363
+ return title_prompt, outline_prompt, blog_post_prompt, style_description
364
+
365
+ category.change(fn=update_prompts_and_description, inputs=[category, style], outputs=[title_system_message, outline_system_message, blog_system_message, style_description])
366
+ style.change(fn=update_prompts_and_description, inputs=[category, style], outputs=[title_system_message, outline_system_message, blog_system_message, style_description])
367
+
368
+ demo.launch()
369
+
370
+ gr.HTML("""
371
+ <style>
372
+ #step-title {
373
+ font-size: 1.7em;
374
+ font-weight: bold;
375
+ }
376
+ #style-description {
377
+ font-size: 1.2em;
378
+ font-style: italic;
379
+ }
380
+ </style>
381
+ """)