Skip to content

Commit

Permalink
Show errors that occur during streaming (#43)
Browse files Browse the repository at this point in the history
  • Loading branch information
StreetLamb authored Jun 2, 2024
1 parent 5188bfd commit e8e80d1
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 31 deletions.
71 changes: 42 additions & 29 deletions backend/app/core/graph/build.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import asyncio
import json
from collections import defaultdict, deque
from collections.abc import AsyncGenerator
Expand Down Expand Up @@ -428,34 +429,46 @@ async def generator(
for message in messages
]

memory = await AsyncPostgresSaver.from_conn_string(settings.PG_DATABASE_URI)
try:
memory = await AsyncPostgresSaver.from_conn_string(settings.PG_DATABASE_URI)

if team.workflow == "hierarchical":
teams = convert_hierarchical_team_to_dict(team, members)
team_leader = list(teams.keys())[0]
root = create_hierarchical_graph(teams, leader_name=team_leader, memory=memory)
state = {
"messages": formatted_messages,
"team_name": teams[team_leader].name,
"team_members": teams[team_leader].members,
}
else:
member_dict = convert_sequential_team_to_dict(team)
root = create_sequential_graph(member_dict, memory)
state = {
"messages": formatted_messages,
"team_name": team.name,
"team_members": member_dict,
"next": list(member_dict.values())[0].name,
if team.workflow == "hierarchical":
teams = convert_hierarchical_team_to_dict(team, members)
team_leader = list(teams.keys())[0]
root = create_hierarchical_graph(
teams, leader_name=team_leader, memory=memory
)
state = {
"messages": formatted_messages,
"team_name": teams[team_leader].name,
"team_members": teams[team_leader].members,
}
else:
member_dict = convert_sequential_team_to_dict(team)
root = create_sequential_graph(member_dict, memory)
state = {
"messages": formatted_messages,
"team_name": team.name,
"team_members": member_dict,
"next": list(member_dict.values())[0].name,
}
async for output in root.astream_events(
state,
version="v1",
include_names=["work", "delegate", "summarise"],
config={"configurable": {"thread_id": thread_id}},
):
if output["event"] == "on_chain_end":
output_data = output["data"]["output"]
transformed_output_data = convert_messages_and_tasks_to_dict(
output_data
)
formatted_output = f"data: {json.dumps(transformed_output_data)}\n\n"
yield formatted_output
except Exception as e:
error_message = {
"error": str(e),
"details": "An error occurred during streaming.",
}
async for output in root.astream_events(
state,
version="v1",
include_names=["work", "delegate", "summarise"],
config={"configurable": {"thread_id": thread_id}},
):
if output["event"] == "on_chain_end":
output_data = output["data"]["output"]
transformed_output_data = convert_messages_and_tasks_to_dict(output_data)
formatted_output = f"data: {json.dumps(transformed_output_data)}\n\n"
yield formatted_output
yield f"data: {json.dumps(error_message)}\n\n"
await asyncio.sleep(0.1) # Add a small delay to ensure the message is sent
18 changes: 16 additions & 2 deletions frontend/src/components/Teams/ChatTeam.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,10 @@ const MessageBox = ({ message }: { message: Message }) => {
<Tag colorScheme="green" fontWeight={"bold"}>
You
</Tag>
) : member === "Error." ? (
<Tag colorScheme="red" fontWeight={"bold"}>
Error
</Tag>
) : (
member
)
Expand Down Expand Up @@ -265,6 +269,16 @@ const ChatTeam = () => {
const parsed = JSON.parse(jsonStr)
const newMessages: Message[] = []

if (!parsed) continue

if ("error" in parsed) {
newMessages.push({
type: "ai",
content: parsed.error,
member: "Error.",
})
}

if ("messages" in parsed) {
for (const message of parsed.messages) {
newMessages.push({
Expand All @@ -291,7 +305,7 @@ const ChatTeam = () => {
console.error("Failed to parse messages:", error)
return showToast(
"Something went wrong.",
"Unable to parse messages",
"Error parsing messages.",
"error",
)
}
Expand All @@ -312,7 +326,7 @@ const ChatTeam = () => {
showToast("Something went wrong.", `${errDetail}`, "error")
},
onSuccess: () => {
showToast("Success!", "Streaming completed.", "success")
showToast("Streaming completed", "", "success")
},
onSettled: () => {
setIsStreaming(false)
Expand Down

0 comments on commit e8e80d1

Please sign in to comment.