@huajiwuyan/hello 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +448 -0
- package/package.json +38 -0
- package/templates/claude/commands/hello.md +760 -0
- package/templates/claude/skills/SKILL.md +90 -0
- package/templates/claude/skills/SKILL.toml +7 -0
- package/templates/claude/skills/assets/icon-large.svg +12 -0
- package/templates/claude/skills/assets/icon-small-400px.svg +12 -0
- package/templates/claude/skills/assets/templates/CHANGELOG.md +24 -0
- package/templates/claude/skills/assets/templates/CHANGELOG_{YYYY}.md +25 -0
- package/templates/claude/skills/assets/templates/INDEX.md +36 -0
- package/templates/claude/skills/assets/templates/archive/_index.md +22 -0
- package/templates/claude/skills/assets/templates/context.md +82 -0
- package/templates/claude/skills/assets/templates/modules/_index.md +22 -0
- package/templates/claude/skills/assets/templates/modules/module.md +35 -0
- package/templates/claude/skills/assets/templates/plan/proposal.md +104 -0
- package/templates/claude/skills/assets/templates/plan/tasks.md +49 -0
- package/templates/claude/skills/references/functions/auto.md +217 -0
- package/templates/claude/skills/references/functions/clean.md +167 -0
- package/templates/claude/skills/references/functions/commit.md +374 -0
- package/templates/claude/skills/references/functions/exec.md +178 -0
- package/templates/claude/skills/references/functions/help.md +105 -0
- package/templates/claude/skills/references/functions/init.md +228 -0
- package/templates/claude/skills/references/functions/plan.md +219 -0
- package/templates/claude/skills/references/functions/review.md +146 -0
- package/templates/claude/skills/references/functions/rollback.md +208 -0
- package/templates/claude/skills/references/functions/test.md +153 -0
- package/templates/claude/skills/references/functions/upgrade.md +371 -0
- package/templates/claude/skills/references/functions/validate.md +147 -0
- package/templates/claude/skills/references/rules/package.md +212 -0
- package/templates/claude/skills/references/rules/scaling.md +150 -0
- package/templates/claude/skills/references/rules/state.md +318 -0
- package/templates/claude/skills/references/rules/tools.md +371 -0
- package/templates/claude/skills/references/services/knowledge.md +408 -0
- package/templates/claude/skills/references/services/templates.md +344 -0
- package/templates/claude/skills/references/stages/analyze.md +201 -0
- package/templates/claude/skills/references/stages/design.md +379 -0
- package/templates/claude/skills/references/stages/develop.md +497 -0
- package/templates/claude/skills/references/stages/evaluate.md +286 -0
- package/templates/claude/skills/references/stages/tweak.md +244 -0
- package/templates/claude/skills/scripts/create_package.py +260 -0
- package/templates/claude/skills/scripts/list_packages.py +145 -0
- package/templates/claude/skills/scripts/migrate_package.py +399 -0
- package/templates/claude/skills/scripts/project_stats.py +438 -0
- package/templates/claude/skills/scripts/upgradewiki.py +321 -0
- package/templates/claude/skills/scripts/utils.py +596 -0
- package/templates/claude/skills/scripts/validate_package.py +309 -0
- package/templates/codex/prompts/hello.md +757 -0
- package/templates/codex/skills/SKILL.md +74 -0
- package/templates/codex/skills/SKILL.toml +7 -0
- package/templates/codex/skills/assets/icon-large.svg +12 -0
- package/templates/codex/skills/assets/icon-small-400px.svg +12 -0
- package/templates/codex/skills/assets/templates/CHANGELOG.md +24 -0
- package/templates/codex/skills/assets/templates/CHANGELOG_{YYYY}.md +25 -0
- package/templates/codex/skills/assets/templates/INDEX.md +36 -0
- package/templates/codex/skills/assets/templates/archive/_index.md +22 -0
- package/templates/codex/skills/assets/templates/context.md +82 -0
- package/templates/codex/skills/assets/templates/modules/_index.md +22 -0
- package/templates/codex/skills/assets/templates/modules/module.md +35 -0
- package/templates/codex/skills/assets/templates/plan/proposal.md +104 -0
- package/templates/codex/skills/assets/templates/plan/tasks.md +29 -0
- package/templates/codex/skills/references/functions/auto.md +181 -0
- package/templates/codex/skills/references/functions/brain.md +275 -0
- package/templates/codex/skills/references/functions/clean.md +154 -0
- package/templates/codex/skills/references/functions/commit.md +265 -0
- package/templates/codex/skills/references/functions/debug/condition-based-waiting.md +151 -0
- package/templates/codex/skills/references/functions/debug/defense-in-depth.md +147 -0
- package/templates/codex/skills/references/functions/debug/root-cause-tracing.md +168 -0
- package/templates/codex/skills/references/functions/debug.md +389 -0
- package/templates/codex/skills/references/functions/exec.md +153 -0
- package/templates/codex/skills/references/functions/help.md +101 -0
- package/templates/codex/skills/references/functions/init.md +221 -0
- package/templates/codex/skills/references/functions/plan.md +178 -0
- package/templates/codex/skills/references/functions/review.md +135 -0
- package/templates/codex/skills/references/functions/rlm.md +864 -0
- package/templates/codex/skills/references/functions/rollback.md +190 -0
- package/templates/codex/skills/references/functions/test.md +140 -0
- package/templates/codex/skills/references/functions/upgrade.md +363 -0
- package/templates/codex/skills/references/functions/validate.md +135 -0
- package/templates/codex/skills/references/rules/cache.md +136 -0
- package/templates/codex/skills/references/rules/scaling.md +124 -0
- package/templates/codex/skills/references/rules/state.md +201 -0
- package/templates/codex/skills/references/rules/tools.md +301 -0
- package/templates/codex/skills/references/services/attention.md +53 -0
- package/templates/codex/skills/references/services/knowledge.md +559 -0
- package/templates/codex/skills/references/services/package.md +383 -0
- package/templates/codex/skills/references/services/templates.md +390 -0
- package/templates/codex/skills/references/stages/analyze.md +191 -0
- package/templates/codex/skills/references/stages/design.md +355 -0
- package/templates/codex/skills/references/stages/develop.md +520 -0
- package/templates/codex/skills/references/stages/tweak.md +239 -0
- package/templates/codex/skills/rlm/__init__.py +39 -0
- package/templates/codex/skills/rlm/agent_orchestrator.py +422 -0
- package/templates/codex/skills/rlm/context_manager.py +366 -0
- package/templates/codex/skills/rlm/engine.py +915 -0
- package/templates/codex/skills/rlm/folding.py +391 -0
- package/templates/codex/skills/rlm/repl.py +452 -0
- package/templates/codex/skills/rlm/roles/analyzer.md +66 -0
- package/templates/codex/skills/rlm/roles/designer.md +94 -0
- package/templates/codex/skills/rlm/roles/explorer.md +43 -0
- package/templates/codex/skills/rlm/roles/implementer.md +62 -0
- package/templates/codex/skills/rlm/roles/kb_keeper.md +138 -0
- package/templates/codex/skills/rlm/roles/pkg_keeper.md +163 -0
- package/templates/codex/skills/rlm/roles/reviewer.md +74 -0
- package/templates/codex/skills/rlm/roles/synthesizer.md +90 -0
- package/templates/codex/skills/rlm/roles/tester.md +83 -0
- package/templates/codex/skills/rlm/schemas/agent_result.json +174 -0
- package/templates/codex/skills/rlm/session.py +376 -0
- package/templates/codex/skills/rlm/shared_tasks.py +370 -0
- package/templates/codex/skills/scripts/create_package.py +260 -0
- package/templates/codex/skills/scripts/list_packages.py +145 -0
- package/templates/codex/skills/scripts/migrate_package.py +399 -0
- package/templates/codex/skills/scripts/project_stats.py +438 -0
- package/templates/codex/skills/scripts/upgradewiki.py +321 -0
- package/templates/codex/skills/scripts/utils.py +596 -0
- package/templates/codex/skills/scripts/validate_package.py +309 -0
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
HelloAGENTS-RLM Context Manager
|
|
5
|
+
三层上下文架构实现
|
|
6
|
+
|
|
7
|
+
基于Google ADK设计:
|
|
8
|
+
- Layer 1: Working Context (工作上下文) - 当前活跃
|
|
9
|
+
- Layer 2: Session Events (会话事件) - 可压缩
|
|
10
|
+
- Layer 3: Memory & Artifacts (长期记忆) - 知识库
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from dataclasses import dataclass, field
|
|
14
|
+
from datetime import datetime
|
|
15
|
+
from enum import Enum
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import Any, Dict, List, Optional
|
|
18
|
+
import json
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ContextLayer(Enum):
|
|
22
|
+
"""上下文层级"""
|
|
23
|
+
WORKING = 1 # 工作上下文 (活跃,在LLM context window中)
|
|
24
|
+
SESSION = 2 # 会话事件 (可压缩,内存中)
|
|
25
|
+
MEMORY = 3 # 长期记忆 (持久化,知识库)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclass
|
|
29
|
+
class ContextEvent:
|
|
30
|
+
"""上下文事件"""
|
|
31
|
+
event_type: str
|
|
32
|
+
content: Any
|
|
33
|
+
timestamp: str = ""
|
|
34
|
+
layer: ContextLayer = ContextLayer.SESSION
|
|
35
|
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
36
|
+
|
|
37
|
+
def __post_init__(self):
|
|
38
|
+
if not self.timestamp:
|
|
39
|
+
self.timestamp = datetime.now().strftime("%Y%m%d%H%M%S%f")
|
|
40
|
+
|
|
41
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
42
|
+
return {
|
|
43
|
+
"event_type": self.event_type,
|
|
44
|
+
"content": self.content,
|
|
45
|
+
"timestamp": self.timestamp,
|
|
46
|
+
"layer": self.layer.name,
|
|
47
|
+
"metadata": self.metadata,
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@dataclass
|
|
52
|
+
class CompactionConfig:
|
|
53
|
+
"""压缩配置 (类似Google ADK EventsCompactionConfig)"""
|
|
54
|
+
compaction_interval: int = 10 # 每N个事件触发压缩
|
|
55
|
+
overlap_size: int = 2 # 压缩时保留的重叠事件数
|
|
56
|
+
max_working_tokens: int = 8000 # 工作上下文最大token数
|
|
57
|
+
summarizer_model: str = "gpt-5.2-codex"
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class ContextManager:
|
|
61
|
+
"""
|
|
62
|
+
三层上下文管理器
|
|
63
|
+
|
|
64
|
+
Layer 1 - Working Context:
|
|
65
|
+
- 当前活跃的工作上下文
|
|
66
|
+
- 包含: 系统指令、当前任务、最近对话、活跃子任务摘要
|
|
67
|
+
- 大小限制: < max_working_tokens
|
|
68
|
+
|
|
69
|
+
Layer 2 - Session Events:
|
|
70
|
+
- 可压缩的事件日志
|
|
71
|
+
- 包含: 工具调用、文件操作、子agent交互
|
|
72
|
+
- 压缩策略: 滑动窗口 + LLM摘要
|
|
73
|
+
|
|
74
|
+
Layer 3 - Memory & Artifacts:
|
|
75
|
+
- 长期记忆 (helloagents知识库)
|
|
76
|
+
- 包含: context.md, modules/*.md, archive/
|
|
77
|
+
- 访问方式: 按需读取
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
def __init__(
|
|
81
|
+
self,
|
|
82
|
+
config: Optional[CompactionConfig] = None,
|
|
83
|
+
knowledge_base_path: Optional[Path] = None,
|
|
84
|
+
):
|
|
85
|
+
self.config = config or CompactionConfig()
|
|
86
|
+
self.kb_path = knowledge_base_path or Path.cwd() / "helloagents"
|
|
87
|
+
|
|
88
|
+
# Layer 1: Working Context
|
|
89
|
+
self.working_context: List[ContextEvent] = []
|
|
90
|
+
self.working_tokens: int = 0
|
|
91
|
+
|
|
92
|
+
# Layer 2: Session Events
|
|
93
|
+
self.session_events: List[ContextEvent] = []
|
|
94
|
+
self.compacted_summaries: List[str] = []
|
|
95
|
+
self.events_since_compaction: int = 0
|
|
96
|
+
|
|
97
|
+
# Layer 3: Memory refs (按需加载)
|
|
98
|
+
self.memory_cache: Dict[str, str] = {}
|
|
99
|
+
|
|
100
|
+
# ==================== Layer 1: Working Context ====================
|
|
101
|
+
|
|
102
|
+
def add_to_working(self, event: ContextEvent) -> bool:
|
|
103
|
+
"""
|
|
104
|
+
添加事件到工作上下文
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
是否成功 (可能因超限而失败,触发压缩)
|
|
108
|
+
"""
|
|
109
|
+
estimated_tokens = self._estimate_tokens(event.content)
|
|
110
|
+
|
|
111
|
+
# 检查是否超限
|
|
112
|
+
if self.working_tokens + estimated_tokens > self.config.max_working_tokens:
|
|
113
|
+
# 需要压缩
|
|
114
|
+
self._compact_working_context()
|
|
115
|
+
|
|
116
|
+
self.working_context.append(event)
|
|
117
|
+
self.working_tokens += estimated_tokens
|
|
118
|
+
return True
|
|
119
|
+
|
|
120
|
+
def get_working_context(self) -> List[Dict[str, Any]]:
|
|
121
|
+
"""获取当前工作上下文"""
|
|
122
|
+
return [e.to_dict() for e in self.working_context]
|
|
123
|
+
|
|
124
|
+
def clear_working_context(self):
|
|
125
|
+
"""清空工作上下文 (保留到Session)"""
|
|
126
|
+
for event in self.working_context:
|
|
127
|
+
event.layer = ContextLayer.SESSION
|
|
128
|
+
self.session_events.append(event)
|
|
129
|
+
|
|
130
|
+
self.working_context.clear()
|
|
131
|
+
self.working_tokens = 0
|
|
132
|
+
|
|
133
|
+
def _compact_working_context(self):
|
|
134
|
+
"""压缩工作上下文"""
|
|
135
|
+
if not self.working_context:
|
|
136
|
+
return
|
|
137
|
+
|
|
138
|
+
# 生成摘要
|
|
139
|
+
contents = [str(e.content) for e in self.working_context]
|
|
140
|
+
summary = self._generate_summary("\n".join(contents))
|
|
141
|
+
|
|
142
|
+
# 移动到Session
|
|
143
|
+
for event in self.working_context:
|
|
144
|
+
event.layer = ContextLayer.SESSION
|
|
145
|
+
self.session_events.append(event)
|
|
146
|
+
|
|
147
|
+
# 创建摘要事件
|
|
148
|
+
summary_event = ContextEvent(
|
|
149
|
+
event_type="working_context_summary",
|
|
150
|
+
content=summary,
|
|
151
|
+
layer=ContextLayer.WORKING,
|
|
152
|
+
metadata={"original_count": len(self.working_context)},
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
self.working_context.clear()
|
|
156
|
+
self.working_context.append(summary_event)
|
|
157
|
+
self.working_tokens = self._estimate_tokens(summary)
|
|
158
|
+
|
|
159
|
+
# ==================== Layer 2: Session Events ====================
|
|
160
|
+
|
|
161
|
+
def add_session_event(self, event: ContextEvent):
|
|
162
|
+
"""添加会话事件"""
|
|
163
|
+
event.layer = ContextLayer.SESSION
|
|
164
|
+
self.session_events.append(event)
|
|
165
|
+
self.events_since_compaction += 1
|
|
166
|
+
|
|
167
|
+
# 检查是否需要压缩
|
|
168
|
+
if self.events_since_compaction >= self.config.compaction_interval:
|
|
169
|
+
self._compact_session_events()
|
|
170
|
+
|
|
171
|
+
def get_session_events(
|
|
172
|
+
self,
|
|
173
|
+
limit: Optional[int] = None,
|
|
174
|
+
event_type: Optional[str] = None,
|
|
175
|
+
) -> List[Dict[str, Any]]:
|
|
176
|
+
"""获取会话事件"""
|
|
177
|
+
events = self.session_events
|
|
178
|
+
|
|
179
|
+
if event_type:
|
|
180
|
+
events = [e for e in events if e.event_type == event_type]
|
|
181
|
+
|
|
182
|
+
if limit:
|
|
183
|
+
events = events[-limit:]
|
|
184
|
+
|
|
185
|
+
return [e.to_dict() for e in events]
|
|
186
|
+
|
|
187
|
+
def _compact_session_events(self):
|
|
188
|
+
"""压缩会话事件 (滑动窗口)"""
|
|
189
|
+
if len(self.session_events) < self.config.compaction_interval:
|
|
190
|
+
return
|
|
191
|
+
|
|
192
|
+
# 确定压缩范围
|
|
193
|
+
compact_end = len(self.session_events) - self.config.overlap_size
|
|
194
|
+
to_compact = self.session_events[:compact_end]
|
|
195
|
+
|
|
196
|
+
if not to_compact:
|
|
197
|
+
return
|
|
198
|
+
|
|
199
|
+
# 生成摘要
|
|
200
|
+
contents = [str(e.content) for e in to_compact]
|
|
201
|
+
summary = self._generate_summary("\n".join(contents))
|
|
202
|
+
self.compacted_summaries.append(summary)
|
|
203
|
+
|
|
204
|
+
# 保留overlap部分
|
|
205
|
+
self.session_events = self.session_events[compact_end:]
|
|
206
|
+
self.events_since_compaction = 0
|
|
207
|
+
|
|
208
|
+
# ==================== Layer 3: Memory & Artifacts ====================
|
|
209
|
+
|
|
210
|
+
def load_memory(self, key: str) -> Optional[str]:
|
|
211
|
+
"""
|
|
212
|
+
按需加载长期记忆
|
|
213
|
+
|
|
214
|
+
Args:
|
|
215
|
+
key: 记忆键名 (如 "context", "modules/auth", "changelog")
|
|
216
|
+
"""
|
|
217
|
+
# 检查缓存
|
|
218
|
+
if key in self.memory_cache:
|
|
219
|
+
return self.memory_cache[key]
|
|
220
|
+
|
|
221
|
+
# 构建文件路径
|
|
222
|
+
file_path = self._resolve_memory_path(key)
|
|
223
|
+
if not file_path or not file_path.exists():
|
|
224
|
+
return None
|
|
225
|
+
|
|
226
|
+
try:
|
|
227
|
+
content = file_path.read_text(encoding='utf-8')
|
|
228
|
+
self.memory_cache[key] = content
|
|
229
|
+
return content
|
|
230
|
+
except Exception:
|
|
231
|
+
return None
|
|
232
|
+
|
|
233
|
+
def save_memory(self, key: str, content: str) -> bool:
|
|
234
|
+
"""
|
|
235
|
+
保存到长期记忆
|
|
236
|
+
|
|
237
|
+
Args:
|
|
238
|
+
key: 记忆键名
|
|
239
|
+
content: 内容
|
|
240
|
+
"""
|
|
241
|
+
file_path = self._resolve_memory_path(key)
|
|
242
|
+
if not file_path:
|
|
243
|
+
return False
|
|
244
|
+
|
|
245
|
+
try:
|
|
246
|
+
file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
247
|
+
file_path.write_text(content, encoding='utf-8')
|
|
248
|
+
self.memory_cache[key] = content
|
|
249
|
+
return True
|
|
250
|
+
except Exception:
|
|
251
|
+
return False
|
|
252
|
+
|
|
253
|
+
def _resolve_memory_path(self, key: str) -> Optional[Path]:
|
|
254
|
+
"""解析记忆键到文件路径"""
|
|
255
|
+
key_mapping = {
|
|
256
|
+
"context": self.kb_path / "context.md",
|
|
257
|
+
"index": self.kb_path / "INDEX.md",
|
|
258
|
+
"changelog": self.kb_path / "CHANGELOG.md",
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if key in key_mapping:
|
|
262
|
+
return key_mapping[key]
|
|
263
|
+
|
|
264
|
+
# modules/xxx -> modules/xxx.md
|
|
265
|
+
if key.startswith("modules/"):
|
|
266
|
+
module_name = key.replace("modules/", "")
|
|
267
|
+
return self.kb_path / "modules" / f"{module_name}.md"
|
|
268
|
+
|
|
269
|
+
# 默认作为相对路径
|
|
270
|
+
return self.kb_path / f"{key}.md"
|
|
271
|
+
|
|
272
|
+
def invalidate_memory_cache(self, key: Optional[str] = None):
|
|
273
|
+
"""使记忆缓存失效"""
|
|
274
|
+
if key:
|
|
275
|
+
self.memory_cache.pop(key, None)
|
|
276
|
+
else:
|
|
277
|
+
self.memory_cache.clear()
|
|
278
|
+
|
|
279
|
+
# ==================== 辅助方法 ====================
|
|
280
|
+
|
|
281
|
+
def _estimate_tokens(self, content: Any) -> int:
|
|
282
|
+
"""估算token数 (简化: 4字符约1token)"""
|
|
283
|
+
if content is None:
|
|
284
|
+
return 0
|
|
285
|
+
return len(str(content)) // 4
|
|
286
|
+
|
|
287
|
+
def _generate_summary(self, content: str) -> str:
|
|
288
|
+
"""
|
|
289
|
+
生成摘要
|
|
290
|
+
|
|
291
|
+
注意: 简化实现,实际应调用LLM
|
|
292
|
+
"""
|
|
293
|
+
lines = content.split('\n')
|
|
294
|
+
key_lines = []
|
|
295
|
+
|
|
296
|
+
for line in lines:
|
|
297
|
+
line = line.strip()
|
|
298
|
+
if not line:
|
|
299
|
+
continue
|
|
300
|
+
# 保留关键行
|
|
301
|
+
if any(marker in line.lower() for marker in
|
|
302
|
+
['#', 'error', 'success', 'failed', 'completed', 'created', 'modified']):
|
|
303
|
+
key_lines.append(line)
|
|
304
|
+
|
|
305
|
+
if key_lines:
|
|
306
|
+
return '\n'.join(key_lines[:15])
|
|
307
|
+
|
|
308
|
+
# 截断
|
|
309
|
+
return content[:300] + "..." if len(content) > 300 else content
|
|
310
|
+
|
|
311
|
+
# ==================== 状态管理 ====================
|
|
312
|
+
|
|
313
|
+
def get_status(self) -> Dict[str, Any]:
|
|
314
|
+
"""获取上下文状态"""
|
|
315
|
+
return {
|
|
316
|
+
"working_context": {
|
|
317
|
+
"events": len(self.working_context),
|
|
318
|
+
"tokens": self.working_tokens,
|
|
319
|
+
"limit": self.config.max_working_tokens,
|
|
320
|
+
},
|
|
321
|
+
"session_events": {
|
|
322
|
+
"events": len(self.session_events),
|
|
323
|
+
"compacted_summaries": len(self.compacted_summaries),
|
|
324
|
+
"since_compaction": self.events_since_compaction,
|
|
325
|
+
},
|
|
326
|
+
"memory": {
|
|
327
|
+
"cached_keys": list(self.memory_cache.keys()),
|
|
328
|
+
"kb_path": str(self.kb_path),
|
|
329
|
+
},
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
def export_session(self) -> Dict[str, Any]:
|
|
333
|
+
"""导出会话数据"""
|
|
334
|
+
return {
|
|
335
|
+
"working_context": self.get_working_context(),
|
|
336
|
+
"session_events": self.get_session_events(),
|
|
337
|
+
"compacted_summaries": self.compacted_summaries,
|
|
338
|
+
"memory_cache_keys": list(self.memory_cache.keys()),
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
def reset(self):
|
|
342
|
+
"""重置上下文"""
|
|
343
|
+
self.working_context.clear()
|
|
344
|
+
self.working_tokens = 0
|
|
345
|
+
self.session_events.clear()
|
|
346
|
+
self.compacted_summaries.clear()
|
|
347
|
+
self.events_since_compaction = 0
|
|
348
|
+
self.memory_cache.clear()
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
# ==================== 便捷函数 ====================
|
|
352
|
+
|
|
353
|
+
def create_context_manager(
|
|
354
|
+
compaction_interval: int = 10,
|
|
355
|
+
max_working_tokens: int = 8000,
|
|
356
|
+
kb_path: Optional[str] = None,
|
|
357
|
+
) -> ContextManager:
|
|
358
|
+
"""创建上下文管理器"""
|
|
359
|
+
config = CompactionConfig(
|
|
360
|
+
compaction_interval=compaction_interval,
|
|
361
|
+
max_working_tokens=max_working_tokens,
|
|
362
|
+
)
|
|
363
|
+
return ContextManager(
|
|
364
|
+
config=config,
|
|
365
|
+
knowledge_base_path=Path(kb_path) if kb_path else None,
|
|
366
|
+
)
|