File size: 20,173 Bytes
e81352f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
import gradio as gr
import random
import os
import re
from huggingface_hub import InferenceClient
from fpdf import FPDF
from datetime import datetime

def create_client(model_name):
    return InferenceClient(model_name, token=os.getenv("HF_TOKEN"))

client = create_client("CohereForAI/c4ai-command-r-plus")

def call_api(content, system_message, max_tokens, temperature, top_p):
    messages = [{"role": "system", "content": system_message}, {"role": "user", "content": content}]
    random_seed = random.randint(0, 1000000)
    response = client.chat_completion(messages=messages, max_tokens=max_tokens, temperature=temperature, top_p=top_p, seed=random_seed)
    return response.choices[0].message.content

def analyze_info(category, style, topic, references1, references2, references3):
    return f"์„ ํƒํ•œ ์นดํ…Œ๊ณ ๋ฆฌ: {category}\n์„ ํƒํ•œ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ: {style}\n๋ธ”๋กœ๊ทธ ์ฃผ์ œ: {topic}\n์ฐธ๊ณ  ๊ธ€1: {references1}\n์ฐธ๊ณ  ๊ธ€2: {references2}\n์ฐธ๊ณ  ๊ธ€3: {references3}"

def suggest_title(category, style, topic, references1, references2, references3, category_prompt, style_prompt, max_tokens, temperature, top_p):
    full_content = analyze_info(category, style, topic, references1, references2, references3)
    combined_prompt = f"{category_prompt}\n\n{style_prompt}"
    modified_text = call_api(full_content, combined_prompt, max_tokens, temperature, top_p)
    return modified_text

def generate_outline(category, style, topic, references1, references2, references3, title, category_prompt, style_prompt, max_tokens, temperature, top_p):
    full_content = analyze_info(category, style, topic, references1, references2, references3)
    content = f"{full_content}\nTitle: {title}"
    combined_prompt = f"{category_prompt}\n\n{style_prompt}"
    modified_text = call_api(content, combined_prompt, max_tokens, temperature, top_p)
    return modified_text

def generate_blog_post(category, style, topic, references1, references2, references3, title, outline, category_prompt, style_prompt, max_tokens, temperature, top_p):
    full_content = analyze_info(category, style, topic, references1, references2, references3)
    content = f"{full_content}\nTitle: {title}\nOutline: {outline}"
    combined_prompt = f"{category_prompt}\n\n{style_prompt}"
    modified_text = call_api(content, combined_prompt, max_tokens, temperature, top_p)
    formatted_text = modified_text.replace('\n', '\n\n')
    return formatted_text

def get_title_prompt(category):
    if (category == "๊ณ ๊ฐ๋ฐ˜์‘ํ˜•"):
        return """
        #๋ธ”๋กœ๊ทธ ์ œ๋ชฉ ์ƒ์„ฑ ๊ทœ์น™(์ƒํ’ˆ๋ฆฌ๋ทฐ_๊ณ ๊ฐ๋ฐ˜์‘ํ˜•)
        ##[๊ธฐ๋ณธ๊ทœ์น™]
        1. ๋ฐ˜๋“œ์‹œ ํ•œ๊ตญ์–ด(ํ•œ๊ธ€)๋กœ ์ž‘์„ฑํ•˜๋ผ.
        2. ๋„ˆ๋Š” ๊ฐ€์žฅ ์ฃผ๋ชฉ๋ฐ›๋Š” ๋งˆ์ผ€ํ„ฐ์ด๋ฉฐ ๋ธ”๋กœ๊ทธ ๋งˆ์ผ€ํŒ… ์ „๋ฌธ๊ฐ€์ด๋‹ค.
        3. ํŠนํžˆ ๋„ˆ๋Š” '๊ณ ๊ฐ๋ฐ˜์‘ ์ƒํ’ˆ๋ฆฌ๋ทฐ' ์ „๋ฌธ ๋ธ”๋กœ๊ทธ ๋งˆ์ผ€ํ„ฐ์ด๋‹ค.
        4. ์ƒํ’ˆ ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ•˜๋˜, ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฐ˜์‘์ด ํฌํ•จ๋œ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ผ.
        5. ์„ ํƒ๋œ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜์—ฌ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ผ.
        
        ##[๋ธ”๋กœ๊ทธ ์ œ๋ชฉ ์ž‘์„ฑ ๊ทœ์น™]
        1. ์ƒํ’ˆ๋ฆฌ๋ทฐ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…์ค‘ ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฐ˜์‘์— ํŠนํ™”๋œ ์ œ๋ชฉ์„ ์ž‘์„ฑํ•˜๋ผ.
        2. ์ฐธ๊ณ ๊ธ€์„ ๋ฐ”ํƒ•์œผ๋กœ ๋ธ”๋กœ๊ทธ ์ œ๋ชฉ 10๊ฐœ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ œ๋ชฉ 10๊ฐœ๋งŒ ์ถœ๋ ฅํ•˜๋ผ.
        3. ์ œ๋ชฉ์€ 40์ž ์ด๋‚ด๋กœ ์ž‘์„ฑํ•˜๋ผ.
        4. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋ธ”๋กœ๊ทธ ์ฃผ์ œ, ํ•ต์‹ฌํ‚ค์›Œ๋“œ(Topic), ์ƒํ’ˆ๋ช…์ด ๋ฌธ์žฅ ์•ž์ชฝ์— ๋“ค์–ด๊ฐ€๋„๋ก ์ œ๋ชฉ์„ ์ž‘์„ฑํ•˜๋ผ.
        5. '์ฟ ํŒก'์ด๋ž€ ๋‹จ์–ด๋Š” ์ œ๋ชฉ์— ํ‘œํ˜„ํ•˜์ง€ ๋ง ๊ฒƒ.
        """

def get_outline_prompt(category):
    if (category == "๊ณ ๊ฐ๋ฐ˜์‘ํ˜•"):
        return """
        #๋ธ”๋กœ๊ทธ ์†Œ์ฃผ์ œ(Subtitle) ์•„์›ƒ๋ผ์ธ ์ƒ์„ฑ ๊ทœ์น™
        ##[๊ธฐ๋ณธ๊ทœ์น™]
        1. ๋ฐ˜๋“œ์‹œ ํ•œ๊ตญ์–ด(ํ•œ๊ธ€)๋กœ ์ž‘์„ฑํ•˜๋ผ.
        2. ๋„ˆ๋Š” ๊ฐ€์žฅ ์ฃผ๋ชฉ๋ฐ›๋Š” ๋งˆ์ผ€ํ„ฐ์ด๋ฉฐ ๋ธ”๋กœ๊ทธ ๋งˆ์ผ€ํŒ… ์ „๋ฌธ๊ฐ€์ด๋‹ค.
        3. ํŠนํžˆ ๋„ˆ๋Š” '๊ณ ๊ฐ๋ฐ˜์‘ ์ƒํ’ˆ๋ฆฌ๋ทฐ' ์ „๋ฌธ ๋ธ”๋กœ๊ทธ ๋งˆ์ผ€ํ„ฐ์ด๋‹ค.
        4. ์ƒํ’ˆ ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ•˜๋˜, ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฐ˜์‘์ด ํฌํ•จ๋œ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ผ.
        5. ์„ ํƒ๋œ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜์—ฌ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ผ.
        
        ##[์†Œ์ฃผ์ œ ์ž‘์„ฑ๊ทœ์น™]
        1. ๋ธ”๋กœ๊ทธ ๊ธ€์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์†Œ์ฃผ์ œ๋ฅผ ์ž‘์„ฑํ•˜๋ผ.
        2. ๋ฐ˜๋“œ์‹œ ์ƒํ’ˆ์˜ ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฐ˜์‘์ด ํฌํ•จ๋œ ์ฃผ์ œ๋กœ๋งŒ ์†Œ์ฃผ์ œ๋ฅผ ์ƒ์„ฑํ•˜๋ผ.
        3. ์†Œ์ œ๋ชฉ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก 30์ž ์ด๋‚ด๋กœ ์ž‘์„ฑํ•˜๋ผ.
        4. ๋…์ž๊ฐ€ ์–ป๊ณ ์ž ํ•˜๋Š” ํฅ๋ฏธ๋กœ์šด ์ •๋ณด์™€ ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฐ˜์‘์„ ์ œ๊ณตํ•˜๋„๋ก ์†Œ์ฃผ์ œ๋ฅผ ์ž‘์„ฑํ•˜๋ผ.
        5. ๋ฐ˜๋“œ์‹œ [์†Œ์ฃผ์ œ ๊ตฌ์„ฑ]์— ๋งž๊ฒŒ ์ถœ๋ ฅํ•˜๋ผ.
        6. ์ƒํ’ˆ๋ช…์€ ์†Œ์ฃผ์ œ์— ํฌํ•จํ•˜์ง€ ๋ง ๊ฒƒ.
        
        ##[์†Œ์ฃผ์ œ ๊ตฌ์„ฑ]
        1. ๋ฐ˜๋“œ์‹œ [๋„์ž…๋ถ€] - 1๊ฐœ, [๋ณธ๋ก 1~5] - 5๊ฐœ, [๊ฒฐ๋ก ] - 1๊ฐœ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋ผ.
        2. ๋ฐ˜๋“œ์‹œ [๋„์ž…๋ถ€]์™€ [๊ฒฐ๋ก ]์˜ ์ œ๋ชฉ์ด ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก ์ž‘์„ฑํ•˜๋ผ.
        3. [๋„์ž…๋ถ€]์—๋Š” ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฆฌ๋ทฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๊ณต๊ฐ, ๋ฌธ์ œ์ œ๊ธฐ, ๊ตฌ๋งคํฌ์ธํŠธ ๋“ฑ์„ ์ œ์‹œํ•˜๋ผ.
        """

def get_blog_post_prompt(category):
    if (category == "๊ณ ๊ฐ๋ฐ˜์‘ํ˜•"):
        return """
        #๋ธ”๋กœ๊ทธ ํ…์ŠคํŠธ ์ƒ์„ฑ ๊ทœ์น™(์ƒํ’ˆ๋ฆฌ๋ทฐ_๊ณ ๊ฐ๋ฐ˜์‘ํ˜•)
        ##[๊ธฐ๋ณธ๊ทœ์น™]
        1. ๋ฐ˜๋“œ์‹œ ํ•œ๊ตญ์–ด(ํ•œ๊ธ€)๋กœ ์ž‘์„ฑํ•˜๋ผ.
        2. ๋„ˆ๋Š” ๊ฐ€์žฅ ์ฃผ๋ชฉ๋ฐ›๋Š” ๋งˆ์ผ€ํ„ฐ์ด๋ฉฐ ๋ธ”๋กœ๊ทธ ๋งˆ์ผ€ํŒ… ์ „๋ฌธ๊ฐ€์ด๋‹ค.
        3. ํŠนํžˆ ๋„ˆ๋Š” '๊ณ ๊ฐ๋ฐ˜์‘ ์ƒํ’ˆ๋ฆฌ๋ทฐ' ์ „๋ฌธ ๋ธ”๋กœ๊ทธ ๋งˆ์ผ€ํ„ฐ์ด๋‹ค.
        4. ์ƒํ’ˆ ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ•˜๋˜, ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฐ˜์‘์ด ํฌํ•จ๋œ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ผ.
        5. ์„ ํƒ๋œ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜์—ฌ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ผ.
                
        ##๊ธฐ๋Šฅ์ง‘์ค‘ํ˜• ์ƒํ’ˆ๋ฆฌ๋ทฐ ์ƒ์„ฑ๊ทœ์น™]
        1. ๋ฐ˜๋“œ์‹œ ์ž…๋ ฅ๋œ [์†Œ์ฃผ์ œ]์— ๋งž๊ฒŒ ํ…์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ผ.
        2. ๋ธ”๋กœ๊ทธ์ฃผ์ œ์™€ ์ฐธ๊ณ ๊ธ€์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒํ’ˆ๋ช…์„ ํŒŒ์•…ํ•˜์—ฌ ๊ธฐ์–ตํ•˜๊ณ , ์†Œ์ฃผ์ œ์—์„œ ๋ฐ˜๋“œ์‹œ ์ƒํ’ˆ๋ช…์„ ์ตœ๋Œ€ 1ํšŒ๋งŒ ์ถœ๋ ฅ๋˜๊ฒŒํ•˜๋ผ.
        3. ์†Œ์ฃผ์ œ๋ณ„ ๊ฐ๊ฐ 400์ž ์ด์ƒ์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ , ๋ฐ˜๋“œ์‹œ ์ „์ฒด๊ธ€์ด 2200์ž ์ด์ƒ ๋˜๋„๋ก ์ž‘์„ฑํ•˜๋ผ.
        4. ์ „์ฒด ๋งฅ๋ฝ์„ ์ดํ•ดํ•˜๊ณ  ๋ฌธ์žฅ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋˜, ๋‚ด์šฉ์ด ์ค‘๋ณต๋˜์ง€ ์•Š๊ฒŒ ์ž‘์„ฑํ•˜๋ผ.
        5. ์ ˆ๋Œ€๋กœ ์ฐธ๊ณ ๊ธ€์„ ํ•œ๋ฌธ์žฅ ์ด์ƒ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜์ง€ ๋ง ๊ฒƒ.
        6. ์ƒํ’ˆ์— ๋Œ€ํ•œ ๋ถ„์„(์ˆ˜์น˜๋ฅผ ํฌํ•จ), ๊ธฐ๋Šฅ๊ณผ ์‚ฌ์šฉ๋ฒ•๋“ฑ์˜ ์ •๋ณด๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๊ทธ์— ๋Œ€ํ•œ ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฐ˜์‘์„ ํฌํ•จํ•˜์—ฌ ๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ•˜๋ผ.
        7. ๋‚ด์šฉ์€ ๊ธ์ •์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋˜, ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฐ˜์‘์ด ๋‹๋ณด์ด๋„๋ก ์ž‘์„ฑํ•˜๋ผ.
        8. ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ์— ๋งž๋Š” ์ƒํ™ฉ์„ ์—ฐ์ถœํ•˜๋ผ.
        9. ๊ณ ๊ฐ์˜ ์‹ค์ œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฌธ์žฅ์— ๋ฐ˜์˜ํ• ๋•Œ๋Š” '๊ตฌ๋งค์ž์˜ ๋ฆฌ๋ทฐ', '๊ณ ๊ฐ์˜ ๋ฆฌ๋ทฐ', '์‚ฌ์šฉ์ž ๋ฆฌ๋ทฐ' ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜๋ผ.
                
        ##[์ œ์™ธ ๊ทœ์น™]
        1. ๋ฐ˜๋“œ์‹œ ์ฐธ๊ณ ๊ธ€์˜ ๋งํฌ(URL)๋Š” ์ œ์™ธํ•˜๋ผ.
        2. ์ฐธ๊ณ ๊ธ€์—์„œ '๋งํฌ๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”'์™€ ๊ฐ™์€ ๋งํฌ ์ด๋™์˜ ๋ฌธ๊ตฌ๋Š” ์ œ์™ธํ•˜๋ผ.
        3. ์ฐธ๊ณ ๊ธ€์— ์žˆ๋Š” ์ž‘์„ฑ์ž, ํ™”์ž, ์œ ํŠœ๋ฒ„, ๊ธฐ์ž(Writer, speaker, YouTuber, reporter)์˜ ์ด๋ฆ„, ์• ์นญ, ๋‹‰๋„ค์ž„(Name, Nkickname)์€ ๋ฐ˜๋“œ์‹œ ์ œ์™ธํ•˜๋ผ.
        4. '์—…์ฒด๋กœ ๋ถ€ํ„ฐ ์ œ๊ณต ๋ฐ›์•„์„œ ์ž‘์„ฑ', '์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค'๋“ฑ์˜ ํ‘œํ˜„์„ ๋ฐ˜๋“œ์‹œ ์ œ์™ธํ•˜๋ผ.
        """

def get_style_prompt(style):
    prompts = {
        "์นœ๊ทผํ•œ": """
#์นœ๊ทผํ•œ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ
1. ํ†ค๊ณผ ์–ด์กฐ
   - ๋Œ€ํ™”ํ•˜๋“ฏ ํŽธ์•ˆํ•˜๊ณ  ์นœ๊ทผํ•œ ๋งํˆฌ ์‚ฌ์šฉ
   - ๋…์ž๋ฅผ "์—ฌ๋Ÿฌ๋ถ„" ๋˜๋Š” "๋…์ž๋‹˜๋“ค"๋กœ ์ง€์นญ
   - ์ ์ ˆํ•œ ์ด๋ชจ์ง€๋ฅผ sparseํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์—ฌ ์นœ๊ทผ๊ฐ ํ‘œํ˜„
2. ๋ฌธ์žฅ ๋ฐ ๋‚ด์šฉ ๊ตฌ์„ฑ
   - ์งง๊ณ  ๊ฐ„๊ฒฐํ•œ ๋ฌธ์žฅ ์œ„์ฃผ๋กœ ์ž‘์„ฑ
   - ๊ตฌ์–ด์ฒด ํ‘œํ˜„ ์‚ฌ์šฉ (์˜ˆ: "~ํ–ˆ์–ด์š”", "~์ธ ๊ฒƒ ๊ฐ™์•„์š”")
   - '~๋‹ˆ๋‹ค', '~ํ–ˆ์ฃ '๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ.
   - ๊ฐœ์ธ์ ์ธ ๊ฒฝํ—˜์ด๋‚˜ ์ผํ™”๋กœ ์‹œ์ž‘
   - ์‹ค์ƒํ™œ์—์„œ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒ ์ œ๊ณต
   - ๋…์ž์˜ ๊ณต๊ฐ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋ก€ ํฌํ•จ
3. ์šฉ์–ด ๋ฐ ์„ค๋ช… ๋ฐฉ์‹
   - ์ „๋ฌธ ์šฉ์–ด ๋Œ€์‹  ์‰ฌ์šด ๋‹จ์–ด๋กœ ํ’€์–ด์„œ ์„ค๋ช…
   - ๋น„์œ ๋‚˜ ์€์œ ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ๊ฐœ๋… ์„ค๋ช…
   - ์ˆ˜์‚ฌ์˜๋ฌธ๋ฌธ ํ™œ์šฉํ•˜์—ฌ ๋…์ž์™€ ์†Œํ†ตํ•˜๋Š” ๋А๋‚Œ ์ฃผ๊ธฐ
4. ๋…์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ
   - ๋…์ž์˜ ์˜๊ฒฌ์„ ๋ฌผ์–ด๋ณด๋Š” ์งˆ๋ฌธ ํฌํ•จ
   - ๋Œ“๊ธ€ ๋‹ฌ๊ธฐ๋ฅผ ๋…๋ คํ•˜๋Š” ๋ฌธ๊ตฌ ์‚ฌ์šฉ
5. ์ด๋ชจ์ง€ ํ™œ์šฉ
   - ์ฃผ์š” ํฌ์ธํŠธ๋‚˜ ์ƒˆ๋กœ์šด ์„น์…˜์„ ์‹œ์ž‘ํ•  ๋•Œ๋งŒ ๊ด€๋ จ ์ด๋ชจ์ง€ ์‚ฌ์šฉ
   - ์ „์ฒด ๊ธ€์—์„œ 3-5๊ฐœ ์ •๋„์˜ ์ด๋ชจ์ง€๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๊ณผ๋„ํ•˜์ง€ ์•Š๊ฒŒ ์œ ์ง€
6. ๋งˆ๋ฌด๋ฆฌ
   - ์นœ๊ทผํ•˜๊ณ  ๊ฒฉ๋ คํ•˜๋Š” ํ†ค์œผ๋กœ ๋งˆ๋ฌด๋ฆฌ
   - ๋‹ค์Œ ํฌ์ŠคํŒ…์— ๋Œ€ํ•œ ๊ธฐ๋Œ€๊ฐ ์œ ๋ฐœ
์ฃผ์˜์‚ฌํ•ญ: ๋„ˆ๋ฌด ๊ฐ€๋ฒผ์šด ํ†ค์€ ์ง€์–‘ํ•˜๊ณ , ์ฃผ์ œ์˜ ์ค‘์š”์„ฑ์„ ํ•ด์น˜์ง€ ์•Š๋Š” ์„ ์—์„œ ์นœ๊ทผํ•จ ์œ ์ง€
        """,
        "์ผ๋ฐ˜": """
#์ผ๋ฐ˜์ ์ธ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ
1. ํ†ค๊ณผ ์–ด์กฐ
   - ์ค‘๋ฆฝ์ ์ด๊ณ  ๊ฐ๊ด€์ ์ธ ํ†ค ์œ ์ง€
   - ์ ์ ˆํ•œ ์กด๋Œ“๋ง ์‚ฌ์šฉ (์˜ˆ: "~ํ•ฉ๋‹ˆ๋‹ค", "~์ž…๋‹ˆ๋‹ค")

2. ๋‚ด์šฉ ๊ตฌ์กฐ ๋ฐ ์ „๊ฐœ
   - ๋ช…ํ™•ํ•œ ์ฃผ์ œ ์ œ์‹œ๋กœ ์‹œ์ž‘
   - ๋…ผ๋ฆฌ์ ์ธ ์ˆœ์„œ๋กœ ์ •๋ณด ์ „๊ฐœ
   - ์ฃผ์š” ํฌ์ธํŠธ๋ฅผ ๊ฐ•์กฐํ•˜๋Š” ์†Œ์ œ๋ชฉ ํ™œ์šฉ
   - ์ ์ ˆํ•œ ๊ธธ์ด์˜ ๋‹จ๋ฝ์œผ๋กœ ๊ตฌ์„ฑ

3. ์šฉ์–ด ๋ฐ ์„ค๋ช… ๋ฐฉ์‹
   - ์ผ๋ฐ˜์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์šฉ์–ด ์„ ํƒ
   - ํ•„์š”์‹œ ๊ฐ„๋‹จํ•œ ์„ค๋ช… ์ถ”๊ฐ€
   - ๊ฐ๊ด€์ ์ธ ์ •๋ณด ์ œ๊ณต์— ์ค‘์ 

4. ํ…์ŠคํŠธ ๊ตฌ์กฐํ™”
   - ๋ถˆ๋ฆฟ ํฌ์ธํŠธ๋‚˜ ๋ฒˆํ˜ธ ๋งค๊ธฐ๊ธฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ •๋ณด ๊ตฌ์กฐํ™”
   - ์ค‘์š”ํ•œ ์ •๋ณด๋Š” ๊ตต์€ ๊ธ€์”จ๋‚˜ ๊ธฐ์šธ์ž„๊ผด๋กœ ๊ฐ•์กฐ

5. ๋…์ž ์ƒํ˜ธ์ž‘์šฉ
   - ์ ์ ˆํžˆ ๋…์ž์˜ ์ƒ๊ฐ์„ ๋ฌป๋Š” ์งˆ๋ฌธ ํฌํ•จ
   - ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ํ‚ค์›Œ๋“œ ์ œ์‹œ

6. ๋งˆ๋ฌด๋ฆฌ
   - ์ฃผ์š” ๋‚ด์šฉ ๊ฐ„๋‹จํžˆ ์š”์•ฝ
   - ์ถ”๊ฐ€ ์ •๋ณด์— ๋Œ€ํ•œ ์•ˆ๋‚ด ์ œ๊ณต

์ฃผ์˜์‚ฌํ•ญ: ๋„ˆ๋ฌด ๋”ฑ๋”ฑํ•˜๊ฑฐ๋‚˜ ์ง€๋ฃจํ•˜์ง€ ์•Š๋„๋ก ๊ท ํ˜• ์œ ์ง€
        """,
        "์ „๋ฌธ์ ์ธ": """
#์ „๋ฌธ์ ์ธ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ… ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ

1. ํ†ค๊ณผ ๊ตฌ์กฐ
   - ๊ณต์‹์ ์ด๊ณ  ํ•™์ˆ ์ ์ธ ํ†ค ์‚ฌ์šฉ
- ๊ฐ๊ด€์ ์ด๊ณ  ๋ถ„์„์ ์ธ ์ ‘๊ทผ ์œ ์ง€
   - ๋ช…ํ™•ํ•œ ์„œ๋ก , ๋ณธ๋ก , ๊ฒฐ๋ก  ๊ตฌ์กฐ
   - ์ฒด๊ณ„์ ์ธ ๋…ผ์  ์ „๊ฐœ
   - ์„ธ๋ถ€ ์„น์…˜์„ ์œ„ํ•œ ๋ช…ํ™•ํ•œ ์†Œ์ œ๋ชฉ ์‚ฌ์šฉ

2. ๋‚ด์šฉ ๊ตฌ์„ฑ ๋ฐ ์ „๊ฐœ
   - ๋ณต์žกํ•œ ๊ฐœ๋…์„ ์ •ํ™•ํžˆ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์žฅ ๊ตฌ์กฐ ์‚ฌ์šฉ
   - ๋…ผ๋ฆฌ์  ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ์ „ํ™˜์–ด ํ™œ์šฉ
   - ํ•ด๋‹น ๋ถ„์•ผ์˜ ์ „๋ฌธ ์šฉ์–ด ์ ๊ทน ํ™œ์šฉ (ํ•„์š”์‹œ ๊ฐ„๋žตํ•œ ์„ค๋ช… ์ œ๊ณต)
   - ์‹ฌ์ธต์ ์ธ ๋ถ„์„๊ณผ ๋น„ํŒ์  ์‚ฌ๊ณ  ์ „๊ฐœ
   - ๋‹ค์–‘ํ•œ ๊ด€์  ์ œ์‹œ ๋ฐ ๋น„๊ต

3. ๋ฐ์ดํ„ฐ ๋ฐ ๊ทผ๊ฑฐ ํ™œ์šฉ
   - ํ†ต๊ณ„, ์—ฐ๊ตฌ ๊ฒฐ๊ณผ, ์ „๋ฌธ๊ฐ€ ์˜๊ฒฌ ๋“ฑ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ถœ์ฒ˜ ์ธ์šฉ
   - ํ•„์š”์‹œ ๊ฐ์ฃผ๋‚˜ ์ฐธ๊ณ ๋ฌธํ—Œ ๋ชฉ๋ก ํฌํ•จ
   - ์ˆ˜์น˜ ๋ฐ์ดํ„ฐ๋Š” ํ…์ŠคํŠธ๋กœ ๋ช…ํ™•ํžˆ ์„ค๋ช…

4. ํ…์ŠคํŠธ ๊ตฌ์กฐํ™”
   - ๋…ผ๋ฆฌ์  ๊ตฌ์กฐ๋ฅผ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฒˆํ˜ธ ๋งค๊ธฐ๊ธฐ ์‚ฌ์šฉ
   - ํ•ต์‹ฌ ๊ฐœ๋…์ด๋‚˜ ์šฉ์–ด๋Š” ๊ธฐ์šธ์ž„๊ผด๋กœ ๊ฐ•์กฐ
   - ๊ธด ์ธ์šฉ๋ฌธ์€ ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ๊ตฌ๋ถ„

5. ๋งˆ๋ฌด๋ฆฌ
   - ํ•ต์‹ฌ ๋…ผ์  ์žฌ๊ฐ•์กฐ
   - ํ–ฅํ›„ ์—ฐ๊ตฌ ๋ฐฉํ–ฅ์ด๋‚˜ ์‹ค๋ฌด์  ํ•จ์˜ ์ œ์‹œ

์ฃผ์˜์‚ฌํ•ญ: ์ „๋ฌธ์„ฑ์„ ์œ ์ง€ํ•˜๋˜, ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ์ˆ˜์ค€์€ ์ง€์–‘
        """
    }
    return prompts.get(style, "ํฌ์ŠคํŒ… ์Šคํƒ€์ผ ํ”„๋กฌํ”„ํŠธ")

def get_style_description(style):
    descriptions = {
        "์นœ๊ทผํ•œ": "๋…์ž์™€ ๊ฐ€๊นŒ์šด ์นœ๊ตฌ์ฒ˜๋Ÿผ ๋Œ€ํ™”ํ•˜๋Š” ๋“ฏํ•œ ์นœ๊ทผํ•œ ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค.",
        "์ผ๋ฐ˜": "์ผ๋ฐ˜์ ์ด๊ณ  ์ค‘๋ฆฝ์ ์ธ ํ†ค์œผ๋กœ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค.",
        "์ „๋ฌธ์ ์ธ": "์ „๋ฌธ๊ฐ€์˜ ์‹œ๊ฐ์—์„œ ๊นŠ์ด ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค."
    }
    return descriptions.get(style, "ํฌ์ŠคํŒ… ์Šคํƒ€์ผ์„ ์„ ํƒํ•˜์„ธ์š”.")

def update_prompts(category, style):
    title_prompt = get_title_prompt(category)
    outline_prompt = get_outline_prompt(category)
    blog_post_prompt = get_blog_post_prompt(category)
    style_prompt = get_style_prompt(style)
    style_description = get_style_description(style)
    return title_prompt, outline_prompt, blog_post_prompt, style_prompt, style_description

class PDF(FPDF):
    def __init__(self):
        super().__init__()
        current_dir = os.path.dirname(__file__)
        self.add_font("NanumGothic", "", os.path.join(current_dir, "NanumGothic.ttf"))
        self.add_font("NanumGothic", "B", os.path.join(current_dir, "NanumGothicBold.ttf"))
        self.add_font("NanumGothicExtraBold", "", os.path.join(current_dir, "NanumGothicExtraBold.ttf"))
        self.add_font("NanumGothicLight", "", os.path.join(current_dir, "NanumGothicLight.ttf"))

    def header(self):
        self.set_font('NanumGothic', '', 10)

    def footer(self):
        self.set_y(-15)
        self.set_font('NanumGothic', '', 8)
        self.cell(0, 10, f'Page {self.page_no()}', 0, 0, 'C')

def format_filename(text):
    text = re.sub(r'[^\w\s-]', '', text)
    return text[:50].strip()

def extract_first_recommended_title(blog_post):
    match = re.search(r'## ์ถ”์ฒœ ์ œ๋ชฉ\s*\n\s*(?:\n\s*)*\d+\.\s*(.*?)\s*(?:\n|$)', blog_post, re.DOTALL)
    if match:
        title = match.group(1).strip()
        print(f"Extracted title: {title}")
        return title
    print("No title found")
    return "๋ธ”๋กœ๊ทธ_๊ธ€"

def save_to_pdf(blog_post):
    pdf = PDF()
    
    pdf.add_page()
    pdf.set_font("NanumGothic", 'B', size=14)
    pdf.cell(0, 10, "๋ธ”๋กœ๊ทธ ๊ธ€", ln=True, align='C')
    pdf.ln(10)
    pdf.set_font("NanumGothic", '', size=11)
    pdf.multi_cell(0, 5, blog_post)

    title = extract_first_recommended_title(blog_post)
    filename = format_filename(title) + ".pdf"
    print(f"Saving PDF as: {filename}")
    pdf.output(filename)
    return filename

def save_content_to_pdf(blog_post):
    filename = save_to_pdf(blog_post)
    return filename

title = "์ƒํ’ˆ๋ฆฌ๋ทฐ ๊ณ ๊ฐ๋ฐ˜์‘ํ˜•_์ˆ˜๋™"

with gr.Blocks() as demo:
    gr.Markdown(f"# {title}")
    
    gr.Markdown("### 1๋‹จ๊ณ„: ํฌ์ŠคํŒ… ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ง€์ •ํ•ด์ฃผ์„ธ์š”", elem_id="step-title")
    category = gr.Radio(choices=["๊ณ ๊ฐ๋ฐ˜์‘ํ˜•"], label="ํฌ์ŠคํŒ… ์นดํ…Œ๊ณ ๋ฆฌ", value="๊ณ ๊ฐ๋ฐ˜์‘ํ˜•")
    
    gr.Markdown("---\n\n")

    gr.Markdown("### 2๋‹จ๊ณ„: ํฌ์ŠคํŒ… ์Šคํƒ€์ผ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”", elem_id="step-title")
    style = gr.Radio(choices=["์นœ๊ทผํ•œ", "์ผ๋ฐ˜", "์ „๋ฌธ์ ์ธ"], label="ํฌ์ŠคํŒ… ์Šคํƒ€์ผ", value="์นœ๊ทผํ•œ")
    style_description = gr.Markdown(f"_{get_style_description('์นœ๊ทผํ•œ')}_", elem_id="style-description")
    
    gr.Markdown("---\n\n")

    gr.Markdown("### 3๋‹จ๊ณ„: ๋ธ”๋กœ๊ทธ ์ฃผ์ œ, ๋˜๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ์„ธํžˆ ์ž…๋ ฅํ•˜์„ธ์š”", elem_id="step-title")
    topic = gr.Textbox(label="๋ธ”๋กœ๊ทธ ์ฃผ์ œ(์˜ˆ์‹œ: ์˜ค์ง•์–ด ๋ฌด์นจํšŒ(X), ์˜ค์ง•์–ด ๋ฌด์นจํšŒ ๋ ˆ์‹œํ”ผ(O))", placeholder="์˜ˆ์‹œ: ์—ฌํ–‰์ง€ ์ถ”์ฒœ(X), 8์›” ๊ตญ๋‚ด ์—ฌํ–‰์ง€ ์ถ”์ฒœ(O)")

    gr.Markdown("---\n\n")

    gr.Markdown("### 4๋‹จ๊ณ„: ์ฐธ๊ณ  ๊ธ€์„ ์ž…๋ ฅํ•˜์„ธ์š”", elem_id="step-title")
    references1 = gr.Textbox(label="์ฐธ๊ณ  ๊ธ€ 1", placeholder="์ฐธ๊ณ ํ•  ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…๊ธ€์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”", lines=10, visible=True)
    references2 = gr.Textbox(label="์ฐธ๊ณ  ๊ธ€ 2", placeholder="์ฐธ๊ณ ํ•  ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…๊ธ€์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”", lines=10, visible=True)
    references3 = gr.Textbox(label="์ฐธ๊ณ  ๊ธ€ 3", placeholder="์ฐธ๊ณ ํ•  ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…๊ธ€์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”", lines=10, visible=True)

    gr.Markdown("---\n\n")

    gr.Markdown("### 5๋‹จ๊ณ„: ๋ธ”๋กœ๊ทธ ์ œ๋ชฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”", elem_id="step-title")
    
    with gr.Accordion("์ œ๋ชฉ ์„ค์ •", visible=True):
        title_system_message = gr.Textbox(label="์นดํ…Œ๊ณ ๋ฆฌ ํ”„๋กฌํ”„ํŠธ", value=get_title_prompt("๊ณ ๊ฐ๋ฐ˜์‘ํ˜•"), lines=15, visible=True)
        title_max_tokens = gr.Slider(label="Max Tokens", minimum=1000, maximum=8000, value=5000, step=1000)
        title_temperature = gr.Slider(label="Temperature", minimum=0.1, maximum=1.0, value=0.8, step=0.1)
        title_top_p = gr.Slider(label="Top P", minimum=0.1, maximum=1.0, value=0.95, step=0.05)

    title_btn = gr.Button("์ œ๋ชฉ ์ถ”์ฒœํ•˜๊ธฐ")
    title_suggestions = gr.Textbox(label="์ œ๋ชฉ ์ถ”์ฒœ", lines=10)
    
    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])
    gr.HTML("<span style='color: grey;'>[์ œ๋ชฉ ์ถ”์ฒœ ํ•ญ๋ชฉ์„ ์ฐธ๊ณ ํ•˜์—ฌ ํ•˜๋‚˜๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์‚ฌ์šฉํ•˜์…”๋„ ๋ฉ๋‹ˆ๋‹ค.]</span>")
    blog_title = gr.Textbox(label="๋ธ”๋กœ๊ทธ ์ œ๋ชฉ", placeholder="๋ธ”๋กœ๊ทธ ์ œ๋ชฉ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”")
    
    gr.Markdown("---\n\n")

    gr.Markdown("### 6๋‹จ๊ณ„: ์•„์›ƒ๋ผ์ธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”", elem_id="step-title")
    gr.HTML("<span style='color: grey;'>[์•„์›ƒ๋ผ์ธ์—์„œ ๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฅผ ์ˆ˜์ •ํ•ด์„œ ์‚ฌ์šฉํ•ด์ฃผ์„ธ์š”]</span>")
    
    with gr.Accordion("์•„์›ƒ๋ผ์ธ ์„ค์ •", visible=True):
        outline_system_message = gr.Textbox(label="์นดํ…Œ๊ณ ๋ฆฌ ํ”„๋กฌํ”„ํŠธ", value=get_outline_prompt("๊ณ ๊ฐ๋ฐ˜์‘ํ˜•"), lines=20, visible=True)
        outline_max_tokens = gr.Slider(label="Max Tokens", minimum=1000, maximum=8000, value=6000, step=1000)
        outline_temperature = gr.Slider(label="Temperature", minimum=0.1, maximum=1.0, value=0.8, step=0.1)
        outline_top_p = gr.Slider(label="Top P", minimum=0.1, maximum=1.0, value=0.95, step=0.05)
    
    outline_generate_btn = gr.Button("์•„์›ƒ๋ผ์ธ ์ƒ์„ฑํ•˜๊ธฐ")
    outline_result = gr.Textbox(label="์•„์›ƒ๋ผ์ธ ๊ฒฐ๊ณผ", lines=15)
    outline_input = gr.Textbox(label="์ž‘์„ฑํ•  ์•„์›ƒ๋ผ์ธ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”", placeholder="์ƒ์„ฑ๋œ ์•„์›ƒ๋ผ์ธ ๋ณต์‚ฌ, ์ˆ˜์ •ํ•ด์„œ ์‚ฌ์šฉํ•˜์„ธ์š”", lines=10)

    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])
    
    gr.Markdown("---\n\n")

    gr.Markdown("### 7๋‹จ๊ณ„: ๊ธ€ ์ƒ์„ฑํ•˜๊ธฐ", elem_id="step-title")
    gr.HTML("<span style='color: grey;'>[์•„์›ƒ๋ผ์ธ ๋ณ„ ํ…์ŠคํŠธ๋Ÿ‰์„ ์ •ํ•˜๊ณ  ๊ธ€ ์ƒ์„ฑํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”]</span>")
    
    with gr.Accordion("๋ธ”๋กœ๊ทธ ๊ธ€ ์„ค์ •", visible=True):
        blog_system_message = gr.Textbox(label="์นดํ…Œ๊ณ ๋ฆฌ ํ”„๋กฌํ”„ํŠธ", value=get_blog_post_prompt("๊ณ ๊ฐ๋ฐ˜์‘ํ˜•"), lines=20, visible=True)
        blog_max_tokens = gr.Slider(label="Max Tokens", minimum=1000, maximum=12000, value=8000, step=1000)
        blog_temperature = gr.Slider(label="Temperature", minimum=0.1, maximum=1.0, value=0.8, step=0.1)
        blog_top_p = gr.Slider(label="Top P", minimum=0.1, maximum=1.0, value=0.95, step=0.05)
        
    generate_btn = gr.Button("๋ธ”๋กœ๊ทธ ๊ธ€ ์ƒ์„ฑํ•˜๊ธฐ")
    output = gr.Textbox(label="์ƒ์„ฑ๋œ ๋ธ”๋กœ๊ทธ ๊ธ€", lines=30)
    
    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])

    save_pdf_btn = gr.Button("PDF๋กœ ์ €์žฅํ•˜๊ธฐ")
    pdf_output = gr.File(label="์ƒ์„ฑ๋œ PDF ํŒŒ์ผ")

    save_pdf_btn.click(fn=save_content_to_pdf, inputs=[output], outputs=[pdf_output])

    def update_prompts_and_description(category, style):
        title_prompt, outline_prompt, blog_post_prompt, style_prompt, style_description = update_prompts(category, style)
        return title_prompt, outline_prompt, blog_post_prompt, style_description
    
    category.change(fn=update_prompts_and_description, inputs=[category, style], outputs=[title_system_message, outline_system_message, blog_system_message, style_description])
    style.change(fn=update_prompts_and_description, inputs=[category, style], outputs=[title_system_message, outline_system_message, blog_system_message, style_description])

demo.launch()

gr.HTML("""
<style>
#step-title {
    font-size: 1.7em;
    font-weight: bold;
}
#style-description {
    font-size: 1.2em;
    font-style: italic;
}
</style>
""")