Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -19,7 +19,7 @@ BRAVE_ENDPOINT = "https://api.search.brave.com/res/v1/web/search"
|
|
19 |
IMAGE_API_URL = "http://211.233.58.201:7896" # μ΄λ―Έμ§ μμ±μ© API
|
20 |
MAX_TOKENS = 7999
|
21 |
|
22 |
-
# ββββββββββββββββββββββββββββββββ Physical Transformation Categories (KR & EN)
|
23 |
physical_transformation_categories = {
|
24 |
"μΌμ κΈ°λ₯": [
|
25 |
"μκ° μΌμ/κ°μ§", "μ²κ° μΌμ/κ°μ§", "μ΄κ° μΌμ/κ°μ§", "λ―Έκ° μΌμ/κ°μ§", "νκ° μΌμ/κ°μ§",
|
@@ -294,6 +294,7 @@ physical_transformation_categories_en = {
|
|
294 |
"Data-driven decision making / AI adoption",
|
295 |
"Convergence of new technologies / Innovative investments"
|
296 |
]
|
|
|
297 |
}
|
298 |
|
299 |
# ββββββββββββββββββββββββββββββββ Logging ββββββββββββββββββββββββββββββββ
|
@@ -301,6 +302,7 @@ logging.basicConfig(level=logging.INFO,
|
|
301 |
format="%(asctime)s - %(levelname)s - %(message)s")
|
302 |
|
303 |
# ββββββββββββββββββββββββββββββββ OpenAI Client ββββββββββββββββββββββββββ
|
|
|
304 |
@st.cache_resource
|
305 |
def get_openai_client():
|
306 |
"""Create an OpenAI client with timeout and retry settings."""
|
@@ -324,6 +326,8 @@ def get_idea_system_prompt(selected_category: str | None = None) -> str:
|
|
324 |
f'μ΄ μΉ΄ν
κ³ λ¦¬μ νλͺ©λ€μ 2λ¨κ³μ 3λ¨κ³ λͺ¨λμμ μ°μ μ μΌλ‘ κ³ λ €νμμμ€.\n'
|
325 |
) if selected_category else ""
|
326 |
|
|
|
|
|
327 |
prompt = f"""
|
328 |
λ°λμ νκΈ(νκ΅μ΄)λ‘ λ΅λ³νλΌ. λΉμ μ νμ 컨μ€ν΄νΈλ‘μ CCM(ν¬λ‘μ€ μΉ΄ν
κ³ λ¦¬ λ§€νΈλ¦μ€) λ°©λ²λ‘ μ νμ©νμ¬ μ°½μμ μμ΄λμ΄λ₯Ό λμΆν©λλ€.
|
329 |
|
@@ -635,13 +639,49 @@ def keywords(text: str, top=5):
|
|
635 |
cleaned = re.sub(r"[^κ°-ν£a-zA-Z0-9\s]", "", text)
|
636 |
return " ".join(cleaned.split()[:top])
|
637 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
638 |
# ββββββββββββββββββββββββββββββββ Streamlit UI ββββββββββββββββββββββββββββ
|
639 |
def idea_generator_app():
|
640 |
st.title("Creative Idea Generator")
|
641 |
|
642 |
# Set default session state
|
643 |
if "ai_model" not in st.session_state:
|
644 |
-
st.session_state.ai_model = "gpt-4.1-mini"
|
645 |
if "messages" not in st.session_state:
|
646 |
st.session_state.messages = []
|
647 |
if "auto_save" not in st.session_state:
|
@@ -664,7 +704,8 @@ def idea_generator_app():
|
|
664 |
if web_search_enabled:
|
665 |
sb.info("β
Web search results will be integrated.")
|
666 |
|
667 |
-
# μμ μ£Όμ λ€
|
|
|
668 |
example_topics = {
|
669 |
"example1": "λμ λ¬Ό λΆμ‘± λ¬Έμ ν΄κ²°μ μν νμ μ λ°©μ",
|
670 |
"example2": "λ
ΈμΈ λλ΄ μλΉμ€μ λμ§νΈ μ ν",
|
@@ -680,6 +721,7 @@ def idea_generator_app():
|
|
680 |
index=0 # κΈ°λ³Έκ° "(None)"
|
681 |
)
|
682 |
|
|
|
683 |
sb.subheader("Example Prompts")
|
684 |
c1, c2, c3 = sb.columns(3)
|
685 |
if c1.button("λμ λ¬Ό λΆμ‘± λ¬Έμ ", key="ex1"):
|
@@ -797,53 +839,19 @@ def idea_generator_app():
|
|
797 |
sb.markdown("---")
|
798 |
sb.markdown("Created by [Ginigen.com](https://ginigen.com) | [YouTube](https://www.youtube.com/@ginipickaistudio)")
|
799 |
|
|
|
800 |
def process_example(topic):
|
801 |
"""Handle example prompts."""
|
802 |
process_input(topic, [])
|
803 |
|
804 |
-
#
|
805 |
-
def write_output(md_text: str, prompt: str):
|
806 |
-
"""
|
807 |
-
β’ λν κΈ°λ‘μ λ§ν¬λ€μ΄ λ΅λ³ μ μ₯
|
808 |
-
β’ λ€μ΄λ‘λ λ²νΌ(λ§ν¬λ€μ΄Β·HTML) μ 곡
|
809 |
-
β’ μλ JSON λ°±μ
|
810 |
-
"""
|
811 |
-
# β μ±ν
κΈ°λ‘μ μΆκ°
|
812 |
-
st.session_state.messages.append({"role": "assistant", "content": md_text})
|
813 |
-
|
814 |
-
# β‘ λ€μ΄λ‘λ λ²νΌ
|
815 |
-
st.subheader("Download This Output")
|
816 |
-
col_md, col_html = st.columns(2)
|
817 |
-
col_md.download_button(
|
818 |
-
label="Markdown",
|
819 |
-
data=md_text,
|
820 |
-
file_name=f"{prompt[:30]}.md",
|
821 |
-
mime="text/markdown"
|
822 |
-
)
|
823 |
-
col_html.download_button(
|
824 |
-
label="HTML",
|
825 |
-
data=md_to_html(md_text, prompt[:30]),
|
826 |
-
file_name=f"{prompt[:30]}.html",
|
827 |
-
mime="text/html"
|
828 |
-
)
|
829 |
-
|
830 |
-
# β’ μλ JSON μ μ₯
|
831 |
-
if st.session_state.auto_save:
|
832 |
-
fn = f"chat_history_auto_{datetime.now():%Y%m%d_%H%M%S}.json"
|
833 |
-
try:
|
834 |
-
with open(fn, "w", encoding="utf-8") as fp:
|
835 |
-
json.dump(st.session_state.messages, fp, ensure_ascii=False, indent=2)
|
836 |
-
except Exception as e:
|
837 |
-
logging.error(f"Auto-save failed: {e}")
|
838 |
-
|
839 |
-
# ββββββββββββββββββββββββββββββββ process_input ββββββββββββββββββββββββββββ
|
840 |
def process_input(prompt: str, uploaded_files):
|
841 |
"""
|
842 |
1) μ¬μ©μ μ
λ ₯μ GPT-4λ‘ λ³΄λ΄ μ°½μμ μμ΄λμ΄ λ³΄κ³ μ μμ±
|
843 |
2) μ νμ μΌλ‘ μ΄λ―Έμ§ μμ±
|
844 |
-
3) κ²°κ³Όλ₯Ό ν λ²λ§
|
845 |
"""
|
846 |
-
# μ¬μ©μ λ©μμ§ κΈ°λ‘
|
847 |
if not any(m["role"] == "user" and m["content"] == prompt
|
848 |
for m in st.session_state.messages):
|
849 |
st.session_state.messages.append({"role": "user", "content": prompt})
|
@@ -851,47 +859,55 @@ def process_input(prompt: str, uploaded_files):
|
|
851 |
with st.chat_message("user"):
|
852 |
st.markdown(prompt)
|
853 |
|
854 |
-
#
|
855 |
-
use_web_search = st.session_state.web_search_enabled
|
856 |
-
has_uploaded = bool(uploaded_files)
|
857 |
-
full_response = ""
|
858 |
-
|
859 |
with st.chat_message("assistant"):
|
860 |
-
|
861 |
message_placeholder = st.empty()
|
|
|
|
|
|
|
|
|
862 |
|
863 |
try:
|
864 |
-
|
865 |
-
|
|
|
|
|
866 |
|
867 |
-
# μμ€ν
ν둬ννΈ
|
868 |
selected_cat = st.session_state.get("category_focus", "(None)")
|
869 |
if selected_cat == "(None)":
|
870 |
selected_cat = None
|
871 |
sys_prompt = get_idea_system_prompt(selected_category=selected_cat)
|
872 |
|
873 |
-
# μΉ΄ν
κ³ λ¦¬ μ 보 (JSON νμ)
|
874 |
def category_context(sel):
|
875 |
if sel:
|
876 |
return json.dumps(
|
877 |
{sel: physical_transformation_categories[sel]},
|
878 |
-
ensure_ascii=False
|
879 |
-
|
880 |
-
|
881 |
|
882 |
-
# μΉ κ²μ
|
883 |
-
|
884 |
if use_web_search:
|
885 |
-
|
|
|
886 |
search_content = do_web_search(keywords(prompt, top=5))
|
887 |
-
|
|
|
888 |
if has_uploaded:
|
889 |
-
|
|
|
890 |
file_content = process_uploaded_files(uploaded_files)
|
891 |
-
if file_content:
|
892 |
-
user_content += "\n\n" + file_content
|
893 |
|
894 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
895 |
api_messages = [
|
896 |
{"role": "system", "content": sys_prompt},
|
897 |
{"role": "system", "name": "category_db",
|
@@ -899,44 +915,40 @@ def process_input(prompt: str, uploaded_files):
|
|
899 |
{"role": "user", "content": user_content},
|
900 |
]
|
901 |
|
902 |
-
# GPT-4 μ€νΈλ¦¬λ° νΈμΆ
|
903 |
-
|
904 |
-
|
905 |
-
|
906 |
-
|
907 |
-
|
908 |
-
|
909 |
-
|
910 |
-
|
911 |
-
|
912 |
-
|
913 |
-
|
914 |
-
|
915 |
-
|
916 |
-
message_placeholder.markdown(full_response + "β")
|
917 |
-
|
918 |
-
# μ΅μ’
μΆλ ₯
|
919 |
message_placeholder.markdown(full_response)
|
|
|
920 |
|
921 |
-
# μ΄λ―Έμ§
|
922 |
if st.session_state.generate_image and full_response:
|
923 |
-
|
924 |
-
|
925 |
-
|
926 |
-
# ν¨ν΄2: μμ νμ "Image Prompt" λ±
|
927 |
legacy_match = None
|
928 |
if not ccm_match:
|
929 |
legacy_match = re.search(
|
930 |
r"\|\s*(?:\*\*)?Image\s+Prompt(?:\*\*)?\s*\|\s*([^|\n]+)",
|
931 |
-
full_response, flags=re.IGNORECASE
|
932 |
-
|
933 |
-
|
934 |
-
full_response
|
935 |
-
)
|
936 |
match = ccm_match or legacy_match
|
937 |
if match:
|
938 |
-
raw_prompt = re.sub(r"[\r\n
|
939 |
-
|
|
|
940 |
img, cap = generate_image(raw_prompt)
|
941 |
if img:
|
942 |
st.image(img, caption=f"μμ΄λμ΄ μκ°ν β {cap}")
|
@@ -947,18 +959,19 @@ def process_input(prompt: str, uploaded_files):
|
|
947 |
"image_caption": f"μμ΄λμ΄ μκ°ν β {cap}"
|
948 |
})
|
949 |
|
950 |
-
#
|
951 |
write_output(full_response, prompt)
|
952 |
|
953 |
except Exception as e:
|
954 |
-
|
955 |
-
|
956 |
-
|
957 |
-
st.session_state.messages.append(
|
|
|
958 |
|
959 |
# ββββββββββββββββββββββββββββββββ main ββββββββββββββββββββββββββββββββββββ
|
960 |
def main():
|
961 |
idea_generator_app()
|
962 |
|
963 |
if __name__ == "__main__":
|
964 |
-
main()
|
|
|
19 |
IMAGE_API_URL = "http://211.233.58.201:7896" # μ΄λ―Έμ§ μμ±μ© API
|
20 |
MAX_TOKENS = 7999
|
21 |
|
22 |
+
# ββββββββββββββββββββββββββββββββ Physical Transformation Categories (KR & EN) βββββββββββββββββ
|
23 |
physical_transformation_categories = {
|
24 |
"μΌμ κΈ°λ₯": [
|
25 |
"μκ° μΌμ/κ°μ§", "μ²κ° μΌμ/κ°μ§", "μ΄κ° μΌμ/κ°μ§", "λ―Έκ° μΌμ/κ°μ§", "νκ° μΌμ/κ°μ§",
|
|
|
294 |
"Data-driven decision making / AI adoption",
|
295 |
"Convergence of new technologies / Innovative investments"
|
296 |
]
|
297 |
+
|
298 |
}
|
299 |
|
300 |
# ββββββββββββββββββββββββββββββββ Logging ββββββββββββββββββββββββββββββββ
|
|
|
302 |
format="%(asctime)s - %(levelname)s - %(message)s")
|
303 |
|
304 |
# ββββββββββββββββββββββββββββββββ OpenAI Client ββββββββββββββββββββββββββ
|
305 |
+
|
306 |
@st.cache_resource
|
307 |
def get_openai_client():
|
308 |
"""Create an OpenAI client with timeout and retry settings."""
|
|
|
326 |
f'μ΄ μΉ΄ν
κ³ λ¦¬μ νλͺ©λ€μ 2λ¨κ³μ 3λ¨κ³ λͺ¨λμμ μ°μ μ μΌλ‘ κ³ λ €νμμμ€.\n'
|
327 |
) if selected_category else ""
|
328 |
|
329 |
+
|
330 |
+
|
331 |
prompt = f"""
|
332 |
λ°λμ νκΈ(νκ΅μ΄)λ‘ λ΅λ³νλΌ. λΉμ μ νμ 컨μ€ν΄νΈλ‘μ CCM(ν¬λ‘μ€ μΉ΄ν
κ³ λ¦¬ λ§€νΈλ¦μ€) λ°©λ²λ‘ μ νμ©νμ¬ μ°½μμ μμ΄λμ΄λ₯Ό λμΆν©λλ€.
|
333 |
|
|
|
639 |
cleaned = re.sub(r"[^κ°-ν£a-zA-Z0-9\s]", "", text)
|
640 |
return " ".join(cleaned.split()[:top])
|
641 |
|
642 |
+
# ββββββββββββββββββββββββββββββββ ν¬νΌ: κ²°κ³Ό κΈ°λ‘Β·λ€μ΄λ‘λΒ·μλμ μ₯ ββββββββββ
|
643 |
+
def write_output(md_text: str, prompt: str):
|
644 |
+
"""
|
645 |
+
β’ λν κΈ°λ‘μ λ§ν¬λ€μ΄ λ΅λ³ μ μ₯
|
646 |
+
β’ λ€μ΄λ‘λ λ²νΌ(λ§ν¬λ€μ΄Β·HTML) μ 곡
|
647 |
+
β’ μλ JSON λ°±μ
|
648 |
+
"""
|
649 |
+
# β μ±ν
κΈ°λ‘μ μΆκ°
|
650 |
+
st.session_state.messages.append(
|
651 |
+
{"role": "assistant", "content": md_text})
|
652 |
+
|
653 |
+
# β‘ λ€μ΄λ‘λ λ²νΌ
|
654 |
+
st.subheader("Download This Output")
|
655 |
+
col_md, col_html = st.columns(2)
|
656 |
+
col_md.download_button(
|
657 |
+
label="Markdown",
|
658 |
+
data=md_text,
|
659 |
+
file_name=f"{prompt[:30]}.md",
|
660 |
+
mime="text/markdown"
|
661 |
+
)
|
662 |
+
col_html.download_button(
|
663 |
+
label="HTML",
|
664 |
+
data=md_to_html(md_text, prompt[:30]),
|
665 |
+
file_name=f"{prompt[:30]}.html",
|
666 |
+
mime="text/html"
|
667 |
+
)
|
668 |
+
|
669 |
+
# β’ μλ JSON μ μ₯
|
670 |
+
if st.session_state.auto_save:
|
671 |
+
fn = f"chat_history_auto_{datetime.now():%Y%m%d_%H%M%S}.json"
|
672 |
+
with open(fn, "w", encoding="utf-8") as fp:
|
673 |
+
json.dump(
|
674 |
+
st.session_state.messages, fp,
|
675 |
+
ensure_ascii=False, indent=2
|
676 |
+
)
|
677 |
+
|
678 |
# ββββββββββββββββββββββββββββββββ Streamlit UI ββββββββββββββββββββββββββββ
|
679 |
def idea_generator_app():
|
680 |
st.title("Creative Idea Generator")
|
681 |
|
682 |
# Set default session state
|
683 |
if "ai_model" not in st.session_state:
|
684 |
+
st.session_state.ai_model = "gpt-4.1-mini"
|
685 |
if "messages" not in st.session_state:
|
686 |
st.session_state.messages = []
|
687 |
if "auto_save" not in st.session_state:
|
|
|
704 |
if web_search_enabled:
|
705 |
sb.info("β
Web search results will be integrated.")
|
706 |
|
707 |
+
# μμ μ£Όμ λ€ (μλ μμ λΈλ‘κ·Έ ν ν½ -> μ΄μ λ μμ μμ΄λμ΄ μ£Όμ λ‘ μ ν)
|
708 |
+
|
709 |
example_topics = {
|
710 |
"example1": "λμ λ¬Ό λΆμ‘± λ¬Έμ ν΄κ²°μ μν νμ μ λ°©μ",
|
711 |
"example2": "λ
ΈμΈ λλ΄ μλΉμ€μ λμ§νΈ μ ν",
|
|
|
721 |
index=0 # κΈ°λ³Έκ° "(None)"
|
722 |
)
|
723 |
|
724 |
+
|
725 |
sb.subheader("Example Prompts")
|
726 |
c1, c2, c3 = sb.columns(3)
|
727 |
if c1.button("λμ λ¬Ό λΆμ‘± λ¬Έμ ", key="ex1"):
|
|
|
839 |
sb.markdown("---")
|
840 |
sb.markdown("Created by [Ginigen.com](https://ginigen.com) | [YouTube](https://www.youtube.com/@ginipickaistudio)")
|
841 |
|
842 |
+
|
843 |
def process_example(topic):
|
844 |
"""Handle example prompts."""
|
845 |
process_input(topic, [])
|
846 |
|
847 |
+
# ββββββββββββββββββββββββββββββββ process_input (μ€λ³΅ μΆλ ₯ μ κ±°) ββββββββββββ
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
848 |
def process_input(prompt: str, uploaded_files):
|
849 |
"""
|
850 |
1) μ¬μ©μ μ
λ ₯μ GPT-4λ‘ λ³΄λ΄ μ°½μμ μμ΄λμ΄ λ³΄κ³ μ μμ±
|
851 |
2) μ νμ μΌλ‘ μ΄λ―Έμ§ μμ±
|
852 |
+
3) κ²°κ³Όλ₯Ό ν λ²λ§ μ μ₯Β·λ€μ΄λ‘λΒ·λ°±μ
|
853 |
"""
|
854 |
+
# ββ 0. μ¬μ©μ λ©μμ§ κΈ°λ‘ ββββββββββββββββββββββββββββββββββββββββββββββ
|
855 |
if not any(m["role"] == "user" and m["content"] == prompt
|
856 |
for m in st.session_state.messages):
|
857 |
st.session_state.messages.append({"role": "user", "content": prompt})
|
|
|
859 |
with st.chat_message("user"):
|
860 |
st.markdown(prompt)
|
861 |
|
862 |
+
# ββ 1. μ΄μμ€ν΄νΈ μλ΅ μμ ββββββββββββββββββββββββββββββββββββββββββ
|
|
|
|
|
|
|
|
|
863 |
with st.chat_message("assistant"):
|
864 |
+
placeholder = st.empty()
|
865 |
message_placeholder = st.empty()
|
866 |
+
full_response = ""
|
867 |
+
|
868 |
+
use_web_search = st.session_state.web_search_enabled
|
869 |
+
has_uploaded = bool(uploaded_files)
|
870 |
|
871 |
try:
|
872 |
+
# 1-A. λͺ¨λΈΒ·μν μ΄κΈ°ν
|
873 |
+
status = st.status("Preparing to generate ideasβ¦")
|
874 |
+
status.update(label="Initializing modelβ¦")
|
875 |
+
client = get_openai_client()
|
876 |
|
877 |
+
# 1-B. μμ€ν
ν둬ννΈ + μΉ΄ν
κ³ λ¦¬ DB
|
878 |
selected_cat = st.session_state.get("category_focus", "(None)")
|
879 |
if selected_cat == "(None)":
|
880 |
selected_cat = None
|
881 |
sys_prompt = get_idea_system_prompt(selected_category=selected_cat)
|
882 |
|
|
|
883 |
def category_context(sel):
|
884 |
if sel:
|
885 |
return json.dumps(
|
886 |
{sel: physical_transformation_categories[sel]},
|
887 |
+
ensure_ascii=False)
|
888 |
+
return "ALL_CATEGORIES: " + ", ".join(
|
889 |
+
physical_transformation_categories.keys())
|
890 |
|
891 |
+
# 1-C. (μ ν) μΉ κ²μ + νμΌ λ΄μ©
|
892 |
+
search_content = None
|
893 |
if use_web_search:
|
894 |
+
status.update(label="Searching the webβ¦")
|
895 |
+
with st.spinner("Searchingβ¦"):
|
896 |
search_content = do_web_search(keywords(prompt, top=5))
|
897 |
+
|
898 |
+
file_content = None
|
899 |
if has_uploaded:
|
900 |
+
status.update(label="Reading uploaded filesβ¦")
|
901 |
+
with st.spinner("Processing filesβ¦"):
|
902 |
file_content = process_uploaded_files(uploaded_files)
|
|
|
|
|
903 |
|
904 |
+
# 1-D. μ¬μ©μ λ©μμ§ κ²°ν©
|
905 |
+
user_content = prompt
|
906 |
+
if search_content:
|
907 |
+
user_content += "\n\n" + search_content
|
908 |
+
if file_content:
|
909 |
+
user_content += "\n\n" + file_content
|
910 |
+
|
911 |
api_messages = [
|
912 |
{"role": "system", "content": sys_prompt},
|
913 |
{"role": "system", "name": "category_db",
|
|
|
915 |
{"role": "user", "content": user_content},
|
916 |
]
|
917 |
|
918 |
+
# ββ 2. GPT-4 μ€νΈλ¦¬λ° νΈμΆ ββββββββββββββββββββββββββββββββββ
|
919 |
+
status.update(label="Generating ideasβ¦")
|
920 |
+
stream = client.chat.completions.create(
|
921 |
+
model="gpt-4.1-mini",
|
922 |
+
messages=api_messages,
|
923 |
+
temperature=1,
|
924 |
+
max_tokens=MAX_TOKENS,
|
925 |
+
top_p=1,
|
926 |
+
stream=True
|
927 |
+
)
|
928 |
+
for chunk in stream:
|
929 |
+
if chunk.choices and chunk.choices[0].delta.content:
|
930 |
+
full_response += chunk.choices[0].delta.content
|
931 |
+
message_placeholder.markdown(full_response + "β")
|
|
|
|
|
|
|
932 |
message_placeholder.markdown(full_response)
|
933 |
+
status.update(label="Ideas created!", state="complete")
|
934 |
|
935 |
+
# ββ 3. μ΄λ―Έμ§ μμ± (μ ν) βββββββββββββββββββββββββββββββββββ
|
936 |
if st.session_state.generate_image and full_response:
|
937 |
+
ccm_match = re.search(
|
938 |
+
r"###\s*μ΄λ―Έμ§\s*ν둬ννΈ\s*\n+([^\n]+)",
|
939 |
+
full_response, flags=re.IGNORECASE)
|
|
|
940 |
legacy_match = None
|
941 |
if not ccm_match:
|
942 |
legacy_match = re.search(
|
943 |
r"\|\s*(?:\*\*)?Image\s+Prompt(?:\*\*)?\s*\|\s*([^|\n]+)",
|
944 |
+
full_response, flags=re.IGNORECASE) or \
|
945 |
+
re.search(r"(?i)Image\s+Prompt\s*[:\-]\s*([^\n]+)",
|
946 |
+
full_response)
|
|
|
|
|
947 |
match = ccm_match or legacy_match
|
948 |
if match:
|
949 |
+
raw_prompt = re.sub(r"[\r\n\"'\\]", " ",
|
950 |
+
match.group(1)).strip()
|
951 |
+
with st.spinner("μμ΄λμ΄ μ΄λ―Έμ§ μμ± μ€β¦"):
|
952 |
img, cap = generate_image(raw_prompt)
|
953 |
if img:
|
954 |
st.image(img, caption=f"μμ΄λμ΄ μκ°ν β {cap}")
|
|
|
959 |
"image_caption": f"μμ΄λμ΄ μκ°ν β {cap}"
|
960 |
})
|
961 |
|
962 |
+
# ββ 4. κ²°κ³Όλ₯Ό **ν λ²λ§** κΈ°λ‘Β·λ€μ΄λ‘λΒ·λ°±μ
ββββββββββββββββ
|
963 |
write_output(full_response, prompt)
|
964 |
|
965 |
except Exception as e:
|
966 |
+
# μμΈ λ°μ μ: λ‘κ·Έ κΈ°λ‘ + μ¬μ©μ μλ¦Όλ§ μν
|
967 |
+
logging.error("process_input error", exc_info=True)
|
968 |
+
placeholder.error(f"β οΈ μμ
μ€ μ€λ₯κ° λ°μνμ΅λλ€: {e}")
|
969 |
+
st.session_state.messages.append(
|
970 |
+
{"role": "assistant", "content": f"β οΈ μ€λ₯: {e}"})
|
971 |
|
972 |
# ββββββββββββββββββββββββββββββββ main ββββββββββββββββββββββββββββββββββββ
|
973 |
def main():
|
974 |
idea_generator_app()
|
975 |
|
976 |
if __name__ == "__main__":
|
977 |
+
main()
|