Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Adds last update ts for sessions #1192

Merged
merged 3 commits into from
Oct 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion backend/app/services/mongo/explore.py
Original file line number Diff line number Diff line change
Expand Up @@ -1280,7 +1280,7 @@ async def create_ab_tests_table(project_id: str, limit: int = 1000) -> List[ABTe
"last_task_ts": 1,
}
},
{"$sort": {"first_task_timestamp": -1}},
{"$sort": {"first_task_ts": -1}},
]
)
.to_list(length=limit)
Expand Down
6 changes: 6 additions & 0 deletions backend/app/services/mongo/triggers.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,17 @@ def aggregate_tasks_into_sessions(tasks: List[Task], project_id: str) -> List[Se
session_length=1,
tasks=[task],
preview=task.preview(),
last_message_ts=task.created_at,
)
else:
if task.created_at < sessions[task.session_id].created_at:
sessions[task.session_id].created_at = task.created_at
sessions[task.session_id].preview = task.preview()
if (
sessions[task.session_id].last_message_ts is not None
and task.created_at > sessions[task.session_id].last_message_ts
):
sessions[task.session_id].last_message_ts = task.created_at
sessions[task.session_id].session_length += 1
session_tasks = sessions[task.session_id].tasks
if session_tasks is not None:
Expand Down
16 changes: 13 additions & 3 deletions extractor/extractor/services/pipelines.py
Original file line number Diff line number Diff line change
Expand Up @@ -356,8 +356,13 @@ async def run_events(
self.workload.jobs[result.job_id].metadata
)
task = message.metadata.get("task", None)
task_id = task.id if task is not None else None
session_id = task.session_id if task is not None else None
try:
valid_task = Task.model_validate(task)
except Exception as e:
logger.error(f"Error validating task: {e}")
continue
task_id = valid_task.id
session_id = valid_task.session_id

# Store the LLM call in the database
llm_call = result.metadata.get("llm_call", None)
Expand All @@ -383,7 +388,7 @@ async def run_events(
webhook=event_definition.webhook,
org_id=self.org_id,
event_definition=event_definition,
task=task,
task=valid_task,
score_range=result.metadata.get("score_range", None),
)

Expand Down Expand Up @@ -468,6 +473,7 @@ async def compute_session_info_pipeline(self) -> Dict[str, SessionStats]:
- Most common sentiment label
- Most common language
- Most common flag
- Last message timestamp
"""
outputs: Dict[str, SessionStats] = {}

Expand Down Expand Up @@ -495,6 +501,7 @@ async def compute_session_info_pipeline(self) -> Dict[str, SessionStats]:
sentiment_score: list = []
sentiment_magnitude: list = []
preview = ""
last_message_ts = None

valid_tasks = [Task.model_validate(task) for task in tasks]
for valid_task in valid_tasks:
Expand All @@ -504,6 +511,8 @@ async def compute_session_info_pipeline(self) -> Dict[str, SessionStats]:
if valid_task.sentiment.magnitude is not None:
sentiment_magnitude.append(valid_task.sentiment.magnitude)
preview += valid_task.preview() + "\n"
if last_message_ts is None or valid_task.created_at > last_message_ts:
last_message_ts = valid_task.created_at

if len(valid_tasks) > 0:
avg_sentiment_score = None
Expand Down Expand Up @@ -550,6 +559,7 @@ async def compute_session_info_pipeline(self) -> Dict[str, SessionStats]:
"$set": {
"stats": session_task_info.model_dump(),
"preview": preview if preview else None,
"last_message_ts": last_message_ts,
}
},
)
Expand Down
19 changes: 10 additions & 9 deletions phospho-python/phospho/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,7 @@ class Session(ProjectElementBaseModel):
# Session length is computed dynamically. It may be None if not computed
session_length: int = 0
stats: SessionStats = Field(default_factory=SessionStats)
last_message_ts: Optional[int] = None

@field_serializer("metadata")
def serialize_metadata(self, metadata: dict, _info):
Expand Down Expand Up @@ -325,17 +326,17 @@ def from_previous(cls, project_data: dict) -> "Project":
if "events" in project_data["settings"].keys():
for event_name, event in project_data["settings"]["events"].items():
if "event_name" not in event.keys():
project_data["settings"]["events"][event_name]["event_name"] = (
event_name
)
project_data["settings"]["events"][event_name][
"event_name"
] = event_name
if "org_id" not in event.keys():
project_data["settings"]["events"][event_name]["org_id"] = (
project_data["org_id"]
)
project_data["settings"]["events"][event_name][
"org_id"
] = project_data["org_id"]
if "project_id" not in event.keys():
project_data["settings"]["events"][event_name]["project_id"] = (
project_data["id"]
)
project_data["settings"]["events"][event_name][
"project_id"
] = project_data["id"]

# Transition dashboard_tiles to lowercase and new fields
if "dashboard_tiles" in project_data["settings"].keys():
Expand Down
2 changes: 1 addition & 1 deletion phospho-python/phospho/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def generate_timestamp() -> int:

def generate_uuid(prefix: str = "") -> str:
"""
Add a prefiw if needed to the uuid
Add a prefix if needed to the uuid
Example: generate_uuid("file_") to have a file_id
"""
value = uuid.uuid4().hex
Expand Down
7 changes: 0 additions & 7 deletions platform/components/abtesting/abtesting-dataviz.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,6 @@ export const ABTestingDataviz = () => {
if (res === undefined) return undefined;
if (!res.abtests) return null;
const abtests = res.abtests as ABTest[];
// Round the score and score_std to 2 decimal places
abtests.forEach((abtest) => {
abtest.score = Math.round(abtest.score * 10000) / 100;
if (abtest.score_std) {
abtest.score_std = Math.round(abtest?.score_std * 10000) / 100;
}
});
return abtests;
}),
{
Expand Down
4 changes: 3 additions & 1 deletion platform/models/models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ export interface Session {
environment?: string;
notes?: string;
session_length?: number;
stats: Stats;
last_message_ts?: number;
}

export interface Stats {
Expand All @@ -84,10 +86,10 @@ export interface Stats {
most_common_flag: string;
human_eval: string;
}

export interface SessionWithEvents extends Session {
events: Event[];
tasks: Task[];
stats: Stats;
users: UserMetadata[];
}

Expand Down
Loading