@sriinnu/kosha-discovery 0.5.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/LICENSE +21 -0
- package/README.md +286 -0
- package/dist/aliases.d.ts +51 -0
- package/dist/aliases.d.ts.map +1 -0
- package/dist/aliases.js +115 -0
- package/dist/aliases.js.map +1 -0
- package/dist/cache.d.ts +57 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +123 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli-commands.d.ts +142 -0
- package/dist/cli-commands.d.ts.map +1 -0
- package/dist/cli-commands.js +746 -0
- package/dist/cli-commands.js.map +1 -0
- package/dist/cli-format.d.ts +119 -0
- package/dist/cli-format.d.ts.map +1 -0
- package/dist/cli-format.js +171 -0
- package/dist/cli-format.js.map +1 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +143 -0
- package/dist/cli.js.map +1 -0
- package/dist/credentials/index.d.ts +2 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +2 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/credentials/resolver.d.ts +170 -0
- package/dist/credentials/resolver.d.ts.map +1 -0
- package/dist/credentials/resolver.js +597 -0
- package/dist/credentials/resolver.js.map +1 -0
- package/dist/discovery/anthropic.d.ts +49 -0
- package/dist/discovery/anthropic.d.ts.map +1 -0
- package/dist/discovery/anthropic.js +101 -0
- package/dist/discovery/anthropic.js.map +1 -0
- package/dist/discovery/base.d.ts +59 -0
- package/dist/discovery/base.d.ts.map +1 -0
- package/dist/discovery/base.js +123 -0
- package/dist/discovery/base.js.map +1 -0
- package/dist/discovery/bedrock.d.ts +122 -0
- package/dist/discovery/bedrock.d.ts.map +1 -0
- package/dist/discovery/bedrock.js +356 -0
- package/dist/discovery/bedrock.js.map +1 -0
- package/dist/discovery/cerebras.d.ts +43 -0
- package/dist/discovery/cerebras.d.ts.map +1 -0
- package/dist/discovery/cerebras.js +65 -0
- package/dist/discovery/cerebras.js.map +1 -0
- package/dist/discovery/cohere.d.ts +57 -0
- package/dist/discovery/cohere.d.ts.map +1 -0
- package/dist/discovery/cohere.js +82 -0
- package/dist/discovery/cohere.js.map +1 -0
- package/dist/discovery/deepinfra.d.ts +41 -0
- package/dist/discovery/deepinfra.d.ts.map +1 -0
- package/dist/discovery/deepinfra.js +86 -0
- package/dist/discovery/deepinfra.js.map +1 -0
- package/dist/discovery/deepseek.d.ts +17 -0
- package/dist/discovery/deepseek.d.ts.map +1 -0
- package/dist/discovery/deepseek.js +45 -0
- package/dist/discovery/deepseek.js.map +1 -0
- package/dist/discovery/fireworks.d.ts +48 -0
- package/dist/discovery/fireworks.d.ts.map +1 -0
- package/dist/discovery/fireworks.js +101 -0
- package/dist/discovery/fireworks.js.map +1 -0
- package/dist/discovery/glm.d.ts +17 -0
- package/dist/discovery/glm.d.ts.map +1 -0
- package/dist/discovery/glm.js +52 -0
- package/dist/discovery/glm.js.map +1 -0
- package/dist/discovery/google.d.ts +53 -0
- package/dist/discovery/google.d.ts.map +1 -0
- package/dist/discovery/google.js +122 -0
- package/dist/discovery/google.js.map +1 -0
- package/dist/discovery/groq.d.ts +44 -0
- package/dist/discovery/groq.d.ts.map +1 -0
- package/dist/discovery/groq.js +89 -0
- package/dist/discovery/groq.js.map +1 -0
- package/dist/discovery/index.d.ts +48 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +116 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/llama-cpp.d.ts +45 -0
- package/dist/discovery/llama-cpp.d.ts.map +1 -0
- package/dist/discovery/llama-cpp.js +137 -0
- package/dist/discovery/llama-cpp.js.map +1 -0
- package/dist/discovery/minimax.d.ts +16 -0
- package/dist/discovery/minimax.d.ts.map +1 -0
- package/dist/discovery/minimax.js +56 -0
- package/dist/discovery/minimax.js.map +1 -0
- package/dist/discovery/mistral.d.ts +45 -0
- package/dist/discovery/mistral.d.ts.map +1 -0
- package/dist/discovery/mistral.js +82 -0
- package/dist/discovery/mistral.js.map +1 -0
- package/dist/discovery/moonshot.d.ts +16 -0
- package/dist/discovery/moonshot.d.ts.map +1 -0
- package/dist/discovery/moonshot.js +46 -0
- package/dist/discovery/moonshot.js.map +1 -0
- package/dist/discovery/nvidia.d.ts +60 -0
- package/dist/discovery/nvidia.d.ts.map +1 -0
- package/dist/discovery/nvidia.js +145 -0
- package/dist/discovery/nvidia.js.map +1 -0
- package/dist/discovery/ollama.d.ts +57 -0
- package/dist/discovery/ollama.d.ts.map +1 -0
- package/dist/discovery/ollama.js +151 -0
- package/dist/discovery/ollama.js.map +1 -0
- package/dist/discovery/openai-compatible.d.ts +126 -0
- package/dist/discovery/openai-compatible.d.ts.map +1 -0
- package/dist/discovery/openai-compatible.js +161 -0
- package/dist/discovery/openai-compatible.js.map +1 -0
- package/dist/discovery/openai.d.ts +62 -0
- package/dist/discovery/openai.d.ts.map +1 -0
- package/dist/discovery/openai.js +157 -0
- package/dist/discovery/openai.js.map +1 -0
- package/dist/discovery/openrouter.d.ts +78 -0
- package/dist/discovery/openrouter.d.ts.map +1 -0
- package/dist/discovery/openrouter.js +184 -0
- package/dist/discovery/openrouter.js.map +1 -0
- package/dist/discovery/perplexity.d.ts +66 -0
- package/dist/discovery/perplexity.d.ts.map +1 -0
- package/dist/discovery/perplexity.js +86 -0
- package/dist/discovery/perplexity.js.map +1 -0
- package/dist/discovery/together.d.ts +41 -0
- package/dist/discovery/together.d.ts.map +1 -0
- package/dist/discovery/together.js +88 -0
- package/dist/discovery/together.js.map +1 -0
- package/dist/discovery/vertex.d.ts +146 -0
- package/dist/discovery/vertex.d.ts.map +1 -0
- package/dist/discovery/vertex.js +371 -0
- package/dist/discovery/vertex.js.map +1 -0
- package/dist/discovery/zai.d.ts +17 -0
- package/dist/discovery/zai.d.ts.map +1 -0
- package/dist/discovery/zai.js +51 -0
- package/dist/discovery/zai.js.map +1 -0
- package/dist/discovery-contract.d.ts +186 -0
- package/dist/discovery-contract.d.ts.map +1 -0
- package/dist/discovery-contract.js +115 -0
- package/dist/discovery-contract.js.map +1 -0
- package/dist/discovery-routes.d.ts +14 -0
- package/dist/discovery-routes.d.ts.map +1 -0
- package/dist/discovery-routes.js +98 -0
- package/dist/discovery-routes.js.map +1 -0
- package/dist/enrichment/index.d.ts +2 -0
- package/dist/enrichment/index.d.ts.map +1 -0
- package/dist/enrichment/index.js +2 -0
- package/dist/enrichment/index.js.map +1 -0
- package/dist/enrichment/litellm.d.ts +52 -0
- package/dist/enrichment/litellm.d.ts.map +1 -0
- package/dist/enrichment/litellm.js +205 -0
- package/dist/enrichment/litellm.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/normalize.d.ts +64 -0
- package/dist/normalize.d.ts.map +1 -0
- package/dist/normalize.js +166 -0
- package/dist/normalize.js.map +1 -0
- package/dist/provider-catalog.d.ts +62 -0
- package/dist/provider-catalog.d.ts.map +1 -0
- package/dist/provider-catalog.js +331 -0
- package/dist/provider-catalog.js.map +1 -0
- package/dist/registry-delta.d.ts +17 -0
- package/dist/registry-delta.d.ts.map +1 -0
- package/dist/registry-delta.js +74 -0
- package/dist/registry-delta.js.map +1 -0
- package/dist/registry-discovery.d.ts +66 -0
- package/dist/registry-discovery.d.ts.map +1 -0
- package/dist/registry-discovery.js +339 -0
- package/dist/registry-discovery.js.map +1 -0
- package/dist/registry-query.d.ts +74 -0
- package/dist/registry-query.d.ts.map +1 -0
- package/dist/registry-query.js +310 -0
- package/dist/registry-query.js.map +1 -0
- package/dist/registry-runtime.d.ts +48 -0
- package/dist/registry-runtime.d.ts.map +1 -0
- package/dist/registry-runtime.js +255 -0
- package/dist/registry-runtime.js.map +1 -0
- package/dist/registry-selection.d.ts +31 -0
- package/dist/registry-selection.d.ts.map +1 -0
- package/dist/registry-selection.js +167 -0
- package/dist/registry-selection.js.map +1 -0
- package/dist/registry-state.d.ts +92 -0
- package/dist/registry-state.d.ts.map +1 -0
- package/dist/registry-state.js +35 -0
- package/dist/registry-state.js.map +1 -0
- package/dist/registry.d.ts +127 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +248 -0
- package/dist/registry.js.map +1 -0
- package/dist/resilience.d.ts +212 -0
- package/dist/resilience.d.ts.map +1 -0
- package/dist/resilience.js +292 -0
- package/dist/resilience.js.map +1 -0
- package/dist/security.d.ts +44 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +184 -0
- package/dist/security.js.map +1 -0
- package/dist/server.d.ts +41 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +320 -0
- package/dist/server.js.map +1 -0
- package/dist/shell-safe.d.ts +15 -0
- package/dist/shell-safe.d.ts.map +1 -0
- package/dist/shell-safe.js +20 -0
- package/dist/shell-safe.js.map +1 -0
- package/dist/types.d.ts +365 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/logo.svg +81 -0
- package/package.json +85 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Snapshot diff helpers for the discovery plane.
|
|
3
|
+
*
|
|
4
|
+
* I keep delta construction separate so the snapshot/health file stays small
|
|
5
|
+
* and the diff semantics remain easy to test in isolation.
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import { DISCOVERY_SCHEMA_VERSION } from "./discovery-contract.js";
|
|
9
|
+
/**
|
|
10
|
+
* Expand a snapshot into full upsert changes for bootstrap consumers.
|
|
11
|
+
*/
|
|
12
|
+
export function fullSnapshotChanges(snapshot) {
|
|
13
|
+
return [
|
|
14
|
+
...snapshot.providers.map((provider) => ({
|
|
15
|
+
entity: "provider",
|
|
16
|
+
action: "upsert",
|
|
17
|
+
key: provider.providerId,
|
|
18
|
+
value: provider,
|
|
19
|
+
})),
|
|
20
|
+
...snapshot.models.map((model) => ({
|
|
21
|
+
entity: "model",
|
|
22
|
+
action: "upsert",
|
|
23
|
+
key: model.key,
|
|
24
|
+
value: model,
|
|
25
|
+
})),
|
|
26
|
+
...snapshot.health.map((health) => ({
|
|
27
|
+
entity: "health",
|
|
28
|
+
action: "upsert",
|
|
29
|
+
key: health.providerId,
|
|
30
|
+
value: health,
|
|
31
|
+
})),
|
|
32
|
+
...snapshot.credentialPrompts.map((prompt) => ({
|
|
33
|
+
entity: "credential_prompt",
|
|
34
|
+
action: "upsert",
|
|
35
|
+
key: prompt.providerId,
|
|
36
|
+
value: prompt,
|
|
37
|
+
})),
|
|
38
|
+
];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Diff two snapshots into a single delta batch.
|
|
42
|
+
*/
|
|
43
|
+
export function diffSnapshots(previous, next) {
|
|
44
|
+
const changes = [];
|
|
45
|
+
collectSectionChanges("provider", previous.providers, next.providers, (item) => item.providerId, changes);
|
|
46
|
+
collectSectionChanges("model", previous.models, next.models, (item) => item.key, changes);
|
|
47
|
+
collectSectionChanges("health", previous.health, next.health, (item) => item.providerId, changes);
|
|
48
|
+
collectSectionChanges("credential_prompt", previous.credentialPrompts, next.credentialPrompts, (item) => item.providerId, changes);
|
|
49
|
+
return {
|
|
50
|
+
schemaVersion: DISCOVERY_SCHEMA_VERSION,
|
|
51
|
+
sinceCursor: previous.cursor,
|
|
52
|
+
cursor: next.cursor,
|
|
53
|
+
changedAt: next.discoveredAt,
|
|
54
|
+
resetRequired: false,
|
|
55
|
+
changes,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function collectSectionChanges(entity, previous, next, keyOf, target) {
|
|
59
|
+
const previousMap = new Map(previous.map((item) => [keyOf(item), item]));
|
|
60
|
+
const nextMap = new Map(next.map((item) => [keyOf(item), item]));
|
|
61
|
+
for (const [key, item] of nextMap) {
|
|
62
|
+
const prev = previousMap.get(key);
|
|
63
|
+
// I use value-level JSON equality here because the schema objects are small and stable.
|
|
64
|
+
if (!prev || JSON.stringify(prev) !== JSON.stringify(item)) {
|
|
65
|
+
target.push({ entity, action: "upsert", key, value: item });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
for (const key of previousMap.keys()) {
|
|
69
|
+
if (!nextMap.has(key)) {
|
|
70
|
+
target.push({ entity, action: "remove", key, value: null });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=registry-delta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-delta.js","sourceRoot":"","sources":["../src/registry-delta.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAOnE;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAA6B;IAChE,OAAO;QACN,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAqB,EAAE,CAAC,CAAC;YAC3D,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,QAAQ;YAChB,GAAG,EAAE,QAAQ,CAAC,UAAU;YACxB,KAAK,EAAE,QAAQ;SACf,CAAC,CAAC;QACH,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAqB,EAAE,CAAC,CAAC;YACrD,MAAM,EAAE,OAAO;YACf,MAAM,EAAE,QAAQ;YAChB,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,KAAK,EAAE,KAAK;SACZ,CAAC,CAAC;QACH,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAqB,EAAE,CAAC,CAAC;YACtD,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;YAChB,GAAG,EAAE,MAAM,CAAC,UAAU;YACtB,KAAK,EAAE,MAAM;SACb,CAAC,CAAC;QACH,GAAG,QAAQ,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAqB,EAAE,CAAC,CAAC;YACjE,MAAM,EAAE,mBAAmB;YAC3B,MAAM,EAAE,QAAQ;YAChB,GAAG,EAAE,MAAM,CAAC,UAAU;YACtB,KAAK,EAAE,MAAM;SACb,CAAC,CAAC;KACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC5B,QAA6B,EAC7B,IAAyB;IAEzB,MAAM,OAAO,GAAwB,EAAE,CAAC;IAExC,qBAAqB,CAAC,UAAU,EAAE,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC1G,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC1F,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAClG,qBAAqB,CACpB,mBAAmB,EACnB,QAAQ,CAAC,iBAAiB,EAC1B,IAAI,CAAC,iBAAiB,EACtB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EACzB,OAAO,CACP,CAAC;IAEF,OAAO;QACN,aAAa,EAAE,wBAAwB;QACvC,WAAW,EAAE,QAAQ,CAAC,MAAM;QAC5B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,YAAY;QAC5B,aAAa,EAAE,KAAK;QACpB,OAAO;KACP,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAC7B,MAAmC,EACnC,QAAa,EACb,IAAS,EACT,KAA0B,EAC1B,MAA2B;IAE3B,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAEjE,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,wFAAwF;QACxF,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,IAAkC,EAAE,CAAC,CAAC;QAC3F,CAAC;IACF,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;IACF,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Discovery snapshot, delta, and health helpers.
|
|
3
|
+
*
|
|
4
|
+
* I keep the versioned discovery-plane projection here so `ModelRegistry`
|
|
5
|
+
* itself can stay focused on API shape and orchestration.
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import type { DiscoveryDeltaV1, DiscoveryHealthRecord, DiscoveryModelV1, DiscoveryProviderV1, DiscoverySnapshotV1 } from "./discovery-contract.js";
|
|
9
|
+
import type { ModelCard } from "./types.js";
|
|
10
|
+
import type { ProviderObservation, RegistryState } from "./registry-state.js";
|
|
11
|
+
/**
|
|
12
|
+
* Return the cached snapshot when it is still valid for diff generation.
|
|
13
|
+
*/
|
|
14
|
+
export declare function registrySnapshotForDelta(state: RegistryState): DiscoverySnapshotV1 | null;
|
|
15
|
+
/**
|
|
16
|
+
* Build and cache the stable v1 discovery snapshot.
|
|
17
|
+
*/
|
|
18
|
+
export declare function registryDiscoverySnapshot(state: RegistryState): DiscoverySnapshotV1;
|
|
19
|
+
/**
|
|
20
|
+
* Return discovery deltas since a previous cursor.
|
|
21
|
+
*/
|
|
22
|
+
export declare function registryDiscoveryDelta(state: RegistryState, options?: {
|
|
23
|
+
sinceCursor?: string | null;
|
|
24
|
+
}): DiscoveryDeltaV1;
|
|
25
|
+
/**
|
|
26
|
+
* Stream live deltas through the shared registry event bus.
|
|
27
|
+
*/
|
|
28
|
+
export declare function registryWatchDiscovery(state: RegistryState, options?: {
|
|
29
|
+
sinceCursor?: string | null;
|
|
30
|
+
}): AsyncGenerator<DiscoveryDeltaV1, void, void>;
|
|
31
|
+
/**
|
|
32
|
+
* Advance the discovery cursor and emit a delta when the snapshot changes.
|
|
33
|
+
*/
|
|
34
|
+
export declare function registryRecordDiscoveryMutation(state: RegistryState, previousSnapshot: DiscoverySnapshotV1 | null): void;
|
|
35
|
+
/**
|
|
36
|
+
* Build a monotonic cursor for snapshot and delta consumers.
|
|
37
|
+
*/
|
|
38
|
+
export declare function registryMakeCursor(state: RegistryState): string;
|
|
39
|
+
/**
|
|
40
|
+
* Build the stable v1 discovery snapshot from in-memory state.
|
|
41
|
+
*/
|
|
42
|
+
export declare function registryBuildSnapshot(state: RegistryState, cursor: string): DiscoverySnapshotV1;
|
|
43
|
+
/**
|
|
44
|
+
* Serialize one provider entry into the stable v1 schema.
|
|
45
|
+
*/
|
|
46
|
+
export declare function registrySerializeProvider(state: RegistryState, providerId: string): DiscoveryProviderV1;
|
|
47
|
+
/**
|
|
48
|
+
* Serialize one model route into the stable v1 schema.
|
|
49
|
+
*/
|
|
50
|
+
export declare function registrySerializeModel(state: RegistryState, model: ModelCard): DiscoveryModelV1;
|
|
51
|
+
/**
|
|
52
|
+
* Build the normalized provider-health projection for the v1 schema.
|
|
53
|
+
*/
|
|
54
|
+
export declare function registryBuildHealthRecord(state: RegistryState, providerId: string): DiscoveryHealthRecord;
|
|
55
|
+
/**
|
|
56
|
+
* Store one provider observation for later health normalization.
|
|
57
|
+
*/
|
|
58
|
+
export declare function registryRecordObservation(state: RegistryState, providerId: string, entry: {
|
|
59
|
+
latencyMs: number;
|
|
60
|
+
errorType: ProviderObservation["lastErrorType"];
|
|
61
|
+
}): void;
|
|
62
|
+
/**
|
|
63
|
+
* Normalize a provider error message into a stable health class.
|
|
64
|
+
*/
|
|
65
|
+
export declare function registryClassifyError(errorMessage: string): ProviderObservation["lastErrorType"];
|
|
66
|
+
//# sourceMappingURL=registry-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-discovery.d.ts","sourceRoot":"","sources":["../src/registry-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACX,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,KAAK,EAAE,SAAS,EAA4B,MAAM,YAAY,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE9E;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,aAAa,GAAG,mBAAmB,GAAG,IAAI,CAIzF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,aAAa,GAAG,mBAAmB,CAInF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACrC,KAAK,EAAE,aAAa,EACpB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACvC,gBAAgB,CAiDlB;AAED;;GAEG;AACH,wBAAuB,sBAAsB,CAC5C,KAAK,EAAE,aAAa,EACpB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACvC,cAAc,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,CA6B9C;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAC9C,KAAK,EAAE,aAAa,EACpB,gBAAgB,EAAE,mBAAmB,GAAG,IAAI,GAC1C,IAAI,CAoBN;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAE/D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAuB/F;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,mBAAmB,CAsBvG;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,GAAG,gBAAgB,CAgC/F;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,qBAAqB,CAmCzG;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,mBAAmB,CAAC,eAAe,CAAC,CAAA;CAAE,GAC3E,IAAI,CAkBN;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAehG"}
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Discovery snapshot, delta, and health helpers.
|
|
3
|
+
*
|
|
4
|
+
* I keep the versioned discovery-plane projection here so `ModelRegistry`
|
|
5
|
+
* itself can stay focused on API shape and orchestration.
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import { DISCOVERY_SCHEMA_VERSION, discoveryRoles, makeModelKey, rawCapabilitiesForModel, trustedCapabilitiesForModel, } from "./discovery-contract.js";
|
|
9
|
+
import { getProviderConfig, listProviderDescriptors, normalizeProviderId } from "./provider-catalog.js";
|
|
10
|
+
import { diffSnapshots, fullSnapshotChanges } from "./registry-delta.js";
|
|
11
|
+
import { registryModels, registryProviderDescriptor } from "./registry-query.js";
|
|
12
|
+
/**
|
|
13
|
+
* Return the cached snapshot when it is still valid for diff generation.
|
|
14
|
+
*/
|
|
15
|
+
export function registrySnapshotForDelta(state) {
|
|
16
|
+
if (state.lastSnapshotCache)
|
|
17
|
+
return state.lastSnapshotCache;
|
|
18
|
+
if (state.providerMap.size === 0 && state.discoveredAt === 0)
|
|
19
|
+
return null;
|
|
20
|
+
return registryBuildSnapshot(state, state.currentCursor);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Build and cache the stable v1 discovery snapshot.
|
|
24
|
+
*/
|
|
25
|
+
export function registryDiscoverySnapshot(state) {
|
|
26
|
+
const snapshot = registryBuildSnapshot(state, state.currentCursor);
|
|
27
|
+
state.lastSnapshotCache = snapshot;
|
|
28
|
+
return snapshot;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Return discovery deltas since a previous cursor.
|
|
32
|
+
*/
|
|
33
|
+
export function registryDiscoveryDelta(state, options) {
|
|
34
|
+
const snapshot = registryDiscoverySnapshot(state);
|
|
35
|
+
const sinceCursor = options?.sinceCursor ?? null;
|
|
36
|
+
if (!sinceCursor) {
|
|
37
|
+
return {
|
|
38
|
+
schemaVersion: DISCOVERY_SCHEMA_VERSION,
|
|
39
|
+
sinceCursor,
|
|
40
|
+
cursor: snapshot.cursor,
|
|
41
|
+
changedAt: snapshot.discoveredAt,
|
|
42
|
+
resetRequired: false,
|
|
43
|
+
changes: fullSnapshotChanges(snapshot),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
if (sinceCursor === snapshot.cursor) {
|
|
47
|
+
return {
|
|
48
|
+
schemaVersion: DISCOVERY_SCHEMA_VERSION,
|
|
49
|
+
sinceCursor,
|
|
50
|
+
cursor: snapshot.cursor,
|
|
51
|
+
changedAt: snapshot.discoveredAt,
|
|
52
|
+
resetRequired: false,
|
|
53
|
+
changes: [],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const sinceIndex = state.deltaHistory.findIndex((delta) => delta.sinceCursor === sinceCursor || delta.cursor === sinceCursor);
|
|
57
|
+
if (sinceIndex === -1) {
|
|
58
|
+
return {
|
|
59
|
+
schemaVersion: DISCOVERY_SCHEMA_VERSION,
|
|
60
|
+
sinceCursor,
|
|
61
|
+
cursor: snapshot.cursor,
|
|
62
|
+
changedAt: snapshot.discoveredAt,
|
|
63
|
+
resetRequired: true,
|
|
64
|
+
changes: [],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const deltas = state.deltaHistory.slice(sinceIndex);
|
|
68
|
+
return {
|
|
69
|
+
schemaVersion: DISCOVERY_SCHEMA_VERSION,
|
|
70
|
+
sinceCursor,
|
|
71
|
+
cursor: snapshot.cursor,
|
|
72
|
+
changedAt: deltas.at(-1)?.changedAt ?? snapshot.discoveredAt,
|
|
73
|
+
resetRequired: false,
|
|
74
|
+
changes: deltas.flatMap((delta) => delta.changes),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Stream live deltas through the shared registry event bus.
|
|
79
|
+
*/
|
|
80
|
+
export async function* registryWatchDiscovery(state, options) {
|
|
81
|
+
const backlog = registryDiscoveryDelta(state, { sinceCursor: options?.sinceCursor ?? null });
|
|
82
|
+
if (backlog.resetRequired || backlog.changes.length > 0) {
|
|
83
|
+
// I replay backlog first so watch clients can bootstrap and then switch to live deltas.
|
|
84
|
+
yield backlog;
|
|
85
|
+
}
|
|
86
|
+
const queue = [];
|
|
87
|
+
let notify;
|
|
88
|
+
const listener = (delta) => {
|
|
89
|
+
queue.push(delta);
|
|
90
|
+
notify?.();
|
|
91
|
+
notify = undefined;
|
|
92
|
+
};
|
|
93
|
+
state.discoveryEventBus.on("delta", listener);
|
|
94
|
+
try {
|
|
95
|
+
while (true) {
|
|
96
|
+
if (queue.length === 0) {
|
|
97
|
+
await new Promise((resolve) => {
|
|
98
|
+
notify = resolve;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
const next = queue.shift();
|
|
102
|
+
if (next)
|
|
103
|
+
yield next;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
state.discoveryEventBus.off("delta", listener);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Advance the discovery cursor and emit a delta when the snapshot changes.
|
|
112
|
+
*/
|
|
113
|
+
export function registryRecordDiscoveryMutation(state, previousSnapshot) {
|
|
114
|
+
state.discoveryRevision += 1;
|
|
115
|
+
state.currentCursor = registryMakeCursor(state);
|
|
116
|
+
const nextSnapshot = registryBuildSnapshot(state, state.currentCursor);
|
|
117
|
+
state.lastSnapshotCache = nextSnapshot;
|
|
118
|
+
if (!previousSnapshot) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const delta = diffSnapshots(previousSnapshot, nextSnapshot);
|
|
122
|
+
if (delta.changes.length === 0) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
state.deltaHistory.push(delta);
|
|
126
|
+
if (state.deltaHistory.length > 50) {
|
|
127
|
+
state.deltaHistory.shift();
|
|
128
|
+
}
|
|
129
|
+
state.discoveryEventBus.emit("delta", delta);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Build a monotonic cursor for snapshot and delta consumers.
|
|
133
|
+
*/
|
|
134
|
+
export function registryMakeCursor(state) {
|
|
135
|
+
return `discovery-${state.discoveryRevision}-${state.discoveredAt || Date.now()}`;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Build the stable v1 discovery snapshot from in-memory state.
|
|
139
|
+
*/
|
|
140
|
+
export function registryBuildSnapshot(state, cursor) {
|
|
141
|
+
return {
|
|
142
|
+
schemaVersion: DISCOVERY_SCHEMA_VERSION,
|
|
143
|
+
discoveredAt: state.discoveredAt || null,
|
|
144
|
+
cursor,
|
|
145
|
+
providers: listProviderDescriptors()
|
|
146
|
+
.map((descriptor) => registrySerializeProvider(state, descriptor.providerId))
|
|
147
|
+
.sort((a, b) => a.providerId.localeCompare(b.providerId)),
|
|
148
|
+
models: registryModels(state)
|
|
149
|
+
.map((model) => registrySerializeModel(state, model))
|
|
150
|
+
.sort((a, b) => a.key.localeCompare(b.key)),
|
|
151
|
+
roles: discoveryRoles(),
|
|
152
|
+
health: listProviderDescriptors()
|
|
153
|
+
.map((descriptor) => registryBuildHealthRecord(state, descriptor.providerId))
|
|
154
|
+
.sort((a, b) => a.providerId.localeCompare(b.providerId)),
|
|
155
|
+
credentialPrompts: catalogCredentialPrompts(state).map((prompt) => ({
|
|
156
|
+
providerId: prompt.providerId,
|
|
157
|
+
providerName: prompt.providerName,
|
|
158
|
+
required: prompt.required,
|
|
159
|
+
envVars: [...prompt.envVars],
|
|
160
|
+
message: prompt.message,
|
|
161
|
+
})),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Serialize one provider entry into the stable v1 schema.
|
|
166
|
+
*/
|
|
167
|
+
export function registrySerializeProvider(state, providerId) {
|
|
168
|
+
const provider = state.providerMap.get(providerId);
|
|
169
|
+
const descriptor = registryProviderDescriptor(state, providerId, provider);
|
|
170
|
+
const config = getProviderConfig(state.config, providerId);
|
|
171
|
+
return {
|
|
172
|
+
providerId: descriptor.providerId,
|
|
173
|
+
canonicalProviderId: descriptor.canonicalProviderId,
|
|
174
|
+
aliases: [...descriptor.aliases],
|
|
175
|
+
name: descriptor.name,
|
|
176
|
+
origin: descriptor.origin,
|
|
177
|
+
isLocal: descriptor.isLocal,
|
|
178
|
+
transport: descriptor.transport,
|
|
179
|
+
authenticated: provider?.authenticated ?? false,
|
|
180
|
+
credentialSource: provider?.credentialSource ?? null,
|
|
181
|
+
credentialsPresent: provider?.authenticated ?? false,
|
|
182
|
+
credentialsRequired: descriptor.credentialRequired,
|
|
183
|
+
credentialEnvVars: [...descriptor.credentialEnvVars],
|
|
184
|
+
modelCount: provider?.models.length ?? 0,
|
|
185
|
+
lastRefreshed: provider?.lastRefreshed ?? null,
|
|
186
|
+
baseUrl: provider?.baseUrl ?? config?.baseUrl ?? descriptor.defaultBaseUrl,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Serialize one model route into the stable v1 schema.
|
|
191
|
+
*/
|
|
192
|
+
export function registrySerializeModel(state, model) {
|
|
193
|
+
const descriptor = registryProviderDescriptor(state, model.provider, state.providerMap.get(model.provider));
|
|
194
|
+
const runtime = model.localRuntime;
|
|
195
|
+
return {
|
|
196
|
+
key: makeModelKey(model, descriptor),
|
|
197
|
+
modelId: model.id,
|
|
198
|
+
name: model.name,
|
|
199
|
+
providerId: model.provider,
|
|
200
|
+
canonicalProviderId: descriptor.canonicalProviderId,
|
|
201
|
+
originProviderId: normalizeProviderId(model.originProvider) ?? model.originProvider ?? descriptor.canonicalProviderId,
|
|
202
|
+
mode: model.mode,
|
|
203
|
+
capabilities: trustedCapabilitiesForModel(model, descriptor),
|
|
204
|
+
rawCapabilities: rawCapabilitiesForModel(model),
|
|
205
|
+
contextWindow: model.contextWindow > 0 ? model.contextWindow : null,
|
|
206
|
+
maxOutputTokens: model.maxOutputTokens > 0 ? model.maxOutputTokens : null,
|
|
207
|
+
pricing: model.pricing ?? null,
|
|
208
|
+
dimensions: model.dimensions ?? null,
|
|
209
|
+
maxInputTokens: model.maxInputTokens ?? null,
|
|
210
|
+
discoveredAt: model.discoveredAt,
|
|
211
|
+
source: model.source,
|
|
212
|
+
aliases: [...model.aliases],
|
|
213
|
+
region: model.region ?? null,
|
|
214
|
+
projectId: model.projectId ?? null,
|
|
215
|
+
runtimeFamily: runtime?.runtimeFamily ?? (descriptor.isLocal ? descriptor.canonicalProviderId : null),
|
|
216
|
+
tokenizerFamily: runtime?.tokenizerFamily ?? null,
|
|
217
|
+
quantization: runtime?.quantization ?? null,
|
|
218
|
+
memoryFootprintBytes: runtime?.memoryFootprintBytes ?? null,
|
|
219
|
+
computeTarget: runtime?.computeTarget ?? null,
|
|
220
|
+
supportsStructuredOutput: runtime?.supportsStructuredOutput ?? null,
|
|
221
|
+
supportsStreaming: runtime?.supportsStreaming ?? null,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Build the normalized provider-health projection for the v1 schema.
|
|
226
|
+
*/
|
|
227
|
+
export function registryBuildHealthRecord(state, providerId) {
|
|
228
|
+
const breaker = state.healthTracker.breaker(providerId).health();
|
|
229
|
+
const observation = state.providerObservations.get(providerId);
|
|
230
|
+
const provider = state.providerMap.get(providerId);
|
|
231
|
+
const timeoutRate = observation && observation.attemptCount > 0
|
|
232
|
+
? observation.timeoutCount / observation.attemptCount
|
|
233
|
+
: 0;
|
|
234
|
+
const latencyClass = computeLatencyClass(observation);
|
|
235
|
+
let stateLabel = "unknown";
|
|
236
|
+
// I keep auth and throttle failures distinct because they imply different downstream actions.
|
|
237
|
+
if (observation?.lastErrorType === "auth_error") {
|
|
238
|
+
stateLabel = "auth_error";
|
|
239
|
+
}
|
|
240
|
+
else if (observation?.lastErrorType === "throttled") {
|
|
241
|
+
stateLabel = "throttled";
|
|
242
|
+
}
|
|
243
|
+
else if (breaker.state === "open" && observation?.attemptCount) {
|
|
244
|
+
stateLabel = "down";
|
|
245
|
+
}
|
|
246
|
+
else if (provider?.lastRefreshed && (breaker.failureCount > 0 || timeoutRate >= 0.25 || latencyClass === "high")) {
|
|
247
|
+
stateLabel = "degraded";
|
|
248
|
+
}
|
|
249
|
+
else if (breaker.lastSuccessTime > 0 || provider?.lastRefreshed) {
|
|
250
|
+
stateLabel = "healthy";
|
|
251
|
+
}
|
|
252
|
+
return {
|
|
253
|
+
providerId,
|
|
254
|
+
state: stateLabel,
|
|
255
|
+
failureCount: breaker.failureCount,
|
|
256
|
+
lastError: breaker.lastError ?? null,
|
|
257
|
+
lastSuccessAt: breaker.lastSuccessTime || provider?.lastRefreshed || null,
|
|
258
|
+
lastFailureAt: breaker.lastFailureTime || null,
|
|
259
|
+
latencyClass,
|
|
260
|
+
timeoutRate: Number(timeoutRate.toFixed(3)),
|
|
261
|
+
rateLimitState: observation?.lastErrorType === "throttled" ? "throttled" : observation?.attemptCount ? "ok" : "unknown",
|
|
262
|
+
circuitState: breaker.state,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Store one provider observation for later health normalization.
|
|
267
|
+
*/
|
|
268
|
+
export function registryRecordObservation(state, providerId, entry) {
|
|
269
|
+
const observation = state.providerObservations.get(providerId) ?? {
|
|
270
|
+
latenciesMs: [],
|
|
271
|
+
timeoutCount: 0,
|
|
272
|
+
attemptCount: 0,
|
|
273
|
+
lastErrorType: null,
|
|
274
|
+
};
|
|
275
|
+
observation.attemptCount += 1;
|
|
276
|
+
observation.latenciesMs.push(entry.latencyMs);
|
|
277
|
+
if (observation.latenciesMs.length > 20) {
|
|
278
|
+
observation.latenciesMs.shift();
|
|
279
|
+
}
|
|
280
|
+
if (entry.errorType === "timeout") {
|
|
281
|
+
observation.timeoutCount += 1;
|
|
282
|
+
}
|
|
283
|
+
observation.lastErrorType = entry.errorType;
|
|
284
|
+
state.providerObservations.set(providerId, observation);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Normalize a provider error message into a stable health class.
|
|
288
|
+
*/
|
|
289
|
+
export function registryClassifyError(errorMessage) {
|
|
290
|
+
const lower = errorMessage.toLowerCase();
|
|
291
|
+
if (lower.includes("401") || lower.includes("403") || lower.includes("unauthorized") || lower.includes("forbidden")) {
|
|
292
|
+
return "auth_error";
|
|
293
|
+
}
|
|
294
|
+
if (lower.includes("429") || lower.includes("rate limit") || lower.includes("quota")) {
|
|
295
|
+
return "throttled";
|
|
296
|
+
}
|
|
297
|
+
if (lower.includes("timed out") || lower.includes("timeout") || lower.includes("abort")) {
|
|
298
|
+
return "timeout";
|
|
299
|
+
}
|
|
300
|
+
if (lower.includes("network") || lower.includes("econn") || lower.includes("fetch failed") || lower.includes("5")) {
|
|
301
|
+
return "transport";
|
|
302
|
+
}
|
|
303
|
+
return "unknown";
|
|
304
|
+
}
|
|
305
|
+
function catalogCredentialPrompts(state) {
|
|
306
|
+
const prompts = [];
|
|
307
|
+
for (const descriptor of listProviderDescriptors()) {
|
|
308
|
+
const provider = state.providerMap.get(descriptor.providerId);
|
|
309
|
+
if (!descriptor.credentialRequired || provider?.authenticated) {
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
const envHint = descriptor.credentialEnvVars.length > 0
|
|
313
|
+
? `Set ${descriptor.credentialEnvVars.join(" or ")}`
|
|
314
|
+
: "Configure credentials";
|
|
315
|
+
prompts.push({
|
|
316
|
+
providerId: descriptor.providerId,
|
|
317
|
+
providerName: descriptor.name,
|
|
318
|
+
required: true,
|
|
319
|
+
envVars: descriptor.credentialEnvVars,
|
|
320
|
+
message: `${envHint} to enable ${descriptor.name} model discovery.`,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
return prompts.sort((a, b) => a.providerId.localeCompare(b.providerId));
|
|
324
|
+
}
|
|
325
|
+
function computeLatencyClass(observation) {
|
|
326
|
+
if (!observation || observation.attemptCount === 0 || observation.latenciesMs.length === 0) {
|
|
327
|
+
return "unknown";
|
|
328
|
+
}
|
|
329
|
+
if (observation.lastErrorType === "timeout") {
|
|
330
|
+
return "timeout";
|
|
331
|
+
}
|
|
332
|
+
const average = observation.latenciesMs.reduce((sum, value) => sum + value, 0) / observation.latenciesMs.length;
|
|
333
|
+
if (average <= 1_000)
|
|
334
|
+
return "low";
|
|
335
|
+
if (average <= 4_000)
|
|
336
|
+
return "medium";
|
|
337
|
+
return "high";
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=registry-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-discovery.js","sourceRoot":"","sources":["../src/registry-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Core query helpers for ModelRegistry.
|
|
3
|
+
*
|
|
4
|
+
* I keep model lookup, role filtering, capability aggregation, and cheapest
|
|
5
|
+
* route selection here so the registry façade can stay under the file-size
|
|
6
|
+
* policy while preserving the public API.
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import type { CapabilitySummary, CheapestModelOptions, CheapestModelResult, ModelCard, ModelMode, ModelRouteInfo, PricingMetric, ProviderCredentialPrompt, ProviderInfo, ProviderRoleInfo, RoleQueryOptions } from "./types.js";
|
|
10
|
+
import type { RegistryState } from "./registry-state.js";
|
|
11
|
+
/**
|
|
12
|
+
* Return a stable provider descriptor, even for synthetic test providers.
|
|
13
|
+
*/
|
|
14
|
+
export declare function registryProviderDescriptor(state: RegistryState, providerId: string, providerInfo?: ProviderInfo): import("./provider-catalog.js").ProviderDescriptor;
|
|
15
|
+
/**
|
|
16
|
+
* Normalize a role or capability token for routing and filtering.
|
|
17
|
+
*/
|
|
18
|
+
export declare function normalizeRoleToken(value: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Return the deduplicated role list for a single model.
|
|
21
|
+
*/
|
|
22
|
+
export declare function modelRoles(model: ModelCard): string[];
|
|
23
|
+
/**
|
|
24
|
+
* Check whether a model satisfies a role or capability query.
|
|
25
|
+
*/
|
|
26
|
+
export declare function modelSupportsRole(model: ModelCard, roleOrCapability: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* List models with provider-aware deduplication and optional filters.
|
|
29
|
+
*/
|
|
30
|
+
export declare function registryModels(state: RegistryState, filter?: {
|
|
31
|
+
provider?: string;
|
|
32
|
+
originProvider?: string;
|
|
33
|
+
mode?: ModelMode;
|
|
34
|
+
capability?: string;
|
|
35
|
+
}): ModelCard[];
|
|
36
|
+
/**
|
|
37
|
+
* Build the provider -> model -> roles matrix used by the legacy API.
|
|
38
|
+
*/
|
|
39
|
+
export declare function registryProviderRoles(state: RegistryState, filter?: RoleQueryOptions): ProviderRoleInfo[];
|
|
40
|
+
/**
|
|
41
|
+
* Return prompts for currently discovered providers missing required credentials.
|
|
42
|
+
*/
|
|
43
|
+
export declare function registryMissingCredentialPrompts(state: RegistryState, providerIds?: string[]): ProviderCredentialPrompt[];
|
|
44
|
+
/**
|
|
45
|
+
* Rank the cheapest models for a normalized role/mode query.
|
|
46
|
+
*/
|
|
47
|
+
export declare function registryCheapestModels(state: RegistryState, options?: CheapestModelOptions): CheapestModelResult;
|
|
48
|
+
/**
|
|
49
|
+
* Find every provider route for a normalized model identifier.
|
|
50
|
+
*/
|
|
51
|
+
export declare function registryModelRoutes(state: RegistryState, modelId: string): ModelCard[];
|
|
52
|
+
/**
|
|
53
|
+
* Enrich raw routes with preferred/direct metadata for legacy consumers.
|
|
54
|
+
*/
|
|
55
|
+
export declare function registryModelRouteInfo(state: RegistryState, modelId: string): ModelRouteInfo[];
|
|
56
|
+
/**
|
|
57
|
+
* Aggregate capability statistics across all discovered models.
|
|
58
|
+
*/
|
|
59
|
+
export declare function registryCapabilities(state: RegistryState, filter?: {
|
|
60
|
+
provider?: string;
|
|
61
|
+
}): CapabilitySummary[];
|
|
62
|
+
/**
|
|
63
|
+
* Pick the default pricing metric for a cheapest-model query.
|
|
64
|
+
*/
|
|
65
|
+
export declare function defaultPricingMetric(options?: CheapestModelOptions): PricingMetric;
|
|
66
|
+
/**
|
|
67
|
+
* Compute a comparable score for a model/pricing metric combination.
|
|
68
|
+
*/
|
|
69
|
+
export declare function computeModelScore(model: ModelCard, metric: PricingMetric, inputWeight: number, outputWeight: number): number | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* Normalize a user-supplied result limit into a safe positive integer.
|
|
72
|
+
*/
|
|
73
|
+
export declare function normalizeLimit(limit: number | undefined): number;
|
|
74
|
+
//# sourceMappingURL=registry-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-query.d.ts","sourceRoot":"","sources":["../src/registry-query.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACX,iBAAiB,EAEjB,oBAAoB,EACpB,mBAAmB,EACnB,SAAS,EACT,SAAS,EACT,cAAc,EACd,aAAa,EACb,wBAAwB,EACxB,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAoCzD;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,YAAY,sDAa/G;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE,CAErD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAOrF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,KAAK,EAAE,aAAa,EACpB,MAAM,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5F,SAAS,EAAE,CAuBb;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,EAAE,CAoCzG;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,wBAAwB,EAAE,CAwBzH;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,mBAAmB,CAgChH;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,CAItF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,CAyB9F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,iBAAiB,EAAE,CAqB9G;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,aAAa,CAKlF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOxI;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGhE"}
|