|
5 | 5 | from typing_extensions import override |
6 | 6 |
|
7 | 7 | from askui.models.shared.agent_message_param import ( |
| 8 | + CacheControlEphemeralParam, |
8 | 9 | MessageParam, |
| 10 | + TextBlockParam, |
9 | 11 | ToolParam, |
10 | 12 | ) |
11 | 13 | from askui.models.shared.prompts import ActSystemPrompt |
@@ -173,8 +175,37 @@ def _should_truncate(self) -> bool: |
173 | 175 | @property |
174 | 176 | @override |
175 | 177 | def messages(self) -> list[MessageParam]: |
| 178 | + self._move_cache_control_to_last_non_tool_result_user_message() |
176 | 179 | return self._messages |
177 | 180 |
|
| 181 | + def _move_cache_control_to_last_non_tool_result_user_message(self) -> None: |
| 182 | + found_last = False |
| 183 | + for message in reversed(self._messages): |
| 184 | + if message.role == "user" and not _is_tool_result_user_message(message): |
| 185 | + if not found_last: |
| 186 | + found_last = True |
| 187 | + if isinstance(message.content, str): |
| 188 | + message.content = [ |
| 189 | + TextBlockParam( |
| 190 | + text=message.content, |
| 191 | + cache_control=CacheControlEphemeralParam( |
| 192 | + type="ephemeral", |
| 193 | + ), |
| 194 | + ) |
| 195 | + ] |
| 196 | + elif len(message.content) > 0: |
| 197 | + last_content = message.content[-1] |
| 198 | + if hasattr(last_content, "cache_control"): |
| 199 | + last_content.cache_control = CacheControlEphemeralParam( |
| 200 | + type="ephemeral", |
| 201 | + ) |
| 202 | + else: |
| 203 | + if isinstance(message.content, list) and message.content: |
| 204 | + last_content = message.content[-1] |
| 205 | + if hasattr(last_content, "cache_control"): |
| 206 | + last_content.cache_control = None |
| 207 | + break |
| 208 | + |
178 | 209 | def _truncate(self) -> None: # noqa: C901 |
179 | 210 | messages_to_remove_min = min( |
180 | 211 | len(self._messages) - self._max_messages_after_truncation, 0 |
|
0 commit comments