Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -4,123 +4,147 @@ import json
|
|
4 |
import os
|
5 |
import uuid
|
6 |
|
7 |
-
#
|
8 |
-
st.
|
9 |
|
10 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
DATABASE_FILE = "database.json"
|
12 |
|
13 |
-
# Fungsi untuk memuat database dari file JSON
|
14 |
def load_database():
|
15 |
if os.path.exists(DATABASE_FILE):
|
16 |
try:
|
17 |
with open(DATABASE_FILE, "r") as file:
|
18 |
return json.load(file)
|
19 |
except json.JSONDecodeError:
|
20 |
-
return {}
|
21 |
return {}
|
22 |
|
23 |
-
# Fungsi untuk menyimpan database ke file JSON
|
24 |
def save_database(database):
|
25 |
with open(DATABASE_FILE, "w") as file:
|
26 |
json.dump(database, file, indent=4)
|
27 |
|
28 |
-
# Memuat database
|
29 |
database = load_database()
|
30 |
|
31 |
-
# Generate atau ambil user_id
|
32 |
if "user_id" not in st.session_state:
|
33 |
-
st.session_state.user_id = str(uuid.uuid4())
|
34 |
|
35 |
-
user_id = st.session_state.user_id
|
36 |
|
37 |
-
# Inisialisasi session state
|
38 |
if "sessions" not in st.session_state:
|
39 |
-
st.session_state.sessions = database.get(user_id, {})
|
40 |
if "current_session" not in st.session_state:
|
41 |
-
st.session_state.current_session = "Default Session"
|
42 |
if st.session_state.current_session not in st.session_state.sessions:
|
43 |
-
st.session_state.sessions[st.session_state.current_session] = []
|
44 |
|
45 |
-
# Sidebar untuk
|
46 |
with st.sidebar:
|
47 |
-
st.header("π
|
48 |
|
49 |
-
|
50 |
-
|
51 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
del st.session_state.sessions[st.session_state.current_session]
|
53 |
-
if st.session_state.sessions:
|
54 |
st.session_state.current_session = list(st.session_state.sessions.keys())[0]
|
55 |
-
else:
|
56 |
st.session_state.current_session = "Default Session"
|
57 |
st.session_state.sessions[st.session_state.current_session] = []
|
58 |
-
database[user_id] = st.session_state.sessions
|
59 |
-
save_database(database)
|
60 |
-
st.
|
61 |
|
62 |
-
# Tampilkan percakapan
|
63 |
-
st.
|
64 |
|
65 |
-
# Tampilkan riwayat chat dari session yang aktif
|
66 |
for message in st.session_state.sessions[st.session_state.current_session]:
|
67 |
-
|
68 |
-
|
|
|
|
|
69 |
|
70 |
# Input pengguna
|
71 |
if prompt := st.chat_input("Ketik pesan Anda di sini..."):
|
72 |
-
# Tambahkan pesan pengguna ke riwayat chat session yang aktif
|
73 |
st.session_state.sessions[st.session_state.current_session].append({"role": "user", "content": prompt})
|
74 |
with st.chat_message("user"):
|
75 |
-
st.markdown(prompt)
|
76 |
|
77 |
-
# Generate respons AI
|
78 |
with st.chat_message("assistant"):
|
79 |
try:
|
80 |
-
# Kirim seluruh riwayat percakapan ke model AI
|
81 |
response = g4f.ChatCompletion.create(
|
82 |
-
model="blackboxai",
|
83 |
-
messages=st.session_state.sessions[st.session_state.current_session],
|
84 |
-
provider=g4f.Provider.Blackbox
|
85 |
)
|
86 |
-
st.markdown(response)
|
87 |
except Exception as e:
|
88 |
-
|
|
|
89 |
|
90 |
-
#
|
91 |
st.session_state.sessions[st.session_state.current_session].append({"role": "assistant", "content": response})
|
92 |
-
database[user_id] = st.session_state.sessions
|
93 |
-
save_database(database)
|
94 |
-
|
95 |
-
# CSS untuk mengoptimalkan tampilan di perangkat mobile
|
96 |
-
st.markdown(
|
97 |
-
"""
|
98 |
-
<style>
|
99 |
-
/* Mengurangi padding dan margin untuk menghemat ruang */
|
100 |
-
.stChatInput {
|
101 |
-
padding: 10px;
|
102 |
-
margin: 0;
|
103 |
-
}
|
104 |
-
.stChatMessage {
|
105 |
-
padding: 10px;
|
106 |
-
margin: 5px 0;
|
107 |
-
}
|
108 |
-
/* Memastikan input chat tetap di bagian bawah layar */
|
109 |
-
.stChatInputContainer {
|
110 |
-
position: fixed;
|
111 |
-
bottom: 0;
|
112 |
-
left: 0;
|
113 |
-
right: 0;
|
114 |
-
background: white;
|
115 |
-
z-index: 1000;
|
116 |
-
padding: 10px;
|
117 |
-
box-shadow: 0 -2px 5px rgba(0, 0, 0, 0.1);
|
118 |
-
}
|
119 |
-
/* Menyesuaikan ukuran font untuk layar kecil */
|
120 |
-
.stMarkdown {
|
121 |
-
font-size: 16px;
|
122 |
-
}
|
123 |
-
</style>
|
124 |
-
""",
|
125 |
-
unsafe_allow_html=True,
|
126 |
-
)
|
|
|
4 |
import os
|
5 |
import uuid
|
6 |
|
7 |
+
# Konfigurasi halaman
|
8 |
+
st.set_page_config(page_title="ChatGPT Clone", layout="wide")
|
9 |
|
10 |
+
# CSS untuk styling mirip ChatGPT
|
11 |
+
st.markdown(
|
12 |
+
"""
|
13 |
+
<style>
|
14 |
+
body {
|
15 |
+
background-color: #343541; /* Warna latar belakang ChatGPT */
|
16 |
+
color: white;
|
17 |
+
}
|
18 |
+
.stChatMessage {
|
19 |
+
border-radius: 10px;
|
20 |
+
padding: 12px;
|
21 |
+
margin: 8px 0;
|
22 |
+
max-width: 75%;
|
23 |
+
}
|
24 |
+
.user-message {
|
25 |
+
background-color: #0b93f6;
|
26 |
+
color: white;
|
27 |
+
align-self: flex-end;
|
28 |
+
}
|
29 |
+
.assistant-message {
|
30 |
+
background-color: #444654;
|
31 |
+
color: white;
|
32 |
+
align-self: flex-start;
|
33 |
+
}
|
34 |
+
.stChatInputContainer {
|
35 |
+
position: fixed;
|
36 |
+
bottom: 0;
|
37 |
+
left: 0;
|
38 |
+
right: 0;
|
39 |
+
background: #40414F;
|
40 |
+
z-index: 1000;
|
41 |
+
padding: 10px;
|
42 |
+
box-shadow: 0 -2px 5px rgba(0, 0, 0, 0.1);
|
43 |
+
}
|
44 |
+
.stButton button {
|
45 |
+
width: 100%;
|
46 |
+
background: #10a37f;
|
47 |
+
color: white;
|
48 |
+
border-radius: 5px;
|
49 |
+
padding: 8px;
|
50 |
+
font-size: 14px;
|
51 |
+
}
|
52 |
+
</style>
|
53 |
+
""",
|
54 |
+
unsafe_allow_html=True,
|
55 |
+
)
|
56 |
+
|
57 |
+
# Inisialisasi database
|
58 |
DATABASE_FILE = "database.json"
|
59 |
|
|
|
60 |
def load_database():
|
61 |
if os.path.exists(DATABASE_FILE):
|
62 |
try:
|
63 |
with open(DATABASE_FILE, "r") as file:
|
64 |
return json.load(file)
|
65 |
except json.JSONDecodeError:
|
66 |
+
return {}
|
67 |
return {}
|
68 |
|
|
|
69 |
def save_database(database):
|
70 |
with open(DATABASE_FILE, "w") as file:
|
71 |
json.dump(database, file, indent=4)
|
72 |
|
|
|
73 |
database = load_database()
|
74 |
|
75 |
+
# Generate atau ambil user_id
|
76 |
if "user_id" not in st.session_state:
|
77 |
+
st.session_state.user_id = str(uuid.uuid4())
|
78 |
|
79 |
+
user_id = st.session_state.user_id
|
80 |
|
81 |
+
# Inisialisasi session state
|
82 |
if "sessions" not in st.session_state:
|
83 |
+
st.session_state.sessions = database.get(user_id, {})
|
84 |
if "current_session" not in st.session_state:
|
85 |
+
st.session_state.current_session = "Default Session"
|
86 |
if st.session_state.current_session not in st.session_state.sessions:
|
87 |
+
st.session_state.sessions[st.session_state.current_session] = []
|
88 |
|
89 |
+
# Sidebar untuk sesi chat
|
90 |
with st.sidebar:
|
91 |
+
st.header("π ChatGPT Sessions")
|
92 |
|
93 |
+
session_list = list(st.session_state.sessions.keys())
|
94 |
+
selected_session = st.selectbox("Pilih sesi", session_list, index=session_list.index(st.session_state.current_session) if session_list else 0)
|
95 |
+
|
96 |
+
if selected_session:
|
97 |
+
st.session_state.current_session = selected_session
|
98 |
+
|
99 |
+
if st.button("π Buat Sesi Baru"):
|
100 |
+
new_session_name = f"Session {len(session_list) + 1}"
|
101 |
+
st.session_state.sessions[new_session_name] = []
|
102 |
+
st.session_state.current_session = new_session_name
|
103 |
+
database[user_id] = st.session_state.sessions
|
104 |
+
save_database(database)
|
105 |
+
st.experimental_rerun()
|
106 |
+
|
107 |
+
if st.button("π Hapus Sesi"):
|
108 |
+
if st.session_state.current_session in st.session_state.sessions:
|
109 |
del st.session_state.sessions[st.session_state.current_session]
|
110 |
+
if st.session_state.sessions:
|
111 |
st.session_state.current_session = list(st.session_state.sessions.keys())[0]
|
112 |
+
else:
|
113 |
st.session_state.current_session = "Default Session"
|
114 |
st.session_state.sessions[st.session_state.current_session] = []
|
115 |
+
database[user_id] = st.session_state.sessions
|
116 |
+
save_database(database)
|
117 |
+
st.experimental_rerun()
|
118 |
|
119 |
+
# Tampilkan riwayat percakapan
|
120 |
+
st.markdown(f"<h3>π¬ {st.session_state.current_session}</h3>", unsafe_allow_html=True)
|
121 |
|
|
|
122 |
for message in st.session_state.sessions[st.session_state.current_session]:
|
123 |
+
role = message["role"]
|
124 |
+
content = message["content"]
|
125 |
+
with st.chat_message(role):
|
126 |
+
st.markdown(f"<div class='{role}-message'>{content}</div>", unsafe_allow_html=True)
|
127 |
|
128 |
# Input pengguna
|
129 |
if prompt := st.chat_input("Ketik pesan Anda di sini..."):
|
|
|
130 |
st.session_state.sessions[st.session_state.current_session].append({"role": "user", "content": prompt})
|
131 |
with st.chat_message("user"):
|
132 |
+
st.markdown(f"<div class='user-message'>{prompt}</div>", unsafe_allow_html=True)
|
133 |
|
134 |
+
# Generate respons AI dengan g4f (Blackbox AI)
|
135 |
with st.chat_message("assistant"):
|
136 |
try:
|
|
|
137 |
response = g4f.ChatCompletion.create(
|
138 |
+
model="blackboxai",
|
139 |
+
messages=st.session_state.sessions[st.session_state.current_session],
|
140 |
+
provider=g4f.Provider.Blackbox
|
141 |
)
|
142 |
+
st.markdown(f"<div class='assistant-message'>{response}</div>", unsafe_allow_html=True)
|
143 |
except Exception as e:
|
144 |
+
response = f"β οΈ Terjadi error: {str(e)}"
|
145 |
+
st.markdown(f"<div class='assistant-message'>{response}</div>", unsafe_allow_html=True)
|
146 |
|
147 |
+
# Simpan respons AI ke riwayat chat
|
148 |
st.session_state.sessions[st.session_state.current_session].append({"role": "assistant", "content": response})
|
149 |
+
database[user_id] = st.session_state.sessions
|
150 |
+
save_database(database)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|