Spaces:
Running
Running
import os | |
import streamlit as st | |
import json | |
import anthropic | |
# API μ€μ | |
api_key = os.environ.get("API_KEY") | |
client = anthropic.Anthropic(api_key=api_key) | |
# μ΅λ ν ν° μ μ€μ (Claude-3 Sonnetμ μ΅λ ν ν° μ) | |
MAX_TOKENS = 7999 | |
def get_system_prompt(): | |
return """ | |
## π μ λ¬Έ λΈλ‘κ±° μμ€ν ν둬ννΈ | |
### β λ¨κ³λ³ 곡μ ν둬ννΈ | |
λ€μ 8κ°μ§ λ¨κ³λ₯Ό μ νν μμλλ‘ λ°λΌ λΈλ‘κ·Έλ₯Ό μμ±νμΈμ: | |
### 1. μΈμ¬μ 곡κ°μΌλ‘ μμνκΈ° | |
- μΉκ·Όν λ§ν¬λ‘ λ μμκ² μΈμ¬νλ©° κΈμ μ£Όμ μ λν κ΄μ¬ μ λ° | |
- λ μμ νμ€μ κ³ λ―Όμ΄λ κ³΅κ° μμλ₯Ό μ§λ¬Έ ννλ‘ μ μ | |
### 2. λ¬Έμ λ₯Ό λͺ νν μ μνκΈ° | |
- λ μκ° κ²ͺκ³ μλ ꡬ체μ μ΄κ³ νμ€μ μΈ λ¬Έμ λ₯Ό λͺ νν μ§μ΄λ΄κΈ° | |
- λ¬Έμ μ μ¬κ°μ± λλ κΈ΄κΈμ±μ κ°μ‘°νμ¬ κ΄μ¬λλ₯Ό λμ΄κΈ° | |
### 3. λ¬Έμ μμΈμ λΆμνμ¬ μ λ’° ꡬμΆνκΈ° | |
- λ¬Έμ λ°μ μμΈμ λ Όλ¦¬μ μΌλ‘ μ€λͺ | |
- λ μκ° μ½κ² μ΄ν΄ν μ μλλ‘ λͺ ννκ³ κ΅¬μ²΄μ μΌλ‘ κΈ°μ | |
- νμν κ²½μ° λ°μ΄ν°, μμ, μ¬λ‘ μ μ | |
### 4. ꡬ체μ ν΄κ²°μ± μ μ μνκΈ° | |
- λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ ꡬ체μ μ΄κ³ μ€μ² κ°λ₯ν λ°©λ²μ λ¨κ³μ μΌλ‘ μ 곡 | |
- λͺ νν ν, μ λ΅, κ°μ΄λλΌμΈ ννλ‘ μ μνμ¬ μ¦μ μ μ© κ°λ₯νκ² νκΈ° | |
### 5. μ¬νμ μ¦κ±° μ μνκΈ° | |
- μ€μ μ±κ³΅ μ¬λ‘, νκΈ°, μ¬μ©μ κ²½νλ΄, λ°μ΄ν° λ±μ ν¬ν¨ | |
- λ μκ° μ λ’°ν μ μλλ‘ κ΅¬μ²΄μ μ΄κ³ μ¬μ€μ μΌλ‘ κΈ°μ | |
### 6. νλ μ λ(CTA: Call To Action)νκΈ° | |
- μ§κΈ λΉμ₯ λ μκ° μ·¨ν΄μΌ ν νλμ ꡬ체μ μΌλ‘ μ μ | |
- "μ§κΈ λ°λ‘", "μ€λλΆν°", "μ¦μ"μ κ°μ κΈ΄κΈν ννμ μ¬μ©νμ¬ λ μμ νλμ μ΄μ§ | |
### 7. μ ν 쑰건 λλ κ²½κ³ λ₯Ό μΆκ°νμ¬ μ§μ μ± κ°ννκΈ° | |
- μ΄ κΈμ΄λ ν΄κ²°μ± μ΄ λͺ¨λ μ¬λμκ² λ§μ§ μμ μ μμμ μΈκΈ | |
- λ μμκ² μ§μ μ±κ³Ό ν¬μμ±μ μ λ¬νμ¬ μ λ’°λλ₯Ό λμ΄κΈ° | |
### 8. κ°μ¬ μΈμ¬ λ° νμ μ°κ²° μλ΄νκΈ° | |
- λ μμκ² μ½μ΄μ€μ κ°μ¬νλ€λ μ§μ¬μ νν | |
- λ€μ ν¬μ€ν μκ³ λλ λκΈ, ꡬλ μμ²μΌλ‘ μμ°μ€λ¬μ΄ μ°κ²° μ λ | |
--- | |
### π© μμ± μ€νμΌ ν | |
- μΉκ·Όνκ³ μΈκ°μ μΈ ν€ μ μ§ | |
- ꡬμ΄μ²΄μ μ§λ¬Έμ μμ£Ό μ¬μ©νμ¬ λ μμμ μνΈμμ© μ΄μ§ | |
- λͺ νν ꡬ쑰μ ꡬλΆμ (---), λ²νΈ λͺ©λ‘, 체ν¬λ¦¬μ€νΈ μ¬μ©μΌλ‘ κ°λ μ± ν₯μ | |
- κ°λ₯νλ©΄ μ€μ μ¬λ‘λ ꡬ체μ λ°μ΄ν° ν¬ν¨ | |
""" | |
def chatbot_interface(): | |
st.title("Ginigen Blog") | |
# λͺ¨λΈ κ³ μ μ€μ | |
if "ai_model" not in st.session_state: | |
st.session_state["ai_model"] = "claude-3-5-sonnet-20241022" | |
# μΈμ μν μ΄κΈ°ν | |
if "messages" not in st.session_state: | |
st.session_state.messages = [] | |
# μλ μ μ₯ κΈ°λ₯ | |
if "auto_save" not in st.session_state: | |
st.session_state.auto_save = True | |
# λν κΈ°λ‘ κ΄λ¦¬ (μ¬μ΄λλ°) | |
st.sidebar.title("λν κΈ°λ‘ κ΄λ¦¬") | |
# μλ μ μ₯ ν κΈ | |
st.session_state.auto_save = st.sidebar.toggle("μλ μ μ₯", value=st.session_state.auto_save) | |
# λν κΈ°λ‘ λΆλ¬μ€κΈ° | |
uploaded_file = st.sidebar.file_uploader("λν κΈ°λ‘ λΆλ¬μ€κΈ°", type=['json']) | |
if uploaded_file is not None: | |
try: | |
content = uploaded_file.getvalue().decode() | |
if content.strip(): | |
st.session_state.messages = json.loads(content) | |
st.sidebar.success("λν κΈ°λ‘μ μ±κ³΅μ μΌλ‘ λΆλ¬μμ΅λλ€!") | |
else: | |
st.sidebar.warning("μ λ‘λλ νμΌμ΄ λΉμ΄ μμ΅λλ€.") | |
except json.JSONDecodeError: | |
st.sidebar.error("μ¬λ°λ₯Έ JSON νμμ νμΌμ΄ μλλλ€.") | |
except Exception as e: | |
st.sidebar.error(f"νμΌ μ²λ¦¬ μ€ μ€λ₯κ° λ°μνμ΅λλ€: {str(e)}") | |
# λν κΈ°λ‘ μ΄κΈ°ν λ²νΌ | |
if st.sidebar.button("λν κΈ°λ‘ μ΄κΈ°ν"): | |
st.session_state.messages = [] | |
st.sidebar.success("λν κΈ°λ‘μ΄ μ΄κΈ°νλμμ΅λλ€.") | |
# λ©μμ§ νμ | |
for message in st.session_state.messages: | |
with st.chat_message(message["role"]): | |
st.markdown(message["content"]) | |
# μ¬μ©μ μ λ ₯ | |
if prompt := st.chat_input("무μμ λμλ릴κΉμ?"): | |
st.session_state.messages.append({"role": "user", "content": prompt}) | |
with st.chat_message("user"): | |
st.markdown(prompt) | |
# AI μλ΅ μμ± | |
with st.chat_message("assistant"): | |
message_placeholder = st.empty() | |
full_response = "" | |
# API νΈμΆ | |
with client.messages.stream( | |
max_tokens=MAX_TOKENS, | |
system=get_system_prompt(), | |
messages=[{"role": m["role"], "content": m["content"]} for m in st.session_state.messages], | |
model=st.session_state["ai_model"] | |
) as stream: | |
for text in stream.text_stream: | |
full_response += str(text) if text is not None else "" | |
message_placeholder.markdown(full_response + "β") | |
message_placeholder.markdown(full_response) | |
st.session_state.messages.append({"role": "assistant", "content": full_response}) | |
# μλ μ μ₯ κΈ°λ₯ | |
if st.session_state.auto_save: | |
try: | |
with open('chat_history_auto_save.json', 'w', encoding='utf-8') as f: | |
json.dump(st.session_state.messages, f, ensure_ascii=False, indent=4) | |
except Exception as e: | |
st.sidebar.error(f"μλ μ μ₯ μ€ μ€λ₯ λ°μ: {str(e)}") | |
# λν κΈ°λ‘ λ€μ΄λ‘λ | |
if st.sidebar.button("λν κΈ°λ‘ λ€μ΄λ‘λ"): | |
json_history = json.dumps(st.session_state.messages, indent=4, ensure_ascii=False) | |
st.sidebar.download_button( | |
label="λν κΈ°λ‘ μ μ₯νκΈ°", | |
data=json_history, | |
file_name="chat_history.json", | |
mime="application/json" | |
) | |
def main(): | |
chatbot_interface() | |
if __name__ == "__main__": | |
main() |