@houtini/lm 2.0.1 → 2.1.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/README.md +47 -11
- package/dist/index.js +68 -14
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,6 +17,13 @@ Claude is great at orchestration and reasoning. Local models are great at bulk a
|
|
|
17
17
|
- Extract structured data from long documents
|
|
18
18
|
- Run a second opinion on generated code
|
|
19
19
|
- Summarise research before Claude synthesises it
|
|
20
|
+
- Delegate code review to a local model while Claude handles other work
|
|
21
|
+
|
|
22
|
+
## What's new in v2.1.0
|
|
23
|
+
|
|
24
|
+
- **Smarter tool descriptions** — tool descriptions now encode prompting best practices for local LLMs, so Claude automatically sends well-structured prompts (complete code, capped output tokens, explicit format instructions)
|
|
25
|
+
- **New `code_task` tool** — purpose-built for code analysis with an optimised system prompt and sensible defaults (temp 0.2, 500 token cap)
|
|
26
|
+
- **Delegation guidance** — each tool description tells Claude when to use it, what output to expect, and what to avoid (e.g. never send truncated code to a local model)
|
|
20
27
|
|
|
21
28
|
## Install
|
|
22
29
|
|
|
@@ -64,27 +71,44 @@ Set via environment variables or in your MCP client config:
|
|
|
64
71
|
|
|
65
72
|
### `chat`
|
|
66
73
|
|
|
67
|
-
|
|
74
|
+
Delegate a bounded task to the local LLM. The workhorse for quick questions, code explanation, and pattern recognition.
|
|
68
75
|
|
|
69
76
|
```
|
|
70
|
-
message (required) —
|
|
71
|
-
system —
|
|
72
|
-
temperature — 0
|
|
73
|
-
max_tokens —
|
|
77
|
+
message (required) — the task, with explicit output format instructions
|
|
78
|
+
system — persona (be specific: "Senior TypeScript dev", not "helpful assistant")
|
|
79
|
+
temperature — 0.1 for code, 0.3 for analysis (default), 0.5 for suggestions
|
|
80
|
+
max_tokens — match to expected output: 150 for quick answers, 300 for explanations, 500 for code gen
|
|
74
81
|
```
|
|
75
82
|
|
|
83
|
+
**Tip:** Always send complete code — local models hallucinate details for truncated input.
|
|
84
|
+
|
|
76
85
|
### `custom_prompt`
|
|
77
86
|
|
|
78
|
-
Structured prompt with separate system, context, and instruction fields.
|
|
87
|
+
Structured 3-part prompt with separate system, context, and instruction fields. The separation prevents context bleed in local models — better results than stuffing everything into a single message.
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
instruction (required) — what to produce (under 50 words works best)
|
|
91
|
+
system — persona, specific and under 30 words
|
|
92
|
+
context — COMPLETE data to analyse (never truncated)
|
|
93
|
+
temperature — 0.1 for review, 0.3 for analysis (default)
|
|
94
|
+
max_tokens — 200 for bullets, 400 for detailed review, 600 for code gen
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### `code_task`
|
|
98
|
+
|
|
99
|
+
Purpose-built for code analysis. Wraps the local LLM with an optimised code-review system prompt and low temperature (0.2).
|
|
79
100
|
|
|
80
101
|
```
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
max_tokens — default 4096
|
|
102
|
+
code (required) — complete source code (never truncate)
|
|
103
|
+
task (required) — what to do: "Find bugs", "Explain this function", "Add error handling"
|
|
104
|
+
language — "typescript", "python", "rust", etc.
|
|
105
|
+
max_tokens — default 500 (200 for quick answers, 800 for code generation)
|
|
86
106
|
```
|
|
87
107
|
|
|
108
|
+
**The local LLM excels at:** explaining code, finding common bugs, suggesting improvements, comparing patterns, generating boilerplate.
|
|
109
|
+
|
|
110
|
+
**It struggles with:** subtle/adversarial bugs, multi-file reasoning, design tasks requiring integration.
|
|
111
|
+
|
|
88
112
|
### `list_models`
|
|
89
113
|
|
|
90
114
|
Returns the models currently loaded on the LLM server.
|
|
@@ -93,6 +117,18 @@ Returns the models currently loaded on the LLM server.
|
|
|
93
117
|
|
|
94
118
|
Checks connectivity. Returns response time, auth status, and loaded model count.
|
|
95
119
|
|
|
120
|
+
## Performance guide
|
|
121
|
+
|
|
122
|
+
At typical local LLM speeds (~3-4 tokens/second on consumer hardware):
|
|
123
|
+
|
|
124
|
+
| max_tokens | Response time | Best for |
|
|
125
|
+
|------------|--------------|----------|
|
|
126
|
+
| 150 | ~45 seconds | Quick questions, classifications |
|
|
127
|
+
| 300 | ~100 seconds | Code explanations, summaries |
|
|
128
|
+
| 500 | ~170 seconds | Code review, generation |
|
|
129
|
+
|
|
130
|
+
Set `max_tokens` to match your expected output — lower values mean faster responses.
|
|
131
|
+
|
|
96
132
|
## Compatible endpoints
|
|
97
133
|
|
|
98
134
|
| Provider | URL | Notes |
|
package/dist/index.js
CHANGED
|
@@ -51,46 +51,77 @@ async function listModels() {
|
|
|
51
51
|
const TOOLS = [
|
|
52
52
|
{
|
|
53
53
|
name: 'chat',
|
|
54
|
-
description: '
|
|
54
|
+
description: 'Delegate a bounded task to the local LLM (Qwen3-Coder, ~3-4 tok/s). ' +
|
|
55
|
+
'Best for: quick code explanation, pattern recognition, boilerplate generation, knowledge questions. ' +
|
|
56
|
+
'Use when you can work in parallel — fire this off and continue your own work. ' +
|
|
57
|
+
'RULES: (1) Always send COMPLETE code, never truncated — the local LLM WILL hallucinate details for missing code. ' +
|
|
58
|
+
'(2) Set max_tokens to match expected output: 150 for quick answers (~45s), 300 for explanations (~100s), 500 for code generation (~170s). ' +
|
|
59
|
+
'(3) Be explicit about output format in your message ("respond in 3 bullets", "return only the function"). ' +
|
|
60
|
+
'DO NOT use for: multi-step reasoning, creative writing, tasks needing >500 token output, or anything requiring tool use (use lm-taskrunner for tool-augmented tasks via mcpo).',
|
|
55
61
|
inputSchema: {
|
|
56
62
|
type: 'object',
|
|
57
63
|
properties: {
|
|
58
|
-
message: { type: 'string', description: '
|
|
59
|
-
system: { type: 'string', description: '
|
|
60
|
-
temperature: { type: 'number', description: '
|
|
61
|
-
max_tokens: { type: 'number', description: '
|
|
64
|
+
message: { type: 'string', description: 'The task. Be specific about expected output format and length. Include COMPLETE code — never truncate.' },
|
|
65
|
+
system: { type: 'string', description: 'Persona for the local LLM. Be specific: "Senior TypeScript dev" not "helpful assistant". Short personas (under 30 words) get best results.' },
|
|
66
|
+
temperature: { type: 'number', description: '0.1 for factual/code tasks, 0.3 for analysis (default), 0.7 for creative suggestions. Stay under 0.5 for code.' },
|
|
67
|
+
max_tokens: { type: 'number', description: 'Cap this to match expected output. 150=quick answer, 300=explanation, 500=code generation. Lower = faster. Default 4096 is almost always too high.' },
|
|
62
68
|
},
|
|
63
69
|
required: ['message'],
|
|
64
70
|
},
|
|
65
71
|
},
|
|
66
72
|
{
|
|
67
73
|
name: 'custom_prompt',
|
|
68
|
-
description: '
|
|
74
|
+
description: 'Structured analysis on the local LLM with explicit system/context/instruction separation. ' +
|
|
75
|
+
'This 3-part format gets the best results from local models — the separation prevents context bleed. ' +
|
|
76
|
+
'System sets persona (be specific: "Senior TypeScript dev reviewing for security bugs"). ' +
|
|
77
|
+
'Context provides COMPLETE data (full source file, full error log — never truncated). ' +
|
|
78
|
+
'Instruction states exactly what to produce (under 50 words for best results). ' +
|
|
79
|
+
'Best for: code review, comparison, refactoring suggestions, structured analysis. ' +
|
|
80
|
+
'Expect 30-180s response time depending on max_tokens.',
|
|
69
81
|
inputSchema: {
|
|
70
82
|
type: 'object',
|
|
71
83
|
properties: {
|
|
72
|
-
system: { type: 'string', description: '
|
|
73
|
-
context: { type: 'string', description: '
|
|
74
|
-
instruction: { type: 'string', description: 'What to
|
|
75
|
-
temperature: { type: 'number', description: '
|
|
76
|
-
max_tokens: { type: 'number', description: '
|
|
84
|
+
system: { type: 'string', description: 'Persona. Be specific and under 30 words. Example: "Expert Node.js developer focused on error handling and edge cases."' },
|
|
85
|
+
context: { type: 'string', description: 'The COMPLETE data to analyse. Full source code, full logs, full text. NEVER truncate — the local LLM fills gaps with plausible hallucinations.' },
|
|
86
|
+
instruction: { type: 'string', description: 'What to produce. Under 50 words. Specify format: "List 3 bugs as bullet points" or "Return a JSON array of {line, issue, fix}".' },
|
|
87
|
+
temperature: { type: 'number', description: '0.1 for bugs/review, 0.3 for analysis (default), 0.5 for suggestions.' },
|
|
88
|
+
max_tokens: { type: 'number', description: 'Match to expected output. 200 for bullets, 400 for detailed review, 600 for code generation.' },
|
|
77
89
|
},
|
|
78
90
|
required: ['instruction'],
|
|
79
91
|
},
|
|
80
92
|
},
|
|
93
|
+
{
|
|
94
|
+
name: 'code_task',
|
|
95
|
+
description: 'Purpose-built for code analysis tasks. Wraps the local LLM with an optimised code-review system prompt. ' +
|
|
96
|
+
'Provide COMPLETE source code and a specific task — returns analysis in ~30-180s. ' +
|
|
97
|
+
'Ideal for parallel execution: delegate to local LLM while you handle other work. ' +
|
|
98
|
+
'The local LLM excels at: explaining code, finding common bugs, suggesting improvements, comparing patterns, generating boilerplate. ' +
|
|
99
|
+
'It struggles with: subtle/adversarial bugs, multi-file reasoning, design tasks requiring integration. ' +
|
|
100
|
+
'Output capped at 500 tokens by default (override with max_tokens).',
|
|
101
|
+
inputSchema: {
|
|
102
|
+
type: 'object',
|
|
103
|
+
properties: {
|
|
104
|
+
code: { type: 'string', description: 'COMPLETE source code. Never truncate. Include imports and full function bodies.' },
|
|
105
|
+
task: { type: 'string', description: 'What to do. Be specific and concise: "Find bugs", "Explain this function", "Add error handling to fetchData", "Compare these two approaches".' },
|
|
106
|
+
language: { type: 'string', description: 'Programming language for context: "typescript", "python", "rust", etc.' },
|
|
107
|
+
max_tokens: { type: 'number', description: 'Expected output size. Default 500. Use 200 for quick answers, 800 for code generation.' },
|
|
108
|
+
},
|
|
109
|
+
required: ['code', 'task'],
|
|
110
|
+
},
|
|
111
|
+
},
|
|
81
112
|
{
|
|
82
113
|
name: 'list_models',
|
|
83
|
-
description: 'List models currently loaded in LM Studio.',
|
|
114
|
+
description: 'List models currently loaded in LM Studio. Use to verify which model will handle delegated tasks.',
|
|
84
115
|
inputSchema: { type: 'object', properties: {} },
|
|
85
116
|
},
|
|
86
117
|
{
|
|
87
118
|
name: 'health_check',
|
|
88
|
-
description: 'Check connectivity to the local LM Studio instance.',
|
|
119
|
+
description: 'Check connectivity and latency to the local LM Studio instance. Run before delegating time-sensitive tasks.',
|
|
89
120
|
inputSchema: { type: 'object', properties: {} },
|
|
90
121
|
},
|
|
91
122
|
];
|
|
92
123
|
// ── MCP Server ───────────────────────────────────────────────────────
|
|
93
|
-
const server = new Server({ name: 'houtini-lm', version: '2.0
|
|
124
|
+
const server = new Server({ name: 'houtini-lm', version: '2.1.0' }, { capabilities: { tools: {} } });
|
|
94
125
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
|
|
95
126
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
96
127
|
const { name, arguments: args } = request.params;
|
|
@@ -129,6 +160,29 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
129
160
|
content: [{ type: 'text', text: resp.choices[0]?.message?.content ?? '' }],
|
|
130
161
|
};
|
|
131
162
|
}
|
|
163
|
+
case 'code_task': {
|
|
164
|
+
const { code, task, language, max_tokens: codeMaxTokens } = args;
|
|
165
|
+
const lang = language || 'unknown';
|
|
166
|
+
const codeMessages = [
|
|
167
|
+
{
|
|
168
|
+
role: 'system',
|
|
169
|
+
content: `Expert ${lang} developer. Analyse the provided code and complete the task. Be specific — reference line numbers, function names, and concrete fixes. No preamble.`,
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
role: 'user',
|
|
173
|
+
content: `Task: ${task}\n\n\`\`\`${lang}\n${code}\n\`\`\``,
|
|
174
|
+
},
|
|
175
|
+
];
|
|
176
|
+
const codeResp = await chatCompletion(codeMessages, {
|
|
177
|
+
temperature: 0.2,
|
|
178
|
+
maxTokens: codeMaxTokens ?? 500,
|
|
179
|
+
});
|
|
180
|
+
const codeReply = codeResp.choices[0]?.message?.content ?? '';
|
|
181
|
+
const codeUsage = codeResp.usage
|
|
182
|
+
? `\n\n---\nModel: ${codeResp.model} | Tokens: ${codeResp.usage.prompt_tokens}→${codeResp.usage.completion_tokens} | ${lang}`
|
|
183
|
+
: '';
|
|
184
|
+
return { content: [{ type: 'text', text: codeReply + codeUsage }] };
|
|
185
|
+
}
|
|
132
186
|
case 'list_models': {
|
|
133
187
|
const models = await listModels();
|
|
134
188
|
return {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,uBAAuB,CAAC;AACzE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;AACnD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;AACzD,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC,SAAS,UAAU;IACjB,MAAM,CAAC,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;IACzE,IAAI,WAAW;QAAE,CAAC,CAAC,eAAe,CAAC,GAAG,UAAU,WAAW,EAAE,CAAC;IAC9D,OAAO,CAAC,CAAC;AACX,CAAC;AAmBD,KAAK,UAAU,cAAc,CAC3B,QAAuB,EACvB,UAAwE,EAAE;IAE1E,MAAM,IAAI,GAA4B;QACpC,QAAQ;QACR,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,mBAAmB;QACvD,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,kBAAkB;QACnD,MAAM,EAAE,KAAK;KACd,CAAC;IACF,IAAI,OAAO,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC;IACzC,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,sBAAsB,EAAE;QAC5D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,UAAU,EAAE;QACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,EAAqC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,YAAY,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IAC/E,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoC,CAAC;IACnE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,wEAAwE;AAExE,MAAM,KAAK,GAAG;IACZ;QACE,IAAI,EAAE,MAAM;QACZ,WAAW,EACT,4IAA4I;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|