@krmxd/onegpt 2.0.0-beta.1

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/src/catalog.js ADDED
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+
3
+ // OGPT model catalog - curated models with the oGPT-(number)(alphabet) naming scheme.
4
+ // class digit = capability tier, lowercase letter = variant within the class.
5
+
6
+ const MODEL_CATALOG = {
7
+ // --- Local models ---
8
+ "qwen2.5-coder:0.5b": { ogpt: "oGPT-0a", tier: "fast", ram_gb: 4, size: "400 MB", desc: "Ultra-light coder" },
9
+ "qwen2.5-coder:1.5b": { ogpt: "oGPT-1a", tier: "fast", ram_gb: 6, size: "1 GB", desc: "Fast coding model" },
10
+ "qwen2.5-coder:3b": { ogpt: "oGPT-1b", tier: "fast", ram_gb: 8, size: "1.9 GB", desc: "Light coder, better quality" },
11
+ "llama3.2:3b": { ogpt: "oGPT-1c", tier: "fast", ram_gb: 8, size: "2 GB", desc: "Fast general chat" },
12
+ "qwen2.5-coder:7b": { ogpt: "oGPT-2a", tier: "balanced", ram_gb: 12, size: "4.7 GB", desc: "Best coding value" },
13
+ "llama3.1:8b": { ogpt: "oGPT-2c", tier: "balanced", ram_gb: 12, size: "4.9 GB", desc: "Solid general purpose" },
14
+ "qwen2.5-coder:14b": { ogpt: "oGPT-2b", tier: "balanced", ram_gb: 16, size: "9 GB", desc: "Heavy-duty coder" },
15
+ "deepseek-coder-v2:16b": { ogpt: "oGPT-2d", tier: "balanced", ram_gb: 20, size: "8.9 GB", desc: "MoE code + chat" },
16
+ "qwen2.5-coder:32b": { ogpt: "oGPT-3a", tier: "pro", ram_gb: 32, size: "20 GB", desc: "Flagship local coder" },
17
+ // --- Cloud providers ---
18
+ "gpt-4o-mini": { ogpt: "oGPT-4b", tier: "cloud", provider: "openai", desc: "Cheap & quick" },
19
+ "gpt-4o": { ogpt: "oGPT-4a", tier: "cloud", provider: "openai", desc: "OpenAI flagship" },
20
+ "claude-3-5-haiku-20241022": { ogpt: "oGPT-5b", tier: "cloud", provider: "anthropic", desc: "Fast Claude" },
21
+ "claude-sonnet-4-20250514": { ogpt: "oGPT-5a", tier: "cloud", provider: "anthropic", desc: "Anthropic flagship" },
22
+ "gemini-2.0-flash": { ogpt: "oGPT-6a", tier: "cloud", provider: "google", desc: "Fast Gemini" },
23
+ "gemini-1.5-pro": { ogpt: "oGPT-6b", tier: "cloud", provider: "google", desc: "Long-context Gemini" },
24
+ };
25
+
26
+ const OGPT_RE = /^ogpt-(\d+)([a-z])$/i;
27
+
28
+ const BY_OGPT = {};
29
+ for (const [id, e] of Object.entries(MODEL_CATALOG)) {
30
+ BY_OGPT[e.ogpt.toLowerCase()] = id;
31
+ }
32
+
33
+ function displayName(modelId) {
34
+ const e = MODEL_CATALOG[modelId];
35
+ return e ? e.ogpt : modelId;
36
+ }
37
+
38
+ function resolveModel(name) {
39
+ if (!name) return "";
40
+ name = String(name).trim();
41
+ if (MODEL_CATALOG[name]) return name;
42
+ const m = OGPT_RE.exec(name);
43
+ if (m) return BY_OGPT[`ogpt-${m[1]}${m[2].toLowerCase()}`] || "";
44
+ const stripped = name.toLowerCase().replace(/^(o|og|g)?pt-?/, "");
45
+ if (OGPT_RE.test("ogpt-" + stripped)) return BY_OGPT["ogpt-" + stripped] || "";
46
+ return "";
47
+ }
48
+
49
+ function isOgptName(name) {
50
+ return OGPT_RE.test(name || "");
51
+ }
52
+
53
+ function recommendForRam(ramGB) {
54
+ let bestId = "";
55
+ let bestKey = -1;
56
+ for (const [id, e] of Object.entries(MODEL_CATALOG)) {
57
+ if (e.provider || e.tier === "cloud") continue;
58
+ if (ramGB + 0.01 >= e.ram_gb) {
59
+ const bonus = id.includes("coder") ? 0.5 : 0;
60
+ const key = e.ram_gb + bonus;
61
+ if (key >= bestKey) {
62
+ bestKey = key;
63
+ bestId = id;
64
+ }
65
+ }
66
+ }
67
+ return bestId || "qwen2.5-coder:1.5b";
68
+ }
69
+
70
+ function tierRouting() {
71
+ const caps = { fast: 6, balanced: 14, pro: 64 };
72
+ const out = {};
73
+ const sorted = Object.entries(MODEL_CATALOG).sort((a, b) => (a[1].ram_gb || 0) - (b[1].ram_gb || 0));
74
+ for (const [id, e] of sorted) {
75
+ if (e.provider || e.tier === "cloud" || !(e.tier in caps)) continue;
76
+ if (e.ram_gb <= caps[e.tier] && (id.includes("coder") || !out[e.tier])) {
77
+ out[e.tier] = id;
78
+ }
79
+ }
80
+ return out;
81
+ }
82
+
83
+ function entries(provider) {
84
+ return Object.entries(MODEL_CATALOG)
85
+ .filter(([id, e]) => {
86
+ if (!provider) return true;
87
+ if (provider === "ollama") return !e.provider;
88
+ return e.provider === provider;
89
+ })
90
+ .sort((a, b) => a[1].ogpt.localeCompare(b[1].ogpt));
91
+ }
92
+
93
+ function ogptNamesMap() {
94
+ const out = {};
95
+ for (const [id, e] of Object.entries(MODEL_CATALOG)) out[id] = e.ogpt;
96
+ return out;
97
+ }
98
+
99
+ module.exports = {
100
+ MODEL_CATALOG,
101
+ displayName,
102
+ resolveModel,
103
+ isOgptName,
104
+ recommendForRam,
105
+ tierRouting,
106
+ entries,
107
+ ogptNamesMap,
108
+ };