refac
This commit is contained in:
@@ -2400,190 +2400,131 @@ async def process_chat_payload(request, form_data, user, metadata, model):
|
|||||||
return form_data, metadata, events
|
return form_data, metadata, events
|
||||||
|
|
||||||
|
|
||||||
async def process_chat_response(
|
async def background_tasks_handler(request, form_data, user, metadata, tasks):
|
||||||
request, response, form_data, user, metadata, model, events, tasks
|
event_emitter = None
|
||||||
):
|
event_caller = None
|
||||||
async def background_tasks_handler():
|
if (
|
||||||
message = None
|
"session_id" in metadata
|
||||||
|
and metadata["session_id"]
|
||||||
|
and "chat_id" in metadata
|
||||||
|
and metadata["chat_id"]
|
||||||
|
and "message_id" in metadata
|
||||||
|
and metadata["message_id"]
|
||||||
|
):
|
||||||
|
event_emitter = get_event_emitter(metadata)
|
||||||
|
event_caller = get_event_call(metadata)
|
||||||
|
|
||||||
|
message = None
|
||||||
|
messages = []
|
||||||
|
|
||||||
|
if "chat_id" in metadata and not metadata["chat_id"].startswith("local:"):
|
||||||
|
messages_map = Chats.get_messages_map_by_chat_id(metadata["chat_id"])
|
||||||
|
message = messages_map.get(metadata["message_id"]) if messages_map else None
|
||||||
|
|
||||||
|
message_list = get_message_list(messages_map, metadata["message_id"])
|
||||||
|
|
||||||
|
# Remove details tags and files from the messages.
|
||||||
|
# as get_message_list creates a new list, it does not affect
|
||||||
|
# the original messages outside of this handler
|
||||||
|
|
||||||
messages = []
|
messages = []
|
||||||
|
for message in message_list:
|
||||||
|
content = message.get("content", "")
|
||||||
|
if isinstance(content, list):
|
||||||
|
for item in content:
|
||||||
|
if item.get("type") == "text":
|
||||||
|
content = item["text"]
|
||||||
|
break
|
||||||
|
|
||||||
if "chat_id" in metadata and not metadata["chat_id"].startswith("local:"):
|
if isinstance(content, str):
|
||||||
messages_map = Chats.get_messages_map_by_chat_id(metadata["chat_id"])
|
content = re.sub(
|
||||||
message = messages_map.get(metadata["message_id"]) if messages_map else None
|
r"<details\b[^>]*>.*?<\/details>|!\[.*?\]\(.*?\)",
|
||||||
|
"",
|
||||||
|
content,
|
||||||
|
flags=re.S | re.I,
|
||||||
|
).strip()
|
||||||
|
|
||||||
message_list = get_message_list(messages_map, metadata["message_id"])
|
messages.append(
|
||||||
|
{
|
||||||
|
**message,
|
||||||
|
"role": message.get(
|
||||||
|
"role", "assistant"
|
||||||
|
), # Safe fallback for missing role
|
||||||
|
"content": content,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
# Local temp chat, get the model and message from the form_data
|
||||||
|
message = get_last_user_message_item(form_data.get("messages", []))
|
||||||
|
messages = form_data.get("messages", [])
|
||||||
|
if message:
|
||||||
|
message["model"] = form_data.get("model")
|
||||||
|
|
||||||
# Remove details tags and files from the messages.
|
if message and "model" in message:
|
||||||
# as get_message_list creates a new list, it does not affect
|
if tasks and messages:
|
||||||
# the original messages outside of this handler
|
if (
|
||||||
|
TASKS.FOLLOW_UP_GENERATION in tasks
|
||||||
messages = []
|
and tasks[TASKS.FOLLOW_UP_GENERATION]
|
||||||
for message in message_list:
|
):
|
||||||
content = message.get("content", "")
|
res = await generate_follow_ups(
|
||||||
if isinstance(content, list):
|
request,
|
||||||
for item in content:
|
|
||||||
if item.get("type") == "text":
|
|
||||||
content = item["text"]
|
|
||||||
break
|
|
||||||
|
|
||||||
if isinstance(content, str):
|
|
||||||
content = re.sub(
|
|
||||||
r"<details\b[^>]*>.*?<\/details>|!\[.*?\]\(.*?\)",
|
|
||||||
"",
|
|
||||||
content,
|
|
||||||
flags=re.S | re.I,
|
|
||||||
).strip()
|
|
||||||
|
|
||||||
messages.append(
|
|
||||||
{
|
{
|
||||||
**message,
|
"model": message["model"],
|
||||||
"role": message.get(
|
"messages": messages,
|
||||||
"role", "assistant"
|
"message_id": metadata["message_id"],
|
||||||
), # Safe fallback for missing role
|
"chat_id": metadata["chat_id"],
|
||||||
"content": content,
|
},
|
||||||
}
|
user,
|
||||||
)
|
)
|
||||||
else:
|
|
||||||
# Local temp chat, get the model and message from the form_data
|
|
||||||
message = get_last_user_message_item(form_data.get("messages", []))
|
|
||||||
messages = form_data.get("messages", [])
|
|
||||||
if message:
|
|
||||||
message["model"] = form_data.get("model")
|
|
||||||
|
|
||||||
if message and "model" in message:
|
if res and isinstance(res, dict):
|
||||||
if tasks and messages:
|
if len(res.get("choices", [])) == 1:
|
||||||
if (
|
response_message = res.get("choices", [])[0].get("message", {})
|
||||||
TASKS.FOLLOW_UP_GENERATION in tasks
|
|
||||||
and tasks[TASKS.FOLLOW_UP_GENERATION]
|
|
||||||
):
|
|
||||||
res = await generate_follow_ups(
|
|
||||||
request,
|
|
||||||
{
|
|
||||||
"model": message["model"],
|
|
||||||
"messages": messages,
|
|
||||||
"message_id": metadata["message_id"],
|
|
||||||
"chat_id": metadata["chat_id"],
|
|
||||||
},
|
|
||||||
user,
|
|
||||||
)
|
|
||||||
|
|
||||||
if res and isinstance(res, dict):
|
follow_ups_string = response_message.get(
|
||||||
if len(res.get("choices", [])) == 1:
|
"content"
|
||||||
response_message = res.get("choices", [])[0].get(
|
) or response_message.get("reasoning_content", "")
|
||||||
"message", {}
|
else:
|
||||||
)
|
follow_ups_string = ""
|
||||||
|
|
||||||
follow_ups_string = response_message.get(
|
follow_ups_string = follow_ups_string[
|
||||||
"content"
|
follow_ups_string.find("{") : follow_ups_string.rfind("}") + 1
|
||||||
) or response_message.get("reasoning_content", "")
|
]
|
||||||
else:
|
|
||||||
follow_ups_string = ""
|
|
||||||
|
|
||||||
follow_ups_string = follow_ups_string[
|
try:
|
||||||
follow_ups_string.find("{") : follow_ups_string.rfind("}")
|
follow_ups = json.loads(follow_ups_string).get("follow_ups", [])
|
||||||
+ 1
|
await event_emitter(
|
||||||
]
|
{
|
||||||
|
"type": "chat:message:follow_ups",
|
||||||
try:
|
"data": {
|
||||||
follow_ups = json.loads(follow_ups_string).get(
|
"follow_ups": follow_ups,
|
||||||
"follow_ups", []
|
|
||||||
)
|
|
||||||
await event_emitter(
|
|
||||||
{
|
|
||||||
"type": "chat:message:follow_ups",
|
|
||||||
"data": {
|
|
||||||
"follow_ups": follow_ups,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
if not metadata.get("chat_id", "").startswith("local:"):
|
|
||||||
Chats.upsert_message_to_chat_by_id_and_message_id(
|
|
||||||
metadata["chat_id"],
|
|
||||||
metadata["message_id"],
|
|
||||||
{
|
|
||||||
"followUps": follow_ups,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if not metadata.get("chat_id", "").startswith(
|
|
||||||
"local:"
|
|
||||||
): # Only update titles and tags for non-temp chats
|
|
||||||
if TASKS.TITLE_GENERATION in tasks:
|
|
||||||
user_message = get_last_user_message(messages)
|
|
||||||
if user_message and len(user_message) > 100:
|
|
||||||
user_message = user_message[:100] + "..."
|
|
||||||
|
|
||||||
title = None
|
|
||||||
if tasks[TASKS.TITLE_GENERATION]:
|
|
||||||
res = await generate_title(
|
|
||||||
request,
|
|
||||||
{
|
|
||||||
"model": message["model"],
|
|
||||||
"messages": messages,
|
|
||||||
"chat_id": metadata["chat_id"],
|
|
||||||
},
|
},
|
||||||
user,
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
if res and isinstance(res, dict):
|
if not metadata.get("chat_id", "").startswith("local:"):
|
||||||
if len(res.get("choices", [])) == 1:
|
Chats.upsert_message_to_chat_by_id_and_message_id(
|
||||||
response_message = res.get("choices", [])[0].get(
|
metadata["chat_id"],
|
||||||
"message", {}
|
metadata["message_id"],
|
||||||
)
|
|
||||||
|
|
||||||
title_string = (
|
|
||||||
response_message.get("content")
|
|
||||||
or response_message.get(
|
|
||||||
"reasoning_content",
|
|
||||||
)
|
|
||||||
or message.get("content", user_message)
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
title_string = ""
|
|
||||||
|
|
||||||
title_string = title_string[
|
|
||||||
title_string.find("{") : title_string.rfind("}") + 1
|
|
||||||
]
|
|
||||||
|
|
||||||
try:
|
|
||||||
title = json.loads(title_string).get(
|
|
||||||
"title", user_message
|
|
||||||
)
|
|
||||||
except Exception as e:
|
|
||||||
title = ""
|
|
||||||
|
|
||||||
if not title:
|
|
||||||
title = messages[0].get("content", user_message)
|
|
||||||
|
|
||||||
Chats.update_chat_title_by_id(
|
|
||||||
metadata["chat_id"], title
|
|
||||||
)
|
|
||||||
|
|
||||||
await event_emitter(
|
|
||||||
{
|
|
||||||
"type": "chat:title",
|
|
||||||
"data": title,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
if title == None and len(messages) == 2:
|
|
||||||
title = messages[0].get("content", user_message)
|
|
||||||
|
|
||||||
Chats.update_chat_title_by_id(metadata["chat_id"], title)
|
|
||||||
|
|
||||||
await event_emitter(
|
|
||||||
{
|
{
|
||||||
"type": "chat:title",
|
"followUps": follow_ups,
|
||||||
"data": message.get("content", user_message),
|
},
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if TASKS.TAGS_GENERATION in tasks and tasks[TASKS.TAGS_GENERATION]:
|
except Exception as e:
|
||||||
res = await generate_chat_tags(
|
pass
|
||||||
|
|
||||||
|
if not metadata.get("chat_id", "").startswith(
|
||||||
|
"local:"
|
||||||
|
): # Only update titles and tags for non-temp chats
|
||||||
|
if TASKS.TITLE_GENERATION in tasks:
|
||||||
|
user_message = get_last_user_message(messages)
|
||||||
|
if user_message and len(user_message) > 100:
|
||||||
|
user_message = user_message[:100] + "..."
|
||||||
|
|
||||||
|
title = None
|
||||||
|
if tasks[TASKS.TITLE_GENERATION]:
|
||||||
|
res = await generate_title(
|
||||||
request,
|
request,
|
||||||
{
|
{
|
||||||
"model": message["model"],
|
"model": message["model"],
|
||||||
@@ -2599,31 +2540,97 @@ async def process_chat_response(
|
|||||||
"message", {}
|
"message", {}
|
||||||
)
|
)
|
||||||
|
|
||||||
tags_string = response_message.get(
|
title_string = (
|
||||||
"content"
|
response_message.get("content")
|
||||||
) or response_message.get("reasoning_content", "")
|
or response_message.get(
|
||||||
|
"reasoning_content",
|
||||||
|
)
|
||||||
|
or message.get("content", user_message)
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
tags_string = ""
|
title_string = ""
|
||||||
|
|
||||||
tags_string = tags_string[
|
title_string = title_string[
|
||||||
tags_string.find("{") : tags_string.rfind("}") + 1
|
title_string.find("{") : title_string.rfind("}") + 1
|
||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
tags = json.loads(tags_string).get("tags", [])
|
title = json.loads(title_string).get(
|
||||||
Chats.update_chat_tags_by_id(
|
"title", user_message
|
||||||
metadata["chat_id"], tags, user
|
|
||||||
)
|
|
||||||
|
|
||||||
await event_emitter(
|
|
||||||
{
|
|
||||||
"type": "chat:tags",
|
|
||||||
"data": tags,
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pass
|
title = ""
|
||||||
|
|
||||||
|
if not title:
|
||||||
|
title = messages[0].get("content", user_message)
|
||||||
|
|
||||||
|
Chats.update_chat_title_by_id(metadata["chat_id"], title)
|
||||||
|
|
||||||
|
await event_emitter(
|
||||||
|
{
|
||||||
|
"type": "chat:title",
|
||||||
|
"data": title,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if title == None and len(messages) == 2:
|
||||||
|
title = messages[0].get("content", user_message)
|
||||||
|
|
||||||
|
Chats.update_chat_title_by_id(metadata["chat_id"], title)
|
||||||
|
|
||||||
|
await event_emitter(
|
||||||
|
{
|
||||||
|
"type": "chat:title",
|
||||||
|
"data": message.get("content", user_message),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if TASKS.TAGS_GENERATION in tasks and tasks[TASKS.TAGS_GENERATION]:
|
||||||
|
res = await generate_chat_tags(
|
||||||
|
request,
|
||||||
|
{
|
||||||
|
"model": message["model"],
|
||||||
|
"messages": messages,
|
||||||
|
"chat_id": metadata["chat_id"],
|
||||||
|
},
|
||||||
|
user,
|
||||||
|
)
|
||||||
|
|
||||||
|
if res and isinstance(res, dict):
|
||||||
|
if len(res.get("choices", [])) == 1:
|
||||||
|
response_message = res.get("choices", [])[0].get(
|
||||||
|
"message", {}
|
||||||
|
)
|
||||||
|
|
||||||
|
tags_string = response_message.get(
|
||||||
|
"content"
|
||||||
|
) or response_message.get("reasoning_content", "")
|
||||||
|
else:
|
||||||
|
tags_string = ""
|
||||||
|
|
||||||
|
tags_string = tags_string[
|
||||||
|
tags_string.find("{") : tags_string.rfind("}") + 1
|
||||||
|
]
|
||||||
|
|
||||||
|
try:
|
||||||
|
tags = json.loads(tags_string).get("tags", [])
|
||||||
|
Chats.update_chat_tags_by_id(
|
||||||
|
metadata["chat_id"], tags, user
|
||||||
|
)
|
||||||
|
|
||||||
|
await event_emitter(
|
||||||
|
{
|
||||||
|
"type": "chat:tags",
|
||||||
|
"data": tags,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
async def process_chat_response(
|
||||||
|
request, response, form_data, user, metadata, model, events, tasks
|
||||||
|
):
|
||||||
event_emitter = None
|
event_emitter = None
|
||||||
event_caller = None
|
event_caller = None
|
||||||
if (
|
if (
|
||||||
@@ -2756,7 +2763,9 @@ async def process_chat_response(
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
await background_tasks_handler()
|
await background_tasks_handler(
|
||||||
|
request, form_data, user, metadata, tasks
|
||||||
|
)
|
||||||
|
|
||||||
if events and isinstance(events, list):
|
if events and isinstance(events, list):
|
||||||
extra_response = {}
|
extra_response = {}
|
||||||
@@ -3513,7 +3522,9 @@ async def process_chat_response(
|
|||||||
|
|
||||||
# Normalize usage data to standard format
|
# Normalize usage data to standard format
|
||||||
raw_usage = data.get("usage", {}) or {}
|
raw_usage = data.get("usage", {}) or {}
|
||||||
raw_usage.update(data.get("timings", {})) # llama.cpp
|
raw_usage.update(
|
||||||
|
data.get("timings", {})
|
||||||
|
) # llama.cpp
|
||||||
if raw_usage:
|
if raw_usage:
|
||||||
usage = normalize_usage(raw_usage)
|
usage = normalize_usage(raw_usage)
|
||||||
await event_emitter(
|
await event_emitter(
|
||||||
@@ -4346,7 +4357,9 @@ async def process_chat_response(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
await background_tasks_handler()
|
await background_tasks_handler(
|
||||||
|
request, form_data, user, metadata, tasks
|
||||||
|
)
|
||||||
except asyncio.CancelledError:
|
except asyncio.CancelledError:
|
||||||
log.warning("Task was cancelled!")
|
log.warning("Task was cancelled!")
|
||||||
await event_emitter({"type": "chat:tasks:cancel"})
|
await event_emitter({"type": "chat:tasks:cancel"})
|
||||||
|
|||||||
Reference in New Issue
Block a user