liquid-loop 0.1.1__tar.gz
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.
- liquid_loop-0.1.1/LICENSE +21 -0
- liquid_loop-0.1.1/PKG-INFO +252 -0
- liquid_loop-0.1.1/README.md +213 -0
- liquid_loop-0.1.1/liquid_loop/__init__.py +72 -0
- liquid_loop-0.1.1/liquid_loop/cli.py +182 -0
- liquid_loop-0.1.1/liquid_loop/entropy.py +56 -0
- liquid_loop-0.1.1/liquid_loop/storage.py +44 -0
- liquid_loop-0.1.1/liquid_loop/workspace.py +130 -0
- liquid_loop-0.1.1/liquid_loop.egg-info/PKG-INFO +252 -0
- liquid_loop-0.1.1/liquid_loop.egg-info/SOURCES.txt +14 -0
- liquid_loop-0.1.1/liquid_loop.egg-info/dependency_links.txt +1 -0
- liquid_loop-0.1.1/liquid_loop.egg-info/entry_points.txt +2 -0
- liquid_loop-0.1.1/liquid_loop.egg-info/requires.txt +13 -0
- liquid_loop-0.1.1/liquid_loop.egg-info/top_level.txt +1 -0
- liquid_loop-0.1.1/pyproject.toml +92 -0
- liquid_loop-0.1.1/setup.cfg +4 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Fei Ge
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: liquid-loop
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: Self-Organizing Cognitive Memory for AI Agents — Liquid Loop theory implementation
|
|
5
|
+
Author-email: Fei Ge <feixubuke@example.com>
|
|
6
|
+
Maintainer-email: Fei Ge <feixubuke@example.com>
|
|
7
|
+
License: MIT
|
|
8
|
+
Project-URL: Homepage, https://gitee.com/feixubuke/liquid-loop
|
|
9
|
+
Project-URL: Repository, https://gitee.com/feixubuke/liquid-loop
|
|
10
|
+
Project-URL: Documentation, https://liquid-loop.readthedocs.io
|
|
11
|
+
Project-URL: Issues, https://gitee.com/feixubuke/liquid-loop/issues
|
|
12
|
+
Project-URL: Changelog, https://gitee.com/feixubuke/liquid-loop/blob/main/CHANGELOG.md
|
|
13
|
+
Keywords: agent-memory,cognitive-architecture,self-organizing,liquid-loop,entropy,ai-agents,memory-management
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Intended Audience :: Science/Research
|
|
17
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
23
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
24
|
+
Requires-Python: >=3.10
|
|
25
|
+
Description-Content-Type: text/markdown
|
|
26
|
+
License-File: LICENSE
|
|
27
|
+
Requires-Dist: click>=8.1.0
|
|
28
|
+
Requires-Dist: pyyaml>=6.0
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: pytest>=7.4.0; extra == "dev"
|
|
31
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
32
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
33
|
+
Requires-Dist: mypy>=1.5.0; extra == "dev"
|
|
34
|
+
Provides-Extra: docs
|
|
35
|
+
Requires-Dist: mkdocs>=1.5.0; extra == "docs"
|
|
36
|
+
Requires-Dist: mkdocs-material>=9.4.0; extra == "docs"
|
|
37
|
+
Requires-Dist: mkdocstrings[python]>=0.24.0; extra == "docs"
|
|
38
|
+
Dynamic: license-file
|
|
39
|
+
|
|
40
|
+
# Liquid Loop
|
|
41
|
+
|
|
42
|
+
> **Self-Organizing Cognitive Memory for AI Agents** — Zero LLM dependency, pure Python implementation of the Liquid Loop theory.
|
|
43
|
+
|
|
44
|
+
[](https://pypi.org/project/liquid-loop/)
|
|
45
|
+
[](https://pypi.org/project/liquid-loop/)
|
|
46
|
+
[](https://opensource.org/licenses/MIT)
|
|
47
|
+
[](https://gitee.com/feixubuke/liquid-loop)
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 核心理念
|
|
52
|
+
|
|
53
|
+
**当前所有 Agent 记忆系统的共同缺陷:依赖外部编辑。**
|
|
54
|
+
|
|
55
|
+
- 图数据库 → 需要 LLM 诊断器做 Split/Merge/Update
|
|
56
|
+
- 向量检索 → 需要外部评分+排序
|
|
57
|
+
- LLM 摘要 → 需要外部提取+压缩
|
|
58
|
+
- 结构化 Schema → 需要外部设计+维护
|
|
59
|
+
|
|
60
|
+
**Liquid Loop 提出第三条路:自组织记忆。**
|
|
61
|
+
|
|
62
|
+
- 不需要外部编辑 → 证据一致性自动驱动结晶
|
|
63
|
+
- 不需要检索排序 → 熵值作为天然认知健康指标
|
|
64
|
+
- 不需要 LLM 介入管理 → LLM 只接触数据,不管理数据
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 核心概念
|
|
69
|
+
|
|
70
|
+
| 概念 | 物理隐喻 | 作用 |
|
|
71
|
+
|------|---------|------|
|
|
72
|
+
| **Anchor** 锚点 | 晶种 | 认知关注点,有稳定性值 s ∈ [0,1] |
|
|
73
|
+
| **Evidence** 证据 | 附着粒子 | 锚点下的具体观察,权重指数衰减 w×0.95ᵗ |
|
|
74
|
+
| **Memory** 结晶 | 结晶体 | 2+ 条一致 Evidence 自动凝聚,有置信度 c |
|
|
75
|
+
| **Entropy** 熵值 | 流体无序度 | 四维加权:drift×0.25 + conflict×0.25 + fragmentation×0.25 + gap×0.25 |
|
|
76
|
+
|
|
77
|
+
**状态判定:**
|
|
78
|
+
```
|
|
79
|
+
GREEN (entropy < 0.3) — 认知健康
|
|
80
|
+
YELLOW (0.3 ≤ entropy < 0.6) — 需关注
|
|
81
|
+
RED (entropy ≥ 0.6) — 需清理
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 快速开始
|
|
87
|
+
|
|
88
|
+
### 安装
|
|
89
|
+
```bash
|
|
90
|
+
pip install liquid-loop
|
|
91
|
+
# 国内镜像自动加速:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple liquid-loop
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### 3 分钟上手
|
|
95
|
+
```python
|
|
96
|
+
from liquid_loop import WorkspaceState, load, save, calculate_entropy
|
|
97
|
+
|
|
98
|
+
# 1. 创建/加载工作区
|
|
99
|
+
state = WorkspaceState() # 或 load(Path("."))
|
|
100
|
+
|
|
101
|
+
# 2. 添加锚点
|
|
102
|
+
anchor_id = state.add_anchor("核心使命", "系统的核心目标与约束")
|
|
103
|
+
|
|
104
|
+
# 3. 注入证据(自动触发:衰减 + 结晶 + 稳定性重算)
|
|
105
|
+
state.add_evidence(anchor_id, "用户偏好简洁输出,结论优先")
|
|
106
|
+
state.add_evidence(anchor_id, "用户偏好简洁输出,结论优先") # 2次一致 -> 结晶
|
|
107
|
+
state.add_evidence(anchor_id, "用户厌恶过度工程化,够用就行")
|
|
108
|
+
|
|
109
|
+
# 4. 查看结晶记忆
|
|
110
|
+
for m in state.memories:
|
|
111
|
+
print(f"结晶: {m.content[:50]}... (置信度={m.confidence:.2f})")
|
|
112
|
+
|
|
113
|
+
# 5. 监控认知健康
|
|
114
|
+
entropy = calculate_entropy(state)
|
|
115
|
+
print(f"熵值: {entropy:.4f} → {'🟢GREEN' if entropy < 0.3 else '🟡YELLOW' if entropy < 0.6 else '🔴RED'}")
|
|
116
|
+
|
|
117
|
+
# 6. 持久化
|
|
118
|
+
save(state, Path("."))
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### CLI 使用
|
|
122
|
+
```bash
|
|
123
|
+
# 初始化工作区(创建 .liquid/state.json)
|
|
124
|
+
liquid-loop init
|
|
125
|
+
|
|
126
|
+
# 添加锚点
|
|
127
|
+
liquid-loop anchor_add "项目目标" "完成液环论文与开源"
|
|
128
|
+
|
|
129
|
+
# 注入证据
|
|
130
|
+
liquid-loop evidence_add "项目目标" "已完成 11 轮实验与 4 个实证包"
|
|
131
|
+
|
|
132
|
+
# 查看状态
|
|
133
|
+
liquid-loop status
|
|
134
|
+
# 输出:
|
|
135
|
+
# ╭──────────────────────────────────────────────╮
|
|
136
|
+
# │ Liquid Loop 认知状态 │
|
|
137
|
+
# ├──────────┬──────┬────────┬────────┬────────┬──┤
|
|
138
|
+
# │ 锚点 │ 证据 │ 结晶 │ 冲突 │ 熵值 │ │
|
|
139
|
+
# ├──────────┼──────┼────────┼────────┼────────┼──┤
|
|
140
|
+
# │ 项目目标 │ 3 │ 1 │ 0 │ 0.2760 │ 🟢│
|
|
141
|
+
# ╰──────────┴──────┴────────┴────────┴────────┴──╯
|
|
142
|
+
# 锚点稳定性: 项目目标=0.88
|
|
143
|
+
|
|
144
|
+
# 列出所有记忆结晶
|
|
145
|
+
liquid-loop memory_list
|
|
146
|
+
|
|
147
|
+
# 快照(记录当前认知基线)
|
|
148
|
+
liquid-loop snapshot
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## 架构对比
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
记忆管理光谱:
|
|
157
|
+
|
|
158
|
+
[外力编辑] ←──────────────── [混合/零LLM检索] ──────────────→ [自组织]
|
|
159
|
+
All-Mem Mandol (零LLM检索) Liquid Loop
|
|
160
|
+
GRAVITY CoreMem (检索优化) (零LLM管理)
|
|
161
|
+
AnchorMem MemForest (索引)
|
|
162
|
+
T-Mem, GAM HeLa-Mem (联想)
|
|
163
|
+
APEX-MEM, Synthius DimMem (维度压缩)
|
|
164
|
+
|
|
165
|
+
Liquid Loop 是唯一完全自组织 + 零 LLM 管理的系统。
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## 基准实验
|
|
171
|
+
|
|
172
|
+
| 实验 | 核心发现 | 关键指标 |
|
|
173
|
+
|------|----------|----------|
|
|
174
|
+
| **E1 认知负荷** | 100 证据 → 13 结晶,熵值维持 GREEN | 熵值 0.035→0.194,单条 0.01ms |
|
|
175
|
+
| **E2 噪声鲁棒性** | 0%/20%/50% 噪声下熵值完全相同 | **天然抗噪**(精确匹配机制) |
|
|
176
|
+
| **E3 遗忘曲线** | 5 轮衰减后权重保留 83.2% | 平滑指数衰减,无灾难性遗忘 |
|
|
177
|
+
| **E4 扩展性** | 1000 证据延迟 0.179ms | 500x 快于 LLM 调用 |
|
|
178
|
+
|
|
179
|
+
> 完整实验数据:`experiment/liquid_benchmark_results/`
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 理论来源
|
|
184
|
+
|
|
185
|
+
- **液环理论** — 飞哥原创,11 轮实验,4 个实证包
|
|
186
|
+
- **核心论文** — [Liquid Loop: Self-Organizing Cognitive Memory for AI Agents](docs/液环论文框架.md)
|
|
187
|
+
- **竞品调研** — 2024-2026 Agent Memory 50+ 篇论文全景扫描
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 项目结构
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
liquid-loop/
|
|
195
|
+
├── liquid_loop/
|
|
196
|
+
│ ├── __init__.py # 公共 API 导出
|
|
197
|
+
│ ├── workspace.py # 核心数据模型
|
|
198
|
+
│ ├── storage.py # JSON 持久化
|
|
199
|
+
│ ├── entropy.py # 四维熵值计算
|
|
200
|
+
│ └── cli.py # Click CLI (9 命令)
|
|
201
|
+
├── examples/
|
|
202
|
+
│ └── quickstart.py
|
|
203
|
+
├── tests/ # 待补充
|
|
204
|
+
├── pyproject.toml
|
|
205
|
+
├── README.md
|
|
206
|
+
├── LICENSE
|
|
207
|
+
└── CHANGELOG.md
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 开发
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
git clone https://gitee.com/feixubuke/liquid-loop.git
|
|
216
|
+
cd liquid-loop
|
|
217
|
+
pip install -e ".[dev]"
|
|
218
|
+
pytest -v
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## 路线图
|
|
224
|
+
|
|
225
|
+
- [ ] 语义一致性结晶(嵌入相似度替代精确匹配)
|
|
226
|
+
- [ ] 多 Agent 液环耦合
|
|
227
|
+
- [ ] LX 扩展:世界模型预测纳入液环
|
|
228
|
+
- [ ] LoCoMo / LongMemEval 基准对比
|
|
229
|
+
- [ ] 边缘端部署优化(<50KB)
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## 许可证
|
|
234
|
+
|
|
235
|
+
MIT License — 详见 [LICENSE](LICENSE)
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## 致谢
|
|
240
|
+
|
|
241
|
+
液环理论源自飞哥 2026 年 6-7 月对抗训练与实战项目的 11 轮实证沉淀。
|
|
242
|
+
感谢开源社区提供的竞品参考:All-Mem, Mandol, CoreMem, HeLa-Mem 等。
|
|
243
|
+
|
|
244
|
+
> **引用**
|
|
245
|
+
> ```
|
|
246
|
+
> @misc{liquid-loop-2026,
|
|
247
|
+
> title={Liquid Loop: Self-Organizing Cognitive Memory for AI Agents},
|
|
248
|
+
> author={Fei Ge},
|
|
249
|
+
> year={2026},
|
|
250
|
+
> url={https://gitee.com/feixubuke/liquid-loop}
|
|
251
|
+
> }
|
|
252
|
+
> ```
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# Liquid Loop
|
|
2
|
+
|
|
3
|
+
> **Self-Organizing Cognitive Memory for AI Agents** — Zero LLM dependency, pure Python implementation of the Liquid Loop theory.
|
|
4
|
+
|
|
5
|
+
[](https://pypi.org/project/liquid-loop/)
|
|
6
|
+
[](https://pypi.org/project/liquid-loop/)
|
|
7
|
+
[](https://opensource.org/licenses/MIT)
|
|
8
|
+
[](https://gitee.com/feixubuke/liquid-loop)
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 核心理念
|
|
13
|
+
|
|
14
|
+
**当前所有 Agent 记忆系统的共同缺陷:依赖外部编辑。**
|
|
15
|
+
|
|
16
|
+
- 图数据库 → 需要 LLM 诊断器做 Split/Merge/Update
|
|
17
|
+
- 向量检索 → 需要外部评分+排序
|
|
18
|
+
- LLM 摘要 → 需要外部提取+压缩
|
|
19
|
+
- 结构化 Schema → 需要外部设计+维护
|
|
20
|
+
|
|
21
|
+
**Liquid Loop 提出第三条路:自组织记忆。**
|
|
22
|
+
|
|
23
|
+
- 不需要外部编辑 → 证据一致性自动驱动结晶
|
|
24
|
+
- 不需要检索排序 → 熵值作为天然认知健康指标
|
|
25
|
+
- 不需要 LLM 介入管理 → LLM 只接触数据,不管理数据
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 核心概念
|
|
30
|
+
|
|
31
|
+
| 概念 | 物理隐喻 | 作用 |
|
|
32
|
+
|------|---------|------|
|
|
33
|
+
| **Anchor** 锚点 | 晶种 | 认知关注点,有稳定性值 s ∈ [0,1] |
|
|
34
|
+
| **Evidence** 证据 | 附着粒子 | 锚点下的具体观察,权重指数衰减 w×0.95ᵗ |
|
|
35
|
+
| **Memory** 结晶 | 结晶体 | 2+ 条一致 Evidence 自动凝聚,有置信度 c |
|
|
36
|
+
| **Entropy** 熵值 | 流体无序度 | 四维加权:drift×0.25 + conflict×0.25 + fragmentation×0.25 + gap×0.25 |
|
|
37
|
+
|
|
38
|
+
**状态判定:**
|
|
39
|
+
```
|
|
40
|
+
GREEN (entropy < 0.3) — 认知健康
|
|
41
|
+
YELLOW (0.3 ≤ entropy < 0.6) — 需关注
|
|
42
|
+
RED (entropy ≥ 0.6) — 需清理
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 快速开始
|
|
48
|
+
|
|
49
|
+
### 安装
|
|
50
|
+
```bash
|
|
51
|
+
pip install liquid-loop
|
|
52
|
+
# 国内镜像自动加速:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple liquid-loop
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 3 分钟上手
|
|
56
|
+
```python
|
|
57
|
+
from liquid_loop import WorkspaceState, load, save, calculate_entropy
|
|
58
|
+
|
|
59
|
+
# 1. 创建/加载工作区
|
|
60
|
+
state = WorkspaceState() # 或 load(Path("."))
|
|
61
|
+
|
|
62
|
+
# 2. 添加锚点
|
|
63
|
+
anchor_id = state.add_anchor("核心使命", "系统的核心目标与约束")
|
|
64
|
+
|
|
65
|
+
# 3. 注入证据(自动触发:衰减 + 结晶 + 稳定性重算)
|
|
66
|
+
state.add_evidence(anchor_id, "用户偏好简洁输出,结论优先")
|
|
67
|
+
state.add_evidence(anchor_id, "用户偏好简洁输出,结论优先") # 2次一致 -> 结晶
|
|
68
|
+
state.add_evidence(anchor_id, "用户厌恶过度工程化,够用就行")
|
|
69
|
+
|
|
70
|
+
# 4. 查看结晶记忆
|
|
71
|
+
for m in state.memories:
|
|
72
|
+
print(f"结晶: {m.content[:50]}... (置信度={m.confidence:.2f})")
|
|
73
|
+
|
|
74
|
+
# 5. 监控认知健康
|
|
75
|
+
entropy = calculate_entropy(state)
|
|
76
|
+
print(f"熵值: {entropy:.4f} → {'🟢GREEN' if entropy < 0.3 else '🟡YELLOW' if entropy < 0.6 else '🔴RED'}")
|
|
77
|
+
|
|
78
|
+
# 6. 持久化
|
|
79
|
+
save(state, Path("."))
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### CLI 使用
|
|
83
|
+
```bash
|
|
84
|
+
# 初始化工作区(创建 .liquid/state.json)
|
|
85
|
+
liquid-loop init
|
|
86
|
+
|
|
87
|
+
# 添加锚点
|
|
88
|
+
liquid-loop anchor_add "项目目标" "完成液环论文与开源"
|
|
89
|
+
|
|
90
|
+
# 注入证据
|
|
91
|
+
liquid-loop evidence_add "项目目标" "已完成 11 轮实验与 4 个实证包"
|
|
92
|
+
|
|
93
|
+
# 查看状态
|
|
94
|
+
liquid-loop status
|
|
95
|
+
# 输出:
|
|
96
|
+
# ╭──────────────────────────────────────────────╮
|
|
97
|
+
# │ Liquid Loop 认知状态 │
|
|
98
|
+
# ├──────────┬──────┬────────┬────────┬────────┬──┤
|
|
99
|
+
# │ 锚点 │ 证据 │ 结晶 │ 冲突 │ 熵值 │ │
|
|
100
|
+
# ├──────────┼──────┼────────┼────────┼────────┼──┤
|
|
101
|
+
# │ 项目目标 │ 3 │ 1 │ 0 │ 0.2760 │ 🟢│
|
|
102
|
+
# ╰──────────┴──────┴────────┴────────┴────────┴──╯
|
|
103
|
+
# 锚点稳定性: 项目目标=0.88
|
|
104
|
+
|
|
105
|
+
# 列出所有记忆结晶
|
|
106
|
+
liquid-loop memory_list
|
|
107
|
+
|
|
108
|
+
# 快照(记录当前认知基线)
|
|
109
|
+
liquid-loop snapshot
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 架构对比
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
记忆管理光谱:
|
|
118
|
+
|
|
119
|
+
[外力编辑] ←──────────────── [混合/零LLM检索] ──────────────→ [自组织]
|
|
120
|
+
All-Mem Mandol (零LLM检索) Liquid Loop
|
|
121
|
+
GRAVITY CoreMem (检索优化) (零LLM管理)
|
|
122
|
+
AnchorMem MemForest (索引)
|
|
123
|
+
T-Mem, GAM HeLa-Mem (联想)
|
|
124
|
+
APEX-MEM, Synthius DimMem (维度压缩)
|
|
125
|
+
|
|
126
|
+
Liquid Loop 是唯一完全自组织 + 零 LLM 管理的系统。
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 基准实验
|
|
132
|
+
|
|
133
|
+
| 实验 | 核心发现 | 关键指标 |
|
|
134
|
+
|------|----------|----------|
|
|
135
|
+
| **E1 认知负荷** | 100 证据 → 13 结晶,熵值维持 GREEN | 熵值 0.035→0.194,单条 0.01ms |
|
|
136
|
+
| **E2 噪声鲁棒性** | 0%/20%/50% 噪声下熵值完全相同 | **天然抗噪**(精确匹配机制) |
|
|
137
|
+
| **E3 遗忘曲线** | 5 轮衰减后权重保留 83.2% | 平滑指数衰减,无灾难性遗忘 |
|
|
138
|
+
| **E4 扩展性** | 1000 证据延迟 0.179ms | 500x 快于 LLM 调用 |
|
|
139
|
+
|
|
140
|
+
> 完整实验数据:`experiment/liquid_benchmark_results/`
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 理论来源
|
|
145
|
+
|
|
146
|
+
- **液环理论** — 飞哥原创,11 轮实验,4 个实证包
|
|
147
|
+
- **核心论文** — [Liquid Loop: Self-Organizing Cognitive Memory for AI Agents](docs/液环论文框架.md)
|
|
148
|
+
- **竞品调研** — 2024-2026 Agent Memory 50+ 篇论文全景扫描
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 项目结构
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
liquid-loop/
|
|
156
|
+
├── liquid_loop/
|
|
157
|
+
│ ├── __init__.py # 公共 API 导出
|
|
158
|
+
│ ├── workspace.py # 核心数据模型
|
|
159
|
+
│ ├── storage.py # JSON 持久化
|
|
160
|
+
│ ├── entropy.py # 四维熵值计算
|
|
161
|
+
│ └── cli.py # Click CLI (9 命令)
|
|
162
|
+
├── examples/
|
|
163
|
+
│ └── quickstart.py
|
|
164
|
+
├── tests/ # 待补充
|
|
165
|
+
├── pyproject.toml
|
|
166
|
+
├── README.md
|
|
167
|
+
├── LICENSE
|
|
168
|
+
└── CHANGELOG.md
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## 开发
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
git clone https://gitee.com/feixubuke/liquid-loop.git
|
|
177
|
+
cd liquid-loop
|
|
178
|
+
pip install -e ".[dev]"
|
|
179
|
+
pytest -v
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 路线图
|
|
185
|
+
|
|
186
|
+
- [ ] 语义一致性结晶(嵌入相似度替代精确匹配)
|
|
187
|
+
- [ ] 多 Agent 液环耦合
|
|
188
|
+
- [ ] LX 扩展:世界模型预测纳入液环
|
|
189
|
+
- [ ] LoCoMo / LongMemEval 基准对比
|
|
190
|
+
- [ ] 边缘端部署优化(<50KB)
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## 许可证
|
|
195
|
+
|
|
196
|
+
MIT License — 详见 [LICENSE](LICENSE)
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## 致谢
|
|
201
|
+
|
|
202
|
+
液环理论源自飞哥 2026 年 6-7 月对抗训练与实战项目的 11 轮实证沉淀。
|
|
203
|
+
感谢开源社区提供的竞品参考:All-Mem, Mandol, CoreMem, HeLa-Mem 等。
|
|
204
|
+
|
|
205
|
+
> **引用**
|
|
206
|
+
> ```
|
|
207
|
+
> @misc{liquid-loop-2026,
|
|
208
|
+
> title={Liquid Loop: Self-Organizing Cognitive Memory for AI Agents},
|
|
209
|
+
> author={Fei Ge},
|
|
210
|
+
> year={2026},
|
|
211
|
+
> url={https://gitee.com/feixubuke/liquid-loop}
|
|
212
|
+
> }
|
|
213
|
+
> ```
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Liquid Loop — Self-Organizing Cognitive Memory for AI Agents
|
|
3
|
+
|
|
4
|
+
A zero-LLM-dependency cognitive runtime implementing the Liquid Loop theory:
|
|
5
|
+
Anchor → Evidence → Memory Nucleation with four-dimensional entropy monitoring.
|
|
6
|
+
|
|
7
|
+
Core Concepts:
|
|
8
|
+
- Anchor: Cognitive focus points with stability tracking
|
|
9
|
+
- Evidence: Observations that accumulate under anchors (exponential decay)
|
|
10
|
+
- Memory: Crystallized knowledge from 2+ consistent evidences
|
|
11
|
+
- Entropy: Four-dimensional cognitive health metric (drift/conflict/fragmentation/gap)
|
|
12
|
+
|
|
13
|
+
Usage:
|
|
14
|
+
from liquid_loop import WorkspaceState, Anchor, Evidence, Memory
|
|
15
|
+
from liquid_loop import load, save, calculate_entropy
|
|
16
|
+
from liquid_loop.cli import main as cli_main
|
|
17
|
+
|
|
18
|
+
# Quick start
|
|
19
|
+
state = WorkspaceState()
|
|
20
|
+
anchor_id = state.add_anchor("核心使命", "系统的核心目标")
|
|
21
|
+
state.add_evidence(anchor_id, "用户偏好简洁输出")
|
|
22
|
+
state.add_evidence(anchor_id, "用户偏好简洁输出") # 2次一致 -> 结晶
|
|
23
|
+
print(f"结晶记忆: {len(state.memories)} 条")
|
|
24
|
+
|
|
25
|
+
CLI:
|
|
26
|
+
python -m liquid_loop init
|
|
27
|
+
python -m liquid_loop anchor_add "项目目标" "完成液环论文"
|
|
28
|
+
python -m liquid_loop evidence_add "项目目标" "已完成实证数据收集"
|
|
29
|
+
python -m liquid_loop status
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
from liquid_loop.workspace import (
|
|
33
|
+
WorkspaceState,
|
|
34
|
+
Anchor,
|
|
35
|
+
Evidence,
|
|
36
|
+
Memory,
|
|
37
|
+
Conflict,
|
|
38
|
+
StateSnapshot,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
from liquid_loop.storage import load, save, LIQUID_DIR, STATE_FILE
|
|
42
|
+
|
|
43
|
+
from liquid_loop.entropy import calculate_entropy
|
|
44
|
+
|
|
45
|
+
__version__ = "0.1.0"
|
|
46
|
+
__author__ = "Fei Ge"
|
|
47
|
+
__license__ = "MIT"
|
|
48
|
+
|
|
49
|
+
__all__ = [
|
|
50
|
+
# Core data models
|
|
51
|
+
"WorkspaceState",
|
|
52
|
+
"Anchor",
|
|
53
|
+
"Evidence",
|
|
54
|
+
"Memory",
|
|
55
|
+
"Conflict",
|
|
56
|
+
"StateSnapshot",
|
|
57
|
+
# Persistence
|
|
58
|
+
"load",
|
|
59
|
+
"save",
|
|
60
|
+
"LIQUID_DIR",
|
|
61
|
+
"STATE_FILE",
|
|
62
|
+
# Entropy
|
|
63
|
+
"calculate_entropy",
|
|
64
|
+
"EntropyComponents",
|
|
65
|
+
# CLI
|
|
66
|
+
"cli_main",
|
|
67
|
+
]
|
|
68
|
+
|
|
69
|
+
# Lazy import CLI to avoid click dependency at import time
|
|
70
|
+
def cli_main():
|
|
71
|
+
from liquid_loop.cli import main
|
|
72
|
+
return main()
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import click
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from .workspace import (
|
|
4
|
+
WorkspaceState, Anchor, Evidence, Memory, StateSnapshot, now,
|
|
5
|
+
_nucleate, _decay_evidence, _recalc_stability,
|
|
6
|
+
)
|
|
7
|
+
from .storage import load, save
|
|
8
|
+
from .entropy import calculate as calculate_entropy
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
WORKSPACE = Path.cwd()
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _load():
|
|
15
|
+
return load(WORKSPACE)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _save(state: WorkspaceState):
|
|
19
|
+
state.updated_at = now()
|
|
20
|
+
save(state, WORKSPACE)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# --- CLI ---
|
|
24
|
+
|
|
25
|
+
@click.group()
|
|
26
|
+
def main():
|
|
27
|
+
"""Liquid Loop — Workspace Cognitive Runtime"""
|
|
28
|
+
pass
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@main.command()
|
|
32
|
+
def init():
|
|
33
|
+
"""初始化 Liquid Loop 工作区"""
|
|
34
|
+
s = _load()
|
|
35
|
+
if s.anchors or s.evidences:
|
|
36
|
+
click.echo("工作区已初始化,无需重复操作。")
|
|
37
|
+
return
|
|
38
|
+
s.version = "0.1.0"
|
|
39
|
+
_save(s)
|
|
40
|
+
click.echo(f"✓ Liquid Loop 工作区已初始化: {WORKSPACE}/.liquid/")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@main.command()
|
|
44
|
+
def status():
|
|
45
|
+
"""显示当前认知状态"""
|
|
46
|
+
s = _load()
|
|
47
|
+
ent = calculate_entropy(s)
|
|
48
|
+
level = "GREEN" if ent < 0.3 else ("YELLOW" if ent < 0.6 else "RED")
|
|
49
|
+
latest_ev = max((e.timestamp for e in s.evidences), default="无活动")
|
|
50
|
+
click.echo(f"锚点: {len(s.anchors)} | 证据: {len(s.evidences)} | 记忆: {len(s.memories)} | 冲突: {len(s.conflicts)}")
|
|
51
|
+
click.echo(f"熵值: {ent:.4f} [{level}] | 最新活动: {latest_ev}")
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@main.command()
|
|
55
|
+
@click.argument("name")
|
|
56
|
+
@click.argument("description")
|
|
57
|
+
def anchor_add(name, description):
|
|
58
|
+
"""添加锚点"""
|
|
59
|
+
s = _load()
|
|
60
|
+
# 同名检查
|
|
61
|
+
if any(a.name == name for a in s.anchors):
|
|
62
|
+
click.echo(f"锚点 '{name}' 已存在。")
|
|
63
|
+
return
|
|
64
|
+
anchor = Anchor(name=name, description=description)
|
|
65
|
+
s.anchors.append(anchor)
|
|
66
|
+
_save(s)
|
|
67
|
+
click.echo(f"✓ 锚点已添加: {name} ({anchor.id})")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@main.command()
|
|
71
|
+
def anchor_list():
|
|
72
|
+
"""列出所有锚点"""
|
|
73
|
+
s = _load()
|
|
74
|
+
if not s.anchors:
|
|
75
|
+
click.echo("暂无锚点。使用 liquid anchor add <名称> <描述> 添加。")
|
|
76
|
+
return
|
|
77
|
+
for a in s.anchors:
|
|
78
|
+
bar = "█" * int(a.stability * 10) + "░" * (10 - int(a.stability * 10))
|
|
79
|
+
click.echo(f"[{a.stability:.2f}] {bar} {a.name}: {a.description}")
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
@main.command()
|
|
83
|
+
@click.argument("anchor_name")
|
|
84
|
+
@click.argument("content")
|
|
85
|
+
def evidence_add(anchor_name, content):
|
|
86
|
+
"""为锚点添加证据"""
|
|
87
|
+
s = _load()
|
|
88
|
+
anchor = next((a for a in s.anchors if a.name == anchor_name), None)
|
|
89
|
+
if not anchor:
|
|
90
|
+
click.echo(f"锚点 '{anchor_name}' 不存在。请先创建。")
|
|
91
|
+
return
|
|
92
|
+
evidence = Evidence(anchor_id=anchor.id, content=content)
|
|
93
|
+
s.evidences.append(evidence)
|
|
94
|
+
anchor.evidence_ids.append(evidence.id)
|
|
95
|
+
# 衰减 + 重算 + 成核
|
|
96
|
+
_decay_evidence(s, anchor.id)
|
|
97
|
+
_recalc_stability(s, anchor.id)
|
|
98
|
+
_nucleate(s, anchor.id)
|
|
99
|
+
_save(s)
|
|
100
|
+
click.echo(f"✓ 证据已添加: [{anchor_name}] {content[:40]}... ({evidence.id})")
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
@main.command()
|
|
104
|
+
@click.option("--anchor", "-a", default=None, help="按锚点名称过滤")
|
|
105
|
+
def evidence_list(anchor):
|
|
106
|
+
"""列出证据"""
|
|
107
|
+
s = _load()
|
|
108
|
+
evs = s.evidences
|
|
109
|
+
if anchor:
|
|
110
|
+
a = next((x for x in s.anchors if x.name == anchor), None)
|
|
111
|
+
if not a:
|
|
112
|
+
click.echo(f"锚点 '{anchor}' 不存在。")
|
|
113
|
+
return
|
|
114
|
+
evs = [e for e in evs if e.anchor_id == a.id]
|
|
115
|
+
click.echo(f"--- {anchor} ---")
|
|
116
|
+
if not evs:
|
|
117
|
+
click.echo("暂无证据。")
|
|
118
|
+
return
|
|
119
|
+
for e in sorted(evs, key=lambda x: x.timestamp, reverse=True):
|
|
120
|
+
anchor_name = next((a.name for a in s.anchors if a.id == e.anchor_id), "?")
|
|
121
|
+
click.echo(f"[{e.weight:.2f}] {e.timestamp[:19]} [{anchor_name}] {e.content}")
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@main.command()
|
|
125
|
+
def memory_list():
|
|
126
|
+
"""列出已形成的记忆"""
|
|
127
|
+
s = _load()
|
|
128
|
+
if not s.memories:
|
|
129
|
+
click.echo("暂无记忆。当同一锚点下有 2 条以上一致证据时自动成核。")
|
|
130
|
+
return
|
|
131
|
+
for m in sorted(s.memories, key=lambda x: x.confidence, reverse=True):
|
|
132
|
+
click.echo(f"[conf={m.confidence:.2f}] {m.formed_at[:19]} {m.content}")
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
@main.command()
|
|
136
|
+
def check():
|
|
137
|
+
"""检查工作区熵值"""
|
|
138
|
+
s = _load()
|
|
139
|
+
ent = calculate_entropy(s)
|
|
140
|
+
if ent < 0.3:
|
|
141
|
+
level, icon = "GREEN", "✓"
|
|
142
|
+
elif ent < 0.6:
|
|
143
|
+
level, icon = "YELLOW", "⚠"
|
|
144
|
+
else:
|
|
145
|
+
level, icon = "RED", "✗"
|
|
146
|
+
click.echo(f"{icon} 熵值: {ent:.4f} [{level}]")
|
|
147
|
+
if ent >= 0.6:
|
|
148
|
+
click.echo("建议: 检查锚点漂移、添加新证据或解决冲突。")
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
@main.command()
|
|
152
|
+
def snapshot():
|
|
153
|
+
"""保存当前状态快照"""
|
|
154
|
+
s = _load()
|
|
155
|
+
ent = calculate_entropy(s)
|
|
156
|
+
snap = StateSnapshot(
|
|
157
|
+
entropy=ent,
|
|
158
|
+
anchor_count=len(s.anchors),
|
|
159
|
+
evidence_count=len(s.evidences),
|
|
160
|
+
memory_count=len(s.memories),
|
|
161
|
+
conflict_count=len(s.conflicts),
|
|
162
|
+
)
|
|
163
|
+
s.snapshots.append(snap)
|
|
164
|
+
_save(s)
|
|
165
|
+
click.echo(f"✓ 快照已保存 (熵值: {ent:.4f})")
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
@main.command()
|
|
169
|
+
def snapshots():
|
|
170
|
+
"""列出历史快照"""
|
|
171
|
+
s = _load()
|
|
172
|
+
if not s.snapshots:
|
|
173
|
+
click.echo("暂无快照。使用 liquid snapshot 保存。")
|
|
174
|
+
return
|
|
175
|
+
for i, snap in enumerate(s.snapshots):
|
|
176
|
+
click.echo(f"[{i}] {snap.timestamp[:19]} 熵={snap.entropy:.4f} "
|
|
177
|
+
f"A:{snap.anchor_count} E:{snap.evidence_count} "
|
|
178
|
+
f"M:{snap.memory_count} C:{snap.conflict_count}")
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
if __name__ == "__main__":
|
|
182
|
+
main()
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from datetime import datetime, timezone, timedelta
|
|
2
|
+
from .workspace import WorkspaceState
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def anchor_drift(state: WorkspaceState) -> float:
|
|
6
|
+
"""所有 Anchor 的 stability 偏离 1.0 的均值。0=全稳, 1=全漂"""
|
|
7
|
+
if not state.anchors:
|
|
8
|
+
return 0.0
|
|
9
|
+
return sum(1.0 - a.stability for a in state.anchors) / len(state.anchors)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def conflict_density(state: WorkspaceState) -> float:
|
|
13
|
+
"""冲突密度。0=无冲突, 1=每锚点一个冲突"""
|
|
14
|
+
if not state.anchors:
|
|
15
|
+
return 0.0
|
|
16
|
+
return min(len(state.conflicts) / len(state.anchors), 1.0)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def evidence_fragmentation(state: WorkspaceState) -> float:
|
|
20
|
+
"""孤立 Evidence 占比。0=全部有同伴, 1=全部孤立"""
|
|
21
|
+
if not state.evidences:
|
|
22
|
+
return 0.0
|
|
23
|
+
# 按 anchor_id 分组
|
|
24
|
+
groups: dict[str, int] = {}
|
|
25
|
+
for e in state.evidences:
|
|
26
|
+
groups[e.anchor_id] = groups.get(e.anchor_id, 0) + 1
|
|
27
|
+
orphaned = sum(1 for count in groups.values() if count == 1)
|
|
28
|
+
return orphaned / len(groups) if groups else 0.0
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def activity_gap(state: WorkspaceState) -> float:
|
|
32
|
+
"""距最新 Evidence 的天数。0=今天有活动, 1=超过7天无活动"""
|
|
33
|
+
if not state.evidences:
|
|
34
|
+
return 1.0
|
|
35
|
+
latest = max(e.timestamp for e in state.evidences)
|
|
36
|
+
try:
|
|
37
|
+
latest_dt = datetime.fromisoformat(latest)
|
|
38
|
+
except ValueError:
|
|
39
|
+
return 1.0
|
|
40
|
+
gap = datetime.now(timezone.utc) - latest_dt
|
|
41
|
+
return min(gap / timedelta(days=7), 1.0)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def calculate(state: WorkspaceState,
|
|
45
|
+
w_drift: float = 0.25, w_conflict: float = 0.25,
|
|
46
|
+
w_frag: float = 0.25, w_gap: float = 0.25) -> float:
|
|
47
|
+
"""综合熵值 0.0-1.0"""
|
|
48
|
+
return (
|
|
49
|
+
w_drift * anchor_drift(state) +
|
|
50
|
+
w_conflict * conflict_density(state) +
|
|
51
|
+
w_frag * evidence_fragmentation(state) +
|
|
52
|
+
w_gap * activity_gap(state)
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
# 兼容别名
|
|
56
|
+
calculate_entropy = calculate
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import os
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from dataclasses import asdict
|
|
5
|
+
from .workspace import WorkspaceState, Anchor, Evidence, Memory, Conflict, StateSnapshot
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
LIQUID_DIR = ".liquid"
|
|
9
|
+
STATE_FILE = "state.json"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _ensure_dir(workspace_root) -> Path:
|
|
13
|
+
if isinstance(workspace_root, str):
|
|
14
|
+
workspace_root = Path(workspace_root)
|
|
15
|
+
d = workspace_root / LIQUID_DIR
|
|
16
|
+
d.mkdir(exist_ok=True)
|
|
17
|
+
return d
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def load(workspace_root) -> WorkspaceState:
|
|
21
|
+
path = _ensure_dir(workspace_root) / STATE_FILE
|
|
22
|
+
if not path.exists():
|
|
23
|
+
return WorkspaceState()
|
|
24
|
+
with open(path, "r", encoding="utf-8") as f:
|
|
25
|
+
data = json.load(f)
|
|
26
|
+
return _from_dict(data)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def save(state: WorkspaceState, workspace_root):
|
|
30
|
+
path = _ensure_dir(workspace_root) / STATE_FILE
|
|
31
|
+
with open(path, "w", encoding="utf-8") as f:
|
|
32
|
+
json.dump(asdict(state), f, indent=2, ensure_ascii=False)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _from_dict(data: dict) -> WorkspaceState:
|
|
36
|
+
return WorkspaceState(
|
|
37
|
+
anchors=[Anchor(**a) for a in data.get("anchors", [])],
|
|
38
|
+
evidences=[Evidence(**e) for e in data.get("evidences", [])],
|
|
39
|
+
memories=[Memory(**m) for m in data.get("memories", [])],
|
|
40
|
+
conflicts=[Conflict(**c) for c in data.get("conflicts", [])],
|
|
41
|
+
snapshots=[StateSnapshot(**s) for s in data.get("snapshots", [])],
|
|
42
|
+
version=data.get("version", "0.1.0"),
|
|
43
|
+
updated_at=data.get("updated_at", ""),
|
|
44
|
+
)
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
|
+
from datetime import datetime, timezone
|
|
3
|
+
from typing import Optional
|
|
4
|
+
import uuid
|
|
5
|
+
from collections import Counter
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def now() -> str:
|
|
9
|
+
return datetime.now(timezone.utc).isoformat()
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def uid() -> str:
|
|
13
|
+
return uuid.uuid4().hex[:12]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# ── Liquid Loop Core Chain ──────────────────────────────────
|
|
17
|
+
|
|
18
|
+
def _nucleate(state: "WorkspaceState", anchor_id: str):
|
|
19
|
+
"""检查指定 Anchor 下的 Evidence,2+ 条则成核为 Memory"""
|
|
20
|
+
group = [e for e in state.evidences if e.anchor_id == anchor_id]
|
|
21
|
+
if len(group) < 2:
|
|
22
|
+
return
|
|
23
|
+
content_counts = Counter(e.content for e in group)
|
|
24
|
+
for content, count in content_counts.items():
|
|
25
|
+
if count >= 2:
|
|
26
|
+
existing = [m for m in state.memories if m.content == content]
|
|
27
|
+
if existing:
|
|
28
|
+
continue
|
|
29
|
+
evidence_ids = [e.id for e in group if e.content == content]
|
|
30
|
+
confidence = min(count / len(group), 1.0)
|
|
31
|
+
memory = Memory(
|
|
32
|
+
content=content,
|
|
33
|
+
evidence_ids=evidence_ids,
|
|
34
|
+
confidence=confidence,
|
|
35
|
+
)
|
|
36
|
+
state.memories.append(memory)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _decay_evidence(state: "WorkspaceState", anchor_id: str):
|
|
40
|
+
"""Stability decay: 每次添加 Evidence 时,同 Anchor 下的旧 Evidence 权重衰减"""
|
|
41
|
+
for e in state.evidences:
|
|
42
|
+
if e.anchor_id == anchor_id:
|
|
43
|
+
e.weight = max(e.weight * 0.95, 0.1)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _recalc_stability(state: "WorkspaceState", anchor_id: str):
|
|
47
|
+
"""基于证据权重更新 Anchor 稳定性"""
|
|
48
|
+
anchor = next((a for a in state.anchors if a.id == anchor_id), None)
|
|
49
|
+
if not anchor:
|
|
50
|
+
return
|
|
51
|
+
evs = [e for e in state.evidences if e.anchor_id == anchor_id]
|
|
52
|
+
if not evs:
|
|
53
|
+
anchor.stability = 1.0
|
|
54
|
+
return
|
|
55
|
+
# 稳定性 = 平均权重(权重越高越稳定)
|
|
56
|
+
anchor.stability = sum(e.weight for e in evs) / len(evs)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@dataclass
|
|
60
|
+
class Anchor:
|
|
61
|
+
id: str = field(default_factory=uid)
|
|
62
|
+
name: str = ""
|
|
63
|
+
description: str = ""
|
|
64
|
+
created_at: str = field(default_factory=now)
|
|
65
|
+
stability: float = 1.0 # 0.0=完全漂移, 1.0=完全稳定
|
|
66
|
+
evidence_ids: list[str] = field(default_factory=list)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@dataclass
|
|
70
|
+
class Evidence:
|
|
71
|
+
id: str = field(default_factory=uid)
|
|
72
|
+
anchor_id: str = ""
|
|
73
|
+
content: str = ""
|
|
74
|
+
timestamp: str = field(default_factory=now)
|
|
75
|
+
weight: float = 1.0 # 证据权重, 默认1.0
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
@dataclass
|
|
79
|
+
class Memory:
|
|
80
|
+
id: str = field(default_factory=uid)
|
|
81
|
+
content: str = ""
|
|
82
|
+
formed_at: str = field(default_factory=now)
|
|
83
|
+
evidence_ids: list[str] = field(default_factory=list) # 成核来源
|
|
84
|
+
confidence: float = 0.0 # 0.0-1.0, 基于证据一致性
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
@dataclass
|
|
88
|
+
class Conflict:
|
|
89
|
+
anchor_a: str = ""
|
|
90
|
+
anchor_b: str = ""
|
|
91
|
+
description: str = ""
|
|
92
|
+
detected_at: str = field(default_factory=now)
|
|
93
|
+
severity: float = 0.0 # 0.0-1.0
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@dataclass
|
|
97
|
+
class StateSnapshot:
|
|
98
|
+
timestamp: str = field(default_factory=now)
|
|
99
|
+
entropy: float = 0.0
|
|
100
|
+
anchor_count: int = 0
|
|
101
|
+
evidence_count: int = 0
|
|
102
|
+
memory_count: int = 0
|
|
103
|
+
conflict_count: int = 0
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@dataclass
|
|
107
|
+
class WorkspaceState:
|
|
108
|
+
anchors: list[Anchor] = field(default_factory=list)
|
|
109
|
+
evidences: list[Evidence] = field(default_factory=list)
|
|
110
|
+
memories: list[Memory] = field(default_factory=list)
|
|
111
|
+
conflicts: list[Conflict] = field(default_factory=list)
|
|
112
|
+
snapshots: list[StateSnapshot] = field(default_factory=list)
|
|
113
|
+
version: str = "0.1.0"
|
|
114
|
+
updated_at: str = field(default_factory=now)
|
|
115
|
+
|
|
116
|
+
def add_anchor(self, name: str, description: str = "") -> str:
|
|
117
|
+
"""添加锚点,返回 anchor_id"""
|
|
118
|
+
anchor = Anchor(name=name, description=description)
|
|
119
|
+
self.anchors.append(anchor)
|
|
120
|
+
return anchor.id
|
|
121
|
+
|
|
122
|
+
def add_evidence(self, anchor_id: str, content: str) -> str:
|
|
123
|
+
"""添加证据到指定锚点,触发液环自动链:成核→衰减→稳定性重算"""
|
|
124
|
+
evidence = Evidence(anchor_id=anchor_id, content=content)
|
|
125
|
+
self.evidences.append(evidence)
|
|
126
|
+
# Liquid Loop 自动链
|
|
127
|
+
_nucleate(self, anchor_id)
|
|
128
|
+
_decay_evidence(self, anchor_id)
|
|
129
|
+
_recalc_stability(self, anchor_id)
|
|
130
|
+
return evidence.id
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: liquid-loop
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: Self-Organizing Cognitive Memory for AI Agents — Liquid Loop theory implementation
|
|
5
|
+
Author-email: Fei Ge <feixubuke@example.com>
|
|
6
|
+
Maintainer-email: Fei Ge <feixubuke@example.com>
|
|
7
|
+
License: MIT
|
|
8
|
+
Project-URL: Homepage, https://gitee.com/feixubuke/liquid-loop
|
|
9
|
+
Project-URL: Repository, https://gitee.com/feixubuke/liquid-loop
|
|
10
|
+
Project-URL: Documentation, https://liquid-loop.readthedocs.io
|
|
11
|
+
Project-URL: Issues, https://gitee.com/feixubuke/liquid-loop/issues
|
|
12
|
+
Project-URL: Changelog, https://gitee.com/feixubuke/liquid-loop/blob/main/CHANGELOG.md
|
|
13
|
+
Keywords: agent-memory,cognitive-architecture,self-organizing,liquid-loop,entropy,ai-agents,memory-management
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Intended Audience :: Science/Research
|
|
17
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
23
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
24
|
+
Requires-Python: >=3.10
|
|
25
|
+
Description-Content-Type: text/markdown
|
|
26
|
+
License-File: LICENSE
|
|
27
|
+
Requires-Dist: click>=8.1.0
|
|
28
|
+
Requires-Dist: pyyaml>=6.0
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: pytest>=7.4.0; extra == "dev"
|
|
31
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
32
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
33
|
+
Requires-Dist: mypy>=1.5.0; extra == "dev"
|
|
34
|
+
Provides-Extra: docs
|
|
35
|
+
Requires-Dist: mkdocs>=1.5.0; extra == "docs"
|
|
36
|
+
Requires-Dist: mkdocs-material>=9.4.0; extra == "docs"
|
|
37
|
+
Requires-Dist: mkdocstrings[python]>=0.24.0; extra == "docs"
|
|
38
|
+
Dynamic: license-file
|
|
39
|
+
|
|
40
|
+
# Liquid Loop
|
|
41
|
+
|
|
42
|
+
> **Self-Organizing Cognitive Memory for AI Agents** — Zero LLM dependency, pure Python implementation of the Liquid Loop theory.
|
|
43
|
+
|
|
44
|
+
[](https://pypi.org/project/liquid-loop/)
|
|
45
|
+
[](https://pypi.org/project/liquid-loop/)
|
|
46
|
+
[](https://opensource.org/licenses/MIT)
|
|
47
|
+
[](https://gitee.com/feixubuke/liquid-loop)
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 核心理念
|
|
52
|
+
|
|
53
|
+
**当前所有 Agent 记忆系统的共同缺陷:依赖外部编辑。**
|
|
54
|
+
|
|
55
|
+
- 图数据库 → 需要 LLM 诊断器做 Split/Merge/Update
|
|
56
|
+
- 向量检索 → 需要外部评分+排序
|
|
57
|
+
- LLM 摘要 → 需要外部提取+压缩
|
|
58
|
+
- 结构化 Schema → 需要外部设计+维护
|
|
59
|
+
|
|
60
|
+
**Liquid Loop 提出第三条路:自组织记忆。**
|
|
61
|
+
|
|
62
|
+
- 不需要外部编辑 → 证据一致性自动驱动结晶
|
|
63
|
+
- 不需要检索排序 → 熵值作为天然认知健康指标
|
|
64
|
+
- 不需要 LLM 介入管理 → LLM 只接触数据,不管理数据
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 核心概念
|
|
69
|
+
|
|
70
|
+
| 概念 | 物理隐喻 | 作用 |
|
|
71
|
+
|------|---------|------|
|
|
72
|
+
| **Anchor** 锚点 | 晶种 | 认知关注点,有稳定性值 s ∈ [0,1] |
|
|
73
|
+
| **Evidence** 证据 | 附着粒子 | 锚点下的具体观察,权重指数衰减 w×0.95ᵗ |
|
|
74
|
+
| **Memory** 结晶 | 结晶体 | 2+ 条一致 Evidence 自动凝聚,有置信度 c |
|
|
75
|
+
| **Entropy** 熵值 | 流体无序度 | 四维加权:drift×0.25 + conflict×0.25 + fragmentation×0.25 + gap×0.25 |
|
|
76
|
+
|
|
77
|
+
**状态判定:**
|
|
78
|
+
```
|
|
79
|
+
GREEN (entropy < 0.3) — 认知健康
|
|
80
|
+
YELLOW (0.3 ≤ entropy < 0.6) — 需关注
|
|
81
|
+
RED (entropy ≥ 0.6) — 需清理
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 快速开始
|
|
87
|
+
|
|
88
|
+
### 安装
|
|
89
|
+
```bash
|
|
90
|
+
pip install liquid-loop
|
|
91
|
+
# 国内镜像自动加速:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple liquid-loop
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### 3 分钟上手
|
|
95
|
+
```python
|
|
96
|
+
from liquid_loop import WorkspaceState, load, save, calculate_entropy
|
|
97
|
+
|
|
98
|
+
# 1. 创建/加载工作区
|
|
99
|
+
state = WorkspaceState() # 或 load(Path("."))
|
|
100
|
+
|
|
101
|
+
# 2. 添加锚点
|
|
102
|
+
anchor_id = state.add_anchor("核心使命", "系统的核心目标与约束")
|
|
103
|
+
|
|
104
|
+
# 3. 注入证据(自动触发:衰减 + 结晶 + 稳定性重算)
|
|
105
|
+
state.add_evidence(anchor_id, "用户偏好简洁输出,结论优先")
|
|
106
|
+
state.add_evidence(anchor_id, "用户偏好简洁输出,结论优先") # 2次一致 -> 结晶
|
|
107
|
+
state.add_evidence(anchor_id, "用户厌恶过度工程化,够用就行")
|
|
108
|
+
|
|
109
|
+
# 4. 查看结晶记忆
|
|
110
|
+
for m in state.memories:
|
|
111
|
+
print(f"结晶: {m.content[:50]}... (置信度={m.confidence:.2f})")
|
|
112
|
+
|
|
113
|
+
# 5. 监控认知健康
|
|
114
|
+
entropy = calculate_entropy(state)
|
|
115
|
+
print(f"熵值: {entropy:.4f} → {'🟢GREEN' if entropy < 0.3 else '🟡YELLOW' if entropy < 0.6 else '🔴RED'}")
|
|
116
|
+
|
|
117
|
+
# 6. 持久化
|
|
118
|
+
save(state, Path("."))
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### CLI 使用
|
|
122
|
+
```bash
|
|
123
|
+
# 初始化工作区(创建 .liquid/state.json)
|
|
124
|
+
liquid-loop init
|
|
125
|
+
|
|
126
|
+
# 添加锚点
|
|
127
|
+
liquid-loop anchor_add "项目目标" "完成液环论文与开源"
|
|
128
|
+
|
|
129
|
+
# 注入证据
|
|
130
|
+
liquid-loop evidence_add "项目目标" "已完成 11 轮实验与 4 个实证包"
|
|
131
|
+
|
|
132
|
+
# 查看状态
|
|
133
|
+
liquid-loop status
|
|
134
|
+
# 输出:
|
|
135
|
+
# ╭──────────────────────────────────────────────╮
|
|
136
|
+
# │ Liquid Loop 认知状态 │
|
|
137
|
+
# ├──────────┬──────┬────────┬────────┬────────┬──┤
|
|
138
|
+
# │ 锚点 │ 证据 │ 结晶 │ 冲突 │ 熵值 │ │
|
|
139
|
+
# ├──────────┼──────┼────────┼────────┼────────┼──┤
|
|
140
|
+
# │ 项目目标 │ 3 │ 1 │ 0 │ 0.2760 │ 🟢│
|
|
141
|
+
# ╰──────────┴──────┴────────┴────────┴────────┴──╯
|
|
142
|
+
# 锚点稳定性: 项目目标=0.88
|
|
143
|
+
|
|
144
|
+
# 列出所有记忆结晶
|
|
145
|
+
liquid-loop memory_list
|
|
146
|
+
|
|
147
|
+
# 快照(记录当前认知基线)
|
|
148
|
+
liquid-loop snapshot
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## 架构对比
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
记忆管理光谱:
|
|
157
|
+
|
|
158
|
+
[外力编辑] ←──────────────── [混合/零LLM检索] ──────────────→ [自组织]
|
|
159
|
+
All-Mem Mandol (零LLM检索) Liquid Loop
|
|
160
|
+
GRAVITY CoreMem (检索优化) (零LLM管理)
|
|
161
|
+
AnchorMem MemForest (索引)
|
|
162
|
+
T-Mem, GAM HeLa-Mem (联想)
|
|
163
|
+
APEX-MEM, Synthius DimMem (维度压缩)
|
|
164
|
+
|
|
165
|
+
Liquid Loop 是唯一完全自组织 + 零 LLM 管理的系统。
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## 基准实验
|
|
171
|
+
|
|
172
|
+
| 实验 | 核心发现 | 关键指标 |
|
|
173
|
+
|------|----------|----------|
|
|
174
|
+
| **E1 认知负荷** | 100 证据 → 13 结晶,熵值维持 GREEN | 熵值 0.035→0.194,单条 0.01ms |
|
|
175
|
+
| **E2 噪声鲁棒性** | 0%/20%/50% 噪声下熵值完全相同 | **天然抗噪**(精确匹配机制) |
|
|
176
|
+
| **E3 遗忘曲线** | 5 轮衰减后权重保留 83.2% | 平滑指数衰减,无灾难性遗忘 |
|
|
177
|
+
| **E4 扩展性** | 1000 证据延迟 0.179ms | 500x 快于 LLM 调用 |
|
|
178
|
+
|
|
179
|
+
> 完整实验数据:`experiment/liquid_benchmark_results/`
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 理论来源
|
|
184
|
+
|
|
185
|
+
- **液环理论** — 飞哥原创,11 轮实验,4 个实证包
|
|
186
|
+
- **核心论文** — [Liquid Loop: Self-Organizing Cognitive Memory for AI Agents](docs/液环论文框架.md)
|
|
187
|
+
- **竞品调研** — 2024-2026 Agent Memory 50+ 篇论文全景扫描
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 项目结构
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
liquid-loop/
|
|
195
|
+
├── liquid_loop/
|
|
196
|
+
│ ├── __init__.py # 公共 API 导出
|
|
197
|
+
│ ├── workspace.py # 核心数据模型
|
|
198
|
+
│ ├── storage.py # JSON 持久化
|
|
199
|
+
│ ├── entropy.py # 四维熵值计算
|
|
200
|
+
│ └── cli.py # Click CLI (9 命令)
|
|
201
|
+
├── examples/
|
|
202
|
+
│ └── quickstart.py
|
|
203
|
+
├── tests/ # 待补充
|
|
204
|
+
├── pyproject.toml
|
|
205
|
+
├── README.md
|
|
206
|
+
├── LICENSE
|
|
207
|
+
└── CHANGELOG.md
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 开发
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
git clone https://gitee.com/feixubuke/liquid-loop.git
|
|
216
|
+
cd liquid-loop
|
|
217
|
+
pip install -e ".[dev]"
|
|
218
|
+
pytest -v
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## 路线图
|
|
224
|
+
|
|
225
|
+
- [ ] 语义一致性结晶(嵌入相似度替代精确匹配)
|
|
226
|
+
- [ ] 多 Agent 液环耦合
|
|
227
|
+
- [ ] LX 扩展:世界模型预测纳入液环
|
|
228
|
+
- [ ] LoCoMo / LongMemEval 基准对比
|
|
229
|
+
- [ ] 边缘端部署优化(<50KB)
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## 许可证
|
|
234
|
+
|
|
235
|
+
MIT License — 详见 [LICENSE](LICENSE)
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## 致谢
|
|
240
|
+
|
|
241
|
+
液环理论源自飞哥 2026 年 6-7 月对抗训练与实战项目的 11 轮实证沉淀。
|
|
242
|
+
感谢开源社区提供的竞品参考:All-Mem, Mandol, CoreMem, HeLa-Mem 等。
|
|
243
|
+
|
|
244
|
+
> **引用**
|
|
245
|
+
> ```
|
|
246
|
+
> @misc{liquid-loop-2026,
|
|
247
|
+
> title={Liquid Loop: Self-Organizing Cognitive Memory for AI Agents},
|
|
248
|
+
> author={Fei Ge},
|
|
249
|
+
> year={2026},
|
|
250
|
+
> url={https://gitee.com/feixubuke/liquid-loop}
|
|
251
|
+
> }
|
|
252
|
+
> ```
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
liquid_loop/__init__.py
|
|
5
|
+
liquid_loop/cli.py
|
|
6
|
+
liquid_loop/entropy.py
|
|
7
|
+
liquid_loop/storage.py
|
|
8
|
+
liquid_loop/workspace.py
|
|
9
|
+
liquid_loop.egg-info/PKG-INFO
|
|
10
|
+
liquid_loop.egg-info/SOURCES.txt
|
|
11
|
+
liquid_loop.egg-info/dependency_links.txt
|
|
12
|
+
liquid_loop.egg-info/entry_points.txt
|
|
13
|
+
liquid_loop.egg-info/requires.txt
|
|
14
|
+
liquid_loop.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
liquid_loop
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "liquid-loop"
|
|
7
|
+
version = "0.1.1"
|
|
8
|
+
description = "Self-Organizing Cognitive Memory for AI Agents — Liquid Loop theory implementation"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = {text = "MIT"}
|
|
11
|
+
authors = [
|
|
12
|
+
{name = "Fei Ge", email = "feixubuke@example.com"}
|
|
13
|
+
]
|
|
14
|
+
maintainers = [
|
|
15
|
+
{name = "Fei Ge", email = "feixubuke@example.com"}
|
|
16
|
+
]
|
|
17
|
+
keywords = [
|
|
18
|
+
"agent-memory",
|
|
19
|
+
"cognitive-architecture",
|
|
20
|
+
"self-organizing",
|
|
21
|
+
"liquid-loop",
|
|
22
|
+
"entropy",
|
|
23
|
+
"ai-agents",
|
|
24
|
+
"memory-management"
|
|
25
|
+
]
|
|
26
|
+
classifiers = [
|
|
27
|
+
"Development Status :: 3 - Alpha",
|
|
28
|
+
"Intended Audience :: Developers",
|
|
29
|
+
"Intended Audience :: Science/Research",
|
|
30
|
+
"License :: OSI Approved :: MIT License",
|
|
31
|
+
"Programming Language :: Python :: 3",
|
|
32
|
+
"Programming Language :: Python :: 3.10",
|
|
33
|
+
"Programming Language :: Python :: 3.11",
|
|
34
|
+
"Programming Language :: Python :: 3.12",
|
|
35
|
+
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
36
|
+
"Topic :: Software Development :: Libraries",
|
|
37
|
+
]
|
|
38
|
+
requires-python = ">=3.10"
|
|
39
|
+
dependencies = [
|
|
40
|
+
"click>=8.1.0",
|
|
41
|
+
"pyyaml>=6.0",
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
[project.optional-dependencies]
|
|
45
|
+
dev = [
|
|
46
|
+
"pytest>=7.4.0",
|
|
47
|
+
"pytest-cov>=4.1.0",
|
|
48
|
+
"ruff>=0.1.0",
|
|
49
|
+
"mypy>=1.5.0",
|
|
50
|
+
]
|
|
51
|
+
docs = [
|
|
52
|
+
"mkdocs>=1.5.0",
|
|
53
|
+
"mkdocs-material>=9.4.0",
|
|
54
|
+
"mkdocstrings[python]>=0.24.0",
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
[project.urls]
|
|
58
|
+
Homepage = "https://gitee.com/feixubuke/liquid-loop"
|
|
59
|
+
Repository = "https://gitee.com/feixubuke/liquid-loop"
|
|
60
|
+
Documentation = "https://liquid-loop.readthedocs.io"
|
|
61
|
+
Issues = "https://gitee.com/feixubuke/liquid-loop/issues"
|
|
62
|
+
Changelog = "https://gitee.com/feixubuke/liquid-loop/blob/main/CHANGELOG.md"
|
|
63
|
+
|
|
64
|
+
[project.scripts]
|
|
65
|
+
liquid-loop = "liquid_loop.cli:main"
|
|
66
|
+
|
|
67
|
+
[tool.setuptools.packages.find]
|
|
68
|
+
where = ["."]
|
|
69
|
+
include = ["liquid_loop*"]
|
|
70
|
+
|
|
71
|
+
[tool.setuptools.package-data]
|
|
72
|
+
"*" = ["*.md", "*.txt", "*.yaml", "*.yml"]
|
|
73
|
+
|
|
74
|
+
[tool.pytest.ini_options]
|
|
75
|
+
testpaths = ["tests"]
|
|
76
|
+
python_files = ["test_*.py"]
|
|
77
|
+
python_functions = ["test_*"]
|
|
78
|
+
addopts = "-v --tb=short"
|
|
79
|
+
|
|
80
|
+
[tool.ruff]
|
|
81
|
+
target-version = "py310"
|
|
82
|
+
line-length = 100
|
|
83
|
+
select = ["E", "F", "I", "UP", "B", "C4", "SIM", "T20"]
|
|
84
|
+
ignore = ["S101", "T201"]
|
|
85
|
+
exclude = [".git", "__pycache__", "dist", "build", "*.egg-info"]
|
|
86
|
+
|
|
87
|
+
[tool.mypy]
|
|
88
|
+
python_version = "3.10"
|
|
89
|
+
warn_return_any = true
|
|
90
|
+
warn_unused_configs = true
|
|
91
|
+
disallow_untyped_defs = false
|
|
92
|
+
ignore_missing_imports = true
|