openfree commited on
Commit
dd53e8d
ยท
verified ยท
1 Parent(s): 673fa0a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +25 -23
app.py CHANGED
@@ -1,13 +1,15 @@
1
  """
2
- Square Theory Generator (10 best variations)
3
- ===========================================
4
- 2025โ€‘05โ€‘28ย v5 โ— ์ฝ”๋“œ๋ธ”๋ก JSON ํŒŒ์‹ฑ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ + ํ•œ๊ธ€ ํฐํŠธย OK
5
- -------------------------------------------------
6
  ๋ณ€๊ฒฝ ์š”์•ฝ
7
  ---------
8
- * **๋ฌธ์ œ**: ์ผ๋ถ€ LLM ์‘๋‹ต์ด ```json โ€ฆ ``` ์ฝ”๋“œํŽœ์Šค๋กœ ๊ฐ์‹ธ์ ธ `json.loads()` ์‹คํŒจ โ†’ ์˜ˆ์™ธ.
9
- * **ํ•ด๊ฒฐ**: ์ฝ”๋“œํŽœ์Šค ์ œ๊ฑฐ `clean_json_block()` ํ•จ์ˆ˜ ์ถ”๊ฐ€.
10
- * ๊ธฐํƒ€: ํฐํŠธ ๋กœ์ง ๊ทธ๋Œ€๋กœ ์œ ์ง€.
 
 
11
 
12
  ์‹คํ–‰๋ฒ•
13
  ------
@@ -30,7 +32,6 @@ from openai import OpenAI
30
  # -------------------------------------------------
31
  # 0. ํ•œ๊ธ€ ํฐํŠธ ์„ค์ • (๋‹ค์šด๋กœ๋“œ fallback ํฌํ•จ)
32
  # -------------------------------------------------
33
-
34
  PREFERRED_FONTS = ["Malgun Gothic", "NanumGothic", "AppleGothic", "DejaVu Sans"]
35
  NANUM_URL = (
36
  "https://github.com/google/fonts/raw/main/ofl/nanumgothic/"
@@ -88,21 +89,17 @@ def draw_square(words):
88
  # -------------------------------------------------
89
  SYSTEM_PROMPT = (
90
  "๋„ˆ๋Š” ํ•œ๊ตญ์–ด ์นดํ”ผยท๋ธŒ๋žœ๋“œ ๋„ค์ด๋ฐ ์ „๋ฌธ๊ฐ€์ด์ž Square Theory ๋„์šฐ๋ฏธ๋‹ค. "
91
- "์‚ฌ์šฉ์ž๊ฐ€ ์ค€ ํ•˜๋‚˜์˜ ๋‹จ์–ด(tl)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ’ˆ์งˆ์ด ๊ฐ€์žฅ ๋›ฐ์–ด๋‚œ ๊ฒƒ๋ถ€ํ„ฐ 10๊ฐœ์˜ ์ œ์•ˆ์„ JSON ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•ด๋ผ. "
92
- "๊ฐ ๋ฐฐ์—ด ์›์†Œ๋Š” tl, tr, br, bl, top_phrase, bottom_phrase, slogan, brand ํ•„๋“œ๋ฅผ ๊ฐ€์ง€๋ฉฐ, "
93
- "์‚ฌ๊ฐํ˜• ๋„ค ๊ผญ์ง“์ (tl>tr>br>bl)๊ณผ ๋‘ ํ‘œํ˜„ยท์Šฌ๋กœ๊ฑดยท๋ธŒ๋žœ๋“œ ๋„ค์ž„์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐ๋ผ์•ผ ํ•œ๋‹ค. "
94
- "๋ฐฐ์—ด์€ ์ตœ๊ณ ์˜ ์ œ์•ˆ์ด index 0, ๊ทธ๋‹ค์Œ์ด index 1 โ€ฆ 9 ์ˆœ์„œ์—ฌ์•ผ ํ•œ๋‹ค. "
95
- "๊ฒฐ๊ณผ๋Š” JSON ์™ธ ๋‹ค๋ฅธ ํ…์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜๋ฉด ์•ˆ ๋œ๋‹ค."
96
  )
97
 
98
 
99
  def clean_json_block(text: str) -> str:
100
- """Remove ```json ... ``` or ``` ... ``` fences."""
101
  text = text.strip()
102
  if text.startswith("```"):
103
- # remove first ``` line
104
  text = text.split("\n", 1)[1] if "\n" in text else text[3:]
105
- # strip trailing fence
106
  if text.endswith("```"):
107
  text = text[:-3]
108
  return text.strip()
@@ -122,10 +119,15 @@ def call_llm(seed: str):
122
  cleaned = clean_json_block(raw)
123
  try:
124
  data = json.loads(cleaned)
125
- if not isinstance(data, list) or len(data) != 10:
126
- raise ValueError("JSON ๋ฐฐ์—ด ๊ธธ์ด๊ฐ€ 10์ด ์•„๋‹˜")
 
 
 
 
 
127
  except Exception as exc:
128
- raise ValueError(f"LLM JSON ํŒŒ์‹ฑ ์‹คํŒจ: {exc}\n์›๋ฌธ: {cleaned[:300]} โ€ฆ")
129
  return data
130
 
131
  # -------------------------------------------------
@@ -135,7 +137,7 @@ def call_llm(seed: str):
135
  def generate(seed_word: str):
136
  results = call_llm(seed_word)
137
  fig = draw_square({k: results[0][k] for k in ("tl", "tr", "br", "bl")})
138
- md_lines = []
139
  for idx, item in enumerate(results, 1):
140
  md_lines.append(
141
  f"### {idx}. {item['top_phrase']} / {item['bottom_phrase']}\n"
@@ -148,12 +150,12 @@ def generate(seed_word: str):
148
  # -------------------------------------------------
149
  # 5. UI
150
  # -------------------------------------------------
151
- with gr.Blocks(title="Square Theory โ€“ Topย 10 ๐Ÿ‡ฐ๐Ÿ‡ท") as demo:
152
- gr.Markdown("""# ๐Ÿ”Ÿ Square Theory ์ œ์•ˆ Topย 10\n๋‹จ์–ด 1๊ฐœ โ†’ LLM์ด ํ‰๊ฐ€ยท์ •๋ ฌํ•œ 10๊ฐœ ์‚ฌ๊ฐํ˜•/์นดํ”ผ/๋ธŒ๋žœ๋“œ ๋„ค์ž„""")
153
  seed = gr.Textbox(label="์‹œ๋“œ ๋‹จ์–ด(TL)", placeholder="์˜ˆ: ๊ณจ๋“ ")
154
  run = gr.Button("์ƒ์„ฑ")
155
  fig_out = gr.Plot(label="1์œ„ ์‚ฌ๊ฐํ˜•")
156
- md_out = gr.Markdown(label="Topย 10 ์ œ์•ˆ")
157
 
158
  run.click(generate, inputs=seed, outputs=[fig_out, md_out])
159
 
 
1
  """
2
+ Square Theory Generator (len-flexible)
3
+ =====================================
4
+ 2025โ€‘05โ€‘28 v6 โ— LLM ๊ฒฐ๊ณผ๊ฐ€ 10๊ฐœ ๋ฏธ๋งŒ์ผ ๋•Œ ์œ ์—ฐ ์ฒ˜๋ฆฌ
5
+ ---------------------------------------------------
6
  ๋ณ€๊ฒฝ ์š”์•ฝ
7
  ---------
8
+ * **๋ฌธ์ œ**: LLM์ด 10๊ฐœ ๋ฏธ๋งŒ์˜ ์ œ์•ˆ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๊ธธ์ด ๊ฒ€์ฆ ์˜ˆ์™ธ ๋ฐœ์ƒ.
9
+ * **ํ•ด๊ฒฐ**:
10
+ 1. `call_llm()`์—์„œ JSON์ด dict ๋‹จ์ผ ๊ฐ์ฒด or 1~9๊ฐœ ๋ฆฌ์ŠคํŠธ์—ฌ๋„ ํ—ˆ์šฉ.
11
+ 2. ๋ฆฌ์ŠคํŠธ๊ฐ€ 1๊ฐœ ๋ฏธ๋งŒ์ด๋ฉด ์˜ค๋ฅ˜, 2~9๊ฐœ๋Š” ๊ฒฝ๊ณ ๋งŒ ํ‘œ๊ธฐ.
12
+ 3. Markdown์— ์‹ค์ œ ๊ฐœ์ˆ˜๋กœ ํ—ค๋” ์ถœ๋ ฅ.
13
 
14
  ์‹คํ–‰๋ฒ•
15
  ------
 
32
  # -------------------------------------------------
33
  # 0. ํ•œ๊ธ€ ํฐํŠธ ์„ค์ • (๋‹ค์šด๋กœ๋“œ fallback ํฌํ•จ)
34
  # -------------------------------------------------
 
35
  PREFERRED_FONTS = ["Malgun Gothic", "NanumGothic", "AppleGothic", "DejaVu Sans"]
36
  NANUM_URL = (
37
  "https://github.com/google/fonts/raw/main/ofl/nanumgothic/"
 
89
  # -------------------------------------------------
90
  SYSTEM_PROMPT = (
91
  "๋„ˆ๋Š” ํ•œ๊ตญ์–ด ์นดํ”ผยท๋ธŒ๋žœ๋“œ ๋„ค์ด๋ฐ ์ „๋ฌธ๊ฐ€์ด์ž Square Theory ๋„์šฐ๋ฏธ๋‹ค. "
92
+ "์‚ฌ์šฉ์ž๊ฐ€ ์ค€ ํ•˜๋‚˜์˜ ๋‹จ์–ด(tl)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ’ˆ์งˆ์ด ๋›ฐ์–ด๋‚œ ์ˆœ์„œ๋Œ€๋กœ ์ตœ๋Œ€ 10๊ฐœ์˜ ์ œ์•ˆ์„ JSON ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•ด๋ผ. "
93
+ "๊ฐ ๋ฐฐ์—ด ์›์†Œ๋Š” tl, tr, br, bl, top_phrase, bottom_phrase, slogan, brand ํ•„๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค. "
94
+ "์‚ฌ๊ฐํ˜• ๋„ค ๊ผญ์ง“์ (tlโ†’trโ†’brโ†’bl)์ด ์ž์—ฐ์Šค๋ ˆ ์—ฐ๊ฒฐ๋ผ์•ผ ํ•˜๊ณ , ๋ฐฐ์—ด ์ฒซ ์›์†Œ๊ฐ€ ์ตœ์šฐ์ˆ˜ ์ œ์•ˆ์ด๋‹ค. "
95
+ "๊ฒฐ๊ณผ๋Š” JSON ์™ธ ํ…์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค."
 
96
  )
97
 
98
 
99
  def clean_json_block(text: str) -> str:
 
100
  text = text.strip()
101
  if text.startswith("```"):
 
102
  text = text.split("\n", 1)[1] if "\n" in text else text[3:]
 
103
  if text.endswith("```"):
104
  text = text[:-3]
105
  return text.strip()
 
119
  cleaned = clean_json_block(raw)
120
  try:
121
  data = json.loads(cleaned)
122
+ # ๋‹จ์ผ ๊ฐ์ฒด๋ฉด ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜
123
+ if isinstance(data, dict):
124
+ data = [data]
125
+ if not isinstance(data, list):
126
+ raise TypeError("LLM ์‘๋‹ต์ด ๋ฆฌ์ŠคํŠธ๊ฐ€ ์•„๋‹˜")
127
+ if len(data) == 0:
128
+ raise ValueError("LLM์ด ๋นˆ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜")
129
  except Exception as exc:
130
+ raise ValueError(f"LLM JSON ํŒŒ์‹ฑ ์‹คํŒจ: {exc}\n์›๋ฌธ ์ผ๋ถ€: {cleaned[:300]} โ€ฆ")
131
  return data
132
 
133
  # -------------------------------------------------
 
137
  def generate(seed_word: str):
138
  results = call_llm(seed_word)
139
  fig = draw_square({k: results[0][k] for k in ("tl", "tr", "br", "bl")})
140
+ md_lines = [f"## ์ด {len(results)}๊ฐœ ์ œ์•ˆ\n"]
141
  for idx, item in enumerate(results, 1):
142
  md_lines.append(
143
  f"### {idx}. {item['top_phrase']} / {item['bottom_phrase']}\n"
 
150
  # -------------------------------------------------
151
  # 5. UI
152
  # -------------------------------------------------
153
+ with gr.Blocks(title="Square Theory โ€“ ์ตœ๊ณ  ์ œ์•ˆ ๐Ÿ‡ฐ๐Ÿ‡ท") as demo:
154
+ gr.Markdown("""# ๐ŸŸง Square Theory ์ œ์•ˆ (์ตœ๋Œ€ 10๊ฐœ)\n๋‹จ์–ด 1๊ฐœ ์ž…๋ ฅ โ†’ LLM์ด ํ‰๊ฐ€ยท์ •๋ ฌํ•œ ์‚ฌ๊ฐํ˜•/์นดํ”ผ/๋ธŒ๋žœ๋“œ ๋„ค์ž„""")
155
  seed = gr.Textbox(label="์‹œ๋“œ ๋‹จ์–ด(TL)", placeholder="์˜ˆ: ๊ณจ๋“ ")
156
  run = gr.Button("์ƒ์„ฑ")
157
  fig_out = gr.Plot(label="1์œ„ ์‚ฌ๊ฐํ˜•")
158
+ md_out = gr.Markdown(label="์ œ๏ฟฝ๏ฟฝ๏ฟฝ ๋ชฉ๋ก")
159
 
160
  run.click(generate, inputs=seed, outputs=[fig_out, md_out])
161