fix(chats): filter messages to include only relevant user and assistant content in chat retrieval
Browse filesfix(message): change links type from HttpUrl to string for consistency
fix(agent): ensure links are converted to strings when structuring output
- api/routers/chats.py +12 -3
- db/schemas/message.py +2 -2
- workflow/agent.py +2 -2
api/routers/chats.py
CHANGED
|
@@ -69,7 +69,18 @@ def get_user_chats(*, db: Session = Depends(get_db), user_id: uuid.UUID = Depend
|
|
| 69 |
def get_single_chat_with_messages(*, chat_id: uuid.UUID, user_id: uuid.UUID = Depends(get_current_user), db: Session = Depends(get_db)):
|
| 70 |
"""Retrieves a specific chat with all its messages."""
|
| 71 |
chat = get_chat_for_user(chat_id, user_id, db)
|
| 72 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 73 |
|
| 74 |
@router.patch("/{chat_id}", response_model=ChatReadSimple)
|
| 75 |
def rename_chat(*, chat_id: uuid.UUID, chat_update: ChatUpdate, user_id: uuid.UUID = Depends(get_current_user), db: Session = Depends(get_db)):
|
|
@@ -117,7 +128,6 @@ async def post_message_and_get_response(
|
|
| 117 |
final_answer = response["answer"]
|
| 118 |
links = response["links"]
|
| 119 |
updated_messages_from_agent = response["messages"]
|
| 120 |
-
|
| 121 |
# 6. Isolate the messages that are new to this turn
|
| 122 |
new_lc_messages = updated_messages_from_agent[initial_message_count - 1:]
|
| 123 |
|
|
@@ -137,5 +147,4 @@ async def post_message_and_get_response(
|
|
| 137 |
|
| 138 |
# 9. Find the final AI message from the list of newly saved messages.
|
| 139 |
final_ai_message = newly_created_db_messages[-1]
|
| 140 |
-
|
| 141 |
return final_ai_message
|
|
|
|
| 69 |
def get_single_chat_with_messages(*, chat_id: uuid.UUID, user_id: uuid.UUID = Depends(get_current_user), db: Session = Depends(get_db)):
|
| 70 |
"""Retrieves a specific chat with all its messages."""
|
| 71 |
chat = get_chat_for_user(chat_id, user_id, db)
|
| 72 |
+
filtered_messages = [
|
| 73 |
+
msg for msg in chat.messages
|
| 74 |
+
if msg.role == 'user' or (msg.role == 'assistant' and msg.content)
|
| 75 |
+
]
|
| 76 |
+
|
| 77 |
+
return ChatReadWithMessages(
|
| 78 |
+
id=chat.id,
|
| 79 |
+
title=chat.title,
|
| 80 |
+
created_at=chat.created_at,
|
| 81 |
+
updated_at=chat.updated_at,
|
| 82 |
+
messages=filtered_messages
|
| 83 |
+
)
|
| 84 |
|
| 85 |
@router.patch("/{chat_id}", response_model=ChatReadSimple)
|
| 86 |
def rename_chat(*, chat_id: uuid.UUID, chat_update: ChatUpdate, user_id: uuid.UUID = Depends(get_current_user), db: Session = Depends(get_db)):
|
|
|
|
| 128 |
final_answer = response["answer"]
|
| 129 |
links = response["links"]
|
| 130 |
updated_messages_from_agent = response["messages"]
|
|
|
|
| 131 |
# 6. Isolate the messages that are new to this turn
|
| 132 |
new_lc_messages = updated_messages_from_agent[initial_message_count - 1:]
|
| 133 |
|
|
|
|
| 147 |
|
| 148 |
# 9. Find the final AI message from the list of newly saved messages.
|
| 149 |
final_ai_message = newly_created_db_messages[-1]
|
|
|
|
| 150 |
return final_ai_message
|
db/schemas/message.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
import uuid
|
| 2 |
from datetime import datetime
|
| 3 |
-
from pydantic import BaseModel, Field,
|
| 4 |
from typing import Optional
|
| 5 |
|
| 6 |
# -------------------
|
|
@@ -17,7 +17,7 @@ class MessageRead(BaseModel):
|
|
| 17 |
role: str
|
| 18 |
created_at: datetime
|
| 19 |
|
| 20 |
-
links: Optional[list[
|
| 21 |
|
| 22 |
raw_content: Optional[str] = Field(None, alias='content', exclude=True)
|
| 23 |
answer: Optional[str] = Field(None, alias='answer', exclude=True)
|
|
|
|
| 1 |
import uuid
|
| 2 |
from datetime import datetime
|
| 3 |
+
from pydantic import BaseModel, Field, computed_field
|
| 4 |
from typing import Optional
|
| 5 |
|
| 6 |
# -------------------
|
|
|
|
| 17 |
role: str
|
| 18 |
created_at: datetime
|
| 19 |
|
| 20 |
+
links: Optional[list[str]] = None
|
| 21 |
|
| 22 |
raw_content: Optional[str] = Field(None, alias='content', exclude=True)
|
| 23 |
answer: Optional[str] = Field(None, alias='answer', exclude=True)
|
workflow/agent.py
CHANGED
|
@@ -44,14 +44,14 @@ def agent(messages: list[BaseMessage], config: RunnableConfig):
|
|
| 44 |
|
| 45 |
# Check if any tools other than search_memories were called
|
| 46 |
other_tools_called = any(name != "search_memories" for name in tool_names_called)
|
| 47 |
-
|
| 48 |
if tool_calls_count > 0 and other_tools_called:
|
| 49 |
# Structure the final output
|
| 50 |
structured_output = (
|
| 51 |
get_structued_output(llm_response.content).result().model_dump()
|
| 52 |
)
|
| 53 |
answer = structured_output["text"]
|
| 54 |
-
links = structured_output.get("links", [])
|
| 55 |
else:
|
| 56 |
answer = llm_response.content
|
| 57 |
|
|
|
|
| 44 |
|
| 45 |
# Check if any tools other than search_memories were called
|
| 46 |
other_tools_called = any(name != "search_memories" for name in tool_names_called)
|
| 47 |
+
|
| 48 |
if tool_calls_count > 0 and other_tools_called:
|
| 49 |
# Structure the final output
|
| 50 |
structured_output = (
|
| 51 |
get_structued_output(llm_response.content).result().model_dump()
|
| 52 |
)
|
| 53 |
answer = structured_output["text"]
|
| 54 |
+
links = [str(link) for link in structured_output.get("links", [])]
|
| 55 |
else:
|
| 56 |
answer = llm_response.content
|
| 57 |
|