liorium 0.1.0__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.
- liorium-0.1.0/.gitignore +30 -0
- liorium-0.1.0/LICENSE +21 -0
- liorium-0.1.0/PKG-INFO +420 -0
- liorium-0.1.0/README.md +367 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/__init__.py +57 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/agent.py +1072 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/context.py +110 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/realm/__init__.py +35 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/realm/base.py +31 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/realm/manager.py +809 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/realm/subagent.py +941 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/runtime/__init__.py +13 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/runtime/checkpoint.py +121 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/runtime/loop.py +196 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/runtime/middleware/__init__.py +80 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/runtime/middleware/compact.py +1008 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/runtime/middleware/context_merge.py +74 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/runtime/middleware/mm_bridge.py +254 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/runtime/middleware/server_tools.py +58 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/runtime/middleware/tool_repair.py +82 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/runtime/output_store.py +444 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/runtime/prompt.py +118 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/runtime/repair.py +152 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/runtime/scheduler.py +207 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/runtime/state.py +63 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/runtime/stream.py +456 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/runtime/tools.py +201 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/runtime/types.py +62 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/runtime/usage.py +253 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/spec.py +256 -0
- liorium-0.1.0/packages/liorium-agent/src/liorium/agent/status.py +91 -0
- liorium-0.1.0/packages/liorium-cli/src/liorium/cli/__init__.py +17 -0
- liorium-0.1.0/packages/liorium-cli/src/liorium/cli/__main__.py +8 -0
- liorium-0.1.0/packages/liorium-cli/src/liorium/cli/app.py +472 -0
- liorium-0.1.0/packages/liorium-cli/src/liorium/cli/env.py +293 -0
- liorium-0.1.0/packages/liorium-cli/src/liorium/cli/providers.py +225 -0
- liorium-0.1.0/packages/liorium-cli/src/liorium/cli/session.py +1418 -0
- liorium-0.1.0/packages/liorium-cli/src/liorium/cli/subagents.py +469 -0
- liorium-0.1.0/packages/liorium-cli/src/liorium/cli/ui.py +207 -0
- liorium-0.1.0/packages/liorium-core/src/liorium/core/__init__.py +106 -0
- liorium-0.1.0/packages/liorium-core/src/liorium/core/canonical.py +76 -0
- liorium-0.1.0/packages/liorium-core/src/liorium/core/errors.py +138 -0
- liorium-0.1.0/packages/liorium-core/src/liorium/core/log.py +53 -0
- liorium-0.1.0/packages/liorium-core/src/liorium/core/paths.py +94 -0
- liorium-0.1.0/packages/liorium-core/src/liorium/core/ports.py +67 -0
- liorium-0.1.0/packages/liorium-core/src/liorium/core/types.py +264 -0
- liorium-0.1.0/packages/liorium-core/src/liorium/core/uri.py +226 -0
- liorium-0.1.0/packages/liorium-core-tool/src/liorium/core_tool/__init__.py +23 -0
- liorium-0.1.0/packages/liorium-core-tool/src/liorium/core_tool/edit.py +175 -0
- liorium-0.1.0/packages/liorium-core-tool/src/liorium/core_tool/execute.py +326 -0
- liorium-0.1.0/packages/liorium-core-tool/src/liorium/core_tool/find.py +178 -0
- liorium-0.1.0/packages/liorium-core-tool/src/liorium/core_tool/format.py +325 -0
- liorium-0.1.0/packages/liorium-core-tool/src/liorium/core_tool/read.py +994 -0
- liorium-0.1.0/packages/liorium-core-tool/src/liorium/core_tool/runtime.py +364 -0
- liorium-0.1.0/packages/liorium-core-tool/src/liorium/core_tool/search.py +188 -0
- liorium-0.1.0/packages/liorium-core-tool/src/liorium/core_tool/sniff.py +133 -0
- liorium-0.1.0/packages/liorium-core-tool/src/liorium/core_tool/tools.py +70 -0
- liorium-0.1.0/packages/liorium-core-tool/src/liorium/core_tool/write.py +89 -0
- liorium-0.1.0/packages/liorium-core-tool-realm/src/liorium/core_tool_realm/__init__.py +18 -0
- liorium-0.1.0/packages/liorium-core-tool-realm/src/liorium/core_tool_realm/realm.py +177 -0
- liorium-0.1.0/packages/liorium-mcp/src/liorium/mcp/__init__.py +57 -0
- liorium-0.1.0/packages/liorium-mcp/src/liorium/mcp/client.py +327 -0
- liorium-0.1.0/packages/liorium-mcp/src/liorium/mcp/realm.py +394 -0
- liorium-0.1.0/packages/liorium-mcp/src/liorium/mcp/schema.py +97 -0
- liorium-0.1.0/packages/liorium-mcp/src/liorium/mcp/tools.py +53 -0
- liorium-0.1.0/packages/liorium-memory/src/liorium/memory/__init__.py +69 -0
- liorium-0.1.0/packages/liorium-memory/src/liorium/memory/embeddings.py +157 -0
- liorium-0.1.0/packages/liorium-memory/src/liorium/memory/extract.py +379 -0
- liorium-0.1.0/packages/liorium-memory/src/liorium/memory/fts.py +454 -0
- liorium-0.1.0/packages/liorium-memory/src/liorium/memory/graph.py +662 -0
- liorium-0.1.0/packages/liorium-memory/src/liorium/memory/indexer.py +253 -0
- liorium-0.1.0/packages/liorium-memory/src/liorium/memory/migrate.py +473 -0
- liorium-0.1.0/packages/liorium-memory/src/liorium/memory/realm.py +734 -0
- liorium-0.1.0/packages/liorium-memory/src/liorium/memory/search.py +337 -0
- liorium-0.1.0/packages/liorium-memory/src/liorium/memory/store.py +1618 -0
- liorium-0.1.0/packages/liorium-memory/src/liorium/memory/tools.py +282 -0
- liorium-0.1.0/packages/liorium-memory/src/liorium/memory/vectors.py +331 -0
- liorium-0.1.0/packages/liorium-provider-manager/src/liorium/provider/__init__.py +229 -0
- liorium-0.1.0/packages/liorium-provider-manager/src/liorium/provider/catalog.py +660 -0
- liorium-0.1.0/packages/liorium-provider-manager/src/liorium/provider/constants.py +48 -0
- liorium-0.1.0/packages/liorium-provider-manager/src/liorium/provider/discovery.py +235 -0
- liorium-0.1.0/packages/liorium-provider-manager/src/liorium/provider/errors.py +17 -0
- liorium-0.1.0/packages/liorium-provider-manager/src/liorium/provider/formats.py +918 -0
- liorium-0.1.0/packages/liorium-provider-manager/src/liorium/provider/registry.py +371 -0
- liorium-0.1.0/packages/liorium-provider-manager/src/liorium/provider/schema.py +382 -0
- liorium-0.1.0/packages/liorium-provider-manager/src/liorium/provider/thinking.py +280 -0
- liorium-0.1.0/packages/liorium-provider-manager/src/liorium/provider/thinking_caps.py +376 -0
- liorium-0.1.0/packages/liorium-realm-base/src/liorium/realm_base/__init__.py +43 -0
- liorium-0.1.0/packages/liorium-realm-base/src/liorium/realm_base/base.py +477 -0
- liorium-0.1.0/packages/liorium-realm-base/src/liorium/realm_base/tools.py +98 -0
- liorium-0.1.0/packages/liorium-skills/src/liorium/skills/__init__.py +45 -0
- liorium-0.1.0/packages/liorium-skills/src/liorium/skills/catalog.py +135 -0
- liorium-0.1.0/packages/liorium-skills/src/liorium/skills/frontmatter.py +115 -0
- liorium-0.1.0/packages/liorium-skills/src/liorium/skills/realm.py +277 -0
- liorium-0.1.0/packages/liorium-skills/src/liorium/skills/tools.py +28 -0
- liorium-0.1.0/packages/liorium-todo-realm/src/liorium/todo_realm/__init__.py +50 -0
- liorium-0.1.0/packages/liorium-todo-realm/src/liorium/todo_realm/model.py +143 -0
- liorium-0.1.0/packages/liorium-todo-realm/src/liorium/todo_realm/realm.py +222 -0
- liorium-0.1.0/packages/liorium-vfs/src/liorium/vfs/__init__.py +13 -0
- liorium-0.1.0/packages/liorium-vfs/src/liorium/vfs/fs.py +582 -0
- liorium-0.1.0/packages/liorium-vfs/src/liorium/vfs/locks.py +83 -0
- liorium-0.1.0/packages/liorium-vfs/src/liorium/vfs/node.py +197 -0
- liorium-0.1.0/pyproject.toml +162 -0
- liorium-0.1.0/src/liorium/__init__.py +28 -0
liorium-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
.venv/
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
dist/
|
|
6
|
+
build/
|
|
7
|
+
.pytest_cache/
|
|
8
|
+
.ruff_cache/
|
|
9
|
+
.coverage
|
|
10
|
+
htmlcov/
|
|
11
|
+
uv.lock.bak
|
|
12
|
+
*.db
|
|
13
|
+
*.db-shm
|
|
14
|
+
*.db-wal
|
|
15
|
+
/tmp/
|
|
16
|
+
.idea/
|
|
17
|
+
.vscode/
|
|
18
|
+
# CLI Agent 的工作目录(checkpoint / prompt / realm 状态)
|
|
19
|
+
.liorium-*/
|
|
20
|
+
# 本地 demo / 练习工作区,不属于框架本体
|
|
21
|
+
akaSys/
|
|
22
|
+
3d/
|
|
23
|
+
# 本地计划 / 草稿
|
|
24
|
+
__dev__/
|
|
25
|
+
|
|
26
|
+
# 本地配置(含密钥):.env / .env.local 不入库,只提交 .env.example
|
|
27
|
+
.env
|
|
28
|
+
.env.local
|
|
29
|
+
.env.*.local
|
|
30
|
+
!.env.example
|
liorium-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 liwusen
|
|
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.
|
liorium-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: liorium
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Liorium:可嵌入的 LLM Agent 框架 —— 一个发行版内含 core / vfs / realm / agent / memory / skills / mcp / todo / provider / cli 全部 10 个模块
|
|
5
|
+
Project-URL: Homepage, https://github.com/liwusen/liorium-framework
|
|
6
|
+
Project-URL: Repository, https://github.com/liwusen/liorium-framework
|
|
7
|
+
Project-URL: Documentation, https://github.com/liwusen/liorium-framework/tree/main/docs
|
|
8
|
+
Project-URL: Changelog, https://github.com/liwusen/liorium-framework/releases
|
|
9
|
+
Project-URL: Issues, https://github.com/liwusen/liorium-framework/issues
|
|
10
|
+
Author: liwusen
|
|
11
|
+
License: MIT
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: agent,framework,langchain,langgraph,llm,mcp,realm
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
21
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
22
|
+
Requires-Python: >=3.11
|
|
23
|
+
Requires-Dist: aiosqlite
|
|
24
|
+
Requires-Dist: httpx<1,>=0.27
|
|
25
|
+
Requires-Dist: langchain-core<1.7,>=1.6
|
|
26
|
+
Requires-Dist: langchain<1.5,>=1.4
|
|
27
|
+
Requires-Dist: langgraph-checkpoint-sqlite<4,>=3.0
|
|
28
|
+
Requires-Dist: langgraph<1.3,>=1.2
|
|
29
|
+
Requires-Dist: pydantic<3,>=2.7
|
|
30
|
+
Requires-Dist: pyyaml>=6
|
|
31
|
+
Provides-Extra: all
|
|
32
|
+
Requires-Dist: langchain-anthropic<2,>=1.7; extra == 'all'
|
|
33
|
+
Requires-Dist: langchain-google-genai<5,>=4.4; extra == 'all'
|
|
34
|
+
Requires-Dist: langchain-openai<2,>=1.6; extra == 'all'
|
|
35
|
+
Requires-Dist: mcp<2,>=1.28; extra == 'all'
|
|
36
|
+
Requires-Dist: nano-vectordb==0.0.4.3; extra == 'all'
|
|
37
|
+
Requires-Dist: numpy>=2; extra == 'all'
|
|
38
|
+
Requires-Dist: pillow>=10; extra == 'all'
|
|
39
|
+
Provides-Extra: anthropic
|
|
40
|
+
Requires-Dist: langchain-anthropic<2,>=1.7; extra == 'anthropic'
|
|
41
|
+
Provides-Extra: google
|
|
42
|
+
Requires-Dist: langchain-google-genai<5,>=4.4; extra == 'google'
|
|
43
|
+
Provides-Extra: images
|
|
44
|
+
Requires-Dist: pillow>=10; extra == 'images'
|
|
45
|
+
Provides-Extra: mcp
|
|
46
|
+
Requires-Dist: mcp<2,>=1.28; extra == 'mcp'
|
|
47
|
+
Provides-Extra: openai
|
|
48
|
+
Requires-Dist: langchain-openai<2,>=1.6; extra == 'openai'
|
|
49
|
+
Provides-Extra: vector
|
|
50
|
+
Requires-Dist: nano-vectordb==0.0.4.3; extra == 'vector'
|
|
51
|
+
Requires-Dist: numpy>=2; extra == 'vector'
|
|
52
|
+
Description-Content-Type: text/markdown
|
|
53
|
+
|
|
54
|
+
# Liorium
|
|
55
|
+
|
|
56
|
+
**Liorium** 是一个可独立发布的 Agent 框架:**一个发行版 `liorium`,内含 12 个模块**、
|
|
57
|
+
realm 扩展机制、可热重载的运行时、流式事件出口、混合记忆、技能库、MCP 与子代理,
|
|
58
|
+
全部只依赖标准库与公开的 LangChain / LangGraph。
|
|
59
|
+
|
|
60
|
+
- 模块:`liorium.core` / `liorium.vfs` / `liorium.realm_base` / `liorium.core_tool` /
|
|
61
|
+
`liorium.core_tool_realm` / `liorium.agent` / `liorium.memory` / `liorium.skills` /
|
|
62
|
+
`liorium.mcp` / `liorium.todo_realm` / `liorium.provider` / `liorium.cli`
|
|
63
|
+
- 安装:`pip install "liorium[all]"`(全家桶:MCP + 向量记忆 + 三家 provider 适配 + 图片);
|
|
64
|
+
只要框架运行时用 `pip install liorium`;单独选装见下
|
|
65
|
+
- 仓库:<https://github.com/liwusen/liorium-framework>
|
|
66
|
+
|
|
67
|
+
架构决策记录:[`docs/plans/2026-11-04-liorium-agent-core.md`](docs/plans/2026-11-04-liorium-agent-core.md)。
|
|
68
|
+
实现与决策冲突时以决策记录为准;要改结论先改决策记录。
|
|
69
|
+
|
|
70
|
+
当前状态:**Phase 1(v1.0)骨架 + Phase 2(v1.1)能力包完成** —— 12 个模块的 workspace、
|
|
71
|
+
6 个核心工具、Agent 运行时(`run/inject/interrupt/apply`)、基座中间件链、realm 系统、
|
|
72
|
+
子代理、checkpoint 兼容旧库;`liorium-memory` / `liorium-skills` / `liorium-mcp` / `liorium-todo-realm`
|
|
73
|
+
四个 realm 能力包(挂载 + 工具 + 状态 + prompt 片段),以及 `conversation` scope、profile 语法糖、
|
|
74
|
+
MCP mark-dirty reconcile、realm 的**第五拍**(`context_items()` 按回合节奏注入)、多 Agent 宿主示例。`liorium-memory` 已**完整迁移**旧
|
|
75
|
+
`GraphStore`:FTS5 关键词 + nano-vectordb 兼容向量 + RRF 混合检索 + 实体图谱(递归 CTE)
|
|
76
|
+
+ LLM 抽取 + 附件/变更流/记录 + 旧 JSON 迁移,7 个模型工具(详见
|
|
77
|
+
[`docs/MEMORY.md`](docs/MEMORY.md))。
|
|
78
|
+
逐条验收证据见 [`docs/design/ACCEPTANCE.md`](docs/design/ACCEPTANCE.md),模块地图见
|
|
79
|
+
[`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md)。
|
|
80
|
+
|
|
81
|
+
## 模块(`liorium.*`,12 个,同一个发行版)
|
|
82
|
+
|
|
83
|
+
> **发布形态**:PyPI 上只有一个 `liorium`(12 个模块的源码由根 `pyproject.toml` 的
|
|
84
|
+
> `force-include` 打进同一个 wheel),安装时的分档只有 **extras**:
|
|
85
|
+
> `liorium[all]` / `[mcp]` / `[vector]` / `[openai]` / `[anthropic]` / `[google]` / `[images]`。
|
|
86
|
+
> 下表描述的是 workspace 里的模块边界(开发期 `uv sync --all-packages` 逐个装成可编辑包,
|
|
87
|
+
> 架构守卫按这些边界检查依赖方向);它们**不再**各自发到 PyPI。
|
|
88
|
+
|
|
89
|
+
| 包 | 职责 | 依赖 |
|
|
90
|
+
|---|---|---|
|
|
91
|
+
| `liorium-core` | 类型 / URI / 指纹 / 日志 / 端口 | 零第三方依赖 |
|
|
92
|
+
| `liorium-vfs` | `VirtualFileSystem` / `VfsNode` / mount + 环检测 | 零第三方依赖 |
|
|
93
|
+
| `liorium-memory` | 与旧 `memory.sqlite` 同 schema 的存储 + 检索/图谱/抽取 + `MemoryRealm`(`memories://`) | core, vfs, langchain-core(`[vector]` extra:numpy/nano-vectordb/httpx) |
|
|
94
|
+
| `liorium-skills` | `SKILL.md` 目录 + `SkillsRealm`(`skills://` + 技能清单) | core, vfs, langchain-core |
|
|
95
|
+
| `liorium-mcp` | MCP 客户端(stdio/sse/http)+ `McpRealm`(运行时发现工具) | core, langchain-core, mcp |
|
|
96
|
+
| `liorium-todo-realm` | 状态化待办 + `TodoRealm`(`todo` / `todo_list`,每 50 回合提醒) | core, realm-base, langchain-core |
|
|
97
|
+
| `liorium-core-tool` | 六个核心工具的实现 + `ToolRuntime` | core, vfs, langchain-core |
|
|
98
|
+
| `liorium-core-tool-realm` | 核心工具的 **realm 外壳**:写 `RealmSpec(id="core")` 才装(Agent 不再自带任何工具) | core-tool, realm-base, vfs |
|
|
99
|
+
| `liorium-realm-base` | realm 契约与写作 API:`Realm` / `BaseRealm` / `RealmContext` / `JsonStateStore` / `@realm_tool` | core, vfs(`[tools]` extra:langchain-core) |
|
|
100
|
+
| `liorium-provider-manager` | Provider schema / 四种 API 格式 / 思考 / models.dev 目录 / 模型构建 | core, pydantic, httpx, langchain-core(`[openai/anthropic/google/all]`) |
|
|
101
|
+
| `liorium-agent` | LioriumAgent / runtime / middlewares / scheduler / realms | core, vfs, realm-base, langchain, langgraph |
|
|
102
|
+
| `liorium-cli` | 官方命令行 Agent:REPL / 斜杠命令 / 子代理事件查看 | liorium-agent[core,memory-vector,skills,todo], liorium-provider-manager[all] |
|
|
103
|
+
|
|
104
|
+
依赖方向:`core` 是叶子;开发期 `liorium-agent` 对 realm 模块走 extra(`[core]` `[memory]`
|
|
105
|
+
`[skills]` `[mcp]` `[todo]`),发布版这些模块都已在 wheel 里、由上面的 extras 只控制第三方库。
|
|
106
|
+
**Agent 不依赖 `liorium-core-tool`**:六个核心工具由 `liorium-core-tool-realm` 提供,装不装、装哪几个
|
|
107
|
+
由用户在 `AgentSpec.realms` / `toolsets` 里决定。
|
|
108
|
+
**realm 契约与写作 API 在 `liorium-realm-base`**(2026-11-07 从 agent 搬出):写一个 realm
|
|
109
|
+
只需要 `core + vfs`,不背 langchain / langgraph;`liorium-agent` 依赖它并 re-export 旧名字。
|
|
110
|
+
能力包(`liorium-core-tool` / `liorium-core-tool-realm` / `liorium-memory` / `liorium-skills` / `liorium-mcp`)**允许**
|
|
111
|
+
import `liorium.agent` 或更轻的 `liorium.realm_base`(2026-11-06 起);`liorium-todo-realm`
|
|
112
|
+
只依赖 `core + realm_base`,是"能力包不必背 Agent"的示范。能力包之间仍互不依赖。
|
|
113
|
+
|
|
114
|
+
**realm 实例作用域**(2026-11-08):每个 realm 声明 `instance_scope`。
|
|
115
|
+
`"tree"`(memory / skills / mcp / subagents)整棵 Agent 树共享**一份实例**,子代理只借它的工具 ——
|
|
116
|
+
状态文件、VFS 挂载、外部连接都只有一份;`"agent"`(core / todo)每个 Agent 各一份,状态落在
|
|
117
|
+
自己的 `inbox/realm_state/` 下。框架强制约束:`"agent"` 级 realm 返回挂载点会在启动期直接报错,
|
|
118
|
+
所以"父子两套状态抢同一路径"在结构上不可能发生。
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
**第五拍**(2026-11-07 接线):realm 用 `context_every` / `context_first` 声明节奏、
|
|
122
|
+
用 `context_items(turn)` 返回要注入的内容;`RealmManager.context_for_turn()` 在拿到执行位后
|
|
123
|
+
问一次,内容在下一个安全点物化成独立的 `<context>` user 消息(不改历史前缀、不吃缓存)。
|
|
124
|
+
返回空不消费周期 ⇒ 待办清单空着不浪费额度,一有 `pending` / `processing` 立刻提醒。
|
|
125
|
+
|
|
126
|
+
## 文档
|
|
127
|
+
|
|
128
|
+
完整文档入口:[`docs/README.md`](docs/README.md)(按使用者 / 扩展者 / 维护者分三条线,
|
|
129
|
+
附术语表)。
|
|
130
|
+
|
|
131
|
+
| 文档 | 内容 |
|
|
132
|
+
|---|---|
|
|
133
|
+
| [`docs/GUIDE.md`](docs/GUIDE.md) | 从零到跑起来:安装、最小 Agent、事件表、中断/注入、压缩与成本、多 Agent 并发(每段都能跑) |
|
|
134
|
+
| [`docs/API.md`](docs/API.md) | 12 个模块全部公开名字的签名、默认值、异常与不变量 |
|
|
135
|
+
| [`docs/EXTENDING.md`](docs/EXTENDING.md) | 写自定义 Realm / Middleware / 调度参数(`priority` / `FLAG`)/ model_factory / 工具,以及常见坑 |
|
|
136
|
+
| [`docs/MEMORY.md`](docs/MEMORY.md) | 记忆子系统:磁盘布局、检索流水线、内存预算、设计取舍 |
|
|
137
|
+
| [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) | 实现视角的模块地图与一个回合的时序 |
|
|
138
|
+
| [`docs/PUBLISHING.md`](docs/PUBLISHING.md) | 发布流程:Trusted Publishing(OIDC)到 PyPI |
|
|
139
|
+
|
|
140
|
+
## 快速开始
|
|
141
|
+
|
|
142
|
+
### 配置:`.env` 或命令行
|
|
143
|
+
|
|
144
|
+
CLI 的每项配置都能放进当前目录的 `.env`(在仓库里就是仓库根;已被 gitignore,模板见 `.env.example`):
|
|
145
|
+
|
|
146
|
+
```powershell
|
|
147
|
+
Copy-Item .env.example .env # 填 provider / 模型 / 记忆目录 / embedding
|
|
148
|
+
uv run liorium-cli # 或 python -m liorium.cli
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
优先级 **命令行 > 环境变量 > `.env` > 默认**;`--env-file` 指定文件、`--no-env` 不读。
|
|
152
|
+
键名规则:`LIORIUM_` + 选项名大写(`LIORIUM_MODEL`、`LIORIUM_MEMORY_DIR`、`LIORIUM_EMBED_MODEL` …),
|
|
153
|
+
完整清单见 [`.env.example`](.env.example) 与 [MEMORY](docs/MEMORY.md)。
|
|
154
|
+
|
|
155
|
+
### 最小 Agent
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
```python
|
|
159
|
+
import asyncio
|
|
160
|
+
from pathlib import Path
|
|
161
|
+
|
|
162
|
+
from liorium.agent import AgentSpec, Limits, LioriumAgent
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def make_chat_model(label: str):
|
|
166
|
+
from langchain_openai import ChatOpenAI
|
|
167
|
+
provider, model = label.split("::", 1)
|
|
168
|
+
return ChatOpenAI(model=model, base_url="https://api.deepseek.com", api_key="...")
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
async def main() -> None:
|
|
172
|
+
agent = LioriumAgent(
|
|
173
|
+
spec=AgentSpec(
|
|
174
|
+
id="main",
|
|
175
|
+
inbox_dir=Path("agents/main"),
|
|
176
|
+
model="deepseek::chat",
|
|
177
|
+
prompt_sources=("AGENT.md", "ROLE.md", "COREMEMORY.md"),
|
|
178
|
+
limits=Limits(context_window=128_000, max_turns=200),
|
|
179
|
+
),
|
|
180
|
+
model_factory=make_chat_model,
|
|
181
|
+
)
|
|
182
|
+
await agent.start() # 不调模型(计划 §F7)
|
|
183
|
+
try:
|
|
184
|
+
async for event in agent.run("今天出门要带伞吗?"):
|
|
185
|
+
print(event.to_dict()) # start / delta / reasoning_delta / tool_* / done
|
|
186
|
+
finally:
|
|
187
|
+
await agent.close()
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
asyncio.run(main())
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
- 叫停 = `await agent.interrupt(reason="user_stop")` + 一个新的 `run()`(两个回合)。
|
|
194
|
+
- 运行中补充信息 = `await agent.inject([ContextItem(source="trigger:desktop", text="开始下雨了")])`,
|
|
195
|
+
**永不打断**,在下一个安全点物化成独立 user 消息。
|
|
196
|
+
- 热重载 = `await agent.apply(new_spec)`:只重建指纹变化的部件;失败保留旧部件。
|
|
197
|
+
- 清空对话 = `await agent.reset_dialog()`(纯状态写入,不调模型;同时清空
|
|
198
|
+
`state_scope="conversation"` 的 realm 状态)。
|
|
199
|
+
|
|
200
|
+
## CLI Agent(`liorium.cli`)
|
|
201
|
+
|
|
202
|
+
`packages/liorium-cli` 是官方命令行 Agent(不是示例):realm 能力包(**核心工具**
|
|
203
|
+
`read/write/edit/search/find/execute`、**长期记忆(`memories://`)**、**技能库(`skills://`)**、
|
|
204
|
+
**待办**、**子代理**)、流式渲染、`/model` 热切换、`inject`、`clear`、Ctrl+C 中断。模块路径
|
|
205
|
+
`liorium.cli`,入口 `liorium-cli`(等价 `python -m liorium.cli`)。发布版里 CLI 就在 `liorium`
|
|
206
|
+
同一个 wheel 中,装 `pip install "liorium[all]"` 即可,不需要额外的 `liorium-cli` 包。
|
|
207
|
+
|
|
208
|
+
六个核心工具现在是 `core` realm(`liorium.core_tool_realm`):CLI 默认装上,`--no-core-tools`
|
|
209
|
+
则不装(Agent 就一个工具都没有),`--tools read,find` 只装子集。
|
|
210
|
+
|
|
211
|
+
```powershell
|
|
212
|
+
# 装好工作区后直接跑(默认用 provider 配置里的 main_model)
|
|
213
|
+
uv sync --all-packages
|
|
214
|
+
uv run liorium-cli
|
|
215
|
+
|
|
216
|
+
# 指定 provider / 模型
|
|
217
|
+
uv run liorium-cli --provider Go --model deepseek-v4.1-flash
|
|
218
|
+
|
|
219
|
+
# 思考强度(默认 medium;off 关闭)
|
|
220
|
+
uv run liorium-cli --thinking high
|
|
221
|
+
uv run liorium-cli --thinking off --temperature 0.3
|
|
222
|
+
|
|
223
|
+
# models.dev:默认只读本地缓存;refresh 才联网(结果只改内存)
|
|
224
|
+
uv run liorium-cli --models-dev refresh --list-models
|
|
225
|
+
|
|
226
|
+
# 挂上示例技能(skills://session-log,演示"读技能 → 写记忆")
|
|
227
|
+
uv run liorium-cli --skills-dir examples/skills
|
|
228
|
+
|
|
229
|
+
# 只要核心工具,不要记忆 / 技能 / 待办 / 子代理
|
|
230
|
+
uv run liorium-cli --no-memory --no-skills --no-todo --no-subagents
|
|
231
|
+
|
|
232
|
+
# 核心工具只装一部分(读 + 查找 + 执行)
|
|
233
|
+
uv run liorium-cli --tools read,find,execute
|
|
234
|
+
|
|
235
|
+
# 一个工具都不要(零工具装配是合法的)
|
|
236
|
+
uv run liorium-cli --no-core-tools --no-memory --no-skills --no-todo --no-subagents
|
|
237
|
+
|
|
238
|
+
# 把记忆库指到别处(默认 <inbox>/memory,可直接读写既有 memory.sqlite)
|
|
239
|
+
uv run liorium-cli --memory-dir ~/liorium-memory
|
|
240
|
+
|
|
241
|
+
# 单轮 / 管道 / JSON 事件(便于脚本与测试)
|
|
242
|
+
uv run liorium-cli -p "统计仓库里有多少个 .py 文件"
|
|
243
|
+
echo "总结 README" | uv run liorium-cli --json
|
|
244
|
+
|
|
245
|
+
# 列出配置里的全部模型(带格式与上下文长度)
|
|
246
|
+
uv run liorium-cli --list-models
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
配置查找顺序:`--config` → `$LIORIUM_PROVIDER_CONFIG` → `~/.liorium/providers.json`
|
|
250
|
+
→ 当前目录 `providers.json`。全都找不到时**逐项询问**(base_url / key / 模型 / API 格式 /
|
|
251
|
+
上下文长度 / 思考方言),并可选保存到 `~/.liorium/providers.json`。
|
|
252
|
+
Provider 管理(四种 API 格式、思考参数、models.dev 识别、模型构建)由
|
|
253
|
+
[`liorium-provider-manager`](packages/liorium-provider-manager/README.md) 提供。
|
|
254
|
+
|
|
255
|
+
交互命令:`/help` `/model [Provider::model]` `/provider <name>` `/thinking [off|low|medium|high]`
|
|
256
|
+
`/models-dev [status|refresh]` `/clear` `/status` `/tools`
|
|
257
|
+
`/memory [query]` `/skills` `/todo [all]` `/realm [enable|disable] [id]` `/subagent`
|
|
258
|
+
`/reload` `/inject <text>` `/context` `/history [n]` `/exit`。
|
|
259
|
+
|
|
260
|
+
- 记忆:`read memories://` 看目录、`read memories://<path>` 读全文、`/memory <词>` 检索;
|
|
261
|
+
Agent 用 `write memories://<path>` 自己存长期事实(路径当标题)。
|
|
262
|
+
- 技能:`<skills_dir>/<slug>/SKILL.md`,清单自动预载进 system prompt;
|
|
263
|
+
装/卸/改完打 `/reload` 立刻生效(重挂载 + 重取工具 + 重建 prompt,`CacheEpoch` +1)。
|
|
264
|
+
- 子代理:默认启用,模型用 `newSubagent` / `invokeSubagent` / `wait_for_subagents` 驱动
|
|
265
|
+
(并行数量不设上限)。父回合进行中只实时打印关键事件(创建 / 工具 / 完成 / 失败);
|
|
266
|
+
`/subagent` 列状态,`/subagent <name> [n]` 看最近 n 条事件(默认 20),
|
|
267
|
+
`/subagent stop|rm <name>` 停止 / 删除(名字也接受 `subagent-<name>` 或 `agent_id`)。
|
|
268
|
+
- realm 开关:`/realm` 列出每个 realm 的状态 / 工具数 / 挂载 / 上下文节奏,`/realm <id>` 看详情;
|
|
269
|
+
`/realm disable <id>` 与 `/realm enable <id>` 运行期开或关(工具、挂载、prompt 段一起撤下或恢复,
|
|
270
|
+
`epoch` +1,不需要重启 CLI)。装配集合仍由启动参数决定:`--no-memory` 这类要重启才会变。
|
|
271
|
+
- 记忆 / 技能 / 待办在发布版里都在同一个 `liorium` wheel 中,CLI 默认全部装配;
|
|
272
|
+
只有第三方库需要按需选装(`liorium[vector]` / `[mcp]` / `[openai]` …),
|
|
273
|
+
缺这些库时 CLI 打印一条提示并降级,核心工具(`core` realm)照常可用。
|
|
274
|
+
|
|
275
|
+
工作区默认是当前目录(`read/write/edit/search/find/execute` 的相对路径基准),
|
|
276
|
+
Agent 根目录(prompt + checkpoint + 记忆库 + 技能目录 + 子代理)默认是
|
|
277
|
+
`<workspace>/.liorium-cli/agent`,可用
|
|
278
|
+
`--workspace/--inbox/--system/--memory-dir/--skills-dir` 改。Ctrl+C 在生成中是
|
|
279
|
+
**中断当回合**(不退出),在提示符下是退出。
|
|
280
|
+
|
|
281
|
+
## realm 能力模块(v1.1)
|
|
282
|
+
|
|
283
|
+
四个 realm 能力模块都是"工具 + 状态 + `prompt_fragment()`"(前三个还有 VFS 挂载):
|
|
284
|
+
|
|
285
|
+
```python
|
|
286
|
+
from liorium.agent import AgentSpec, RealmSpec, LioriumAgent
|
|
287
|
+
from liorium.memory import MemoryRealm
|
|
288
|
+
from liorium.skills import SkillsRealm
|
|
289
|
+
from liorium.mcp import McpRealm
|
|
290
|
+
from liorium.todo_realm import TodoRealm
|
|
291
|
+
|
|
292
|
+
agent = LioriumAgent(
|
|
293
|
+
spec=AgentSpec(
|
|
294
|
+
id="main",
|
|
295
|
+
inbox_dir=Path("agents/main"),
|
|
296
|
+
model="deepseek::chat",
|
|
297
|
+
prompt_sources=("AGENT.md",),
|
|
298
|
+
realms=[
|
|
299
|
+
RealmSpec(id="memory"), # <inbox>/memory/memory.sqlite
|
|
300
|
+
RealmSpec(id="skills"), # <inbox>/skill.d/*/SKILL.md
|
|
301
|
+
RealmSpec(id="mcp", params={"servers": {"playwright": {"command": "npx", "args": ["@playwright/mcp"]}}}),
|
|
302
|
+
RealmSpec(id="todo"), # <inbox>/realm_state/todo.json;每 50 回合提醒
|
|
303
|
+
],
|
|
304
|
+
),
|
|
305
|
+
model_factory=make_chat_model,
|
|
306
|
+
realm_factories={
|
|
307
|
+
"memory": MemoryRealm,
|
|
308
|
+
"skills": SkillsRealm,
|
|
309
|
+
"mcp": McpRealm,
|
|
310
|
+
"todo": TodoRealm,
|
|
311
|
+
},
|
|
312
|
+
)
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
| 包 | 挂载 / 工具 | 说明 |
|
|
316
|
+
|---|---|---|
|
|
317
|
+
| `liorium-memory` | `memories://`(懒加载投影)、`memory_search` / `memory_list` / `memory_delete` / `memory_tag` / `memory_score` / `memory_graph` / `memory_attach` | SQLite schema 为 v1,可直接读写既有 `memory.sqlite`;读/写/编辑走核心 `read`/`write`/`edit` |
|
|
318
|
+
| `liorium-skills` | `skills://`(只读)、`list_skills` | `<inbox>/skill.d/<slug>/SKILL.md`;技能清单预载进 system prompt,装/卸技能 ⇒ `CacheEpoch +1` |
|
|
319
|
+
| `liorium-mcp` | 无挂载、动态工具 | 工具名 `<server>_<tool>`;`realm.set_servers(...)` 或 `realm.mark_dirty()` 后,**下一个回合边界**自动重连换工具 |
|
|
320
|
+
| `liorium-todo-realm` | 无挂载、`todo` / `todo_list` | 状态化待办(pending/processing/blocked/finished);每 50 回合把未完成清单注入上下文(只在有 pending/processing 时) |
|
|
321
|
+
|
|
322
|
+
> 已知缺口:`McpRealm` 目前没有实现 `Realm.mounts()`,经 `AgentSpec` 装配时会被
|
|
323
|
+
> `RealmManager` 标 `failed`(降级,不影响其它 realm)。`docs/API.md`
|
|
324
|
+
> 的 MCP 一节也标注了同一件事。
|
|
325
|
+
|
|
326
|
+
realm 的 v1.1 可选钩子(能力包实现,Agent 在回合边界 / 拿到执行位后调用):
|
|
327
|
+
|
|
328
|
+
- `dirty()` / `mark_dirty()`:真相源变了就刷新工具/挂载/提示词;
|
|
329
|
+
`clear_dirty()` 由能力包自己实现(`BaseRealm` 没有默认实现,缺省时管理器用
|
|
330
|
+
`mark_dirty(False)` 兜底);
|
|
331
|
+
- `async refresh()`:刷新前重连(MCP 用)或重新对账(memory 用);
|
|
332
|
+
- `skills()`:该 realm 想预载进 prompt「技能清单」段的条目;
|
|
333
|
+
- `context_every` + `context_items(turn)`(第五拍):每 N 回合给一次"要不要说点什么"的机会,
|
|
334
|
+
返回非空才注入、返回空不消费周期;`ctx.inject()` 是同一管道的推送侧。
|
|
335
|
+
|
|
336
|
+
宿主**自己知道**真相源变了(刚装了技能、另一个进程写了记忆库)时,可以不等下一个回合:
|
|
337
|
+
|
|
338
|
+
```python
|
|
339
|
+
await agent.refresh_realms() # force=True:先全部置脏,再刷新 + 重建运行时
|
|
340
|
+
await agent.refresh_realms(force=False) # 只刷新自报 dirty() 的 realm
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
`refresh_realms()` 返回是否真的刷新过;工具 schema / system prompt 变了 `CacheEpoch` 才 +1。
|
|
344
|
+
|
|
345
|
+
运行期开关某个**已装配**的 realm(工具 / 挂载 / prompt 段 / 后台任务一起撤下或恢复):
|
|
346
|
+
|
|
347
|
+
```python
|
|
348
|
+
await agent.set_realm_enabled("todo", False) # 返回调用后是否在运行
|
|
349
|
+
await agent.set_realm_enabled("todo", True)
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
装配集合仍由 `AgentSpec.realms` 决定(未装配的抛 `RealmNotFoundError`);CLI 的
|
|
353
|
+
`/realm` 就是它的薄前端。
|
|
354
|
+
|
|
355
|
+
`conversation` scope:`state_scope="conversation"` 的 realm 状态按 thread 分桶
|
|
356
|
+
(`realm_state/<id>/conversation-<thread>.json`),`await agent.reset_dialog()` 时清空;
|
|
357
|
+
`state_scope="agent"` 的状态跨对话保留。
|
|
358
|
+
|
|
359
|
+
profile 语法糖:
|
|
360
|
+
|
|
361
|
+
```python
|
|
362
|
+
from liorium.agent import Profile
|
|
363
|
+
|
|
364
|
+
profile = Profile(id="chat", realms=(RealmSpec(id="memory"), RealmSpec(id="skills")))
|
|
365
|
+
spec = spec.with_profile(profile) # 显式声明优先;指纹覆盖合并结果
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
## 示例:多 Agent(2 个 Agent + 调用方 semaphore)
|
|
369
|
+
|
|
370
|
+
`examples/multi_agent.py` 演示"并发由调用方控制":两个身份独立的 Agent 并发跑同一条
|
|
371
|
+
任务,用 `asyncio.Semaphore` 包住每个回合的 `async for`(库只保证同一个 Agent 内部排队)。
|
|
372
|
+
|
|
373
|
+
```powershell
|
|
374
|
+
python examples/multi_agent.py -p "用一句话介绍 Liorium" --concurrency 1
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
## 开发
|
|
378
|
+
|
|
379
|
+
```powershell
|
|
380
|
+
uv sync --all-packages --all-extras # 建 .venv 并装好 12 个模块(可编辑包)
|
|
381
|
+
uv run pytest -q # 全量测试(含架构守卫)
|
|
382
|
+
|
|
383
|
+
# 本机 PyPI 慢时用离线模式
|
|
384
|
+
uv sync --all-packages --all-extras --offline
|
|
385
|
+
|
|
386
|
+
# 直接跑测试(用 .venv 里的解释器)
|
|
387
|
+
.\.venv\Scripts\python.exe -m pytest -q -p no:cacheprovider
|
|
388
|
+
.\scripts\test.ps1 -q
|
|
389
|
+
|
|
390
|
+
# 真模型端到端(OpenCode Go)
|
|
391
|
+
$env:OPENCODE_GO_KEY = "<key>"
|
|
392
|
+
$env:OPENCODE_GO_BASE_URL = "https://opencode.ai/zen/go/v1"
|
|
393
|
+
$env:OPENCODE_GO_MODEL = "deepseek-v4.1-flash"
|
|
394
|
+
.\scripts\test.ps1 -q -m live
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
本地联调(把工作区 12 个包以可编辑模式装进任意解释器):
|
|
398
|
+
|
|
399
|
+
```powershell
|
|
400
|
+
./scripts/dev-install-liorium.ps1 # 装进 .venv
|
|
401
|
+
./scripts/dev-install-liorium.ps1 -Python C:\Python311\python.exe -AllExtras
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
发布走 GitHub Actions 的 **Trusted Publishing**(OIDC,无需任何 API token):
|
|
405
|
+
推一个 `v*` tag 即可把 `liorium` 发到 PyPI(12 个模块在同一个 wheel 里,PyPI 侧只需 1 条
|
|
406
|
+
pending publisher,见 [`docs/PUBLISHING.md`](docs/PUBLISHING.md))。
|
|
407
|
+
|
|
408
|
+
## 不变量(违反即跑偏,计划 §8)
|
|
409
|
+
|
|
410
|
+
1. `liorium` 任何包不许 import 旧后端(`tests/test_architecture.py` 用 AST 守这条线)。
|
|
411
|
+
2. 任何包不许读产品配置文件。
|
|
412
|
+
3. 基座中间件顺序不可被 realm 改变。
|
|
413
|
+
4. 不许出现裸 `asyncio.create_task`(一律 `ctx.spawn` / 宿主托管)。
|
|
414
|
+
5. 不许新增 LangChain 消息类型;`Context` 只存在于独立 channel。
|
|
415
|
+
6. 工具 schema 变化必须伴随 `CacheEpoch +1`。
|
|
416
|
+
7. 工具名冲突必须报错。
|
|
417
|
+
8. `run()` 之外没有第二条 Agent 事件流。
|
|
418
|
+
9. VFS 里不放真相(只放投影);realm 状态不放 checkpoint。
|
|
419
|
+
10. 每个 realm 能力包必须提供自己的 realm;只提供工具实现、不提供 realm 的包(如 `liorium-core-tool`)
|
|
420
|
+
由 realm 壳包(`liorium-core-tool-realm`)负责装配,**Agent 自己不添加任何工具**。
|