# PolyLoop 的环境配置模板。复制成 .env 再填,.env 不入库(.gitignore 已经挡了)。 # # 只有 tests/e2e/ 那一层需要它——那是唯一会打真实模型网关的测试层,其余三层 # (unit / integration / contract)不读任何环境变量,`make ci` 也不读。 # # 本库自己一个环境变量都不读。模型调用一律走 PolyGateway(CLAUDE.md §1.5), # 下面除了第一节那个开关之外,全部是 PolyGateway 的装配入口消费的键。 # # **这里只列 e2e 跑起来必需的那几个。** 每个键什么意思、还有哪些可选键、多源怎么配, # 权威是 PolyGateway 自己的 .env.example——那是它的参数,不在本仓库复述第二遍 # (复述规则见 CLAUDE.md §0)。 # # 两条读取规则,和 PolyGateway 一致:读的是**当前工作目录**下的 .env,所以测试要从仓库 # 根跑;shell 里导出的同名环境变量**优先于** .env 里的值,临时换一个模型不必改文件。 # ── 一、e2e 的开关 ──────────────────────────────────────────────── # 不是 1 的话,tests/e2e/ 整层跳过。 # # **填好密钥不等于同意花钱**,所以它和密钥分成两件事。没有这道开关的话,任何人 # 配好 .env 之后随手跑一次全套测试,就会打出去一串真实调用并产生真实账单,而他 # 本来只是想看看测试过不过。 POLYLOOP_E2E=0 # ── 二、模型源,至少一个 ────────────────────────────────────────── # 键的形状是 {SCOPE}__{PROVIDER}__{序号}__{字段}。**本库的 e2e 固定用 LLM 这个 # scope**,不做成可配——多一个旋钮就多一处「这次跑的到底是哪套配置」要对照两个 # 地方才答得出来。 # # PROVIDER 那一段必须是 PolyGateway 注册表里的键(qwen / deepseek / openai …), # 而且它是键名的一部分:换供应商要把下面四行的 QWEN 一起改掉。 # # 挑一个便宜的小模型。e2e 验的是「这条链路通不通」——提示词拼对了没有、工具 # schema 模型认不认、回复能不能被解释、轨迹落盘对不对——不是模型答得好不好。 LLM__QWEN__1__BASE_URL= LLM__QWEN__1__API_KEY= LLM__QWEN__1__MODEL= LLM__QWEN__1__TIMEOUT_S=120 # ── 三、治理参数 ────────────────────────────────────────────────── # 这几个 PolyGateway 一律要求显式声明、不给默认值,缺了直接报错。它们是「失败了 # 怎么办」,不影响模型看见什么,所以照最常见的值填就行。 LLM__RETRY__MAX_ATTEMPTS=3 LLM__RETRY__BACKOFF_BASE_S=2.0 LLM__RETRY__BACKOFF_MAX_S=30.0 LLM__BREAKER__FAIL_THRESHOLD=5 LLM__BREAKER__COOLDOWN_S=60 # ── 四、装配选择 ────────────────────────────────────────────────── # **缓存必须是 none。** 开着的话,第二次跑同样的提示词会直接命中缓存返回,而 # e2e 唯一要证明的就是「真的打出去过一次」——那次运行会全绿地什么都没验,而且 # 从外部看不出来它和真的打过一次有什么区别。 PGW_CACHE_BACKEND=none # 遥测也是 none。开 sqlite 或 postgres 要另外建库,而本库不管遥测(CLAUDE.md §1.5); # 真要看用量,那是在网关自己的账目里查,按调用标识连表。 PGW_TELEMETRY_BACKEND=none