| 
									
										
										
										
											2024-06-26 17:33:29 +08:00
										 |  |  | from contextlib import contextmanager | 
					
						
							|  |  |  | from datetime import datetime | 
					
						
							| 
									
										
										
										
											2024-11-19 21:08:23 +08:00
										 |  |  | from typing import Optional, Union | 
					
						
							| 
									
										
										
										
											2024-06-26 17:33:29 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | from extensions.ext_database import db | 
					
						
							|  |  |  | from models.model import Message | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def filter_none_values(data: dict): | 
					
						
							| 
									
										
										
										
											2024-09-21 22:56:37 +08:00
										 |  |  |     new_data = {} | 
					
						
							| 
									
										
										
										
											2024-06-26 17:33:29 +08:00
										 |  |  |     for key, value in data.items(): | 
					
						
							|  |  |  |         if value is None: | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         if isinstance(value, datetime): | 
					
						
							| 
									
										
										
										
											2024-09-21 22:56:37 +08:00
										 |  |  |             new_data[key] = value.isoformat() | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             new_data[key] = value | 
					
						
							|  |  |  |     return new_data | 
					
						
							| 
									
										
										
										
											2024-06-26 17:33:29 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-25 16:24:52 +08:00
										 |  |  | def get_message_data(message_id: str): | 
					
						
							| 
									
										
										
										
											2024-06-26 17:33:29 +08:00
										 |  |  |     return db.session.query(Message).filter(Message.id == message_id).first() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @contextmanager | 
					
						
							|  |  |  | def measure_time(): | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |     timing_info = {"start": datetime.now(), "end": None} | 
					
						
							| 
									
										
										
										
											2024-06-26 17:33:29 +08:00
										 |  |  |     try: | 
					
						
							|  |  |  |         yield timing_info | 
					
						
							|  |  |  |     finally: | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |         timing_info["end"] = datetime.now() | 
					
						
							| 
									
										
										
										
											2024-06-26 17:33:29 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def replace_text_with_content(data): | 
					
						
							|  |  |  |     if isinstance(data, dict): | 
					
						
							|  |  |  |         new_data = {} | 
					
						
							|  |  |  |         for key, value in data.items(): | 
					
						
							| 
									
										
										
										
											2024-09-10 17:00:20 +08:00
										 |  |  |             if key == "text": | 
					
						
							|  |  |  |                 new_data["content"] = value | 
					
						
							| 
									
										
										
										
											2024-06-26 17:33:29 +08:00
										 |  |  |             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 | 
					
						
							| 
									
										
										
										
											2024-11-19 21:08:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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}" |