Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions tests/sessions/DESIGN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# 回放一致性框架设计说明

框架以 Python fixture 描述统一轨迹,默认驱动 InMemory 与 SQLite Session/Memory;`REPLAY_MODE=inmemory` 可只跑内存,integration 可用环境变量接入外部 SQL,Redis 未配置时跳过。

比较前递归排序字典,过滤空 Part,并归一化自动 UUID、时间戳和空集合;session id、事件顺序、state、工具参数及 memory 内容仍精确比较。`allowed_diff` 必须限定后端对、完整字段路径并写明原因,禁止宽泛忽略。

Summary 使用确定性 Mock 生成;harness 将文本、版本、更新时间、压缩计数和 session 归属写入 summary anchor metadata,再从各后端回读。文本仅做 Unicode 与空白归一化,版本、归属和覆盖关系严格比较。报告记录 case、后端、session id、event index/summary id、字段路径及双方值。
83 changes: 83 additions & 0 deletions tests/sessions/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Tencent is pleased to support the open source community by making tRPC-Agent-Python available.
#
# Copyright (C) 2026 Tencent. All rights reserved.
#
# tRPC-Agent-Python is licensed under Apache-2.0.
"""Pytest fixtures for replay consistency testing.

每个 fixture 对应一个 replay case,测试类通过 fixture 名称引用。
"""

from __future__ import annotations

import pytest

from .replay_cases import (
ReplayCase,
build_single_turn_text,
build_multi_turn_text,
build_tool_call_response,
build_state_basic_update,
build_state_three_tier,
build_memory_store_search,
build_memory_multi_session,
build_summary_generation,
build_summary_truncation,
build_summary_error_detection,
build_error_duplicate_write,
)


@pytest.fixture(scope="module")
def case_single_turn_text() -> ReplayCase:
return build_single_turn_text()


@pytest.fixture(scope="module")
def case_multi_turn_text() -> ReplayCase:
return build_multi_turn_text()


@pytest.fixture(scope="module")
def case_tool_call_response() -> ReplayCase:
return build_tool_call_response()


@pytest.fixture(scope="module")
def case_state_basic_update() -> ReplayCase:
return build_state_basic_update()


@pytest.fixture(scope="module")
def case_state_three_tier() -> ReplayCase:
return build_state_three_tier()


@pytest.fixture(scope="module")
def case_memory_store_search() -> ReplayCase:
return build_memory_store_search()


@pytest.fixture(scope="module")
def case_memory_multi_session() -> ReplayCase:
return build_memory_multi_session()


@pytest.fixture(scope="module")
def case_summary_generation() -> ReplayCase:
return build_summary_generation()


@pytest.fixture(scope="module")
def case_summary_truncation() -> ReplayCase:
return build_summary_truncation()


@pytest.fixture(scope="module")
def case_summary_error_detection() -> ReplayCase:
return build_summary_error_detection()


@pytest.fixture(scope="module")
def case_error_duplicate_write() -> ReplayCase:
return build_error_duplicate_write()
Loading
Loading