message.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. """消息系统"""
  2. import uuid
  3. from typing import Optional, Dict, Any, Literal
  4. from datetime import datetime
  5. from pydantic import BaseModel
  6. MessageRole = Literal["user", "assistant", "system", "tool"]
  7. class Message(BaseModel):
  8. """消息类"""
  9. content: str
  10. role: MessageRole
  11. message_id: str = ""
  12. conversation_id: str = ""
  13. parent_id: Optional[str] = None
  14. branch_point: bool = False
  15. timestamp: datetime = None
  16. metadata: Optional[Dict[str, Any]] = None
  17. def __init__(self, content: str, role: MessageRole, **kwargs):
  18. super().__init__(
  19. content=content,
  20. role=role,
  21. message_id=kwargs.get("message_id", uuid.uuid4().hex[:12]),
  22. conversation_id=kwargs.get("conversation_id", ""),
  23. parent_id=kwargs.get("parent_id"),
  24. branch_point=kwargs.get("branch_point", False),
  25. timestamp=kwargs.get("timestamp", datetime.now()),
  26. metadata=kwargs.get("metadata", {}),
  27. )
  28. def to_dict(self, full: bool = False) -> Dict[str, Any]:
  29. if full:
  30. return {
  31. "role": self.role,
  32. "content": self.content,
  33. "message_id": self.message_id,
  34. "conversation_id": self.conversation_id,
  35. "parent_id": self.parent_id,
  36. "branch_point": self.branch_point,
  37. "timestamp": self.timestamp.isoformat() if self.timestamp else None,
  38. "metadata": self.metadata,
  39. }
  40. return {"role": self.role, "content": self.content}
  41. def __str__(self) -> str:
  42. return f"[{self.role}] {self.content}"