一条完整的对话消息。 和 Tutorial 01 里简单的 Message 不同,这里: - content 不再是一个字符串,而是一个 ContentBlock 列表 - 多了 usage 字段来追踪 token 消耗 对应源码: session.rs:36-40
| 148 | |
| 149 | @dataclass(frozen=True) |
| 150 | class ConversationMessage: |
| 151 | """ |
| 152 | 一条完整的对话消息。 |
| 153 | |
| 154 | 和 Tutorial 01 里简单的 Message 不同,这里: |
| 155 | - content 不再是一个字符串,而是一个 ContentBlock 列表 |
| 156 | - 多了 usage 字段来追踪 token 消耗 |
| 157 | |
| 158 | 对应源码: session.rs:36-40 |
| 159 | """ |
| 160 | role: str # "user" | "assistant" | "tool" | "system" |
| 161 | blocks: tuple[ContentBlock, ...] # 内容块列表(用 tuple 因为不可变) |
| 162 | usage: Optional[TokenUsage] = None # 只有 assistant 消息才有 usage |
| 163 | |
| 164 | # 下面是几个方便创建消息的方法(工厂方法) |
| 165 | # "工厂方法"就是"帮你快速创建对象的函数",省得每次都写一堆参数 |
| 166 | |
| 167 | @staticmethod |
| 168 | def user_text(text: str) -> "ConversationMessage": |
| 169 | """创建一条用户文字消息""" |
| 170 | return ConversationMessage( |
| 171 | role="user", |
| 172 | blocks=(TextBlock(text=text),), |
| 173 | ) |
| 174 | |
| 175 | @staticmethod |
| 176 | def assistant_text(text: str, usage: Optional[TokenUsage] = None) -> "ConversationMessage": |
| 177 | """创建一条助手文字消息""" |
| 178 | return ConversationMessage( |
| 179 | role="assistant", |
| 180 | blocks=(TextBlock(text=text),), |
| 181 | usage=usage, |
| 182 | ) |
| 183 | |
| 184 | @staticmethod |
| 185 | def assistant_with_tool_use( |
| 186 | text: str, tool_id: str, tool_name: str, tool_input: str, |
| 187 | usage: Optional[TokenUsage] = None, |
| 188 | ) -> "ConversationMessage": |
| 189 | """创建一条包含文字和工具调用的助手消息""" |
| 190 | return ConversationMessage( |
| 191 | role="assistant", |
| 192 | blocks=( |
| 193 | TextBlock(text=text), |
| 194 | ToolUseBlock(id=tool_id, name=tool_name, input=tool_input), |
| 195 | ), |
| 196 | usage=usage, |
| 197 | ) |
| 198 | |
| 199 | @staticmethod |
| 200 | def tool_result( |
| 201 | tool_use_id: str, tool_name: str, output: str, is_error: bool = False, |
| 202 | ) -> "ConversationMessage": |
| 203 | """创建一条工具结果消息""" |
| 204 | return ConversationMessage( |
| 205 | role="tool", |
| 206 | blocks=(ToolResultBlock( |
| 207 | tool_use_id=tool_use_id, |
no outgoing calls
no test coverage detected