@mindstudio-ai/local-model-tunnel 0.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 +59 -0
- package/dist/api.d.ts +39 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +139 -0
- package/dist/api.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +274 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +17 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +87 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/ollama.d.ts +11 -0
- package/dist/ollama.d.ts.map +1 -0
- package/dist/ollama.js +36 -0
- package/dist/ollama.js.map +1 -0
- package/dist/runner.d.ts +12 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +168 -0
- package/dist/runner.js.map +1 -0
- package/package.json +50 -0
package/README.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# MindStudio Local Model Tunnel
|
|
2
|
+
|
|
3
|
+
Run local models with MindStudio.
|
|
4
|
+
|
|
5
|
+
Only Ollama is supported right now, with more providers coming soon.
|
|
6
|
+
|
|
7
|
+
## Prerequisites
|
|
8
|
+
|
|
9
|
+
- Node.js 18+
|
|
10
|
+
- [Ollama](https://ollama.ai) installed and running
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install -g @mindstudio/local-model-tunnel
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Quick Start
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# Authenticate with MindStudio
|
|
22
|
+
mindstudio-local auth
|
|
23
|
+
|
|
24
|
+
# Register your local models on MindStudio
|
|
25
|
+
mindstudio-local register
|
|
26
|
+
|
|
27
|
+
# Start the tunnel
|
|
28
|
+
mindstudio-local start
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Commands
|
|
32
|
+
|
|
33
|
+
| Command | Description |
|
|
34
|
+
| ---------- | ----------------------------------------- |
|
|
35
|
+
| `auth` | Authenticate with MindStudio via browser |
|
|
36
|
+
| `register` | Register all local models with MindStudio |
|
|
37
|
+
| `start` | Start the local model tunnel |
|
|
38
|
+
| `models` | List available local Ollama models |
|
|
39
|
+
| `status` | Check connection status |
|
|
40
|
+
| `config` | Show current configuration |
|
|
41
|
+
| `logout` | Remove stored credentials |
|
|
42
|
+
|
|
43
|
+
## Options
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# Use custom Ollama URL
|
|
47
|
+
mindstudio-local start --ollama-url http://localhost:11434
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## How It Works
|
|
51
|
+
|
|
52
|
+
1. Authenticates with your MindStudio account
|
|
53
|
+
2. Discovers local Ollama models
|
|
54
|
+
3. Polls MindStudio for inference requests
|
|
55
|
+
4. Routes requests to local Ollama and streams responses back
|
|
56
|
+
|
|
57
|
+
## License
|
|
58
|
+
|
|
59
|
+
MIT
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface LocalModelRequest {
|
|
2
|
+
id: string;
|
|
3
|
+
organizationId: string;
|
|
4
|
+
modelId: string;
|
|
5
|
+
requestType: "llm_chat" | "image_generation" | "video_generation";
|
|
6
|
+
payload: {
|
|
7
|
+
messages?: Array<{
|
|
8
|
+
role: string;
|
|
9
|
+
content: string;
|
|
10
|
+
}>;
|
|
11
|
+
prompt?: string;
|
|
12
|
+
temperature?: number;
|
|
13
|
+
maxTokens?: number;
|
|
14
|
+
config?: Record<string, unknown>;
|
|
15
|
+
};
|
|
16
|
+
createdAt: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function pollForRequest(models: string[]): Promise<LocalModelRequest | null>;
|
|
19
|
+
export declare function submitProgress(requestId: string, content: string): Promise<void>;
|
|
20
|
+
export declare function submitResult(requestId: string, success: boolean, result?: {
|
|
21
|
+
content?: string;
|
|
22
|
+
usage?: {
|
|
23
|
+
promptTokens: number;
|
|
24
|
+
completionTokens: number;
|
|
25
|
+
};
|
|
26
|
+
}, error?: string): Promise<void>;
|
|
27
|
+
export declare function verifyApiKey(): Promise<boolean>;
|
|
28
|
+
export declare function registerLocalModel(modelName: string): Promise<void>;
|
|
29
|
+
export declare function getRegisteredModels(): Promise<string[]>;
|
|
30
|
+
export declare function requestDeviceAuth(): Promise<{
|
|
31
|
+
url: string;
|
|
32
|
+
token: string;
|
|
33
|
+
}>;
|
|
34
|
+
export declare function pollDeviceAuth(token: string): Promise<{
|
|
35
|
+
status: "pending" | "completed" | "expired";
|
|
36
|
+
apiKey?: string;
|
|
37
|
+
}>;
|
|
38
|
+
export declare function disconnectHeartbeat(): Promise<void>;
|
|
39
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,UAAU,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;IAClE,OAAO,EAAE;QACP,QAAQ,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACpD,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;CACnB;AAcD,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAsBnC;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE;IACP,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D,EACD,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAarD;AAED,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAazE;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAiB7D;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAmBD;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3D,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC,CAoBD;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAYzD"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pollForRequest = pollForRequest;
|
|
4
|
+
exports.submitProgress = submitProgress;
|
|
5
|
+
exports.submitResult = submitResult;
|
|
6
|
+
exports.verifyApiKey = verifyApiKey;
|
|
7
|
+
exports.registerLocalModel = registerLocalModel;
|
|
8
|
+
exports.getRegisteredModels = getRegisteredModels;
|
|
9
|
+
exports.requestDeviceAuth = requestDeviceAuth;
|
|
10
|
+
exports.pollDeviceAuth = pollDeviceAuth;
|
|
11
|
+
exports.disconnectHeartbeat = disconnectHeartbeat;
|
|
12
|
+
const config_js_1 = require("./config.js");
|
|
13
|
+
function getHeaders() {
|
|
14
|
+
const apiKey = (0, config_js_1.getApiKey)();
|
|
15
|
+
if (!apiKey) {
|
|
16
|
+
throw new Error("Not authenticated. Run: mindstudio-local auth");
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
Authorization: `Bearer ${apiKey}`,
|
|
20
|
+
"Content-Type": "application/json",
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
async function pollForRequest(models) {
|
|
24
|
+
const baseUrl = (0, config_js_1.getApiBaseUrl)();
|
|
25
|
+
const modelsParam = models.join(",");
|
|
26
|
+
const response = await fetch(`${baseUrl}/v1/local-models/poll?models=${encodeURIComponent(modelsParam)}`, {
|
|
27
|
+
method: "GET",
|
|
28
|
+
headers: getHeaders(),
|
|
29
|
+
});
|
|
30
|
+
if (response.status === 204) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
const error = await response.text();
|
|
35
|
+
throw new Error(`Poll failed: ${response.status} ${error}`);
|
|
36
|
+
}
|
|
37
|
+
const data = (await response.json());
|
|
38
|
+
return data.request;
|
|
39
|
+
}
|
|
40
|
+
async function submitProgress(requestId, content) {
|
|
41
|
+
const baseUrl = (0, config_js_1.getApiBaseUrl)();
|
|
42
|
+
const response = await fetch(`${baseUrl}/v1/local-models/requests/${requestId}/progress`, {
|
|
43
|
+
method: "POST",
|
|
44
|
+
headers: getHeaders(),
|
|
45
|
+
body: JSON.stringify({ content }),
|
|
46
|
+
});
|
|
47
|
+
if (!response.ok) {
|
|
48
|
+
console.warn(`Progress update failed: ${response.status}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function submitResult(requestId, success, result, error) {
|
|
52
|
+
const baseUrl = (0, config_js_1.getApiBaseUrl)();
|
|
53
|
+
const response = await fetch(`${baseUrl}/v1/local-models/requests/${requestId}/result`, {
|
|
54
|
+
method: "POST",
|
|
55
|
+
headers: getHeaders(),
|
|
56
|
+
body: JSON.stringify({ success, result, error }),
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
const errorText = await response.text();
|
|
60
|
+
throw new Error(`Result submission failed: ${response.status} ${errorText}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function verifyApiKey() {
|
|
64
|
+
const baseUrl = (0, config_js_1.getApiBaseUrl)();
|
|
65
|
+
try {
|
|
66
|
+
const response = await fetch(`${baseUrl}/v1/local-models/verify-api-key`, {
|
|
67
|
+
method: "GET",
|
|
68
|
+
headers: getHeaders(),
|
|
69
|
+
});
|
|
70
|
+
return response.status === 204 || response.ok;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function registerLocalModel(modelName) {
|
|
77
|
+
const baseUrl = (0, config_js_1.getApiBaseUrl)();
|
|
78
|
+
const response = await fetch(`${baseUrl}/v1/local-models/models/create`, {
|
|
79
|
+
method: "POST",
|
|
80
|
+
headers: getHeaders(),
|
|
81
|
+
body: JSON.stringify({ modelName, provider: "ollama" }),
|
|
82
|
+
});
|
|
83
|
+
if (!response.ok) {
|
|
84
|
+
const errorText = await response.text();
|
|
85
|
+
throw new Error(`Register failed: ${response.status} ${errorText}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async function getRegisteredModels() {
|
|
89
|
+
const baseUrl = (0, config_js_1.getApiBaseUrl)();
|
|
90
|
+
const response = await fetch(`${baseUrl}/v1/local-models/models`, {
|
|
91
|
+
method: "GET",
|
|
92
|
+
headers: getHeaders(),
|
|
93
|
+
});
|
|
94
|
+
if (!response.ok) {
|
|
95
|
+
const errorText = await response.text();
|
|
96
|
+
throw new Error(`Failed to fetch registered models: ${response.status} ${errorText}`);
|
|
97
|
+
}
|
|
98
|
+
const data = (await response.json());
|
|
99
|
+
return data.models;
|
|
100
|
+
}
|
|
101
|
+
async function requestDeviceAuth() {
|
|
102
|
+
const baseUrl = (0, config_js_1.getApiBaseUrl)();
|
|
103
|
+
const response = await fetch(`${baseUrl}/developer/v2/request-auth-url`, {
|
|
104
|
+
method: "GET",
|
|
105
|
+
headers: { "Content-Type": "application/json" },
|
|
106
|
+
});
|
|
107
|
+
if (!response.ok) {
|
|
108
|
+
const error = await response.text();
|
|
109
|
+
throw new Error(`Device auth request failed: ${response.status} ${error}`);
|
|
110
|
+
}
|
|
111
|
+
const data = (await response.json());
|
|
112
|
+
return data;
|
|
113
|
+
}
|
|
114
|
+
async function pollDeviceAuth(token) {
|
|
115
|
+
const baseUrl = (0, config_js_1.getApiBaseUrl)();
|
|
116
|
+
const response = await fetch(`${baseUrl}/developer/v2/poll-auth-url`, {
|
|
117
|
+
method: "POST",
|
|
118
|
+
headers: { "Content-Type": "application/json" },
|
|
119
|
+
body: JSON.stringify({ token }),
|
|
120
|
+
});
|
|
121
|
+
if (!response.ok) {
|
|
122
|
+
const error = await response.text();
|
|
123
|
+
throw new Error(`Device auth poll failed: ${response.status} ${error}`);
|
|
124
|
+
}
|
|
125
|
+
const data = (await response.json());
|
|
126
|
+
return data;
|
|
127
|
+
}
|
|
128
|
+
async function disconnectHeartbeat() {
|
|
129
|
+
const baseUrl = (0, config_js_1.getApiBaseUrl)();
|
|
130
|
+
const response = await fetch(`${baseUrl}/v1/local-models/disconnect`, {
|
|
131
|
+
method: "POST",
|
|
132
|
+
headers: getHeaders(),
|
|
133
|
+
});
|
|
134
|
+
if (!response.ok) {
|
|
135
|
+
const error = await response.text();
|
|
136
|
+
throw new Error(`Heartbeat disconnect failed: ${response.status} ${error}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const open_1 = __importDefault(require("open"));
|
|
8
|
+
const commander_1 = require("commander");
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const ora_1 = __importDefault(require("ora"));
|
|
11
|
+
const config_js_1 = require("./config.js");
|
|
12
|
+
const ollama_js_1 = require("./ollama.js");
|
|
13
|
+
const api_js_1 = require("./api.js");
|
|
14
|
+
const runner_js_1 = require("./runner.js");
|
|
15
|
+
const program = new commander_1.Command();
|
|
16
|
+
program
|
|
17
|
+
.name("mindstudio-local")
|
|
18
|
+
.description("Run local AI models with MindStudio")
|
|
19
|
+
.version("0.1.0");
|
|
20
|
+
// Global option for environment
|
|
21
|
+
program.option("-e, --env <environment>", "Environment to use (prod, local)", undefined);
|
|
22
|
+
// Pre-action hook to set environment from global option
|
|
23
|
+
program.hook("preAction", (thisCommand) => {
|
|
24
|
+
const opts = thisCommand.opts();
|
|
25
|
+
if (opts.env) {
|
|
26
|
+
if (opts.env !== "prod" && opts.env !== "local") {
|
|
27
|
+
console.log(chalk_1.default.red(`Invalid environment: ${opts.env}. Use 'prod' or 'local'.`));
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
(0, config_js_1.setEnvironment)(opts.env);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
// Helper to show environment badge
|
|
34
|
+
function envBadge() {
|
|
35
|
+
const env = (0, config_js_1.getEnvironment)();
|
|
36
|
+
if (env === "local") {
|
|
37
|
+
return chalk_1.default.bgYellow.black(" LOCAL ");
|
|
38
|
+
}
|
|
39
|
+
return chalk_1.default.bgGreen.black(" PROD ");
|
|
40
|
+
}
|
|
41
|
+
const displayModels = (models) => {
|
|
42
|
+
console.log(chalk_1.default.blue("\nAvailable Models\n"));
|
|
43
|
+
models.forEach((m) => {
|
|
44
|
+
console.log(` ${chalk_1.default.green("*")} ${m.name}`);
|
|
45
|
+
});
|
|
46
|
+
console.log("");
|
|
47
|
+
};
|
|
48
|
+
// Auth command
|
|
49
|
+
program
|
|
50
|
+
.command("auth")
|
|
51
|
+
.description("Authenticate with MindStudio via browser")
|
|
52
|
+
.action(async () => {
|
|
53
|
+
const info = (0, config_js_1.getEnvironmentInfo)();
|
|
54
|
+
console.log(chalk_1.default.blue(`\nMindStudio Authentication ${envBadge()}\n`));
|
|
55
|
+
console.log(chalk_1.default.white(`API: ${info.apiBaseUrl}\n`));
|
|
56
|
+
const spinner = (0, ora_1.default)("Requesting authorization...").start();
|
|
57
|
+
const { url: authUrl, token } = await (0, api_js_1.requestDeviceAuth)();
|
|
58
|
+
spinner.stop();
|
|
59
|
+
console.log(chalk_1.default.white("Opening browser for authentication...\n"));
|
|
60
|
+
console.log(chalk_1.default.white(` If browser doesn't open, visit:`));
|
|
61
|
+
console.log(chalk_1.default.cyan(` ${authUrl}\n`));
|
|
62
|
+
await (0, open_1.default)(authUrl);
|
|
63
|
+
const pollSpinner = (0, ora_1.default)("Waiting for browser authorization...").start();
|
|
64
|
+
const pollInterval = 2000;
|
|
65
|
+
const maxAttempts = 30;
|
|
66
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
67
|
+
await sleep(pollInterval);
|
|
68
|
+
const result = await (0, api_js_1.pollDeviceAuth)(token);
|
|
69
|
+
if (result.status === "completed" && result.apiKey) {
|
|
70
|
+
(0, config_js_1.setApiKey)(result.apiKey);
|
|
71
|
+
pollSpinner.succeed(chalk_1.default.green("Authenticated successfully!"));
|
|
72
|
+
console.log(chalk_1.default.white(`Config saved to: ${(0, config_js_1.getConfigPath)()}\n`));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (result.status === "expired") {
|
|
76
|
+
pollSpinner.fail(chalk_1.default.red("Authorization expired. Please try again."));
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
const remaining = Math.floor(((maxAttempts - i) * pollInterval) / 1000);
|
|
80
|
+
pollSpinner.text = `Waiting for browser authorization... (${remaining}s remaining)`;
|
|
81
|
+
}
|
|
82
|
+
pollSpinner.fail(chalk_1.default.red("Authorization timed out. Please try again."));
|
|
83
|
+
process.exit(1);
|
|
84
|
+
});
|
|
85
|
+
function sleep(ms) {
|
|
86
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
87
|
+
}
|
|
88
|
+
// Logout command
|
|
89
|
+
program
|
|
90
|
+
.command("logout")
|
|
91
|
+
.description("Remove stored credentials for current environment")
|
|
92
|
+
.action(() => {
|
|
93
|
+
(0, config_js_1.clearApiKey)();
|
|
94
|
+
console.log(chalk_1.default.green(`Logged out from ${(0, config_js_1.getEnvironment)()} environment.\n`));
|
|
95
|
+
});
|
|
96
|
+
// Status command
|
|
97
|
+
program
|
|
98
|
+
.command("status")
|
|
99
|
+
.description("Check connection status")
|
|
100
|
+
.action(async () => {
|
|
101
|
+
const info = (0, config_js_1.getEnvironmentInfo)();
|
|
102
|
+
console.log(chalk_1.default.blue(`\nStatus ${envBadge()}\n`));
|
|
103
|
+
console.log(chalk_1.default.white(`API: ${info.apiBaseUrl}\n`));
|
|
104
|
+
// Check API key
|
|
105
|
+
const apiKey = (0, config_js_1.getApiKey)();
|
|
106
|
+
if (apiKey) {
|
|
107
|
+
const isValid = await (0, api_js_1.verifyApiKey)();
|
|
108
|
+
if (isValid) {
|
|
109
|
+
console.log(chalk_1.default.green("✓ MindStudio: Connected"));
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.log(chalk_1.default.red("MindStudio: Invalid API key"));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
console.log(chalk_1.default.yellow("MindStudio: Not authenticated"));
|
|
117
|
+
}
|
|
118
|
+
// Check Ollama
|
|
119
|
+
const ollamaRunning = await (0, ollama_js_1.isOllamaRunning)();
|
|
120
|
+
if (ollamaRunning) {
|
|
121
|
+
console.log(chalk_1.default.green("✓ Ollama: Running"));
|
|
122
|
+
console.log("");
|
|
123
|
+
const models = await (0, ollama_js_1.discoverModels)();
|
|
124
|
+
displayModels(models);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
console.log(chalk_1.default.red("Ollama: Not running"));
|
|
128
|
+
}
|
|
129
|
+
console.log("");
|
|
130
|
+
});
|
|
131
|
+
// Start command
|
|
132
|
+
program
|
|
133
|
+
.command("start")
|
|
134
|
+
.description("Start the local model tunnel")
|
|
135
|
+
.option("--ollama-url <url>", "Override Ollama base URL")
|
|
136
|
+
.action(async (options) => {
|
|
137
|
+
if (options.ollamaUrl) {
|
|
138
|
+
(0, config_js_1.setOllamaBaseUrl)(options.ollamaUrl);
|
|
139
|
+
}
|
|
140
|
+
const info = (0, config_js_1.getEnvironmentInfo)();
|
|
141
|
+
console.log(chalk_1.default.white(`Environment: ${info.current} (${info.apiBaseUrl})`));
|
|
142
|
+
const apiKey = (0, config_js_1.getApiKey)();
|
|
143
|
+
if (!apiKey) {
|
|
144
|
+
console.log(chalk_1.default.red(`Not authenticated for ${info.current} environment. Run: mindstudio-local auth\n`));
|
|
145
|
+
process.exit(1);
|
|
146
|
+
}
|
|
147
|
+
// Verify API key
|
|
148
|
+
const spinner = (0, ora_1.default)("Connecting to MindStudio...").start();
|
|
149
|
+
const isValid = await (0, api_js_1.verifyApiKey)();
|
|
150
|
+
if (!isValid) {
|
|
151
|
+
spinner.fail(chalk_1.default.red("Invalid API key. Run: mindstudio-local auth"));
|
|
152
|
+
process.exit(1);
|
|
153
|
+
}
|
|
154
|
+
spinner.succeed(`Connected to MindStudio ${envBadge()}`);
|
|
155
|
+
// Check Ollama
|
|
156
|
+
const ollamaRunning = await (0, ollama_js_1.isOllamaRunning)();
|
|
157
|
+
if (!ollamaRunning) {
|
|
158
|
+
console.log(chalk_1.default.red("\nOllama is not running."));
|
|
159
|
+
console.log(chalk_1.default.white("Start it with: ollama serve\n"));
|
|
160
|
+
process.exit(1);
|
|
161
|
+
}
|
|
162
|
+
// Start the runner
|
|
163
|
+
const runner = new runner_js_1.LocalModelRunner();
|
|
164
|
+
await runner.start();
|
|
165
|
+
});
|
|
166
|
+
// Models command
|
|
167
|
+
program
|
|
168
|
+
.command("models")
|
|
169
|
+
.description("List available local models")
|
|
170
|
+
.action(async () => {
|
|
171
|
+
const ollamaRunning = await (0, ollama_js_1.isOllamaRunning)();
|
|
172
|
+
if (!ollamaRunning) {
|
|
173
|
+
console.log(chalk_1.default.red("\nOllama is not running."));
|
|
174
|
+
console.log(chalk_1.default.white(" Start it with: ollama serve\n"));
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
const models = await (0, ollama_js_1.discoverModels)();
|
|
178
|
+
if (models.length === 0) {
|
|
179
|
+
console.log(chalk_1.default.yellow("\nNo models found."));
|
|
180
|
+
console.log(chalk_1.default.white("Pull a model with: ollama pull llama3.2\n"));
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
displayModels(models);
|
|
184
|
+
console.log("");
|
|
185
|
+
});
|
|
186
|
+
// Config command
|
|
187
|
+
program
|
|
188
|
+
.command("config")
|
|
189
|
+
.description("Show configuration")
|
|
190
|
+
.action(() => {
|
|
191
|
+
const info = (0, config_js_1.getEnvironmentInfo)();
|
|
192
|
+
console.log(chalk_1.default.blue(`\nConfiguration ${envBadge()}\n`));
|
|
193
|
+
console.log(` Config file: ${chalk_1.default.white((0, config_js_1.getConfigPath)())}`);
|
|
194
|
+
console.log(` Environment: ${chalk_1.default.cyan(info.current)}`);
|
|
195
|
+
console.log(` API URL: ${chalk_1.default.white(info.apiBaseUrl)}`);
|
|
196
|
+
console.log(` API key: ${info.hasApiKey ? chalk_1.default.green("Set") : chalk_1.default.yellow("Not set")}`);
|
|
197
|
+
console.log("");
|
|
198
|
+
});
|
|
199
|
+
// Env command - switch or show environment
|
|
200
|
+
program
|
|
201
|
+
.command("env [environment]")
|
|
202
|
+
.description("[DEVELOPER ONLY] Show or switch environment (prod, local)")
|
|
203
|
+
.action((environment) => {
|
|
204
|
+
if (environment) {
|
|
205
|
+
if (environment !== "prod" && environment !== "local") {
|
|
206
|
+
console.log(chalk_1.default.red(`Invalid environment: ${environment}. Use 'prod' or 'local'.`));
|
|
207
|
+
process.exit(1);
|
|
208
|
+
}
|
|
209
|
+
(0, config_js_1.setEnvironment)(environment);
|
|
210
|
+
console.log(chalk_1.default.green(`\nSwitched to ${environment} environment.\n`));
|
|
211
|
+
}
|
|
212
|
+
const info = (0, config_js_1.getEnvironmentInfo)();
|
|
213
|
+
console.log(chalk_1.default.blue("\nEnvironment\n"));
|
|
214
|
+
console.log(` Current: ${envBadge()}`);
|
|
215
|
+
console.log(` API URL: ${chalk_1.default.white(info.apiBaseUrl)}`);
|
|
216
|
+
console.log(` API Key: ${info.hasApiKey ? chalk_1.default.green("Set") : chalk_1.default.yellow("Not set")}`);
|
|
217
|
+
console.log("");
|
|
218
|
+
console.log(chalk_1.default.white(" Switch with: mindstudio-local env prod"));
|
|
219
|
+
console.log(chalk_1.default.white(" or: mindstudio-local env local"));
|
|
220
|
+
console.log("");
|
|
221
|
+
});
|
|
222
|
+
// Register command
|
|
223
|
+
program
|
|
224
|
+
.command("register")
|
|
225
|
+
.description("Register all local models")
|
|
226
|
+
.action(async () => {
|
|
227
|
+
// Check if authenticated
|
|
228
|
+
const apiKey = (0, config_js_1.getApiKey)();
|
|
229
|
+
if (!apiKey) {
|
|
230
|
+
console.log(chalk_1.default.red("\nNot authenticated. Run 'mindstudio-local auth' first.\n"));
|
|
231
|
+
process.exit(1);
|
|
232
|
+
}
|
|
233
|
+
// Check if Ollama is running
|
|
234
|
+
const ollamaRunning = await (0, ollama_js_1.isOllamaRunning)();
|
|
235
|
+
if (!ollamaRunning) {
|
|
236
|
+
console.log(chalk_1.default.red("\nOllama is not running."));
|
|
237
|
+
console.log(chalk_1.default.white(" Start it with: ollama serve\n"));
|
|
238
|
+
process.exit(1);
|
|
239
|
+
}
|
|
240
|
+
// Get all local models
|
|
241
|
+
const spinner = (0, ora_1.default)("Loading local models...").start();
|
|
242
|
+
const localModels = await (0, ollama_js_1.discoverModels)();
|
|
243
|
+
spinner.succeed();
|
|
244
|
+
if (localModels.length === 0) {
|
|
245
|
+
spinner.fail(chalk_1.default.yellow("No local models found."));
|
|
246
|
+
console.log(chalk_1.default.white(" Pull a model with: ollama pull llama3.2\n"));
|
|
247
|
+
process.exit(1);
|
|
248
|
+
}
|
|
249
|
+
const registeredModels = await (0, api_js_1.getRegisteredModels)();
|
|
250
|
+
const registeredNames = new Set(registeredModels);
|
|
251
|
+
const unregisteredModels = localModels.filter((m) => !registeredNames.has(m.name));
|
|
252
|
+
if (localModels.length > 0 && unregisteredModels.length === 0) {
|
|
253
|
+
console.log(chalk_1.default.green("\n✓ All local models are already registered.\n"));
|
|
254
|
+
process.exit(0);
|
|
255
|
+
}
|
|
256
|
+
const registerSpinner = (0, ora_1.default)(`Registering models...`).start();
|
|
257
|
+
try {
|
|
258
|
+
console.log("\n");
|
|
259
|
+
for (const model of unregisteredModels) {
|
|
260
|
+
await (0, api_js_1.registerLocalModel)(model.name);
|
|
261
|
+
console.log(chalk_1.default.green(`✓ ${model.name}\n`));
|
|
262
|
+
}
|
|
263
|
+
registerSpinner.succeed(chalk_1.default.green("All local models registered successfully.\n"));
|
|
264
|
+
console.log(chalk_1.default.white("Manage models at: https://app.mindstudio.ai/services/self-hosted-models\n"));
|
|
265
|
+
process.exit(0);
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
registerSpinner.fail(chalk_1.default.red(`Failed to register models`));
|
|
269
|
+
console.log(chalk_1.default.red(`Error: ${error instanceof Error ? error.message : String(error)}\n`));
|
|
270
|
+
process.exit(1);
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
program.parse();
|
|
274
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type Environment = "prod" | "local";
|
|
2
|
+
export declare function getEnvironment(): Environment;
|
|
3
|
+
export declare function setEnvironment(env: Environment): void;
|
|
4
|
+
export declare function getApiKey(): string | undefined;
|
|
5
|
+
export declare function setApiKey(key: string): void;
|
|
6
|
+
export declare function clearApiKey(): void;
|
|
7
|
+
export declare function getApiBaseUrl(): string;
|
|
8
|
+
export declare function setApiBaseUrl(url: string): void;
|
|
9
|
+
export declare function getOllamaBaseUrl(): string;
|
|
10
|
+
export declare function setOllamaBaseUrl(url: string): void;
|
|
11
|
+
export declare function getConfigPath(): string;
|
|
12
|
+
export declare function getEnvironmentInfo(): {
|
|
13
|
+
current: Environment;
|
|
14
|
+
apiBaseUrl: string;
|
|
15
|
+
hasApiKey: boolean;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAiC3C,wBAAgB,cAAc,IAAI,WAAW,CAE5C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAErD;AAcD,wBAAgB,SAAS,IAAI,MAAM,GAAG,SAAS,CAE9C;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,WAAW,IAAI,IAAI,CAGlC;AAGD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE/C;AAGD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAGD,wBAAgB,kBAAkB,IAAI;IACpC,OAAO,EAAE,WAAW,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB,CAQA"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getEnvironment = getEnvironment;
|
|
7
|
+
exports.setEnvironment = setEnvironment;
|
|
8
|
+
exports.getApiKey = getApiKey;
|
|
9
|
+
exports.setApiKey = setApiKey;
|
|
10
|
+
exports.clearApiKey = clearApiKey;
|
|
11
|
+
exports.getApiBaseUrl = getApiBaseUrl;
|
|
12
|
+
exports.setApiBaseUrl = setApiBaseUrl;
|
|
13
|
+
exports.getOllamaBaseUrl = getOllamaBaseUrl;
|
|
14
|
+
exports.setOllamaBaseUrl = setOllamaBaseUrl;
|
|
15
|
+
exports.getConfigPath = getConfigPath;
|
|
16
|
+
exports.getEnvironmentInfo = getEnvironmentInfo;
|
|
17
|
+
const conf_1 = __importDefault(require("conf"));
|
|
18
|
+
const config = new conf_1.default({
|
|
19
|
+
projectName: "mindstudio-local",
|
|
20
|
+
defaults: {
|
|
21
|
+
environment: "prod",
|
|
22
|
+
ollamaBaseUrl: "http://localhost:11434",
|
|
23
|
+
environments: {
|
|
24
|
+
prod: {
|
|
25
|
+
apiBaseUrl: "https://api.mindstudio.ai",
|
|
26
|
+
},
|
|
27
|
+
local: {
|
|
28
|
+
apiBaseUrl: "http://localhost:3129",
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
// Environment management
|
|
34
|
+
function getEnvironment() {
|
|
35
|
+
return config.get("environment");
|
|
36
|
+
}
|
|
37
|
+
function setEnvironment(env) {
|
|
38
|
+
config.set("environment", env);
|
|
39
|
+
}
|
|
40
|
+
// Get config for current environment
|
|
41
|
+
function getEnvConfig() {
|
|
42
|
+
const env = getEnvironment();
|
|
43
|
+
return config.get(`environments.${env}`);
|
|
44
|
+
}
|
|
45
|
+
function setEnvConfig(key, value) {
|
|
46
|
+
const env = getEnvironment();
|
|
47
|
+
config.set(`environments.${env}.${key}`, value);
|
|
48
|
+
}
|
|
49
|
+
// API Key (per environment)
|
|
50
|
+
function getApiKey() {
|
|
51
|
+
return getEnvConfig().apiKey;
|
|
52
|
+
}
|
|
53
|
+
function setApiKey(key) {
|
|
54
|
+
setEnvConfig("apiKey", key);
|
|
55
|
+
}
|
|
56
|
+
function clearApiKey() {
|
|
57
|
+
const env = getEnvironment();
|
|
58
|
+
config.delete(`environments.${env}.apiKey`);
|
|
59
|
+
}
|
|
60
|
+
// API Base URL (per environment)
|
|
61
|
+
function getApiBaseUrl() {
|
|
62
|
+
return getEnvConfig().apiBaseUrl;
|
|
63
|
+
}
|
|
64
|
+
function setApiBaseUrl(url) {
|
|
65
|
+
setEnvConfig("apiBaseUrl", url);
|
|
66
|
+
}
|
|
67
|
+
// Ollama (shared across environments)
|
|
68
|
+
function getOllamaBaseUrl() {
|
|
69
|
+
return config.get("ollamaBaseUrl");
|
|
70
|
+
}
|
|
71
|
+
function setOllamaBaseUrl(url) {
|
|
72
|
+
config.set("ollamaBaseUrl", url);
|
|
73
|
+
}
|
|
74
|
+
function getConfigPath() {
|
|
75
|
+
return config.path;
|
|
76
|
+
}
|
|
77
|
+
// Get all environment info for display
|
|
78
|
+
function getEnvironmentInfo() {
|
|
79
|
+
const env = getEnvironment();
|
|
80
|
+
const envConfig = getEnvConfig();
|
|
81
|
+
return {
|
|
82
|
+
current: env,
|
|
83
|
+
apiBaseUrl: envConfig.apiBaseUrl,
|
|
84
|
+
hasApiKey: !!envConfig.apiKey,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;AAmCA,wCAEC;AAED,wCAEC;AAcD,8BAEC;AAED,8BAEC;AAED,kCAGC;AAGD,sCAEC;AAED,sCAEC;AAGD,4CAEC;AAED,4CAEC;AAED,sCAEC;AAGD,gDAYC;AAvGD,gDAAwB;AAkBxB,MAAM,MAAM,GAAG,IAAI,cAAI,CAAe;IACpC,WAAW,EAAE,kBAAkB;IAC/B,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM;QACnB,aAAa,EAAE,wBAAwB;QACvC,YAAY,EAAE;YACZ,IAAI,EAAE;gBACJ,UAAU,EAAE,2BAA2B;aACxC;YACD,KAAK,EAAE;gBACL,UAAU,EAAE,uBAAuB;aACpC;SACF;KACF;CACF,CAAC,CAAC;AAEH,yBAAyB;AACzB,SAAgB,cAAc;IAC5B,OAAO,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,cAAc,CAAC,GAAgB;IAC7C,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,qCAAqC;AACrC,SAAS,YAAY;IACnB,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,OAAO,MAAM,CAAC,GAAG,CAAC,gBAAgB,GAAG,EAAE,CAAsB,CAAC;AAChE,CAAC;AAED,SAAS,YAAY,CAAC,GAA4B,EAAE,KAAa;IAC/D,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,MAAM,CAAC,GAAG,CAAC,gBAAgB,GAAG,IAAI,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,4BAA4B;AAC5B,SAAgB,SAAS;IACvB,OAAO,YAAY,EAAE,CAAC,MAAM,CAAC;AAC/B,CAAC;AAED,SAAgB,SAAS,CAAC,GAAW;IACnC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,SAAgB,WAAW;IACzB,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,MAAM,CAAC,MAAM,CAAC,gBAAgB,GAAG,SAA+B,CAAC,CAAC;AACpE,CAAC;AAED,iCAAiC;AACjC,SAAgB,aAAa;IAC3B,OAAO,YAAY,EAAE,CAAC,UAAU,CAAC;AACnC,CAAC;AAED,SAAgB,aAAa,CAAC,GAAW;IACvC,YAAY,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,sCAAsC;AACtC,SAAgB,gBAAgB;IAC9B,OAAO,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AACrC,CAAC;AAED,SAAgB,gBAAgB,CAAC,GAAW;IAC1C,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,aAAa;IAC3B,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,uCAAuC;AACvC,SAAgB,kBAAkB;IAKhC,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,OAAO;QACL,OAAO,EAAE,GAAG;QACZ,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM;KAC9B,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { LocalModelRunner } from "./runner.js";
|
|
2
|
+
export { discoverModels, isOllamaRunning } from "./ollama.js";
|
|
3
|
+
export { getApiKey, setApiKey, clearApiKey, getApiBaseUrl, setApiBaseUrl, getEnvironment, setEnvironment, type Environment, } from "./config.js";
|
|
4
|
+
export { verifyApiKey, pollForRequest, submitProgress, submitResult, } from "./api.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EACL,SAAS,EACT,SAAS,EACT,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EACd,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,GACb,MAAM,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.submitResult = exports.submitProgress = exports.pollForRequest = exports.verifyApiKey = exports.setEnvironment = exports.getEnvironment = exports.setApiBaseUrl = exports.getApiBaseUrl = exports.clearApiKey = exports.setApiKey = exports.getApiKey = exports.isOllamaRunning = exports.discoverModels = exports.LocalModelRunner = void 0;
|
|
4
|
+
// Main exports for programmatic use
|
|
5
|
+
var runner_js_1 = require("./runner.js");
|
|
6
|
+
Object.defineProperty(exports, "LocalModelRunner", { enumerable: true, get: function () { return runner_js_1.LocalModelRunner; } });
|
|
7
|
+
var ollama_js_1 = require("./ollama.js");
|
|
8
|
+
Object.defineProperty(exports, "discoverModels", { enumerable: true, get: function () { return ollama_js_1.discoverModels; } });
|
|
9
|
+
Object.defineProperty(exports, "isOllamaRunning", { enumerable: true, get: function () { return ollama_js_1.isOllamaRunning; } });
|
|
10
|
+
var config_js_1 = require("./config.js");
|
|
11
|
+
Object.defineProperty(exports, "getApiKey", { enumerable: true, get: function () { return config_js_1.getApiKey; } });
|
|
12
|
+
Object.defineProperty(exports, "setApiKey", { enumerable: true, get: function () { return config_js_1.setApiKey; } });
|
|
13
|
+
Object.defineProperty(exports, "clearApiKey", { enumerable: true, get: function () { return config_js_1.clearApiKey; } });
|
|
14
|
+
Object.defineProperty(exports, "getApiBaseUrl", { enumerable: true, get: function () { return config_js_1.getApiBaseUrl; } });
|
|
15
|
+
Object.defineProperty(exports, "setApiBaseUrl", { enumerable: true, get: function () { return config_js_1.setApiBaseUrl; } });
|
|
16
|
+
Object.defineProperty(exports, "getEnvironment", { enumerable: true, get: function () { return config_js_1.getEnvironment; } });
|
|
17
|
+
Object.defineProperty(exports, "setEnvironment", { enumerable: true, get: function () { return config_js_1.setEnvironment; } });
|
|
18
|
+
var api_js_1 = require("./api.js");
|
|
19
|
+
Object.defineProperty(exports, "verifyApiKey", { enumerable: true, get: function () { return api_js_1.verifyApiKey; } });
|
|
20
|
+
Object.defineProperty(exports, "pollForRequest", { enumerable: true, get: function () { return api_js_1.pollForRequest; } });
|
|
21
|
+
Object.defineProperty(exports, "submitProgress", { enumerable: true, get: function () { return api_js_1.submitProgress; } });
|
|
22
|
+
Object.defineProperty(exports, "submitResult", { enumerable: true, get: function () { return api_js_1.submitResult; } });
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,oCAAoC;AACpC,yCAA+C;AAAtC,6GAAA,gBAAgB,OAAA;AACzB,yCAA8D;AAArD,2GAAA,cAAc,OAAA;AAAE,4GAAA,eAAe,OAAA;AACxC,yCASqB;AARnB,sGAAA,SAAS,OAAA;AACT,sGAAA,SAAS,OAAA;AACT,wGAAA,WAAW,OAAA;AACX,0GAAA,aAAa,OAAA;AACb,0GAAA,aAAa,OAAA;AACb,2GAAA,cAAc,OAAA;AACd,2GAAA,cAAc,OAAA;AAGhB,mCAKkB;AAJhB,sGAAA,YAAY,OAAA;AACZ,wGAAA,cAAc,OAAA;AACd,wGAAA,cAAc,OAAA;AACd,sGAAA,YAAY,OAAA"}
|
package/dist/ollama.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Ollama } from "ollama";
|
|
2
|
+
export interface OllamaModel {
|
|
3
|
+
name: string;
|
|
4
|
+
size: number;
|
|
5
|
+
parameterSize?: string;
|
|
6
|
+
quantization?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function createOllamaClient(): Promise<Ollama>;
|
|
9
|
+
export declare function discoverModels(): Promise<OllamaModel[]>;
|
|
10
|
+
export declare function isOllamaRunning(): Promise<boolean>;
|
|
11
|
+
//# sourceMappingURL=ollama.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../src/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAE1D;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAc7D;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAQxD"}
|
package/dist/ollama.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createOllamaClient = createOllamaClient;
|
|
4
|
+
exports.discoverModels = discoverModels;
|
|
5
|
+
exports.isOllamaRunning = isOllamaRunning;
|
|
6
|
+
const ollama_1 = require("ollama");
|
|
7
|
+
const config_js_1 = require("./config.js");
|
|
8
|
+
async function createOllamaClient() {
|
|
9
|
+
return new ollama_1.Ollama({ host: (0, config_js_1.getOllamaBaseUrl)() });
|
|
10
|
+
}
|
|
11
|
+
async function discoverModels() {
|
|
12
|
+
try {
|
|
13
|
+
const ollama = await createOllamaClient();
|
|
14
|
+
const response = await ollama.list();
|
|
15
|
+
return response.models.map((m) => ({
|
|
16
|
+
name: m.name,
|
|
17
|
+
size: m.size,
|
|
18
|
+
parameterSize: m.details?.parameter_size,
|
|
19
|
+
quantization: m.details?.quantization_level,
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function isOllamaRunning() {
|
|
27
|
+
try {
|
|
28
|
+
const ollama = await createOllamaClient();
|
|
29
|
+
await ollama.list();
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../src/ollama.ts"],"names":[],"mappings":";;AAUA,gDAEC;AAED,wCAcC;AAED,0CAQC;AAtCD,mCAAgC;AAChC,2CAA+C;AASxC,KAAK,UAAU,kBAAkB;IACtC,OAAO,IAAI,eAAM,CAAC,EAAE,IAAI,EAAE,IAAA,4BAAgB,GAAE,EAAE,CAAC,CAAC;AAClD,CAAC;AAEM,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAErC,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,cAAc;YACxC,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,kBAAkB;SAC5C,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC1C,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
package/dist/runner.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare class LocalModelRunner {
|
|
2
|
+
private isRunning;
|
|
3
|
+
private spinner;
|
|
4
|
+
private activeRequests;
|
|
5
|
+
start(): Promise<void>;
|
|
6
|
+
private poll;
|
|
7
|
+
private processRequest;
|
|
8
|
+
private updateSpinner;
|
|
9
|
+
private stop;
|
|
10
|
+
private sleep;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAWA,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,cAAc,CAAK;IAErB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAwDd,IAAI;YAiBJ,cAAc;IA6F5B,OAAO,CAAC,aAAa;YAUP,IAAI;IAQlB,OAAO,CAAC,KAAK;CAGd"}
|
package/dist/runner.js
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LocalModelRunner = void 0;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const ora_1 = __importDefault(require("ora"));
|
|
9
|
+
const ollama_js_1 = require("./ollama.js");
|
|
10
|
+
const api_js_1 = require("./api.js");
|
|
11
|
+
class LocalModelRunner {
|
|
12
|
+
isRunning = false;
|
|
13
|
+
spinner = null;
|
|
14
|
+
activeRequests = 0;
|
|
15
|
+
async start() {
|
|
16
|
+
console.clear();
|
|
17
|
+
console.log(chalk_1.default.blue("\nMindStudio Local Model Tunnel\n"));
|
|
18
|
+
// Discover available models
|
|
19
|
+
const models = await (0, ollama_js_1.discoverModels)();
|
|
20
|
+
if (models.length === 0) {
|
|
21
|
+
console.log(chalk_1.default.yellow("No Ollama models found."));
|
|
22
|
+
console.log(chalk_1.default.white(" Make sure Ollama is running: ollama serve"));
|
|
23
|
+
console.log(chalk_1.default.white(" Pull a model: ollama pull llama3.2\n"));
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
console.log(chalk_1.default.green("✓ Found models:"));
|
|
27
|
+
models.forEach((m) => {
|
|
28
|
+
const size = m.parameterSize || `${Math.round(m.size / 1e9)}GB`;
|
|
29
|
+
console.log(chalk_1.default.white(` • ${m.name} (${size})`));
|
|
30
|
+
});
|
|
31
|
+
console.log("");
|
|
32
|
+
const modelNames = models.map((m) => m.name);
|
|
33
|
+
this.isRunning = true;
|
|
34
|
+
this.spinner = (0, ora_1.default)({
|
|
35
|
+
text: "Waiting for requests...",
|
|
36
|
+
color: "cyan",
|
|
37
|
+
}).start();
|
|
38
|
+
// Handle graceful shutdown
|
|
39
|
+
process.on("SIGINT", () => this.stop());
|
|
40
|
+
process.on("SIGTERM", () => this.stop());
|
|
41
|
+
while (this.isRunning) {
|
|
42
|
+
try {
|
|
43
|
+
await this.poll(modelNames);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
if (this.isRunning) {
|
|
47
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
48
|
+
this.spinner?.fail(chalk_1.default.red(`Error: ${message}`));
|
|
49
|
+
// Wait before retrying
|
|
50
|
+
await this.sleep(5000);
|
|
51
|
+
if (this.isRunning) {
|
|
52
|
+
this.spinner = (0, ora_1.default)({
|
|
53
|
+
text: "Reconnecting...",
|
|
54
|
+
color: "cyan",
|
|
55
|
+
}).start();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async poll(models) {
|
|
62
|
+
const request = await (0, api_js_1.pollForRequest)(models);
|
|
63
|
+
if (!request) {
|
|
64
|
+
return; // Long-poll returned with no request, continue polling
|
|
65
|
+
}
|
|
66
|
+
this.activeRequests++;
|
|
67
|
+
this.updateSpinner();
|
|
68
|
+
// Process request in background (don't await)
|
|
69
|
+
this.processRequest(request).finally(() => {
|
|
70
|
+
this.activeRequests--;
|
|
71
|
+
this.updateSpinner();
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
async processRequest(request) {
|
|
75
|
+
const startTime = Date.now();
|
|
76
|
+
this.spinner?.stop();
|
|
77
|
+
console.log(chalk_1.default.cyan(`\n⚡ Processing: ${request.modelId}`));
|
|
78
|
+
try {
|
|
79
|
+
const ollama = await (0, ollama_js_1.createOllamaClient)();
|
|
80
|
+
// Build messages for Ollama
|
|
81
|
+
const messages = request.payload.messages || [];
|
|
82
|
+
// Stream the response
|
|
83
|
+
const stream = await ollama.chat({
|
|
84
|
+
model: request.modelId,
|
|
85
|
+
messages: messages.map((m) => ({
|
|
86
|
+
role: m.role,
|
|
87
|
+
content: m.content,
|
|
88
|
+
})),
|
|
89
|
+
stream: true,
|
|
90
|
+
options: {
|
|
91
|
+
temperature: request.payload.temperature,
|
|
92
|
+
num_predict: request.payload.maxTokens,
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
let fullContent = "";
|
|
96
|
+
let lastProgressUpdate = 0;
|
|
97
|
+
const progressInterval = 100; // Update progress every 100ms max
|
|
98
|
+
for await (const chunk of stream) {
|
|
99
|
+
fullContent += chunk.message.content;
|
|
100
|
+
// Throttle progress updates
|
|
101
|
+
const now = Date.now();
|
|
102
|
+
if (now - lastProgressUpdate > progressInterval) {
|
|
103
|
+
await (0, api_js_1.submitProgress)(request.id, fullContent);
|
|
104
|
+
lastProgressUpdate = now;
|
|
105
|
+
}
|
|
106
|
+
// Show streaming indicator
|
|
107
|
+
process.stdout.write(chalk_1.default.white("."));
|
|
108
|
+
}
|
|
109
|
+
// Submit final progress
|
|
110
|
+
await (0, api_js_1.submitProgress)(request.id, fullContent);
|
|
111
|
+
// Submit result
|
|
112
|
+
await (0, api_js_1.submitResult)(request.id, true, {
|
|
113
|
+
content: fullContent,
|
|
114
|
+
usage: {
|
|
115
|
+
promptTokens: 0, // Ollama doesn't always provide this
|
|
116
|
+
completionTokens: 0,
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
const duration = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
120
|
+
console.log(chalk_1.default.green(`\n✓ Completed in ${duration}s (${fullContent.length} chars)\n`));
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
if (error instanceof Error && error.status_code === 404) {
|
|
124
|
+
const message = `Model ${request.modelId} not found. Is it registered on your local server?`;
|
|
125
|
+
console.log(chalk_1.default.red(`\nFailed: ${message}\n`));
|
|
126
|
+
await (0, api_js_1.submitResult)(request.id, false, undefined, message);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
let message = error instanceof Error ? error.message : "Unknown error";
|
|
130
|
+
if (message === "fetch failed") {
|
|
131
|
+
message =
|
|
132
|
+
"Failed to connect to the API. Please make sure your local model server is running.";
|
|
133
|
+
}
|
|
134
|
+
console.log(error);
|
|
135
|
+
console.log(chalk_1.default.red(`\n✗ Failed: ${message}\n`));
|
|
136
|
+
await (0, api_js_1.submitResult)(request.id, false, undefined, message);
|
|
137
|
+
}
|
|
138
|
+
if (this.isRunning) {
|
|
139
|
+
this.spinner = (0, ora_1.default)({
|
|
140
|
+
text: "Waiting for requests...",
|
|
141
|
+
color: "cyan",
|
|
142
|
+
}).start();
|
|
143
|
+
this.updateSpinner();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
updateSpinner() {
|
|
147
|
+
if (this.spinner && this.isRunning) {
|
|
148
|
+
if (this.activeRequests > 0) {
|
|
149
|
+
this.spinner.text = `Processing ${this.activeRequests} request(s)...`;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
this.spinner.text = "Waiting for requests...";
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async stop() {
|
|
157
|
+
await (0, api_js_1.disconnectHeartbeat)();
|
|
158
|
+
console.log(chalk_1.default.yellow("\n\nShutting down...\n"));
|
|
159
|
+
this.isRunning = false;
|
|
160
|
+
this.spinner?.stop();
|
|
161
|
+
process.exit(0);
|
|
162
|
+
}
|
|
163
|
+
sleep(ms) {
|
|
164
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
exports.LocalModelRunner = LocalModelRunner;
|
|
168
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mindstudio-ai/local-model-tunnel",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Run local AI models with MindStudio",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"mindstudio-local": "dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"dev": "ts-node src/cli.ts",
|
|
12
|
+
"start": "node dist/cli.js",
|
|
13
|
+
"prepublishOnly": "npm run build",
|
|
14
|
+
"local-update": "npm run build && npm link"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"mindstudio",
|
|
18
|
+
"ollama",
|
|
19
|
+
"local-models",
|
|
20
|
+
"ai"
|
|
21
|
+
],
|
|
22
|
+
"author": "MindStudio",
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"files": [
|
|
25
|
+
"dist"
|
|
26
|
+
],
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=18.0.0"
|
|
29
|
+
},
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "https://github.com/anthropic/mindstudio-local-model-tunnel"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"chalk": "^5.3.0",
|
|
36
|
+
"commander": "^12.0.0",
|
|
37
|
+
"conf": "^12.0.0",
|
|
38
|
+
"ollama": "^0.5.0",
|
|
39
|
+
"open": "^10.2.0",
|
|
40
|
+
"ora": "^8.0.0"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/node": "^20.0.0",
|
|
44
|
+
"ts-node": "^10.9.0",
|
|
45
|
+
"typescript": "^5.0.0"
|
|
46
|
+
},
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"access": "public"
|
|
49
|
+
}
|
|
50
|
+
}
|