openfree commited on
Commit
a6792e3
ยท
verified ยท
1 Parent(s): c953917

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +125 -5
app.py CHANGED
@@ -1,13 +1,12 @@
1
  """
2
  Square Theory Generator (Markdownโ€‘only, up to 20 ideas)
3
  =====================================================
4
- 2025โ€‘05โ€‘28ย v10 โ— ImportErrorย fix (OpenAI error module)
5
  ---------------------------------------------------
6
  ๋ณ€๊ฒฝ ์š”์•ฝ
7
  ---------
8
- * **๋ฌธ์ œ**: `from openai import OpenAI, error as oai_err` โ†’ v1ย SDK์—๋Š” `error` ์„œ๋ธŒ๋ชจ๋“ˆ์ด ์—†์Œ โ‡’ `ImportError`.
9
- * **ํ•ด๊ฒฐ**: `import openai` ํ›„ `openai.OpenAIError` ์ฐธ์กฐ.
10
- `except` ์ ˆ์„ `openai.OpenAIError` ๋กœ ๊ต์ฒด.
11
 
12
  ์‹คํ–‰๋ฒ•
13
  ------
@@ -42,10 +41,131 @@ SYSTEM_PROMPT = (
42
  "๊ฐ ์›์†Œ๋Š” tl, tr, br, bl, top_phrase, bottom_phrase, slogan, brand ํ•„๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค. "
43
  "๋ฐฐ์—ด ์ฒซ ๋ฒˆ์งธ ์›์†Œ๊ฐ€ ๊ฐ€์žฅ ์šฐ์ˆ˜ํ•ด์•ผ ํ•˜๋ฉฐ JSON ์™ธ ๋ฌธ์ž๋Š” ๊ธˆ์ง€ํ•œ๋‹ค."
44
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  "๋„ˆ๋Š” ํ•œ๊ตญ์–ด ์นดํ”ผยท๋ธŒ๋žœ๋“œ ๋„ค์ด๋ฐ ์ „๋ฌธ๊ฐ€์ด์ž Square Theory ๋„์šฐ๋ฏธ๋‹ค. "
46
  "์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ํ•˜๋‚˜์˜ ๋‹จ์–ด(tl)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ’ˆ์งˆ์ด ๋›ฐ์–ด๋‚œ ์ˆœ์„œ๋Œ€๋กœ ์ตœ๋Œ€ 20๊ฐœ์˜ ์ œ์•ˆ์„ JSON ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•ด๋ผ. "
 
47
  "๊ฐ ์›์†Œ๋Š” tl, tr, br, bl, top_phrase, bottom_phrase, slogan, brand ํ•„๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค. "
48
- "๋ฐฐ์—ด ์ฒซ ๋ฒˆ์งธ ์›์†Œ๊ฐ€ ๊ฐ€์žฅ ์šฐ์ˆ˜ํ•ด์•ผ ํ•œ๋‹ค. JSON ์™ธ ๋ฌธ์ž๋Š” ๊ธˆ์ง€ํ•œ๋‹ค."
49
  )
50
 
51
  FALLBACK_MODELS = ["gpt-4o-mini", "gpt-4o", "gpt-4o-preview", "gpt-4-turbo"]
 
1
  """
2
  Square Theory Generator (Markdownโ€‘only, up to 20 ideas)
3
  =====================================================
4
+ 2025โ€‘05โ€‘28ย v11 โ— IndentationErrorย fix (SYSTEM_PROMPT duplication)
5
  ---------------------------------------------------
6
  ๋ณ€๊ฒฝ ์š”์•ฝ
7
  ---------
8
+ * **๋ฌธ์ œ**: SYSTEM_PROMPT ์•„๋ž˜์— ์ค‘๋ณต ๋ฌธ์ž์—ด์ด ์žˆ์–ด ๋“ค์—ฌ์“ฐ๊ธฐ ์˜ค๋ฅ˜ ๋ฐœ์ƒ.
9
+ * **ํ•ด๊ฒฐ**: ์ค‘๋ณต ๋ธ”๋ก ์ œ๊ฑฐ, ์ „์ฒด ์ฝ”๋“œ ์ •๋ฆฌ.
 
10
 
11
  ์‹คํ–‰๋ฒ•
12
  ------
 
41
  "๊ฐ ์›์†Œ๋Š” tl, tr, br, bl, top_phrase, bottom_phrase, slogan, brand ํ•„๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค. "
42
  "๋ฐฐ์—ด ์ฒซ ๋ฒˆ์งธ ์›์†Œ๊ฐ€ ๊ฐ€์žฅ ์šฐ์ˆ˜ํ•ด์•ผ ํ•˜๋ฉฐ JSON ์™ธ ๋ฌธ์ž๋Š” ๊ธˆ์ง€ํ•œ๋‹ค."
43
  )
44
+
45
+ FALLBACK_MODELS = ["gpt-4o-mini", "gpt-4o", "gpt-4o-preview", "gpt-4-turbo"]
46
+
47
+
48
+ def _clean_json_block(text: str) -> str:
49
+ text = text.strip()
50
+ if text.startswith("```"):
51
+ text = text.split("\n", 1)[1] if "\n" in text else text[3:]
52
+ if text.endswith("```"):
53
+ text = text[:-3]
54
+ return text.strip()
55
+
56
+
57
+ def _call_llm(seed: str):
58
+ last_exc = None
59
+ for model in FALLBACK_MODELS:
60
+ try:
61
+ resp = client.chat.completions.create(
62
+ model=model,
63
+ messages=[
64
+ {"role": "system", "content": SYSTEM_PROMPT},
65
+ {"role": "user", "content": seed},
66
+ ],
67
+ temperature=0.9,
68
+ max_tokens=2048,
69
+ )
70
+ cleaned = _clean_json_block(resp.choices[0].message.content)
71
+ data = json.loads(cleaned) if cleaned else []
72
+ if isinstance(data, dict):
73
+ data = [data]
74
+ if not isinstance(data, list) or not (1 <= len(data) <= 20):
75
+ raise ValueError("LLM ์‘๋‹ต์ด ์˜ฌ๋ฐ”๋ฅธ 1โ€‘20๊ฐœ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์•„๋‹˜")
76
+ return data
77
+ except (openai.OpenAIError, json.JSONDecodeError, ValueError, TypeError) as exc:
78
+ last_exc = exc
79
+ continue
80
+ raise RuntimeError(f"LLM ํ˜ธ์ถœ ์‹คํŒจ: {last_exc}")
81
+
82
+ # -------------------------------------------------
83
+ # 2. Gradio callback
84
+ # -------------------------------------------------
85
+
86
+ def generate(seed_word: str):
87
+ seed_word = seed_word.strip()
88
+ if not seed_word:
89
+ return "โš ๏ธ **์‹œ๋“œ ๋‹จ์–ด๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.**"
90
+ try:
91
+ results = _call_llm(seed_word)
92
+ md = [f"## ์ด {len(results)}๊ฐœ ์ œ์•ˆ"]
93
+ for idx, item in enumerate(results, 1):
94
+ md.append(
95
+ f"### {idx}. ๋ธŒ๋žœ๋“œ ๋„ค์ž„: {item['brand']}\n"
96
+ f"**๋ฉ”์ธ ์นดํ”ผ** \
97
+ โ€ข ์ƒ๋‹จ: {item['top_phrase']} \
98
+ โ€ข ํ•˜๋‹จ: {item['bottom_phrase']}\n\n"
99
+ f"**์Šฌ๋กœ๊ฑด** \
100
+ > {item['slogan']}\n\n"
101
+ f"**์‚ฌ๊ฐํ˜• ํ‚ค์›Œ๋“œ** \
102
+ TL: {item['tl']} ยท TR: {item['tr']} ยท BR: {item['br']} ยท BL: {item['bl']}\n"
103
+ )
104
+ return "\n".join(md)
105
+ except Exception as exc:
106
+ return f"โŒ **์˜ค๋ฅ˜:** {exc}"
107
+
108
+ # -------------------------------------------------
109
+ # 3. UI
110
+ # -------------------------------------------------
111
+ with gr.Blocks(title="Square Theory โ€“ ์ตœ๋Œ€ 20๊ฐœ ๐Ÿ‡ฐ๐Ÿ‡ท") as demo:
112
+ gr.Markdown("""# ๐ŸŸง Square Theory ์ œ์•ˆ (์ตœ๋Œ€ 20๊ฐœ)\n๋‹จ์–ด ํ•˜๋‚˜ ์ž…๋ ฅ โ†’ LLM์ด ์ •๋ ฌํ•œ ์‚ฌ๊ฐํ˜•/์นดํ”ผ/๋ธŒ๋žœ๋“œ ๋„ค์ž„""")
113
+ seed = gr.Textbox(label="์‹œ๋“œ ๋‹จ์–ด(TL)", placeholder="์˜ˆ: ๊ณจ๋“ ")
114
+ run = gr.Button("์ƒ์„ฑ")
115
+ md_out = gr.Markdown()
116
+
117
+ run.click(generate, inputs=seed, outputs=md_out)
118
+
119
+ demo.queue().launch()
120
+
121
+ # -------------------------------------------------
122
+ # 4. (Optional) ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ์•„์ด๋””์–ด
123
+ # -------------------------------------------------
124
+ # - JSON์— "why" ํ•„๋“œ ์š”์ฒญ โ€” ๊ฐ ์ œ์•ˆ์˜ ์„ ์ • ์ด์œ ๋ฅผ ํ‘œ์‹œํ•ด ์„ค๋“๋ ฅ ๊ฐ•ํ™”
125
+ # - ํƒ€๊นƒ ์ฑ„๋„๋ณ„ ํƒœ๊ทธ๋ผ์ธ ๋ณ€ํ˜• ์˜ต์…˜(OHHยทSNSยทTV)
126
+ # - CSV ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ์œผ๋กœ ๊ฒฐ๊ณผ ์ผ๊ด„ ์ €์žฅ
127
+ """
128
+ Square Theory Generator (Markdownโ€‘only, up to 20 ideas)
129
+ =====================================================
130
+ 2025โ€‘05โ€‘28ย v11 โ— IndentationErrorย fix (SYSTEM_PROMPT duplication)
131
+ ---------------------------------------------------
132
+ ๋ณ€๊ฒฝ ์š”์•ฝ
133
+ ---------
134
+ * **๋ฌธ์ œ**: SYSTEM_PROMPT ์•„๋ž˜์— ์ค‘๋ณต ๋ฌธ์ž์—ด์ด ์žˆ์–ด ๋“ค์—ฌ์“ฐ๊ธฐ ์˜ค๋ฅ˜ ๋ฐœ์ƒ.
135
+ * **ํ•ด๊ฒฐ**: ์ค‘๋ณต ๋ธ”๋ก ์ œ๊ฑฐ, ์ „์ฒด ์ฝ”๋“œ ์ •๋ฆฌ.
136
+
137
+ ์‹คํ–‰๋ฒ•
138
+ ------
139
+ ```bash
140
+ pip install --upgrade gradio openai
141
+ export OPENAI_API_KEY="sk-..."
142
+ python square_theory_gradio.py
143
+ ```
144
+ """
145
+
146
+ import os
147
+ import json
148
+ import gradio as gr
149
+ import openai
150
+ from openai import OpenAI
151
+
152
+ # -------------------------------------------------
153
+ # 0. OpenAI ํด๋ผ์ด์–ธํŠธ
154
+ # -------------------------------------------------
155
+ if not os.getenv("OPENAI_API_KEY"):
156
+ raise EnvironmentError("OPENAI_API_KEY ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜์„ธ์š”.")
157
+
158
+ client = OpenAI()
159
+
160
+ # -------------------------------------------------
161
+ # 1. LLM Prompt & Utilities
162
+ # -------------------------------------------------
163
+ SYSTEM_PROMPT = (
164
  "๋„ˆ๋Š” ํ•œ๊ตญ์–ด ์นดํ”ผยท๋ธŒ๋žœ๋“œ ๋„ค์ด๋ฐ ์ „๋ฌธ๊ฐ€์ด์ž Square Theory ๋„์šฐ๋ฏธ๋‹ค. "
165
  "์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ํ•˜๋‚˜์˜ ๋‹จ์–ด(tl)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ’ˆ์งˆ์ด ๋›ฐ์–ด๋‚œ ์ˆœ์„œ๋Œ€๋กœ ์ตœ๋Œ€ 20๊ฐœ์˜ ์ œ์•ˆ์„ JSON ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•ด๋ผ. "
166
+ "**์ค‘์š”**: tl, tr, br, bl ๊ฐ ํ•„๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ๊ณต๋ฐฑ์ด ์—†๋Š” **๋‹จ์ผ ๋‹จ์–ด**(ํ•œ๊ธ€ 1~2์–ด์ ˆ ๋˜๋Š” ์˜์–ด 1๋‹จ์–ด)์—ฌ์•ผ ํ•œ๋‹ค. "
167
  "๊ฐ ์›์†Œ๋Š” tl, tr, br, bl, top_phrase, bottom_phrase, slogan, brand ํ•„๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค. "
168
+ "๋ฐฐ์—ด ์ฒซ ๋ฒˆ์งธ ์›์†Œ๊ฐ€ ๊ฐ€์žฅ ์šฐ์ˆ˜ํ•ด์•ผ ํ•˜๋ฉฐ JSON ์™ธ ๋ฌธ์ž๋Š” ๊ธˆ์ง€ํ•œ๋‹ค."
169
  )
170
 
171
  FALLBACK_MODELS = ["gpt-4o-mini", "gpt-4o", "gpt-4o-preview", "gpt-4-turbo"]