@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,41 @@
1
+ /**
2
+ * kosha-discovery — DeepInfra provider discoverer.
3
+ *
4
+ * Queries the DeepInfra `/v1/models` endpoint (OpenAI-compatible),
5
+ * filters relevant models, and maps them into {@link ModelCard} objects.
6
+ *
7
+ * DeepInfra's API catalog is multi-vendor, hosting models from meta, mistral,
8
+ * deepseek, qwen, bigcode, google, and others. Model IDs use `vendor/model-name`
9
+ * namespacing (e.g. `meta-llama/Meta-Llama-3.1-405B-Instruct`).
10
+ * @module
11
+ */
12
+ import { OpenAICompatibleDiscoverer, type OpenAICompatibleModel, type ModelClassification } from "./openai-compatible.js";
13
+ /**
14
+ * Discovers models available through the DeepInfra API (api.deepinfra.com).
15
+ *
16
+ * The DeepInfra catalog serves models from multiple vendors using an
17
+ * OpenAI-compatible API. Model IDs are namespaced (e.g.
18
+ * `meta-llama/Meta-Llama-3.1-405B-Instruct`, `Qwen/Qwen2.5-72B-Instruct`),
19
+ * allowing origin provider extraction from the prefix.
20
+ */
21
+ export declare class DeepInfraDiscoverer extends OpenAICompatibleDiscoverer {
22
+ readonly providerId = "deepinfra";
23
+ readonly providerName = "DeepInfra";
24
+ readonly baseUrl = "https://api.deepinfra.com";
25
+ /**
26
+ * Filter out models that are not suitable for direct inference.
27
+ *
28
+ * We exclude:
29
+ * - Reward models (used for RLHF training pipelines, not inference)
30
+ */
31
+ protected isRelevantModel(model: OpenAICompatibleModel): boolean;
32
+ /**
33
+ * Classify a DeepInfra model: extract origin provider, infer mode and capabilities.
34
+ *
35
+ * DeepInfra uses `vendor/model-name` namespacing, so we extract the origin
36
+ * provider from the prefix and apply well-known aliases to normalize names
37
+ * (e.g. `meta-llama` -> `meta`, `mistralai` -> `mistral`).
38
+ */
39
+ protected classifyModel(model: OpenAICompatibleModel): ModelClassification;
40
+ }
41
+ //# sourceMappingURL=deepinfra.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepinfra.d.ts","sourceRoot":"","sources":["../../src/discovery/deepinfra.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,0BAA0B,EAAE,KAAK,qBAAqB,EAAE,KAAK,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAe1H;;;;;;;GAOG;AACH,qBAAa,mBAAoB,SAAQ,0BAA0B;IAClE,QAAQ,CAAC,UAAU,eAAe;IAClC,QAAQ,CAAC,YAAY,eAAe;IACpC,QAAQ,CAAC,OAAO,+BAA+B;IAE/C;;;;;OAKG;IACH,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO;IAKhE;;;;;;OAMG;IACH,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB;CAsC1E"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * kosha-discovery — DeepInfra provider discoverer.
3
+ *
4
+ * Queries the DeepInfra `/v1/models` endpoint (OpenAI-compatible),
5
+ * filters relevant models, and maps them into {@link ModelCard} objects.
6
+ *
7
+ * DeepInfra's API catalog is multi-vendor, hosting models from meta, mistral,
8
+ * deepseek, qwen, bigcode, google, and others. Model IDs use `vendor/model-name`
9
+ * namespacing (e.g. `meta-llama/Meta-Llama-3.1-405B-Instruct`).
10
+ * @module
11
+ */
12
+ import { OpenAICompatibleDiscoverer } from "./openai-compatible.js";
13
+ /**
14
+ * Alias map normalizing DeepInfra vendor prefixes to canonical origin providers.
15
+ *
16
+ * DeepInfra uses prefixes like `meta-llama` (not `meta`) and `mistralai` (not `mistral`),
17
+ * so we remap them to their canonical short forms.
18
+ */
19
+ const PREFIX_ALIASES = {
20
+ "meta-llama": "meta",
21
+ "mistralai": "mistral",
22
+ "deepseek-ai": "deepseek",
23
+ "bigcode": "mistral",
24
+ };
25
+ /**
26
+ * Discovers models available through the DeepInfra API (api.deepinfra.com).
27
+ *
28
+ * The DeepInfra catalog serves models from multiple vendors using an
29
+ * OpenAI-compatible API. Model IDs are namespaced (e.g.
30
+ * `meta-llama/Meta-Llama-3.1-405B-Instruct`, `Qwen/Qwen2.5-72B-Instruct`),
31
+ * allowing origin provider extraction from the prefix.
32
+ */
33
+ export class DeepInfraDiscoverer extends OpenAICompatibleDiscoverer {
34
+ providerId = "deepinfra";
35
+ providerName = "DeepInfra";
36
+ baseUrl = "https://api.deepinfra.com";
37
+ /**
38
+ * Filter out models that are not suitable for direct inference.
39
+ *
40
+ * We exclude:
41
+ * - Reward models (used for RLHF training pipelines, not inference)
42
+ */
43
+ isRelevantModel(model) {
44
+ const lower = model.id.toLowerCase();
45
+ return !this.looksLikeReward(lower);
46
+ }
47
+ /**
48
+ * Classify a DeepInfra model: extract origin provider, infer mode and capabilities.
49
+ *
50
+ * DeepInfra uses `vendor/model-name` namespacing, so we extract the origin
51
+ * provider from the prefix and apply well-known aliases to normalize names
52
+ * (e.g. `meta-llama` -> `meta`, `mistralai` -> `mistral`).
53
+ */
54
+ classifyModel(model) {
55
+ const id = model.id;
56
+ const lower = id.toLowerCase();
57
+ const originProvider = this.extractPrefixOrigin(lower, "deepinfra", PREFIX_ALIASES);
58
+ // Embedding: DeepInfra exposes a type field on some models; also check ID heuristic
59
+ if (this.looksLikeEmbedding(lower) || model.type === "embedding") {
60
+ return {
61
+ originProvider,
62
+ mode: "embedding",
63
+ capabilities: ["embedding"],
64
+ };
65
+ }
66
+ const capabilities = ["chat"];
67
+ // Vision capability
68
+ if (this.looksLikeVision(lower)) {
69
+ capabilities.push("vision");
70
+ }
71
+ // Code-specialized capability
72
+ if (this.looksLikeCode(lower)) {
73
+ capabilities.push("code");
74
+ }
75
+ // Function calling — instruct and chat models on DeepInfra support tool use
76
+ if (lower.includes("instruct") || lower.includes("chat")) {
77
+ capabilities.push("function_calling");
78
+ }
79
+ return {
80
+ originProvider,
81
+ mode: "chat",
82
+ capabilities,
83
+ };
84
+ }
85
+ }
86
+ //# sourceMappingURL=deepinfra.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepinfra.js","sourceRoot":"","sources":["../../src/discovery/deepinfra.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,0BAA0B,EAAwD,MAAM,wBAAwB,CAAC;AAE1H;;;;;GAKG;AACH,MAAM,cAAc,GAA2B;IAC9C,YAAY,EAAE,MAAM;IACpB,WAAW,EAAE,SAAS;IACtB,aAAa,EAAE,UAAU;IACzB,SAAS,EAAE,SAAS;CACpB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,OAAO,mBAAoB,SAAQ,0BAA0B;IACzD,UAAU,GAAG,WAAW,CAAC;IACzB,YAAY,GAAG,WAAW,CAAC;IAC3B,OAAO,GAAG,2BAA2B,CAAC;IAE/C;;;;;OAKG;IACO,eAAe,CAAC,KAA4B;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED;;;;;;OAMG;IACO,aAAa,CAAC,KAA4B;QACnD,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAE/B,MAAM,cAAc,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;QAEpF,oFAAoF;QACpF,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAClE,OAAO;gBACN,cAAc;gBACd,IAAI,EAAE,WAAW;gBACjB,YAAY,EAAE,CAAC,WAAW,CAAC;aAC3B,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAa,CAAC,MAAM,CAAC,CAAC;QAExC,oBAAoB;QACpB,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;QAED,8BAA8B;QAC9B,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QAED,4EAA4E;QAC5E,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1D,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACvC,CAAC;QAED,OAAO;YACN,cAAc;YACd,IAAI,EAAE,MAAM;YACZ,YAAY;SACZ,CAAC;IACH,CAAC;CACD"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * kosha-discovery — DeepSeek provider discoverer.
3
+ *
4
+ * DeepSeek exposes an OpenAI-compatible API at api.deepseek.com.
5
+ * This discoverer adds first-class direct discovery for DeepSeek models.
6
+ * @module
7
+ */
8
+ import type { OpenAICompatibleModel, ModelClassification } from "./openai-compatible.js";
9
+ import { OpenAICompatibleDiscoverer } from "./openai-compatible.js";
10
+ export declare class DeepSeekDiscoverer extends OpenAICompatibleDiscoverer {
11
+ readonly providerId = "deepseek";
12
+ readonly providerName = "DeepSeek";
13
+ readonly baseUrl = "https://api.deepseek.com";
14
+ protected isRelevantModel(model: OpenAICompatibleModel): boolean;
15
+ protected classifyModel(model: OpenAICompatibleModel): ModelClassification;
16
+ }
17
+ //# sourceMappingURL=deepseek.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepseek.d.ts","sourceRoot":"","sources":["../../src/discovery/deepseek.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;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,cAAc;IACnC,QAAQ,CAAC,OAAO,8BAA8B;IAE9C,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO;IAKhE,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB;CA4B1E"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * kosha-discovery — DeepSeek provider discoverer.
3
+ *
4
+ * DeepSeek exposes an OpenAI-compatible API at api.deepseek.com.
5
+ * This discoverer adds first-class direct discovery for DeepSeek models.
6
+ * @module
7
+ */
8
+ import { OpenAICompatibleDiscoverer } from "./openai-compatible.js";
9
+ export class DeepSeekDiscoverer extends OpenAICompatibleDiscoverer {
10
+ providerId = "deepseek";
11
+ providerName = "DeepSeek";
12
+ baseUrl = "https://api.deepseek.com";
13
+ isRelevantModel(model) {
14
+ const lower = model.id.toLowerCase();
15
+ return !model.id.startsWith("ft:") && !this.looksLikeReward(lower);
16
+ }
17
+ classifyModel(model) {
18
+ const lower = model.id.toLowerCase();
19
+ if (this.looksLikeEmbedding(lower) || lower.includes("embedding")) {
20
+ return {
21
+ originProvider: "deepseek",
22
+ mode: "embedding",
23
+ capabilities: ["embedding"],
24
+ contextWindow: model.context_window,
25
+ maxOutputTokens: model.max_output_tokens,
26
+ maxInputTokens: model.max_input_tokens,
27
+ dimensions: model.output_vector_size,
28
+ };
29
+ }
30
+ const capabilities = ["chat", "function_calling", "nlu"];
31
+ if (this.looksLikeCode(lower))
32
+ capabilities.push("code");
33
+ if (this.looksLikeVision(lower))
34
+ capabilities.push("vision");
35
+ return {
36
+ originProvider: "deepseek",
37
+ mode: "chat",
38
+ capabilities,
39
+ contextWindow: model.context_window,
40
+ maxOutputTokens: model.max_output_tokens,
41
+ maxInputTokens: model.max_input_tokens,
42
+ };
43
+ }
44
+ }
45
+ //# sourceMappingURL=deepseek.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepseek.js","sourceRoot":"","sources":["../../src/discovery/deepseek.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEpE,MAAM,OAAO,kBAAmB,SAAQ,0BAA0B;IACxD,UAAU,GAAG,UAAU,CAAC;IACxB,YAAY,GAAG,UAAU,CAAC;IAC1B,OAAO,GAAG,0BAA0B,CAAC;IAEpC,eAAe,CAAC,KAA4B;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACpE,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,EAAE,KAAK,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;YAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE7D,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,48 @@
1
+ /**
2
+ * kosha-discovery — Fireworks AI provider discoverer.
3
+ *
4
+ * Queries the Fireworks AI `api.fireworks.ai/inference` `/v1/models` endpoint
5
+ * (OpenAI-compatible), filters relevant models, and maps them into
6
+ * {@link ModelCard} objects.
7
+ *
8
+ * Fireworks hosts models from multiple origins (meta, mistral, qwen, google,
9
+ * deepseek, microsoft, and others) under a flat
10
+ * `accounts/fireworks/models/<name>` namespace. Origin is inferred from the
11
+ * model name portion of the ID.
12
+ * @module
13
+ */
14
+ import { OpenAICompatibleDiscoverer, type OpenAICompatibleModel, type ModelClassification } from "./openai-compatible.js";
15
+ /**
16
+ * Discovers models available through the Fireworks AI API.
17
+ *
18
+ * The Fireworks catalog serves models from multiple vendors using an
19
+ * OpenAI-compatible API. Model IDs use the flat
20
+ * `accounts/fireworks/models/<name>` format; origin provider is inferred
21
+ * from keywords in the model name portion.
22
+ */
23
+ export declare class FireworksDiscoverer extends OpenAICompatibleDiscoverer {
24
+ readonly providerId = "fireworks";
25
+ readonly providerName = "Fireworks AI";
26
+ readonly baseUrl = "https://api.fireworks.ai/inference";
27
+ /**
28
+ * Determine whether a model ID represents a model we want to track.
29
+ *
30
+ * Fireworks already curates their catalog, so we keep all models except:
31
+ * - Reward models (used for RLHF, not direct inference)
32
+ */
33
+ protected isRelevantModel(model: OpenAICompatibleModel): boolean;
34
+ /**
35
+ * Classify a Fireworks model: determine origin provider, mode, and capabilities.
36
+ *
37
+ * Fireworks model IDs use the `accounts/fireworks/models/<name>` format.
38
+ * The model name portion after the last `/` is inspected for known
39
+ * keyword patterns to determine the originating vendor.
40
+ *
41
+ * @example
42
+ * classifyModel("accounts/fireworks/models/llama-v3p1-405b-instruct") // origin: "meta"
43
+ * classifyModel("accounts/fireworks/models/mixtral-8x22b-instruct") // origin: "mistral"
44
+ * classifyModel("accounts/fireworks/models/qwen2p5-72b-instruct") // origin: "qwen"
45
+ */
46
+ protected classifyModel(model: OpenAICompatibleModel): ModelClassification;
47
+ }
48
+ //# sourceMappingURL=fireworks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fireworks.d.ts","sourceRoot":"","sources":["../../src/discovery/fireworks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACN,0BAA0B,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;GAOG;AACH,qBAAa,mBAAoB,SAAQ,0BAA0B;IAClE,QAAQ,CAAC,UAAU,eAAe;IAClC,QAAQ,CAAC,YAAY,kBAAkB;IACvC,QAAQ,CAAC,OAAO,wCAAwC;IAExD;;;;;OAKG;IACH,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO;IAShE;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB;CA4D1E"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * kosha-discovery — Fireworks AI provider discoverer.
3
+ *
4
+ * Queries the Fireworks AI `api.fireworks.ai/inference` `/v1/models` endpoint
5
+ * (OpenAI-compatible), filters relevant models, and maps them into
6
+ * {@link ModelCard} objects.
7
+ *
8
+ * Fireworks hosts models from multiple origins (meta, mistral, qwen, google,
9
+ * deepseek, microsoft, and others) under a flat
10
+ * `accounts/fireworks/models/<name>` namespace. Origin is inferred from the
11
+ * model name portion of the ID.
12
+ * @module
13
+ */
14
+ import { OpenAICompatibleDiscoverer, } from "./openai-compatible.js";
15
+ /**
16
+ * Discovers models available through the Fireworks AI API.
17
+ *
18
+ * The Fireworks catalog serves models from multiple vendors using an
19
+ * OpenAI-compatible API. Model IDs use the flat
20
+ * `accounts/fireworks/models/<name>` format; origin provider is inferred
21
+ * from keywords in the model name portion.
22
+ */
23
+ export class FireworksDiscoverer extends OpenAICompatibleDiscoverer {
24
+ providerId = "fireworks";
25
+ providerName = "Fireworks AI";
26
+ baseUrl = "https://api.fireworks.ai/inference";
27
+ /**
28
+ * Determine whether a model ID represents a model we want to track.
29
+ *
30
+ * Fireworks already curates their catalog, so we keep all models except:
31
+ * - Reward models (used for RLHF, not direct inference)
32
+ */
33
+ isRelevantModel(model) {
34
+ const lower = model.id.toLowerCase();
35
+ // Skip reward models — used for RLHF, not direct inference
36
+ if (this.looksLikeReward(lower))
37
+ return false;
38
+ return true;
39
+ }
40
+ /**
41
+ * Classify a Fireworks model: determine origin provider, mode, and capabilities.
42
+ *
43
+ * Fireworks model IDs use the `accounts/fireworks/models/<name>` format.
44
+ * The model name portion after the last `/` is inspected for known
45
+ * keyword patterns to determine the originating vendor.
46
+ *
47
+ * @example
48
+ * classifyModel("accounts/fireworks/models/llama-v3p1-405b-instruct") // origin: "meta"
49
+ * classifyModel("accounts/fireworks/models/mixtral-8x22b-instruct") // origin: "mistral"
50
+ * classifyModel("accounts/fireworks/models/qwen2p5-72b-instruct") // origin: "qwen"
51
+ */
52
+ classifyModel(model) {
53
+ const id = model.id;
54
+ const lower = id.toLowerCase();
55
+ // Extract the model name portion (everything after the last '/')
56
+ const lastSlash = id.lastIndexOf("/");
57
+ const modelName = lastSlash === -1 ? id : id.slice(lastSlash + 1);
58
+ const modelNameLower = modelName.toLowerCase();
59
+ // Determine origin provider from keywords in the model name
60
+ const originProvider = this.inferOriginFromKeywords(modelNameLower, [
61
+ ["llama", "meta"],
62
+ ["mixtral", "mistral"],
63
+ ["mistral", "mistral"],
64
+ ["starcoder", "mistral"],
65
+ ["codestral", "mistral"],
66
+ ["qwen", "qwen"],
67
+ ["gemma", "google"],
68
+ ["deepseek", "deepseek"],
69
+ ["phi", "microsoft"],
70
+ ], "fireworks");
71
+ // Determine mode based on model type
72
+ const mode = lower.includes("embed") ? "embedding" : "chat";
73
+ // Infer capabilities from model name
74
+ const capabilities = [];
75
+ if (lower.includes("embed")) {
76
+ capabilities.push("embedding");
77
+ }
78
+ else {
79
+ // Non-embedding models default to chat
80
+ capabilities.push("chat");
81
+ // Vision models
82
+ if (this.looksLikeVision(lower)) {
83
+ capabilities.push("vision");
84
+ }
85
+ // Code-specialized models
86
+ if (this.looksLikeCode(lower)) {
87
+ capabilities.push("code");
88
+ }
89
+ // Function calling — instruct/chat models support it
90
+ if (lower.includes("instruct") || lower.includes("chat")) {
91
+ capabilities.push("function_calling");
92
+ }
93
+ }
94
+ return {
95
+ originProvider,
96
+ mode,
97
+ capabilities,
98
+ };
99
+ }
100
+ }
101
+ //# sourceMappingURL=fireworks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fireworks.js","sourceRoot":"","sources":["../../src/discovery/fireworks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACN,0BAA0B,GAG1B,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;GAOG;AACH,MAAM,OAAO,mBAAoB,SAAQ,0BAA0B;IACzD,UAAU,GAAG,WAAW,CAAC;IACzB,YAAY,GAAG,cAAc,CAAC;IAC9B,OAAO,GAAG,oCAAoC,CAAC;IAExD;;;;;OAKG;IACO,eAAe,CAAC,KAA4B;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,2DAA2D;QAC3D,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAE9C,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,iEAAiE;QACjE,MAAM,SAAS,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAClE,MAAM,cAAc,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QAE/C,4DAA4D;QAC5D,MAAM,cAAc,GAAG,IAAI,CAAC,uBAAuB,CAClD,cAAc,EACd;YACC,CAAC,OAAO,EAAE,MAAM,CAAC;YACjB,CAAC,SAAS,EAAE,SAAS,CAAC;YACtB,CAAC,SAAS,EAAE,SAAS,CAAC;YACtB,CAAC,WAAW,EAAE,SAAS,CAAC;YACxB,CAAC,WAAW,EAAE,SAAS,CAAC;YACxB,CAAC,MAAM,EAAE,MAAM,CAAC;YAChB,CAAC,OAAO,EAAE,QAAQ,CAAC;YACnB,CAAC,UAAU,EAAE,UAAU,CAAC;YACxB,CAAC,KAAK,EAAE,WAAW,CAAC;SACpB,EACD,WAAW,CACX,CAAC;QAEF,qCAAqC;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;QAE5D,qCAAqC;QACrC,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACP,uCAAuC;YACvC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE1B,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,qDAAqD;YACrD,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1D,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACvC,CAAC;QACF,CAAC;QAED,OAAO;YACN,cAAc;YACd,IAAI;YACJ,YAAY;SACZ,CAAC;IACH,CAAC;CACD"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * kosha-discovery — GLM (Zhipu) provider discoverer.
3
+ *
4
+ * GLM is exposed via Zhipu's OpenAI-compatible API surface.
5
+ * @module
6
+ */
7
+ import type { OpenAICompatibleModel, ModelClassification } from "./openai-compatible.js";
8
+ import { OpenAICompatibleDiscoverer } from "./openai-compatible.js";
9
+ export declare class GLMDiscoverer extends OpenAICompatibleDiscoverer {
10
+ readonly providerId = "glm";
11
+ readonly providerName = "GLM (Zhipu)";
12
+ readonly baseUrl = "https://open.bigmodel.cn/api/paas/v4";
13
+ protected modelListEndpoints(): string[];
14
+ protected isRelevantModel(model: OpenAICompatibleModel): boolean;
15
+ protected classifyModel(model: OpenAICompatibleModel): ModelClassification;
16
+ }
17
+ //# sourceMappingURL=glm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glm.d.ts","sourceRoot":"","sources":["../../src/discovery/glm.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,aAAc,SAAQ,0BAA0B;IAC5D,QAAQ,CAAC,UAAU,SAAS;IAC5B,QAAQ,CAAC,YAAY,iBAAiB;IACtC,QAAQ,CAAC,OAAO,0CAA0C;IAE1D,SAAS,CAAC,kBAAkB,IAAI,MAAM,EAAE;IAOxC,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO;IAIhE,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB;CA8B1E"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * kosha-discovery — GLM (Zhipu) provider discoverer.
3
+ *
4
+ * GLM is exposed via Zhipu's OpenAI-compatible API surface.
5
+ * @module
6
+ */
7
+ import { OpenAICompatibleDiscoverer } from "./openai-compatible.js";
8
+ export class GLMDiscoverer extends OpenAICompatibleDiscoverer {
9
+ providerId = "glm";
10
+ providerName = "GLM (Zhipu)";
11
+ baseUrl = "https://open.bigmodel.cn/api/paas/v4";
12
+ modelListEndpoints() {
13
+ return [
14
+ `${this.baseUrl}/models`,
15
+ `${this.baseUrl}/v1/models`,
16
+ ];
17
+ }
18
+ isRelevantModel(model) {
19
+ return !model.id.startsWith("ft:");
20
+ }
21
+ classifyModel(model) {
22
+ const lower = model.id.toLowerCase();
23
+ const originProvider = "zhipu";
24
+ if (this.looksLikeEmbedding(lower) || lower.includes("embedding")) {
25
+ return {
26
+ originProvider,
27
+ mode: "embedding",
28
+ capabilities: ["embedding"],
29
+ contextWindow: model.context_window,
30
+ maxOutputTokens: model.max_output_tokens,
31
+ maxInputTokens: model.max_input_tokens,
32
+ dimensions: model.output_vector_size,
33
+ };
34
+ }
35
+ const capabilities = ["chat", "function_calling"];
36
+ if (this.looksLikeVision(lower) || lower.includes("glm-4v") || lower.includes("cogvlm"))
37
+ capabilities.push("vision");
38
+ if (this.looksLikeCode(lower) || lower.includes("codegeex"))
39
+ capabilities.push("code");
40
+ if (lower.includes("4") || lower.includes("air") || lower.includes("plus"))
41
+ capabilities.push("nlu");
42
+ return {
43
+ originProvider,
44
+ mode: "chat",
45
+ capabilities,
46
+ contextWindow: model.context_window,
47
+ maxOutputTokens: model.max_output_tokens,
48
+ maxInputTokens: model.max_input_tokens,
49
+ };
50
+ }
51
+ }
52
+ //# sourceMappingURL=glm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glm.js","sourceRoot":"","sources":["../../src/discovery/glm.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEpE,MAAM,OAAO,aAAc,SAAQ,0BAA0B;IACnD,UAAU,GAAG,KAAK,CAAC;IACnB,YAAY,GAAG,aAAa,CAAC;IAC7B,OAAO,GAAG,sCAAsC,CAAC;IAEhD,kBAAkB;QAC3B,OAAO;YACN,GAAG,IAAI,CAAC,OAAO,SAAS;YACxB,GAAG,IAAI,CAAC,OAAO,YAAY;SAC3B,CAAC;IACH,CAAC;IAES,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;QACrC,MAAM,cAAc,GAAG,OAAO,CAAC;QAE/B,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACnE,OAAO;gBACN,cAAc;gBACd,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,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrH,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvF,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAErG,OAAO;YACN,cAAc;YACd,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,53 @@
1
+ /**
2
+ * kosha-discovery — Google / Gemini provider discoverer.
3
+ *
4
+ * Queries the Google Generative Language API (`/v1beta/models`) to enumerate
5
+ * all Gemini models. Unlike most providers, this API is "rich" — it returns
6
+ * context window sizes (`inputTokenLimit`, `outputTokenLimit`) and supported
7
+ * generation methods directly, so we can populate those fields without
8
+ * relying on enrichment.
9
+ * @module
10
+ */
11
+ import type { CredentialResult, ModelCard } from "../types.js";
12
+ import { BaseDiscoverer } from "./base.js";
13
+ /**
14
+ * Discovers models available through the Google Generative Language API.
15
+ *
16
+ * Authentication is via an API key passed as a query parameter.
17
+ * The endpoint uses token-based pagination (`nextPageToken`).
18
+ */
19
+ export declare class GoogleDiscoverer extends BaseDiscoverer {
20
+ readonly providerId = "google";
21
+ readonly providerName = "Google";
22
+ readonly baseUrl = "https://generativelanguage.googleapis.com";
23
+ /**
24
+ * Fetch all Gemini models using token-based pagination.
25
+ * @param credential - Must contain an `apiKey` or `accessToken`.
26
+ * @param options - Optional timeout override (default 10 s).
27
+ */
28
+ discover(credential: CredentialResult, options?: {
29
+ timeout?: number;
30
+ }): Promise<ModelCard[]>;
31
+ /**
32
+ * Build the paginated list URL with API key and optional page token.
33
+ */
34
+ private buildUrl;
35
+ /**
36
+ * Convert a Google API model object into a normalized {@link ModelCard}.
37
+ *
38
+ * The Google API returns model names prefixed with "models/" (e.g.
39
+ * "models/gemini-2.5-pro"), so we strip that prefix to get the bare ID.
40
+ */
41
+ private toModelCard;
42
+ /**
43
+ * Determine the primary {@link ModelMode} from the model's generation methods.
44
+ */
45
+ private inferMode;
46
+ /**
47
+ * Infer capability flags from the model's metadata and ID.
48
+ *
49
+ * Gemini Pro, Ultra, and Flash variants support function calling and vision.
50
+ */
51
+ private inferCapabilities;
52
+ }
53
+ //# sourceMappingURL=google.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/discovery/google.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAa,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,cAAc,EAA2B,MAAM,WAAW,CAAC;AAsBpE;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,cAAc;IACnD,QAAQ,CAAC,UAAU,YAAY;IAC/B,QAAQ,CAAC,YAAY,YAAY;IACjC,QAAQ,CAAC,OAAO,+CAA+C;IAE/D;;;;OAIG;IACG,QAAQ,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAsBlG;;OAEG;IACH,OAAO,CAAC,QAAQ;IAQhB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAmBnB;;OAEG;IACH,OAAO,CAAC,SAAS;IAYjB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;CA+BzB"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * kosha-discovery — Google / Gemini provider discoverer.
3
+ *
4
+ * Queries the Google Generative Language API (`/v1beta/models`) to enumerate
5
+ * all Gemini models. Unlike most providers, this API is "rich" — it returns
6
+ * context window sizes (`inputTokenLimit`, `outputTokenLimit`) and supported
7
+ * generation methods directly, so we can populate those fields without
8
+ * relying on enrichment.
9
+ * @module
10
+ */
11
+ import { BaseDiscoverer, MAX_MODELS_PER_PROVIDER } from "./base.js";
12
+ /**
13
+ * Discovers models available through the Google Generative Language API.
14
+ *
15
+ * Authentication is via an API key passed as a query parameter.
16
+ * The endpoint uses token-based pagination (`nextPageToken`).
17
+ */
18
+ export class GoogleDiscoverer extends BaseDiscoverer {
19
+ providerId = "google";
20
+ providerName = "Google";
21
+ baseUrl = "https://generativelanguage.googleapis.com";
22
+ /**
23
+ * Fetch all Gemini models using token-based pagination.
24
+ * @param credential - Must contain an `apiKey` or `accessToken`.
25
+ * @param options - Optional timeout override (default 10 s).
26
+ */
27
+ async discover(credential, options) {
28
+ const apiKey = credential.apiKey ?? credential.accessToken;
29
+ if (!apiKey) {
30
+ return [];
31
+ }
32
+ const timeoutMs = this.validateTimeout(options?.timeout);
33
+ const allModels = [];
34
+ let pageToken;
35
+ // Token-based pagination: keep fetching while a nextPageToken is returned
36
+ do {
37
+ const url = this.buildUrl(apiKey, pageToken);
38
+ const response = await this.fetchJSON(url, undefined, timeoutMs);
39
+ allModels.push(...response.models);
40
+ pageToken = response.nextPageToken;
41
+ if (allModels.length >= MAX_MODELS_PER_PROVIDER)
42
+ break;
43
+ } while (pageToken);
44
+ return allModels.map((model) => this.toModelCard(model));
45
+ }
46
+ /**
47
+ * Build the paginated list URL with API key and optional page token.
48
+ */
49
+ buildUrl(apiKey, pageToken) {
50
+ let url = `${this.baseUrl}/v1beta/models?key=${apiKey}&pageSize=100`;
51
+ if (pageToken) {
52
+ url += `&pageToken=${pageToken}`;
53
+ }
54
+ return url;
55
+ }
56
+ /**
57
+ * Convert a Google API model object into a normalized {@link ModelCard}.
58
+ *
59
+ * The Google API returns model names prefixed with "models/" (e.g.
60
+ * "models/gemini-2.5-pro"), so we strip that prefix to get the bare ID.
61
+ */
62
+ toModelCard(model) {
63
+ // Strip the "models/" prefix that Google prepends to every model name
64
+ const id = model.name.startsWith("models/") ? model.name.slice(7) : model.name;
65
+ const mode = this.inferMode(model);
66
+ const capabilities = this.inferCapabilities(model);
67
+ return this.makeCard({
68
+ id,
69
+ name: model.displayName || id,
70
+ provider: this.providerId,
71
+ mode,
72
+ capabilities,
73
+ // Google's API is "rich" — it gives us context windows directly
74
+ contextWindow: model.inputTokenLimit ?? 0,
75
+ maxOutputTokens: model.outputTokenLimit ?? 0,
76
+ maxInputTokens: model.inputTokenLimit ?? undefined,
77
+ });
78
+ }
79
+ /**
80
+ * Determine the primary {@link ModelMode} from the model's generation methods.
81
+ */
82
+ inferMode(model) {
83
+ const methods = model.supportedGenerationMethods ?? [];
84
+ const displayLower = (model.displayName ?? "").toLowerCase();
85
+ // Embedding models expose the "embedContent" generation method
86
+ if (methods.includes("embedContent") || displayLower.includes("embedding")) {
87
+ return "embedding";
88
+ }
89
+ return "chat";
90
+ }
91
+ /**
92
+ * Infer capability flags from the model's metadata and ID.
93
+ *
94
+ * Gemini Pro, Ultra, and Flash variants support function calling and vision.
95
+ */
96
+ inferCapabilities(model) {
97
+ const methods = model.supportedGenerationMethods ?? [];
98
+ const displayLower = (model.displayName ?? "").toLowerCase();
99
+ const capabilities = [];
100
+ if (methods.includes("embedContent") || displayLower.includes("embedding")) {
101
+ return ["embedding"];
102
+ }
103
+ if (methods.includes("generateContent")) {
104
+ capabilities.push("chat");
105
+ }
106
+ // Gemini models generally support code and NLU
107
+ const id = model.name.toLowerCase();
108
+ if (id.includes("gemini")) {
109
+ capabilities.push("code", "nlu");
110
+ // Pro, Ultra, and Flash variants support function calling
111
+ if (id.includes("pro") || id.includes("ultra") || id.includes("flash")) {
112
+ capabilities.push("function_calling");
113
+ }
114
+ // These same variants also support multimodal vision input
115
+ if (id.includes("pro") || id.includes("ultra") || id.includes("flash")) {
116
+ capabilities.push("vision");
117
+ }
118
+ }
119
+ return capabilities.length > 0 ? capabilities : ["chat"];
120
+ }
121
+ }
122
+ //# sourceMappingURL=google.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/discovery/google.ts"],"names":[],"mappings":"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"}