|
10 | 10 | class FsCli(BaseReactStream): |
11 | 11 | """FsCli agent with system prompt.""" |
12 | 12 |
|
13 | | - def __init__(self, working_dir: str, **kwargs): |
| 13 | + def __init__( |
| 14 | + self, |
| 15 | + working_dir: str, |
| 16 | + summary_params: dict | None = None, |
| 17 | + compact_params: dict | None = None, |
| 18 | + **kwargs, |
| 19 | + ): |
14 | 20 | super().__init__(**kwargs) |
15 | 21 | self.working_dir: str = working_dir |
| 22 | + self.summary_params: dict = summary_params or {} |
| 23 | + self.compact_params: dict = compact_params or {} |
| 24 | + |
16 | 25 | self.messages: list[Message] = [] |
| 26 | + self.previous_summary: str = "" |
| 27 | + |
| 28 | + async def reset_history(self) -> str: |
| 29 | + """Reset conversation history using summary. |
| 30 | +
|
| 31 | + Summarizes current messages to memory files and clears history. |
| 32 | + """ |
| 33 | + if not self.messages: |
| 34 | + self.messages.clear() |
| 35 | + self.previous_summary = "" |
| 36 | + return "No history to reset." |
17 | 37 |
|
18 | | - def reset_history(self): |
19 | | - """Reset conversation history.""" |
| 38 | + # Import required modules |
| 39 | + from ..fs import FsSummarizer |
| 40 | + |
| 41 | + # Summarize current conversation and save to memory files |
| 42 | + current_date = datetime.now().strftime("%Y-%m-%d") |
| 43 | + summarizer = FsSummarizer(tools=self.tools, **(self.summary_params or {})) |
| 44 | + |
| 45 | + result = await summarizer.call( |
| 46 | + messages=self.messages, |
| 47 | + date=current_date, |
| 48 | + service_context=self.service_context, |
| 49 | + ) |
| 50 | + |
| 51 | + # Clear messages (no previous_summary update, as summarizer saves to files) |
20 | 52 | self.messages.clear() |
21 | | - return self |
| 53 | + self.previous_summary = "" |
| 54 | + |
| 55 | + return f"History saved to memory files and reset. Result: {result.get('answer', 'Done')}" |
| 56 | + |
| 57 | + async def compact_history(self) -> str: |
| 58 | + """Compact history then reset. |
| 59 | +
|
| 60 | + First compacts messages if they exceed token limits (generating a summary), |
| 61 | + then calls reset_history to save to files and clear. |
| 62 | + """ |
| 63 | + if not self.messages: |
| 64 | + return "No history to compact." |
| 65 | + |
| 66 | + # Import required modules |
| 67 | + from ..fs import FsCompactor |
| 68 | + |
| 69 | + # Step 1: Compact messages |
| 70 | + compactor = FsCompactor(**(self.compact_params or {})) |
| 71 | + compact_result = await compactor.call( |
| 72 | + messages=self.messages, |
| 73 | + previous_summary=self.previous_summary, |
| 74 | + service_context=self.service_context, |
| 75 | + ) |
| 76 | + |
| 77 | + compacted_messages = compact_result.get("messages", self.messages) |
| 78 | + is_compacted = compact_result.get("compacted", False) |
| 79 | + |
| 80 | + if not is_compacted: |
| 81 | + return "History is within token limits, no compaction needed." |
| 82 | + |
| 83 | + # Step 2: Extract summary from compacted messages |
| 84 | + # The first message contains the summary wrapped in compaction_summary_format |
| 85 | + tokens_before = compact_result.get("tokens_before", 0) |
| 86 | + |
| 87 | + if compacted_messages and compacted_messages[0].role == Role.USER: |
| 88 | + # Extract summary content from the first message |
| 89 | + summary_content = compacted_messages[0].content |
| 90 | + self.previous_summary = summary_content |
| 91 | + |
| 92 | + # Step 3: Update messages and call reset_history to save and clear |
| 93 | + self.messages = compacted_messages |
| 94 | + reset_result = await self.reset_history() |
| 95 | + |
| 96 | + return f"History compacted from {tokens_before} tokens. {reset_result}" |
22 | 97 |
|
23 | 98 | async def build_messages(self) -> list[Message]: |
24 | 99 | """Build system prompt message.""" |
25 | 100 | current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S %A") |
26 | | - system_prompt = self.prompt_format("system_prompt", workspace_dir=self.working_dir, current_time=current_time) |
| 101 | + |
| 102 | + system_prompt = self.prompt_format( |
| 103 | + "system_prompt", |
| 104 | + workspace_dir=self.working_dir, |
| 105 | + current_time=current_time, |
| 106 | + has_previous_summary=bool(self.previous_summary), |
| 107 | + previous_summary=self.previous_summary or "", |
| 108 | + ) |
27 | 109 |
|
28 | 110 | return [ |
29 | 111 | Message(role=Role.SYSTEM, content=system_prompt), |
|
0 commit comments