mirror of
https://github.com/dograh-hq/dograh.git
synced 2026-07-04 10:52:17 +02:00
fix: safe parse timestamp
This commit is contained in:
parent
ef080d57c8
commit
7aef9c6db5
1 changed files with 26 additions and 9 deletions
|
|
@ -6,6 +6,29 @@ from datetime import datetime
|
||||||
from pipecat.utils.enums import RealtimeFeedbackType
|
from pipecat.utils.enums import RealtimeFeedbackType
|
||||||
|
|
||||||
|
|
||||||
|
def _safe_parse_timestamp(event: dict) -> datetime | None:
|
||||||
|
"""Best-effort parse of an ISO timestamp from an event.
|
||||||
|
|
||||||
|
Returns None if no valid timestamp is available.
|
||||||
|
"""
|
||||||
|
# Prefer payload timestamp when present
|
||||||
|
payload = event.get("payload") or {}
|
||||||
|
candidates = [
|
||||||
|
payload.get("timestamp"),
|
||||||
|
event.get("timestamp"),
|
||||||
|
]
|
||||||
|
|
||||||
|
for ts in candidates:
|
||||||
|
if not ts:
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
return datetime.fromisoformat(ts)
|
||||||
|
except (ValueError, TypeError):
|
||||||
|
continue
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def build_conversation_structure(logs: list[dict]) -> list[dict]:
|
def build_conversation_structure(logs: list[dict]) -> list[dict]:
|
||||||
"""Transform raw call logs into a conversation structure for LLM QA analysis."""
|
"""Transform raw call logs into a conversation structure for LLM QA analysis."""
|
||||||
if not logs:
|
if not logs:
|
||||||
|
|
@ -18,24 +41,18 @@ def build_conversation_structure(logs: list[dict]) -> list[dict]:
|
||||||
if event["type"] == RealtimeFeedbackType.BOT_TEXT.value:
|
if event["type"] == RealtimeFeedbackType.BOT_TEXT.value:
|
||||||
speaker = "assistant"
|
speaker = "assistant"
|
||||||
utterance_text = event["payload"]["text"]
|
utterance_text = event["payload"]["text"]
|
||||||
try:
|
event_time = _safe_parse_timestamp(event) or start_time
|
||||||
event_time = datetime.fromisoformat(event["payload"]["timestamp"])
|
|
||||||
except KeyError:
|
|
||||||
event_time = datetime.fromisoformat(event["timestamp"])
|
|
||||||
elif event["type"] == RealtimeFeedbackType.USER_TRANSCRIPTION.value and event[
|
elif event["type"] == RealtimeFeedbackType.USER_TRANSCRIPTION.value and event[
|
||||||
"payload"
|
"payload"
|
||||||
].get("final", False):
|
].get("final", False):
|
||||||
speaker = "user"
|
speaker = "user"
|
||||||
utterance_text = event["payload"]["text"]
|
utterance_text = event["payload"]["text"]
|
||||||
try:
|
event_time = _safe_parse_timestamp(event) or start_time
|
||||||
event_time = datetime.fromisoformat(event["payload"]["timestamp"])
|
|
||||||
except KeyError:
|
|
||||||
event_time = datetime.fromisoformat(event["timestamp"])
|
|
||||||
elif event["type"] == RealtimeFeedbackType.FUNCTION_CALL_START.value:
|
elif event["type"] == RealtimeFeedbackType.FUNCTION_CALL_START.value:
|
||||||
speaker = "tool_call"
|
speaker = "tool_call"
|
||||||
payload = event["payload"]
|
payload = event["payload"]
|
||||||
utterance_text = payload.get("function_name", "unknown")
|
utterance_text = payload.get("function_name", "unknown")
|
||||||
event_time = datetime.fromisoformat(event["timestamp"])
|
event_time = _safe_parse_timestamp(event) or start_time
|
||||||
else:
|
else:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue