@tokenbuddy/tokenbuddy 1.0.11 → 1.0.13
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.
- package/dist/src/buyer-store.d.ts +61 -0
- package/dist/src/buyer-store.d.ts.map +1 -1
- package/dist/src/buyer-store.js +12 -0
- package/dist/src/buyer-store.js.map +1 -1
- package/dist/src/cli.d.ts +47 -0
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +287 -63
- package/dist/src/cli.js.map +1 -1
- package/dist/src/credit-tracker.d.ts +26 -0
- package/dist/src/credit-tracker.d.ts.map +1 -1
- package/dist/src/credit-tracker.js +8 -0
- package/dist/src/credit-tracker.js.map +1 -1
- package/dist/src/daemon.d.ts +29 -3
- package/dist/src/daemon.d.ts.map +1 -1
- package/dist/src/daemon.js +292 -65
- package/dist/src/daemon.js.map +1 -1
- package/dist/src/doctor-clawtip-wallet.d.ts +25 -0
- package/dist/src/doctor-clawtip-wallet.d.ts.map +1 -1
- package/dist/src/doctor-clawtip-wallet.js +13 -0
- package/dist/src/doctor-clawtip-wallet.js.map +1 -1
- package/dist/src/doctor-diagnostics.d.ts +63 -0
- package/dist/src/doctor-diagnostics.d.ts.map +1 -1
- package/dist/src/doctor-diagnostics.js +39 -1
- package/dist/src/doctor-diagnostics.js.map +1 -1
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/init-clawtip-activation.d.ts +103 -0
- package/dist/src/init-clawtip-activation.d.ts.map +1 -1
- package/dist/src/init-clawtip-activation.js +60 -0
- package/dist/src/init-clawtip-activation.js.map +1 -1
- package/dist/src/init-payment-options.d.ts +124 -0
- package/dist/src/init-payment-options.d.ts.map +1 -1
- package/dist/src/init-payment-options.js +68 -0
- package/dist/src/init-payment-options.js.map +1 -1
- package/dist/src/model-index.d.ts +9 -0
- package/dist/src/model-index.d.ts.map +1 -1
- package/dist/src/model-index.js.map +1 -1
- package/dist/src/prewarm-cache.d.ts +89 -0
- package/dist/src/prewarm-cache.d.ts.map +1 -1
- package/dist/src/prewarm-cache.js +14 -1
- package/dist/src/prewarm-cache.js.map +1 -1
- package/dist/src/prewarm-scheduler.d.ts +62 -3
- package/dist/src/prewarm-scheduler.d.ts.map +1 -1
- package/dist/src/prewarm-scheduler.js +39 -8
- package/dist/src/prewarm-scheduler.js.map +1 -1
- package/dist/src/provider-install.d.ts +89 -3
- package/dist/src/provider-install.d.ts.map +1 -1
- package/dist/src/provider-install.js +77 -17
- package/dist/src/provider-install.js.map +1 -1
- package/dist/src/route-failover.d.ts +48 -0
- package/dist/src/route-failover.d.ts.map +1 -1
- package/dist/src/route-failover.js.map +1 -1
- package/dist/src/seller-catalog.d.ts +158 -10
- package/dist/src/seller-catalog.d.ts.map +1 -1
- package/dist/src/seller-catalog.js +79 -5
- package/dist/src/seller-catalog.js.map +1 -1
- package/dist/src/seller-metadata-cache.d.ts +29 -0
- package/dist/src/seller-metadata-cache.d.ts.map +1 -0
- package/dist/src/seller-metadata-cache.js +71 -0
- package/dist/src/seller-metadata-cache.js.map +1 -0
- package/dist/src/seller-pool.d.ts +71 -0
- package/dist/src/seller-pool.d.ts.map +1 -1
- package/dist/src/seller-pool.js +6 -1
- package/dist/src/seller-pool.js.map +1 -1
- package/dist/src/seller-route-planner.d.ts +118 -0
- package/dist/src/seller-route-planner.d.ts.map +1 -0
- package/dist/src/seller-route-planner.js +160 -0
- package/dist/src/seller-route-planner.js.map +1 -0
- package/dist/src/seller-routing-config.d.ts +69 -0
- package/dist/src/seller-routing-config.d.ts.map +1 -0
- package/dist/src/seller-routing-config.js +164 -0
- package/dist/src/seller-routing-config.js.map +1 -0
- package/dist/src/seller-routing-strategy.d.ts +118 -0
- package/dist/src/seller-routing-strategy.d.ts.map +1 -0
- package/dist/src/seller-routing-strategy.js +183 -0
- package/dist/src/seller-routing-strategy.js.map +1 -0
- package/dist/src/stream-failover.d.ts +23 -0
- package/dist/src/stream-failover.d.ts.map +1 -1
- package/dist/src/stream-failover.js +4 -0
- package/dist/src/stream-failover.js.map +1 -1
- package/dist/src/tb-proxyd.js +7 -21
- package/dist/src/tb-proxyd.js.map +1 -1
- package/dist/src/terminal-detect.d.ts +51 -0
- package/dist/src/terminal-detect.d.ts.map +1 -1
- package/dist/src/terminal-detect.js +42 -0
- package/dist/src/terminal-detect.js.map +1 -1
- package/dist/src/terminal-image.d.ts +41 -0
- package/dist/src/terminal-image.d.ts.map +1 -1
- package/dist/src/terminal-image.js +15 -0
- package/dist/src/terminal-image.js.map +1 -1
- package/package.json +1 -1
- package/src/buyer-store.ts +61 -0
- package/src/cli.ts +330 -68
- package/src/credit-tracker.ts +26 -0
- package/src/daemon.ts +363 -72
- package/src/doctor-clawtip-wallet.ts +25 -0
- package/src/doctor-diagnostics.ts +63 -1
- package/src/index.ts +4 -0
- package/src/init-clawtip-activation.ts +103 -0
- package/src/init-payment-options.ts +124 -0
- package/src/model-index.ts +9 -0
- package/src/prewarm-cache.ts +99 -1
- package/src/prewarm-scheduler.ts +97 -12
- package/src/provider-install.ts +125 -25
- package/src/route-failover.ts +48 -0
- package/src/seller-catalog.ts +158 -12
- package/src/seller-metadata-cache.ts +91 -0
- package/src/seller-pool.ts +77 -1
- package/src/seller-route-planner.ts +323 -0
- package/src/seller-routing-config.ts +198 -0
- package/src/seller-routing-strategy.ts +316 -0
- package/src/stream-failover.ts +23 -0
- package/src/tb-proxyd.ts +7 -23
- package/src/terminal-detect.ts +51 -0
- package/src/terminal-image.ts +41 -0
- package/tests/cli-routing.test.ts +287 -0
- package/tests/daemon-classify.test.ts +431 -0
- package/tests/daemon-roles.test.ts +92 -0
- package/tests/seller-catalog-utilities.test.ts +70 -0
- package/tests/seller-metadata-cache.test.ts +89 -0
- package/tests/seller-route-planner.test.ts +150 -0
- package/tests/seller-routing-config.test.ts +111 -0
- package/tests/seller-routing-strategy.test.ts +166 -0
- package/tests/tokenbuddy.test.ts +447 -33
- /package/{src → tests}/credit-tracker.test.ts +0 -0
- /package/{src → tests}/model-index.test.ts +0 -0
- /package/{src → tests}/prewarm-cache.test.ts +0 -0
- /package/{src → tests}/prewarm-scheduler.test.ts +0 -0
- /package/{src → tests}/route-failover.test.ts +0 -0
- /package/{src → tests}/seller-catalog-413.test.ts +0 -0
- /package/{src → tests}/seller-pool.test.ts +0 -0
- /package/{src → tests}/stream-failover.test.ts +0 -0
- /package/{src → tests}/thousand-seller.test.ts +0 -0
|
@@ -1,37 +1,85 @@
|
|
|
1
1
|
import type { RegistrySeller } from "./seller-catalog.js";
|
|
2
2
|
import type { SellerPool, FailureKind, PoolEntry } from "./seller-pool.js";
|
|
3
3
|
import type { CreditTracker } from "./credit-tracker.js";
|
|
4
|
+
/**
|
|
5
|
+
* 路由失败后的下一步动作(控制器收到 `FailoverDecision` 后据此执行)。
|
|
6
|
+
* - `retry_same_seller`:在同 seller 上做 jittered backoff 重试
|
|
7
|
+
* - `failover_next`:从池里取出下一个候选 seller
|
|
8
|
+
* - `fail_fast`:立刻向上抛错,不再尝试其它候选
|
|
9
|
+
* - `abort`:候选已耗尽,放弃本轮
|
|
10
|
+
*/
|
|
4
11
|
export type RouteAction = "retry_same_seller" | "failover_next" | "fail_fast" | "abort";
|
|
12
|
+
/**
|
|
13
|
+
* 一次失败后 `RouteFailover.decide()` 返回的结构化决策。
|
|
14
|
+
* 控制器根据 `action` 决定是否重试/切换/终止,并把 `wastedCreditMicros`
|
|
15
|
+
* 上报到 doctor 面板。
|
|
16
|
+
*/
|
|
5
17
|
export interface FailoverDecision {
|
|
18
|
+
/** 控制器要执行的下一步动作 */
|
|
6
19
|
action: RouteAction;
|
|
20
|
+
/** 仅当 `action === "retry_same_seller"` 时使用,表示 backoff 后多久重试(毫秒) */
|
|
7
21
|
retryDelayMs?: number;
|
|
22
|
+
/** 决策理由,结构化但可读,供日志 / doctor 渲染 */
|
|
8
23
|
reason: string;
|
|
24
|
+
/** 本次失败后被废弃的 credit(USD micros),供 doctor 统计 */
|
|
9
25
|
wastedCreditMicros?: number;
|
|
26
|
+
/** 失败发生在 fresh-purchase 窗口内(刚买不到 N 秒),用于触发软重试保护 */
|
|
10
27
|
freshPurchase: boolean;
|
|
28
|
+
/** 在切走这个 seller 之前已经尝试的次数(含本次失败) */
|
|
11
29
|
retryAttemptsBeforeFailover: number;
|
|
30
|
+
/** 当次会话是否已超出 auto-purchase 预算;true 时不再触发新一轮 buy */
|
|
12
31
|
budgetExceeded: boolean;
|
|
13
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* 一次路由选择的最小可执行单元:池里的某个 entry + 关联的 registry 描述。
|
|
35
|
+
* `routeIndex` 仅用于日志排版,控制器自己维护尝试序号。
|
|
36
|
+
*/
|
|
14
37
|
export interface RouteCandidate {
|
|
38
|
+
/** 在本批候选中的序号(0-based),仅作日志可读性使用 */
|
|
15
39
|
routeIndex: number;
|
|
40
|
+
/** 池里的 entry(包含 circuit / healthScore 等运行时状态) */
|
|
16
41
|
entry: PoolEntry;
|
|
42
|
+
/** registry 里的原始 seller 描述 */
|
|
17
43
|
registrySeller: RegistrySeller;
|
|
44
|
+
/** seller 全局 ID(同时也是 token class) */
|
|
18
45
|
sellerId: string;
|
|
46
|
+
/** 去掉尾部斜杠后的 seller URL */
|
|
19
47
|
url: string;
|
|
20
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* 控制器调用 `decide()` 时传入的失败上下文。
|
|
51
|
+
* 描述"这次失败发生在谁身上、是什么错误、第几次尝试"。
|
|
52
|
+
*/
|
|
21
53
|
export interface DecideContext {
|
|
54
|
+
/** 失败时正在调用的 seller ID */
|
|
22
55
|
sellerId: string;
|
|
56
|
+
/** HTTP status(如有),用于区分 4xx/5xx */
|
|
23
57
|
status?: number;
|
|
58
|
+
/** 错误分类,由调用方在边界层归一化为 `FailureKind` */
|
|
24
59
|
errorKind: FailureKind;
|
|
60
|
+
/** 人类可读错误描述(不携带敏感字段),用于日志/doctor */
|
|
25
61
|
errorMessage?: string;
|
|
62
|
+
/** 当前是该 seller 的第几次尝试(1-based) */
|
|
26
63
|
attempt: number;
|
|
27
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* 构造 `RouteFailover` 所需的依赖与可调参数。
|
|
67
|
+
* 默认值见 `DEFAULTS`:软重试 2 次,jitter 100-400ms。
|
|
68
|
+
*/
|
|
28
69
|
export interface RouteFailoverOptions {
|
|
70
|
+
/** 共享的 seller pool,控制器只读 + 委托 recordSuccess/recordFailure */
|
|
29
71
|
pool: SellerPool;
|
|
72
|
+
/** 共享的 credit tracker,用于 wasted 计算与 auto-purchase 预算 */
|
|
30
73
|
creditTracker: CreditTracker;
|
|
74
|
+
/** 软重试次数上限,默认 2 */
|
|
31
75
|
softRetryAttempts?: number;
|
|
76
|
+
/** 软重试 backoff jitter 下界(毫秒),默认 100 */
|
|
32
77
|
softRetryJitterMinMs?: number;
|
|
78
|
+
/** 软重试 backoff jitter 上界(毫秒),默认 400 */
|
|
33
79
|
softRetryJitterMaxMs?: number;
|
|
80
|
+
/** 注入的随机源(测试用),默认 `Math.random` */
|
|
34
81
|
random?: () => number;
|
|
82
|
+
/** 注入的时钟(测试用),默认 `Date.now` */
|
|
35
83
|
now?: () => number;
|
|
36
84
|
}
|
|
37
85
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-failover.d.ts","sourceRoot":"","sources":["../../src/route-failover.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,MAAM,MAAM,WAAW,GAAG,mBAAmB,GAAG,eAAe,GAAG,WAAW,GAAG,OAAO,CAAC;AAExF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,2BAA2B,EAAE,MAAM,CAAC;IACpC,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,WAAW,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,UAAU,CAAC;IACjB,aAAa,EAAE,aAAa,CAAC;IAE7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAQD;;;;;;;;;;GAUG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,OAAO,EAAE,oBAAoB;IAUzC;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,cAAc,GAAG,SAAS;IAejH;;;;;OAKG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAI5D;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,GAAG,gBAAgB;IAwFzE;;;OAGG;IACH,WAAW,CAAC,eAAe,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,GAAG,OAAO;IAIzE;;;;OAIG;IACH,eAAe,IAAI,OAAO;IAI1B;;;OAGG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;CAG1C"}
|
|
1
|
+
{"version":3,"file":"route-failover.d.ts","sourceRoot":"","sources":["../../src/route-failover.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-failover.js","sourceRoot":"","sources":["../../src/route-failover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAKzD,MAAM,MAAM,GAAG,kBAAkB,CAAC,0BAA0B,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"route-failover.js","sourceRoot":"","sources":["../../src/route-failover.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* buyer 端协议偏好(用于按协议过滤 catalog)。`messages` 是 anthropic 协议的简称。
|
|
3
|
+
*/
|
|
1
4
|
export type ProtocolPreference = "chat_completions" | "responses" | "messages";
|
|
5
|
+
/**
|
|
6
|
+
* wallet-bootstrap `/registry/sellers` 里的 seller 描述。
|
|
7
|
+
* v1.2 起 `models` 是 buyer model-index 路由的权威依据;缺省会被报告为
|
|
8
|
+
* `models_refresh.seller_missing_models` 事件。
|
|
9
|
+
*/
|
|
2
10
|
export interface RegistrySeller {
|
|
11
|
+
/** seller 全局唯一 ID(也作为 token class) */
|
|
3
12
|
id: string;
|
|
13
|
+
/** 人类可读名称 */
|
|
4
14
|
name?: string;
|
|
15
|
+
/** seller 服务的公网 URL(去掉尾部 `/`) */
|
|
5
16
|
url: string;
|
|
17
|
+
/** seller 支持的协议列表(包含 `anthropic_messages` 时内部 alias 到 `messages`) */
|
|
6
18
|
supportedProtocols?: string[];
|
|
19
|
+
/** seller 支持的支付方式 */
|
|
7
20
|
paymentMethods?: string[];
|
|
8
21
|
/**
|
|
9
22
|
* v1.2: authoritative model list for buyer-side model-index routing.
|
|
@@ -13,76 +26,163 @@ export interface RegistrySeller {
|
|
|
13
26
|
*/
|
|
14
27
|
models?: string[];
|
|
15
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* `/registry/sellers` 响应的最小形状(去掉了 buyer 不关心的 metadata)。
|
|
31
|
+
*/
|
|
16
32
|
export interface SellerRegistryDocument {
|
|
33
|
+
/** schema 版本号 */
|
|
17
34
|
version: number;
|
|
35
|
+
/** 默认 seller ID(buyer 未指定时回落的目标) */
|
|
18
36
|
defaultSeller?: string;
|
|
37
|
+
/** seller 列表 */
|
|
19
38
|
sellers: RegistrySeller[];
|
|
20
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* 单个 seller 的 `/manifest` 响应,兼容 snake_case 与 camelCase 字段。
|
|
42
|
+
*/
|
|
21
43
|
export interface SellerManifest {
|
|
44
|
+
/** manifest schema 版本(camelCase) */
|
|
45
|
+
manifestVersion?: string;
|
|
46
|
+
/** manifest schema 版本(snake_case 兼容) */
|
|
47
|
+
manifest_version?: string;
|
|
48
|
+
/** seller 实例 ID(camelCase) */
|
|
22
49
|
sellerId?: string;
|
|
50
|
+
/** seller 实例 ID(snake_case 兼容) */
|
|
23
51
|
seller_id?: string;
|
|
52
|
+
/** seller 支持的协议(camelCase) */
|
|
24
53
|
supportedProtocols?: string[];
|
|
54
|
+
/** seller 支持的协议(snake_case 兼容) */
|
|
25
55
|
supported_protocols?: string[];
|
|
56
|
+
/** seller 支持的支付方式(camelCase) */
|
|
26
57
|
paymentMethods?: string[];
|
|
58
|
+
/** seller 支持的支付方式(snake_case 兼容) */
|
|
27
59
|
payment_methods?: string[];
|
|
60
|
+
/** 模型清单(含价格) */
|
|
28
61
|
models?: ManifestModelRecord[];
|
|
62
|
+
/** 选择策略块(折扣等) */
|
|
29
63
|
selection?: {
|
|
64
|
+
/** 折扣系数(camelCase) */
|
|
30
65
|
discountRatio?: number;
|
|
66
|
+
/** 折扣系数(snake_case 兼容) */
|
|
31
67
|
discount_ratio?: number;
|
|
32
68
|
};
|
|
33
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* `/manifest` 响应里单个模型记录(兼容 snake_case)。
|
|
72
|
+
*/
|
|
34
73
|
export interface ManifestModelRecord {
|
|
74
|
+
/** 模型 ID */
|
|
35
75
|
id: string;
|
|
76
|
+
/** 输入价格 USD micros/1M(camelCase) */
|
|
36
77
|
inputPriceMicrosPer1m?: number;
|
|
78
|
+
/** 输出价格 USD micros/1M(camelCase) */
|
|
37
79
|
outputPriceMicrosPer1m?: number;
|
|
80
|
+
/** 输入价格 USD micros/1M(snake_case 兼容) */
|
|
38
81
|
input_price_micros_per_1m?: number;
|
|
82
|
+
/** 输出价格 USD micros/1M(snake_case 兼容) */
|
|
39
83
|
output_price_micros_per_1m?: number;
|
|
84
|
+
/** 其它扩展字段(保留以便透传) */
|
|
40
85
|
[key: string]: unknown;
|
|
41
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* 聚合后的模型目录条目(catalog 渲染 / provider install 选择的最小可消费形状)。
|
|
89
|
+
*/
|
|
42
90
|
export interface ModelCatalogEntry {
|
|
91
|
+
/** 模型 ID */
|
|
43
92
|
id: string;
|
|
93
|
+
/** 所属 seller ID */
|
|
44
94
|
sellerId: string;
|
|
95
|
+
/** seller 名称(可选) */
|
|
45
96
|
sellerName?: string;
|
|
97
|
+
/** seller 公网 URL(去尾 `/`) */
|
|
46
98
|
sellerUrl: string;
|
|
99
|
+
/** seller 支持的协议 */
|
|
47
100
|
supportedProtocols: string[];
|
|
101
|
+
/** seller 支持的支付方式 */
|
|
48
102
|
paymentMethods: string[];
|
|
103
|
+
/** 输入价格 USD micros/1M */
|
|
49
104
|
inputPriceMicrosPer1m?: number;
|
|
105
|
+
/** 输出价格 USD micros/1M */
|
|
50
106
|
outputPriceMicrosPer1m?: number;
|
|
51
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* seller 目录条目(聚合 seller 元信息 + manifest 拉取结果)。
|
|
110
|
+
* 用于 `tb doctor` 和 CLI 表格展示。
|
|
111
|
+
*/
|
|
52
112
|
export interface SellerCatalogEntry {
|
|
113
|
+
/** seller ID */
|
|
53
114
|
id: string;
|
|
115
|
+
/** 人类可读名称 */
|
|
54
116
|
name?: string;
|
|
117
|
+
/** seller 公网 URL(去尾 `/`) */
|
|
55
118
|
url: string;
|
|
119
|
+
/** 当前状态(`active` / `error` / `manifest_unavailable`) */
|
|
56
120
|
status: string;
|
|
121
|
+
/** manifest 报告的 sellerId(可能与 id 不同,跨 namespace 时有用) */
|
|
57
122
|
manifestSellerId?: string;
|
|
123
|
+
/** 折扣系数(来自 manifest.selection) */
|
|
58
124
|
discountRatio?: number;
|
|
125
|
+
/** 模型数(来自 manifest) */
|
|
59
126
|
modelCount?: number;
|
|
127
|
+
/** seller 支持的协议(manifest > registry fallback) */
|
|
60
128
|
supportedProtocols?: string[];
|
|
129
|
+
/** seller 支持的支付方式(manifest > registry fallback) */
|
|
61
130
|
paymentMethods?: string[];
|
|
131
|
+
/** manifest 拉取失败时的错误消息 */
|
|
62
132
|
errorMessage?: string;
|
|
63
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* `discoverSellerBackedModels` 的返回结果。
|
|
136
|
+
* 包含聚合后的 `models[]` 和 `sellers[]`,供 provider install / catalog 渲染消费。
|
|
137
|
+
*/
|
|
64
138
|
export interface SellerCatalogResult {
|
|
139
|
+
/** 拉取的 registry URL(去尾 `/`) */
|
|
65
140
|
registryUrl: string;
|
|
141
|
+
/** registry schema 版本 */
|
|
66
142
|
version: number;
|
|
143
|
+
/** 默认 seller ID(来自 registry) */
|
|
67
144
|
defaultSeller?: string;
|
|
145
|
+
/** 模型目录条目列表(去重后) */
|
|
68
146
|
models: ModelCatalogEntry[];
|
|
147
|
+
/** seller 元信息列表(拉取 manifest 后的快照) */
|
|
69
148
|
sellers: SellerCatalogEntry[];
|
|
70
149
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
150
|
+
/**
|
|
151
|
+
* 去掉 seller URL 尾部的 `/`,避免路径拼接时出现 `//v1/messages`。
|
|
152
|
+
*
|
|
153
|
+
* @param seller registry seller
|
|
154
|
+
* @returns 规范化后的 URL
|
|
155
|
+
*/
|
|
76
156
|
export declare function normalizeSellerUrl(seller: RegistrySeller): string;
|
|
157
|
+
/**
|
|
158
|
+
* 解析 seller 实际支持的协议列表。
|
|
159
|
+
* 优先级:manifest.camelCase > manifest.snake_case > registry fallback。
|
|
160
|
+
* 包含 `anthropic_messages` 时内部 alias 到 `messages`(更短、内部统一用简称)。
|
|
161
|
+
*
|
|
162
|
+
* @param manifest seller 的 `/manifest` 响应
|
|
163
|
+
* @param seller 兜底用的 registry seller
|
|
164
|
+
* @returns 归一化后的协议列表
|
|
165
|
+
*/
|
|
77
166
|
export declare function manifestProtocols(manifest: SellerManifest, seller: RegistrySeller): string[];
|
|
167
|
+
/**
|
|
168
|
+
* 解析 seller 支持的支付方式。
|
|
169
|
+
* 优先级:manifest.camelCase > manifest.snake_case > registry fallback。
|
|
170
|
+
*
|
|
171
|
+
* @param manifest seller 的 `/manifest` 响应
|
|
172
|
+
* @param seller 兜底用的 registry seller
|
|
173
|
+
* @returns 支付方式列表
|
|
174
|
+
*/
|
|
78
175
|
export declare function manifestPaymentMethods(manifest: SellerManifest, seller: RegistrySeller): string[];
|
|
176
|
+
/**
|
|
177
|
+
* 从 manifest 抽取所有模型 ID,过滤非字符串与空串、trim 空白。
|
|
178
|
+
*
|
|
179
|
+
* @param manifest seller 的 `/manifest` 响应
|
|
180
|
+
* @returns 清理后的模型 ID 列表(保序)
|
|
181
|
+
*/
|
|
79
182
|
export declare function manifestModelIds(manifest: SellerManifest): string[];
|
|
80
183
|
/**
|
|
81
|
-
* v1.2 §18.9
|
|
82
|
-
*
|
|
83
|
-
* The daemon catches this in `TokenbuddyDaemon.fetchRegistry` and falls
|
|
84
|
-
* back to the last-known snapshot so the buyer stays routable while the
|
|
85
|
-
* operator shrinks the registry below the 1MB cap.
|
|
184
|
+
* v1.2 §18.9:bootstrap 的 `/registry/sellers` 返回 413 + `X-TokenBuddy-Registry-Too-Large: 1` 时抛出的错误。
|
|
185
|
+
* daemon 在 `TokenbuddyDaemon.fetchRegistry` 捕获并回退到上次成功快照,保证 buyer 仍可路由。
|
|
86
186
|
*/
|
|
87
187
|
export declare class RegistryTooLargeError extends Error {
|
|
88
188
|
readonly status: number;
|
|
@@ -96,10 +196,58 @@ export declare class RegistryTooLargeError extends Error {
|
|
|
96
196
|
maxBytes: number;
|
|
97
197
|
});
|
|
98
198
|
}
|
|
199
|
+
/**
|
|
200
|
+
* 拉取 `/registry/sellers` 响应。
|
|
201
|
+
* - HTTP 413:抛 `RegistryTooLargeError`(带 `sizeBytes` / `sellerCount` / `maxBytes` 元信息),让 daemon 决定是否回退快照。
|
|
202
|
+
* - 其它非 2xx:抛通用 Error。
|
|
203
|
+
* - 2xx 但缺 `sellers` 数组:抛 Error。
|
|
204
|
+
*
|
|
205
|
+
* @param registryUrl wallet-bootstrap 的 `/registry/sellers` 完整 URL
|
|
206
|
+
* @returns 解析后的注册表文档
|
|
207
|
+
* @throws RegistryTooLargeError / Error
|
|
208
|
+
*/
|
|
99
209
|
export declare function fetchSellerRegistry(registryUrl: string): Promise<SellerRegistryDocument>;
|
|
210
|
+
/**
|
|
211
|
+
* 拉取单个 seller 的 `/manifest` 响应。
|
|
212
|
+
*
|
|
213
|
+
* @param seller registry seller
|
|
214
|
+
* @returns 解析后的 manifest
|
|
215
|
+
* @throws Error 非 2xx
|
|
216
|
+
*/
|
|
100
217
|
export declare function fetchSellerManifest(seller: RegistrySeller): Promise<SellerManifest>;
|
|
218
|
+
/**
|
|
219
|
+
* 端到端发现 seller-backed 模型目录:
|
|
220
|
+
* 1. 拉取 `/registry/sellers`。
|
|
221
|
+
* 2. 并发拉取每个 seller 的 `/manifest`(失败转成 `errorMessage` 字段,不阻断整体)。
|
|
222
|
+
* 3. 合并 model 列表、按 `(modelId, sellerId)` 去重。
|
|
223
|
+
* 4. 输出 `SellerCatalogResult`(含聚合的 `models[]` 与 `sellers[]`)。
|
|
224
|
+
*
|
|
225
|
+
* @param registryUrl wallet-bootstrap 注册表 URL
|
|
226
|
+
* @returns 聚合后的目录
|
|
227
|
+
*/
|
|
101
228
|
export declare function discoverSellerBackedModels(registryUrl: string): Promise<SellerCatalogResult>;
|
|
229
|
+
/**
|
|
230
|
+
* 按协议过滤 catalog 条目。
|
|
231
|
+
*
|
|
232
|
+
* @param models 目录条目
|
|
233
|
+
* @param protocol 目标协议
|
|
234
|
+
* @returns 仅包含该协议的条目
|
|
235
|
+
*/
|
|
102
236
|
export declare function filterCatalogByProtocol(models: ModelCatalogEntry[], protocol: ProtocolPreference): ModelCatalogEntry[];
|
|
237
|
+
/**
|
|
238
|
+
* 按 seller ID 过滤 catalog 条目。
|
|
239
|
+
* `sellerId` 缺省时返回原列表。
|
|
240
|
+
*
|
|
241
|
+
* @param models 目录条目
|
|
242
|
+
* @param sellerId 目标 seller ID
|
|
243
|
+
* @returns 仅包含该 seller 的条目
|
|
244
|
+
*/
|
|
103
245
|
export declare function filterCatalogBySeller(models: ModelCatalogEntry[], sellerId: string | undefined): ModelCatalogEntry[];
|
|
246
|
+
/**
|
|
247
|
+
* 按 `(sellerId, modelId)` 去重 catalog 条目,保留首次出现的顺序。
|
|
248
|
+
*
|
|
249
|
+
* @param models 目录条目
|
|
250
|
+
* @returns 去重后的条目
|
|
251
|
+
*/
|
|
104
252
|
export declare function dedupeCatalogEntries(models: ModelCatalogEntry[]): ModelCatalogEntry[];
|
|
105
253
|
//# sourceMappingURL=seller-catalog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seller-catalog.d.ts","sourceRoot":"","sources":["../../src/seller-catalog.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,kBAAkB,GAAG,kBAAkB,GAAG,WAAW,GAAG,UAAU,CAAC;AAE/E,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE;QACV,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED
|
|
1
|
+
{"version":3,"file":"seller-catalog.d.ts","sourceRoot":"","sources":["../../src/seller-catalog.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,kBAAkB,GAAG,WAAW,GAAG,UAAU,CAAC;AAE/E;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,aAAa;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,qBAAqB;IACrB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB;IAChB,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,kCAAkC;IAClC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,gCAAgC;IAChC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,oCAAoC;IACpC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB;IAChB,MAAM,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC/B,iBAAiB;IACjB,SAAS,CAAC,EAAE;QACV,sBAAsB;QACtB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,0BAA0B;QAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,YAAY;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,oCAAoC;IACpC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oCAAoC;IACpC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,wCAAwC;IACxC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,wCAAwC;IACxC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,qBAAqB;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,YAAY;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,qBAAqB;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,yBAAyB;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,yBAAyB;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,gBAAgB;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,aAAa;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kCAAkC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,mDAAmD;IACnD,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,0BAA0B;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB;IACpB,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,qCAAqC;IACrC,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAEjE;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,EAAE,CAK5F;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,EAAE,CAEjG;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,EAAE,CAKnE;AAWD;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBACd,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CAQjG;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA4B9F;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAMzF;AAED;;;;;;;;;GASG;AACH,wBAAsB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAyDlG;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,iBAAiB,EAAE,EAC3B,QAAQ,EAAE,kBAAkB,GAC3B,iBAAiB,EAAE,CAErB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,EAAE,EAC3B,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,iBAAiB,EAAE,CAKrB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,EAAE,CAYrF"}
|
|
@@ -1,17 +1,46 @@
|
|
|
1
1
|
import { createModuleLogger } from "@tokenbuddy/logging";
|
|
2
2
|
const logger = createModuleLogger("tb-proxyd");
|
|
3
|
+
/**
|
|
4
|
+
* 去掉 seller URL 尾部的 `/`,避免路径拼接时出现 `//v1/messages`。
|
|
5
|
+
*
|
|
6
|
+
* @param seller registry seller
|
|
7
|
+
* @returns 规范化后的 URL
|
|
8
|
+
*/
|
|
3
9
|
export function normalizeSellerUrl(seller) {
|
|
4
10
|
return seller.url.replace(/\/+$/, "");
|
|
5
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* 解析 seller 实际支持的协议列表。
|
|
14
|
+
* 优先级:manifest.camelCase > manifest.snake_case > registry fallback。
|
|
15
|
+
* 包含 `anthropic_messages` 时内部 alias 到 `messages`(更短、内部统一用简称)。
|
|
16
|
+
*
|
|
17
|
+
* @param manifest seller 的 `/manifest` 响应
|
|
18
|
+
* @param seller 兜底用的 registry seller
|
|
19
|
+
* @returns 归一化后的协议列表
|
|
20
|
+
*/
|
|
6
21
|
export function manifestProtocols(manifest, seller) {
|
|
7
22
|
const protocols = manifest.supportedProtocols || manifest.supported_protocols || seller.supportedProtocols || [];
|
|
8
23
|
return protocols.includes("anthropic_messages") && !protocols.includes("messages")
|
|
9
24
|
? [...protocols, "messages"]
|
|
10
25
|
: protocols;
|
|
11
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* 解析 seller 支持的支付方式。
|
|
29
|
+
* 优先级:manifest.camelCase > manifest.snake_case > registry fallback。
|
|
30
|
+
*
|
|
31
|
+
* @param manifest seller 的 `/manifest` 响应
|
|
32
|
+
* @param seller 兜底用的 registry seller
|
|
33
|
+
* @returns 支付方式列表
|
|
34
|
+
*/
|
|
12
35
|
export function manifestPaymentMethods(manifest, seller) {
|
|
13
36
|
return manifest.paymentMethods || manifest.payment_methods || seller.paymentMethods || [];
|
|
14
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* 从 manifest 抽取所有模型 ID,过滤非字符串与空串、trim 空白。
|
|
40
|
+
*
|
|
41
|
+
* @param manifest seller 的 `/manifest` 响应
|
|
42
|
+
* @returns 清理后的模型 ID 列表(保序)
|
|
43
|
+
*/
|
|
15
44
|
export function manifestModelIds(manifest) {
|
|
16
45
|
return (manifest.models || [])
|
|
17
46
|
.map((model) => model.id)
|
|
@@ -26,11 +55,8 @@ function manifestModels(manifest) {
|
|
|
26
55
|
.filter((model) => Boolean(model?.id && typeof model.id === "string"));
|
|
27
56
|
}
|
|
28
57
|
/**
|
|
29
|
-
* v1.2 §18.9
|
|
30
|
-
*
|
|
31
|
-
* The daemon catches this in `TokenbuddyDaemon.fetchRegistry` and falls
|
|
32
|
-
* back to the last-known snapshot so the buyer stays routable while the
|
|
33
|
-
* operator shrinks the registry below the 1MB cap.
|
|
58
|
+
* v1.2 §18.9:bootstrap 的 `/registry/sellers` 返回 413 + `X-TokenBuddy-Registry-Too-Large: 1` 时抛出的错误。
|
|
59
|
+
* daemon 在 `TokenbuddyDaemon.fetchRegistry` 捕获并回退到上次成功快照,保证 buyer 仍可路由。
|
|
34
60
|
*/
|
|
35
61
|
export class RegistryTooLargeError extends Error {
|
|
36
62
|
status;
|
|
@@ -46,6 +72,16 @@ export class RegistryTooLargeError extends Error {
|
|
|
46
72
|
this.maxBytes = detail.maxBytes;
|
|
47
73
|
}
|
|
48
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* 拉取 `/registry/sellers` 响应。
|
|
77
|
+
* - HTTP 413:抛 `RegistryTooLargeError`(带 `sizeBytes` / `sellerCount` / `maxBytes` 元信息),让 daemon 决定是否回退快照。
|
|
78
|
+
* - 其它非 2xx:抛通用 Error。
|
|
79
|
+
* - 2xx 但缺 `sellers` 数组:抛 Error。
|
|
80
|
+
*
|
|
81
|
+
* @param registryUrl wallet-bootstrap 的 `/registry/sellers` 完整 URL
|
|
82
|
+
* @returns 解析后的注册表文档
|
|
83
|
+
* @throws RegistryTooLargeError / Error
|
|
84
|
+
*/
|
|
49
85
|
export async function fetchSellerRegistry(registryUrl) {
|
|
50
86
|
const response = await fetch(registryUrl);
|
|
51
87
|
if (response.status === 413) {
|
|
@@ -76,6 +112,13 @@ export async function fetchSellerRegistry(registryUrl) {
|
|
|
76
112
|
}
|
|
77
113
|
return data;
|
|
78
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* 拉取单个 seller 的 `/manifest` 响应。
|
|
117
|
+
*
|
|
118
|
+
* @param seller registry seller
|
|
119
|
+
* @returns 解析后的 manifest
|
|
120
|
+
* @throws Error 非 2xx
|
|
121
|
+
*/
|
|
79
122
|
export async function fetchSellerManifest(seller) {
|
|
80
123
|
const response = await fetch(`${normalizeSellerUrl(seller)}/manifest`);
|
|
81
124
|
if (!response.ok) {
|
|
@@ -83,6 +126,16 @@ export async function fetchSellerManifest(seller) {
|
|
|
83
126
|
}
|
|
84
127
|
return await response.json();
|
|
85
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* 端到端发现 seller-backed 模型目录:
|
|
131
|
+
* 1. 拉取 `/registry/sellers`。
|
|
132
|
+
* 2. 并发拉取每个 seller 的 `/manifest`(失败转成 `errorMessage` 字段,不阻断整体)。
|
|
133
|
+
* 3. 合并 model 列表、按 `(modelId, sellerId)` 去重。
|
|
134
|
+
* 4. 输出 `SellerCatalogResult`(含聚合的 `models[]` 与 `sellers[]`)。
|
|
135
|
+
*
|
|
136
|
+
* @param registryUrl wallet-bootstrap 注册表 URL
|
|
137
|
+
* @returns 聚合后的目录
|
|
138
|
+
*/
|
|
86
139
|
export async function discoverSellerBackedModels(registryUrl) {
|
|
87
140
|
const registry = await fetchSellerRegistry(registryUrl);
|
|
88
141
|
const sellerResults = await Promise.all(registry.sellers.map(async (seller) => {
|
|
@@ -141,15 +194,36 @@ export async function discoverSellerBackedModels(registryUrl) {
|
|
|
141
194
|
sellers: sellerResults.map((entry) => entry.seller)
|
|
142
195
|
};
|
|
143
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* 按协议过滤 catalog 条目。
|
|
199
|
+
*
|
|
200
|
+
* @param models 目录条目
|
|
201
|
+
* @param protocol 目标协议
|
|
202
|
+
* @returns 仅包含该协议的条目
|
|
203
|
+
*/
|
|
144
204
|
export function filterCatalogByProtocol(models, protocol) {
|
|
145
205
|
return models.filter((entry) => entry.supportedProtocols.includes(protocol));
|
|
146
206
|
}
|
|
207
|
+
/**
|
|
208
|
+
* 按 seller ID 过滤 catalog 条目。
|
|
209
|
+
* `sellerId` 缺省时返回原列表。
|
|
210
|
+
*
|
|
211
|
+
* @param models 目录条目
|
|
212
|
+
* @param sellerId 目标 seller ID
|
|
213
|
+
* @returns 仅包含该 seller 的条目
|
|
214
|
+
*/
|
|
147
215
|
export function filterCatalogBySeller(models, sellerId) {
|
|
148
216
|
if (!sellerId) {
|
|
149
217
|
return models;
|
|
150
218
|
}
|
|
151
219
|
return models.filter((entry) => entry.sellerId === sellerId);
|
|
152
220
|
}
|
|
221
|
+
/**
|
|
222
|
+
* 按 `(sellerId, modelId)` 去重 catalog 条目,保留首次出现的顺序。
|
|
223
|
+
*
|
|
224
|
+
* @param models 目录条目
|
|
225
|
+
* @returns 去重后的条目
|
|
226
|
+
*/
|
|
153
227
|
export function dedupeCatalogEntries(models) {
|
|
154
228
|
const seen = new Set();
|
|
155
229
|
const output = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seller-catalog.js","sourceRoot":"","sources":["../../src/seller-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"seller-catalog.js","sourceRoot":"","sources":["../../src/seller-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { RegistrySeller } from "./seller-catalog.js";
|
|
2
|
+
import type { SellerRouteMetadata } from "./seller-route-planner.js";
|
|
3
|
+
/**
|
|
4
|
+
* `SellerMetadataCache` 构造选项。
|
|
5
|
+
*/
|
|
6
|
+
export interface SellerMetadataCacheOptions {
|
|
7
|
+
/** 缓存条目有效期(毫秒),默认 10 分钟 */
|
|
8
|
+
ttlMs?: number;
|
|
9
|
+
/** 时间源,默认 `Date.now`;测试可注入受控时间 */
|
|
10
|
+
now?: () => number;
|
|
11
|
+
}
|
|
12
|
+
export declare const DEFAULT_SELLER_METADATA_TTL_MS: number;
|
|
13
|
+
/**
|
|
14
|
+
* seller 路由元数据缓存(`/manifest` 拉取结果)。
|
|
15
|
+
* 内部按 seller id 索引、按 TTL 过期;并发刷新合并到同一 `inFlight` Promise,避免重复打 seller。
|
|
16
|
+
*/
|
|
17
|
+
export declare class SellerMetadataCache {
|
|
18
|
+
private readonly ttlMs;
|
|
19
|
+
private readonly now;
|
|
20
|
+
private readonly entries;
|
|
21
|
+
private readonly inFlight;
|
|
22
|
+
constructor(options?: SellerMetadataCacheOptions);
|
|
23
|
+
snapshot(): SellerRouteMetadata[];
|
|
24
|
+
refreshIfStale(sellers: RegistrySeller[]): Promise<void>;
|
|
25
|
+
private shouldRefresh;
|
|
26
|
+
private refreshSeller;
|
|
27
|
+
private fetchAndStore;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=seller-metadata-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seller-metadata-cache.d.ts","sourceRoot":"","sources":["../../src/seller-metadata-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,8BAA8B,QAAiB,CAAC;AAE7D;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0C;IAClE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;gBAEjD,OAAO,GAAE,0BAA+B;IAKpD,QAAQ,IAAI,mBAAmB,EAAE;IAIjC,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxD,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,aAAa;YAYP,aAAa;CAoB5B"}
|