Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -316,17 +316,19 @@ def ginigen_app():
|
|
| 316 |
|
| 317 |
# μμ μ£Όμ μ ν
|
| 318 |
sb.subheader("μμ μ£Όμ ")
|
| 319 |
-
|
| 320 |
-
|
| 321 |
-
|
| 322 |
-
|
| 323 |
-
if
|
| 324 |
-
|
| 325 |
-
|
| 326 |
-
|
| 327 |
-
if
|
| 328 |
-
|
| 329 |
-
|
|
|
|
|
|
|
| 330 |
|
| 331 |
sb.subheader("κΈ°ν μ€μ ")
|
| 332 |
sb.toggle("μλ μ μ₯", key="auto_save")
|
|
@@ -375,79 +377,83 @@ def ginigen_app():
|
|
| 375 |
if "image" in m:
|
| 376 |
st.image(m["image"], caption=m.get("image_caption", ""))
|
| 377 |
|
| 378 |
-
# ββ μ¬μ©μ μ
λ ₯
|
| 379 |
prompt = st.chat_input("무μμ λμλ릴κΉμ?")
|
| 380 |
|
| 381 |
-
# μμ μ£Όμ κ° μ νλμμΌλ©΄ μ²λ¦¬
|
| 382 |
-
if hasattr(st.session_state, 'example_topic') and st.session_state.example_topic:
|
| 383 |
-
prompt = st.session_state.example_topic
|
| 384 |
-
# μ²λ¦¬ ν μμ μ£Όμ μ΄κΈ°ν
|
| 385 |
-
del st.session_state.example_topic
|
| 386 |
-
|
| 387 |
if prompt:
|
| 388 |
-
|
| 389 |
-
with st.chat_message("user"): st.markdown(prompt)
|
| 390 |
|
| 391 |
-
|
| 392 |
-
|
| 393 |
-
|
| 394 |
-
|
| 395 |
-
|
| 396 |
-
|
| 397 |
-
|
| 398 |
-
|
| 399 |
-
|
| 400 |
-
|
| 401 |
-
|
| 402 |
-
|
| 403 |
-
|
| 404 |
-
|
| 405 |
-
|
| 406 |
-
|
| 407 |
-
|
| 408 |
-
|
| 409 |
-
|
| 410 |
-
|
| 411 |
-
|
| 412 |
-
|
| 413 |
-
|
| 414 |
-
|
| 415 |
-
|
| 416 |
-
|
| 417 |
-
|
| 418 |
-
|
| 419 |
-
|
| 420 |
-
|
| 421 |
-
|
| 422 |
-
|
| 423 |
-
|
| 424 |
-
|
| 425 |
-
|
| 426 |
-
|
| 427 |
-
|
| 428 |
-
|
| 429 |
-
|
| 430 |
-
|
| 431 |
-
|
| 432 |
-
|
| 433 |
-
|
| 434 |
-
|
| 435 |
-
|
| 436 |
-
|
| 437 |
-
|
| 438 |
-
|
| 439 |
-
|
| 440 |
-
|
| 441 |
-
|
| 442 |
-
|
| 443 |
-
|
| 444 |
-
|
| 445 |
-
|
| 446 |
-
|
| 447 |
-
|
| 448 |
-
|
| 449 |
-
|
| 450 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 451 |
|
| 452 |
# ββββββββββββββββββββββββββββββββ main / requirements ββββββββββββββββββββββ
|
| 453 |
def main(): ginigen_app()
|
|
|
|
| 316 |
|
| 317 |
# μμ μ£Όμ μ ν
|
| 318 |
sb.subheader("μμ μ£Όμ ")
|
| 319 |
+
|
| 320 |
+
col1, col2, col3 = sb.columns(3)
|
| 321 |
+
|
| 322 |
+
# μμ : μμ μ ν μ μ§μ μ²λ¦¬νλλ‘ λ³κ²½
|
| 323 |
+
if col1.button("λΆλμ° μΈκΈ", key="ex1"):
|
| 324 |
+
# μμ μ£Όμ λ₯Ό μ
λ ₯μΌλ‘ μ¦μ μ²λ¦¬ (rerun μμ΄)
|
| 325 |
+
process_example(EXAMPLE_TOPICS["example1"])
|
| 326 |
+
|
| 327 |
+
if col2.button("μ¬λ¦ μΆμ ", key="ex2"):
|
| 328 |
+
process_example(EXAMPLE_TOPICS["example2"])
|
| 329 |
+
|
| 330 |
+
if col3.button("ν¬μ κ°μ΄λ", key="ex3"):
|
| 331 |
+
process_example(EXAMPLE_TOPICS["example3"])
|
| 332 |
|
| 333 |
sb.subheader("κΈ°ν μ€μ ")
|
| 334 |
sb.toggle("μλ μ μ₯", key="auto_save")
|
|
|
|
| 377 |
if "image" in m:
|
| 378 |
st.image(m["image"], caption=m.get("image_caption", ""))
|
| 379 |
|
| 380 |
+
# ββ μ¬μ©μ μ
λ ₯ μ²λ¦¬
|
| 381 |
prompt = st.chat_input("무μμ λμλ릴κΉμ?")
|
| 382 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 383 |
if prompt:
|
| 384 |
+
process_input(prompt)
|
|
|
|
| 385 |
|
| 386 |
+
|
| 387 |
+
def process_example(topic):
|
| 388 |
+
"""μμ μ£Όμ λ₯Ό μ§μ μ²λ¦¬νλ ν¨μ (rerun μμ΄)"""
|
| 389 |
+
process_input(topic)
|
| 390 |
+
|
| 391 |
+
|
| 392 |
+
def process_input(prompt):
|
| 393 |
+
"""μ¬μ©μ μ
λ ₯ μ²λ¦¬ ν¨μ (μΌλ° μ
λ ₯κ³Ό μμ μ
λ ₯ λͺ¨λ μ²λ¦¬)"""
|
| 394 |
+
st.session_state.messages.append({"role": "user", "content": prompt})
|
| 395 |
+
with st.chat_message("user"): st.markdown(prompt)
|
| 396 |
+
|
| 397 |
+
with st.chat_message("assistant"):
|
| 398 |
+
placeholder = st.empty(); answer = ""
|
| 399 |
+
|
| 400 |
+
# μ νλ ν
νλ¦Ώ, ν€, λ¨μ΄ μλ‘ μμ€ν
ν둬ννΈ μμ±
|
| 401 |
+
sys_prompt = get_system_prompt(
|
| 402 |
+
template=st.session_state.blog_template,
|
| 403 |
+
tone=st.session_state.blog_tone,
|
| 404 |
+
word_count=st.session_state.word_count
|
| 405 |
+
)
|
| 406 |
+
|
| 407 |
+
if st.session_state.use_web_search:
|
| 408 |
+
with st.spinner("μΉ κ²μ μ€β¦"):
|
| 409 |
+
search_md = do_web_search(keywords(prompt))
|
| 410 |
+
sys_prompt += f"\n\nκ²μ κ²°κ³Ό:\n{search_md}\n"
|
| 411 |
+
|
| 412 |
+
# Claude μ€νΈλ¦¬λ°
|
| 413 |
+
with client.messages.stream(
|
| 414 |
+
model=st.session_state.ai_model, max_tokens=MAX_TOKENS,
|
| 415 |
+
system=sys_prompt,
|
| 416 |
+
messages=[{"role": m["role"], "content": m["content"]}
|
| 417 |
+
for m in st.session_state.messages]
|
| 418 |
+
) as stream:
|
| 419 |
+
for t in stream.text_stream:
|
| 420 |
+
answer += t or ""
|
| 421 |
+
placeholder.markdown(answer + "β")
|
| 422 |
+
placeholder.markdown(answer)
|
| 423 |
+
|
| 424 |
+
# μ΄λ―Έμ§ μ΅μ
|
| 425 |
+
answer_entry_saved = False
|
| 426 |
+
if st.session_state.generate_image:
|
| 427 |
+
with st.spinner("μ΄λ―Έμ§ μμ± μ€β¦"):
|
| 428 |
+
ip = extract_image_prompt(answer, prompt)
|
| 429 |
+
img, cap = generate_image(ip)
|
| 430 |
+
if img:
|
| 431 |
+
st.image(img, caption=cap)
|
| 432 |
+
st.session_state.messages.append(
|
| 433 |
+
{"role": "assistant", "content": answer,
|
| 434 |
+
"image": img, "image_caption": cap})
|
| 435 |
+
answer_entry_saved = True
|
| 436 |
+
if not answer_entry_saved:
|
| 437 |
+
st.session_state.messages.append(
|
| 438 |
+
{"role": "assistant", "content": answer})
|
| 439 |
+
|
| 440 |
+
# λ³Έλ¬Έ λ€μ΄λ‘λ λ²νΌ (MD / HTML)
|
| 441 |
+
st.subheader("μ΄ λΈλ‘κ·Έ λ€μ΄λ‘λ")
|
| 442 |
+
b1, b2 = st.columns(2)
|
| 443 |
+
b1.download_button("λ§ν¬λ€μ΄", answer,
|
| 444 |
+
file_name=f"{prompt[:30]}.md", mime="text/markdown")
|
| 445 |
+
b2.download_button("HTML", md_to_html(answer, prompt[:30]),
|
| 446 |
+
file_name=f"{prompt[:30]}.html", mime="text/html")
|
| 447 |
+
|
| 448 |
+
# ββ μλ λ°±μ
μ μ₯
|
| 449 |
+
if st.session_state.auto_save and st.session_state.messages:
|
| 450 |
+
try:
|
| 451 |
+
fn = f"chat_history_auto_{datetime.now():%Y%m%d_%H%M%S}.json"
|
| 452 |
+
with open(fn, "w", encoding="utf-8") as fp:
|
| 453 |
+
json.dump(st.session_state.messages, fp,
|
| 454 |
+
ensure_ascii=False, indent=2)
|
| 455 |
+
except Exception as e:
|
| 456 |
+
logging.error(f"μλ μ μ₯ μ€ν¨: {e}")
|
| 457 |
|
| 458 |
# ββββββββββββββββββββββββββββββββ main / requirements ββββββββββββββββββββββ
|
| 459 |
def main(): ginigen_app()
|