@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,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Versioned discovery contract helpers.
|
|
3
|
+
*
|
|
4
|
+
* I keep the v1 schema, trusted capability taxonomy, and lightweight
|
|
5
|
+
* heuristics here so the registry can stay focused on orchestration.
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
/** Stable schema version exposed to Chitragupta and other daemon consumers. */
|
|
9
|
+
export const DISCOVERY_SCHEMA_VERSION = 1;
|
|
10
|
+
/** Stable role definitions shipped with the v1 schema. */
|
|
11
|
+
export const DISCOVERY_ROLE_DEFINITIONS = [
|
|
12
|
+
{
|
|
13
|
+
roleId: "chat",
|
|
14
|
+
requiredCapabilities: ["chat"],
|
|
15
|
+
preferredCapabilities: ["streaming"],
|
|
16
|
+
suitabilityHint: "General conversational generation.",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
roleId: "tool_use",
|
|
20
|
+
requiredCapabilities: ["chat", "function_calling"],
|
|
21
|
+
preferredCapabilities: ["structured_output"],
|
|
22
|
+
suitabilityHint: "Best for agent loops and tool invocation.",
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
roleId: "embeddings",
|
|
26
|
+
requiredCapabilities: ["embeddings"],
|
|
27
|
+
preferredCapabilities: ["cheap_inference", "low_latency"],
|
|
28
|
+
suitabilityHint: "Vectorization and semantic retrieval.",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
roleId: "vision",
|
|
32
|
+
requiredCapabilities: ["chat", "vision"],
|
|
33
|
+
preferredCapabilities: ["streaming"],
|
|
34
|
+
suitabilityHint: "Multimodal prompts with image understanding.",
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
roleId: "rerank",
|
|
38
|
+
requiredCapabilities: ["rerank"],
|
|
39
|
+
preferredCapabilities: ["low_latency"],
|
|
40
|
+
suitabilityHint: "Document or passage reranking pipelines.",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
roleId: "local_exec",
|
|
44
|
+
requiredCapabilities: ["local_exec"],
|
|
45
|
+
preferredCapabilities: ["low_latency", "cheap_inference"],
|
|
46
|
+
suitabilityHint: "Local-first inference on the current machine.",
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
const CODE_PATTERNS = ["code", "coder", "codellama", "codestral", "starcoder"];
|
|
50
|
+
const REASONING_PATTERNS = ["reason", "deep-research", "deep_research", "o1", "o3", "o4"];
|
|
51
|
+
const LOW_LATENCY_PROVIDER_IDS = new Set(["groq", "cerebras", "ollama", "llama.cpp"]);
|
|
52
|
+
/**
|
|
53
|
+
* Build a stable composite key for a model route.
|
|
54
|
+
*/
|
|
55
|
+
export function makeModelKey(model, descriptor) {
|
|
56
|
+
return `${descriptor.canonicalProviderId}:${model.id}`;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Return the raw capability list that a discoverer originally emitted.
|
|
60
|
+
*/
|
|
61
|
+
export function rawCapabilitiesForModel(model) {
|
|
62
|
+
return [...new Set((model.rawCapabilities ?? model.capabilities).map((capability) => capability.trim()))].sort();
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Normalize free-form model metadata into the trusted capability taxonomy.
|
|
66
|
+
*
|
|
67
|
+
* I keep the heuristics intentionally conservative. When I cannot infer a
|
|
68
|
+
* capability with reasonable confidence, I leave it out of the trusted set.
|
|
69
|
+
*/
|
|
70
|
+
export function trustedCapabilitiesForModel(model, descriptor) {
|
|
71
|
+
const caps = new Set();
|
|
72
|
+
const rawCaps = rawCapabilitiesForModel(model).map((capability) => capability.toLowerCase().replace(/[\s-]+/g, "_"));
|
|
73
|
+
const lowerId = model.id.toLowerCase();
|
|
74
|
+
if (model.mode === "chat" || rawCaps.includes("chat"))
|
|
75
|
+
caps.add("chat");
|
|
76
|
+
if (model.mode === "embedding" || rawCaps.includes("embedding") || rawCaps.includes("embeddings"))
|
|
77
|
+
caps.add("embeddings");
|
|
78
|
+
if (rawCaps.includes("function_calling"))
|
|
79
|
+
caps.add("function_calling");
|
|
80
|
+
if (rawCaps.includes("vision"))
|
|
81
|
+
caps.add("vision");
|
|
82
|
+
if (rawCaps.includes("rerank") || lowerId.includes("rerank"))
|
|
83
|
+
caps.add("rerank");
|
|
84
|
+
if (descriptor.isLocal)
|
|
85
|
+
caps.add("local_exec");
|
|
86
|
+
// Chat-capable providers almost universally expose streaming, so I surface it
|
|
87
|
+
// when the model is chat-oriented or the local runtime explicitly advertises it.
|
|
88
|
+
if (model.localRuntime?.supportsStreaming === true || model.mode === "chat")
|
|
89
|
+
caps.add("streaming");
|
|
90
|
+
if (model.localRuntime?.supportsStructuredOutput === true)
|
|
91
|
+
caps.add("structured_output");
|
|
92
|
+
if ((model.contextWindow ?? 0) >= 100_000)
|
|
93
|
+
caps.add("long_context");
|
|
94
|
+
if (rawCaps.includes("code") || CODE_PATTERNS.some((pattern) => lowerId.includes(pattern)))
|
|
95
|
+
caps.add("code_generation");
|
|
96
|
+
if (rawCaps.includes("nlu") || REASONING_PATTERNS.some((pattern) => lowerId.includes(pattern)))
|
|
97
|
+
caps.add("reasoning");
|
|
98
|
+
if (LOW_LATENCY_PROVIDER_IDS.has(descriptor.canonicalProviderId) || descriptor.isLocal)
|
|
99
|
+
caps.add("low_latency");
|
|
100
|
+
if (descriptor.isLocal || isCheapPricing(model.pricing))
|
|
101
|
+
caps.add("cheap_inference");
|
|
102
|
+
return [...caps].sort();
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Return stable role definitions for the v1 snapshot.
|
|
106
|
+
*/
|
|
107
|
+
export function discoveryRoles() {
|
|
108
|
+
return [...DISCOVERY_ROLE_DEFINITIONS];
|
|
109
|
+
}
|
|
110
|
+
function isCheapPricing(pricing) {
|
|
111
|
+
if (!pricing)
|
|
112
|
+
return false;
|
|
113
|
+
return pricing.inputPerMillion <= 1 && pricing.outputPerMillion <= 4;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=discovery-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-contract.js","sourceRoot":"","sources":["../src/discovery-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Additive v1 discovery HTTP routes.
|
|
3
|
+
*
|
|
4
|
+
* I keep the daemon-oriented routes separate from the legacy REST surface so
|
|
5
|
+
* the old API can stay stable while Chitragupta moves to the new contract.
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import type { Hono } from "hono";
|
|
9
|
+
import type { ModelRegistry } from "./registry.js";
|
|
10
|
+
/**
|
|
11
|
+
* Register additive discovery-plane routes on the existing Hono app.
|
|
12
|
+
*/
|
|
13
|
+
export declare function registerDiscoveryRoutes(app: Hono, registry: ModelRegistry): void;
|
|
14
|
+
//# sourceMappingURL=discovery-routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-routes.d.ts","sourceRoot":"","sources":["../src/discovery-routes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CA6BhF"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Additive v1 discovery HTTP routes.
|
|
3
|
+
*
|
|
4
|
+
* I keep the daemon-oriented routes separate from the legacy REST surface so
|
|
5
|
+
* the old API can stay stable while Chitragupta moves to the new contract.
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Register additive discovery-plane routes on the existing Hono app.
|
|
10
|
+
*/
|
|
11
|
+
export function registerDiscoveryRoutes(app, registry) {
|
|
12
|
+
app.get("/api/discovery", (ctx) => {
|
|
13
|
+
return ctx.json(registry.discoverySnapshot());
|
|
14
|
+
});
|
|
15
|
+
app.get("/api/discovery/delta", (ctx) => {
|
|
16
|
+
const sinceCursor = ctx.req.query("sinceCursor") ?? ctx.req.query("changedSince") ?? null;
|
|
17
|
+
return ctx.json(registry.discoveryDelta({ sinceCursor }));
|
|
18
|
+
});
|
|
19
|
+
app.get("/api/discovery/cheapest", (ctx) => {
|
|
20
|
+
return ctx.json(readBindingQuery(registry, ctx.req.query.bind(ctx.req)));
|
|
21
|
+
});
|
|
22
|
+
app.get("/api/discovery/binding", (ctx) => {
|
|
23
|
+
return ctx.json(registry.executionBindingHints(readBindingQueryInput(ctx.req.query.bind(ctx.req))));
|
|
24
|
+
});
|
|
25
|
+
app.get("/api/discovery/watch", (ctx) => {
|
|
26
|
+
const sinceCursor = ctx.req.query("sinceCursor") ?? ctx.req.query("changedSince") ?? null;
|
|
27
|
+
const stream = streamDiscoveryEvents(registry, sinceCursor, ctx.req.raw.signal);
|
|
28
|
+
return new Response(stream, {
|
|
29
|
+
headers: {
|
|
30
|
+
"content-type": "text/event-stream",
|
|
31
|
+
"cache-control": "no-cache, no-transform",
|
|
32
|
+
connection: "keep-alive",
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function readBindingQuery(registry, query) {
|
|
38
|
+
return registry.cheapestCandidates(readBindingQueryInput(query));
|
|
39
|
+
}
|
|
40
|
+
function readBindingQueryInput(query) {
|
|
41
|
+
return {
|
|
42
|
+
role: query("role") ?? undefined,
|
|
43
|
+
capability: query("capability") ?? undefined,
|
|
44
|
+
provider: query("provider") ?? undefined,
|
|
45
|
+
originProvider: query("originProvider") ?? undefined,
|
|
46
|
+
mode: query("mode") ?? undefined,
|
|
47
|
+
limit: parseNumber(query("limit")),
|
|
48
|
+
priceMetric: query("priceMetric") ?? undefined,
|
|
49
|
+
preferLocalProviders: parseBoolean(query("preferLocalProviders")),
|
|
50
|
+
allowCrossProvider: parseBoolean(query("allowCrossProvider")),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function parseBoolean(value) {
|
|
54
|
+
if (value === undefined)
|
|
55
|
+
return undefined;
|
|
56
|
+
if (value === "true")
|
|
57
|
+
return true;
|
|
58
|
+
if (value === "false")
|
|
59
|
+
return false;
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
function parseNumber(value) {
|
|
63
|
+
if (!value)
|
|
64
|
+
return undefined;
|
|
65
|
+
const parsed = Number(value);
|
|
66
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
67
|
+
}
|
|
68
|
+
function streamDiscoveryEvents(registry, sinceCursor, signal) {
|
|
69
|
+
const encoder = new TextEncoder();
|
|
70
|
+
const iterator = registry.watchDiscovery({ sinceCursor });
|
|
71
|
+
return new ReadableStream({
|
|
72
|
+
async start(controller) {
|
|
73
|
+
const abort = async () => {
|
|
74
|
+
await iterator.return?.();
|
|
75
|
+
controller.close();
|
|
76
|
+
};
|
|
77
|
+
signal.addEventListener("abort", abort, { once: true });
|
|
78
|
+
try {
|
|
79
|
+
for await (const delta of iterator) {
|
|
80
|
+
const payload = `event: delta\ndata: ${JSON.stringify(delta)}\n\n`;
|
|
81
|
+
controller.enqueue(encoder.encode(payload));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
const payload = `event: error\ndata: ${JSON.stringify({ message: error instanceof Error ? error.message : String(error) })}\n\n`;
|
|
86
|
+
controller.enqueue(encoder.encode(payload));
|
|
87
|
+
controller.close();
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
signal.removeEventListener("abort", abort);
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
async cancel() {
|
|
94
|
+
await iterator.return?.();
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=discovery-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery-routes.js","sourceRoot":"","sources":["../src/discovery-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/enrichment/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/enrichment/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — LiteLLM community data enrichment.
|
|
3
|
+
*
|
|
4
|
+
* Fetches the community-maintained litellm model catalogue from GitHub
|
|
5
|
+
* and uses it to fill in pricing, context window sizes, and capability
|
|
6
|
+
* flags on already-discovered {@link ModelCard} objects.
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import type { Enricher, ModelCard } from "../types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Enriches ModelCard data with pricing, context-window sizes, and capability
|
|
12
|
+
* flags sourced from the litellm community-maintained model catalogue.
|
|
13
|
+
*
|
|
14
|
+
* @see https://github.com/BerriAI/litellm
|
|
15
|
+
*/
|
|
16
|
+
export declare class LiteLLMEnricher implements Enricher {
|
|
17
|
+
private data;
|
|
18
|
+
private readonly url;
|
|
19
|
+
/** Fetch and cache the litellm pricing JSON. Safe to call multiple times. */
|
|
20
|
+
load(): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Enrich an array of ModelCards with litellm data.
|
|
23
|
+
*
|
|
24
|
+
* - Only fills in **missing** fields — never overwrites API-sourced data.
|
|
25
|
+
* - Returns new ModelCard objects (immutable pattern).
|
|
26
|
+
* - Models not found in litellm are returned unchanged.
|
|
27
|
+
*/
|
|
28
|
+
enrich(models: ModelCard[]): Promise<ModelCard[]>;
|
|
29
|
+
private enrichOne;
|
|
30
|
+
/**
|
|
31
|
+
* Look up a model in the litellm pricing catalogue using a tiered set of
|
|
32
|
+
* key strategies. Later strategies use `originProvider` to handle models
|
|
33
|
+
* whose IDs are namespaced differently by the serving layer (e.g. a Bedrock
|
|
34
|
+
* model whose `id` is `"anthropic.claude-opus-4-6-…"` but whose
|
|
35
|
+
* `originProvider` is `"anthropic"`).
|
|
36
|
+
*
|
|
37
|
+
* Lookup order:
|
|
38
|
+
* 1. Exact `id` match
|
|
39
|
+
* 2. `{provider}/{id}` format
|
|
40
|
+
* 3. `{originProvider}/{id}` (when originProvider differs from provider)
|
|
41
|
+
* 4. `{originProvider}/{normalizedId}` — strips prefix/date suffixes
|
|
42
|
+
* 5. Lowercase exact `id` match
|
|
43
|
+
* 6. Lowercase `{provider}/{id}`
|
|
44
|
+
* 7. Lowercase `{originProvider}/{normalizedId}`
|
|
45
|
+
*/
|
|
46
|
+
private lookupModel;
|
|
47
|
+
/** Convert litellm per-token costs to per-million pricing. */
|
|
48
|
+
private extractPricing;
|
|
49
|
+
/** Map litellm mode strings to our ModelMode type. */
|
|
50
|
+
private mapMode;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=litellm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"litellm.d.ts","sourceRoot":"","sources":["../../src/enrichment/litellm.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAA2B,MAAM,aAAa,CAAC;AA4BhF;;;;;GAKG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC/C,OAAO,CAAC,IAAI,CAAkD;IAC9D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAC2E;IAE/F,6EAA6E;IACvE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B;;;;;;OAMG;IACG,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IASvD,OAAO,CAAC,SAAS;IAiEjB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,WAAW;IA6CnB,8DAA8D;IAC9D,OAAO,CAAC,cAAc;IAoBtB,sDAAsD;IACtD,OAAO,CAAC,OAAO;CAkBf"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — LiteLLM community data enrichment.
|
|
3
|
+
*
|
|
4
|
+
* Fetches the community-maintained litellm model catalogue from GitHub
|
|
5
|
+
* and uses it to fill in pricing, context window sizes, and capability
|
|
6
|
+
* flags on already-discovered {@link ModelCard} objects.
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { normalizeModelId } from "../normalize.js";
|
|
10
|
+
import { assertCleanPayload } from "../security.js";
|
|
11
|
+
/**
|
|
12
|
+
* Multiplier to convert litellm's per-token costs into our standard
|
|
13
|
+
* per-million-token pricing. litellm stores costs as cost-per-single-token,
|
|
14
|
+
* so we multiply by 1 000 000 to get the per-million figure.
|
|
15
|
+
*/
|
|
16
|
+
const PER_MILLION = 1_000_000;
|
|
17
|
+
/**
|
|
18
|
+
* Enriches ModelCard data with pricing, context-window sizes, and capability
|
|
19
|
+
* flags sourced from the litellm community-maintained model catalogue.
|
|
20
|
+
*
|
|
21
|
+
* @see https://github.com/BerriAI/litellm
|
|
22
|
+
*/
|
|
23
|
+
export class LiteLLMEnricher {
|
|
24
|
+
data = null;
|
|
25
|
+
url = "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json";
|
|
26
|
+
/** Fetch and cache the litellm pricing JSON. Safe to call multiple times. */
|
|
27
|
+
async load() {
|
|
28
|
+
if (this.data)
|
|
29
|
+
return;
|
|
30
|
+
const response = await fetch(this.url);
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
throw new Error(`Failed to fetch litellm data: ${response.status} ${response.statusText}`);
|
|
33
|
+
}
|
|
34
|
+
const raw = (await response.json());
|
|
35
|
+
assertCleanPayload(raw, "litellm");
|
|
36
|
+
this.data = raw;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Enrich an array of ModelCards with litellm data.
|
|
40
|
+
*
|
|
41
|
+
* - Only fills in **missing** fields — never overwrites API-sourced data.
|
|
42
|
+
* - Returns new ModelCard objects (immutable pattern).
|
|
43
|
+
* - Models not found in litellm are returned unchanged.
|
|
44
|
+
*/
|
|
45
|
+
async enrich(models) {
|
|
46
|
+
await this.load();
|
|
47
|
+
return models.map((model) => this.enrichOne(model));
|
|
48
|
+
}
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Private
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
enrichOne(model) {
|
|
53
|
+
const entry = this.lookupModel(model);
|
|
54
|
+
if (!entry)
|
|
55
|
+
return { ...model };
|
|
56
|
+
const enriched = { ...model };
|
|
57
|
+
// Pricing — only when the model has no pricing yet
|
|
58
|
+
if (!enriched.pricing) {
|
|
59
|
+
const pricing = this.extractPricing(entry);
|
|
60
|
+
if (pricing) {
|
|
61
|
+
enriched.pricing = pricing;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Context window — only when unset (0)
|
|
65
|
+
if (enriched.contextWindow === 0 && entry.max_input_tokens) {
|
|
66
|
+
enriched.contextWindow = entry.max_input_tokens;
|
|
67
|
+
}
|
|
68
|
+
// Max output tokens — only when unset (0)
|
|
69
|
+
if (enriched.maxOutputTokens === 0) {
|
|
70
|
+
if (entry.max_output_tokens) {
|
|
71
|
+
enriched.maxOutputTokens = entry.max_output_tokens;
|
|
72
|
+
}
|
|
73
|
+
else if (entry.max_tokens) {
|
|
74
|
+
enriched.maxOutputTokens = entry.max_tokens;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Max input tokens — only when missing
|
|
78
|
+
if (enriched.maxInputTokens === undefined && entry.max_input_tokens) {
|
|
79
|
+
enriched.maxInputTokens = entry.max_input_tokens;
|
|
80
|
+
}
|
|
81
|
+
// Embedding dimensions — only when missing
|
|
82
|
+
if (enriched.dimensions === undefined && entry.output_vector_size) {
|
|
83
|
+
enriched.dimensions = entry.output_vector_size;
|
|
84
|
+
}
|
|
85
|
+
// Mode — only when we have litellm mode info and the current mode might be wrong
|
|
86
|
+
if (entry.mode) {
|
|
87
|
+
const litellmMode = this.mapMode(entry.mode);
|
|
88
|
+
if (litellmMode && enriched.mode !== litellmMode) {
|
|
89
|
+
// Only override if the model currently has a generic "chat" mode
|
|
90
|
+
// and litellm has more specific info (e.g. "embedding")
|
|
91
|
+
if (enriched.mode === "chat" && litellmMode !== "chat") {
|
|
92
|
+
enriched.mode = litellmMode;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Capabilities — add missing ones from litellm flags
|
|
97
|
+
enriched.capabilities = [...enriched.capabilities];
|
|
98
|
+
if (entry.supports_vision && !enriched.capabilities.includes("vision")) {
|
|
99
|
+
enriched.capabilities.push("vision");
|
|
100
|
+
}
|
|
101
|
+
if (entry.supports_function_calling && !enriched.capabilities.includes("function_calling")) {
|
|
102
|
+
enriched.capabilities.push("function_calling");
|
|
103
|
+
}
|
|
104
|
+
if (entry.supports_prompt_caching && !enriched.capabilities.includes("prompt_caching")) {
|
|
105
|
+
enriched.capabilities.push("prompt_caching");
|
|
106
|
+
}
|
|
107
|
+
return enriched;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Look up a model in the litellm pricing catalogue using a tiered set of
|
|
111
|
+
* key strategies. Later strategies use `originProvider` to handle models
|
|
112
|
+
* whose IDs are namespaced differently by the serving layer (e.g. a Bedrock
|
|
113
|
+
* model whose `id` is `"anthropic.claude-opus-4-6-…"` but whose
|
|
114
|
+
* `originProvider` is `"anthropic"`).
|
|
115
|
+
*
|
|
116
|
+
* Lookup order:
|
|
117
|
+
* 1. Exact `id` match
|
|
118
|
+
* 2. `{provider}/{id}` format
|
|
119
|
+
* 3. `{originProvider}/{id}` (when originProvider differs from provider)
|
|
120
|
+
* 4. `{originProvider}/{normalizedId}` — strips prefix/date suffixes
|
|
121
|
+
* 5. Lowercase exact `id` match
|
|
122
|
+
* 6. Lowercase `{provider}/{id}`
|
|
123
|
+
* 7. Lowercase `{originProvider}/{normalizedId}`
|
|
124
|
+
*/
|
|
125
|
+
lookupModel(model) {
|
|
126
|
+
if (!this.data)
|
|
127
|
+
return undefined;
|
|
128
|
+
const { id, provider, originProvider } = model;
|
|
129
|
+
// 1. Exact match
|
|
130
|
+
if (this.data[id])
|
|
131
|
+
return this.data[id];
|
|
132
|
+
// 2. provider/id format
|
|
133
|
+
const prefixed = `${provider}/${id}`;
|
|
134
|
+
if (this.data[prefixed])
|
|
135
|
+
return this.data[prefixed];
|
|
136
|
+
// 3. originProvider/id — useful when the serving layer prefixes IDs
|
|
137
|
+
// differently (e.g. bedrock → anthropic).
|
|
138
|
+
if (originProvider && originProvider !== provider) {
|
|
139
|
+
const originPrefixed = `${originProvider}/${id}`;
|
|
140
|
+
if (this.data[originPrefixed])
|
|
141
|
+
return this.data[originPrefixed];
|
|
142
|
+
}
|
|
143
|
+
// 4. originProvider/normalizedId — strips date suffixes and provider
|
|
144
|
+
// namespace segments so "anthropic.claude-opus-4-6-20250514-v1:0"
|
|
145
|
+
// resolves to "anthropic/claude-opus-4-6".
|
|
146
|
+
const normalizedId = normalizeModelId(id);
|
|
147
|
+
if (originProvider) {
|
|
148
|
+
const originNormPrefixed = `${originProvider}/${normalizedId}`;
|
|
149
|
+
if (this.data[originNormPrefixed])
|
|
150
|
+
return this.data[originNormPrefixed];
|
|
151
|
+
}
|
|
152
|
+
// 5. Lowercase exact match
|
|
153
|
+
const lower = id.toLowerCase();
|
|
154
|
+
if (this.data[lower])
|
|
155
|
+
return this.data[lower];
|
|
156
|
+
// 6. Lowercase provider/id
|
|
157
|
+
const lowerPrefixed = `${provider}/${lower}`;
|
|
158
|
+
if (this.data[lowerPrefixed])
|
|
159
|
+
return this.data[lowerPrefixed];
|
|
160
|
+
// 7. Lowercase originProvider/normalizedId
|
|
161
|
+
if (originProvider) {
|
|
162
|
+
const lowerOriginNorm = `${originProvider}/${normalizedId.toLowerCase()}`;
|
|
163
|
+
if (this.data[lowerOriginNorm])
|
|
164
|
+
return this.data[lowerOriginNorm];
|
|
165
|
+
}
|
|
166
|
+
return undefined;
|
|
167
|
+
}
|
|
168
|
+
/** Convert litellm per-token costs to per-million pricing. */
|
|
169
|
+
extractPricing(entry) {
|
|
170
|
+
if (entry.input_cost_per_token === undefined && entry.output_cost_per_token === undefined) {
|
|
171
|
+
return undefined;
|
|
172
|
+
}
|
|
173
|
+
const pricing = {
|
|
174
|
+
inputPerMillion: (entry.input_cost_per_token ?? 0) * PER_MILLION,
|
|
175
|
+
outputPerMillion: (entry.output_cost_per_token ?? 0) * PER_MILLION,
|
|
176
|
+
};
|
|
177
|
+
if (entry.cache_read_input_token_cost !== undefined) {
|
|
178
|
+
pricing.cacheReadPerMillion = entry.cache_read_input_token_cost * PER_MILLION;
|
|
179
|
+
}
|
|
180
|
+
if (entry.cache_creation_input_token_cost !== undefined) {
|
|
181
|
+
pricing.cacheWritePerMillion = entry.cache_creation_input_token_cost * PER_MILLION;
|
|
182
|
+
}
|
|
183
|
+
return pricing;
|
|
184
|
+
}
|
|
185
|
+
/** Map litellm mode strings to our ModelMode type. */
|
|
186
|
+
mapMode(mode) {
|
|
187
|
+
switch (mode) {
|
|
188
|
+
case "chat":
|
|
189
|
+
case "completion":
|
|
190
|
+
return "chat";
|
|
191
|
+
case "embedding":
|
|
192
|
+
return "embedding";
|
|
193
|
+
case "image_generation":
|
|
194
|
+
return "image";
|
|
195
|
+
case "audio_transcription":
|
|
196
|
+
case "audio_speech":
|
|
197
|
+
return "audio";
|
|
198
|
+
case "moderation":
|
|
199
|
+
return "moderation";
|
|
200
|
+
default:
|
|
201
|
+
return undefined;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=litellm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"litellm.js","sourceRoot":"","sources":["../../src/enrichment/litellm.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Public API barrel export.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports every public class, type, and factory function so that
|
|
5
|
+
* consumers can import from a single `"kosha-discovery"` entry point.
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
export { ModelRegistry } from "./registry.js";
|
|
9
|
+
export { AliasResolver, DEFAULT_ALIASES } from "./aliases.js";
|
|
10
|
+
export { KoshaCache } from "./cache.js";
|
|
11
|
+
export { DISCOVERY_SCHEMA_VERSION, discoveryRoles, makeModelKey, rawCapabilitiesForModel, trustedCapabilitiesForModel, } from "./discovery-contract.js";
|
|
12
|
+
export type { DiscoveryBindingHintsV1, DiscoveryBindingQuery, DiscoveryChangeV1, DiscoveryCheapestCandidateV1, DiscoveryCheapestResultV1, DiscoveryCredentialPrompt, DiscoveryDeltaV1, DiscoveryHealthRecord, DiscoveryModelV1, DiscoveryProviderV1, DiscoveryRoleDefinition, DiscoverySnapshotV1, TrustedCapability, } from "./discovery-contract.js";
|
|
13
|
+
export { extractModelVersion, extractOriginProvider, normalizeModelId } from "./normalize.js";
|
|
14
|
+
export { getProviderDescriptor, isLocalProvider, listProviderDescriptors, normalizeProviderId, PROVIDER_CATALOG, } from "./provider-catalog.js";
|
|
15
|
+
export type { ProviderDescriptor } from "./provider-catalog.js";
|
|
16
|
+
export type { ComputeTarget, LocalRuntimeMetadata, ModelCard, ProviderInfo, ProviderRoleInfo, DiscoveryError, DiscoveryOptions, KoshaConfig, LatestDiscoveryOptions, LatestDiscoveryResult, ModelMode, ModelPricing, ModelRoleCard, RoleQueryOptions, CheapestModelOptions, CheapestModelMatch, CheapestModelResult, ProviderCredentialPrompt, PricingMetric, ModelRouteInfo, CapabilitySummary, CredentialResult, ProviderDiscoverer, Enricher, ProviderOrigin, ProviderTransport, } from "./types.js";
|
|
17
|
+
/**
|
|
18
|
+
* Convenience factory: creates a ModelRegistry and runs discovery in one call.
|
|
19
|
+
*
|
|
20
|
+
* Automatically loads config from `~/.kosharc.json` and `kosha.config.json`
|
|
21
|
+
* (if they exist) before applying any explicit overrides.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* const kosha = await createKosha();
|
|
26
|
+
* const models = kosha.models({ mode: "chat" });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare function createKosha(config?: import("./types.js").KoshaConfig): Promise<import("./registry.js").ModelRegistry>;
|
|
30
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EACN,wBAAwB,EACxB,cAAc,EACd,YAAY,EACZ,uBAAuB,EACvB,2BAA2B,GAC3B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACX,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,EACjB,4BAA4B,EAC5B,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,GACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EACN,qBAAqB,EACrB,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,GAChB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,YAAY,EACX,aAAa,EACb,oBAAoB,EACpB,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,sBAAsB,EACtB,qBAAqB,EACrB,SAAS,EACT,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,iBAAiB,GACjB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,YAAY,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,eAAe,EAAE,aAAa,CAAC,CAM3H"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Public API barrel export.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports every public class, type, and factory function so that
|
|
5
|
+
* consumers can import from a single `"kosha-discovery"` entry point.
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
export { ModelRegistry } from "./registry.js";
|
|
9
|
+
export { AliasResolver, DEFAULT_ALIASES } from "./aliases.js";
|
|
10
|
+
export { KoshaCache } from "./cache.js";
|
|
11
|
+
export { DISCOVERY_SCHEMA_VERSION, discoveryRoles, makeModelKey, rawCapabilitiesForModel, trustedCapabilitiesForModel, } from "./discovery-contract.js";
|
|
12
|
+
export { extractModelVersion, extractOriginProvider, normalizeModelId } from "./normalize.js";
|
|
13
|
+
export { getProviderDescriptor, isLocalProvider, listProviderDescriptors, normalizeProviderId, PROVIDER_CATALOG, } from "./provider-catalog.js";
|
|
14
|
+
/**
|
|
15
|
+
* Convenience factory: creates a ModelRegistry and runs discovery in one call.
|
|
16
|
+
*
|
|
17
|
+
* Automatically loads config from `~/.kosharc.json` and `kosha.config.json`
|
|
18
|
+
* (if they exist) before applying any explicit overrides.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* const kosha = await createKosha();
|
|
23
|
+
* const models = kosha.models({ mode: "chat" });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export async function createKosha(config) {
|
|
27
|
+
const { ModelRegistry: Registry } = await import("./registry.js");
|
|
28
|
+
const merged = await Registry.loadConfigFile(config);
|
|
29
|
+
const registry = new Registry(merged);
|
|
30
|
+
await registry.discover();
|
|
31
|
+
return registry;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EACN,wBAAwB,EACxB,cAAc,EACd,YAAY,EACZ,uBAAuB,EACvB,2BAA2B,GAC3B,MAAM,yBAAyB,CAAC;AAgBjC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EACN,qBAAqB,EACrB,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,GAChB,MAAM,uBAAuB,CAAC;AA+B/B;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAyC;IAC1E,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC1B,OAAO,QAAQ,CAAC;AACjB,CAAC"}
|