@epoch-agent/core 1.1.0 → 2.0.0

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.
Files changed (4) hide show
  1. package/README.md +35 -8
  2. package/dist/index.d.ts +1501 -1157
  3. package/dist/index.js +1109 -563
  4. package/package.json +3 -3
package/README.md CHANGED
@@ -69,9 +69,15 @@ host 是 `127.0.0.1` / `localhost`),而它**和 `EpochConfig.settingsPanes`
69
69
  「给什么嵌什么」站得住;这一格来自**模型参数**,而模型的上下文里有工具输出和网页
70
70
  —— 那是可注入的。判据全文在 [protocol 的 question.ts](../protocol/src/question.ts) 文件头。
71
71
 
72
- **坏 page 只丢那一格,不拒整条提问。** 同 `icon` 那条「认不出来的当没给」:
73
- `page` 是锦上添花,而选项是必填的 —— 为它把整问打回,用户看到的是「这个问题根本
74
- 没弹出来」,代价和收益完全不成比例。
72
+ **带了 page 的那一问,选项可以不给**(2026-10-15):`options` 的口径是「0 个(仅当
73
+ 有 page)或 2–4 个」,下界在 `checkOptionCount` 里判(JSON Schema 表达不了「看另一个
74
+ 字段」,所以 schema 上 `options` 不再必填、也没有 `minItems`)。
75
+
76
+ **坏 page 只丢那一格,不拒整条提问** —— 前提是那一问还有选项。同 `icon` 那条
77
+ 「认不出来的当没给」:为它把整问打回,用户看到的是「这个问题根本没弹出来」,
78
+ 代价和收益完全不成比例。**那一问只剩页面时反过来要打回**:丢掉页面之后用户面前
79
+ 只剩一句问题,而模型以为自己递了一张页;打回时说的是 url 哪儿不对,不是「要 2–4 个
80
+ 选项」(那样模型会去补选项)。
75
81
 
76
82
  **`AgentConfig.site` 是「在哪儿干活」的现读出口,给了它 `workDir` /
77
83
  `projectContext` 就不再被读。**(迟绑,2026-08-20)循环内部只认 `site()` 这一个真源,
@@ -207,11 +213,13 @@ clone 下来一个仓库就能让我们跑它写的命令。而它还多一层
207
213
  `AttemptState`。所以一次 `/model` 换过去的模型哪怕上一轮降级过,下一轮还是从它起步:
208
214
  自动降级是替你救场,不是替你改主意。
209
215
 
210
- 阶梯是 `--fallback-model`(同 provider)→ 内置默认模型 → 换 provider。
211
- `fallback.model` **只对主 provider 有效** —— 模型名是 provider 私有的命名空间,
212
- `--fallback-model gpt-4.1-mini` 说的是「我的 OpenAI 挂了就用它」,一旦降到 deepseek
213
- 那个名字就只是一次必然的 404。判据是**当前落点**而不是配置里那家(用户 `/model`
214
- 换到别家之后同理)。
216
+ 阶梯只剩一级(2.0.0):`fallback.model` 指向的那一条条目。原来还有「同家内置默认模型」
217
+ 和「换一家用那家的默认模型」两级,随老写法删了 —— 内置表里是各家官方端点上的模型名,
218
+ 拿去打一个自建端点必然 404。
219
+
220
+ **什么时候换**:非重试类的失败(404 / 401 / 402)当场换;429 / 5xx / 超时那一类先在
221
+ 原地把重试预算(`retry.maxRetries`)跑完,**耗尽再换**(2026-10-16 起 —— 在那之前
222
+ 耗尽即整轮失败,这一族一次都降不到 `fallback.model`,端点恒挂时配了等于没配)。
215
223
 
216
224
  **节流的单位是请求,不是重试。** 同一个模型在一次 `generate()` 里重试三次只算一次
217
225
  失败;连续三次把请求拖垮才停掉自动使用它,成功一次或用户显式 `/model` 选回它就清账
@@ -455,6 +463,25 @@ artifacts 的 512MB 从此**出自同一张表**。在这之前两个数字各
455
463
  的 AST 用例**(`__tests__/provider-response-format-sites.test.ts`)而不是注释:
456
464
  这类改动漏的从来不是眼前那两处,是并行分支上新增的第三处。
457
465
 
466
+ ## 「我的模型」:按条目路由(2026-10-15)
467
+
468
+ `<homeDir>/models.json` 里每一条 = 端点 + key + 模型名 + 能力声明,`model` / `models.utility` /
469
+ `fallback.model` 写 `@<id>` 指向它(形状在 protocol 的 `model-entry.ts`)。router 的凭据表和
470
+ 工厂缓存从此按**路由键**存(老写法是 provider 名,条目是 `@<id>`),于是同一家可以有两套
471
+ 端点和 key 同时在用。几条判据,各自的出处:
472
+
473
+ | 这件事 | 判据在 |
474
+ | ------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
475
+ | 条目的 key 和地址**只认它自己的**:不借主配置那把、也不借那家的环境变量 key(借来的那把未必是发给这个端点的) | `provider/router.ts` 的 `registerEntries` |
476
+ | 能力 / 窗口 / 输出上限的覆盖叠在元数据表上,只覆盖填了的那几格 | `provider/entry-route.ts` 的 `applyEntryCapability` |
477
+ | 粘了完整地址(`…/chat/completions`)会剥成根;「自定义协议」原样用 | `config/model-entries.ts` 的 `toBaseUrl` / registry 的 `rawUrlFetch` |
478
+ | **端点是条目自己的属性**(宿主预置的那几条由宿主写在条目里,用户自己加的那些也是):没有进程级的统一端点 | `entry-route.ts` 文件头 + `__tests__/entry-route-pinned.test.ts` |
479
+ | 推理强度走 AI SDK 的标准参数 `reasoning`,只有「极致」按家补一笔 | `provider/reasoning-options.ts` |
480
+ | 测试连接先 `GET /models`(不花钱),列表接口不在时才发一次 1 token 的请求 | `provider/entry-probe.ts` |
481
+
482
+ ⚠️ registry 的 LOADERS 从这一天起**每一家都认 `baseUrl`**(bedrock / azure 除外)。在那之前
483
+ `deepseek` / `anthropic` 等几家一个字都不读它 —— 写了 `type: deepseek` + `baseUrl` 的配置请求照样打回官网。
484
+
458
485
  ## 开发
459
486
 
460
487
  ```bash