Skip to content

Commit d55884b

Browse files
committed
enh: ENABLE_REALTIME_CHAT_SAVE
1 parent c8fb11d commit d55884b

File tree

3 files changed

+61
-9
lines changed

3 files changed

+61
-9
lines changed

backend/open_webui/env.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,11 @@ def parse_section(section):
311311
os.environ.get("RESET_CONFIG_ON_START", "False").lower() == "true"
312312
)
313313

314+
315+
ENABLE_REALTIME_CHAT_SAVE = (
316+
os.environ.get("ENABLE_REALTIME_CHAT_SAVE", "True").lower() == "true"
317+
)
318+
314319
####################################
315320
# REDIS
316321
####################################

backend/open_webui/utils/middleware.py

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
SRC_LOG_LEVELS,
6666
GLOBAL_LOG_LEVEL,
6767
BYPASS_MODEL_ACCESS_CONTROL,
68+
ENABLE_REALTIME_CHAT_SAVE,
6869
)
6970
from open_webui.constants import TASKS
7071

@@ -977,7 +978,6 @@ async def post_response_handler(response, events):
977978
)
978979

979980
else:
980-
981981
value = (
982982
data.get("choices", [])[0]
983983
.get("delta", {})
@@ -987,14 +987,19 @@ async def post_response_handler(response, events):
987987
if value:
988988
content = f"{content}{value}"
989989

990-
# Save message in the database
991-
Chats.upsert_message_to_chat_by_id_and_message_id(
992-
metadata["chat_id"],
993-
metadata["message_id"],
994-
{
990+
if ENABLE_REALTIME_CHAT_SAVE:
991+
# Save message in the database
992+
Chats.upsert_message_to_chat_by_id_and_message_id(
993+
metadata["chat_id"],
994+
metadata["message_id"],
995+
{
996+
"content": content,
997+
},
998+
)
999+
else:
1000+
data = {
9951001
"content": content,
996-
},
997-
)
1002+
}
9981003

9991004
except Exception as e:
10001005
done = "data: [DONE]" in line
@@ -1003,6 +1008,16 @@ async def post_response_handler(response, events):
10031008
if done:
10041009
data = {"done": True, "content": content, "title": title}
10051010

1011+
if not ENABLE_REALTIME_CHAT_SAVE:
1012+
# Save message in the database
1013+
Chats.upsert_message_to_chat_by_id_and_message_id(
1014+
metadata["chat_id"],
1015+
metadata["message_id"],
1016+
{
1017+
"content": content,
1018+
},
1019+
)
1020+
10061021
# Send a webhook notification if the user is not active
10071022
if (
10081023
get_user_id_from_session_pool(metadata["session_id"])

src/lib/components/chat/Chat.svelte

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1053,7 +1053,7 @@
10531053
};
10541054
10551055
const chatCompletionEventHandler = async (data, message, chatId) => {
1056-
const { id, done, choices, sources, selected_model_id, error, usage } = data;
1056+
const { id, done, choices, content, sources, selected_model_id, error, usage } = data;
10571057
10581058
if (error) {
10591059
await handleOpenAIError(error, message);
@@ -1105,6 +1105,38 @@
11051105
}
11061106
}
11071107
1108+
if (content) {
1109+
// REALTIME_CHAT_SAVE is disabled
1110+
message.content = content;
1111+
1112+
if (navigator.vibrate && ($settings?.hapticFeedback ?? false)) {
1113+
navigator.vibrate(5);
1114+
}
1115+
1116+
// Emit chat event for TTS
1117+
const messageContentParts = getMessageContentParts(
1118+
message.content,
1119+
$config?.audio?.tts?.split_on ?? 'punctuation'
1120+
);
1121+
messageContentParts.pop();
1122+
1123+
// dispatch only last sentence and make sure it hasn't been dispatched before
1124+
if (
1125+
messageContentParts.length > 0 &&
1126+
messageContentParts[messageContentParts.length - 1] !== message.lastSentence
1127+
) {
1128+
message.lastSentence = messageContentParts[messageContentParts.length - 1];
1129+
eventTarget.dispatchEvent(
1130+
new CustomEvent('chat', {
1131+
detail: {
1132+
id: message.id,
1133+
content: messageContentParts[messageContentParts.length - 1]
1134+
}
1135+
})
1136+
);
1137+
}
1138+
}
1139+
11081140
if (selected_model_id) {
11091141
message.selectedModelId = selected_model_id;
11101142
message.arena = true;

0 commit comments

Comments
 (0)