@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,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Discovery-plane selection helpers.
|
|
3
|
+
*
|
|
4
|
+
* I keep execution-binding hints and cheapest-candidate projections separate
|
|
5
|
+
* from the legacy query layer because these are discovery-plane outputs, not
|
|
6
|
+
* final routing policy.
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import type { DiscoveryBindingHintsV1, DiscoveryBindingQuery, DiscoveryCheapestResultV1 } from "./discovery-contract.js";
|
|
10
|
+
import type { RegistryState } from "./registry-state.js";
|
|
11
|
+
import type { ModelCard } from "./types.js";
|
|
12
|
+
/**
|
|
13
|
+
* Return ranked cheapest candidates for the v1 discovery plane.
|
|
14
|
+
*/
|
|
15
|
+
export declare function registryCheapestCandidates(state: RegistryState, query?: DiscoveryBindingQuery): DiscoveryCheapestResultV1;
|
|
16
|
+
/**
|
|
17
|
+
* Return selection hints that Chitragupta can turn into an execution binding.
|
|
18
|
+
*/
|
|
19
|
+
export declare function registryExecutionBindingHints(state: RegistryState, query?: DiscoveryBindingQuery): DiscoveryBindingHintsV1;
|
|
20
|
+
/**
|
|
21
|
+
* Return models that satisfy a discovery-plane query.
|
|
22
|
+
*/
|
|
23
|
+
export declare function discoveryCandidateModels(state: RegistryState, query: DiscoveryBindingQuery): {
|
|
24
|
+
model: ModelCard;
|
|
25
|
+
descriptor: import("./provider-catalog.js").ProviderDescriptor;
|
|
26
|
+
}[];
|
|
27
|
+
/**
|
|
28
|
+
* Serialize a binding query into the stable v1 JSON shape.
|
|
29
|
+
*/
|
|
30
|
+
export declare function discoveryQueryRecord(query: DiscoveryBindingQuery): Record<string, string | number | boolean | null>;
|
|
31
|
+
//# sourceMappingURL=registry-selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-selection.d.ts","sourceRoot":"","sources":["../src/registry-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EACX,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,EAEzB,MAAM,yBAAyB,CAAC;AASjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAA4B,MAAM,YAAY,CAAC;AAEtE;;GAEG;AACH,wBAAgB,0BAA0B,CACzC,KAAK,EAAE,aAAa,EACpB,KAAK,GAAE,qBAA0B,GAC/B,yBAAyB,CA8B3B;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC5C,KAAK,EAAE,aAAa,EACpB,KAAK,GAAE,qBAA0B,GAC/B,uBAAuB,CAsCzB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,qBAAqB;;;IAS1F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAYnH"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Discovery-plane selection helpers.
|
|
3
|
+
*
|
|
4
|
+
* I keep execution-binding hints and cheapest-candidate projections separate
|
|
5
|
+
* from the legacy query layer because these are discovery-plane outputs, not
|
|
6
|
+
* final routing policy.
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { DISCOVERY_SCHEMA_VERSION, trustedCapabilitiesForModel, } from "./discovery-contract.js";
|
|
10
|
+
import { normalizeProviderId } from "./provider-catalog.js";
|
|
11
|
+
import { computeModelScore, defaultPricingMetric, normalizeLimit, registryModels, registryProviderDescriptor, } from "./registry-query.js";
|
|
12
|
+
/**
|
|
13
|
+
* Return ranked cheapest candidates for the v1 discovery plane.
|
|
14
|
+
*/
|
|
15
|
+
export function registryCheapestCandidates(state, query = {}) {
|
|
16
|
+
const priceMetric = query.priceMetric ?? defaultPricingMetric({
|
|
17
|
+
mode: query.mode,
|
|
18
|
+
role: query.role,
|
|
19
|
+
capability: query.capability,
|
|
20
|
+
});
|
|
21
|
+
const candidates = discoveryCandidateModels(state, query).map(({ model, descriptor }) => ({
|
|
22
|
+
model,
|
|
23
|
+
descriptor,
|
|
24
|
+
score: computeModelScore(model, priceMetric, 1, 1),
|
|
25
|
+
}));
|
|
26
|
+
const priced = candidates.filter((entry) => entry.score !== undefined).sort((a, b) => (a.score ?? Number.POSITIVE_INFINITY) - (b.score ?? Number.POSITIVE_INFINITY));
|
|
27
|
+
const unpriced = candidates.filter((entry) => entry.score === undefined);
|
|
28
|
+
return {
|
|
29
|
+
schemaVersion: DISCOVERY_SCHEMA_VERSION,
|
|
30
|
+
query: discoveryQueryRecord(query),
|
|
31
|
+
candidates: candidates.length,
|
|
32
|
+
pricedCandidates: priced.length,
|
|
33
|
+
skippedNoPricing: candidates.length - priced.length,
|
|
34
|
+
priceMetric,
|
|
35
|
+
matches: [...priced, ...unpriced].slice(0, normalizeLimit(query.limit)).map(({ model, descriptor, score }) => ({
|
|
36
|
+
modelId: model.id,
|
|
37
|
+
providerId: model.provider,
|
|
38
|
+
canonicalProviderId: descriptor.canonicalProviderId,
|
|
39
|
+
score: score ?? null,
|
|
40
|
+
priceMetric,
|
|
41
|
+
capabilities: trustedCapabilitiesForModel(model, descriptor),
|
|
42
|
+
})),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Return selection hints that Chitragupta can turn into an execution binding.
|
|
47
|
+
*/
|
|
48
|
+
export function registryExecutionBindingHints(state, query = {}) {
|
|
49
|
+
const preferLocalProviders = query.preferLocalProviders ?? false;
|
|
50
|
+
const allowCrossProvider = query.allowCrossProvider ?? true;
|
|
51
|
+
const priceMetric = (query.priceMetric ?? defaultPricingMetric({
|
|
52
|
+
mode: query.mode,
|
|
53
|
+
role: query.role,
|
|
54
|
+
capability: query.capability,
|
|
55
|
+
}));
|
|
56
|
+
const routes = discoveryCandidateModels(state, query).map(({ model, descriptor }) => ({
|
|
57
|
+
model,
|
|
58
|
+
descriptor,
|
|
59
|
+
isLocal: descriptor.isLocal,
|
|
60
|
+
isDirect: normalizeProviderId(model.originProvider) === descriptor.canonicalProviderId,
|
|
61
|
+
price: computeModelScore(model, priceMetric, 1, 1),
|
|
62
|
+
})).sort((a, b) =>
|
|
63
|
+
// I keep the sort deterministic so consumers get stable binding hints across identical snapshots.
|
|
64
|
+
(preferLocalProviders ? Number(b.isLocal) - Number(a.isLocal) : 0) ||
|
|
65
|
+
Number(b.isDirect) - Number(a.isDirect) ||
|
|
66
|
+
(a.price ?? Number.POSITIVE_INFINITY) - (b.price ?? Number.POSITIVE_INFINITY) ||
|
|
67
|
+
a.descriptor.canonicalProviderId.localeCompare(b.descriptor.canonicalProviderId) ||
|
|
68
|
+
a.model.id.localeCompare(b.model.id));
|
|
69
|
+
const selected = routes[0];
|
|
70
|
+
const scopedRoutes = !allowCrossProvider && selected ? routes.filter((route) => route.model.provider === selected.model.provider) : routes;
|
|
71
|
+
const preferredRoutes = scopedRoutes.slice(0, normalizeLimit(query.limit));
|
|
72
|
+
return {
|
|
73
|
+
schemaVersion: DISCOVERY_SCHEMA_VERSION,
|
|
74
|
+
query: discoveryQueryRecord(query),
|
|
75
|
+
selectedModelId: selected?.model.id ?? null,
|
|
76
|
+
selectedProviderId: selected?.model.provider ?? null,
|
|
77
|
+
candidateModelIds: Array.from(new Set(scopedRoutes.map((route) => route.model.id))),
|
|
78
|
+
preferredModelIds: Array.from(new Set(preferredRoutes.map((route) => route.model.id))),
|
|
79
|
+
preferredProviderIds: Array.from(new Set(preferredRoutes.map((route) => route.model.provider))),
|
|
80
|
+
preferLocalProviders,
|
|
81
|
+
allowCrossProvider,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Return models that satisfy a discovery-plane query.
|
|
86
|
+
*/
|
|
87
|
+
export function discoveryCandidateModels(state, query) {
|
|
88
|
+
return registryModels(state, {
|
|
89
|
+
provider: normalizeProviderId(query.provider),
|
|
90
|
+
originProvider: normalizeProviderId(query.originProvider),
|
|
91
|
+
mode: query.mode,
|
|
92
|
+
}).flatMap((model) => {
|
|
93
|
+
const descriptor = registryProviderDescriptor(state, model.provider, state.providerMap.get(model.provider));
|
|
94
|
+
return modelMatchesDiscoveryQuery(model, descriptor, query) ? [{ model, descriptor }] : [];
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Serialize a binding query into the stable v1 JSON shape.
|
|
99
|
+
*/
|
|
100
|
+
export function discoveryQueryRecord(query) {
|
|
101
|
+
return {
|
|
102
|
+
role: query.role ?? null,
|
|
103
|
+
capability: query.capability ?? null,
|
|
104
|
+
provider: normalizeProviderId(query.provider) ?? query.provider ?? null,
|
|
105
|
+
originProvider: normalizeProviderId(query.originProvider) ?? query.originProvider ?? null,
|
|
106
|
+
mode: query.mode ?? null,
|
|
107
|
+
limit: query.limit ?? null,
|
|
108
|
+
priceMetric: query.priceMetric ?? null,
|
|
109
|
+
preferLocalProviders: query.preferLocalProviders ?? null,
|
|
110
|
+
allowCrossProvider: query.allowCrossProvider ?? null,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function modelMatchesDiscoveryQuery(model, descriptor, query) {
|
|
114
|
+
const capabilities = trustedCapabilitiesForModel(model, descriptor);
|
|
115
|
+
// I only trust normalized capabilities here so free-form discoverer tags do not leak into route semantics.
|
|
116
|
+
const capability = normalizeTrustedCapabilityToken(query.capability);
|
|
117
|
+
if (capability && !capabilities.includes(capability))
|
|
118
|
+
return false;
|
|
119
|
+
return !query.role || roleRequirements(query.role).every((requiredCapability) => capabilities.includes(requiredCapability));
|
|
120
|
+
}
|
|
121
|
+
function roleRequirements(role) {
|
|
122
|
+
switch (role.trim().toLowerCase().replace(/[\s-]+/g, "_")) {
|
|
123
|
+
case "tool_use":
|
|
124
|
+
case "tools":
|
|
125
|
+
case "functions":
|
|
126
|
+
return ["chat", "function_calling"];
|
|
127
|
+
case "embeddings":
|
|
128
|
+
case "embedding":
|
|
129
|
+
return ["embeddings"];
|
|
130
|
+
case "vision":
|
|
131
|
+
return ["chat", "vision"];
|
|
132
|
+
case "rerank":
|
|
133
|
+
return ["rerank"];
|
|
134
|
+
case "local":
|
|
135
|
+
case "local_exec":
|
|
136
|
+
return ["local_exec"];
|
|
137
|
+
default:
|
|
138
|
+
return [normalizeTrustedCapabilityToken(role) ?? "chat"];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function normalizeTrustedCapabilityToken(value) {
|
|
142
|
+
if (!value)
|
|
143
|
+
return undefined;
|
|
144
|
+
const normalized = value.trim().toLowerCase().replace(/[\s-]+/g, "_");
|
|
145
|
+
const map = {
|
|
146
|
+
chat: "chat",
|
|
147
|
+
embedding: "embeddings",
|
|
148
|
+
embeddings: "embeddings",
|
|
149
|
+
function_calling: "function_calling",
|
|
150
|
+
tool_use: "function_calling",
|
|
151
|
+
tools: "function_calling",
|
|
152
|
+
vision: "vision",
|
|
153
|
+
rerank: "rerank",
|
|
154
|
+
structured_output: "structured_output",
|
|
155
|
+
streaming: "streaming",
|
|
156
|
+
long_context: "long_context",
|
|
157
|
+
local_exec: "local_exec",
|
|
158
|
+
local: "local_exec",
|
|
159
|
+
code: "code_generation",
|
|
160
|
+
code_generation: "code_generation",
|
|
161
|
+
reasoning: "reasoning",
|
|
162
|
+
low_latency: "low_latency",
|
|
163
|
+
cheap_inference: "cheap_inference",
|
|
164
|
+
};
|
|
165
|
+
return map[normalized];
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=registry-selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-selection.js","sourceRoot":"","sources":["../src/registry-selection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Internal registry state container.
|
|
3
|
+
*
|
|
4
|
+
* I keep mutable registry state in one plain object so helper modules can own
|
|
5
|
+
* behavior without forcing `ModelRegistry` itself to grow into a god object.
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import { EventEmitter } from "node:events";
|
|
9
|
+
import { AliasResolver } from "./aliases.js";
|
|
10
|
+
import { KoshaCache } from "./cache.js";
|
|
11
|
+
import type { DiscoveryDeltaV1, DiscoverySnapshotV1 } from "./discovery-contract.js";
|
|
12
|
+
import { HealthTracker } from "./resilience.js";
|
|
13
|
+
import type { CredentialResult, DiscoveryError, KoshaConfig, ProviderDiscoverer, ProviderInfo } from "./types.js";
|
|
14
|
+
/**
|
|
15
|
+
* Observation data used to build normalized provider-health summaries.
|
|
16
|
+
*/
|
|
17
|
+
export interface ProviderObservation {
|
|
18
|
+
/** Rolling latency samples in milliseconds. */
|
|
19
|
+
latenciesMs: number[];
|
|
20
|
+
/** Count of timed-out attempts inside the rolling observation window. */
|
|
21
|
+
timeoutCount: number;
|
|
22
|
+
/** Number of observed attempts contributing to the health summary. */
|
|
23
|
+
attemptCount: number;
|
|
24
|
+
/** Last normalized error class seen for the provider, if any. */
|
|
25
|
+
lastErrorType: "auth_error" | "throttled" | "timeout" | "transport" | "unknown" | null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* All mutable state owned by a {@link ModelRegistry} instance.
|
|
29
|
+
*/
|
|
30
|
+
export interface RegistryState {
|
|
31
|
+
/** Discovered providers keyed by canonical provider ID. */
|
|
32
|
+
providerMap: Map<string, ProviderInfo>;
|
|
33
|
+
/** Alias resolver shared by legacy and v1 surfaces. */
|
|
34
|
+
aliasResolver: AliasResolver;
|
|
35
|
+
/** Disk cache used for stale reads and snapshot reuse. */
|
|
36
|
+
cache: KoshaCache;
|
|
37
|
+
/** Effective merged registry configuration. */
|
|
38
|
+
config: KoshaConfig;
|
|
39
|
+
/** Timestamp of the last full discovery pass. */
|
|
40
|
+
discoveredAt: number;
|
|
41
|
+
/** Failures captured during the most recent discovery pass. */
|
|
42
|
+
lastDiscoveryErrors: DiscoveryError[];
|
|
43
|
+
/** Circuit-breaker health tracker. */
|
|
44
|
+
healthTracker: HealthTracker;
|
|
45
|
+
/** Rolling provider health observations. */
|
|
46
|
+
providerObservations: Map<string, ProviderObservation>;
|
|
47
|
+
/** Event bus used by watch-mode consumers. */
|
|
48
|
+
discoveryEventBus: EventEmitter;
|
|
49
|
+
/** Monotonic revision for discovery cursor generation. */
|
|
50
|
+
discoveryRevision: number;
|
|
51
|
+
/** Current discovery cursor. */
|
|
52
|
+
currentCursor: string;
|
|
53
|
+
/** Cached snapshot used for diff generation. */
|
|
54
|
+
lastSnapshotCache: DiscoverySnapshotV1 | null;
|
|
55
|
+
/** Recent deltas retained for polling consumers. */
|
|
56
|
+
deltaHistory: DiscoveryDeltaV1[];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Dependency bag used by discovery helpers.
|
|
60
|
+
*/
|
|
61
|
+
export interface DiscoveryDependencies {
|
|
62
|
+
/** Resolve credentials for a provider on demand. */
|
|
63
|
+
resolveCredential: ((providerId: string, explicitKey?: string) => Promise<CredentialResult>) | null;
|
|
64
|
+
/** Load discoverers for the requested provider set. */
|
|
65
|
+
loadDiscoverers: (providerIds?: string[], includeLocal?: boolean) => Promise<ProviderDiscoverer[]>;
|
|
66
|
+
/** Enrich the in-memory provider map after discovery. */
|
|
67
|
+
enrichModels: () => Promise<void>;
|
|
68
|
+
/** Populate reverse aliases on discovered models. */
|
|
69
|
+
populateModelAliases: () => void;
|
|
70
|
+
/** Load fresh provider data from disk cache if available. */
|
|
71
|
+
loadFromCache: (providerIds?: string[]) => Promise<boolean>;
|
|
72
|
+
/** Persist current provider data to disk cache. */
|
|
73
|
+
saveToCache: () => Promise<void>;
|
|
74
|
+
/** Fallback credential resolution when the credential module is unavailable. */
|
|
75
|
+
fallbackCredential: (providerId: string, explicitKey?: string) => CredentialResult;
|
|
76
|
+
/** Build a snapshot from the current in-memory state. */
|
|
77
|
+
snapshotForDelta: () => DiscoverySnapshotV1 | null;
|
|
78
|
+
/** Record a successful mutation into the delta stream. */
|
|
79
|
+
recordDiscoveryMutation: (previousSnapshot: DiscoverySnapshotV1 | null) => void;
|
|
80
|
+
/** Store provider latency/error observations. */
|
|
81
|
+
recordObservation: (providerId: string, entry: {
|
|
82
|
+
latencyMs: number;
|
|
83
|
+
errorType: ProviderObservation["lastErrorType"];
|
|
84
|
+
}) => void;
|
|
85
|
+
/** Normalize an error message into a provider observation class. */
|
|
86
|
+
classifyError: (errorMessage: string) => ProviderObservation["lastErrorType"];
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Create the mutable state bag for a new registry instance.
|
|
90
|
+
*/
|
|
91
|
+
export declare function createRegistryState(config?: KoshaConfig): RegistryState;
|
|
92
|
+
//# sourceMappingURL=registry-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-state.d.ts","sourceRoot":"","sources":["../src/registry-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Internal registry state container.
|
|
3
|
+
*
|
|
4
|
+
* I keep mutable registry state in one plain object so helper modules can own
|
|
5
|
+
* behavior without forcing `ModelRegistry` itself to grow into a god object.
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import { EventEmitter } from "node:events";
|
|
9
|
+
import { AliasResolver } from "./aliases.js";
|
|
10
|
+
import { KoshaCache } from "./cache.js";
|
|
11
|
+
import { HealthTracker } from "./resilience.js";
|
|
12
|
+
/**
|
|
13
|
+
* Create the mutable state bag for a new registry instance.
|
|
14
|
+
*/
|
|
15
|
+
export function createRegistryState(config) {
|
|
16
|
+
const discoveryEventBus = new EventEmitter();
|
|
17
|
+
// I allow unlimited listeners because watch-mode consumers can fan out from one registry instance.
|
|
18
|
+
discoveryEventBus.setMaxListeners(0);
|
|
19
|
+
return {
|
|
20
|
+
providerMap: new Map(),
|
|
21
|
+
aliasResolver: new AliasResolver(config?.aliases),
|
|
22
|
+
cache: new KoshaCache(config?.cacheDir),
|
|
23
|
+
config: config ?? {},
|
|
24
|
+
discoveredAt: 0,
|
|
25
|
+
lastDiscoveryErrors: [],
|
|
26
|
+
healthTracker: new HealthTracker(),
|
|
27
|
+
providerObservations: new Map(),
|
|
28
|
+
discoveryEventBus,
|
|
29
|
+
discoveryRevision: 0,
|
|
30
|
+
currentCursor: "",
|
|
31
|
+
lastSnapshotCache: null,
|
|
32
|
+
deltaHistory: [],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=registry-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-state.js","sourceRoot":"","sources":["../src/registry-state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAoFhD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACvD,MAAM,iBAAiB,GAAG,IAAI,YAAY,EAAE,CAAC;IAC7C,mGAAmG;IACnG,iBAAiB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAErC,OAAO;QACN,WAAW,EAAE,IAAI,GAAG,EAAE;QACtB,aAAa,EAAE,IAAI,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC;QACjD,KAAK,EAAE,IAAI,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC;QACvC,MAAM,EAAE,MAAM,IAAI,EAAE;QACpB,YAAY,EAAE,CAAC;QACf,mBAAmB,EAAE,EAAE;QACvB,aAAa,EAAE,IAAI,aAAa,EAAE;QAClC,oBAAoB,EAAE,IAAI,GAAG,EAAE;QAC/B,iBAAiB;QACjB,iBAAiB,EAAE,CAAC;QACpB,aAAa,EAAE,EAAE;QACjB,iBAAiB,EAAE,IAAI;QACvB,YAAY,EAAE,EAAE;KAChB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Thin registry façade.
|
|
3
|
+
*
|
|
4
|
+
* I keep `ModelRegistry` as the stable public API while the heavy lifting
|
|
5
|
+
* lives in focused helper modules that stay under the file-size policy.
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import type { DiscoveryBindingHintsV1, DiscoveryBindingQuery, DiscoveryCheapestResultV1, DiscoveryDeltaV1, DiscoverySnapshotV1 } from "./discovery-contract.js";
|
|
9
|
+
import type { ProviderHealth } from "./resilience.js";
|
|
10
|
+
import type { CapabilitySummary, CheapestModelOptions, CheapestModelResult, DiscoveryError, DiscoveryOptions, KoshaConfig, LatestDiscoveryOptions, LatestDiscoveryResult, ModelCard, ModelMode, ModelRouteInfo, ProviderCredentialPrompt, ProviderInfo, ProviderRoleInfo, RoleQueryOptions } from "./types.js";
|
|
11
|
+
/**
|
|
12
|
+
* Public registry API for provider discovery and routing-oriented queries.
|
|
13
|
+
*/
|
|
14
|
+
export declare class ModelRegistry {
|
|
15
|
+
private readonly state;
|
|
16
|
+
constructor(config?: KoshaConfig);
|
|
17
|
+
/** Compatibility accessor retained for existing tests and debug hooks. */
|
|
18
|
+
private get providerMap();
|
|
19
|
+
/** Compatibility accessor retained for existing tests and debug hooks. */
|
|
20
|
+
private get aliasResolver();
|
|
21
|
+
/** Compatibility accessor retained for existing tests and debug hooks. */
|
|
22
|
+
private get discoveredAt();
|
|
23
|
+
private set discoveredAt(value);
|
|
24
|
+
/** Compatibility accessor retained for existing tests and debug hooks. */
|
|
25
|
+
private get healthTracker();
|
|
26
|
+
private get currentCursor();
|
|
27
|
+
private set currentCursor(value);
|
|
28
|
+
private get lastSnapshotCache();
|
|
29
|
+
private set lastSnapshotCache(value);
|
|
30
|
+
/**
|
|
31
|
+
* Run discovery across all or selected providers.
|
|
32
|
+
*/
|
|
33
|
+
discover(options?: DiscoveryOptions): Promise<ProviderInfo[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Force a fresh discovery pass, bypassing cache for the targeted scope.
|
|
36
|
+
*/
|
|
37
|
+
refresh(providerId?: string): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Force a live discovery fetch and return a summary payload.
|
|
40
|
+
*
|
|
41
|
+
* This always bypasses cache, so callers can ask for "latest now"
|
|
42
|
+
* without relying on TTL expiry.
|
|
43
|
+
*/
|
|
44
|
+
fetchLatestDetails(options?: LatestDiscoveryOptions): Promise<LatestDiscoveryResult>;
|
|
45
|
+
/** Return all known models with optional provider/origin/mode filters. */
|
|
46
|
+
models(filter?: {
|
|
47
|
+
provider?: string;
|
|
48
|
+
originProvider?: string;
|
|
49
|
+
mode?: ModelMode;
|
|
50
|
+
capability?: string;
|
|
51
|
+
}): ModelCard[];
|
|
52
|
+
/** Return the provider -> model -> roles matrix used by routing clients. */
|
|
53
|
+
providerRoles(filter?: RoleQueryOptions): ProviderRoleInfo[];
|
|
54
|
+
/** Return prompts for discovered providers missing required credentials. */
|
|
55
|
+
missingCredentialPrompts(providerIds?: string[]): ProviderCredentialPrompt[];
|
|
56
|
+
/** Return the cheapest ranked legacy candidates for the requested query. */
|
|
57
|
+
cheapestModels(options?: CheapestModelOptions): CheapestModelResult;
|
|
58
|
+
/** Return every provider route for a normalized model identifier. */
|
|
59
|
+
modelRoutes(modelId: string): ModelCard[];
|
|
60
|
+
/** Return enriched route metadata for a normalized model identifier. */
|
|
61
|
+
modelRouteInfo(modelId: string): ModelRouteInfo[];
|
|
62
|
+
/** Resolve a model by canonical ID or configured alias. */
|
|
63
|
+
model(idOrAlias: string): ModelCard | undefined;
|
|
64
|
+
/** Return a single provider by canonical or alias provider ID. */
|
|
65
|
+
provider(id: string): ProviderInfo | undefined;
|
|
66
|
+
/** Return all currently known providers. */
|
|
67
|
+
providers_list(): ProviderInfo[];
|
|
68
|
+
/** Return errors captured during the most recent discovery pass. */
|
|
69
|
+
discoveryErrors(): DiscoveryError[];
|
|
70
|
+
/** Return raw circuit-breaker health details for monitoring/debugging. */
|
|
71
|
+
providerHealth(): ProviderHealth[];
|
|
72
|
+
/** Build the stable v1 discovery snapshot for daemon consumers. */
|
|
73
|
+
discoverySnapshot(): DiscoverySnapshotV1;
|
|
74
|
+
/** Return delta batches since the provided cursor. */
|
|
75
|
+
discoveryDelta(options?: {
|
|
76
|
+
sinceCursor?: string | null;
|
|
77
|
+
}): DiscoveryDeltaV1;
|
|
78
|
+
/** Stream live discovery deltas through an async iterator. */
|
|
79
|
+
watchDiscovery(options?: {
|
|
80
|
+
sinceCursor?: string | null;
|
|
81
|
+
}): AsyncGenerator<DiscoveryDeltaV1, void, void>;
|
|
82
|
+
/** Return cheapest candidates using the trusted v1 capability taxonomy. */
|
|
83
|
+
cheapestCandidates(query?: DiscoveryBindingQuery): DiscoveryCheapestResultV1;
|
|
84
|
+
/** Return query-scoped binding hints without taking routing authority. */
|
|
85
|
+
executionBindingHints(query?: DiscoveryBindingQuery): DiscoveryBindingHintsV1;
|
|
86
|
+
/** Reset one provider breaker or the full health tracker. */
|
|
87
|
+
resetHealth(providerId?: string): void;
|
|
88
|
+
/** Aggregate capability statistics across the current model set. */
|
|
89
|
+
capabilities(filter?: {
|
|
90
|
+
provider?: string;
|
|
91
|
+
}): CapabilitySummary[];
|
|
92
|
+
/** Normalize a role or capability token used by legacy queries. */
|
|
93
|
+
normalizeRoleToken(value: string): string;
|
|
94
|
+
/** Return the deduplicated role list for a model. */
|
|
95
|
+
modelRoles(model: ModelCard): string[];
|
|
96
|
+
/** Check whether a model satisfies a role or capability query. */
|
|
97
|
+
modelSupportsRole(model: ModelCard, roleOrCapability: string): boolean;
|
|
98
|
+
/** Resolve a configured alias to its canonical model ID. */
|
|
99
|
+
resolve(alias: string): string;
|
|
100
|
+
/** Add a custom alias mapping. */
|
|
101
|
+
alias(short: string, modelId: string): void;
|
|
102
|
+
/** Serialize the registry into a plain JSON-compatible snapshot. */
|
|
103
|
+
toJSON(): {
|
|
104
|
+
providers: ProviderInfo[];
|
|
105
|
+
aliases: Record<string, string>;
|
|
106
|
+
discoveredAt: number;
|
|
107
|
+
};
|
|
108
|
+
/** Restore a registry instance from a serialized JSON payload. */
|
|
109
|
+
static fromJSON(data: {
|
|
110
|
+
providers: ProviderInfo[];
|
|
111
|
+
aliases: Record<string, string>;
|
|
112
|
+
discoveredAt: number;
|
|
113
|
+
}): ModelRegistry;
|
|
114
|
+
/** Load config from global/project files and merge explicit overrides last. */
|
|
115
|
+
static loadConfigFile(overrides?: KoshaConfig): Promise<KoshaConfig>;
|
|
116
|
+
private dependencies;
|
|
117
|
+
/** Compatibility wrapper retained for tests that probe internal mutation APIs. */
|
|
118
|
+
private snapshotForDelta;
|
|
119
|
+
/** Compatibility wrapper retained for tests that probe internal mutation APIs. */
|
|
120
|
+
private recordDiscoveryMutation;
|
|
121
|
+
/** Compatibility wrapper retained for tests that probe internal mutation APIs. */
|
|
122
|
+
private recordObservation;
|
|
123
|
+
/** Compatibility wrapper retained for internal error classification hooks. */
|
|
124
|
+
private classifyError;
|
|
125
|
+
private static readJsonFile;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|