File size: 2,641 Bytes
55ffb85
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import pathlib
import sys
import unittest


ROOT = pathlib.Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))

from services.context_compressor import (  # noqa: E402
    compact_history,
    extract_request_spec,
    merge_request_spec,
    render_request_spec,
)


class ContextCompressionTests(unittest.TestCase):
    def test_extracts_stable_data_parameters(self):
        spec = extract_request_spec(
            "请下载 2002年8月1日至8月31日 西北太平洋 "
            "120°E–140°E、20°N–40°N 的 ERA5 v10、u10 数据,"
            "深度0-100m,格式NetCDF"
        )
        self.assertEqual(spec["dataset"], ["ERA5"])
        self.assertEqual(sorted(spec["variables"]), ["u10", "v10"])
        self.assertIn("120°E", spec["region"])
        self.assertIn("40°N", spec["region"])
        self.assertEqual(spec["depth"], "0-100m")
        self.assertEqual(spec["format"], "netcdf")
        self.assertIn("2002-08-01", spec["date"])
        self.assertIn("2002-08-31", spec["date"])

    def test_amendment_merges_without_repeating_full_history(self):
        spec = extract_request_spec(
            "下载 2002年8月1日至8月31日 ERA5 v10 "
            "120°E–140°E、20°N–40°N 深度0-100m 格式nc"
        )
        spec = merge_request_spec(
            spec,
            "把格式改成 CSV,深度改为 5m",
            revision=True,
        )
        text = render_request_spec(spec)
        self.assertIn("格式:csv", text)
        self.assertIn("深度:5m", text)
        self.assertIn("变量:v10", text)
        self.assertIn("2002-08-31", text)
        self.assertIn("区域:", text)

    def test_compact_history_is_smaller_and_keeps_parameters(self):
        original = (
            "请下载 2002年8月1日至8月31日 西北太平洋 "
            "120°E–140°E、20°N–40°N 的 ERA5 v10、u10 数据,"
            "深度0-100m,格式NetCDF。请按上述区域逐日导出,"
            "生成可下载链接后返回。" * 3
        )
        messages = [
            {"role": "user", "text": original},
            {"role": "assistant", "text": "已完成,链接 https://x/download/a"},
            {"role": "user", "text": "把格式改成 csv"},
            {"role": "assistant", "text": "已更新 csv 下载链接。"},
        ]
        compact = compact_history(messages)
        self.assertLess(len(compact), len(original))
        self.assertIn("变量:u10、v10", compact)
        self.assertIn("2002-08-31", compact)
        self.assertIn("格式:csv", compact)


if __name__ == "__main__":
    unittest.main()