Repository navigation
Releases: Wike-CHI/aer
Release list
AER v0.6.1
这是一个修复版本
v0.6.0 在 Windows 上装不上:
$ pip install aer-runtime
ERROR: Could not find a version that satisfies the requirement neug==0.2.0
(from aer-runtime) (from versions: none)
ERROR: No matching distribution found for neug==0.2.0
neug==0.2.0 在 PyPI 上只有 macOS(arm64) 与 Linux(manylinux) 的 wheel——没有 Windows wheel,也没有 sdist。而它被声明成必需依赖,于是整条安装失败,且失败在依赖解析阶段,在 AER 自己的代码被碰到之前。
这不是 v0.6.0 的制品有问题:同一份 wheel 从 PyPI 装进隔离目录后,import aer、AER() 建库、迁移到 0004、写入 Run 全部正常。
改了什么
neug 从必需依赖改为 knowledge extra。这不是权宜之计:整个 aer/ 包里 neug 只有一处引用,而且是函数内导入(aer/knowledge/neug.py),没有任何顶层 import neug。实测把 neug 完全去掉,import aer、AER()、验证、提炼、备份冒烟全部正常,只有引擎侧检索不可用。
pip install aer-runtime # 现在在任何平台都能装上
pip install "aer-runtime[knowledge]" # 再加上检索(NeuG 知识索引)没有用环境标记(platform_system != 'Windows'):它把「这个平台没有分发」写成「这个平台不需要」,下一个读到的人会以为引擎在 Windows 上没必要装,而事实是装不上。
生产镜像同步改了:Dockerfile 现在写 --editable '.[knowledge]'。这一步不能漏——否则镜像能构建、能迁移、能过冒烟,然后在生产第一次检索时报 ImportError。CI 现在对着 /app/requirements.frozen.txt 断言 neug 确实在里面。
验证
1033 passed / 2 skipped(本机无 neug wheel,属既有平台跳过)
ruff / format / mypy clean
python -m build + twine check --strict PASSED
元数据 Requires-Dist 只剩 alembic / pydantic / sqlalchemy
Provides-Extra: knowledge → neug==0.2.0; extra == "knowledge"
制品冒烟 import aer · head_revision()=0004 · AER() 建库并写入 Run
CI 质量门禁 + 容器构建与端到端(含"镜像里真的有 neug")全绿
生产部署 6/6 冒烟通过 · aer 0.6.1 · revision 0004 (head 0004)
新增一条行为测试:在子进程里用 sys.meta_path 拦截器屏蔽 neug,再 import aer——必须成功。这比语法检查强:CI 上装了引擎,只有主动屏蔽才能证明它「不被需要」。
Windows 依赖解析(修复的直接证明):
不带 extra → Would install ... aer-runtime-0.6.1 ... 成功
带 [knowledge] → 明确报 No matching distribution found for neug
拿不到引擎时在安装期就报错,而不是装完才坏
Highlights(自 v0.6.0 起未变)
Agent 执行轨迹
AER嵌入式运行时 +RunContext生命周期句柄,无需任何外部服务run.tool()/run.recovery():异常路径也保证写出结束事件- 统一 Error 管道
run.error():结构化落库 + 脱敏后的 stack trace
独立验证
- 四类验证器:
DETERMINISTIC/ENVIRONMENT/HUMAN/LLM,唯一验证管道 verified_success区分「Agent 说完成」与「独立确认完成」- 验证可以发生在 Agent 结束之后,甚至由另一个进程按
run_id补做
经验提炼
kind ∈ {SUCCESS, RECOVERY, FAILURE},由运行事实判定,Provider 只能建议- 失败同样被提炼;
FAILURE不承载solution - 生命周期受状态机约束;
REUSED及以上在用量统计落地前不可达
检索(M6)
- SQLite → 嵌入式图索引的可重建投影,BM25 + 图过滤
- 结果分
guidance与warnings:只有被独立确认的结果能进guidance - 需要
[knowledge]extra(见上)
工程基础设施
- SQLite WAL + Alembic 迁移(
0001–0004);已发布 revision 不允许改写 - 在线备份 / 显式恢复 / 灾难恢复与跨版本恢复演练(均已真实执行)
- 非 root 容器镜像、CI、CD、备份 → 迁移 → 冒烟 → 记录的部署顺序
- PyPI Trusted Publishing(OIDC),仓库里没有任何凭据
Core semantics
Agent execution: SUCCESS # Agent 做完了它认为该做的事
Verification: FAILED # 真实环境没有满足最终要求
Verified success: FALSE
- execution success ≠ verified success;
verified_success是派生判断,不落库 - 执行事实不会被验证结果覆盖;验证失败不改写
Run.status - 失败与恢复同样是可复用的经验,但
FAILURE不承载solution - 未验证的方案不会升级为可信经验(模型 frozen,只能经
transition_to()) - 崩溃 ≠ 结论:验证器/提炼器抛异常时写
ERROR,绝不伪造passed=false
Known limitations
- 检索需要
[knowledge]extra,且neug无 Windows 分发——Windows 上装不了引擎侧检索
(其余功能全部可用)。 - 检索只有 BM25 + 图过滤:没有 embedding,没有 HNSW 向量检索。
- 没有经验使用统计:不记录
reuse_count/success_rate,因此REUSED及以上不可达。 - Sanitizer 尚未完整实现:只覆盖降级 fallback 的
repr与 stack trace 文本;
调用方传入的结构化 payload(tool input/output、event payload、verification message)
是原样落库的,不会自动清洗。 - 没有通用 CLI、没有 FastAPI、没有 Dashboard:唯一的命令行入口是知识索引运维
(python -m aer.knowledge)。 - 没有 Workflow / Dataset / 模型训练。
- 备份只在每次部署前产生 → RPO = 距最近一次成功部署的时间,没有周期性备份。
- 单机 / 单进程设计:不支持多进程并发写。
安装
pip install aer-runtime # 任何平台
pip install "aer-runtime[knowledge]" # 再加检索(macOS / Linux)容器:
docker build -t aer:local .
docker run --rm aer:local # 打印版本后立即退出文档
README.mdCONTRIBUTING.mdSECURITY.mddocs/DECISIONS.md—— 本次的决定是 D-065docs/DEPLOYMENT.md
许可证:Apache-2.0(LICENSE)
AER v0.6.0
Highlights
Agent 执行轨迹
AER嵌入式运行时 +RunContext生命周期句柄,无需任何外部服务run.tool()/run.recovery()上下文管理器:异常路径也保证写出结束事件- 统一 Error 管道
run.error():结构化落库 + 脱敏后的 stack trace - Event
sequence严格递增,TASK_START/TASK_END自动写入
独立验证
VerificationEngine是唯一验证管道,四类验证器:DETERMINISTIC(HttpStatusVerifier/
H1CountVerifier/JsonValidVerifier/PredicateVerifier)、ENVIRONMENT、HUMAN、LLMverified_success明确区分「Agent 说完成」与「独立确认完成」- 验证可以发生在 Agent 结束之后,甚至可以由另一个进程按
run_id补做
经验提炼
run.distill()→Experience+ExperienceSource,kind ∈ {SUCCESS, RECOVERY, FAILURE}kind与status由确定性代码按运行事实判定,模型只能提供被记录的建议- 生命周期受状态机约束(
aer/runtime/lifecycle.py是唯一规则来源) - 提炼幂等:同一 Run 重复
distill()返回同一条;不同 Run 的相同 claim 合并来源
检索(M6)
- 把 SQLite 里的 Experience 投影到嵌入式图索引(NeuG 0.2.0),用 BM25 + 图过滤做第一版可信检索
SQLite 是唯一事实源,NeuG 只是可重建投影:删掉整个/srv/aer/knowledge,代价是重建一次,不是丢数据- 结果分
guidance与warnings:只有被独立确认的结果能进guidance;kind=FAILURE只进warnings - 运维入口:
python -m aer.knowledge status | project | rebuild
工程基础设施
- SQLite 持久化 + Alembic 迁移(revision
0001–0004) - 在线备份(完整性校验 + sidecar 元数据)/ 显式恢复 / 灾难恢复演练
- Docker 镜像(非 root uid 10001)、CI、CD、不可变镜像
- 本版本新增:Apache-2.0
LICENSE、CONTRIBUTING.md、SECURITY.md、
PyPI Trusted Publishing 发布流水线
Core semantics
三条分开的事实,不合并:
Agent execution: SUCCESS # Agent 做完了它认为该做的事
Verification: FAILED # 真实环境没有满足最终要求
Verified success: FALSE
- execution success ≠ verified success.
run.success()只是 Agent 的自述。 - 验证证据独立于 Agent 自述。
verified_success是派生判断,不落库。 - 执行事实不会被验证结果覆盖。 验证失败不改写
Run.status;Tool 失败也不会自动把
Run 标成 FAILED——Agent 可能自己恢复。 - 失败与恢复同样是可复用的经验。
verified_success == false不是丢弃理由;
Agent 误判成功是最有价值的信号之一。但FAILURE不承载solution。 - 未验证的方案不会升级为可信经验。 生命周期
RAW → DISTILLED → VERIFIED → …只能经
transition_to()/mark_verified()变更(模型为 frozen)。 - 崩溃 ≠ 结论。 验证器 / 提炼器抛异常时写
ERROR+ErrorRecord,绝不伪造
passed=false,也不产出半条Experience。
Infrastructure
- SQLite:WAL、外键、
synchronous=NORMAL、busy_timeout=5000;八张表
(runs/events/errors/recoveries/verifications/experiences/
experience_sources+alembic_version) - 迁移:Schema 全程由 Alembic 管理,
Base.metadata只是 autogenerate 的输入;
已发布的 revision 不允许改写,历史库可前向升到 head - 备份 / 恢复:
scripts/backup_sqlite.py(在线备份 API + 完整性校验)/
scripts/restore_sqlite.py(必须显式给源与目标) - 灾备已实测,不是承诺:备份在隔离目录被真实恢复、迁移,并由线上镜像冒烟通过(6/6);
恢复也可以直接从只读挂载的备份进行。跨版本恢复同样验证过:一份 revision0003
的备份经当前镜像恢复到0004,历史记录逐字段保全 - 迁移:Schema 变更必须新增 revision;本版新增 D-064——迁移脚本随 wheel 分发,
使pip install aer-runtime成为一条自足的路径 - 部署:
pull → 备份 → 迁移 → 冒烟 → 记录 current.env;任一步失败即失败;
回滚只切镜像,不自动降级数据库 - 镜像:非 root(uid 10001)、数据永远在 bind mount、构建期固化 NeuG 全文扩展,
使检索不需要网络;只用sha-<commit>标签,不发可变标签 - CI/CD:PR 跑质量门禁 + 全新库迁移 + 镜像构建 + 容器端到端;
main重跑门禁后部署 - 发布:
.github/workflows/publish.yml用 PyPI Trusted Publishing(OIDC),
仓库中没有任何 PyPI 凭据;上传前会在干净虚拟环境里安装 wheel 并真的建一个库
Known limitations
这一版没有做的事情,写清楚比宣称能力重要:
- 检索只有 BM25 + 图过滤。 没有 embedding,没有 HNSW 向量检索(留给 M6.5)。
- 没有经验使用统计。 不记录
reuse_count/success_rate,因此经验生命周期的
REUSED及以上不可达——不存在任何到达它们的转换。 - Sanitizer 尚未完整实现。 现在只覆盖两处:降级 fallback 的
repr与 stack trace 文本。
调用方传入的结构化 payload(tool input/output、event payload、verification message)
是原样落库的,不会被清洗。 不要依赖 AER 替你过滤凭据或个人信息。 - 没有通用 CLI、没有 FastAPI、没有 Dashboard。 唯一的命令行入口是知识索引运维
(python -m aer.knowledge),而且它假定 Python 环境里能import aer。 - 没有 Workflow、没有 Dataset、没有模型训练。
- 备份只在每次部署前产生。 所以 RPO = 距最近一次成功部署的时间,没有周期性备份。
- 单机 / 单进程设计。 不依赖 Redis / Kafka / PostgreSQL / 独立向量库;代价是没有多进程
并发写的支持(Sequence 分配是单进程锁 + 唯一约束兜底)。 - PyPI 首次上传需要人工完成一次配置:在 PyPI 登记 Trusted Publisher
(仓库Wike-CHI/aer/ workflowpublish.yml/ environmentpypi)。
步骤见docs/DEPLOYMENT.md第 20 节。在那之前pip install aer-runtime还不成立。
安装
源码(当前推荐):
git clone https://github.com/Wike-CHI/aer.git
cd aer
python -m venv .venv && . .venv/bin/activate
pip install -e ".[dev]"容器:
docker build -t aer:local .
docker run --rm aer:local # 打印版本后立即退出发行版 pip install aer-runtime 的通道已经建好,但只在首次成功发布到 PyPI 之后成立。
文档
README.md—— 快速开始、核心语义、项目结构CONTRIBUTING.md—— 开发、测试与迁移红线SECURITY.md—— 支持的版本、漏洞上报与设计限制docs/DECISIONS.md—— 架构决策记录(D-001 起)docs/DEPLOYMENT.md—— 部署、灾备与 PyPI 发布
许可证:Apache-2.0(LICENSE)