Spaces:
Running
Running
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()
|