@ agentproto/ catalog- sync
构建时间生成框架 @agentproto/model-catalog。 。 。 .
数据目录(价格,模型列表)是 生成 从被钉住的提供者
来源,而不是手动承诺 *.generated.ts 可复制自
和CI捕捉漂流经过 --check。 。 。 .
合同
// src/types.ts — FROZEN
interface CatalogSource { id: string; url: string }
interface GeneratorContext {
fetchSource(src: CatalogSource): Promise<unknown> // snapshot-first; refresh fetches + writes
refresh: boolean
}
type GeneratedFiles = Record<string, string> // repo-relative path → TS source text
interface CatalogGenerator {
name: string // "llm:openrouter"
modality: "llm" | "image" | "video" | "audio" | "voice"
sources: CatalogSource[]
generate(ctx: GeneratorContext): Promise<GeneratedFiles>
}
function defineGenerator(g: CatalogGenerator): CatalogGenerator
一只兄弟会的毒剂在这个地表上建造了供货发电机。 添加新内容
生成器是扩展路径; 编辑 types.ts 没有.
流动
provider API ──(generate --refresh)──▶ snapshots/<id>.json ← committed, deterministic
│
generate (offline) ▼
*.generated.ts ← drop-in for model-catalog
- 默认下线.
generate读取snapshots/<id>.json测试和CI 从来没有打过网络. - 网络只落在后面
--refresh,它获取每个源被绑定的 URL 并写下线下运行的快照 .
国 际
pnpm --filter @agentproto/catalog-sync generate # write changed files
pnpm --filter @agentproto/catalog-sync generate --check # diff vs committed; exit 1 on drift (CI)
pnpm --filter @agentproto/catalog-sync generate --refresh # re-fetch pinned sources
addedAt 公约
一些发电机(目前) llm:openrouter 财务报告和审定财务报表 llm:requesty - 两个
生产 LLMPricing 条目) addedAt?: string 字段( ISO)
YYYY-MM-DD)在每条目录条目上:首次看到模型代号的日期
通过同步运行.
- 后充规则. 当提供者源本身带有一个创建
标识的时标( Open Router's 和 Requerty )
/v1/models都带着 a 离子秒数created字段),一个全新的代号被回填 日期,转换为YYYY-MM-DD当来源没有这样的领域时 代之以同步运行日期的标识. - 从来无常相. 一旦一个ID有
addedAt邮票,它是 从未被后来的运行所覆盖——即使源头是自己的created对这个ID的价值,后来解决了不同的东西。 模型标识 消失和后来再现的印章 正在寻找新添加. - 机制:每个生成者分类账文件发生于
packages/catalog-sync/ledger/<generator-id>.json(例如:.ledger/llm-openrouter.json)——一平房{ "model/id": "YYYY-MM-DD", ... }映射, 排序的密钥, 决定序列化 。 每个发电机读取它的 直接关闭磁盘的自有分类账( 平面)node:fs改为:GeneratorContext故意没有一般的复读能力;分类账是 发电机内部问题,不是被冻结的部分types.ts合同, 合并当前运行的 ids 通过computeAddedAtLedger(见src/added-at.ts),并将更新的分类账作为第二个条目返回 联合国GeneratedFiles这样啊runner.ts已存在的 diff/ 写入逻辑(和--check漂移检测)免费覆盖分类账文件,与任何 其它生成的文件. - 编辑器条目是 从未下降即使对于身份证明 不再存在在一个 运行——分类账记录"第一次见到",而不是"目前在场".
见 src/added-at.ts 执行进展情况 src/generators/llm-openrouter.ts 编号 :
src/generators/llm-requesty.ts 因为它是发电机的电线.
CATALOG-CHANGELOG.md
packages/model-catalog/CATALOG-CHANGELOG.md 是人可读的"什么"
模型已更改“ 日志 —— 而非由更改器驱动 CHANGELOG.md 旁边
(一个是包版历史,每个出版一个条目). 它会回答的
"什么是目录同步添加或去除,以及何时",通过从上到下地读取.
-
自动写入 以
runGenerators(单位:千美元)src/runner.ts),不通过 手给我 收集每个生成器的输出后, 运行器 diff 每个 已更改*.generated.ts文件的顶级 id 密钥( 前 vs 后 --) 见src/changelog.ts是因为extractRecordIds编号 :diffModelIds和,何时 至少一个生成器实际添加或删除了模型 id, 附加一个 日期:## 2026-08-31 ### llm:requesty - Added: alibaba/qwen3.8-flash, alibaba/qwen3.8-max, ... - Removed: anthropic/claude-opus-4-1, ... -
段落在文件的末尾( 最新最后一页) 附加 - 一个平地, 非破坏性
+=这是对"最新第一"的刻意选择; 意思是作家永远不必 分析并重现过去的历史,只是 结会. -
没有ID级漂流的跑步什么也没有发出 没有空的,没有 触摸的文件,没有diff。 仅定价的改变(模型的价格移动了但没有) id被添加/删除)不在此登录;它们可见于 已生成文件的 git 历史 .
-
添加分类账文件( A)
ledger/*.json)被故意排除在此范围之外 diff——他们从未丢失过一个id(见上文),所以没有携带"被撤销" 并且每个"添加"的id 已经覆盖在 自有发电机*.generated.tsd.
发电机
llm:openrouter
资料来源: https://openrouter.ai/api/v1/models (标注快照:
snapshots/llm-openrouter.json) (中文(简体) ). 输出
packages/model-catalog/src/llm/openrouter-routes.generated.ts ——一来一来
OPENROUTER_ROUTES: Record<string, LLMPricing> 加上导出
OPENROUTER_PROVIDERS 列表中选择一个选项.
- 美元价格 −
inputPer1M编号 :outputPer1M(每100兆令牌美元). cache_read编号 :cache_write(当在时)cacheReadMultiplier编号 :cacheWriteMultiplier(ratio vs 碱性输入). 承诺的模型目录 文件省略了这些; 当源文件携带时, 此生成器会释放它们 (P3 spec:"如果来源有附加缓存字段")——添加和LLMPricing- 兼容.pricing.overrides仅按键于min_prompt_tokens− a 个tiers数组( r){ aboveInputTokens, inputPer1M, outputPer1M, … })在行上,所以,(笑声) 长期促销的账单 利率较高。 时间折扣被忽略.- 无价路线(
openrouter/auto)被跳过. addedAt(ISO 日期,先看后看,从未变异)通过ledger/llm-openrouter.json分类账 -- -- 见 "addedAt《公约》,上文.
llm:requesty
资料来源: https://router.requesty.ai/v1/models (标注快照:
snapshots/llm-requesty.json) (中文(简体) ). 输出
packages/model-catalog/src/llm/requesty-routes.generated.ts ——一来一来
REQUESTY_ROUTES: Record<string, LLMPricing> 加上导出
REQUESTY_PROVIDERS 列表中选择一个选项.
- 按美元计的价格(JSON数字)
inputPer1M编号 :outputPer1M。 。 。 . cached_price以cacheReadMultiplier只当来源也 标记supports_caching: true; 请求没有缓存写价, 所以cacheWriteMultiplier永远不会被释放.- 需要实时刷新
REQUESTY_API_KEY要设置; 没有它, 生成器 重用承诺的快照. addedAt(ISO 日期,先看后看,从未变异)通过ledger/llm-requesty.json分类账 -- -- 见 "addedAt《公约》,上文.
llm:context-windows
资料来源:Anthropic、Groq、xAI和月球相机模型列表终点
快照 : snapshots/llm-anthropic.json, (中文(简体) ), snapshots/llm-groq.json, (中文(简体) ),
snapshots/llm-xai.json, (中文(简体) ), snapshots/llm-moonshot.json) (中文(简体) ). 输出
packages/model-catalog/src/llm/context-windows.generated.ts ——一来一来
CONTEXT_WINDOWS: Record<string, ContextWindowEntry>。 。 。 .
contextWindow每个提供者的最大输入/文本长字段的地图.maxOutput当来源发布时被捕获.- 这是 非定价;计费数据仍来自
llm:openrouter财务报告和审定财务报表 手动维护的定价条目model-catalog。 。 。 . - OpenAI和ZAI/Zhipu被排除在外,因为他们不发表一个马厩, 机器可读上下文窗口列表.