ai.matey.cli 0.2.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 (129) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/convert-request.js +365 -0
  3. package/dist/cjs/convert-request.js.map +1 -0
  4. package/dist/cjs/convert-response.js +211 -0
  5. package/dist/cjs/convert-response.js.map +1 -0
  6. package/dist/cjs/converters/request-converters.js +183 -0
  7. package/dist/cjs/converters/request-converters.js.map +1 -0
  8. package/dist/cjs/converters/response-converters.js +203 -0
  9. package/dist/cjs/converters/response-converters.js.map +1 -0
  10. package/dist/cjs/create-backend.js +569 -0
  11. package/dist/cjs/create-backend.js.map +1 -0
  12. package/dist/cjs/index.js +31 -0
  13. package/dist/cjs/index.js.map +1 -0
  14. package/dist/cjs/main.js +181 -0
  15. package/dist/cjs/main.js.map +1 -0
  16. package/dist/cjs/ollama/commands/list.js +70 -0
  17. package/dist/cjs/ollama/commands/list.js.map +1 -0
  18. package/dist/cjs/ollama/commands/ps.js +80 -0
  19. package/dist/cjs/ollama/commands/ps.js.map +1 -0
  20. package/dist/cjs/ollama/commands/pull.js +198 -0
  21. package/dist/cjs/ollama/commands/pull.js.map +1 -0
  22. package/dist/cjs/ollama/commands/run.js +279 -0
  23. package/dist/cjs/ollama/commands/run.js.map +1 -0
  24. package/dist/cjs/ollama/commands/show.js +138 -0
  25. package/dist/cjs/ollama/commands/show.js.map +1 -0
  26. package/dist/cjs/ollama/index.js +238 -0
  27. package/dist/cjs/ollama/index.js.map +1 -0
  28. package/dist/cjs/ollama/types.js +10 -0
  29. package/dist/cjs/ollama/types.js.map +1 -0
  30. package/dist/cjs/proxy.js +406 -0
  31. package/dist/cjs/proxy.js.map +1 -0
  32. package/dist/cjs/utils/backend-loader.js +112 -0
  33. package/dist/cjs/utils/backend-loader.js.map +1 -0
  34. package/dist/cjs/utils/index.js +29 -0
  35. package/dist/cjs/utils/index.js.map +1 -0
  36. package/dist/cjs/utils/model-translation.js +138 -0
  37. package/dist/cjs/utils/model-translation.js.map +1 -0
  38. package/dist/cjs/utils/output-formatter.js +241 -0
  39. package/dist/cjs/utils/output-formatter.js.map +1 -0
  40. package/dist/cjs/utils/pipeline-inspector.js +90 -0
  41. package/dist/cjs/utils/pipeline-inspector.js.map +1 -0
  42. package/dist/cjs/utils/state-manager.js +114 -0
  43. package/dist/cjs/utils/state-manager.js.map +1 -0
  44. package/dist/esm/convert-request.js +331 -0
  45. package/dist/esm/convert-request.js.map +1 -0
  46. package/dist/esm/convert-response.js +177 -0
  47. package/dist/esm/convert-response.js.map +1 -0
  48. package/dist/esm/converters/request-converters.js +175 -0
  49. package/dist/esm/converters/request-converters.js.map +1 -0
  50. package/dist/esm/converters/response-converters.js +191 -0
  51. package/dist/esm/converters/response-converters.js.map +1 -0
  52. package/dist/esm/create-backend.js +533 -0
  53. package/dist/esm/create-backend.js.map +1 -0
  54. package/dist/esm/index.js +15 -0
  55. package/dist/esm/index.js.map +1 -0
  56. package/dist/esm/main.js +149 -0
  57. package/dist/esm/main.js.map +1 -0
  58. package/dist/esm/ollama/commands/list.js +67 -0
  59. package/dist/esm/ollama/commands/list.js.map +1 -0
  60. package/dist/esm/ollama/commands/ps.js +77 -0
  61. package/dist/esm/ollama/commands/ps.js.map +1 -0
  62. package/dist/esm/ollama/commands/pull.js +195 -0
  63. package/dist/esm/ollama/commands/pull.js.map +1 -0
  64. package/dist/esm/ollama/commands/run.js +243 -0
  65. package/dist/esm/ollama/commands/run.js.map +1 -0
  66. package/dist/esm/ollama/commands/show.js +135 -0
  67. package/dist/esm/ollama/commands/show.js.map +1 -0
  68. package/dist/esm/ollama/index.js +235 -0
  69. package/dist/esm/ollama/index.js.map +1 -0
  70. package/dist/esm/ollama/types.js +9 -0
  71. package/dist/esm/ollama/types.js.map +1 -0
  72. package/dist/esm/proxy.js +403 -0
  73. package/dist/esm/proxy.js.map +1 -0
  74. package/dist/esm/utils/backend-loader.js +74 -0
  75. package/dist/esm/utils/backend-loader.js.map +1 -0
  76. package/dist/esm/utils/index.js +13 -0
  77. package/dist/esm/utils/index.js.map +1 -0
  78. package/dist/esm/utils/model-translation.js +99 -0
  79. package/dist/esm/utils/model-translation.js.map +1 -0
  80. package/dist/esm/utils/output-formatter.js +224 -0
  81. package/dist/esm/utils/output-formatter.js.map +1 -0
  82. package/dist/esm/utils/pipeline-inspector.js +84 -0
  83. package/dist/esm/utils/pipeline-inspector.js.map +1 -0
  84. package/dist/esm/utils/state-manager.js +111 -0
  85. package/dist/esm/utils/state-manager.js.map +1 -0
  86. package/dist/types/convert-request.d.ts +15 -0
  87. package/dist/types/convert-request.d.ts.map +1 -0
  88. package/dist/types/convert-response.d.ts +16 -0
  89. package/dist/types/convert-response.d.ts.map +1 -0
  90. package/dist/types/converters/request-converters.d.ts +139 -0
  91. package/dist/types/converters/request-converters.d.ts.map +1 -0
  92. package/dist/types/converters/response-converters.d.ts +134 -0
  93. package/dist/types/converters/response-converters.d.ts.map +1 -0
  94. package/dist/types/create-backend.d.ts +20 -0
  95. package/dist/types/create-backend.d.ts.map +1 -0
  96. package/dist/types/index.d.ts +13 -0
  97. package/dist/types/index.d.ts.map +1 -0
  98. package/dist/types/main.d.ts +19 -0
  99. package/dist/types/main.d.ts.map +1 -0
  100. package/dist/types/ollama/commands/list.d.ts +32 -0
  101. package/dist/types/ollama/commands/list.d.ts.map +1 -0
  102. package/dist/types/ollama/commands/ps.d.ts +27 -0
  103. package/dist/types/ollama/commands/ps.d.ts.map +1 -0
  104. package/dist/types/ollama/commands/pull.d.ts +21 -0
  105. package/dist/types/ollama/commands/pull.d.ts.map +1 -0
  106. package/dist/types/ollama/commands/run.d.ts +48 -0
  107. package/dist/types/ollama/commands/run.d.ts.map +1 -0
  108. package/dist/types/ollama/commands/show.d.ts +36 -0
  109. package/dist/types/ollama/commands/show.d.ts.map +1 -0
  110. package/dist/types/ollama/index.d.ts +12 -0
  111. package/dist/types/ollama/index.d.ts.map +1 -0
  112. package/dist/types/ollama/types.d.ts +58 -0
  113. package/dist/types/ollama/types.d.ts.map +1 -0
  114. package/dist/types/proxy.d.ts +16 -0
  115. package/dist/types/proxy.d.ts.map +1 -0
  116. package/dist/types/utils/backend-loader.d.ts +55 -0
  117. package/dist/types/utils/backend-loader.d.ts.map +1 -0
  118. package/dist/types/utils/index.d.ts +13 -0
  119. package/dist/types/utils/index.d.ts.map +1 -0
  120. package/dist/types/utils/model-translation.d.ts +64 -0
  121. package/dist/types/utils/model-translation.d.ts.map +1 -0
  122. package/dist/types/utils/output-formatter.d.ts +113 -0
  123. package/dist/types/utils/output-formatter.d.ts.map +1 -0
  124. package/dist/types/utils/pipeline-inspector.d.ts +50 -0
  125. package/dist/types/utils/pipeline-inspector.d.ts.map +1 -0
  126. package/dist/types/utils/state-manager.d.ts +91 -0
  127. package/dist/types/utils/state-manager.d.ts.map +1 -0
  128. package/package.json +75 -0
  129. package/readme.md +32 -0
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * AI.Matey CLI - Main Entry Point
4
+ *
5
+ * Unified CLI with subcommands for various utilities.
6
+ *
7
+ * Usage:
8
+ * ai-matey <command> [options]
9
+ *
10
+ * Commands:
11
+ * convert-response Convert IR responses to provider formats
12
+ * emulate-ollama Emulate Ollama CLI interface
13
+ * (future) emulate-openai, emulate-anthropic, etc.
14
+ *
15
+ * @module cli/main
16
+ */
17
+ // ============================================================================
18
+ // Help Text
19
+ // ============================================================================
20
+ function showHelp() {
21
+ console.log(`
22
+ AI.Matey CLI v0.1.0
23
+ Universal AI Adapter System - Provider-agnostic interface for AI APIs
24
+
25
+ USAGE:
26
+ ai-matey <command> [options]
27
+
28
+ COMMANDS:
29
+ convert-response Convert Universal IR responses to provider formats
30
+ (OpenAI, Anthropic, Gemini, Ollama, Mistral)
31
+
32
+ convert-request Convert between Universal IR and provider request formats
33
+ (bidirectional: IR ↔ OpenAI, Anthropic, etc.)
34
+
35
+ emulate-ollama Emulate Ollama CLI interface using any backend
36
+ (compatible with Ollama commands: run, list, ps, show)
37
+
38
+ create-backend Generate a backend adapter template for emulate commands
39
+ (supports OpenAI-compatible APIs, Groq, Together AI, etc.)
40
+
41
+ proxy Start an HTTP proxy server that accepts provider requests
42
+ and routes them through any backend (OpenAI-compatible!)
43
+
44
+ GLOBAL OPTIONS:
45
+ -h, --help Show this help message
46
+ -v, --version Show version number
47
+
48
+ EXAMPLES:
49
+ # Convert IR response to OpenAI format
50
+ ai-matey convert-response --format openai --input response.json
51
+
52
+ # Convert OpenAI request to IR (for migration)
53
+ ai-matey convert-request --from openai --to ir --input openai-req.json
54
+
55
+ # Create a backend adapter
56
+ ai-matey create-backend --provider groq --output ./groq-backend.mjs
57
+
58
+ # Emulate Ollama CLI with your backend
59
+ ai-matey emulate-ollama --backend ./groq-backend.mjs run llama3-8b-8192
60
+
61
+ # Start OpenAI-compatible proxy server
62
+ ai-matey proxy --backend ./groq-backend.mjs --port 3000
63
+
64
+ # Get help for a specific command
65
+ ai-matey convert-response --help
66
+ ai-matey convert-request --help
67
+ ai-matey emulate-ollama --help
68
+ ai-matey create-backend --help
69
+ ai-matey proxy --help
70
+
71
+ Run 'ai-matey <command> --help' for more information on a specific command.
72
+ `);
73
+ }
74
+ function showVersion() {
75
+ console.log('ai-matey version 0.1.0');
76
+ }
77
+ // ============================================================================
78
+ // Subcommand Routing
79
+ // ============================================================================
80
+ async function main() {
81
+ const args = process.argv.slice(2);
82
+ // Handle no arguments
83
+ if (args.length === 0) {
84
+ showHelp();
85
+ process.exit(0);
86
+ }
87
+ const command = args[0];
88
+ // Handle global flags (only if no command or if help/version is the first arg)
89
+ if (command === '--help' || command === '-h') {
90
+ showHelp();
91
+ process.exit(0);
92
+ }
93
+ if (command === '--version' || command === '-v') {
94
+ showVersion();
95
+ process.exit(0);
96
+ }
97
+ // Route to subcommand
98
+ switch (command) {
99
+ case 'convert-response': {
100
+ const { main: convertMain } = await import('./convert-response.js');
101
+ // Remove the command name from args
102
+ process.argv = [process.argv[0] || 'node', process.argv[1] || 'ai-matey', ...args.slice(1)];
103
+ await convertMain();
104
+ break;
105
+ }
106
+ case 'convert-request': {
107
+ const { main: convertRequestMain } = await import('./convert-request.js');
108
+ // Remove the command name from args
109
+ process.argv = [process.argv[0] || 'node', process.argv[1] || 'ai-matey', ...args.slice(1)];
110
+ await convertRequestMain();
111
+ break;
112
+ }
113
+ case 'emulate-ollama': {
114
+ const { main: ollamaMain } = await import('./ollama/index.js');
115
+ // Remove the command name from args
116
+ process.argv = [process.argv[0] || 'node', process.argv[1] || 'ai-matey', ...args.slice(1)];
117
+ await ollamaMain();
118
+ break;
119
+ }
120
+ case 'create-backend': {
121
+ const { main: createBackendMain } = await import('./create-backend.js');
122
+ // Remove the command name from args
123
+ process.argv = [process.argv[0] || 'node', process.argv[1] || 'ai-matey', ...args.slice(1)];
124
+ await createBackendMain();
125
+ break;
126
+ }
127
+ case 'proxy': {
128
+ const { main: proxyMain } = await import('./proxy.js');
129
+ // Remove the command name from args
130
+ process.argv = [process.argv[0] || 'node', process.argv[1] || 'ai-matey', ...args.slice(1)];
131
+ await proxyMain();
132
+ break;
133
+ }
134
+ default:
135
+ console.error(`Error: Unknown command '${command}'`);
136
+ console.error(`Run 'ai-matey --help' to see available commands.`);
137
+ process.exit(1);
138
+ }
139
+ }
140
+ // ============================================================================
141
+ // Export and Execute
142
+ // ============================================================================
143
+ export { main };
144
+ // Run main when executed directly
145
+ main().catch((error) => {
146
+ console.error('Fatal error:', error instanceof Error ? error.message : String(error));
147
+ process.exit(1);
148
+ });
149
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Ollama `list` Command
3
+ *
4
+ * List available models.
5
+ *
6
+ * @module cli/ollama/commands/list
7
+ */
8
+ import { formatTable, formatRelativeTime, colorize } from '../../utils/output-formatter.js';
9
+ /**
10
+ * Execute the list command.
11
+ */
12
+ export async function listCommand(options) {
13
+ const { backend, modelMapping, json = false, verbose = false } = options;
14
+ try {
15
+ // Check if backend supports listModels
16
+ const listModels = backend.listModels;
17
+ if (typeof listModels !== 'function') {
18
+ console.error(colorize(`Backend ${backend.metadata.name} does not support listing models`, 'yellow'));
19
+ console.log('\nThis backend may require manual model configuration.');
20
+ return;
21
+ }
22
+ // Fetch models
23
+ const result = await listModels.call(backend);
24
+ if (!result || !result.models || result.models.length === 0) {
25
+ console.log(colorize('No models available', 'gray'));
26
+ return;
27
+ }
28
+ const models = result.models;
29
+ if (json) {
30
+ console.log(JSON.stringify(models, null, 2));
31
+ return;
32
+ }
33
+ // Format as table
34
+ const rows = models.map((model) => {
35
+ const name = model.name || model.id;
36
+ const translatedName = modelMapping
37
+ ? Object.entries(modelMapping).find(([_, v]) => v === name)?.[0]
38
+ : undefined;
39
+ return {
40
+ name: translatedName ? `${translatedName} ${colorize(`(${name})`, 'gray')}` : name,
41
+ id: model.id?.slice(0, 12) || 'N/A',
42
+ size: model.contextWindow ? `${(model.contextWindow / 1000).toFixed(0)}K ctx` : 'N/A',
43
+ modified: model.created ? formatRelativeTime(new Date(model.created).getTime()) : 'N/A',
44
+ };
45
+ });
46
+ console.log();
47
+ const table = formatTable({
48
+ columns: [
49
+ { key: 'name', header: 'NAME' },
50
+ { key: 'id', header: 'ID' },
51
+ { key: 'size', header: 'CONTEXT' },
52
+ { key: 'modified', header: 'MODIFIED' },
53
+ ],
54
+ rows,
55
+ });
56
+ console.log(table);
57
+ console.log();
58
+ if (verbose) {
59
+ console.log(colorize(`Total models: ${models.length}`, 'gray'));
60
+ }
61
+ }
62
+ catch (error) {
63
+ console.error(colorize(`Error listing models: ${error instanceof Error ? error.message : String(error)}`, 'red'));
64
+ process.exit(1);
65
+ }
66
+ }
67
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../src/ollama/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Ollama `ps` Command
3
+ *
4
+ * List running models.
5
+ *
6
+ * @module cli/ollama/commands/ps
7
+ */
8
+ import { stateManager } from '../../utils/state-manager.js';
9
+ import { isModelRunner } from '../../utils/backend-loader.js';
10
+ import { formatTable, formatSize, formatDuration, colorize } from '../../utils/output-formatter.js';
11
+ /**
12
+ * Execute the ps command.
13
+ */
14
+ export async function psCommand(options) {
15
+ const { backend, json = false, verbose = false } = options;
16
+ try {
17
+ // Get running models from state manager
18
+ const runningModels = stateManager.getAll();
19
+ if (runningModels.length === 0) {
20
+ if (json) {
21
+ console.log('[]');
22
+ }
23
+ else {
24
+ console.log(colorize('No models currently running', 'gray'));
25
+ }
26
+ return;
27
+ }
28
+ if (json) {
29
+ console.log(JSON.stringify(runningModels, null, 2));
30
+ return;
31
+ }
32
+ // Format as table
33
+ const now = Date.now();
34
+ const rows = runningModels.map((model) => {
35
+ const ttlRemaining = model.ttl
36
+ ? Math.max(0, model.ttl - (now - model.lastActivity))
37
+ : undefined;
38
+ return {
39
+ name: model.name,
40
+ id: model.pid?.toString().slice(0, 12) || 'N/A',
41
+ size: model.size ? formatSize(model.size) : 'N/A',
42
+ processor: isModelRunner(backend) ? 'GPU/CPU' : 'API',
43
+ until: ttlRemaining ? `${formatDuration(ttlRemaining)} from now` : 'Running',
44
+ };
45
+ });
46
+ console.log();
47
+ const table = formatTable({
48
+ columns: [
49
+ { key: 'name', header: 'NAME' },
50
+ { key: 'id', header: 'ID' },
51
+ { key: 'size', header: 'SIZE' },
52
+ { key: 'processor', header: 'PROCESSOR' },
53
+ { key: 'until', header: 'UNTIL' },
54
+ ],
55
+ rows,
56
+ });
57
+ console.log(table);
58
+ console.log();
59
+ if (verbose) {
60
+ console.log(colorize(`Total running: ${runningModels.length}`, 'gray'));
61
+ // Show backend stats if available
62
+ if (isModelRunner(backend)) {
63
+ const runner = backend;
64
+ const stats = runner.getStats();
65
+ if (stats) {
66
+ console.log(colorize(`Backend uptime: ${formatDuration(stats.uptime || 0)}`, 'gray'));
67
+ console.log(colorize(`Request count: ${stats.requestCount || 0}`, 'gray'));
68
+ }
69
+ }
70
+ }
71
+ }
72
+ catch (error) {
73
+ console.error(colorize(`Error listing running models: ${error instanceof Error ? error.message : String(error)}`, 'red'));
74
+ process.exit(1);
75
+ }
76
+ }
77
+ //# sourceMappingURL=ps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ps.js","sourceRoot":"","sources":["../../../../src/ollama/commands/ps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Pull Command - Download GGUF models from Ollama registry
3
+ *
4
+ * Downloads .gguf model files from the Ollama registry API.
5
+ *
6
+ * @module cli/ollama/commands/pull
7
+ */
8
+ import { mkdir } from 'node:fs/promises';
9
+ import { resolve, dirname } from 'node:path';
10
+ import { createWriteStream, existsSync } from 'node:fs';
11
+ import { pipeline } from 'node:stream/promises';
12
+ import { Readable } from 'node:stream';
13
+ import { success, error, info, warn } from '../../utils/output-formatter.js';
14
+ /**
15
+ * Ollama registry base URL.
16
+ */
17
+ const OLLAMA_REGISTRY = 'https://registry.ollama.ai/v2/library';
18
+ /**
19
+ * Parse model specification into name and tag.
20
+ * Format: model:tag or model (defaults to 'latest')
21
+ */
22
+ function parseModel(modelSpec) {
23
+ const parts = modelSpec.split(':');
24
+ const name = parts[0] || 'llama3.1';
25
+ const tag = parts[1] || 'latest';
26
+ return { name, tag };
27
+ }
28
+ /**
29
+ * Format bytes for human-readable display.
30
+ */
31
+ function formatBytes(bytes) {
32
+ const units = ['B', 'KB', 'MB', 'GB'];
33
+ let size = bytes;
34
+ let unitIndex = 0;
35
+ while (size >= 1024 && unitIndex < units.length - 1) {
36
+ size /= 1024;
37
+ unitIndex++;
38
+ }
39
+ return `${size.toFixed(2)} ${units[unitIndex]}`;
40
+ }
41
+ /**
42
+ * Fetch manifest from Ollama registry.
43
+ */
44
+ async function fetchManifest(name, tag, verbose) {
45
+ const manifestUrl = `${OLLAMA_REGISTRY}/${name}/manifests/${tag}`;
46
+ if (verbose) {
47
+ info(`Fetching manifest: ${manifestUrl}`);
48
+ }
49
+ const response = await fetch(manifestUrl, {
50
+ headers: {
51
+ Accept: 'application/vnd.docker.distribution.manifest.v2+json',
52
+ },
53
+ });
54
+ if (!response.ok) {
55
+ if (response.status === 404) {
56
+ throw new Error(`Model not found: ${name}:${tag}\n\nAvailable models at https://ollama.com/library`);
57
+ }
58
+ throw new Error(`Failed to fetch manifest: ${response.status} ${response.statusText}`);
59
+ }
60
+ const manifest = await response.json();
61
+ const data = manifest;
62
+ if (verbose) {
63
+ info(`Manifest retrieved: ${data.layers?.length || 0} layers`);
64
+ }
65
+ return data;
66
+ }
67
+ /**
68
+ * Find GGUF layer in manifest.
69
+ */
70
+ function findGGUFLayer(manifest) {
71
+ if (!manifest.layers || !Array.isArray(manifest.layers)) {
72
+ return null;
73
+ }
74
+ // Look for layers with GGUF-related media types or the largest layer
75
+ // Ollama typically uses application/vnd.ollama.image.model for the model file
76
+ const modelLayer = manifest.layers.find((layer) => layer.mediaType === 'application/vnd.ollama.image.model');
77
+ if (modelLayer) {
78
+ return {
79
+ digest: modelLayer.digest,
80
+ size: modelLayer.size || 0,
81
+ mediaType: modelLayer.mediaType,
82
+ };
83
+ }
84
+ // Fallback: Use the largest layer (usually the model)
85
+ const largestLayer = manifest.layers.reduce((largest, layer) => {
86
+ return (layer.size || 0) > (largest?.size || 0) ? layer : largest;
87
+ }, null);
88
+ if (largestLayer) {
89
+ return {
90
+ digest: largestLayer.digest,
91
+ size: largestLayer.size || 0,
92
+ mediaType: largestLayer.mediaType,
93
+ };
94
+ }
95
+ return null;
96
+ }
97
+ /**
98
+ * Download blob from Ollama registry with progress.
99
+ */
100
+ async function downloadBlob(name, digest, outputPath, size, verbose) {
101
+ const blobUrl = `${OLLAMA_REGISTRY}/${name}/blobs/${digest}`;
102
+ if (verbose) {
103
+ info(`Downloading from: ${blobUrl}`);
104
+ }
105
+ // Ensure output directory exists
106
+ const dir = dirname(outputPath);
107
+ if (!existsSync(dir)) {
108
+ await mkdir(dir, { recursive: true });
109
+ }
110
+ const response = await fetch(blobUrl);
111
+ if (!response.ok) {
112
+ throw new Error(`Failed to download blob: ${response.status} ${response.statusText}`);
113
+ }
114
+ if (!response.body) {
115
+ throw new Error('Response body is null');
116
+ }
117
+ // Create progress tracker
118
+ let downloaded = 0;
119
+ let lastProgress = 0;
120
+ const startTime = Date.now();
121
+ const nodeStream = Readable.fromWeb(response.body);
122
+ const fileStream = createWriteStream(outputPath);
123
+ // Track progress
124
+ nodeStream.on('data', (chunk) => {
125
+ downloaded += chunk.length;
126
+ const progress = Math.floor((downloaded / size) * 100);
127
+ // Update progress every 5%
128
+ if (progress >= lastProgress + 5 || progress === 100) {
129
+ const elapsed = (Date.now() - startTime) / 1000;
130
+ const speed = downloaded / elapsed;
131
+ const remaining = size - downloaded;
132
+ const eta = remaining / speed;
133
+ process.stdout.write(`\r${formatBytes(downloaded)} / ${formatBytes(size)} (${progress}%) - ` +
134
+ `${formatBytes(speed)}/s - ETA: ${Math.floor(eta)}s`);
135
+ lastProgress = progress;
136
+ }
137
+ });
138
+ await pipeline(nodeStream, fileStream);
139
+ // Final newline after progress
140
+ process.stdout.write('\n');
141
+ }
142
+ /**
143
+ * Pull command - Download GGUF model from Ollama registry.
144
+ */
145
+ export async function pullCommand(options) {
146
+ const { model: modelSpec, output, verbose = false } = options;
147
+ try {
148
+ // Parse model specification
149
+ const { name, tag } = parseModel(modelSpec);
150
+ info(`Pulling ${name}:${tag} from Ollama registry...`);
151
+ // Step 1: Fetch manifest
152
+ const manifest = await fetchManifest(name, tag, verbose);
153
+ // Step 2: Find GGUF layer
154
+ const layer = findGGUFLayer(manifest);
155
+ if (!layer) {
156
+ throw new Error('No model layer found in manifest. This may not be a GGUF model.');
157
+ }
158
+ if (verbose) {
159
+ info(`Found model layer:`);
160
+ info(` Digest: ${layer.digest}`);
161
+ info(` Size: ${formatBytes(layer.size)}`);
162
+ info(` Media Type: ${layer.mediaType}`);
163
+ }
164
+ // Step 3: Determine output path
165
+ const defaultOutput = resolve(process.cwd(), 'models', `${name}-${tag}.gguf`);
166
+ const outputPath = output ? resolve(process.cwd(), output) : defaultOutput;
167
+ // Check if file already exists
168
+ if (existsSync(outputPath)) {
169
+ warn(`File already exists: ${outputPath}`);
170
+ const confirmOverwrite = process.env.FORCE_OVERWRITE === 'true';
171
+ if (!confirmOverwrite) {
172
+ error('Use FORCE_OVERWRITE=true to overwrite existing file');
173
+ process.exit(1);
174
+ }
175
+ }
176
+ info(`Downloading to: ${outputPath}`);
177
+ info(`Size: ${formatBytes(layer.size)}`);
178
+ // Step 4: Download blob
179
+ await downloadBlob(name, layer.digest, outputPath, layer.size, verbose);
180
+ success(`\n✓ Model downloaded successfully: ${outputPath}`);
181
+ console.log('\nNext steps:');
182
+ console.log(` 1. Use with node-llama-cpp backend:`);
183
+ console.log(` ai-matey create-backend --provider node-llamacpp`);
184
+ console.log(` 2. Set modelPath in backend config to: ${outputPath}`);
185
+ console.log(` 3. Run: ai-matey emulate-ollama --backend ./backend.mjs run ${name}`);
186
+ }
187
+ catch (err) {
188
+ error(`Failed to pull model: ${err instanceof Error ? err.message : String(err)}`);
189
+ if (verbose && err instanceof Error) {
190
+ console.error(err.stack);
191
+ }
192
+ process.exit(1);
193
+ }
194
+ }
195
+ //# sourceMappingURL=pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../../src/ollama/commands/pull.ts"],"names":[],"mappings":"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"}