@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,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Mistral AI provider discoverer.
|
|
3
|
+
*
|
|
4
|
+
* Queries the Mistral AI `/v1/models` endpoint, filters relevant models,
|
|
5
|
+
* and maps them into {@link ModelCard} objects.
|
|
6
|
+
*
|
|
7
|
+
* Mistral's catalog is first-party only — all models are Mistral's own,
|
|
8
|
+
* so `originProvider` is always `"mistral"`.
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import { OpenAICompatibleDiscoverer } from "./openai-compatible.js";
|
|
12
|
+
/**
|
|
13
|
+
* Discovers models available through the Mistral AI API.
|
|
14
|
+
*
|
|
15
|
+
* Mistral's catalog is first-party — model IDs are flat strings such as
|
|
16
|
+
* `mistral-large-latest`, `codestral-latest`, and `mistral-embed`. The
|
|
17
|
+
* discoverer infers mode and capabilities from patterns in the model ID.
|
|
18
|
+
*/
|
|
19
|
+
export class MistralDiscoverer extends OpenAICompatibleDiscoverer {
|
|
20
|
+
providerId = "mistral";
|
|
21
|
+
providerName = "Mistral AI";
|
|
22
|
+
baseUrl = "https://api.mistral.ai";
|
|
23
|
+
/**
|
|
24
|
+
* Determine whether a model ID represents a model we want to track.
|
|
25
|
+
*
|
|
26
|
+
* We keep all standard Mistral models and filter out:
|
|
27
|
+
* - Fine-tuned model snapshots (id starts with "ft:")
|
|
28
|
+
*/
|
|
29
|
+
isRelevantModel(model) {
|
|
30
|
+
// Skip fine-tuned model snapshots
|
|
31
|
+
if (model.id.startsWith("ft:"))
|
|
32
|
+
return false;
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Classify a Mistral model: determine origin, mode, and capabilities.
|
|
37
|
+
*
|
|
38
|
+
* Key heuristics:
|
|
39
|
+
* - Origin is always "mistral"
|
|
40
|
+
* - Embedding models get mode "embedding"
|
|
41
|
+
* - Chat models get mode "chat"
|
|
42
|
+
* - Models containing "pixtral" get "vision" capability
|
|
43
|
+
* - Models containing "codestral" get "code" capability
|
|
44
|
+
* - All chat models get "function_calling" (Mistral supports it across their lineup)
|
|
45
|
+
* - Large models get "nlu"
|
|
46
|
+
*/
|
|
47
|
+
classifyModel(model) {
|
|
48
|
+
const id = model.id;
|
|
49
|
+
const lower = id.toLowerCase();
|
|
50
|
+
// Determine mode
|
|
51
|
+
const mode = lower.includes("embed") ? "embedding" : "chat";
|
|
52
|
+
// Determine capabilities
|
|
53
|
+
const capabilities = [];
|
|
54
|
+
if (mode === "embedding") {
|
|
55
|
+
capabilities.push("embedding");
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// Chat models get function_calling
|
|
59
|
+
capabilities.push("chat");
|
|
60
|
+
capabilities.push("function_calling");
|
|
61
|
+
// Vision models
|
|
62
|
+
if (this.looksLikeVision(lower)) {
|
|
63
|
+
capabilities.push("vision");
|
|
64
|
+
}
|
|
65
|
+
// Code-specialized models
|
|
66
|
+
if (this.looksLikeCode(lower)) {
|
|
67
|
+
capabilities.push("code");
|
|
68
|
+
}
|
|
69
|
+
// Large models get NLU capability
|
|
70
|
+
if (lower.includes("large")) {
|
|
71
|
+
capabilities.push("nlu");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
originProvider: "mistral",
|
|
76
|
+
mode,
|
|
77
|
+
capabilities,
|
|
78
|
+
contextWindow: model.context_window,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=mistral.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mistral.js","sourceRoot":"","sources":["../../src/discovery/mistral.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEpE;;;;;;GAMG;AACH,MAAM,OAAO,iBAAkB,SAAQ,0BAA0B;IACvD,UAAU,GAAG,SAAS,CAAC;IACvB,YAAY,GAAG,YAAY,CAAC;IAC5B,OAAO,GAAG,wBAAwB,CAAC;IAE5C;;;;;OAKG;IACO,eAAe,CAAC,KAA4B;QACrD,kCAAkC;QAClC,IAAI,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAE7C,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;;;;;;;OAWG;IACO,aAAa,CAAC,KAA4B;QACnD,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAE/B,iBAAiB;QACjB,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;QAE5D,yBAAyB;QACzB,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACP,mCAAmC;YACnC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAEtC,gBAAgB;YAChB,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC;YAED,0BAA0B;YAC1B,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3B,CAAC;YAED,kCAAkC;YAClC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7B,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACF,CAAC;QAED,OAAO;YACN,cAAc,EAAE,SAAS;YACzB,IAAI;YACJ,YAAY;YACZ,aAAa,EAAE,KAAK,CAAC,cAAc;SACnC,CAAC;IACH,CAAC;CACD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Moonshot/Kimi provider discoverer.
|
|
3
|
+
*
|
|
4
|
+
* Moonshot (Kimi) exposes an OpenAI-compatible API.
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import type { OpenAICompatibleModel, ModelClassification } from "./openai-compatible.js";
|
|
8
|
+
import { OpenAICompatibleDiscoverer } from "./openai-compatible.js";
|
|
9
|
+
export declare class MoonshotDiscoverer extends OpenAICompatibleDiscoverer {
|
|
10
|
+
readonly providerId = "moonshot";
|
|
11
|
+
readonly providerName = "Moonshot (Kimi)";
|
|
12
|
+
readonly baseUrl = "https://api.moonshot.cn";
|
|
13
|
+
protected isRelevantModel(model: OpenAICompatibleModel): boolean;
|
|
14
|
+
protected classifyModel(model: OpenAICompatibleModel): ModelClassification;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=moonshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moonshot.d.ts","sourceRoot":"","sources":["../../src/discovery/moonshot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEpE,qBAAa,kBAAmB,SAAQ,0BAA0B;IACjE,QAAQ,CAAC,UAAU,cAAc;IACjC,QAAQ,CAAC,YAAY,qBAAqB;IAC1C,QAAQ,CAAC,OAAO,6BAA6B;IAE7C,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO;IAIhE,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB;CA8B1E"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Moonshot/Kimi provider discoverer.
|
|
3
|
+
*
|
|
4
|
+
* Moonshot (Kimi) exposes an OpenAI-compatible API.
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
import { OpenAICompatibleDiscoverer } from "./openai-compatible.js";
|
|
8
|
+
export class MoonshotDiscoverer extends OpenAICompatibleDiscoverer {
|
|
9
|
+
providerId = "moonshot";
|
|
10
|
+
providerName = "Moonshot (Kimi)";
|
|
11
|
+
baseUrl = "https://api.moonshot.cn";
|
|
12
|
+
isRelevantModel(model) {
|
|
13
|
+
return !model.id.startsWith("ft:");
|
|
14
|
+
}
|
|
15
|
+
classifyModel(model) {
|
|
16
|
+
const lower = model.id.toLowerCase();
|
|
17
|
+
if (this.looksLikeEmbedding(lower) || lower.includes("embedding")) {
|
|
18
|
+
return {
|
|
19
|
+
originProvider: "moonshot",
|
|
20
|
+
mode: "embedding",
|
|
21
|
+
capabilities: ["embedding"],
|
|
22
|
+
contextWindow: model.context_window,
|
|
23
|
+
maxOutputTokens: model.max_output_tokens,
|
|
24
|
+
maxInputTokens: model.max_input_tokens,
|
|
25
|
+
dimensions: model.output_vector_size,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const capabilities = ["chat", "function_calling"];
|
|
29
|
+
// Kimi's k2.5 family includes multimodal support.
|
|
30
|
+
if (this.looksLikeVision(lower) || lower.includes("k2.5"))
|
|
31
|
+
capabilities.push("vision");
|
|
32
|
+
if (this.looksLikeCode(lower))
|
|
33
|
+
capabilities.push("code");
|
|
34
|
+
if (lower.includes("thinking") || lower.includes("reason"))
|
|
35
|
+
capabilities.push("nlu");
|
|
36
|
+
return {
|
|
37
|
+
originProvider: "moonshot",
|
|
38
|
+
mode: "chat",
|
|
39
|
+
capabilities,
|
|
40
|
+
contextWindow: model.context_window,
|
|
41
|
+
maxOutputTokens: model.max_output_tokens,
|
|
42
|
+
maxInputTokens: model.max_input_tokens,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=moonshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moonshot.js","sourceRoot":"","sources":["../../src/discovery/moonshot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEpE,MAAM,OAAO,kBAAmB,SAAQ,0BAA0B;IACxD,UAAU,GAAG,UAAU,CAAC;IACxB,YAAY,GAAG,iBAAiB,CAAC;IACjC,OAAO,GAAG,yBAAyB,CAAC;IAEnC,eAAe,CAAC,KAA4B;QACrD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAES,aAAa,CAAC,KAA4B;QACnD,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACnE,OAAO;gBACN,cAAc,EAAE,UAAU;gBAC1B,IAAI,EAAE,WAAW;gBACjB,YAAY,EAAE,CAAC,WAAW,CAAC;gBAC3B,aAAa,EAAE,KAAK,CAAC,cAAc;gBACnC,eAAe,EAAE,KAAK,CAAC,iBAAiB;gBACxC,cAAc,EAAE,KAAK,CAAC,gBAAgB;gBACtC,UAAU,EAAE,KAAK,CAAC,kBAAkB;aACpC,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QAClD,kDAAkD;QAClD,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvF,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAErF,OAAO;YACN,cAAc,EAAE,UAAU;YAC1B,IAAI,EAAE,MAAM;YACZ,YAAY;YACZ,aAAa,EAAE,KAAK,CAAC,cAAc;YACnC,eAAe,EAAE,KAAK,CAAC,iBAAiB;YACxC,cAAc,EAAE,KAAK,CAAC,gBAAgB;SACtC,CAAC;IACH,CAAC;CACD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — NVIDIA provider discoverer.
|
|
3
|
+
*
|
|
4
|
+
* Queries the NVIDIA build.nvidia.com `/v1/models` endpoint (OpenAI-compatible),
|
|
5
|
+
* filters relevant models, and maps them into {@link ModelCard} objects.
|
|
6
|
+
*
|
|
7
|
+
* NVIDIA's API catalog is multi-vendor, hosting models from nvidia, meta,
|
|
8
|
+
* mistral, google, microsoft, deepseek, qwen, and others.
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import { OpenAICompatibleDiscoverer, type OpenAICompatibleModel, type ModelClassification } from "./openai-compatible.js";
|
|
12
|
+
/**
|
|
13
|
+
* Discovers models available through the NVIDIA API (build.nvidia.com).
|
|
14
|
+
*
|
|
15
|
+
* The NVIDIA catalog serves models from multiple vendors using an
|
|
16
|
+
* OpenAI-compatible API. Model IDs are namespaced (e.g. `nvidia/llama-3.1-nemotron-70b-instruct`,
|
|
17
|
+
* `meta/llama-3.1-405b-instruct`), allowing origin provider extraction from the prefix.
|
|
18
|
+
*/
|
|
19
|
+
export declare class NvidiaDiscoverer extends OpenAICompatibleDiscoverer {
|
|
20
|
+
readonly providerId = "nvidia";
|
|
21
|
+
readonly providerName = "NVIDIA";
|
|
22
|
+
readonly baseUrl = "https://integrate.api.nvidia.com";
|
|
23
|
+
/**
|
|
24
|
+
* Determine whether a model ID represents a model we want to track.
|
|
25
|
+
*
|
|
26
|
+
* We keep chat/instruct models and filter out:
|
|
27
|
+
* - Embedding-only models (handled separately if needed)
|
|
28
|
+
* - Reward models (used for RLHF, not inference)
|
|
29
|
+
* - Guard/safety models (used for content filtering pipelines)
|
|
30
|
+
*/
|
|
31
|
+
protected isRelevantModel(model: OpenAICompatibleModel): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Classify an NVIDIA model: extract origin provider, infer mode and capabilities.
|
|
34
|
+
*/
|
|
35
|
+
protected classifyModel(model: OpenAICompatibleModel): ModelClassification;
|
|
36
|
+
/**
|
|
37
|
+
* Extract the origin provider from a namespaced model ID.
|
|
38
|
+
*
|
|
39
|
+
* NVIDIA model IDs use `vendor/model-name` format. The prefix before
|
|
40
|
+
* the first `/` identifies the origin provider.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* extractOriginProvider("nvidia/llama-3.1-nemotron-70b-instruct") // "nvidia"
|
|
44
|
+
* extractOriginProvider("meta/llama-3.1-405b-instruct") // "meta"
|
|
45
|
+
*/
|
|
46
|
+
private extractOriginProvider;
|
|
47
|
+
/** Map a model ID to its primary {@link ModelMode}. */
|
|
48
|
+
private inferMode;
|
|
49
|
+
/**
|
|
50
|
+
* Infer capability flags from the model ID.
|
|
51
|
+
*
|
|
52
|
+
* Key heuristics:
|
|
53
|
+
* - Embedding models get "embedding" only
|
|
54
|
+
* - Models with "vlm", "vision", or known vision model names get "vision"
|
|
55
|
+
* - Instruct/chat models get "function_calling" (NVIDIA API supports it)
|
|
56
|
+
* - Code-specialized models get "code"
|
|
57
|
+
*/
|
|
58
|
+
private inferCapabilities;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=nvidia.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nvidia.d.ts","sourceRoot":"","sources":["../../src/discovery/nvidia.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,0BAA0B,EAAE,KAAK,qBAAqB,EAAE,KAAK,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAqB1H;;;;;;GAMG;AACH,qBAAa,gBAAiB,SAAQ,0BAA0B;IAC/D,QAAQ,CAAC,UAAU,YAAY;IAC/B,QAAQ,CAAC,YAAY,YAAY;IACjC,QAAQ,CAAC,OAAO,sCAAsC;IAEtD;;;;;;;OAOG;IACH,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO;IAYhE;;OAEG;IACH,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB;IAc1E;;;;;;;;;OASG;IACH,OAAO,CAAC,qBAAqB;IAgB7B,uDAAuD;IACvD,OAAO,CAAC,SAAS;IAMjB;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB;CAsCzB"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — NVIDIA provider discoverer.
|
|
3
|
+
*
|
|
4
|
+
* Queries the NVIDIA build.nvidia.com `/v1/models` endpoint (OpenAI-compatible),
|
|
5
|
+
* filters relevant models, and maps them into {@link ModelCard} objects.
|
|
6
|
+
*
|
|
7
|
+
* NVIDIA's API catalog is multi-vendor, hosting models from nvidia, meta,
|
|
8
|
+
* mistral, google, microsoft, deepseek, qwen, and others.
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import { OpenAICompatibleDiscoverer } from "./openai-compatible.js";
|
|
12
|
+
/** Known origin provider prefixes in NVIDIA's model catalog. */
|
|
13
|
+
const KNOWN_ORIGIN_PREFIXES = [
|
|
14
|
+
"nvidia",
|
|
15
|
+
"meta",
|
|
16
|
+
"mistralai",
|
|
17
|
+
"mistral",
|
|
18
|
+
"google",
|
|
19
|
+
"microsoft",
|
|
20
|
+
"deepseek",
|
|
21
|
+
"qwen",
|
|
22
|
+
"ibm",
|
|
23
|
+
"snowflake",
|
|
24
|
+
"databricks",
|
|
25
|
+
"writer",
|
|
26
|
+
"mediatek",
|
|
27
|
+
"rakuten",
|
|
28
|
+
"nv-mistralai",
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* Discovers models available through the NVIDIA API (build.nvidia.com).
|
|
32
|
+
*
|
|
33
|
+
* The NVIDIA catalog serves models from multiple vendors using an
|
|
34
|
+
* OpenAI-compatible API. Model IDs are namespaced (e.g. `nvidia/llama-3.1-nemotron-70b-instruct`,
|
|
35
|
+
* `meta/llama-3.1-405b-instruct`), allowing origin provider extraction from the prefix.
|
|
36
|
+
*/
|
|
37
|
+
export class NvidiaDiscoverer extends OpenAICompatibleDiscoverer {
|
|
38
|
+
providerId = "nvidia";
|
|
39
|
+
providerName = "NVIDIA";
|
|
40
|
+
baseUrl = "https://integrate.api.nvidia.com";
|
|
41
|
+
/**
|
|
42
|
+
* Determine whether a model ID represents a model we want to track.
|
|
43
|
+
*
|
|
44
|
+
* We keep chat/instruct models and filter out:
|
|
45
|
+
* - Embedding-only models (handled separately if needed)
|
|
46
|
+
* - Reward models (used for RLHF, not inference)
|
|
47
|
+
* - Guard/safety models (used for content filtering pipelines)
|
|
48
|
+
*/
|
|
49
|
+
isRelevantModel(model) {
|
|
50
|
+
const lower = model.id.toLowerCase();
|
|
51
|
+
// Skip reward models — used for RLHF, not direct inference
|
|
52
|
+
if (lower.includes("reward"))
|
|
53
|
+
return false;
|
|
54
|
+
// Skip guard/safety filter models (but keep llama-guard)
|
|
55
|
+
if (lower.includes("guard") && !lower.includes("llama-guard"))
|
|
56
|
+
return false;
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Classify an NVIDIA model: extract origin provider, infer mode and capabilities.
|
|
61
|
+
*/
|
|
62
|
+
classifyModel(model) {
|
|
63
|
+
const id = model.id;
|
|
64
|
+
const lower = id.toLowerCase();
|
|
65
|
+
const originProvider = this.extractOriginProvider(id);
|
|
66
|
+
const mode = this.inferMode(lower);
|
|
67
|
+
const capabilities = this.inferCapabilities(lower);
|
|
68
|
+
return {
|
|
69
|
+
originProvider,
|
|
70
|
+
mode,
|
|
71
|
+
capabilities,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Extract the origin provider from a namespaced model ID.
|
|
76
|
+
*
|
|
77
|
+
* NVIDIA model IDs use `vendor/model-name` format. The prefix before
|
|
78
|
+
* the first `/` identifies the origin provider.
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* extractOriginProvider("nvidia/llama-3.1-nemotron-70b-instruct") // "nvidia"
|
|
82
|
+
* extractOriginProvider("meta/llama-3.1-405b-instruct") // "meta"
|
|
83
|
+
*/
|
|
84
|
+
extractOriginProvider(id) {
|
|
85
|
+
const slashIdx = id.indexOf("/");
|
|
86
|
+
if (slashIdx === -1)
|
|
87
|
+
return "nvidia";
|
|
88
|
+
const prefix = id.slice(0, slashIdx).toLowerCase();
|
|
89
|
+
// Normalize known prefixes
|
|
90
|
+
if (prefix === "mistralai" || prefix === "nv-mistralai")
|
|
91
|
+
return "mistral";
|
|
92
|
+
for (const known of KNOWN_ORIGIN_PREFIXES) {
|
|
93
|
+
if (prefix === known)
|
|
94
|
+
return known;
|
|
95
|
+
}
|
|
96
|
+
return prefix;
|
|
97
|
+
}
|
|
98
|
+
/** Map a model ID to its primary {@link ModelMode}. */
|
|
99
|
+
inferMode(id) {
|
|
100
|
+
if (id.includes("embed"))
|
|
101
|
+
return "embedding";
|
|
102
|
+
if (id.includes("rerank"))
|
|
103
|
+
return "embedding";
|
|
104
|
+
return "chat";
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Infer capability flags from the model ID.
|
|
108
|
+
*
|
|
109
|
+
* Key heuristics:
|
|
110
|
+
* - Embedding models get "embedding" only
|
|
111
|
+
* - Models with "vlm", "vision", or known vision model names get "vision"
|
|
112
|
+
* - Instruct/chat models get "function_calling" (NVIDIA API supports it)
|
|
113
|
+
* - Code-specialized models get "code"
|
|
114
|
+
*/
|
|
115
|
+
inferCapabilities(id) {
|
|
116
|
+
// Embedding models
|
|
117
|
+
if (id.includes("embed") || id.includes("rerank")) {
|
|
118
|
+
return ["embedding"];
|
|
119
|
+
}
|
|
120
|
+
const caps = ["chat"];
|
|
121
|
+
// Vision models
|
|
122
|
+
if (id.includes("vlm") ||
|
|
123
|
+
id.includes("vision") ||
|
|
124
|
+
id.includes("llava") ||
|
|
125
|
+
id.includes("cogvlm") ||
|
|
126
|
+
id.includes("fuyu") ||
|
|
127
|
+
id.includes("neva") ||
|
|
128
|
+
id.includes("vila")) {
|
|
129
|
+
caps.push("vision");
|
|
130
|
+
}
|
|
131
|
+
// Code-specialized models
|
|
132
|
+
if (id.includes("code") ||
|
|
133
|
+
id.includes("codestral") ||
|
|
134
|
+
id.includes("starcoder") ||
|
|
135
|
+
id.includes("codellama")) {
|
|
136
|
+
caps.push("code");
|
|
137
|
+
}
|
|
138
|
+
// Function calling — most instruct models on NVIDIA support it
|
|
139
|
+
if (id.includes("instruct") || id.includes("chat") || id.includes("nemotron")) {
|
|
140
|
+
caps.push("function_calling");
|
|
141
|
+
}
|
|
142
|
+
return caps;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=nvidia.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nvidia.js","sourceRoot":"","sources":["../../src/discovery/nvidia.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,0BAA0B,EAAwD,MAAM,wBAAwB,CAAC;AAE1H,gEAAgE;AAChE,MAAM,qBAAqB,GAAG;IAC7B,QAAQ;IACR,MAAM;IACN,WAAW;IACX,SAAS;IACT,QAAQ;IACR,WAAW;IACX,UAAU;IACV,MAAM;IACN,KAAK;IACL,WAAW;IACX,YAAY;IACZ,QAAQ;IACR,UAAU;IACV,SAAS;IACT,cAAc;CACL,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,OAAO,gBAAiB,SAAQ,0BAA0B;IACtD,UAAU,GAAG,QAAQ,CAAC;IACtB,YAAY,GAAG,QAAQ,CAAC;IACxB,OAAO,GAAG,kCAAkC,CAAC;IAEtD;;;;;;;OAOG;IACO,eAAe,CAAC,KAA4B;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,2DAA2D;QAC3D,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QAE3C,yDAAyD;QACzD,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;YAAE,OAAO,KAAK,CAAC;QAE5E,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;OAEG;IACO,aAAa,CAAC,KAA4B;QACnD,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEnD,OAAO;YACN,cAAc;YACd,IAAI;YACJ,YAAY;SACZ,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACK,qBAAqB,CAAC,EAAU;QACvC,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,QAAQ,KAAK,CAAC,CAAC;YAAE,OAAO,QAAQ,CAAC;QAErC,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAEnD,2BAA2B;QAC3B,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,cAAc;YAAE,OAAO,SAAS,CAAC;QAE1E,KAAK,MAAM,KAAK,IAAI,qBAAqB,EAAE,CAAC;YAC3C,IAAI,MAAM,KAAK,KAAK;gBAAE,OAAO,KAAK,CAAC;QACpC,CAAC;QAED,OAAO,MAAM,CAAC;IACf,CAAC;IAED,uDAAuD;IAC/C,SAAS,CAAC,EAAU;QAC3B,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,WAAW,CAAC;QAC7C,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,WAAW,CAAC;QAC9C,OAAO,MAAM,CAAC;IACf,CAAC;IAED;;;;;;;;OAQG;IACK,iBAAiB,CAAC,EAAU;QACnC,mBAAmB;QACnB,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,WAAW,CAAC,CAAC;QACtB,CAAC;QAED,MAAM,IAAI,GAAa,CAAC,MAAM,CAAC,CAAC;QAEhC,gBAAgB;QAChB,IACC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;YAClB,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACrB,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;YACpB,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACrB,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;YACnB,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;YACnB,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAClB,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;QAED,0BAA0B;QAC1B,IACC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;YACnB,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;YACxB,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;YACxB,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EACvB,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAED,+DAA+D;QAC/D,IAAI,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/E,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;CACD"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Ollama (local) provider discoverer.
|
|
3
|
+
*
|
|
4
|
+
* Queries the Ollama REST API (`/api/tags`) on localhost to list locally
|
|
5
|
+
* pulled models. Because Ollama runs without authentication and may not
|
|
6
|
+
* be installed at all, this discoverer fails gracefully on connection errors.
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import type { CredentialResult, ModelCard } from "../types.js";
|
|
10
|
+
import { BaseDiscoverer } from "./base.js";
|
|
11
|
+
/**
|
|
12
|
+
* Discovers locally-pulled models from an Ollama instance.
|
|
13
|
+
*
|
|
14
|
+
* Ollama requires no authentication, so the credential is ignored.
|
|
15
|
+
* If the Ollama daemon is not running, discovery returns an empty array
|
|
16
|
+
* instead of throwing, making it safe to include in every scan.
|
|
17
|
+
*/
|
|
18
|
+
export declare class OllamaDiscoverer extends BaseDiscoverer {
|
|
19
|
+
readonly providerId = "ollama";
|
|
20
|
+
readonly providerName = "Ollama (Local)";
|
|
21
|
+
readonly baseUrl: string;
|
|
22
|
+
/** Set of model names currently loaded in VRAM (warm). */
|
|
23
|
+
private runningModels;
|
|
24
|
+
/**
|
|
25
|
+
* @param baseUrl - Override the default Ollama URL (default: `http://localhost:11434`).
|
|
26
|
+
* Useful when Ollama is running on a non-standard port or remote host.
|
|
27
|
+
*/
|
|
28
|
+
constructor(baseUrl?: string);
|
|
29
|
+
/**
|
|
30
|
+
* List all locally-pulled models from Ollama.
|
|
31
|
+
*
|
|
32
|
+
* The `_credential` parameter is ignored — Ollama never requires auth.
|
|
33
|
+
* Uses a shorter default timeout (5 s) since the server is local.
|
|
34
|
+
*/
|
|
35
|
+
discover(_credential: CredentialResult, options?: {
|
|
36
|
+
timeout?: number;
|
|
37
|
+
}): Promise<ModelCard[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Fetch the list of models currently loaded in VRAM.
|
|
40
|
+
* Failures are silently ignored since this is purely informational.
|
|
41
|
+
*/
|
|
42
|
+
private fetchRunningModels;
|
|
43
|
+
/** Convert an Ollama model into a normalized {@link ModelCard}. */
|
|
44
|
+
private toModelCard;
|
|
45
|
+
/**
|
|
46
|
+
* Infer capabilities from the model name and Ollama-provided family metadata.
|
|
47
|
+
*/
|
|
48
|
+
private inferCapabilities;
|
|
49
|
+
/**
|
|
50
|
+
* Detect embedding models by common naming conventions.
|
|
51
|
+
* Patterns: "embed", "nomic-embed", "mxbai-embed".
|
|
52
|
+
*/
|
|
53
|
+
private isEmbeddingModel;
|
|
54
|
+
/** Check whether an error represents a network connectivity failure. */
|
|
55
|
+
private isConnectionError;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=ollama.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/discovery/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAsC3C;;;;;;GAMG;AACH,qBAAa,gBAAiB,SAAQ,cAAc;IACnD,QAAQ,CAAC,UAAU,YAAY;IAC/B,QAAQ,CAAC,YAAY,oBAAoB;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,0DAA0D;IAC1D,OAAO,CAAC,aAAa,CAAqB;IAE1C;;;OAGG;gBACS,OAAO,CAAC,EAAE,MAAM;IAK5B;;;;;OAKG;IACG,QAAQ,CAAC,WAAW,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAyBnG;;;OAGG;YACW,kBAAkB;IAahC,mEAAmE;IACnE,OAAO,CAAC,WAAW;IA+BnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA6BzB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAKxB,wEAAwE;IACxE,OAAO,CAAC,iBAAiB;CAWzB"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kosha-discovery — Ollama (local) provider discoverer.
|
|
3
|
+
*
|
|
4
|
+
* Queries the Ollama REST API (`/api/tags`) on localhost to list locally
|
|
5
|
+
* pulled models. Because Ollama runs without authentication and may not
|
|
6
|
+
* be installed at all, this discoverer fails gracefully on connection errors.
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { BaseDiscoverer } from "./base.js";
|
|
10
|
+
/**
|
|
11
|
+
* Discovers locally-pulled models from an Ollama instance.
|
|
12
|
+
*
|
|
13
|
+
* Ollama requires no authentication, so the credential is ignored.
|
|
14
|
+
* If the Ollama daemon is not running, discovery returns an empty array
|
|
15
|
+
* instead of throwing, making it safe to include in every scan.
|
|
16
|
+
*/
|
|
17
|
+
export class OllamaDiscoverer extends BaseDiscoverer {
|
|
18
|
+
providerId = "ollama";
|
|
19
|
+
providerName = "Ollama (Local)";
|
|
20
|
+
baseUrl;
|
|
21
|
+
/** Set of model names currently loaded in VRAM (warm). */
|
|
22
|
+
runningModels = new Set();
|
|
23
|
+
/**
|
|
24
|
+
* @param baseUrl - Override the default Ollama URL (default: `http://localhost:11434`).
|
|
25
|
+
* Useful when Ollama is running on a non-standard port or remote host.
|
|
26
|
+
*/
|
|
27
|
+
constructor(baseUrl) {
|
|
28
|
+
super();
|
|
29
|
+
this.baseUrl = baseUrl ?? "http://localhost:11434";
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* List all locally-pulled models from Ollama.
|
|
33
|
+
*
|
|
34
|
+
* The `_credential` parameter is ignored — Ollama never requires auth.
|
|
35
|
+
* Uses a shorter default timeout (5 s) since the server is local.
|
|
36
|
+
*/
|
|
37
|
+
async discover(_credential, options) {
|
|
38
|
+
const timeoutMs = this.validateTimeout(options?.timeout, 5_000);
|
|
39
|
+
// Best-effort fetch of currently loaded (warm) models — non-critical
|
|
40
|
+
await this.fetchRunningModels(timeoutMs);
|
|
41
|
+
let response;
|
|
42
|
+
try {
|
|
43
|
+
response = await this.fetchJSON(`${this.baseUrl}/api/tags`, undefined, timeoutMs);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
// Gracefully return empty when Ollama is not installed or not running,
|
|
47
|
+
// rather than propagating connection errors up to the registry
|
|
48
|
+
if (this.isConnectionError(error)) {
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
if (!response.models || !Array.isArray(response.models)) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
return response.models.map((model) => this.toModelCard(model));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Fetch the list of models currently loaded in VRAM.
|
|
60
|
+
* Failures are silently ignored since this is purely informational.
|
|
61
|
+
*/
|
|
62
|
+
async fetchRunningModels(timeoutMs) {
|
|
63
|
+
try {
|
|
64
|
+
const response = await this.fetchJSON(`${this.baseUrl}/api/ps`, undefined, timeoutMs);
|
|
65
|
+
if (response.models && Array.isArray(response.models)) {
|
|
66
|
+
for (const model of response.models) {
|
|
67
|
+
this.runningModels.add(model.name);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Non-critical — running model info is nice-to-have only
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** Convert an Ollama model into a normalized {@link ModelCard}. */
|
|
76
|
+
toModelCard(model) {
|
|
77
|
+
const capabilities = this.inferCapabilities(model);
|
|
78
|
+
const mode = this.isEmbeddingModel(model.name) ? "embedding" : "chat";
|
|
79
|
+
const families = Array.isArray(model.details?.families) ? model.details.families : [];
|
|
80
|
+
return this.makeCard({
|
|
81
|
+
id: model.name,
|
|
82
|
+
name: model.name,
|
|
83
|
+
provider: this.providerId,
|
|
84
|
+
mode,
|
|
85
|
+
capabilities,
|
|
86
|
+
rawCapabilities: [...capabilities],
|
|
87
|
+
// Ollama's /api/tags does not return context window info;
|
|
88
|
+
// the litellm enricher will fill these in later
|
|
89
|
+
contextWindow: 0,
|
|
90
|
+
maxOutputTokens: 0,
|
|
91
|
+
source: "local",
|
|
92
|
+
localRuntime: {
|
|
93
|
+
runtimeFamily: "ollama",
|
|
94
|
+
transport: "native-http",
|
|
95
|
+
tokenizerFamily: families[0] ?? undefined,
|
|
96
|
+
quantization: model.details?.quantization_level,
|
|
97
|
+
memoryFootprintBytes: model.size,
|
|
98
|
+
computeTarget: this.runningModels.has(model.name) ? "gpu" : "unknown",
|
|
99
|
+
// Ollama supports streaming and structured JSON at the runtime layer.
|
|
100
|
+
supportsStructuredOutput: true,
|
|
101
|
+
supportsStreaming: true,
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Infer capabilities from the model name and Ollama-provided family metadata.
|
|
107
|
+
*/
|
|
108
|
+
inferCapabilities(model) {
|
|
109
|
+
const name = model.name.toLowerCase();
|
|
110
|
+
const families = Array.isArray(model.details?.families) ? model.details.families : [];
|
|
111
|
+
// Embedding models — detected by common naming patterns:
|
|
112
|
+
// "nomic-embed-text", "mxbai-embed-large", "all-minilm", etc.
|
|
113
|
+
if (this.isEmbeddingModel(name)) {
|
|
114
|
+
return ["embedding"];
|
|
115
|
+
}
|
|
116
|
+
const capabilities = ["chat"];
|
|
117
|
+
// Code-focused models (codestral, deepseek-coder, starcoder, codellama)
|
|
118
|
+
if (name.includes("code") || name.includes("coder") || name.includes("starcoder") || name.includes("codellama")) {
|
|
119
|
+
capabilities.push("code");
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// Most general-purpose local models (llama, qwen, mistral) handle code too
|
|
123
|
+
capabilities.push("code");
|
|
124
|
+
}
|
|
125
|
+
// Vision support: Ollama reports model families (e.g. "clip") in metadata;
|
|
126
|
+
// also detect by well-known multimodal model names
|
|
127
|
+
if (families.includes("clip") || name.includes("llava") || name.includes("vision")) {
|
|
128
|
+
capabilities.push("vision");
|
|
129
|
+
}
|
|
130
|
+
return capabilities;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Detect embedding models by common naming conventions.
|
|
134
|
+
* Patterns: "embed", "nomic-embed", "mxbai-embed".
|
|
135
|
+
*/
|
|
136
|
+
isEmbeddingModel(name) {
|
|
137
|
+
const lower = name.toLowerCase();
|
|
138
|
+
return lower.includes("embed") || lower.includes("nomic-embed") || lower.includes("mxbai-embed");
|
|
139
|
+
}
|
|
140
|
+
/** Check whether an error represents a network connectivity failure. */
|
|
141
|
+
isConnectionError(error) {
|
|
142
|
+
const message = (error instanceof Error ? error.message : String(error)).toLowerCase();
|
|
143
|
+
return (message.includes("econnrefused") ||
|
|
144
|
+
message.includes("enotfound") ||
|
|
145
|
+
message.includes("econnreset") ||
|
|
146
|
+
message.includes("fetch failed") ||
|
|
147
|
+
message.includes("network") ||
|
|
148
|
+
message.includes("timed out"));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/discovery/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAsC3C;;;;;;GAMG;AACH,MAAM,OAAO,gBAAiB,SAAQ,cAAc;IAC1C,UAAU,GAAG,QAAQ,CAAC;IACtB,YAAY,GAAG,gBAAgB,CAAC;IAChC,OAAO,CAAS;IAEzB,0DAA0D;IAClD,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAE1C;;;OAGG;IACH,YAAY,OAAgB;QAC3B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,wBAAwB,CAAC;IACpD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,WAA6B,EAAE,OAA8B;QAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAEhE,qEAAqE;QACrE,MAAM,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,QAA4B,CAAC;QACjC,IAAI,CAAC;YACJ,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAqB,GAAG,IAAI,CAAC,OAAO,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACvG,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACzB,uEAAuE;YACvE,+DAA+D;YAC/D,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnC,OAAO,EAAE,CAAC;YACX,CAAC;YACD,MAAM,KAAK,CAAC;QACb,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACzD,OAAO,EAAE,CAAC;QACX,CAAC;QAED,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,kBAAkB,CAAC,SAAiB;QACjD,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAmB,GAAG,IAAI,CAAC,OAAO,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YACxG,IAAI,QAAQ,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;oBACrC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACpC,CAAC;YACF,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,yDAAyD;QAC1D,CAAC;IACF,CAAC;IAED,mEAAmE;IAC3D,WAAW,CAAC,KAAkB;QACrC,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAoB,CAAC,CAAC,CAAC,MAAe,CAAC;QACxF,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAEtF,OAAO,IAAI,CAAC,QAAQ,CAAC;YACpB,EAAE,EAAE,KAAK,CAAC,IAAI;YACd,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,IAAI,CAAC,UAAU;YACzB,IAAI;YACJ,YAAY;YACZ,eAAe,EAAE,CAAC,GAAG,YAAY,CAAC;YAClC,0DAA0D;YAC1D,gDAAgD;YAChD,aAAa,EAAE,CAAC;YAChB,eAAe,EAAE,CAAC;YAClB,MAAM,EAAE,OAAO;YACf,YAAY,EAAE;gBACb,aAAa,EAAE,QAAQ;gBACvB,SAAS,EAAE,aAAa;gBACxB,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,SAAS;gBACzC,YAAY,EAAE,KAAK,CAAC,OAAO,EAAE,kBAAkB;gBAC/C,oBAAoB,EAAE,KAAK,CAAC,IAAI;gBAChC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;gBACrE,sEAAsE;gBACtE,wBAAwB,EAAE,IAAI;gBAC9B,iBAAiB,EAAE,IAAI;aACvB;SACD,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,KAAkB;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAEtF,yDAAyD;QACzD,8DAA8D;QAC9D,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,WAAW,CAAC,CAAC;QACtB,CAAC;QAED,MAAM,YAAY,GAAa,CAAC,MAAM,CAAC,CAAC;QAExC,wEAAwE;QACxE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACjH,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACP,2EAA2E;YAC3E,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QAED,2EAA2E;QAC3E,mDAAmD;QACnD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpF,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO,YAAY,CAAC;IACrB,CAAC;IAED;;;OAGG;IACK,gBAAgB,CAAC,IAAY;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAClG,CAAC;IAED,wEAAwE;IAChE,iBAAiB,CAAC,KAAc;QACvC,MAAM,OAAO,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACvF,OAAO,CACN,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;YAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;YAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC7B,CAAC;IACH,CAAC;CACD"}
|