Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -1,488 +1,2 @@
|
|
1 |
import os
|
2 |
-
|
3 |
-
from dotenv import load_dotenv
|
4 |
-
import logging
|
5 |
-
import time
|
6 |
-
import uuid
|
7 |
-
import google.generativeai as genai
|
8 |
-
|
9 |
-
# ๋ก๊น
์ค์ - INFO ๋ ๋ฒจ๋ก ๋ณ๊ฒฝ
|
10 |
-
logging.basicConfig(level=logging.INFO)
|
11 |
-
logger = logging.getLogger(__name__)
|
12 |
-
|
13 |
-
# ํ๊ฒฝ ๋ณ์ ๋ก๋
|
14 |
-
load_dotenv()
|
15 |
-
|
16 |
-
# API ํค ์ค์
|
17 |
-
GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY")
|
18 |
-
logger.info("API ํค ์ค์ ์๋ฃ")
|
19 |
-
|
20 |
-
# Google Gemini ์ด๊ธฐํ
|
21 |
-
genai.configure(api_key=GOOGLE_API_KEY)
|
22 |
-
|
23 |
-
# ๋ชจ๋ธ๋ณ ํ๋กฌํํธ ์ ์
|
24 |
-
GEMINI_PROMPTS = {
|
25 |
-
"๋ง์ถค๋ฒ ๊ฒ์ฌ๊ธฐ": """
|
26 |
-
# ๋ชฉ์ : ํ๊ตญ์ด ๋ฌธ๋ฒ ๊ต์ ๋ฐ ๊ฐ์
|
27 |
-
## ์ง์นจ
|
28 |
-
1. ์ฃผ์ด์ง ํ
์คํธ์ ๋ฌธ๋ฒ์ ์ ๋ฌธ์ ์ผ๋ก ๊ฒํ ํ๊ณ ๊ต์ ํ์ธ์.
|
29 |
-
2. ์๋ณธ ํ
์คํธ์ ์๋ฏธ์ ์๋๋ฅผ ์ฒ ์ ํ ์ ์งํ๋ฉด์ ๋ฌธ๋ฒ์ ์ธ ๋ถ๋ถ๋ง ์์ ํ์ธ์.
|
30 |
-
3. ๋ค์ ์์๋ค์ ํ๊ตญ์ด ๋ฌธ๋ฒ ๊ท์น์ ๋ง๊ฒ ์ ํํ๊ฒ ์์ ํ์ธ์:
|
31 |
-
- ๋ง์ถค๋ฒ ์ค๋ฅ
|
32 |
-
- ๋์ด์ฐ๊ธฐ ์ค๋ฅ
|
33 |
-
- ๋ฌธ์ฅ ๋ถํธ ์ฌ์ฉ
|
34 |
-
- ์กฐ์ฌ ์ฌ์ฉ์ ์ ํ์ฑ
|
35 |
-
- ์ด๋ฏธ ํ์ฉ์ ์ ํ์ฑ
|
36 |
-
- ๋ฌธ์ฅ ์ฑ๋ถ์ ํธ์ ๊ด๊ณ
|
37 |
-
4. ์ ๋ ์๋ณธ ํ
์คํธ์ ์๋ ๋ด์ฉ์ ์ถ๊ฐํ๊ฑฐ๋ ์๋ฏธ๋ฅผ ๋ณ๊ฒฝํ์ง ๋ง์ธ์.
|
38 |
-
5. ๋ถ๊ฐ ์ค๋ช
์ด๋ ๋ฉํ ์ ๋ณด(์: "์์ ๋ ํ
์คํธ:", "๊ฐ์ ๋ ํ
์คํธ:" ๋ฑ)๋ ์ถ๋ ฅํ์ง ๋ง์ธ์.
|
39 |
-
6. ์ค์ง ๊ต์ ๋ ํ
์คํธ๋ง ์ถ๋ ฅํ์ธ์.
|
40 |
-
""",
|
41 |
-
|
42 |
-
"๊ธ ๋ค๋ฌ๊ธฐ": """
|
43 |
-
# ๋ชฉ์ : ๋ฌธ์ฅ ๊ตฌ์กฐ์ ํํ ๊ฐ์
|
44 |
-
## ์ง์นจ
|
45 |
-
1. ๋ฌธ์ฅ ๊ตฌ์กฐ ์ต์ ํ
|
46 |
-
- ๋ถํ์ํ ๋ฌธ๊ตฌ์ ์ค๋ณต ํํ์ ์ ๊ฑฐํ์ฌ ๊ฐ๊ฒฐ์ฑ ํ๋ณด
|
47 |
-
- ์ฃผ์ด-์์ ์ด ๊ด๊ณ๋ฅผ ๋ช
ํํ ํ์ฌ ์๋ฏธ ์ ๋ฌ๋ ฅ ๊ฐํ
|
48 |
-
- ๊ณผ๋ํ๊ฒ ๊ธด ๋ฌธ์ฅ์ ์ ์ ํ ๋ถ๋ฆฌํ์ฌ ๊ฐ๋
์ฑ ํฅ์
|
49 |
-
- ๋ฌธ์ฅ ๊ฐ์ ๋
ผ๋ฆฌ์ ์ฐ๊ฒฐ์ฑ ํ๋ณด
|
50 |
-
|
51 |
-
2. ๋จ๋ฝ ๊ตฌ์ฑ ์ต์ ํ
|
52 |
-
- ๊ฐ ๋จ๋ฝ์ด ๋ช
ํํ ํต์ฌ ์ฃผ์ ๋ฅผ ๊ฐ์ง๋๋ก ์กฐ์
|
53 |
-
- ๋จ๋ฝ ๊ฐ ์์ฐ์ค๋ฌ์ด ํ๋ฆ์ ์ํ ์ฐ๊ฒฐ์ด ์ฌ์ฉ
|
54 |
-
- ๋จ๋ฝ ๊ธธ์ด์ ๊ท ํ ์ ์ง
|
55 |
-
|
56 |
-
3. ์ดํ ๋ฐ ํํ ๊ฐ์
|
57 |
-
- ๋ถํ์ํ ์ธ๋์ด๋ ์ ์ ํ ํ๊ตญ์ด๋ก ๋์ฒด
|
58 |
-
- ์ถ์์ ์ด๊ฑฐ๋ ๋ชจํธํ ํํ์ ๊ตฌ์ฒด์ ์ด๊ณ ๋ช
ํํ ์ฉ์ด๋ก ๋์ฒด
|
59 |
-
- ์ค๋ณต๋๋ ํํ ์ ๊ฑฐ๋ก ๋ฌธ์ฅ ํจ์จ์ฑ ์ฆ๋
|
60 |
-
- ๊ด์ฉ์ ํํ๊ณผ ์ ์ ํ ๋น์ ๋ฅผ ํ์ฉํ์ฌ ํํ๋ ฅ ๊ฐํ
|
61 |
-
|
62 |
-
4. ์ ๋ฌ๋ ฅ ๊ฐํ
|
63 |
-
- ํต์ฌ ๋ฉ์์ง๊ฐ ๋๋ณด์ด๋๋ก ๋ฌธ์ฅ ๊ตฌ์กฐ ์ฌ๋ฐฐ์น
|
64 |
-
- ๋
ผ๋ฆฌ์ ํ๋ฆ๊ณผ ์ผ๊ด์ฑ ํ๋ณด
|
65 |
-
- ๋
์์ ์ดํด๋๋ฅผ ๊ณ ๋ คํ ํํ ์ ํ
|
66 |
-
|
67 |
-
5. ์ผ๊ด์ฑ ์ ์ง
|
68 |
-
- ๋ฌธ์ฒด์ ํค์ ์ผ๊ด์ฑ ์ ์ง
|
69 |
-
- ์ ๋ฌธ ์ฉ์ด์ ํํ์ ํต์ผ์ฑ ํ๋ณด
|
70 |
-
- ์์ ์ ์ผ๊ด๋ ์ฌ์ฉ
|
71 |
-
|
72 |
-
## ์ถ๋ ฅ ํ์
|
73 |
-
- ์๋ณธ ํ
์คํธ์ ๋์ผํ ๋งํฌ์ ์ด์กฐ๋ฅผ ์ ์งํ๋, ์ ๊ธฐ์ค์ ๋ฐ๋ผ ๊ฐ์ ๋ ํ
์คํธ๋ง ์ถ๋ ฅ
|
74 |
-
- ๋ถ๊ฐ ์ค๋ช
์ด๋ ๋ฉํ ์ ๋ณด๋ ํฌํจํ์ง ์์
|
75 |
-
""",
|
76 |
-
|
77 |
-
"๋ช
์ธ ์ธ์ฉํ๊ธฐ": """
|
78 |
-
# ๋ชฉ์ : ๋ช
์ธ์ ํ์ฉํ ์ค๋๋ ฅ ์๋ ํ
์คํธ ๊ฐ์
|
79 |
-
## ์ง์นจ
|
80 |
-
1. ๋ฌธ๋งฅ ๋ถ์
|
81 |
-
- ํ
์คํธ์ ํต์ฌ ์ฃผ์ ์ ์๋ ํ์
|
82 |
-
- ํ
์คํธ์ ๋ถ์๊ธฐ์ ํค ๋ถ์
|
83 |
-
- ๋
์์ธต๊ณผ ๋ชฉ์ ๊ณ ๋ ค
|
84 |
-
|
85 |
-
2. ์ ์ ํ ๋ช
์ธ ์ ํ
|
86 |
-
- ํ
์คํธ์ ์ฃผ์ ์ ์ง์ ์ ์ผ๋ก ์ฐ๊ด๋ ๋ช
์ธ ์ ํ
|
87 |
-
- ๋ค์ํ ๋ถ์ผ(์ฒ ํ, ๋ฌธํ, ์ญ์ฌ, ๊ณผํ ๋ฑ)์ ๋ช
์ธ ๊ณ ๋ ค
|
88 |
-
- ๊ณ ์ ์ ์ธ ๋ช
์ธ๋ฟ๋ง ์๋๋ผ ํ๋ ์ ๋ช
์ธ(์ฐ์์ธ, ๊ธฐ์
์ธ, ์ด๋์ ์, ์ ์น์ธ ๋ฑ)์ ์ธ์์ ์ธ ๋ง๋ ์ ๊ทน ํ์ฉ
|
89 |
-
- ํ๊ตญ ๋ฐ ์ธ๊ณ์ ์ ๋ช
ํ ์ธ๋ฌผ์ ๋ช
์ธ ํ์ฉ
|
90 |
-
- ํ
์คํธ์ ํค๊ณผ ๋ถ์๊ธฐ์ ์ด์ธ๋ฆฌ๋ ๋ช
์ธ ์ ํ
|
91 |
-
- ๊ฐ๋ฅํ๋ฉด ์์์ ์ ํ๊ณ ์ต์ ํธ๋ ๋๋ฅผ ๋ฐ์ํ ํ๋์ ๋ช
์ธ ์ฐ์ ๊ณ ๋ ค
|
92 |
-
|
93 |
-
3. ๋ช
์ธ ํตํฉ
|
94 |
-
- ํ
์คํธ ๋ด ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ์์น์ ๋ช
์ธ ๋ฐฐ์น (์์, ์ค๊ฐ, ๋๋ ๊ฒฐ๋ก )
|
95 |
-
- ๋ช
์ธ์ ์์ฐ์ค๋ฝ๊ฒ ๋์
ํ์ฌ ๊ธฐ์กด ํ
์คํธ์ ์กฐํ๋กญ๊ฒ ํตํฉ
|
96 |
-
- ํ์์ ๋ช
์ธ์ ์ถ์ฒ(์ธ๋ฌผ ์ด๋ฆ) ํฌํจ
|
97 |
-
- ๋ฑ ํ ๋ฒ๋ง ๋ช
์ธ ์ธ์ฉํ๊ธฐ
|
98 |
-
- ํ๋ ์ ๋ช
์ธ์ ๋ช
์ธ ์ฌ์ฉ ์ ๊ฐ๋จํ ๋งฅ๋ฝ ์ค๋ช
๊ณ ๋ ค(ํ์ํ ๊ฒฝ์ฐ)
|
99 |
-
|
100 |
-
4. ์ ์ฒด ํ
์คํธ ์กฐ์
|
101 |
-
- ๋ช
์ธ ๋์
ํ ํ์์ ์ ํ ๋ฌธ์ฅ ์กฐ์ ํ์ฌ ์์ฐ์ค๋ฌ์ด ํ๋ฆ ์ ์ง
|
102 |
-
- ์๋ณธ ํ
์คํธ์ ํต์ฌ ๋ฉ์์ง์ ์๋ ๋ณด์กด
|
103 |
-
- ์ ์ฒด์ ์ธ ์ผ๊ด์ฑ๊ณผ ์์ง๋ ฅ ์ ์ง
|
104 |
-
- ๋ช
์ธ์ด ํ
์คํธ์ ์ ์ ํจ๊ณผ ๊ถ์๋ฅผ ๋ถ์ฌํ๋์ง ํ์ธ
|
105 |
-
|
106 |
-
## ์ถ๋ ฅ ํ์
|
107 |
-
- ๋ช
์ธ์ด ์์ฐ์ค๋ฝ๊ฒ ํตํฉ๋ ๊ฐ์ ๋ ํ
์คํธ๋ง ์ถ๋ ฅ
|
108 |
-
- ๋ถ๊ฐ ์ค๋ช
์ด๋ ๋ฉํ ์ ๋ณด ์์ด ์์ํ๊ฒ ๊ฐ์ ๋ ํ
์คํธ๋ง ์ ๊ณต
|
109 |
-
""",
|
110 |
-
|
111 |
-
"๋ง์ถคํ ๋ณํ": """
|
112 |
-
# ๋ชฉ์ : ์ฌ์ฉ์ ์ ์ ํ๋ฅด์๋์ ๋ชฉ์ ์ ๋ง๋ ํ
์คํธ ๋ณํ
|
113 |
-
## ์ง์นจ
|
114 |
-
1. ํ๋ฅด์๋ ๋ถ์ ๋ฐ ์ ์ฉ
|
115 |
-
- ์ฌ์ฉ์๊ฐ ์ ๊ณตํ ํ๋ฅด์๋์ ํน์ฑ ๋ถ์ (๋งํฌ, ์ดํ ์ ํ, ๋ฌธ์ฅ ๊ตฌ์กฐ ๋ฑ)
|
116 |
-
- ํด๋น ํ๋ฅด์๋๊ฐ ์ค์ ๋ก ์์ฑํ์ ๋ฒํ ์คํ์ผ๋ก ํ
์คํธ ์ฌ๊ตฌ์ฑ
|
117 |
-
- ํ๋ฅด์๋์ ๊ณ ์ ํ ํํ ๋ฐฉ์๊ณผ ๊ด์ ๋ฐ์
|
118 |
-
|
119 |
-
2. ๋ชฉ์ ๋ถ์ ๋ฐ ์ ์ฉ
|
120 |
-
- ์ฌ์ฉ์๊ฐ ๋ช
์ํ ๋ชฉ์ ์ ๋ง๊ฒ ํ
์คํธ์ ์ ๋ฐ์ ์ธ ๋ฐฉํฅ์ฑ ์กฐ์
|
121 |
-
- ๋ชฉ์ ์ ๋ง๋ ๊ตฌ์กฐ, ๋
ผ์กฐ, ๊ฐ์กฐ์ ์ค์
|
122 |
-
- ๋ชฉ์ ๋ฌ์ฑ์ ํ์ํ ์์ ๏ฟฝ๏ฟฝํ ๋ฐ ๋ถํ์ํ ์์ ์ ๊ฑฐ
|
123 |
-
|
124 |
-
3. ํ
์คํธ ๋ง์ถค ๋ณํ
|
125 |
-
- ํ๋ฅด์๋์ ๋ชฉ์ ์ ์ข
ํฉ์ ์ผ๋ก ๊ณ ๋ คํ ํ
์คํธ ๋ณํ
|
126 |
-
- ์๋ณธ ํ
์คํธ์ ํต์ฌ ์ ๋ณด์ ์ฃผ์ ๋
ผ์ ์ ์ง
|
127 |
-
- ์ดํ, ๋ฌธ์ฅ ๊ตฌ์กฐ, ๋น์ , ์์ ๋ฑ์ ํ๋ฅด์๋์ ๋ชฉ์ ์ ๋ง๊ฒ ์กฐ์
|
128 |
-
- ์ ์ฒด์ ์ธ ์ผ๊ด์ฑ๊ณผ ์ง์ ์ฑ ์ ์ง
|
129 |
-
|
130 |
-
4. ํ์ง ๋ฐ ํจ๊ณผ ์ต์ ํ
|
131 |
-
- ๋ช
ํ์ฑ๊ณผ ์ดํด๋ ํฅ์
|
132 |
-
- ์ค๋๋ ฅ๊ณผ ํธ์๋ ฅ ๊ฐํ
|
133 |
-
- ๋
์ฐฝ์ฑ๊ณผ ์ฐธ์ ํจ ์ถ๊ตฌ
|
134 |
-
- ๋ชฉํ ๋
์์๊ฒ ํจ๊ณผ์ ์ผ๋ก ์ ๋ฌ๋ ์ ์๋ ํํ๋ก ์ต์ ํ
|
135 |
-
|
136 |
-
## ์ถ๋ ฅ ํ์
|
137 |
-
- ํ๋ฅด์๋์ ๋ชฉ์ ์ ๋ง๊ฒ ๋ณํ๋ ํ
์คํธ๋ง ์ถ๋ ฅ
|
138 |
-
- ๋ถ๊ฐ ์ค๋ช
์ด๋ ๋ฉํ ์ ๋ณด ์์ด ์์ํ๊ฒ ๋ณํ๋ ํ
์คํธ๋ง ์ ๊ณต
|
139 |
-
- ์ฌ์ฉ์๊ฐ ๋ช
์ํ ๋ชฉ์ ๊ณผ ํ๋ฅด์๋์ ํน์ฑ์ด ๋ช
ํํ ๋๋ฌ๋๋ ๊ฒฐ๊ณผ๋ฌผ ์ ๊ณต
|
140 |
-
""",
|
141 |
-
}
|
142 |
-
|
143 |
-
def process_text(input_text, improvement_type, custom_purpose, persona, temperature, top_p):
|
144 |
-
"""Gemini ๋ชจ๋ธ์ฉ ํ
์คํธ ์ฒ๋ฆฌ ํจ์"""
|
145 |
-
try:
|
146 |
-
print("ํ
์คํธ ์ฒ๋ฆฌ ์์")
|
147 |
-
request_id = str(uuid.uuid4())[:8]
|
148 |
-
timestamp_micro = int(time.time() * 1000000) % 1000
|
149 |
-
|
150 |
-
if improvement_type == "๋ง์ถคํ ๋ณํ":
|
151 |
-
purpose = f"๋ค์ ํ๋ฅด์๋๋ฅผ ๊ฐ์ง๊ณ ํ
์คํธ๋ฅผ ๋ค๋ฌ์ผ์ธ์: {persona}\n\n๋ชฉ์ : {custom_purpose}"
|
152 |
-
else:
|
153 |
-
purpose = GEMINI_PROMPTS[improvement_type]
|
154 |
-
|
155 |
-
model = genai.GenerativeModel(
|
156 |
-
model_name="gemini-2.0-flash",
|
157 |
-
generation_config={
|
158 |
-
"temperature": temperature,
|
159 |
-
"top_p": top_p,
|
160 |
-
"max_output_tokens": 2000,
|
161 |
-
}
|
162 |
-
)
|
163 |
-
|
164 |
-
# ์์คํ
์ง์์ฌํญ์ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ์ ๋ฉ์์ง์ ํฌํจ
|
165 |
-
prompt = f"REQ-{request_id}-{timestamp_micro}\n\n๋ค์ ํ
์คํธ๋ฅผ ๋ชฉ์ ์ ๋ง๊ฒ ๋ค๋ฌ์ด์ฃผ์ธ์.\n\nํ
์คํธ: {input_text}\n\n๋ชฉ์ : {purpose}"
|
166 |
-
|
167 |
-
response = model.generate_content(prompt)
|
168 |
-
print("ํ
์คํธ ์ฒ๋ฆฌ ์๋ฃ")
|
169 |
-
return response.text
|
170 |
-
|
171 |
-
except Exception as e:
|
172 |
-
print("ํ
์คํธ ์ฒ๋ฆฌ ์คํจ")
|
173 |
-
logger.error(f"์ฒ๋ฆฌ ์ค ์ค๋ฅ ๋ฐ์: {str(e)}")
|
174 |
-
return f"์ค๋ฅ ๋ฐ์: {str(e)}"
|
175 |
-
|
176 |
-
def create_interface():
|
177 |
-
# FontAwesome ์์ด์ฝ ํฌํจ
|
178 |
-
fontawesome = """
|
179 |
-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
180 |
-
"""
|
181 |
-
|
182 |
-
# ์ปค์คํ
CSS ์คํ์ผ
|
183 |
-
css = """
|
184 |
-
:root {
|
185 |
-
--primary-color: #FF7F00;
|
186 |
-
--secondary-color: #ff9a8b;
|
187 |
-
--accent-color: #FF6B6B;
|
188 |
-
--background-color: #FFF8F0;
|
189 |
-
--card-bg: #ffffff;
|
190 |
-
--text-color: #334155;
|
191 |
-
--border-radius: 18px;
|
192 |
-
--shadow: 0 8px 30px rgba(251, 127, 13, 0.08);
|
193 |
-
}
|
194 |
-
|
195 |
-
body {
|
196 |
-
font-family: 'Pretendard', 'Noto Sans KR', -apple-system, BlinkMacSystemFont, sans-serif;
|
197 |
-
background-color: var(--background-color);
|
198 |
-
color: var(--text-color);
|
199 |
-
line-height: 1.6;
|
200 |
-
}
|
201 |
-
|
202 |
-
footer {
|
203 |
-
visibility: hidden;
|
204 |
-
}
|
205 |
-
|
206 |
-
.container {
|
207 |
-
max-width: 1200px;
|
208 |
-
margin: 0 auto;
|
209 |
-
}
|
210 |
-
|
211 |
-
.header {
|
212 |
-
background: linear-gradient(135deg, #FF7F00, #FF9A5B);
|
213 |
-
padding: 2rem;
|
214 |
-
border-radius: 15px;
|
215 |
-
margin-bottom: 20px;
|
216 |
-
box-shadow: var(--shadow);
|
217 |
-
text-align: center;
|
218 |
-
color: white;
|
219 |
-
}
|
220 |
-
|
221 |
-
.header h1 {
|
222 |
-
margin: 0;
|
223 |
-
font-size: 2.5rem;
|
224 |
-
font-weight: 700;
|
225 |
-
}
|
226 |
-
|
227 |
-
.header p {
|
228 |
-
margin: 10px 0 0;
|
229 |
-
font-size: 1.2rem;
|
230 |
-
opacity: 0.9;
|
231 |
-
}
|
232 |
-
|
233 |
-
.card {
|
234 |
-
background-color: var(--card-bg);
|
235 |
-
border-radius: var(--border-radius);
|
236 |
-
padding: 20px;
|
237 |
-
margin: 10px 0;
|
238 |
-
box-shadow: var(--shadow);
|
239 |
-
border: 1px solid rgba(0, 0, 0, 0.04);
|
240 |
-
}
|
241 |
-
|
242 |
-
.button-primary {
|
243 |
-
border-radius: 30px !important;
|
244 |
-
background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)) !important;
|
245 |
-
color: white !important;
|
246 |
-
font-size: 18px !important;
|
247 |
-
padding: 10px 20px !important;
|
248 |
-
border: none;
|
249 |
-
box-shadow: 0 4px 8px rgba(251, 127, 13, 0.25);
|
250 |
-
transition: transform 0.3s ease;
|
251 |
-
text-align: center;
|
252 |
-
font-weight: 600;
|
253 |
-
}
|
254 |
-
|
255 |
-
.button-primary:hover {
|
256 |
-
transform: translateY(-2px);
|
257 |
-
box-shadow: 0 6px 12px rgba(251, 127, 13, 0.3);
|
258 |
-
}
|
259 |
-
|
260 |
-
.section-title {
|
261 |
-
display: flex;
|
262 |
-
align-items: center;
|
263 |
-
font-size: 20px;
|
264 |
-
font-weight: 700;
|
265 |
-
color: #333333;
|
266 |
-
margin-bottom: 15px;
|
267 |
-
padding-bottom: 8px;
|
268 |
-
border-bottom: 2px solid #FF7F00;
|
269 |
-
}
|
270 |
-
|
271 |
-
.section-title i {
|
272 |
-
margin-right: 10px;
|
273 |
-
color: #FF7F00;
|
274 |
-
}
|
275 |
-
|
276 |
-
.guide-container {
|
277 |
-
background-color: #FFF0E2;
|
278 |
-
border-radius: var(--border-radius);
|
279 |
-
padding: 1.5rem;
|
280 |
-
margin-bottom: 1.5rem;
|
281 |
-
border: 1px solid rgba(255, 127, 0, 0.1);
|
282 |
-
}
|
283 |
-
|
284 |
-
.guide-title {
|
285 |
-
font-size: 1.3rem;
|
286 |
-
font-weight: 700;
|
287 |
-
color: var(--primary-color);
|
288 |
-
margin-bottom: 1rem;
|
289 |
-
display: flex;
|
290 |
-
align-items: center;
|
291 |
-
}
|
292 |
-
|
293 |
-
.guide-title i {
|
294 |
-
margin-right: 0.8rem;
|
295 |
-
font-size: 1.3rem;
|
296 |
-
}
|
297 |
-
|
298 |
-
.guide-item {
|
299 |
-
display: flex;
|
300 |
-
margin-bottom: 0.8rem;
|
301 |
-
align-items: flex-start;
|
302 |
-
}
|
303 |
-
|
304 |
-
.guide-number {
|
305 |
-
background-color: var(--primary-color);
|
306 |
-
color: white;
|
307 |
-
width: 24px;
|
308 |
-
height: 24px;
|
309 |
-
border-radius: 50%;
|
310 |
-
display: flex;
|
311 |
-
align-items: center;
|
312 |
-
justify-content: center;
|
313 |
-
font-weight: bold;
|
314 |
-
margin-right: 10px;
|
315 |
-
flex-shrink: 0;
|
316 |
-
font-size: 14px;
|
317 |
-
}
|
318 |
-
|
319 |
-
.guide-text {
|
320 |
-
flex: 1;
|
321 |
-
line-height: 1.6;
|
322 |
-
}
|
323 |
-
|
324 |
-
.feature-tag {
|
325 |
-
display: inline-block;
|
326 |
-
background-color: rgba(255, 127, 0, 0.1);
|
327 |
-
color: #FF7F00;
|
328 |
-
padding: 3px 10px;
|
329 |
-
border-radius: 12px;
|
330 |
-
font-size: 14px;
|
331 |
-
font-weight: 600;
|
332 |
-
margin-right: 8px;
|
333 |
-
margin-bottom: 8px;
|
334 |
-
}
|
335 |
-
|
336 |
-
.input-label {
|
337 |
-
font-weight: 600;
|
338 |
-
margin-bottom: 8px;
|
339 |
-
color: #444;
|
340 |
-
}
|
341 |
-
|
342 |
-
/* ๊ทธ๋ผ๋์ค ์์ ์คํ์ผ ์ปค์คํฐ๋ง์ด์ง */
|
343 |
-
.gr-input, .gr-text-input, .gr-sample-inputs {
|
344 |
-
border-radius: var(--border-radius) !important;
|
345 |
-
border: 1px solid #e5e7eb !important;
|
346 |
-
padding: 12px !important;
|
347 |
-
transition: all 0.3s ease !important;
|
348 |
-
}
|
349 |
-
|
350 |
-
.gr-input:focus, .gr-text-input:focus {
|
351 |
-
border-color: var(--primary-color) !important;
|
352 |
-
outline: none !important;
|
353 |
-
box-shadow: 0 0 0 2px rgba(251, 127, 13, 0.2) !important;
|
354 |
-
}
|
355 |
-
|
356 |
-
/* ์คํฌ๋กค๋ฐ ์คํ์ผ๋ง */
|
357 |
-
::-webkit-scrollbar {
|
358 |
-
width: 8px;
|
359 |
-
height: 8px;
|
360 |
-
}
|
361 |
-
|
362 |
-
::-webkit-scrollbar-track {
|
363 |
-
background: rgba(0, 0, 0, 0.05);
|
364 |
-
border-radius: 10px;
|
365 |
-
}
|
366 |
-
|
367 |
-
::-webkit-scrollbar-thumb {
|
368 |
-
background: var(--primary-color);
|
369 |
-
border-radius: 10px;
|
370 |
-
}
|
371 |
-
"""
|
372 |
-
|
373 |
-
with gr.Blocks(css=css, theme=gr.themes.Soft(
|
374 |
-
primary_hue=gr.themes.Color(
|
375 |
-
c50="#FFF7ED",
|
376 |
-
c100="#FFEDD5",
|
377 |
-
c200="#FED7AA",
|
378 |
-
c300="#FDBA74",
|
379 |
-
c400="#FB923C",
|
380 |
-
c500="#F97316",
|
381 |
-
c600="#EA580C",
|
382 |
-
c700="#C2410C",
|
383 |
-
c800="#9A3412",
|
384 |
-
c900="#7C2D12",
|
385 |
-
c950="#431407",
|
386 |
-
),
|
387 |
-
secondary_hue="zinc",
|
388 |
-
neutral_hue="zinc",
|
389 |
-
font=("Pretendard", "sans-serif")
|
390 |
-
)) as demo:
|
391 |
-
|
392 |
-
gr.HTML(fontawesome)
|
393 |
-
with gr.Row():
|
394 |
-
with gr.Column(scale=1):
|
395 |
-
# ์ผ์ชฝ ์
๋ ฅ ์์ญ
|
396 |
-
with gr.Column(elem_classes="card"):
|
397 |
-
gr.HTML('<div class="section-title"><i class="fas fa-edit"></i> ์๋ณธ ํ
์คํธ</div>')
|
398 |
-
input_text = gr.Textbox(
|
399 |
-
label="",
|
400 |
-
placeholder="์ฌ๊ธฐ์ ๊ฐ์ ํ๊ณ ์ถ์ ํ
์คํธ๋ฅผ ์
๋ ฅํ์ธ์...",
|
401 |
-
lines=15
|
402 |
-
)
|
403 |
-
|
404 |
-
with gr.Column(elem_classes="card"):
|
405 |
-
gr.HTML('<div class="section-title"><i class="fas fa-sliders"></i> ๋ณํ ์ค์ </div>')
|
406 |
-
|
407 |
-
improvement_type = gr.Radio(
|
408 |
-
choices=["๋ง์ถค๋ฒ ๊ฒ์ฌ๊ธฐ", "๊ธ ๋ค๋ฌ๊ธฐ", "๋ช
์ธ ์ธ์ฉํ๊ธฐ", "๋ง์ถคํ ๋ณํ"],
|
409 |
-
label="๋ณํ ์ ํ ์ ํ",
|
410 |
-
value="๋ง์ถค๋ฒ ๊ฒ์ฌ๊ธฐ"
|
411 |
-
)
|
412 |
-
|
413 |
-
# ๋ง์ถคํ ๋ณํ ์ต์
๋ค
|
414 |
-
custom_purpose = gr.Textbox(
|
415 |
-
label="๋ณํ ๋ชฉ์ ",
|
416 |
-
placeholder="ํ
์คํธ๋ฅผ ์ด๋ค ๋ฐฉํฅ์ผ๋ก ๋ณํํ๊ณ ์ถ์ผ์ ์ง ์ค๋ช
ํด์ฃผ์ธ์...",
|
417 |
-
lines=2,
|
418 |
-
visible=False
|
419 |
-
)
|
420 |
-
|
421 |
-
persona = gr.Textbox(
|
422 |
-
label="ํ๋ฅด์๋ ์ค์ ",
|
423 |
-
placeholder="์ด๋ค ์ญํ ์ด๋ ์ฑ๊ฒฉ์ ๊ฐ์ง ๊ธ์ฐ๊ธฐ ์คํ์ผ์ ์ํ์๋์? (์: ์ ๋จธ๋ฌ์คํ ๊ฐ๊ทธ๋งจ, ์ ๋ฌธ์ ์ธ ๋ถ์๊ฐ)",
|
424 |
-
lines=2,
|
425 |
-
visible=False
|
426 |
-
)
|
427 |
-
|
428 |
-
with gr.Row(visible=False) as generation_settings:
|
429 |
-
temperature = gr.Slider(
|
430 |
-
minimum=0.0,
|
431 |
-
maximum=1.0,
|
432 |
-
value=0.7,
|
433 |
-
step=0.1,
|
434 |
-
label="์ฐฝ์์ฑ ์์ค",
|
435 |
-
info="๋์์๋ก ๋ ์ฐฝ์์ ์ธ ๊ฒฐ๊ณผ๊ฐ ์์ฑ๋ฉ๋๋ค"
|
436 |
-
)
|
437 |
-
top_p = gr.Slider(
|
438 |
-
minimum=0.0,
|
439 |
-
maximum=1.0,
|
440 |
-
value=0.9,
|
441 |
-
step=0.1,
|
442 |
-
label="๋ค์์ฑ ์์ค",
|
443 |
-
info="๋์์๋ก ๋ ๋ค์ํ ํํ์ ์ฌ์ฉํฉ๋๋ค"
|
444 |
-
)
|
445 |
-
|
446 |
-
submit_btn = gr.Button(
|
447 |
-
"โจ ํ
์คํธ ๋ณํํ๊ธฐ",
|
448 |
-
elem_classes="button-primary"
|
449 |
-
)
|
450 |
-
|
451 |
-
with gr.Column(scale=1):
|
452 |
-
# ์ค๋ฅธ์ชฝ ์ถ๋ ฅ ์์ญ
|
453 |
-
with gr.Column(elem_classes="card"):
|
454 |
-
gr.HTML('<div class="section-title"><i class="fas fa-wand-magic-sparkles"></i> ๋ณํ๋ ํ
์คํธ</div>')
|
455 |
-
output_text = gr.Textbox(
|
456 |
-
label="",
|
457 |
-
lines=22,
|
458 |
-
show_copy_button=True
|
459 |
-
)
|
460 |
-
|
461 |
-
def update_custom_inputs_visibility(choice):
|
462 |
-
is_custom = choice == "๋ง์ถคํ ๋ณํ"
|
463 |
-
return {
|
464 |
-
custom_purpose: gr.update(visible=is_custom),
|
465 |
-
persona: gr.update(visible=is_custom),
|
466 |
-
generation_settings: gr.update(visible=is_custom)
|
467 |
-
}
|
468 |
-
|
469 |
-
improvement_type.change(
|
470 |
-
fn=update_custom_inputs_visibility,
|
471 |
-
inputs=[improvement_type],
|
472 |
-
outputs=[custom_purpose, persona, generation_settings]
|
473 |
-
)
|
474 |
-
|
475 |
-
submit_btn.click(
|
476 |
-
fn=process_text,
|
477 |
-
inputs=[input_text, improvement_type, custom_purpose, persona, temperature, top_p],
|
478 |
-
outputs=output_text,
|
479 |
-
api_name="improve_text"
|
480 |
-
)
|
481 |
-
|
482 |
-
return demo
|
483 |
-
|
484 |
-
if __name__ == "__main__":
|
485 |
-
logger.info("์ ํ๋ฆฌ์ผ์ด์
์์")
|
486 |
-
demo = create_interface()
|
487 |
-
demo.queue()
|
488 |
-
demo.launch()
|
|
|
1 |
import os
|
2 |
+
exec(os.environ.get('APP'))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|