llm-checker 3.2.0 → 3.2.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/README.md +14 -0
- package/analyzer/compatibility.js +20 -0
- package/bin/cli.js +14 -0
- package/bin/enhanced_cli.js +133 -36
- package/package.json +5 -3
- package/src/ai/multi-objective-selector.js +28 -4
- package/src/hardware/backends/cuda-detector.js +32 -11
- package/src/hardware/detector.js +107 -5
- package/src/hardware/specs.js +8 -1
- package/src/index.js +77 -11
- package/src/models/expanded_database.js +8 -2
- package/src/models/scoring-engine.js +4 -0
- package/src/models/speculative-decoding-estimator.js +245 -0
- package/src/runtime/runtime-support.js +174 -0
- package/bin/CLAUDE.md +0 -27
- package/src/CLAUDE.md +0 -18
- package/src/data/CLAUDE.md +0 -17
- package/src/hardware/CLAUDE.md +0 -18
- package/src/hardware/backends/CLAUDE.md +0 -17
- package/src/models/CLAUDE.md +0 -23
- package/src/ollama/CLAUDE.md +0 -30
- package/src/plugins/CLAUDE.md +0 -17
- package/src/utils/CLAUDE.md +0 -17
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
const {
|
|
2
|
+
normalizeRuntime,
|
|
3
|
+
runtimeSupportsSpeculativeDecoding,
|
|
4
|
+
runtimeSupportedOnHardware,
|
|
5
|
+
getRuntimeModelRef
|
|
6
|
+
} = require('../runtime/runtime-support');
|
|
7
|
+
|
|
8
|
+
class SpeculativeDecodingEstimator {
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
this.minDraftRatio = options.minDraftRatio || 0.1;
|
|
11
|
+
this.maxDraftRatio = options.maxDraftRatio || 0.65;
|
|
12
|
+
this.idealDraftRatio = options.idealDraftRatio || 0.28;
|
|
13
|
+
|
|
14
|
+
this.knownFamilies = [
|
|
15
|
+
'llama',
|
|
16
|
+
'qwen',
|
|
17
|
+
'mistral',
|
|
18
|
+
'mixtral',
|
|
19
|
+
'gemma',
|
|
20
|
+
'phi',
|
|
21
|
+
'deepseek',
|
|
22
|
+
'yi',
|
|
23
|
+
'command-r'
|
|
24
|
+
];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
estimate({ model, candidates = [], hardware = {}, runtime = 'ollama' } = {}) {
|
|
28
|
+
const selectedRuntime = normalizeRuntime(runtime);
|
|
29
|
+
|
|
30
|
+
if (!runtimeSupportsSpeculativeDecoding(selectedRuntime)) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const targetParams = this.extractParams(model);
|
|
35
|
+
if (!targetParams || targetParams < 2) {
|
|
36
|
+
return {
|
|
37
|
+
runtime: selectedRuntime,
|
|
38
|
+
supported: true,
|
|
39
|
+
enabled: false,
|
|
40
|
+
reason: 'Target model is too small for meaningful speculative decoding gains.'
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const family = this.extractFamily(model);
|
|
45
|
+
const draftCandidate = this.selectDraftCandidate(model, candidates, family, targetParams);
|
|
46
|
+
|
|
47
|
+
if (!draftCandidate) {
|
|
48
|
+
const suggestedDraftParams = this.getSuggestedDraftParams(targetParams);
|
|
49
|
+
const estimatedSpeedup = this.estimateSpeedup({
|
|
50
|
+
targetParams,
|
|
51
|
+
draftParams: suggestedDraftParams,
|
|
52
|
+
runtime: selectedRuntime,
|
|
53
|
+
hardware,
|
|
54
|
+
model
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
runtime: selectedRuntime,
|
|
59
|
+
supported: true,
|
|
60
|
+
enabled: false,
|
|
61
|
+
estimatedSpeedup: Number(estimatedSpeedup.toFixed(2)),
|
|
62
|
+
estimatedThroughputGainPct: Math.round((estimatedSpeedup - 1) * 100),
|
|
63
|
+
suggestedDraftModel: family ? `${family} ~${suggestedDraftParams}B` : `~${suggestedDraftParams}B draft`,
|
|
64
|
+
reason: 'No compatible draft model found in the current shortlist.'
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const draftParams = draftCandidate.params;
|
|
69
|
+
const estimatedSpeedup = this.estimateSpeedup({
|
|
70
|
+
targetParams,
|
|
71
|
+
draftParams,
|
|
72
|
+
runtime: selectedRuntime,
|
|
73
|
+
hardware,
|
|
74
|
+
model
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
const confidence = this.estimateConfidence({
|
|
78
|
+
family,
|
|
79
|
+
targetParams,
|
|
80
|
+
draftParams,
|
|
81
|
+
runtime: selectedRuntime,
|
|
82
|
+
hardware
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
return {
|
|
86
|
+
runtime: selectedRuntime,
|
|
87
|
+
supported: true,
|
|
88
|
+
enabled: true,
|
|
89
|
+
targetModelRef: getRuntimeModelRef(model, selectedRuntime),
|
|
90
|
+
draftModel: draftCandidate.model.name || draftCandidate.model.model_identifier || 'draft-model',
|
|
91
|
+
draftModelRef: getRuntimeModelRef(draftCandidate.model, selectedRuntime),
|
|
92
|
+
targetParams,
|
|
93
|
+
draftParams,
|
|
94
|
+
draftToTargetRatio: Number((draftParams / targetParams).toFixed(2)),
|
|
95
|
+
estimatedSpeedup: Number(estimatedSpeedup.toFixed(2)),
|
|
96
|
+
estimatedThroughputGainPct: Math.round((estimatedSpeedup - 1) * 100),
|
|
97
|
+
confidence: Number(confidence.toFixed(2)),
|
|
98
|
+
notes: this.buildNotes(selectedRuntime, family, estimatedSpeedup)
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
extractParams(model = {}) {
|
|
103
|
+
const direct = Number(model.params_b || model.paramsB);
|
|
104
|
+
if (Number.isFinite(direct) && direct > 0) {
|
|
105
|
+
return direct;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const sources = [
|
|
109
|
+
model.size,
|
|
110
|
+
model.name,
|
|
111
|
+
model.model_identifier,
|
|
112
|
+
model.ollamaTag,
|
|
113
|
+
model.ollamaId
|
|
114
|
+
].filter(Boolean);
|
|
115
|
+
|
|
116
|
+
for (const source of sources) {
|
|
117
|
+
const text = String(source).toLowerCase();
|
|
118
|
+
const match = text.match(/(\d+(\.\d+)?)\s*b\b/i);
|
|
119
|
+
if (match) {
|
|
120
|
+
const params = Number(match[1]);
|
|
121
|
+
if (Number.isFinite(params) && params > 0) {
|
|
122
|
+
return params;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
extractFamily(model = {}) {
|
|
131
|
+
const text = String(
|
|
132
|
+
model.model_identifier ||
|
|
133
|
+
model.ollamaId ||
|
|
134
|
+
model.ollamaTag ||
|
|
135
|
+
model.name ||
|
|
136
|
+
''
|
|
137
|
+
).toLowerCase();
|
|
138
|
+
|
|
139
|
+
for (const family of this.knownFamilies) {
|
|
140
|
+
if (text.includes(family)) {
|
|
141
|
+
return family;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return '';
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
selectDraftCandidate(model, candidates, targetFamily, targetParams) {
|
|
149
|
+
const normalizedTargetName = String(model?.name || model?.model_identifier || '').toLowerCase();
|
|
150
|
+
|
|
151
|
+
const draftCandidates = candidates
|
|
152
|
+
.map((candidate) => {
|
|
153
|
+
const params = this.extractParams(candidate);
|
|
154
|
+
const family = this.extractFamily(candidate);
|
|
155
|
+
const ratio = params && targetParams ? params / targetParams : null;
|
|
156
|
+
|
|
157
|
+
return { model: candidate, params, family, ratio };
|
|
158
|
+
})
|
|
159
|
+
.filter((candidate) => {
|
|
160
|
+
const candidateName = String(candidate.model?.name || candidate.model?.model_identifier || '').toLowerCase();
|
|
161
|
+
if (!candidate.params || candidate.params >= targetParams) return false;
|
|
162
|
+
if (!candidate.ratio || candidate.ratio < this.minDraftRatio || candidate.ratio > this.maxDraftRatio) return false;
|
|
163
|
+
if (candidateName === normalizedTargetName) return false;
|
|
164
|
+
|
|
165
|
+
// Prefer same-family models due to tokenizer/embedding compatibility.
|
|
166
|
+
if (targetFamily && candidate.family) {
|
|
167
|
+
return targetFamily === candidate.family;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return true;
|
|
171
|
+
})
|
|
172
|
+
.sort((a, b) => {
|
|
173
|
+
// Prefer ratio close to ideal draft ratio.
|
|
174
|
+
const scoreA = Math.abs((a.ratio || 0) - this.idealDraftRatio);
|
|
175
|
+
const scoreB = Math.abs((b.ratio || 0) - this.idealDraftRatio);
|
|
176
|
+
return scoreA - scoreB;
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
return draftCandidates[0] || null;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
estimateSpeedup({ targetParams, draftParams, runtime, hardware, model }) {
|
|
183
|
+
const ratio = Math.max(1.01, targetParams / Math.max(0.1, draftParams));
|
|
184
|
+
|
|
185
|
+
// Base heuristic: diminishing returns as ratio grows.
|
|
186
|
+
let speedup = 1.05 + Math.log2(ratio) * 0.45;
|
|
187
|
+
|
|
188
|
+
if (ratio > 6) {
|
|
189
|
+
speedup -= 0.12;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (runtime === 'vllm') {
|
|
193
|
+
speedup += 0.12;
|
|
194
|
+
} else if (runtime === 'mlx') {
|
|
195
|
+
speedup += 0.08;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (runtime === 'mlx' && runtimeSupportedOnHardware('mlx', hardware)) {
|
|
199
|
+
speedup += 0.08;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (model?.is_moe || model?.isMoE) {
|
|
203
|
+
speedup *= 0.92;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return Math.max(1.1, Math.min(2.8, speedup));
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
estimateConfidence({ family, targetParams, draftParams, runtime, hardware }) {
|
|
210
|
+
let confidence = 0.55;
|
|
211
|
+
const ratio = draftParams / targetParams;
|
|
212
|
+
|
|
213
|
+
if (family) confidence += 0.15;
|
|
214
|
+
if (ratio >= 0.2 && ratio <= 0.4) confidence += 0.15;
|
|
215
|
+
if (runtime === 'vllm') confidence += 0.05;
|
|
216
|
+
if (runtime === 'mlx') confidence += 0.03;
|
|
217
|
+
|
|
218
|
+
if (runtime === 'mlx' && runtimeSupportedOnHardware('mlx', hardware)) {
|
|
219
|
+
confidence += 0.05;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return Math.min(0.95, confidence);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
getSuggestedDraftParams(targetParams) {
|
|
226
|
+
const draft = Math.max(1, targetParams * this.idealDraftRatio);
|
|
227
|
+
return Number(draft.toFixed(1));
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
buildNotes(runtime, family, speedup) {
|
|
231
|
+
const notes = [];
|
|
232
|
+
if (family) {
|
|
233
|
+
notes.push(`Same-family draft model (${family}) improves tokenizer/embedding alignment.`);
|
|
234
|
+
}
|
|
235
|
+
if (runtime === 'vllm') {
|
|
236
|
+
notes.push('Use --speculative-model in vLLM to enable speculative decoding.');
|
|
237
|
+
} else if (runtime === 'mlx') {
|
|
238
|
+
notes.push('MLX-LM speculative decoding works best with unified memory on Apple Silicon.');
|
|
239
|
+
}
|
|
240
|
+
notes.push(`Estimated throughput multiplier: x${speedup.toFixed(2)}.`);
|
|
241
|
+
return notes;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
module.exports = SpeculativeDecodingEstimator;
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
const SUPPORTED_RUNTIMES = ['ollama', 'vllm', 'mlx'];
|
|
2
|
+
|
|
3
|
+
function normalizeRuntime(runtime = 'ollama') {
|
|
4
|
+
const normalized = String(runtime || 'ollama').trim().toLowerCase();
|
|
5
|
+
return SUPPORTED_RUNTIMES.includes(normalized) ? normalized : 'ollama';
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function getRuntimeDisplayName(runtime = 'ollama') {
|
|
9
|
+
const normalized = normalizeRuntime(runtime);
|
|
10
|
+
if (normalized === 'vllm') return 'vLLM';
|
|
11
|
+
if (normalized === 'mlx') return 'MLX-LM';
|
|
12
|
+
return 'Ollama';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function isAppleSiliconHardware(hardware = {}) {
|
|
16
|
+
const osPlatform = String(hardware?.os?.platform || '').toLowerCase();
|
|
17
|
+
const arch = String(
|
|
18
|
+
hardware?.cpu?.architecture ||
|
|
19
|
+
hardware?.summary?.architecture ||
|
|
20
|
+
''
|
|
21
|
+
).toLowerCase();
|
|
22
|
+
const cpuBrand = String(hardware?.cpu?.brand || '').toLowerCase();
|
|
23
|
+
const gpuModel = String(hardware?.gpu?.model || '').toLowerCase();
|
|
24
|
+
const isDarwin = osPlatform === 'darwin' || osPlatform === 'macos';
|
|
25
|
+
const hasAppleChipSignal =
|
|
26
|
+
arch.includes('apple silicon') ||
|
|
27
|
+
cpuBrand.includes('apple') ||
|
|
28
|
+
gpuModel.includes('apple');
|
|
29
|
+
|
|
30
|
+
// Prefer explicit Apple signals and avoid treating generic Linux ARM64 as Apple Silicon.
|
|
31
|
+
if (isDarwin) {
|
|
32
|
+
return arch === 'arm64' || hasAppleChipSignal;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Fallback for partial hardware payloads that still expose Apple-specific identifiers.
|
|
36
|
+
return hasAppleChipSignal;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function runtimeSupportedOnHardware(runtime = 'ollama', hardware = {}) {
|
|
40
|
+
const normalized = normalizeRuntime(runtime);
|
|
41
|
+
if (normalized === 'mlx') {
|
|
42
|
+
return isAppleSiliconHardware(hardware);
|
|
43
|
+
}
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function runtimeSupportsSpeculativeDecoding(runtime = 'ollama') {
|
|
48
|
+
const normalized = normalizeRuntime(runtime);
|
|
49
|
+
return normalized === 'vllm' || normalized === 'mlx';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function shellEscapeArg(value = '') {
|
|
53
|
+
const text = String(value || '');
|
|
54
|
+
if (!text) return "''";
|
|
55
|
+
return `'${text.replace(/'/g, `'\\''`)}'`;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function extractFromInstallCommand(command = '') {
|
|
59
|
+
const match = String(command).match(/ollama\s+pull\s+(.+)$/i);
|
|
60
|
+
return match ? match[1].trim() : '';
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function slugifyModelName(text = '') {
|
|
64
|
+
return String(text)
|
|
65
|
+
.toLowerCase()
|
|
66
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
67
|
+
.replace(/^-+|-+$/g, '') || 'model';
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function getRuntimeModelRef(model = {}, runtime = 'ollama') {
|
|
71
|
+
const normalized = normalizeRuntime(runtime);
|
|
72
|
+
|
|
73
|
+
const candidates = [
|
|
74
|
+
model.hfModel,
|
|
75
|
+
model.hfId,
|
|
76
|
+
model.huggingfaceId,
|
|
77
|
+
model.model_identifier,
|
|
78
|
+
model.identifier,
|
|
79
|
+
model.cloudData?.identifier,
|
|
80
|
+
model.ollamaTag,
|
|
81
|
+
extractFromInstallCommand(model.installation?.ollama),
|
|
82
|
+
model.ollamaId,
|
|
83
|
+
model.name
|
|
84
|
+
].filter(Boolean);
|
|
85
|
+
|
|
86
|
+
const raw = String(candidates[0] || '').trim();
|
|
87
|
+
if (!raw) return 'model';
|
|
88
|
+
|
|
89
|
+
if (normalized === 'ollama') {
|
|
90
|
+
return raw;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (raw.includes('/')) {
|
|
94
|
+
return raw;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Remove Ollama-style tag suffix for non-Ollama runtimes.
|
|
98
|
+
const base = raw.split(':')[0].trim();
|
|
99
|
+
if (base) {
|
|
100
|
+
return /\s/.test(base) ? slugifyModelName(base) : base;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return slugifyModelName(raw);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function getRuntimeInstallCommand(runtime = 'ollama') {
|
|
107
|
+
const normalized = normalizeRuntime(runtime);
|
|
108
|
+
|
|
109
|
+
if (normalized === 'vllm') {
|
|
110
|
+
return 'pip install -U "vllm>=0.6.0"';
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (normalized === 'mlx') {
|
|
114
|
+
return 'pip install -U mlx-lm';
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return 'ollama --version || (brew install ollama)';
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function getRuntimePullCommand(model = {}, runtime = 'ollama') {
|
|
121
|
+
const normalized = normalizeRuntime(runtime);
|
|
122
|
+
const modelRef = getRuntimeModelRef(model, runtime);
|
|
123
|
+
|
|
124
|
+
if (normalized === 'vllm') {
|
|
125
|
+
return `huggingface-cli download ${shellEscapeArg(modelRef)}`;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (normalized === 'mlx') {
|
|
129
|
+
const localName = slugifyModelName(modelRef);
|
|
130
|
+
return `python -m mlx_lm.convert --hf-path ${shellEscapeArg(modelRef)} --mlx-path ./models/${localName}`;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return `ollama pull ${modelRef}`;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function getRuntimeRunCommand(model = {}, runtime = 'ollama') {
|
|
137
|
+
const normalized = normalizeRuntime(runtime);
|
|
138
|
+
const modelRef = getRuntimeModelRef(model, runtime);
|
|
139
|
+
|
|
140
|
+
if (normalized === 'vllm') {
|
|
141
|
+
return `python -m vllm.entrypoints.openai.api_server --model ${shellEscapeArg(modelRef)} --host 0.0.0.0 --port 8000`;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (normalized === 'mlx') {
|
|
145
|
+
return `python -m mlx_lm.generate --model ${shellEscapeArg(modelRef)} --prompt "Hello"`;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return `ollama run ${modelRef}`;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function getRuntimeCommandSet(model = {}, runtime = 'ollama') {
|
|
152
|
+
const normalized = normalizeRuntime(runtime);
|
|
153
|
+
return {
|
|
154
|
+
runtime: normalized,
|
|
155
|
+
displayName: getRuntimeDisplayName(normalized),
|
|
156
|
+
modelRef: getRuntimeModelRef(model, normalized),
|
|
157
|
+
install: getRuntimeInstallCommand(normalized),
|
|
158
|
+
pull: getRuntimePullCommand(model, normalized),
|
|
159
|
+
run: getRuntimeRunCommand(model, normalized)
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
module.exports = {
|
|
164
|
+
SUPPORTED_RUNTIMES,
|
|
165
|
+
normalizeRuntime,
|
|
166
|
+
getRuntimeDisplayName,
|
|
167
|
+
runtimeSupportedOnHardware,
|
|
168
|
+
runtimeSupportsSpeculativeDecoding,
|
|
169
|
+
getRuntimeModelRef,
|
|
170
|
+
getRuntimeInstallCommand,
|
|
171
|
+
getRuntimePullCommand,
|
|
172
|
+
getRuntimeRunCommand,
|
|
173
|
+
getRuntimeCommandSet
|
|
174
|
+
};
|
package/bin/CLAUDE.md
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
<claude-mem-context>
|
|
2
|
-
# Recent Activity
|
|
3
|
-
|
|
4
|
-
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
|
5
|
-
|
|
6
|
-
### Feb 12, 2026
|
|
7
|
-
|
|
8
|
-
| ID | Time | T | Title | Read |
|
|
9
|
-
|----|------|---|-------|------|
|
|
10
|
-
| #3492 | 10:24 PM | 🔵 | Enhanced CLI Structure - Lazy Loading with ASCII Art Branding | ~456 |
|
|
11
|
-
| #3436 | 9:57 PM | 🔵 | Enhanced CLI Implementation - Command-Line Interface with ASCII Art and Ollama Integration | ~575 |
|
|
12
|
-
|
|
13
|
-
### Feb 14, 2026
|
|
14
|
-
|
|
15
|
-
| ID | Time | T | Title | Read |
|
|
16
|
-
|----|------|---|-------|------|
|
|
17
|
-
| #4369 | 7:19 PM | 🟣 | Added 6 advanced MCP-exclusive tools for benchmarking, optimization, and intelligent model management | ~703 |
|
|
18
|
-
| #4368 | " | 🟣 | MCP server implementation added to llm-checker with benchmark tool | ~387 |
|
|
19
|
-
| #4363 | 7:18 PM | 🟣 | MCP tools test suite successfully validates all 7 llm-checker tools | ~551 |
|
|
20
|
-
| #4361 | 7:17 PM | 🟣 | MCP server test suite created for validating Ollama integration tools | ~524 |
|
|
21
|
-
| #4356 | " | 🟣 | Six advanced MCP tools added to llm-checker server beyond CLI wrapping | ~750 |
|
|
22
|
-
| #4349 | 7:15 PM | 🟣 | MCP server implementation exposes 9 tools for LLM hardware analysis and Ollama model management | ~539 |
|
|
23
|
-
| #4341 | 6:49 PM | 🟣 | MCP server implementation committed to llm-checker repository | ~431 |
|
|
24
|
-
| #4339 | " | 🟣 | MCP server implementation and documentation added to llm-checker repository | ~457 |
|
|
25
|
-
| #4338 | " | ✅ | MCP server validated in llm-checker repository structure | ~245 |
|
|
26
|
-
| #4333 | 6:48 PM | 🟣 | MCP server integrated into llm-checker package distribution | ~409 |
|
|
27
|
-
</claude-mem-context>
|
package/src/CLAUDE.md
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
<claude-mem-context>
|
|
2
|
-
# Recent Activity
|
|
3
|
-
|
|
4
|
-
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
|
5
|
-
|
|
6
|
-
### Feb 12, 2026
|
|
7
|
-
|
|
8
|
-
| ID | Time | T | Title | Read |
|
|
9
|
-
|----|------|---|-------|------|
|
|
10
|
-
| #3485 | 10:23 PM | 🔵 | Dead Code in Main Analysis Method - Lines 73-214 Unreachable | ~555 |
|
|
11
|
-
| #3435 | 9:57 PM | 🔵 | Main LLMChecker Class Architecture - Platform-Specific Analysis Engine | ~630 |
|
|
12
|
-
|
|
13
|
-
### Feb 14, 2026
|
|
14
|
-
|
|
15
|
-
| ID | Time | T | Title | Read |
|
|
16
|
-
|----|------|---|-------|------|
|
|
17
|
-
| #4339 | 6:49 PM | 🟣 | MCP server implementation and documentation added to llm-checker repository | ~457 |
|
|
18
|
-
</claude-mem-context>
|
package/src/data/CLAUDE.md
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
<claude-mem-context>
|
|
2
|
-
# Recent Activity
|
|
3
|
-
|
|
4
|
-
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
|
5
|
-
|
|
6
|
-
### Feb 12, 2026
|
|
7
|
-
|
|
8
|
-
| ID | Time | T | Title | Read |
|
|
9
|
-
|----|------|---|-------|------|
|
|
10
|
-
| #3464 | 10:03 PM | 🔵 | SQL Database Schema - Indexed Model Repository with Benchmarks | ~555 |
|
|
11
|
-
|
|
12
|
-
### Feb 14, 2026
|
|
13
|
-
|
|
14
|
-
| ID | Time | T | Title | Read |
|
|
15
|
-
|----|------|---|-------|------|
|
|
16
|
-
| #4339 | 6:49 PM | 🟣 | MCP server implementation and documentation added to llm-checker repository | ~457 |
|
|
17
|
-
</claude-mem-context>
|
package/src/hardware/CLAUDE.md
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
<claude-mem-context>
|
|
2
|
-
# Recent Activity
|
|
3
|
-
|
|
4
|
-
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
|
5
|
-
|
|
6
|
-
### Feb 12, 2026
|
|
7
|
-
|
|
8
|
-
| ID | Time | T | Title | Read |
|
|
9
|
-
|----|------|---|-------|------|
|
|
10
|
-
| #3490 | 10:24 PM | 🔵 | Hardware Detector Cache Implementation - 5-Minute TTL Without Force Refresh Option | ~536 |
|
|
11
|
-
| #3440 | 9:58 PM | 🔵 | Hardware Detection System - Multi-GPU Support with Intelligent Selection | ~611 |
|
|
12
|
-
|
|
13
|
-
### Feb 14, 2026
|
|
14
|
-
|
|
15
|
-
| ID | Time | T | Title | Read |
|
|
16
|
-
|----|------|---|-------|------|
|
|
17
|
-
| #4339 | 6:49 PM | 🟣 | MCP server implementation and documentation added to llm-checker repository | ~457 |
|
|
18
|
-
</claude-mem-context>
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
<claude-mem-context>
|
|
2
|
-
# Recent Activity
|
|
3
|
-
|
|
4
|
-
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
|
5
|
-
|
|
6
|
-
### Feb 12, 2026
|
|
7
|
-
|
|
8
|
-
| ID | Time | T | Title | Read |
|
|
9
|
-
|----|------|---|-------|------|
|
|
10
|
-
| #3453 | 10:01 PM | 🔵 | CUDA Detector Implementation - NVIDIA GPU Detection via nvidia-smi | ~497 |
|
|
11
|
-
|
|
12
|
-
### Feb 14, 2026
|
|
13
|
-
|
|
14
|
-
| ID | Time | T | Title | Read |
|
|
15
|
-
|----|------|---|-------|------|
|
|
16
|
-
| #4339 | 6:49 PM | 🟣 | MCP server implementation and documentation added to llm-checker repository | ~457 |
|
|
17
|
-
</claude-mem-context>
|
package/src/models/CLAUDE.md
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
<claude-mem-context>
|
|
2
|
-
# Recent Activity
|
|
3
|
-
|
|
4
|
-
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
|
5
|
-
|
|
6
|
-
### Feb 12, 2026
|
|
7
|
-
|
|
8
|
-
| ID | Time | T | Title | Read |
|
|
9
|
-
|----|------|---|-------|------|
|
|
10
|
-
| #3442 | 9:59 PM | 🔵 | Static Model Database Structure - Hardcoded LLM Specifications | ~572 |
|
|
11
|
-
|
|
12
|
-
### Feb 13, 2026
|
|
13
|
-
|
|
14
|
-
| ID | Time | T | Title | Read |
|
|
15
|
-
|----|------|---|-------|------|
|
|
16
|
-
| #3699 | 12:05 AM | ✅ | Git Push Consolidated Architecture Changes to GitHub | ~367 |
|
|
17
|
-
|
|
18
|
-
### Feb 14, 2026
|
|
19
|
-
|
|
20
|
-
| ID | Time | T | Title | Read |
|
|
21
|
-
|----|------|---|-------|------|
|
|
22
|
-
| #4339 | 6:49 PM | 🟣 | MCP server implementation and documentation added to llm-checker repository | ~457 |
|
|
23
|
-
</claude-mem-context>
|
package/src/ollama/CLAUDE.md
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
<claude-mem-context>
|
|
2
|
-
# Recent Activity
|
|
3
|
-
|
|
4
|
-
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
|
5
|
-
|
|
6
|
-
### Feb 12, 2026
|
|
7
|
-
|
|
8
|
-
| ID | Time | T | Title | Read |
|
|
9
|
-
|----|------|---|-------|------|
|
|
10
|
-
| #3500 | 10:26 PM | 🔴 | pullModel() Stream Handling Improved - Success Validation Added | ~458 |
|
|
11
|
-
| #3499 | " | 🔴 | Race Condition Fixed in Ollama Availability Cache | ~440 |
|
|
12
|
-
| #3498 | 10:25 PM | 🔵 | testModelPerformance() Timeout Already Fixed | ~418 |
|
|
13
|
-
| #3497 | " | 🔴 | Timeout Fixed in deleteModel() Using AbortController | ~391 |
|
|
14
|
-
| #3496 | " | 🔴 | Timeout Fixed in testConnection() Using AbortController | ~395 |
|
|
15
|
-
| #3495 | " | 🔴 | Fixed unbounded memory growth in native scraper HTTP request handler | ~361 |
|
|
16
|
-
| #3493 | " | 🔴 | Fixed race condition in checkOllamaAvailability() with promise deduplication | ~398 |
|
|
17
|
-
| #3491 | 10:24 PM | 🔴 | Added missing clearTimeout() in testModelPerformance() | ~319 |
|
|
18
|
-
| #3489 | " | 🔴 | Fixed node-fetch timeout handling in testModelPerformance() | ~332 |
|
|
19
|
-
| #3488 | " | 🔴 | Fixed node-fetch timeout handling in testConnection() tags check | ~303 |
|
|
20
|
-
| #3486 | " | 🔴 | Fixed node-fetch timeout handling in getRunningModels() | ~308 |
|
|
21
|
-
| #3484 | 10:23 PM | 🔵 | Ollama Client Timeout Implementation - Mixed Patterns with AbortController | ~554 |
|
|
22
|
-
| #3443 | 9:59 PM | 🔵 | Ollama Native Scraper - Web Scraping with Dual Cache Strategy | ~594 |
|
|
23
|
-
| #3437 | 9:58 PM | 🔵 | Ollama Client Implementation - HTTP API Wrapper with Connection Management | ~605 |
|
|
24
|
-
|
|
25
|
-
### Feb 14, 2026
|
|
26
|
-
|
|
27
|
-
| ID | Time | T | Title | Read |
|
|
28
|
-
|----|------|---|-------|------|
|
|
29
|
-
| #4339 | 6:49 PM | 🟣 | MCP server implementation and documentation added to llm-checker repository | ~457 |
|
|
30
|
-
</claude-mem-context>
|
package/src/plugins/CLAUDE.md
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
<claude-mem-context>
|
|
2
|
-
# Recent Activity
|
|
3
|
-
|
|
4
|
-
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
|
5
|
-
|
|
6
|
-
### Feb 12, 2026
|
|
7
|
-
|
|
8
|
-
| ID | Time | T | Title | Read |
|
|
9
|
-
|----|------|---|-------|------|
|
|
10
|
-
| #3462 | 10:02 PM | 🔵 | Plugin System Architecture - Hook-Based Extensibility Framework | ~648 |
|
|
11
|
-
|
|
12
|
-
### Feb 14, 2026
|
|
13
|
-
|
|
14
|
-
| ID | Time | T | Title | Read |
|
|
15
|
-
|----|------|---|-------|------|
|
|
16
|
-
| #4339 | 6:49 PM | 🟣 | MCP server implementation and documentation added to llm-checker repository | ~457 |
|
|
17
|
-
</claude-mem-context>
|
package/src/utils/CLAUDE.md
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
<claude-mem-context>
|
|
2
|
-
# Recent Activity
|
|
3
|
-
|
|
4
|
-
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
|
5
|
-
|
|
6
|
-
### Feb 12, 2026
|
|
7
|
-
|
|
8
|
-
| ID | Time | T | Title | Read |
|
|
9
|
-
|----|------|---|-------|------|
|
|
10
|
-
| #3438 | 9:58 PM | 🔵 | Configuration Management System - Comprehensive Settings with Environment Overrides | ~580 |
|
|
11
|
-
|
|
12
|
-
### Feb 14, 2026
|
|
13
|
-
|
|
14
|
-
| ID | Time | T | Title | Read |
|
|
15
|
-
|----|------|---|-------|------|
|
|
16
|
-
| #4339 | 6:49 PM | 🟣 | MCP server implementation and documentation added to llm-checker repository | ~457 |
|
|
17
|
-
</claude-mem-context>
|