@sriinnu/kosha-discovery 1.8.1 → 1.10.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.
- package/README.md +25 -3
- package/dist/cache.d.ts +2 -0
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +4 -2
- package/dist/cache.js.map +1 -1
- package/dist/catalog-source.d.ts +99 -0
- package/dist/catalog-source.d.ts.map +1 -0
- package/dist/catalog-source.js +203 -0
- package/dist/catalog-source.js.map +1 -0
- package/dist/cli-cmd-doctor.d.ts.map +1 -1
- package/dist/cli-cmd-doctor.js +27 -8
- package/dist/cli-cmd-doctor.js.map +1 -1
- package/dist/cli-cmd-registry.d.ts +12 -0
- package/dist/cli-cmd-registry.d.ts.map +1 -0
- package/dist/cli-cmd-registry.js +39 -0
- package/dist/cli-cmd-registry.js.map +1 -0
- package/dist/cli-help.d.ts.map +1 -1
- package/dist/cli-help.js +10 -1
- package/dist/cli-help.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +7 -3
- package/dist/cli.js.map +1 -1
- package/dist/cost.js +3 -3
- package/dist/cost.js.map +1 -1
- package/dist/credentials/resolver.d.ts +2 -8
- package/dist/credentials/resolver.d.ts.map +1 -1
- package/dist/credentials/resolver.js +8 -53
- package/dist/credentials/resolver.js.map +1 -1
- package/dist/discovery/bedrock.d.ts.map +1 -1
- package/dist/discovery/bedrock.js +2 -1
- package/dist/discovery/bedrock.js.map +1 -1
- package/dist/discovery/public-seed.d.ts +4 -1
- package/dist/discovery/public-seed.d.ts.map +1 -1
- package/dist/discovery/public-seed.js +40 -8
- package/dist/discovery/public-seed.js.map +1 -1
- package/dist/discovery/snapshot-catalog.d.ts +44 -0
- package/dist/discovery/snapshot-catalog.d.ts.map +1 -0
- package/dist/discovery/snapshot-catalog.js +177 -0
- package/dist/discovery/snapshot-catalog.js.map +1 -0
- package/dist/discovery/vertex.d.ts.map +1 -1
- package/dist/discovery/vertex.js +4 -2
- package/dist/discovery/vertex.js.map +1 -1
- package/dist/enrichment/catalog.d.ts +19 -0
- package/dist/enrichment/catalog.d.ts.map +1 -0
- package/dist/enrichment/catalog.js +60 -0
- package/dist/enrichment/catalog.js.map +1 -0
- package/dist/enrichment/index.d.ts +1 -0
- package/dist/enrichment/index.d.ts.map +1 -1
- package/dist/enrichment/index.js +1 -0
- package/dist/enrichment/index.js.map +1 -1
- package/dist/index.d.ts +17 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -7
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +4 -10
- package/dist/mcp-server.js.map +1 -1
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +78 -23
- package/dist/proxy.js.map +1 -1
- package/dist/registry-runtime.d.ts.map +1 -1
- package/dist/registry-runtime.js +29 -24
- package/dist/registry-runtime.js.map +1 -1
- package/dist/registry.d.ts +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +64 -22
- package/dist/registry.js.map +1 -1
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +8 -6
- package/dist/security.js.map +1 -1
- package/dist/server.d.ts +14 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +102 -19
- package/dist/server.js.map +1 -1
- package/dist/shell-safe.d.ts +13 -0
- package/dist/shell-safe.d.ts.map +1 -1
- package/dist/shell-safe.js +14 -0
- package/dist/shell-safe.js.map +1 -1
- package/dist/types.d.ts +17 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/server.json +2 -2
|
@@ -18,22 +18,51 @@
|
|
|
18
18
|
* runs and can fill any genuinely missing fields downstream.
|
|
19
19
|
*
|
|
20
20
|
* Failures in either source are non-fatal: a network blip on one feed
|
|
21
|
-
* silently degrades to the other so kosha never fails closed.
|
|
21
|
+
* silently degrades to the other so kosha never fails closed. When *both*
|
|
22
|
+
* are unreachable, kosha's own weekly snapshot (`snapshot-latest` on the
|
|
23
|
+
* releases page) stands in — at most a week old, and ours to keep publishing
|
|
24
|
+
* if either community catalog ever stops.
|
|
22
25
|
* @module
|
|
23
26
|
*/
|
|
27
|
+
import { getLocalSeed, resolveCatalogSource } from "../catalog-source.js";
|
|
24
28
|
import { extractOriginProvider } from "../normalize.js";
|
|
25
29
|
import { getLiteLLMSeed } from "./litellm-seed.js";
|
|
26
30
|
import { getModelsDevSeed } from "./modelsdev-seed.js";
|
|
27
31
|
import { applyPromoOverrides } from "./promo-overrides.js";
|
|
32
|
+
import { getSnapshotSeed } from "./snapshot-catalog.js";
|
|
28
33
|
/**
|
|
29
34
|
* Return a merged, deduplicated array of seed {@link ModelCard}s for the
|
|
30
35
|
* given kosha provider, sourced from both public catalogs.
|
|
31
36
|
*/
|
|
32
37
|
export async function getPublicSeed(providerId) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
// Outside `community` neither community catalog is fetched. Errors
|
|
39
|
+
// propagate to the discoverer, which falls back to its bundled static
|
|
40
|
+
// list; a bad `local` file is caught earlier, by assertCatalogReady.
|
|
41
|
+
const { mode } = resolveCatalogSource();
|
|
42
|
+
if (mode === "local")
|
|
43
|
+
return applyPromoOverrides(attributeCreators(await getLocalSeed(providerId), providerId));
|
|
44
|
+
if (mode === "pinned")
|
|
45
|
+
return applyPromoOverrides(attributeCreators(await getSnapshotSeed(providerId), providerId));
|
|
46
|
+
const [modelsDevResult, litellmResult] = await Promise.allSettled([
|
|
47
|
+
getModelsDevSeed(providerId),
|
|
48
|
+
getLiteLLMSeed(providerId),
|
|
36
49
|
]);
|
|
50
|
+
const modelsDev = modelsDevResult.status === "fulfilled" ? modelsDevResult.value : [];
|
|
51
|
+
const litellm = litellmResult.status === "fulfilled" ? litellmResult.value : [];
|
|
52
|
+
// Nothing came back and at least one catalog was unreachable: fall back to
|
|
53
|
+
// the published snapshot. Only "unreachable" counts — two catalogs that
|
|
54
|
+
// loaded fine and simply do not list this provider is a legitimate empty
|
|
55
|
+
// answer. One is enough because many providers are mapped in only one of
|
|
56
|
+
// them (Bedrock and Vertex come from models.dev alone).
|
|
57
|
+
const unreachable = modelsDevResult.status === "rejected" || litellmResult.status === "rejected";
|
|
58
|
+
if (unreachable && modelsDev.length === 0 && litellm.length === 0) {
|
|
59
|
+
try {
|
|
60
|
+
return applyPromoOverrides(attributeCreators(await getSnapshotSeed(providerId), providerId));
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
37
66
|
if (modelsDev.length === 0 && litellm.length === 0)
|
|
38
67
|
return [];
|
|
39
68
|
// Index models.dev by id so duplicate ids from LiteLLM are dropped.
|
|
@@ -49,11 +78,14 @@ export async function getPublicSeed(providerId) {
|
|
|
49
78
|
// only true for a provider's own models. A reseller's row for
|
|
50
79
|
// `claude-opus-5-5` was claiming the reseller built it — and so ranked as
|
|
51
80
|
// a direct route next to Anthropic's. Recover the creator from the ID.
|
|
52
|
-
const attributed = merged.map((card) => card.originProvider === providerId
|
|
53
|
-
? { ...card, originProvider: extractOriginProvider(card.id) ?? providerId }
|
|
54
|
-
: card);
|
|
55
81
|
// Final pass: apply any active promotional overrides for cases where the
|
|
56
82
|
// public catalogs haven't yet picked up a publicly-announced discount.
|
|
57
|
-
return applyPromoOverrides(
|
|
83
|
+
return applyPromoOverrides(attributeCreators(merged, providerId));
|
|
84
|
+
}
|
|
85
|
+
/** Replace a serving-provider `originProvider` with the creator the ID names. */
|
|
86
|
+
function attributeCreators(cards, providerId) {
|
|
87
|
+
return cards.map((card) => card.originProvider === providerId
|
|
88
|
+
? { ...card, originProvider: extractOriginProvider(card.id) ?? providerId }
|
|
89
|
+
: card);
|
|
58
90
|
}
|
|
59
91
|
//# sourceMappingURL=public-seed.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-seed.js","sourceRoot":"","sources":["../../src/discovery/public-seed.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"public-seed.js","sourceRoot":"","sources":["../../src/discovery/public-seed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAkB;IACrD,mEAAmE;IACnE,sEAAsE;IACtE,qEAAqE;IACrE,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAoB,EAAE,CAAC;IACxC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,mBAAmB,CAAC,iBAAiB,CAAC,MAAM,YAAY,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAChH,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,mBAAmB,CAAC,iBAAiB,CAAC,MAAM,eAAe,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAEpH,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QACjE,gBAAgB,CAAC,UAAU,CAAC;QAC5B,cAAc,CAAC,UAAU,CAAC;KAC1B,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACtF,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhF,2EAA2E;IAC3E,wEAAwE;IACxE,yEAAyE;IACzE,yEAAyE;IACzE,wDAAwD;IACxD,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,KAAK,UAAU,IAAI,aAAa,CAAC,MAAM,KAAK,UAAU,CAAC;IACjG,IAAI,WAAW,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnE,IAAI,CAAC;YACJ,OAAO,mBAAmB,CAAC,iBAAiB,CAAC,MAAM,eAAe,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;QAC9F,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,EAAE,CAAC;QACX,CAAC;IACF,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE9D,oEAAoE;IACpE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAgB,CAAC,GAAG,SAAS,CAAC,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,SAAS;QAChC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,wEAAwE;IACxE,8DAA8D;IAC9D,0EAA0E;IAC1E,uEAAuE;IACvE,yEAAyE;IACzE,uEAAuE;IACvE,OAAO,mBAAmB,CAAC,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,iFAAiF;AACjF,SAAS,iBAAiB,CAAC,KAAkB,EAAE,UAAkB;IAChE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACzB,IAAI,CAAC,cAAc,KAAK,UAAU;QACjC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,UAAU,EAAE;QAC3E,CAAC,CAAC,IAAI,CACP,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Last-resort catalog: kosha's own published snapshot.
|
|
3
|
+
*
|
|
4
|
+
* Keyless discovery leans on two community catalogs, models.dev and LiteLLM.
|
|
5
|
+
* If both are unreachable — an outage, a blocked network, or one day a
|
|
6
|
+
* project going away — this loads the weekly snapshot that kosha's own
|
|
7
|
+
* scheduled run publishes as a release asset. It is at most a week old and
|
|
8
|
+
* carries everything the catalogs did: prices, limits, lifecycle.
|
|
9
|
+
*
|
|
10
|
+
* Same discipline as the other catalog loaders: bounded fetch, bounded body,
|
|
11
|
+
* threat scan per provider before any field is read, one in-flight promise
|
|
12
|
+
* so concurrent callers share a fetch, and a reset hook for tests.
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
import type { ModelCard } from "../types.js";
|
|
16
|
+
/** The stable URL the snapshot workflow publishes to. */
|
|
17
|
+
export declare const SNAPSHOT_CATALOG_URL = "https://github.com/sriinnu/kosha-discovery/releases/download/snapshot-latest/kosha-latest.json";
|
|
18
|
+
/** Env override for forks and air-gapped mirrors; must be an https URL. */
|
|
19
|
+
export declare const SNAPSHOT_CATALOG_URL_ENV = "KOSHA_SNAPSHOT_URL";
|
|
20
|
+
/** A parsed catalog: cards keyed by provider id, plus when it was built. */
|
|
21
|
+
export interface SnapshotCatalog {
|
|
22
|
+
providers: Map<string, ModelCard[]>;
|
|
23
|
+
/** The envelope's `fetchedAt`, or null when the file does not say. */
|
|
24
|
+
fetchedAt: string | null;
|
|
25
|
+
}
|
|
26
|
+
/** Resolve the snapshot URL, honouring the env override when it is sane. */
|
|
27
|
+
export declare function snapshotCatalogUrl(): string;
|
|
28
|
+
/** Load the snapshot once per process, keyed by provider id. */
|
|
29
|
+
export declare function loadSnapshotCatalog(): Promise<SnapshotCatalog>;
|
|
30
|
+
export declare function resetSnapshotCatalogCache(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Seed cards for one provider from the snapshot. The cards are already in
|
|
33
|
+
* ModelCard shape; `discoveredAt` is stamped now, and `catalogSource` says
|
|
34
|
+
* where they came from so a consumer can tell a week-old price from a fresh
|
|
35
|
+
* one. Returns `[]` for a provider the snapshot does not carry.
|
|
36
|
+
*/
|
|
37
|
+
export declare function getSnapshotSeed(providerId: string): Promise<ModelCard[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Parse and validate a catalog in the snapshot format. Shared by the
|
|
40
|
+
* published snapshot and the `local` catalog file, so both get the same
|
|
41
|
+
* caps and the same threat scan. `label` names the source in errors.
|
|
42
|
+
*/
|
|
43
|
+
export declare function parseSnapshotCatalog(text: string, label: string): SnapshotCatalog;
|
|
44
|
+
//# sourceMappingURL=snapshot-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-catalog.d.ts","sourceRoot":"","sources":["../../src/discovery/snapshot-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,yDAAyD;AACzD,eAAO,MAAM,oBAAoB,mGACgE,CAAC;AAElG,2EAA2E;AAC3E,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAiB7D,4EAA4E;AAC5E,MAAM,WAAW,eAAe;IAC/B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACpC,sEAAsE;IACtE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAID,4EAA4E;AAC5E,wBAAgB,kBAAkB,IAAI,MAAM,CAI3C;AAED,gEAAgE;AAChE,wBAAgB,mBAAmB,IAAI,OAAO,CAAC,eAAe,CAAC,CAO9D;AAED,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAS9E;AAoBD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,CA2CjF"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Last-resort catalog: kosha's own published snapshot.
|
|
3
|
+
*
|
|
4
|
+
* Keyless discovery leans on two community catalogs, models.dev and LiteLLM.
|
|
5
|
+
* If both are unreachable — an outage, a blocked network, or one day a
|
|
6
|
+
* project going away — this loads the weekly snapshot that kosha's own
|
|
7
|
+
* scheduled run publishes as a release asset. It is at most a week old and
|
|
8
|
+
* carries everything the catalogs did: prices, limits, lifecycle.
|
|
9
|
+
*
|
|
10
|
+
* Same discipline as the other catalog loaders: bounded fetch, bounded body,
|
|
11
|
+
* threat scan per provider before any field is read, one in-flight promise
|
|
12
|
+
* so concurrent callers share a fetch, and a reset hook for tests.
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
import { quarantineEntries } from "../security.js";
|
|
16
|
+
/** The stable URL the snapshot workflow publishes to. */
|
|
17
|
+
export const SNAPSHOT_CATALOG_URL = "https://github.com/sriinnu/kosha-discovery/releases/download/snapshot-latest/kosha-latest.json";
|
|
18
|
+
/** Env override for forks and air-gapped mirrors; must be an https URL. */
|
|
19
|
+
export const SNAPSHOT_CATALOG_URL_ENV = "KOSHA_SNAPSHOT_URL";
|
|
20
|
+
/** Hard cap on the payload; the snapshot is ~3 MB today. */
|
|
21
|
+
const MAX_PAYLOAD_BYTES = 16 * 1024 * 1024;
|
|
22
|
+
/** Network timeout for the snapshot fetch. */
|
|
23
|
+
const FETCH_TIMEOUT_MS = 15_000;
|
|
24
|
+
/** Upper bound on providers in a snapshot — anything larger is not ours. */
|
|
25
|
+
const MAX_PROVIDERS = 500;
|
|
26
|
+
let inflight = null;
|
|
27
|
+
/** Resolve the snapshot URL, honouring the env override when it is sane. */
|
|
28
|
+
export function snapshotCatalogUrl() {
|
|
29
|
+
const override = process.env[SNAPSHOT_CATALOG_URL_ENV];
|
|
30
|
+
if (override && /^https:\/\/[^\s]+$/.test(override))
|
|
31
|
+
return override;
|
|
32
|
+
return SNAPSHOT_CATALOG_URL;
|
|
33
|
+
}
|
|
34
|
+
/** Load the snapshot once per process, keyed by provider id. */
|
|
35
|
+
export function loadSnapshotCatalog() {
|
|
36
|
+
if (inflight)
|
|
37
|
+
return inflight;
|
|
38
|
+
inflight = fetchAndValidate().catch((error) => {
|
|
39
|
+
inflight = null; // let the next caller retry
|
|
40
|
+
throw error;
|
|
41
|
+
});
|
|
42
|
+
return inflight;
|
|
43
|
+
}
|
|
44
|
+
export function resetSnapshotCatalogCache() {
|
|
45
|
+
inflight = null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Seed cards for one provider from the snapshot. The cards are already in
|
|
49
|
+
* ModelCard shape; `discoveredAt` is stamped now, and `catalogSource` says
|
|
50
|
+
* where they came from so a consumer can tell a week-old price from a fresh
|
|
51
|
+
* one. Returns `[]` for a provider the snapshot does not carry.
|
|
52
|
+
*/
|
|
53
|
+
export async function getSnapshotSeed(providerId) {
|
|
54
|
+
const catalog = await loadSnapshotCatalog();
|
|
55
|
+
const now = Date.now();
|
|
56
|
+
return (catalog.providers.get(providerId) ?? []).map((card) => ({
|
|
57
|
+
...card,
|
|
58
|
+
discoveredAt: now,
|
|
59
|
+
source: "litellm",
|
|
60
|
+
catalogSource: "snapshot",
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
async function fetchAndValidate() {
|
|
64
|
+
const url = snapshotCatalogUrl();
|
|
65
|
+
const controller = new AbortController();
|
|
66
|
+
const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
67
|
+
let response;
|
|
68
|
+
try {
|
|
69
|
+
response = await fetch(url, { signal: controller.signal });
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
clearTimeout(timer);
|
|
73
|
+
}
|
|
74
|
+
if (!response.ok) {
|
|
75
|
+
throw new Error(`Failed to fetch kosha snapshot: ${response.status} ${response.statusText}`);
|
|
76
|
+
}
|
|
77
|
+
return parseSnapshotCatalog(await readBoundedText(response, MAX_PAYLOAD_BYTES), "kosha snapshot");
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Parse and validate a catalog in the snapshot format. Shared by the
|
|
81
|
+
* published snapshot and the `local` catalog file, so both get the same
|
|
82
|
+
* caps and the same threat scan. `label` names the source in errors.
|
|
83
|
+
*/
|
|
84
|
+
export function parseSnapshotCatalog(text, label) {
|
|
85
|
+
let parsed;
|
|
86
|
+
try {
|
|
87
|
+
parsed = JSON.parse(text);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
throw new Error(`Failed to parse ${label}: invalid JSON`);
|
|
91
|
+
}
|
|
92
|
+
// Exports and newer snapshots carry `kind` and `schemaVersion`; older
|
|
93
|
+
// snapshots have neither. A file that names another kind, or a version
|
|
94
|
+
// this kosha does not know, is refused rather than half-read.
|
|
95
|
+
const envelope = parsed;
|
|
96
|
+
if (envelope?.kind !== undefined && envelope.kind !== "kosha-catalog") {
|
|
97
|
+
throw new Error(`Failed to parse ${label}: kind "${String(envelope.kind)}" is not a kosha catalog`);
|
|
98
|
+
}
|
|
99
|
+
if (envelope?.schemaVersion !== undefined && envelope.schemaVersion !== 1) {
|
|
100
|
+
throw new Error(`Failed to parse ${label}: unsupported schemaVersion ${String(envelope.schemaVersion)}`);
|
|
101
|
+
}
|
|
102
|
+
const providers = parsed?.providers;
|
|
103
|
+
if (!Array.isArray(providers)) {
|
|
104
|
+
throw new Error(`Failed to parse ${label}: expected a providers array`);
|
|
105
|
+
}
|
|
106
|
+
if (providers.length > MAX_PROVIDERS) {
|
|
107
|
+
throw new Error(`${label} exceeds provider cap (${providers.length} > ${MAX_PROVIDERS}) — refusing to load`);
|
|
108
|
+
}
|
|
109
|
+
// Key by provider id so the threat scan can quarantine one provider's
|
|
110
|
+
// rows without discarding the rest — the same shape the other loaders use.
|
|
111
|
+
const byId = Object.create(null);
|
|
112
|
+
for (const entry of providers) {
|
|
113
|
+
const provider = entry;
|
|
114
|
+
if (!provider || typeof provider !== "object" || typeof provider.id !== "string")
|
|
115
|
+
continue;
|
|
116
|
+
byId[provider.id] = Array.isArray(provider.models) ? provider.models : [];
|
|
117
|
+
}
|
|
118
|
+
const { clean } = quarantineEntries(byId, label);
|
|
119
|
+
const out = new Map();
|
|
120
|
+
for (const [id, models] of Object.entries(clean)) {
|
|
121
|
+
if (!Array.isArray(models))
|
|
122
|
+
continue;
|
|
123
|
+
const cards = models.filter(isModelCardShape).filter((card) => card.provider === id);
|
|
124
|
+
if (cards.length > 0)
|
|
125
|
+
out.set(id, cards);
|
|
126
|
+
}
|
|
127
|
+
const fetchedAt = parsed.fetchedAt;
|
|
128
|
+
return { providers: out, fetchedAt: typeof fetchedAt === "string" ? fetchedAt : null };
|
|
129
|
+
}
|
|
130
|
+
/** Only the fields every path downstream dereferences; the rest ride along. */
|
|
131
|
+
function isModelCardShape(value) {
|
|
132
|
+
if (!value || typeof value !== "object")
|
|
133
|
+
return false;
|
|
134
|
+
const card = value;
|
|
135
|
+
return (typeof card.id === "string" &&
|
|
136
|
+
typeof card.provider === "string" &&
|
|
137
|
+
typeof card.mode === "string" &&
|
|
138
|
+
Array.isArray(card.capabilities) &&
|
|
139
|
+
typeof card.contextWindow === "number" &&
|
|
140
|
+
typeof card.maxOutputTokens === "number");
|
|
141
|
+
}
|
|
142
|
+
async function readBoundedText(response, maxBytes) {
|
|
143
|
+
const contentLength = Number(response.headers.get("content-length") ?? "0");
|
|
144
|
+
if (contentLength > maxBytes) {
|
|
145
|
+
throw new Error(`kosha snapshot too large (${contentLength} > ${maxBytes} bytes) — refusing to load`);
|
|
146
|
+
}
|
|
147
|
+
if (!response.body) {
|
|
148
|
+
const text = await response.text();
|
|
149
|
+
if (text.length > maxBytes) {
|
|
150
|
+
throw new Error(`kosha snapshot too large (${text.length} > ${maxBytes} chars) — refusing to load`);
|
|
151
|
+
}
|
|
152
|
+
return text;
|
|
153
|
+
}
|
|
154
|
+
const reader = response.body.getReader();
|
|
155
|
+
const decoder = new TextDecoder("utf-8");
|
|
156
|
+
let received = 0;
|
|
157
|
+
let text = "";
|
|
158
|
+
while (true) {
|
|
159
|
+
const { done, value } = await reader.read();
|
|
160
|
+
if (done)
|
|
161
|
+
break;
|
|
162
|
+
received += value.byteLength;
|
|
163
|
+
if (received > maxBytes) {
|
|
164
|
+
try {
|
|
165
|
+
await reader.cancel();
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
/* swallow */
|
|
169
|
+
}
|
|
170
|
+
throw new Error(`kosha snapshot too large (> ${maxBytes} bytes) — refusing to load`);
|
|
171
|
+
}
|
|
172
|
+
text += decoder.decode(value, { stream: true });
|
|
173
|
+
}
|
|
174
|
+
text += decoder.decode();
|
|
175
|
+
return text;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=snapshot-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-catalog.js","sourceRoot":"","sources":["../../src/discovery/snapshot-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vertex.d.ts","sourceRoot":"","sources":["../../src/discovery/vertex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAa,MAAM,aAAa,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAkD3C;;;;;;;;;GASG;AACH,qBAAa,gBAAiB,SAAQ,cAAc;IACnD,QAAQ,CAAC,UAAU,YAAY;IAC/B,QAAQ,CAAC,YAAY,sBAAsB;IAC3C,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,gDAAgD;IAEhE;;;;;;;;;;OAUG;IACG,QAAQ,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAsCjG;IAMD;;;;;;;;;;OAUG;YACW,cAAc;IA8B5B;;;;;;;;;;OAUG;IACG,cAAc,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA4B9E;IAED;;;;;;OAMG;YACW,oBAAoB;IA0BlC;;;OAGG;IACH,OAAO,CAAC,kBAAkB;
|
|
1
|
+
{"version":3,"file":"vertex.d.ts","sourceRoot":"","sources":["../../src/discovery/vertex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAa,MAAM,aAAa,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAkD3C;;;;;;;;;GASG;AACH,qBAAa,gBAAiB,SAAQ,cAAc;IACnD,QAAQ,CAAC,UAAU,YAAY;IAC/B,QAAQ,CAAC,YAAY,sBAAsB;IAC3C,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,gDAAgD;IAEhE;;;;;;;;;;OAUG;IACG,QAAQ,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAsCjG;IAMD;;;;;;;;;;OAUG;YACW,cAAc;IA8B5B;;;;;;;;;;OAUG;IACG,cAAc,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA4B9E;IAED;;;;;;OAMG;YACW,oBAAoB;IA0BlC;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAmB1B;;;;;OAKG;YACW,cAAc;IAuB5B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;;;;;OAMG;YACW,qBAAqB;IAkBnC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,cAAc;IAkBtB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,WAAW;IAkBnB;;;;;;;;;OASG;IACH,OAAO,CAAC,iBAAiB;IAqBzB;;;;;;OAMG;IACH,OAAO,CAAC,SAAS;IAOjB;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;CAgBzB"}
|
package/dist/discovery/vertex.js
CHANGED
|
@@ -16,7 +16,7 @@ import { execFileSync, execSync } from "node:child_process";
|
|
|
16
16
|
import { readFileSync } from "node:fs";
|
|
17
17
|
import { homedir } from "node:os";
|
|
18
18
|
import { join } from "node:path";
|
|
19
|
-
import { assertSafeShellArg } from "../shell-safe.js";
|
|
19
|
+
import { assertSafeShellArg, cliSpawnOptions } from "../shell-safe.js";
|
|
20
20
|
import { assertCleanPayload } from "../security.js";
|
|
21
21
|
import { extractOriginProvider } from "../normalize.js";
|
|
22
22
|
import { BaseDiscoverer } from "./base.js";
|
|
@@ -195,6 +195,7 @@ export class VertexDiscoverer extends BaseDiscoverer {
|
|
|
195
195
|
tokenFromGcloudCli() {
|
|
196
196
|
try {
|
|
197
197
|
const out = execSync("gcloud auth print-access-token", {
|
|
198
|
+
...cliSpawnOptions(),
|
|
198
199
|
stdio: ["pipe", "pipe", "pipe"],
|
|
199
200
|
timeout: 8_000,
|
|
200
201
|
})
|
|
@@ -219,7 +220,7 @@ export class VertexDiscoverer extends BaseDiscoverer {
|
|
|
219
220
|
try {
|
|
220
221
|
assertSafeShellArg(projectId, "projectId");
|
|
221
222
|
assertSafeShellArg(region, "region");
|
|
222
|
-
const raw = execFileSync("gcloud", ["ai", "models", "list", `--project=${projectId}`, `--region=${region}`, "--format=json"], { stdio: ["pipe", "pipe", "pipe"], timeout: 15_000 }).toString();
|
|
223
|
+
const raw = execFileSync("gcloud", ["ai", "models", "list", `--project=${projectId}`, `--region=${region}`, "--format=json"], { ...cliSpawnOptions(), stdio: ["pipe", "pipe", "pipe"], timeout: 15_000 }).toString();
|
|
223
224
|
const models = JSON.parse(raw);
|
|
224
225
|
assertCleanPayload(models, "Vertex AI gcloud CLI");
|
|
225
226
|
if (!Array.isArray(models))
|
|
@@ -240,6 +241,7 @@ export class VertexDiscoverer extends BaseDiscoverer {
|
|
|
240
241
|
resolveProjectFromCli() {
|
|
241
242
|
try {
|
|
242
243
|
const out = execSync("gcloud config get-value project", {
|
|
244
|
+
...cliSpawnOptions(),
|
|
243
245
|
stdio: ["pipe", "pipe", "pipe"],
|
|
244
246
|
timeout: 5_000,
|
|
245
247
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vertex.js","sourceRoot":"","sources":["../../src/discovery/vertex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"vertex.js","sourceRoot":"","sources":["../../src/discovery/vertex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Enrichment from kosha's own catalog.
|
|
3
|
+
*
|
|
4
|
+
* In `pinned` and `local` mode the LiteLLM enricher is off, so models found
|
|
5
|
+
* with a key would lose the prices and limits it used to fill. This fills
|
|
6
|
+
* the same gaps from the active catalog instead (the published snapshot or
|
|
7
|
+
* the local file), matched by provider and model id. Like the LiteLLM
|
|
8
|
+
* enricher it only fills what is missing and never overwrites API data.
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import type { SnapshotCatalog } from "../discovery/snapshot-catalog.js";
|
|
12
|
+
import type { Enricher, ModelCard } from "../types.js";
|
|
13
|
+
export declare class CatalogEnricher implements Enricher {
|
|
14
|
+
private readonly catalog;
|
|
15
|
+
constructor(catalog: SnapshotCatalog);
|
|
16
|
+
enrich(models: ModelCard[]): Promise<ModelCard[]>;
|
|
17
|
+
private enrichOne;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/enrichment/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAgB,MAAM,aAAa,CAAC;AAErE,qBAAa,eAAgB,YAAW,QAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAApC,YAA6B,OAAO,EAAE,eAAe,EAAI;IAEnD,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAEtD;IAED,OAAO,CAAC,SAAS;CAejB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Enrichment from kosha's own catalog.
|
|
3
|
+
*
|
|
4
|
+
* In `pinned` and `local` mode the LiteLLM enricher is off, so models found
|
|
5
|
+
* with a key would lose the prices and limits it used to fill. This fills
|
|
6
|
+
* the same gaps from the active catalog instead (the published snapshot or
|
|
7
|
+
* the local file), matched by provider and model id. Like the LiteLLM
|
|
8
|
+
* enricher it only fills what is missing and never overwrites API data.
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import { applyFreeTierFlag } from "../discovery/free-tier.js";
|
|
12
|
+
export class CatalogEnricher {
|
|
13
|
+
catalog;
|
|
14
|
+
constructor(catalog) {
|
|
15
|
+
this.catalog = catalog;
|
|
16
|
+
}
|
|
17
|
+
async enrich(models) {
|
|
18
|
+
return models.map((model) => applyFreeTierFlag(this.enrichOne(model)));
|
|
19
|
+
}
|
|
20
|
+
enrichOne(model) {
|
|
21
|
+
const entry = this.catalog.providers.get(model.provider)?.find((card) => card.id === model.id);
|
|
22
|
+
if (!entry)
|
|
23
|
+
return { ...model };
|
|
24
|
+
const enriched = { ...model };
|
|
25
|
+
if (entry.pricing)
|
|
26
|
+
enriched.pricing = fillPricing(enriched.pricing, entry.pricing);
|
|
27
|
+
if (!enriched.originPricing && entry.originPricing)
|
|
28
|
+
enriched.originPricing = entry.originPricing;
|
|
29
|
+
if (enriched.contextWindow === 0 && entry.contextWindow)
|
|
30
|
+
enriched.contextWindow = entry.contextWindow;
|
|
31
|
+
if (enriched.maxOutputTokens === 0 && entry.maxOutputTokens)
|
|
32
|
+
enriched.maxOutputTokens = entry.maxOutputTokens;
|
|
33
|
+
if (enriched.maxInputTokens === undefined && entry.maxInputTokens)
|
|
34
|
+
enriched.maxInputTokens = entry.maxInputTokens;
|
|
35
|
+
if (enriched.dimensions === undefined && entry.dimensions)
|
|
36
|
+
enriched.dimensions = entry.dimensions;
|
|
37
|
+
if (enriched.status === undefined && entry.status)
|
|
38
|
+
enriched.status = entry.status;
|
|
39
|
+
if (enriched.releaseDate === undefined && entry.releaseDate)
|
|
40
|
+
enriched.releaseDate = entry.releaseDate;
|
|
41
|
+
return enriched;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Take the catalog's pricing when there is none; otherwise top up missing rates only. */
|
|
45
|
+
function fillPricing(current, entry) {
|
|
46
|
+
if (!current)
|
|
47
|
+
return entry;
|
|
48
|
+
const filled = { ...current };
|
|
49
|
+
for (const key of [
|
|
50
|
+
"cacheReadPerMillion",
|
|
51
|
+
"cacheWritePerMillion",
|
|
52
|
+
"batchInputPerMillion",
|
|
53
|
+
"batchOutputPerMillion",
|
|
54
|
+
]) {
|
|
55
|
+
if (filled[key] === undefined && entry[key] !== undefined)
|
|
56
|
+
filled[key] = entry[key];
|
|
57
|
+
}
|
|
58
|
+
return filled;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/enrichment/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAI9D,MAAM,OAAO,eAAe;IACE,OAAO;IAApC,YAA6B,OAAwB;uBAAxB,OAAO;IAAoB,CAAC;IAEzD,KAAK,CAAC,MAAM,CAAC,MAAmB;QAC/B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IAEO,SAAS,CAAC,KAAgB;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/F,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;QAEhC,MAAM,QAAQ,GAAc,EAAE,GAAG,KAAK,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,OAAO;YAAE,QAAQ,CAAC,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACnF,IAAI,CAAC,QAAQ,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa;YAAE,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QACjG,IAAI,QAAQ,CAAC,aAAa,KAAK,CAAC,IAAI,KAAK,CAAC,aAAa;YAAE,QAAQ,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QACtG,IAAI,QAAQ,CAAC,eAAe,KAAK,CAAC,IAAI,KAAK,CAAC,eAAe;YAAE,QAAQ,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC;QAC9G,IAAI,QAAQ,CAAC,cAAc,KAAK,SAAS,IAAI,KAAK,CAAC,cAAc;YAAE,QAAQ,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;QAClH,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU;YAAE,QAAQ,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QAClG,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM;YAAE,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAClF,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW;YAAE,QAAQ,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACtG,OAAO,QAAQ,CAAC;IACjB,CAAC;CACD;AAED,0FAA0F;AAC1F,SAAS,WAAW,CAAC,OAAiC,EAAE,KAAmB;IAC1E,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,MAAM,MAAM,GAAiB,EAAE,GAAG,OAAO,EAAE,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI;QACjB,qBAAqB;QACrB,sBAAsB;QACtB,sBAAsB;QACtB,uBAAuB;KACd,EAAE,CAAC;QACZ,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/enrichment/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/enrichment/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/enrichment/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/enrichment/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/enrichment/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,27 +5,29 @@
|
|
|
5
5
|
* consumers can import from a single `"kosha-discovery"` entry point.
|
|
6
6
|
* @module
|
|
7
7
|
*/
|
|
8
|
-
export { ModelRegistry } from "./registry.js";
|
|
9
8
|
export { AliasResolver, DEFAULT_ALIASES } from "./aliases.js";
|
|
10
9
|
export { KoshaCache } from "./cache.js";
|
|
11
|
-
export {
|
|
10
|
+
export type { CatalogEnvelope, CatalogReport, CatalogSource, ResolvedCatalogSource } from "./catalog-source.js";
|
|
11
|
+
export { buildCatalogEnvelope, CATALOG_FILE_ENV, CATALOG_KIND, CATALOG_SCHEMA_VERSION, CATALOG_SOURCE_ENV, CATALOG_SOURCES, describeCatalog, resolveCatalogSource, } from "./catalog-source.js";
|
|
12
|
+
export type { ClaudeEffort, ClaudeGeneration, SamplingSupport } from "./claude-generation.js";
|
|
13
|
+
export { claudeEffortLadder, claudeSamplingSupport, claudeSupportsForcedToolChoice, claudeSupportsNativeJsonSchema, claudeSupportsPrefill, parseClaudeGeneration, } from "./claude-generation.js";
|
|
14
|
+
export type { ActualUsageCost, CostEstimate, LedgerEntry, UsageShape } from "./cost.js";
|
|
15
|
+
export { actualCostFromUsage, appendLedgerEntry, DEFAULT_LEDGER_PATH, estimateRequestCost, isRequestRow, ledgerRowUsd, readMonthlyBudgetUsd, readSpendForMonth, readTenantBudgetUsd, } from "./cost.js";
|
|
12
16
|
export type { DiscoveryBindingHintsV1, DiscoveryBindingQuery, DiscoveryChangeV1, DiscoveryCheapestCandidateV1, DiscoveryCheapestResultV1, DiscoveryCredentialPrompt, DiscoveryDeltaV1, DiscoveryHealthRecord, DiscoveryModelV1, DiscoveryProviderV1, DiscoveryRoleDefinition, DiscoverySnapshotV1, TrustedCapability, } from "./discovery-contract.js";
|
|
13
|
-
export {
|
|
17
|
+
export { DISCOVERY_SCHEMA_VERSION, discoveryRoles, makeModelKey, rawCapabilitiesForModel, trustedCapabilitiesForModel, } from "./discovery-contract.js";
|
|
18
|
+
export { inferParallelToolCalls, inferStructuredOutputModes, inferToolDialect } from "./model-features.js";
|
|
19
|
+
export { extractModelVersion, extractOriginProvider, normalizeModelId } from "./normalize.js";
|
|
20
|
+
export type { ProviderDescriptor } from "./provider-catalog.js";
|
|
21
|
+
export { getProviderDescriptor, isLocalProvider, listProviderDescriptors, normalizeProviderId, PROVIDER_CATALOG, } from "./provider-catalog.js";
|
|
22
|
+
export { ModelRegistry } from "./registry.js";
|
|
14
23
|
export type { RankedRoute, RouteHealth, RouteStrategy } from "./registry-routing.js";
|
|
15
|
-
export {
|
|
16
|
-
export type { ActualUsageCost, CostEstimate, LedgerEntry, UsageShape } from "./cost.js";
|
|
17
|
-
export { estimateUsdCost, normalizeTokenUsage, tallyCosts } from "./tally.js";
|
|
24
|
+
export { parseRouteStrategy, ROUTE_STRATEGIES, } from "./registry-routing.js";
|
|
18
25
|
export type { NormalizedTokenUsage, TallyCall, TallyModelSubtotal, TallyResult, TokenUsage, UsdCostBreakdown, } from "./tally.js";
|
|
19
|
-
export {
|
|
20
|
-
export type { ClaudeEffort, ClaudeGeneration, SamplingSupport } from "./claude-generation.js";
|
|
21
|
-
export { coerceOpenAIChatRequest, toOpenAIUsage, translateAnthropicStreamToOpenAI, translateAnthropicToOpenAI, translateOpenAIToAnthropic, translateOpenAIToAnthropicWithNotes, UnsupportedWireContentError, } from "./wire-anthropic.js";
|
|
22
|
-
export type { AnthropicContentBlock, AnthropicMessagesRequest, AnthropicMessagesResponse, AnthropicStreamTranslation, AnthropicUsage, OpenAIChatRequest, OpenAIChatResponse, OpenAIToolCall, OpenAIUsage, WireTranslation, } from "./wire-anthropic.js";
|
|
23
|
-
export { extractModelVersion, extractOriginProvider, normalizeModelId } from "./normalize.js";
|
|
26
|
+
export { estimateUsdCost, normalizeTokenUsage, tallyCosts } from "./tally.js";
|
|
24
27
|
export { inferTokenizerFamily } from "./tokenizer-family.js";
|
|
25
|
-
export {
|
|
26
|
-
export {
|
|
27
|
-
export
|
|
28
|
-
export type { ComputeTarget, LocalRuntimeMetadata, ModelCard, ModelStatus, ProviderInfo, ProviderRoleInfo, DiscoveryError, DiscoveryOptions, KoshaConfig, LatestDiscoveryOptions, LatestDiscoveryResult, ModelMode, ModelPricing, ModelRoleCard, RoleQueryOptions, CheapestModelOptions, CheapestModelMatch, CheapestModelResult, ProviderCredentialPrompt, PricingMetric, ModelRouteInfo, CapabilitySummary, CredentialResult, ProviderDiscoverer, Enricher, ProviderOrigin, ProviderTransport, StructuredOutputMode, ToolDialect, } from "./types.js";
|
|
28
|
+
export type { CapabilitySummary, CheapestModelMatch, CheapestModelOptions, CheapestModelResult, ComputeTarget, CredentialResult, DiscoveryError, DiscoveryOptions, Enricher, KoshaConfig, LatestDiscoveryOptions, LatestDiscoveryResult, LocalRuntimeMetadata, ModelCard, ModelMode, ModelPricing, ModelRoleCard, ModelRouteInfo, ModelStatus, PricingMetric, ProviderCredentialPrompt, ProviderDiscoverer, ProviderInfo, ProviderOrigin, ProviderRoleInfo, ProviderTransport, RoleQueryOptions, StructuredOutputMode, ToolDialect, } from "./types.js";
|
|
29
|
+
export type { AnthropicContentBlock, AnthropicMessagesRequest, AnthropicMessagesResponse, AnthropicStreamTranslation, AnthropicUsage, OpenAIChatRequest, OpenAIChatResponse, OpenAIToolCall, OpenAIUsage, WireTranslation, } from "./wire-anthropic.js";
|
|
30
|
+
export { coerceOpenAIChatRequest, toOpenAIUsage, translateAnthropicStreamToOpenAI, translateAnthropicToOpenAI, translateOpenAIToAnthropic, translateOpenAIToAnthropicWithNotes, UnsupportedWireContentError, } from "./wire-anthropic.js";
|
|
29
31
|
/**
|
|
30
32
|
* Convenience factory: creates a ModelRegistry and runs discovery in one call.
|
|
31
33
|
*
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|