Metadata-Version: 2.4
Name: polyloop
Version: 1.0.1
Summary: PolyLoop：实验室共用的 Agent 执行内核——一次运行的预算、停止语义、取消、逐步轨迹与 Skill 注入
Project-URL: Homepage, https://gitea.iomgaa.online/iomgaa/PolyLoop
Project-URL: Changelog, https://gitea.iomgaa.online/iomgaa/PolyLoop/src/branch/main/CHANGELOG.md
Project-URL: Issues, https://gitea.iomgaa.online/iomgaa/PolyLoop/issues
Requires-Python: >=3.11
Description-Content-Type: text/markdown
Provides-Extra: gateway
Requires-Dist: polygateway<2,>=1.1; extra == "gateway"
Provides-Extra: dev
Requires-Dist: pytest==9.1.1; extra == "dev"
Requires-Dist: pytest-asyncio==1.4.0; extra == "dev"
Requires-Dist: ruff==0.16.2; extra == "dev"
Requires-Dist: import-linter==2.13; extra == "dev"
Requires-Dist: build==1.5.0; extra == "dev"
Requires-Dist: twine==7.0.0; extra == "dev"

# PolyLoop

实验室共用的 Agent 执行内核。治理单位是**一次运行**：围绕一个目标的有界多轮
「模型决策 → 动作 → 观察」循环，含预算、停止语义、取消、逐步轨迹与 Skill 注入。

它和 PolyGateway 是叠起来的两层。PolyGateway 治理**一次模型调用**（多源、限流、重试、熔断、
缓存、遥测），PolyLoop 治理**一次运行**，并用 PolyGateway 的顶层公共 API 拿模型。
任务编排、批量调度、评分、检索、Skill 的生成与进化都留在下游项目。

---

## 安装

发布在实验室自建的 Gitea PyPI registry 上，公网 PyPI 查它是 404，所以装它必须自己带索引地址：

```bash
pip install --extra-index-url https://gitea.iomgaa.online/api/packages/iomgaa/pypi/simple/ \
    "polyloop==1.0.*"
```

模型调用要经 PolyGateway，那部分是一个单独的 extra——不用它的人不该被迫装上网关：

```bash
pip install --extra-index-url https://gitea.iomgaa.online/api/packages/iomgaa/pypi/simple/ \
    "polyloop[gateway]==1.0.*"
```

写进 `requirements.txt` 的话，那一行 `--extra-index-url` 必须排在 `polyloop` 之前。

**这台开发机上的注意事项**：它设了 `http_proxy` 指向一个到不了外面的本地代理，走代理会失败，
装的时候加 `NO_PROXY=gitea.iomgaa.online`。

## 现状

十个模块全部落地，四层测试都在跑。**还没有任何下游项目真的用过它**——这是它现在最大的未验证项，
下面的阶段清单是唯一的进度权威。

## 消费者与验收标准

| 项目 | 现状 | 本库对它的验收标准 |
|---|---|---|
| dissect | 已有跑着的 `harness/agent/`（loop / context / memory / parser） | **能把那套循环搬到本库上，dissect 原有测试全绿。** 一手需求证据最强 |
| GovDoc-SaaS | 仓库 2026-08-03 起整体重建，实现全部清空，自己的清单停在「构建文档框架」 | **不做迁移验收，做设计级验收**：它真实需要的东西逐条能不能被承载，见 `research-wiki/migrations/govdoc-saas.md`。它将来写 agent 层时是直接长在本库上，不是迁过来 |
| CHSAnalyzer | 还没写到 agent 那一步，只有设计方案 | **远期可以兼容使用。** 它的 agent 需求要么本库能满足，要么明确写进「不属于本库」清单并说明为什么 |

三者的证据强度不同，能进本库的语义也就分档：dissect 和 GovDoc-SaaS 的真实代码是一手证据，
两边都需要的机制才有资格做成稳定内核；CHSAnalyzer 只用来检验边界画得对不对，不能凭它的
设计方案单独长出一个组件——一个没有真实调用方的抽象，等到有调用方那天多半是错的。

## 阶段清单

**这份清单是「当前处在哪个阶段」的唯一权威。** `CLAUDE.md` 不重复这里的内容，只有一条常青规则
（§1.11）要求动手前先看这里——这样阶段推进时不需要改 `CLAUDE.md`，开发结束后把本节删掉即可，
不会在别处留下过期条文。

- [x] ① 协作规范 —— 见 [CLAUDE.md](CLAUDE.md) 与 [research-wiki/README.md](research-wiki/README.md)（文档体系）
- [x] ② 需求对齐 —— 从 dissect 的 `harness/agent/` 与 GovDoc-SaaS 的 `packages/docagent-core/`
      提取真实需求，产出 `research-wiki/migrations/` 下两份迁移文档（删除清单 + 组件映射 + 验收口径），
      并检查 CHSAnalyzer 的 agent 方案落在边界内还是边界外。**这一阶段的产物决定库的边界**，
      所以它排在架构前面：边界画错，后面每一份架构文档都要重写
- [x] ③ 架构 —— `research-wiki/explanation/architecture.md` 与 `pyproject.toml` 的 import-linter 契约。
      架构文档先于代码存在，此期间它是一份规格而不是描述，文档开头须写明这一点
- [x] ④ 测试框架 —— 四层都在跑（划分判据是「依赖什么」，见 [CLAUDE.md](CLAUDE.md) §1.9）。
      e2e 打真实模型网关、会产生真实费用，所以默认不跑：要 `POLYLOOP_E2E=1` 加显式
      `pytest -m e2e`，配置见 [.env.example](.env.example)。`tests/contract/` 那套公共行为
      一致性用例接上了自带的存储实现，解释器与执行器那几条仍等下游把实现接进来
- [x] ⑤ 实现 —— 十个模块全部落地，五个接缝都有调用点。**一处已知欠账**：`stores` 只有逐行
      追加那一种形态，关系数据库那种由下游自己实现，契约套件是它的准入标准
- [ ] ⑥ 迁移验收 —— 真的把 dissect 迁过来，以它原有测试全绿为准。GovDoc-SaaS 那半不是迁移
      而是设计级验收（理由见上面那张表），口径在 `research-wiki/migrations/govdoc-saas.md`

## 本地检查

```
make check   # ruff format --check + ruff check + lint-imports
make test    # pytest（e2e 默认不跑，它打真实网关要花钱）
make ci      # 上面两条
```

还没有 CI workflow，`make ci` 就是当前的全部机器闸，和 PolyGateway 一样。发布怎么做见
[research-wiki/guides/releasing.md](research-wiki/guides/releasing.md)。

文档质量不走机器检查，走 [CLAUDE.md](CLAUDE.md) §3 的「硕士生阅读」评审。

## 参考资料

`reference/` 下的六个仓库与 `agent-core.md` **都只是参考，不是本项目的设计，也不是任何事实的权威**
（理由见 [CLAUDE.md](CLAUDE.md) §0）。它们只读、不改、不入库。

| 位置 | 是什么 |
|---|---|
| `reference/agent-core.md` | 别人为本项目写的一份架构提案。其中任何一条在被我们自己的 design doc 采纳前都不作数 |
| `reference/dissect/` | 消费者，已有 ReAct 循环实现 |
| `reference/GovDoc-SaaS/`（`background` 分支） | 消费者的**旧代码**，第一次抽库尝试 `packages/docagent-core/`。它那边的活仓库已经把这份降级成「只作研究输入，不是当前事实来源」 |
| `reference/GovDoc-Editor/` | GovDoc-SaaS 重构之前的那一版，今天跑在生产上。需求来源，不是迁移对象 |
| `reference/CHSAnalyzer/` | 远期消费者；同时是本仓库协作规范的蓝本 |
| `reference/PolyGateway/` | 本库的依赖，也是「实验室共用库该怎么做」的蓝本 |
| `reference/pi/` | 外部参考实现 |

其余约定见 [CLAUDE.md](CLAUDE.md)，那里是协作规则的唯一来源。
