from contextlib import contextmanager from datetime import datetime from typing import Optional, Union from extensions.ext_database import db from models.model import Message def filter_none_values(data: dict): new_data = {} for key, value in data.items(): if value is None: continue if isinstance(value, datetime): new_data[key] = value.isoformat() else: new_data[key] = value return new_data def get_message_data(message_id: str): return db.session.query(Message).filter(Message.id == message_id).first() @contextmanager def measure_time(): timing_info = {"start": datetime.now(), "end": None} try: yield timing_info finally: timing_info["end"] = datetime.now() def replace_text_with_content(data): if isinstance(data, dict): new_data = {} for key, value in data.items(): if key == "text": new_data["content"] = value else: new_data[key] = replace_text_with_content(value) return new_data elif isinstance(data, list): return [replace_text_with_content(item) for item in data] else: return data def generate_dotted_order( run_id: str, start_time: Union[str, datetime], parent_dotted_order: Optional[str] = None ) -> str: """ generate dotted_order for langsmith """ start_time = datetime.fromisoformat(start_time) if isinstance(start_time, str) else start_time timestamp = start_time.strftime("%Y%m%dT%H%M%S%f")[:-3] + "Z" current_segment = f"{timestamp}{run_id}" if parent_dotted_order is None: return current_segment return f"{parent_dotted_order}.{current_segment}"