Spaces:
Runtime error
Runtime error
changes in structure
Browse files- app/graph.py +2 -1
- app/nodes/email_writing_node.py +5 -18
- app/tools/email_writing_agent_tools.py +7 -4
app/graph.py
CHANGED
|
@@ -22,7 +22,7 @@ from app.database.connection import pool
|
|
| 22 |
from app.utils.embeddings import remote_embeddings
|
| 23 |
from langgraph.checkpoint.postgres import PostgresSaver
|
| 24 |
from langgraph.store.postgres import PostgresStore
|
| 25 |
-
|
| 26 |
|
| 27 |
# Define a standard retry policy for database-heavy nodes
|
| 28 |
db_retry_policy = RetryPolicy(
|
|
@@ -129,6 +129,7 @@ builder.add_conditional_edges(
|
|
| 129 |
)
|
| 130 |
|
| 131 |
|
|
|
|
| 132 |
builder.add_edge("store_memory_and_data_node", END)
|
| 133 |
builder.add_edge("unsafe_emails_node", END)
|
| 134 |
builder.add_edge("archive_node", END)
|
|
|
|
| 22 |
from app.utils.embeddings import remote_embeddings
|
| 23 |
from langgraph.checkpoint.postgres import PostgresSaver
|
| 24 |
from langgraph.store.postgres import PostgresStore
|
| 25 |
+
|
| 26 |
|
| 27 |
# Define a standard retry policy for database-heavy nodes
|
| 28 |
db_retry_policy = RetryPolicy(
|
|
|
|
| 129 |
)
|
| 130 |
|
| 131 |
|
| 132 |
+
|
| 133 |
builder.add_edge("store_memory_and_data_node", END)
|
| 134 |
builder.add_edge("unsafe_emails_node", END)
|
| 135 |
builder.add_edge("archive_node", END)
|
app/nodes/email_writing_node.py
CHANGED
|
@@ -40,23 +40,10 @@ def email_writing_agent_node(state: EmailAgentState) -> dict:
|
|
| 40 |
|
| 41 |
|
| 42 |
|
| 43 |
-
def route_after_tools(state
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
if isinstance(m, ToolMessage)), None)
|
| 48 |
-
|
| 49 |
-
if not last_tool_msg:
|
| 50 |
-
return "email_writing_agent"
|
| 51 |
-
|
| 52 |
-
content_upper = last_tool_msg.content.upper()
|
| 53 |
-
|
| 54 |
-
# logic 1: If we just successfully SENT the email, go to Parser -> Memory
|
| 55 |
-
if last_tool_msg.name == "send_draft_by_id" and "SUCCESS" in content_upper:
|
| 56 |
-
print("--- ROUTER: Send successful. Moving to Parse/Memory. ---")
|
| 57 |
return "store_memory_and_data_node"
|
| 58 |
-
|
| 59 |
-
# logic 2: If we just created a DRAFT (or the send failed)
|
| 60 |
-
# Go back to agent to talk to the user
|
| 61 |
-
print("--- ROUTER: Draft created or Tool failed. Returning to Agent. ---")
|
| 62 |
return "email_writing_agent"
|
|
|
|
| 40 |
|
| 41 |
|
| 42 |
|
| 43 |
+
def route_after_tools(state):
|
| 44 |
+
|
| 45 |
+
if state.get("sent_message_id"):
|
| 46 |
+
print("--- ROUTER: Send successful. Moving to Memory. ---")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
return "store_memory_and_data_node"
|
| 48 |
+
|
|
|
|
|
|
|
|
|
|
| 49 |
return "email_writing_agent"
|
app/tools/email_writing_agent_tools.py
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
|
|
| 1 |
from langgraph.types import interrupt
|
| 2 |
from googleapiclient.errors import HttpError
|
| 3 |
from app.schemas.email_writing_agent_tools_schema import CreateDraftSchema, SendDraftSchema
|
|
@@ -9,8 +10,8 @@ from langchain.tools import ToolRuntime
|
|
| 9 |
from langgraph.types import Command
|
| 10 |
from langgraph.graph import END
|
| 11 |
from langchain_core.messages import ToolMessage,SystemMessage, HumanMessage
|
| 12 |
-
|
| 13 |
from app.gmail_auth import gmail_toolkit ,api_resource
|
|
|
|
| 14 |
@tool(args_schema=CreateDraftSchema)
|
| 15 |
def create_gmail_draft(
|
| 16 |
to: Union[str, list],
|
|
@@ -49,7 +50,8 @@ def create_gmail_draft(
|
|
| 49 |
"draft_id": draft_id,
|
| 50 |
"reply_subject": subject,
|
| 51 |
"reply_email_body": body,
|
| 52 |
-
"messages": [ToolMessage(content, tool_call_id=tool_call_id)]
|
|
|
|
| 53 |
},goto=END
|
| 54 |
)
|
| 55 |
except IndexError:
|
|
@@ -81,13 +83,14 @@ def send_draft(
|
|
| 81 |
return Command(
|
| 82 |
update={
|
| 83 |
"sent_message_id": sent_id,
|
| 84 |
-
"messages": [ToolMessage(content, tool_call_id=tool_call_id)]
|
|
|
|
| 85 |
}
|
| 86 |
)
|
| 87 |
except HttpError as error:
|
| 88 |
error_msg = f"ERROR: {error}"
|
| 89 |
return Command(
|
| 90 |
-
update={"messages": [ToolMessage(error_msg, tool_call_id=tool_call_id)]}
|
| 91 |
)
|
| 92 |
|
| 93 |
|
|
|
|
| 1 |
+
from os import name
|
| 2 |
from langgraph.types import interrupt
|
| 3 |
from googleapiclient.errors import HttpError
|
| 4 |
from app.schemas.email_writing_agent_tools_schema import CreateDraftSchema, SendDraftSchema
|
|
|
|
| 10 |
from langgraph.types import Command
|
| 11 |
from langgraph.graph import END
|
| 12 |
from langchain_core.messages import ToolMessage,SystemMessage, HumanMessage
|
|
|
|
| 13 |
from app.gmail_auth import gmail_toolkit ,api_resource
|
| 14 |
+
|
| 15 |
@tool(args_schema=CreateDraftSchema)
|
| 16 |
def create_gmail_draft(
|
| 17 |
to: Union[str, list],
|
|
|
|
| 50 |
"draft_id": draft_id,
|
| 51 |
"reply_subject": subject,
|
| 52 |
"reply_email_body": body,
|
| 53 |
+
"messages": [ToolMessage(content, tool_call_id=tool_call_id)],
|
| 54 |
+
"name": "create_gmail_draft"
|
| 55 |
},goto=END
|
| 56 |
)
|
| 57 |
except IndexError:
|
|
|
|
| 83 |
return Command(
|
| 84 |
update={
|
| 85 |
"sent_message_id": sent_id,
|
| 86 |
+
"messages": [ToolMessage(content, tool_call_id=tool_call_id)],
|
| 87 |
+
"name": "send_draft"
|
| 88 |
}
|
| 89 |
)
|
| 90 |
except HttpError as error:
|
| 91 |
error_msg = f"ERROR: {error}"
|
| 92 |
return Command(
|
| 93 |
+
update={"messages": [ToolMessage(error_msg, tool_call_id=tool_call_id)], "name": "send_draft"}
|
| 94 |
)
|
| 95 |
|
| 96 |
|