@agntk/core 0.3.0 → 0.3.2
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/dist/agent-v2.d.ts +48 -0
- package/dist/agent-v2.d.ts.map +1 -0
- package/dist/agent-v2.js +365 -0
- package/dist/agent-v2.js.map +1 -0
- package/dist/config/defaults.js +3 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/memory/engine.d.ts +130 -0
- package/dist/memory/engine.d.ts.map +1 -0
- package/dist/memory/engine.js +227 -0
- package/dist/memory/engine.js.map +1 -0
- package/dist/memory/vectra-store.d.ts +31 -0
- package/dist/memory/vectra-store.d.ts.map +1 -0
- package/dist/memory/vectra-store.js +122 -0
- package/dist/memory/vectra-store.js.map +1 -0
- package/dist/models.d.ts +4 -0
- package/dist/models.d.ts.map +1 -1
- package/dist/models.js +53 -7
- package/dist/models.js.map +1 -1
- package/dist/pool/index.d.ts +7 -0
- package/dist/pool/index.d.ts.map +1 -0
- package/dist/pool/index.js +6 -0
- package/dist/pool/index.js.map +1 -0
- package/dist/pool/specialist-pool.d.ts +59 -0
- package/dist/pool/specialist-pool.d.ts.map +1 -0
- package/dist/pool/specialist-pool.js +224 -0
- package/dist/pool/specialist-pool.js.map +1 -0
- package/dist/pool/tools.d.ts +63 -0
- package/dist/pool/tools.d.ts.map +1 -0
- package/dist/pool/tools.js +83 -0
- package/dist/pool/tools.js.map +1 -0
- package/dist/pool/types.d.ts +79 -0
- package/dist/pool/types.d.ts.map +1 -0
- package/dist/pool/types.js +5 -0
- package/dist/pool/types.js.map +1 -0
- package/dist/presets/index.d.ts +5 -0
- package/dist/presets/index.d.ts.map +1 -0
- package/dist/presets/index.js +5 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/presets/role-registry.d.ts +41 -0
- package/dist/presets/role-registry.d.ts.map +1 -0
- package/dist/presets/role-registry.js +213 -0
- package/dist/presets/role-registry.js.map +1 -0
- package/dist/presets/roles.d.ts +105 -0
- package/dist/presets/roles.d.ts.map +1 -0
- package/dist/presets/roles.js +207 -0
- package/dist/presets/roles.js.map +1 -0
- package/dist/prompts/templates.d.ts +11 -0
- package/dist/prompts/templates.d.ts.map +1 -0
- package/dist/prompts/templates.js +115 -0
- package/dist/prompts/templates.js.map +1 -0
- package/dist/provider-resolver.d.ts +4 -0
- package/dist/provider-resolver.d.ts.map +1 -1
- package/dist/provider-resolver.js +51 -15
- package/dist/provider-resolver.js.map +1 -1
- package/dist/streaming/data-parts.d.ts +163 -0
- package/dist/streaming/data-parts.d.ts.map +1 -0
- package/dist/streaming/data-parts.js +14 -0
- package/dist/streaming/data-parts.js.map +1 -0
- package/dist/streaming/index.d.ts +8 -0
- package/dist/streaming/index.d.ts.map +1 -0
- package/dist/streaming/index.js +10 -0
- package/dist/streaming/index.js.map +1 -0
- package/dist/streaming/transient.d.ts +136 -0
- package/dist/streaming/transient.d.ts.map +1 -0
- package/dist/streaming/transient.js +201 -0
- package/dist/streaming/transient.js.map +1 -0
- package/dist/system-detect.d.ts +34 -12
- package/dist/system-detect.d.ts.map +1 -1
- package/dist/system-detect.js +154 -29
- package/dist/system-detect.js.map +1 -1
- package/dist/tools/factory.d.ts +109 -0
- package/dist/tools/factory.d.ts.map +1 -0
- package/dist/tools/factory.js +166 -0
- package/dist/tools/factory.js.map +1 -0
- package/dist/tools/provider.d.ts +97 -0
- package/dist/tools/provider.d.ts.map +1 -0
- package/dist/tools/provider.js +178 -0
- package/dist/tools/provider.js.map +1 -0
- package/dist/types/agent-v2.d.ts +83 -0
- package/dist/types/agent-v2.d.ts.map +1 -0
- package/dist/types/agent-v2.js +8 -0
- package/dist/types/agent-v2.js.map +1 -0
- package/dist/utils/logger.d.ts +35 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +149 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/workflow/builders/adapt.d.ts +20 -0
- package/dist/workflow/builders/adapt.d.ts.map +1 -0
- package/dist/workflow/builders/adapt.js +33 -0
- package/dist/workflow/builders/adapt.js.map +1 -0
- package/dist/workflow/builders/index.d.ts +8 -0
- package/dist/workflow/builders/index.d.ts.map +1 -0
- package/dist/workflow/builders/index.js +7 -0
- package/dist/workflow/builders/index.js.map +1 -0
- package/dist/workflow/builders/parallel.d.ts +25 -0
- package/dist/workflow/builders/parallel.d.ts.map +1 -0
- package/dist/workflow/builders/parallel.js +60 -0
- package/dist/workflow/builders/parallel.js.map +1 -0
- package/dist/workflow/builders/pipeline.d.ts +22 -0
- package/dist/workflow/builders/pipeline.d.ts.map +1 -0
- package/dist/workflow/builders/pipeline.js +48 -0
- package/dist/workflow/builders/pipeline.js.map +1 -0
- package/dist/workflow/builders/types.d.ts +54 -0
- package/dist/workflow/builders/types.d.ts.map +1 -0
- package/dist/workflow/builders/types.js +5 -0
- package/dist/workflow/builders/types.js.map +1 -0
- package/dist/workflow/durable-agent.d.ts +128 -0
- package/dist/workflow/durable-agent.d.ts.map +1 -0
- package/dist/workflow/durable-agent.js +323 -0
- package/dist/workflow/durable-agent.js.map +1 -0
- package/dist/workflow/schedulers.d.ts +231 -0
- package/dist/workflow/schedulers.d.ts.map +1 -0
- package/dist/workflow/schedulers.js +250 -0
- package/dist/workflow/schedulers.js.map +1 -0
- package/dist/workflow/team/create-team.d.ts +34 -0
- package/dist/workflow/team/create-team.d.ts.map +1 -0
- package/dist/workflow/team/create-team.js +242 -0
- package/dist/workflow/team/create-team.js.map +1 -0
- package/dist/workflow/team/index.d.ts +9 -0
- package/dist/workflow/team/index.d.ts.map +1 -0
- package/dist/workflow/team/index.js +8 -0
- package/dist/workflow/team/index.js.map +1 -0
- package/dist/workflow/team/machines.d.ts +152 -0
- package/dist/workflow/team/machines.d.ts.map +1 -0
- package/dist/workflow/team/machines.js +197 -0
- package/dist/workflow/team/machines.js.map +1 -0
- package/dist/workflow/team/task-board.d.ts +47 -0
- package/dist/workflow/team/task-board.d.ts.map +1 -0
- package/dist/workflow/team/task-board.js +111 -0
- package/dist/workflow/team/task-board.js.map +1 -0
- package/dist/workflow/team/tools.d.ts +66 -0
- package/dist/workflow/team/tools.d.ts.map +1 -0
- package/dist/workflow/team/tools.js +100 -0
- package/dist/workflow/team/tools.js.map +1 -0
- package/dist/workflow/team/types.d.ts +109 -0
- package/dist/workflow/team/types.d.ts.map +1 -0
- package/dist/workflow/team/types.js +5 -0
- package/dist/workflow/team/types.js.map +1 -0
- package/dist/workflow/templates.d.ts +71 -0
- package/dist/workflow/templates.d.ts.map +1 -0
- package/dist/workflow/templates.js +132 -0
- package/dist/workflow/templates.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @agntk/core - Transient Streaming Infrastructure
|
|
3
|
+
*
|
|
4
|
+
* Enables tools to stream data to the UI without persisting to conversation context.
|
|
5
|
+
* This keeps the context window lean while providing rich UI feedback.
|
|
6
|
+
*/
|
|
7
|
+
import { createLogger } from '@agntk/logger';
|
|
8
|
+
const log = createLogger('@agntk/core:streaming');
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Main API: withTransientStreaming
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Wrap tools to enable transient streaming.
|
|
14
|
+
*
|
|
15
|
+
* Tools wrapped with this function will have access to a `stream()` helper
|
|
16
|
+
* in their context that allows streaming data to the UI without adding
|
|
17
|
+
* it to the conversation context.
|
|
18
|
+
*
|
|
19
|
+
* @param tools - Record of tools to wrap
|
|
20
|
+
* @param writer - Stream writer for sending data to the client
|
|
21
|
+
* @returns Wrapped tools with transient streaming enabled
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const wrappedTools = withTransientStreaming(myTools, dataStream);
|
|
26
|
+
*
|
|
27
|
+
* // Inside a tool's execute function:
|
|
28
|
+
* execute: async (input, ctx) => {
|
|
29
|
+
* ctx.stream('file-content', {
|
|
30
|
+
* path: input.path,
|
|
31
|
+
* content: fileContent,
|
|
32
|
+
* truncated: false,
|
|
33
|
+
* });
|
|
34
|
+
* return `Read ${input.path}`;
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export function withTransientStreaming(tools, writer) {
|
|
39
|
+
const wrappedTools = {};
|
|
40
|
+
for (const [name, tool] of Object.entries(tools)) {
|
|
41
|
+
wrappedTools[name] = wrapToolWithTransient(tool, writer, name);
|
|
42
|
+
}
|
|
43
|
+
return wrappedTools;
|
|
44
|
+
}
|
|
45
|
+
// ============================================================================
|
|
46
|
+
// Tool Wrapping
|
|
47
|
+
// ============================================================================
|
|
48
|
+
/**
|
|
49
|
+
* Wrap a single tool with transient streaming capabilities.
|
|
50
|
+
*/
|
|
51
|
+
function wrapToolWithTransient(tool, writer, toolName) {
|
|
52
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
53
|
+
const originalExecute = tool.execute;
|
|
54
|
+
if (!originalExecute) {
|
|
55
|
+
return tool;
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
...tool,
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
60
|
+
execute: async (input, options) => {
|
|
61
|
+
// Create enhanced context with streaming helper
|
|
62
|
+
const enhancedContext = {
|
|
63
|
+
...(options || {}),
|
|
64
|
+
agentId: options?.agentId || 'unknown',
|
|
65
|
+
stepNumber: options?.stepNumber || 0,
|
|
66
|
+
writer,
|
|
67
|
+
stream: (type, data) => {
|
|
68
|
+
writeTransient(writer, type, data);
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
return originalExecute(input, enhancedContext);
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// ============================================================================
|
|
76
|
+
// Transient Data Writers
|
|
77
|
+
// ============================================================================
|
|
78
|
+
/**
|
|
79
|
+
* Stream typed transient data to the UI.
|
|
80
|
+
*
|
|
81
|
+
* @param writer - Stream writer instance
|
|
82
|
+
* @param type - Data part type
|
|
83
|
+
* @param data - Data to stream
|
|
84
|
+
*/
|
|
85
|
+
export function writeTransient(writer, type, data) {
|
|
86
|
+
const dataPart = {
|
|
87
|
+
type,
|
|
88
|
+
data,
|
|
89
|
+
};
|
|
90
|
+
writer.writeData({
|
|
91
|
+
...dataPart,
|
|
92
|
+
transient: true,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Helper for tools to stream transient data from within their execute function.
|
|
97
|
+
*
|
|
98
|
+
* @param ctx - Tool context (must have writer)
|
|
99
|
+
* @param type - Data part type
|
|
100
|
+
* @param data - Data to stream
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```typescript
|
|
104
|
+
* // Inside a tool's execute function:
|
|
105
|
+
* streamTransient(ctx, 'shell-output', {
|
|
106
|
+
* command: 'npm test',
|
|
107
|
+
* output: result.stdout,
|
|
108
|
+
* exitCode: result.code,
|
|
109
|
+
* });
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export function streamTransient(ctx, type, data) {
|
|
113
|
+
// Cast to TransientStreamWriter - they have compatible interfaces
|
|
114
|
+
const writer = ctx.writer;
|
|
115
|
+
if (writer) {
|
|
116
|
+
writeTransient(writer, type, data);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// ============================================================================
|
|
120
|
+
// Specialized Streamers
|
|
121
|
+
// ============================================================================
|
|
122
|
+
/**
|
|
123
|
+
* Stream file content transiently.
|
|
124
|
+
*/
|
|
125
|
+
export function streamFileContent(ctx, path, content, options = {}) {
|
|
126
|
+
streamTransient(ctx, 'file-content', {
|
|
127
|
+
path,
|
|
128
|
+
content,
|
|
129
|
+
truncated: options.truncated ?? false,
|
|
130
|
+
totalBytes: options.totalBytes,
|
|
131
|
+
language: options.language,
|
|
132
|
+
lineRange: options.lineRange,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Stream shell output transiently.
|
|
137
|
+
*/
|
|
138
|
+
export function streamShellOutput(ctx, command, output, exitCode, options = {}) {
|
|
139
|
+
streamTransient(ctx, 'shell-output', {
|
|
140
|
+
command,
|
|
141
|
+
output,
|
|
142
|
+
exitCode,
|
|
143
|
+
cwd: options.cwd,
|
|
144
|
+
truncated: options.truncated,
|
|
145
|
+
durationMs: options.durationMs,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Stream search results transiently.
|
|
150
|
+
*/
|
|
151
|
+
export function streamSearchResult(ctx, path, content, matches, options = {}) {
|
|
152
|
+
streamTransient(ctx, 'search-result', {
|
|
153
|
+
path,
|
|
154
|
+
content,
|
|
155
|
+
matches,
|
|
156
|
+
line: options.line,
|
|
157
|
+
pattern: options.pattern,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Stream tool progress update transiently.
|
|
162
|
+
*/
|
|
163
|
+
export function streamProgress(ctx, toolName, progress, message, options = {}) {
|
|
164
|
+
streamTransient(ctx, 'tool-progress', {
|
|
165
|
+
toolName,
|
|
166
|
+
progress,
|
|
167
|
+
message,
|
|
168
|
+
estimatedRemaining: options.estimatedRemaining,
|
|
169
|
+
step: options.step,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Stream reasoning step transiently.
|
|
174
|
+
*
|
|
175
|
+
* @internal Forward-designed for CLI streaming feature. No production callers yet.
|
|
176
|
+
*/
|
|
177
|
+
export function streamReasoningStep(ctx, stepNumber, totalSteps, thought, options = {}) {
|
|
178
|
+
streamTransient(ctx, 'reasoning-step', {
|
|
179
|
+
stepNumber,
|
|
180
|
+
totalSteps,
|
|
181
|
+
thought,
|
|
182
|
+
isRevision: options.isRevision,
|
|
183
|
+
revisesThought: options.revisesThought,
|
|
184
|
+
branchId: options.branchId,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Stream sub-agent output transiently.
|
|
189
|
+
*
|
|
190
|
+
* @internal Forward-designed for CLI streaming feature. No production callers yet.
|
|
191
|
+
*/
|
|
192
|
+
export function streamSubAgent(ctx, agentId, role, text, status, error) {
|
|
193
|
+
streamTransient(ctx, 'sub-agent-stream', {
|
|
194
|
+
agentId,
|
|
195
|
+
role,
|
|
196
|
+
text,
|
|
197
|
+
status,
|
|
198
|
+
error,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=transient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transient.js","sourceRoot":"","sources":["../../src/streaming/transient.ts"],"names":[],"mappings":"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"}
|
package/dist/system-detect.d.ts
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview System hardware detection for automatic Ollama model selection.
|
|
3
3
|
*
|
|
4
|
-
* Detects available RAM/VRAM and selects the
|
|
5
|
-
*
|
|
4
|
+
* Detects available RAM/VRAM and selects the best model the system can
|
|
5
|
+
* comfortably run. Falls back conservatively — better to run a smaller
|
|
6
6
|
* model fast than a larger model that swaps to disk.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* Supports both local models and Ollama cloud models (-cloud suffix).
|
|
9
|
+
* Cloud models are always preferred when available since they run on
|
|
10
|
+
* remote infrastructure regardless of local hardware.
|
|
11
|
+
*
|
|
12
|
+
* Memory thresholds (Q4_K_M quantization, local models):
|
|
13
|
+
* qwen3:8b ~5-6 GB → needs ≥8 GB total RAM
|
|
14
|
+
* qwen3-coder:30b ~17 GB → needs ≥24 GB total RAM (MoE, fast inference)
|
|
15
|
+
* qwen3.5:35b ~20 GB → needs ≥32 GB total RAM
|
|
12
16
|
*/
|
|
13
17
|
export interface SystemProfile {
|
|
14
18
|
/** Total system RAM in GB */
|
|
@@ -26,28 +30,46 @@ export type OllamaModelTier = 'small' | 'medium' | 'large';
|
|
|
26
30
|
export interface OllamaModelRecommendation {
|
|
27
31
|
/** Recommended tier */
|
|
28
32
|
tier: OllamaModelTier;
|
|
29
|
-
/** Model tag to pull/use
|
|
33
|
+
/** Model tag to pull/use for each agent tier */
|
|
30
34
|
fast: string;
|
|
31
35
|
standard: string;
|
|
32
36
|
reasoning: string;
|
|
33
37
|
powerful: string;
|
|
34
38
|
/** Human-readable reason */
|
|
35
39
|
reason: string;
|
|
40
|
+
/** True when installed models exist but none are usable (all < 8b, no cloud) */
|
|
41
|
+
noUsableModels?: boolean;
|
|
36
42
|
}
|
|
43
|
+
/** Cloud models run on remote infrastructure — always usable regardless of local hardware. */
|
|
44
|
+
export declare function isCloudModel(tag: string): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Check if a model is large enough for reliable agent tool-calling.
|
|
47
|
+
* Models need >= 8b parameters. Cloud models are always usable.
|
|
48
|
+
* Unknown sizes (e.g. "deepseek-coder:latest") are assumed usable.
|
|
49
|
+
*/
|
|
50
|
+
export declare function isUsableSize(tag: string): boolean;
|
|
37
51
|
/**
|
|
38
52
|
* Detect system hardware profile.
|
|
39
53
|
*/
|
|
40
54
|
export declare function detectSystem(): SystemProfile;
|
|
41
55
|
/**
|
|
42
|
-
* Select the best Ollama model tier based on system capabilities
|
|
56
|
+
* Select the best Ollama model tier based on system capabilities
|
|
57
|
+
* and (optionally) which models are actually installed.
|
|
58
|
+
*
|
|
59
|
+
* When installedModels is provided, the recommendation is constrained
|
|
60
|
+
* to models the user already has pulled — the best available model is
|
|
61
|
+
* used for every tier rather than recommending something that would 404.
|
|
62
|
+
*
|
|
63
|
+
* If only sub-8b models are installed (and no cloud models), sets
|
|
64
|
+
* `noUsableModels: true` so the caller can skip Ollama entirely.
|
|
43
65
|
*
|
|
44
|
-
*
|
|
66
|
+
* Hardware thresholds (usable memory for model weights):
|
|
45
67
|
* < 6 GB → too small, warn user
|
|
46
68
|
* 6-10 GB → small (qwen3:8b everywhere)
|
|
47
|
-
* 10-
|
|
48
|
-
*
|
|
69
|
+
* 10-20 GB → medium (qwen3-coder:30b for standard+)
|
|
70
|
+
* 20+ GB → large (qwen3.5:35b for reasoning/powerful)
|
|
49
71
|
*/
|
|
50
|
-
export declare function recommendOllamaModels(profile?: SystemProfile): OllamaModelRecommendation;
|
|
72
|
+
export declare function recommendOllamaModels(profile?: SystemProfile, installedModels?: string[]): OllamaModelRecommendation;
|
|
51
73
|
/**
|
|
52
74
|
* Check which models Ollama already has pulled.
|
|
53
75
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-detect.d.ts","sourceRoot":"","sources":["../src/system-detect.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"system-detect.d.ts","sourceRoot":"","sources":["../src/system-detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAYH,MAAM,WAAW,aAAa;IAC5B,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,cAAc,EAAE,OAAO,CAAC;IACxB,qCAAqC;IACrC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,yBAAyB;IACxC,uBAAuB;IACvB,IAAI,EAAE,eAAe,CAAC;IACtB,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAMD,8FAA8F;AAC9F,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGjD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMjD;AA2FD;;GAEG;AACH,wBAAgB,YAAY,IAAI,aAAa,CAuC5C;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,CAAC,EAAE,aAAa,EACvB,eAAe,CAAC,EAAE,MAAM,EAAE,GACzB,yBAAyB,CA4E3B;AAiCD;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqBzE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAKtF"}
|
package/dist/system-detect.js
CHANGED
|
@@ -1,20 +1,46 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview System hardware detection for automatic Ollama model selection.
|
|
3
3
|
*
|
|
4
|
-
* Detects available RAM/VRAM and selects the
|
|
5
|
-
*
|
|
4
|
+
* Detects available RAM/VRAM and selects the best model the system can
|
|
5
|
+
* comfortably run. Falls back conservatively — better to run a smaller
|
|
6
6
|
* model fast than a larger model that swaps to disk.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* Supports both local models and Ollama cloud models (-cloud suffix).
|
|
9
|
+
* Cloud models are always preferred when available since they run on
|
|
10
|
+
* remote infrastructure regardless of local hardware.
|
|
11
|
+
*
|
|
12
|
+
* Memory thresholds (Q4_K_M quantization, local models):
|
|
13
|
+
* qwen3:8b ~5-6 GB → needs ≥8 GB total RAM
|
|
14
|
+
* qwen3-coder:30b ~17 GB → needs ≥24 GB total RAM (MoE, fast inference)
|
|
15
|
+
* qwen3.5:35b ~20 GB → needs ≥32 GB total RAM
|
|
12
16
|
*/
|
|
13
17
|
import { createLogger } from '@agntk/logger';
|
|
14
18
|
import os from 'node:os';
|
|
15
19
|
import { execSync } from 'node:child_process';
|
|
16
20
|
const log = createLogger('@agntk/core:system-detect');
|
|
17
21
|
// ============================================================================
|
|
22
|
+
// Model Classification
|
|
23
|
+
// ============================================================================
|
|
24
|
+
/** Cloud models run on remote infrastructure — always usable regardless of local hardware. */
|
|
25
|
+
export function isCloudModel(tag) {
|
|
26
|
+
const lower = tag.toLowerCase();
|
|
27
|
+
return lower.includes('-cloud') || lower.endsWith(':cloud');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if a model is large enough for reliable agent tool-calling.
|
|
31
|
+
* Models need >= 8b parameters. Cloud models are always usable.
|
|
32
|
+
* Unknown sizes (e.g. "deepseek-coder:latest") are assumed usable.
|
|
33
|
+
*/
|
|
34
|
+
export function isUsableSize(tag) {
|
|
35
|
+
if (isCloudModel(tag))
|
|
36
|
+
return true;
|
|
37
|
+
// Parse size from tags like "qwen3:14b", "llama3.1:70b", "qwen3-coder:30b"
|
|
38
|
+
const match = tag.match(/(\d+(?:\.\d+)?)b/i);
|
|
39
|
+
if (!match)
|
|
40
|
+
return true; // unknown size → assume usable
|
|
41
|
+
return parseFloat(match[1]) >= 8;
|
|
42
|
+
}
|
|
43
|
+
// ============================================================================
|
|
18
44
|
// Model Tier Definitions
|
|
19
45
|
// ============================================================================
|
|
20
46
|
const MODEL_TIERS = {
|
|
@@ -28,18 +54,36 @@ const MODEL_TIERS = {
|
|
|
28
54
|
medium: {
|
|
29
55
|
tier: 'medium',
|
|
30
56
|
fast: 'qwen3:8b',
|
|
31
|
-
standard: 'qwen3:
|
|
32
|
-
reasoning: 'qwen3:
|
|
33
|
-
powerful: 'qwen3:
|
|
57
|
+
standard: 'qwen3-coder:30b',
|
|
58
|
+
reasoning: 'qwen3-coder:30b',
|
|
59
|
+
powerful: 'qwen3-coder:30b',
|
|
34
60
|
},
|
|
35
61
|
large: {
|
|
36
62
|
tier: 'large',
|
|
37
63
|
fast: 'qwen3:8b',
|
|
38
|
-
standard: 'qwen3:
|
|
39
|
-
reasoning: 'qwen3:
|
|
40
|
-
powerful: 'qwen3:
|
|
64
|
+
standard: 'qwen3-coder:30b',
|
|
65
|
+
reasoning: 'qwen3.5:35b',
|
|
66
|
+
powerful: 'qwen3.5:35b',
|
|
41
67
|
},
|
|
42
68
|
};
|
|
69
|
+
/**
|
|
70
|
+
* Preferred models ordered from best to least preferred.
|
|
71
|
+
* Cloud models first (run on remote infra), then best local models.
|
|
72
|
+
*/
|
|
73
|
+
const MODEL_PREFERENCE = [
|
|
74
|
+
// Cloud (always top priority)
|
|
75
|
+
'qwen3-coder:480b-cloud',
|
|
76
|
+
'qwen3.5:cloud',
|
|
77
|
+
'qwen3.5:397b-cloud',
|
|
78
|
+
'gpt-oss:120b-cloud',
|
|
79
|
+
// Local (newest/best first)
|
|
80
|
+
'qwen3-coder:30b',
|
|
81
|
+
'qwen3.5:35b',
|
|
82
|
+
'qwen3.5:27b',
|
|
83
|
+
'qwen3:32b',
|
|
84
|
+
'qwen3:14b',
|
|
85
|
+
'qwen3:8b',
|
|
86
|
+
];
|
|
43
87
|
// ============================================================================
|
|
44
88
|
// System Detection
|
|
45
89
|
// ============================================================================
|
|
@@ -50,7 +94,10 @@ function detectAppleSilicon() {
|
|
|
50
94
|
if (os.platform() !== 'darwin')
|
|
51
95
|
return false;
|
|
52
96
|
try {
|
|
53
|
-
const brand = execSync('sysctl -n machdep.cpu.brand_string', {
|
|
97
|
+
const brand = execSync('sysctl -n machdep.cpu.brand_string', {
|
|
98
|
+
encoding: 'utf-8',
|
|
99
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
100
|
+
}).trim();
|
|
54
101
|
return brand.includes('Apple');
|
|
55
102
|
}
|
|
56
103
|
catch {
|
|
@@ -64,7 +111,7 @@ function detectAppleSilicon() {
|
|
|
64
111
|
*/
|
|
65
112
|
function detectNvidiaVRAM() {
|
|
66
113
|
try {
|
|
67
|
-
const output = execSync('nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits', { encoding: 'utf-8', timeout: 3000 }).trim();
|
|
114
|
+
const output = execSync('nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits', { encoding: 'utf-8', timeout: 3000, stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
68
115
|
// nvidia-smi returns MB, could have multiple GPUs — take the first
|
|
69
116
|
const mb = parseInt(output.split('\n')[0], 10);
|
|
70
117
|
if (!isNaN(mb) && mb > 0) {
|
|
@@ -120,40 +167,117 @@ export function detectSystem() {
|
|
|
120
167
|
// Model Recommendation
|
|
121
168
|
// ============================================================================
|
|
122
169
|
/**
|
|
123
|
-
* Select the best Ollama model tier based on system capabilities
|
|
170
|
+
* Select the best Ollama model tier based on system capabilities
|
|
171
|
+
* and (optionally) which models are actually installed.
|
|
172
|
+
*
|
|
173
|
+
* When installedModels is provided, the recommendation is constrained
|
|
174
|
+
* to models the user already has pulled — the best available model is
|
|
175
|
+
* used for every tier rather than recommending something that would 404.
|
|
124
176
|
*
|
|
125
|
-
*
|
|
177
|
+
* If only sub-8b models are installed (and no cloud models), sets
|
|
178
|
+
* `noUsableModels: true` so the caller can skip Ollama entirely.
|
|
179
|
+
*
|
|
180
|
+
* Hardware thresholds (usable memory for model weights):
|
|
126
181
|
* < 6 GB → too small, warn user
|
|
127
182
|
* 6-10 GB → small (qwen3:8b everywhere)
|
|
128
|
-
* 10-
|
|
129
|
-
*
|
|
183
|
+
* 10-20 GB → medium (qwen3-coder:30b for standard+)
|
|
184
|
+
* 20+ GB → large (qwen3.5:35b for reasoning/powerful)
|
|
130
185
|
*/
|
|
131
|
-
export function recommendOllamaModels(profile) {
|
|
186
|
+
export function recommendOllamaModels(profile, installedModels) {
|
|
132
187
|
const sys = profile || detectSystem();
|
|
133
188
|
const mem = sys.usableForModelsGb;
|
|
189
|
+
// Determine the hardware-ideal tier
|
|
190
|
+
let ideal;
|
|
134
191
|
if (mem < 4) {
|
|
135
192
|
log.warn('Very limited memory for local models', { usableGb: mem });
|
|
136
|
-
|
|
193
|
+
ideal = {
|
|
137
194
|
...MODEL_TIERS.small,
|
|
138
195
|
reason: `Only ${sys.totalRAMGb} GB RAM detected — qwen3:8b may be slow. Consider using the free tier instead.`,
|
|
139
196
|
};
|
|
140
197
|
}
|
|
141
|
-
if (mem < 10) {
|
|
142
|
-
|
|
198
|
+
else if (mem < 10) {
|
|
199
|
+
ideal = {
|
|
143
200
|
...MODEL_TIERS.small,
|
|
144
201
|
reason: `${sys.totalRAMGb} GB RAM → qwen3:8b (best fit for your hardware)`,
|
|
145
202
|
};
|
|
146
203
|
}
|
|
147
|
-
if (mem <
|
|
148
|
-
|
|
204
|
+
else if (mem < 20) {
|
|
205
|
+
ideal = {
|
|
149
206
|
...MODEL_TIERS.medium,
|
|
150
|
-
reason: `${sys.totalRAMGb} GB RAM → qwen3:
|
|
207
|
+
reason: `${sys.totalRAMGb} GB RAM → qwen3-coder:30b for standard tasks, qwen3:8b for fast tasks`,
|
|
151
208
|
};
|
|
152
209
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
210
|
+
else {
|
|
211
|
+
ideal = {
|
|
212
|
+
...MODEL_TIERS.large,
|
|
213
|
+
reason: `${sys.totalRAMGb} GB RAM → qwen3.5:35b for reasoning/powerful, qwen3-coder:30b for standard`,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
// If we don't know what's installed, return the hardware-ideal recommendation
|
|
217
|
+
if (!installedModels || installedModels.length === 0) {
|
|
218
|
+
return ideal;
|
|
219
|
+
}
|
|
220
|
+
// Constrain to what's actually pulled — pick the best available model
|
|
221
|
+
const installed = new Set(installedModels.map((m) => m.toLowerCase()));
|
|
222
|
+
const bestAvailable = pickBestAvailable(installed);
|
|
223
|
+
if (!bestAvailable) {
|
|
224
|
+
// No usable models installed (all sub-8b, no cloud)
|
|
225
|
+
log.info('No usable models installed', { installed: [...installed] });
|
|
226
|
+
return {
|
|
227
|
+
...ideal,
|
|
228
|
+
noUsableModels: true,
|
|
229
|
+
reason: 'No usable models found (need 8b+ local or cloud model)',
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
// Clamp each tier to what's installed.
|
|
233
|
+
// Cloud models always win over local — they run on remote infrastructure
|
|
234
|
+
// so they're faster and more capable regardless of local hardware.
|
|
235
|
+
const bestIsCloud = isCloudModel(bestAvailable);
|
|
236
|
+
const clamp = (model) => {
|
|
237
|
+
if (bestIsCloud)
|
|
238
|
+
return bestAvailable;
|
|
239
|
+
const norm = model.toLowerCase();
|
|
240
|
+
if (installed.has(norm) || [...installed].some((m) => m.startsWith(norm))) {
|
|
241
|
+
return model;
|
|
242
|
+
}
|
|
243
|
+
return bestAvailable;
|
|
156
244
|
};
|
|
245
|
+
const result = {
|
|
246
|
+
tier: ideal.tier,
|
|
247
|
+
fast: clamp(ideal.fast),
|
|
248
|
+
standard: clamp(ideal.standard),
|
|
249
|
+
reasoning: clamp(ideal.reasoning),
|
|
250
|
+
powerful: clamp(ideal.powerful),
|
|
251
|
+
reason: '',
|
|
252
|
+
};
|
|
253
|
+
// Build reason showing what standard tier will actually use
|
|
254
|
+
const unique = [...new Set([result.fast, result.standard, result.reasoning, result.powerful])];
|
|
255
|
+
result.reason = `${sys.totalRAMGb} GB RAM → ${unique.join(', ')}`;
|
|
256
|
+
return result;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Pick the best usable model from what's installed.
|
|
260
|
+
*
|
|
261
|
+
* Priority:
|
|
262
|
+
* 1. Preferred models in order (cloud first, then best local)
|
|
263
|
+
* 2. Any other installed model that passes isUsableSize()
|
|
264
|
+
* 3. null if nothing qualifies
|
|
265
|
+
*/
|
|
266
|
+
function pickBestAvailable(installed) {
|
|
267
|
+
// Check preferred models in order
|
|
268
|
+
for (const model of MODEL_PREFERENCE) {
|
|
269
|
+
if (installed.has(model) || [...installed].some((m) => m.startsWith(model))) {
|
|
270
|
+
return model;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// Check for any other usable model (non-qwen, non-preferred but >= 8b or cloud)
|
|
274
|
+
for (const model of installed) {
|
|
275
|
+
if (isUsableSize(model)) {
|
|
276
|
+
return model;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
// Nothing qualifies
|
|
280
|
+
return null;
|
|
157
281
|
}
|
|
158
282
|
// ============================================================================
|
|
159
283
|
// Ollama Model Availability
|
|
@@ -162,7 +286,8 @@ export function recommendOllamaModels(profile) {
|
|
|
162
286
|
* Check which models Ollama already has pulled.
|
|
163
287
|
*/
|
|
164
288
|
export async function getOllamaModels(baseUrl) {
|
|
165
|
-
const
|
|
289
|
+
const rawUrl = baseUrl || process.env['OLLAMA_BASE_URL'] || 'http://localhost:11434';
|
|
290
|
+
const url = rawUrl.replace(/\/(api|v1)\/?$/, '');
|
|
166
291
|
const controller = new AbortController();
|
|
167
292
|
const timeout = setTimeout(() => controller.abort(), 2000);
|
|
168
293
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-detect.js","sourceRoot":"","sources":["../src/system-detect.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"system-detect.js","sourceRoot":"","sources":["../src/system-detect.ts"],"names":[],"mappings":"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"}
|