| 91 | |
| 92 | @dataclass |
| 93 | class Conversation: |
| 94 | role: Role |
| 95 | content: str | dict |
| 96 | # Processed content |
| 97 | saved_content: str | None = None |
| 98 | metadata: str | None = None |
| 99 | image: str | Image | None = None |
| 100 | |
| 101 | def __str__(self) -> str: |
| 102 | metadata_str = self.metadata if self.metadata else "" |
| 103 | return f"{self.role}{metadata_str}\n{self.content}" |
| 104 | |
| 105 | # Human readable format |
| 106 | def get_text(self) -> str: |
| 107 | text = self.saved_content or self.content |
| 108 | match self.role.value: |
| 109 | case Role.TOOL.value: |
| 110 | text = f"Calling tool `{self.metadata}`:\n\n```python\n{text}\n```" |
| 111 | case Role.OBSERVATION.value: |
| 112 | text = f"```python\n{text}\n```" |
| 113 | return text |
| 114 | |
| 115 | # Display as a markdown block |
| 116 | def show(self, placeholder: DeltaGenerator | None = None) -> str: |
| 117 | if placeholder: |
| 118 | message = placeholder |
| 119 | else: |
| 120 | message = self.role.get_message() |
| 121 | |
| 122 | if self.image: |
| 123 | message.image(self.image, width=512) |
| 124 | |
| 125 | if self.role == Role.OBSERVATION: |
| 126 | metadata_str = f"from {self.metadata}" if self.metadata else "" |
| 127 | message = message.expander(f"Observation {metadata_str}") |
| 128 | |
| 129 | text = self.get_text() |
| 130 | if self.role != Role.USER: |
| 131 | show_text = text |
| 132 | else: |
| 133 | splitted = text.split("files uploaded.\n") |
| 134 | if len(splitted) == 1: |
| 135 | show_text = text |
| 136 | else: |
| 137 | # Show expander for document content |
| 138 | doc = splitted[0] |
| 139 | show_text = splitted[-1] |
| 140 | expander = message.expander("File Content") |
| 141 | expander.markdown(doc) |
| 142 | message.markdown(show_text) |
| 143 | |
| 144 | |
| 145 | def postprocess_text(text: str, replace_quote: bool) -> str: |
no outgoing calls
no test coverage detected