From 94b9923d8fe281e382f4f20ea9b9a003078f88f1 Mon Sep 17 00:00:00 2001 From: iomgaa Date: Mon, 10 Aug 2026 23:02:20 -0400 Subject: [PATCH] =?UTF-8?q?chore:=20=E5=8A=A0=20.env.example=EF=BC=8C?= =?UTF-8?q?=E5=8F=AA=E5=88=97=20e2e=20=E9=82=A3=E4=B8=80=E5=B1=82=E5=BF=85?= =?UTF-8?q?=E9=9C=80=E7=9A=84=E9=94=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit .gitignore 里早就写好了 !.env.example 的例外,文件一直没建。只列 e2e 跑起来必需的最小集, 每个键什么意思、还有哪些可选键,权威在 PolyGateway 自己的模板里,不在本仓库复述第二遍。 两处不是照抄网关默认值的:缓存必须 none——开着的话第二次跑同样的提示词直接命中缓存返回, 而 e2e 唯一要证明的就是「真的打出去过一次」;e2e 开关和密钥分成两件事——填好密钥不等于 同意花钱,没这道闸的话有人随手跑一次全套测试就会产生真实账单。 模板填完之后实测装配得起来:GatewaySettings.from_env() 与 GatewayClient.from_env() 都过, 适配器的 parameters() 读得出源名、供应商与模型名。 Co-Authored-By: Claude Opus 5 (1M context) --- .env.example | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 .env.example diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..401b17f --- /dev/null +++ b/.env.example @@ -0,0 +1,64 @@ +# 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