()
| 379 | # ============================================================ |
| 380 | |
| 381 | def main(): |
| 382 | print("=" * 60) |
| 383 | print("Tutorial 07: Auto Compaction 自动压缩演示") |
| 384 | print("=" * 60) |
| 385 | |
| 386 | # --- 构建一个包含很多消息的 session --- |
| 387 | session = Session() |
| 388 | |
| 389 | # 模拟一段长对话 |
| 390 | conversations = [ |
| 391 | ("user", "帮我创建一个 Flask Web 应用"), |
| 392 | ("assistant", "好的,让我先创建项目结构。我会用 bash 来创建目录。"), |
| 393 | ("user", "然后在 src/app.py 里写一个简单的 Hello World"), |
| 394 | ("assistant", "好的,我来创建 src/app.py 文件。TODO: 还需要添加路由测试。"), |
| 395 | ("user", "帮我添加一个 /api/users 的 REST 接口"), |
| 396 | ("assistant", "我来修改 src/app.py,添加用户接口。Next: 需要写单元测试。"), |
| 397 | ("user", "在 tests/test_app.py 里写测试"), |
| 398 | ("assistant", "测试已经写好了。所有 3 个测试都通过了。"), |
| 399 | ("user", "帮我添加数据库连接"), |
| 400 | ("assistant", "我来配置 SQLAlchemy 数据库连接。Remaining: 迁移脚本还没写。"), |
| 401 | ("user", "看看当前的 git 状态"), |
| 402 | ("assistant", "当前有 5 个文件被修改,还没提交。"), |
| 403 | ] |
| 404 | |
| 405 | for role, text in conversations: |
| 406 | if role == "user": |
| 407 | session.messages.append(ConversationMessage.user_text(text)) |
| 408 | else: |
| 409 | session.messages.append(ConversationMessage.assistant_text(text)) |
| 410 | |
| 411 | # 加一些工具使用记录 |
| 412 | session.messages.insert(2, ConversationMessage( |
| 413 | role="assistant", |
| 414 | blocks=( |
| 415 | TextBlock(text="让我创建目录。"), |
| 416 | ToolUseBlock(id="t1", name="bash", input='{"command": "mkdir -p src tests"}'), |
| 417 | ), |
| 418 | )) |
| 419 | session.messages.insert(3, ConversationMessage.tool_result("t1", "bash", "(directory created)")) |
| 420 | |
| 421 | print(f"\n对话总消息数: {len(session.messages)}") |
| 422 | print(f"预估 token 数: {estimate_session_tokens(session)}") |
| 423 | |
| 424 | # --- 1. 测试是否需要压缩(token 阈值设得低一点方便演示)--- |
| 425 | config = CompactionConfig(preserve_recent_messages=4, max_estimated_tokens=50) |
| 426 | print(f"\n需要压缩吗 (阈值={config.max_estimated_tokens} tokens)? {should_compact(session, config)}") |
| 427 | |
| 428 | # --- 2. 执行压缩 --- |
| 429 | result = compact_session(session, config) |
| 430 | |
| 431 | print(f"\n--- 压缩结果 ---") |
| 432 | print(f" 被压缩掉的消息数: {result.removed_message_count}") |
| 433 | print(f" 压缩前消息数: {len(session.messages)}") |
| 434 | print(f" 压缩后消息数: {len(result.compacted_session.messages)}") |
| 435 | print(f" 压缩前 token 数: {estimate_session_tokens(session)}") |
| 436 | print(f" 压缩后 token 数: {estimate_session_tokens(result.compacted_session)}") |
| 437 | |
| 438 | # --- 3. 看看摘要长什么样 --- |
no test coverage detected