@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.
Files changed (208) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +286 -0
  3. package/dist/aliases.d.ts +51 -0
  4. package/dist/aliases.d.ts.map +1 -0
  5. package/dist/aliases.js +115 -0
  6. package/dist/aliases.js.map +1 -0
  7. package/dist/cache.d.ts +57 -0
  8. package/dist/cache.d.ts.map +1 -0
  9. package/dist/cache.js +123 -0
  10. package/dist/cache.js.map +1 -0
  11. package/dist/cli-commands.d.ts +142 -0
  12. package/dist/cli-commands.d.ts.map +1 -0
  13. package/dist/cli-commands.js +746 -0
  14. package/dist/cli-commands.js.map +1 -0
  15. package/dist/cli-format.d.ts +119 -0
  16. package/dist/cli-format.d.ts.map +1 -0
  17. package/dist/cli-format.js +171 -0
  18. package/dist/cli-format.js.map +1 -0
  19. package/dist/cli.d.ts +15 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +143 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/credentials/index.d.ts +2 -0
  24. package/dist/credentials/index.d.ts.map +1 -0
  25. package/dist/credentials/index.js +2 -0
  26. package/dist/credentials/index.js.map +1 -0
  27. package/dist/credentials/resolver.d.ts +170 -0
  28. package/dist/credentials/resolver.d.ts.map +1 -0
  29. package/dist/credentials/resolver.js +597 -0
  30. package/dist/credentials/resolver.js.map +1 -0
  31. package/dist/discovery/anthropic.d.ts +49 -0
  32. package/dist/discovery/anthropic.d.ts.map +1 -0
  33. package/dist/discovery/anthropic.js +101 -0
  34. package/dist/discovery/anthropic.js.map +1 -0
  35. package/dist/discovery/base.d.ts +59 -0
  36. package/dist/discovery/base.d.ts.map +1 -0
  37. package/dist/discovery/base.js +123 -0
  38. package/dist/discovery/base.js.map +1 -0
  39. package/dist/discovery/bedrock.d.ts +122 -0
  40. package/dist/discovery/bedrock.d.ts.map +1 -0
  41. package/dist/discovery/bedrock.js +356 -0
  42. package/dist/discovery/bedrock.js.map +1 -0
  43. package/dist/discovery/cerebras.d.ts +43 -0
  44. package/dist/discovery/cerebras.d.ts.map +1 -0
  45. package/dist/discovery/cerebras.js +65 -0
  46. package/dist/discovery/cerebras.js.map +1 -0
  47. package/dist/discovery/cohere.d.ts +57 -0
  48. package/dist/discovery/cohere.d.ts.map +1 -0
  49. package/dist/discovery/cohere.js +82 -0
  50. package/dist/discovery/cohere.js.map +1 -0
  51. package/dist/discovery/deepinfra.d.ts +41 -0
  52. package/dist/discovery/deepinfra.d.ts.map +1 -0
  53. package/dist/discovery/deepinfra.js +86 -0
  54. package/dist/discovery/deepinfra.js.map +1 -0
  55. package/dist/discovery/deepseek.d.ts +17 -0
  56. package/dist/discovery/deepseek.d.ts.map +1 -0
  57. package/dist/discovery/deepseek.js +45 -0
  58. package/dist/discovery/deepseek.js.map +1 -0
  59. package/dist/discovery/fireworks.d.ts +48 -0
  60. package/dist/discovery/fireworks.d.ts.map +1 -0
  61. package/dist/discovery/fireworks.js +101 -0
  62. package/dist/discovery/fireworks.js.map +1 -0
  63. package/dist/discovery/glm.d.ts +17 -0
  64. package/dist/discovery/glm.d.ts.map +1 -0
  65. package/dist/discovery/glm.js +52 -0
  66. package/dist/discovery/glm.js.map +1 -0
  67. package/dist/discovery/google.d.ts +53 -0
  68. package/dist/discovery/google.d.ts.map +1 -0
  69. package/dist/discovery/google.js +122 -0
  70. package/dist/discovery/google.js.map +1 -0
  71. package/dist/discovery/groq.d.ts +44 -0
  72. package/dist/discovery/groq.d.ts.map +1 -0
  73. package/dist/discovery/groq.js +89 -0
  74. package/dist/discovery/groq.js.map +1 -0
  75. package/dist/discovery/index.d.ts +48 -0
  76. package/dist/discovery/index.d.ts.map +1 -0
  77. package/dist/discovery/index.js +116 -0
  78. package/dist/discovery/index.js.map +1 -0
  79. package/dist/discovery/llama-cpp.d.ts +45 -0
  80. package/dist/discovery/llama-cpp.d.ts.map +1 -0
  81. package/dist/discovery/llama-cpp.js +137 -0
  82. package/dist/discovery/llama-cpp.js.map +1 -0
  83. package/dist/discovery/minimax.d.ts +16 -0
  84. package/dist/discovery/minimax.d.ts.map +1 -0
  85. package/dist/discovery/minimax.js +56 -0
  86. package/dist/discovery/minimax.js.map +1 -0
  87. package/dist/discovery/mistral.d.ts +45 -0
  88. package/dist/discovery/mistral.d.ts.map +1 -0
  89. package/dist/discovery/mistral.js +82 -0
  90. package/dist/discovery/mistral.js.map +1 -0
  91. package/dist/discovery/moonshot.d.ts +16 -0
  92. package/dist/discovery/moonshot.d.ts.map +1 -0
  93. package/dist/discovery/moonshot.js +46 -0
  94. package/dist/discovery/moonshot.js.map +1 -0
  95. package/dist/discovery/nvidia.d.ts +60 -0
  96. package/dist/discovery/nvidia.d.ts.map +1 -0
  97. package/dist/discovery/nvidia.js +145 -0
  98. package/dist/discovery/nvidia.js.map +1 -0
  99. package/dist/discovery/ollama.d.ts +57 -0
  100. package/dist/discovery/ollama.d.ts.map +1 -0
  101. package/dist/discovery/ollama.js +151 -0
  102. package/dist/discovery/ollama.js.map +1 -0
  103. package/dist/discovery/openai-compatible.d.ts +126 -0
  104. package/dist/discovery/openai-compatible.d.ts.map +1 -0
  105. package/dist/discovery/openai-compatible.js +161 -0
  106. package/dist/discovery/openai-compatible.js.map +1 -0
  107. package/dist/discovery/openai.d.ts +62 -0
  108. package/dist/discovery/openai.d.ts.map +1 -0
  109. package/dist/discovery/openai.js +157 -0
  110. package/dist/discovery/openai.js.map +1 -0
  111. package/dist/discovery/openrouter.d.ts +78 -0
  112. package/dist/discovery/openrouter.d.ts.map +1 -0
  113. package/dist/discovery/openrouter.js +184 -0
  114. package/dist/discovery/openrouter.js.map +1 -0
  115. package/dist/discovery/perplexity.d.ts +66 -0
  116. package/dist/discovery/perplexity.d.ts.map +1 -0
  117. package/dist/discovery/perplexity.js +86 -0
  118. package/dist/discovery/perplexity.js.map +1 -0
  119. package/dist/discovery/together.d.ts +41 -0
  120. package/dist/discovery/together.d.ts.map +1 -0
  121. package/dist/discovery/together.js +88 -0
  122. package/dist/discovery/together.js.map +1 -0
  123. package/dist/discovery/vertex.d.ts +146 -0
  124. package/dist/discovery/vertex.d.ts.map +1 -0
  125. package/dist/discovery/vertex.js +371 -0
  126. package/dist/discovery/vertex.js.map +1 -0
  127. package/dist/discovery/zai.d.ts +17 -0
  128. package/dist/discovery/zai.d.ts.map +1 -0
  129. package/dist/discovery/zai.js +51 -0
  130. package/dist/discovery/zai.js.map +1 -0
  131. package/dist/discovery-contract.d.ts +186 -0
  132. package/dist/discovery-contract.d.ts.map +1 -0
  133. package/dist/discovery-contract.js +115 -0
  134. package/dist/discovery-contract.js.map +1 -0
  135. package/dist/discovery-routes.d.ts +14 -0
  136. package/dist/discovery-routes.d.ts.map +1 -0
  137. package/dist/discovery-routes.js +98 -0
  138. package/dist/discovery-routes.js.map +1 -0
  139. package/dist/enrichment/index.d.ts +2 -0
  140. package/dist/enrichment/index.d.ts.map +1 -0
  141. package/dist/enrichment/index.js +2 -0
  142. package/dist/enrichment/index.js.map +1 -0
  143. package/dist/enrichment/litellm.d.ts +52 -0
  144. package/dist/enrichment/litellm.d.ts.map +1 -0
  145. package/dist/enrichment/litellm.js +205 -0
  146. package/dist/enrichment/litellm.js.map +1 -0
  147. package/dist/index.d.ts +30 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +33 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/normalize.d.ts +64 -0
  152. package/dist/normalize.d.ts.map +1 -0
  153. package/dist/normalize.js +166 -0
  154. package/dist/normalize.js.map +1 -0
  155. package/dist/provider-catalog.d.ts +62 -0
  156. package/dist/provider-catalog.d.ts.map +1 -0
  157. package/dist/provider-catalog.js +331 -0
  158. package/dist/provider-catalog.js.map +1 -0
  159. package/dist/registry-delta.d.ts +17 -0
  160. package/dist/registry-delta.d.ts.map +1 -0
  161. package/dist/registry-delta.js +74 -0
  162. package/dist/registry-delta.js.map +1 -0
  163. package/dist/registry-discovery.d.ts +66 -0
  164. package/dist/registry-discovery.d.ts.map +1 -0
  165. package/dist/registry-discovery.js +339 -0
  166. package/dist/registry-discovery.js.map +1 -0
  167. package/dist/registry-query.d.ts +74 -0
  168. package/dist/registry-query.d.ts.map +1 -0
  169. package/dist/registry-query.js +310 -0
  170. package/dist/registry-query.js.map +1 -0
  171. package/dist/registry-runtime.d.ts +48 -0
  172. package/dist/registry-runtime.d.ts.map +1 -0
  173. package/dist/registry-runtime.js +255 -0
  174. package/dist/registry-runtime.js.map +1 -0
  175. package/dist/registry-selection.d.ts +31 -0
  176. package/dist/registry-selection.d.ts.map +1 -0
  177. package/dist/registry-selection.js +167 -0
  178. package/dist/registry-selection.js.map +1 -0
  179. package/dist/registry-state.d.ts +92 -0
  180. package/dist/registry-state.d.ts.map +1 -0
  181. package/dist/registry-state.js +35 -0
  182. package/dist/registry-state.js.map +1 -0
  183. package/dist/registry.d.ts +127 -0
  184. package/dist/registry.d.ts.map +1 -0
  185. package/dist/registry.js +248 -0
  186. package/dist/registry.js.map +1 -0
  187. package/dist/resilience.d.ts +212 -0
  188. package/dist/resilience.d.ts.map +1 -0
  189. package/dist/resilience.js +292 -0
  190. package/dist/resilience.js.map +1 -0
  191. package/dist/security.d.ts +44 -0
  192. package/dist/security.d.ts.map +1 -0
  193. package/dist/security.js +184 -0
  194. package/dist/security.js.map +1 -0
  195. package/dist/server.d.ts +41 -0
  196. package/dist/server.d.ts.map +1 -0
  197. package/dist/server.js +320 -0
  198. package/dist/server.js.map +1 -0
  199. package/dist/shell-safe.d.ts +15 -0
  200. package/dist/shell-safe.d.ts.map +1 -0
  201. package/dist/shell-safe.js +20 -0
  202. package/dist/shell-safe.js.map +1 -0
  203. package/dist/types.d.ts +365 -0
  204. package/dist/types.d.ts.map +1 -0
  205. package/dist/types.js +10 -0
  206. package/dist/types.js.map +1 -0
  207. package/logo.svg +81 -0
  208. 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,2 @@
1
+ export { LiteLLMEnricher } from "./litellm.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export { LiteLLMEnricher } from "./litellm.js";
2
+ //# sourceMappingURL=index.js.map
@@ -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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"}
@@ -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"}