aboutsummaryrefslogtreecommitdiff
path: root/modules/core/module-ollama.js
diff options
context:
space:
mode:
Diffstat (limited to 'modules/core/module-ollama.js')
-rw-r--r--modules/core/module-ollama.js177
1 files changed, 128 insertions, 49 deletions
diff --git a/modules/core/module-ollama.js b/modules/core/module-ollama.js
index 3eabe19..ba8ad57 100644
--- a/modules/core/module-ollama.js
+++ b/modules/core/module-ollama.js
@@ -1,52 +1,131 @@
-// Extracted from newOS4 index.html — OllamaModule
- class OllamaModule {
- constructor() { this.commands = {}; this.terminal = null; }
- getHelpInfo() {
- return {
- 'ollama': 'ollama — Open the Ollama model manager UI',
- 'ollamaconnect': 'ollamaconnect — Connect to the Ollama server',
- 'ollamadisconnect': 'ollamadisconnect — Disconnect from the Ollama server',
- 'ollamamodels': 'ollamamodels — List all available models from Ollama',
- 'ollamasetmodel': 'ollamasetmodel <name> — Set the active Ollama model',
- 'ollamasetproxy': 'ollamasetproxy [endpoint] — View or change the Ollama endpoint URL',
- };
+// Extracted from newOS4 index.html — OllamaModule (merged with OllamaModelsModule)
+// Commands: ollama, ollamaconnect, ollamadisconnect, ollamamodels, ollamasetmodel, ollamasetproxy, models, model-info, model-pull, model-delete, model-run, ai, ask
+class OllamaModule {
+ constructor() { this.commands = {}; this.terminal = null; }
+ getHelpInfo() {
+ return {
+ 'ollama': 'ollama — Open the Ollama model manager UI',
+ 'ollamaconnect': 'ollamaconnect — Connect to the Ollama server',
+ 'ollamadisconnect': 'ollamadisconnect — Disconnect from the Ollama server',
+ 'ollamamodels': 'ollamamodels — List all available models from Ollama',
+ 'models': 'models — List all available Ollama models (table format)',
+ 'model-info': 'model-info <model-name> — Show details about a specific model',
+ 'model-pull': 'model-pull <model-name> — Pull a model from Ollama registry',
+ 'model-delete': 'model-delete <model-name> — Delete a model from local storage',
+ 'model-run': 'model-run <model-name> [prompt] — Run inference with a model',
+ 'ollamasetmodel': 'ollamasetmodel <name> — Set the active Ollama model',
+ 'ollamasetproxy': 'ollamasetproxy [endpoint] — View or change the Ollama endpoint URL',
+ };
+ }
+ registerCommands() {
+ this.commands['ollama'] = () => { this.terminal.openOllamaManager(); };
+ this.commands['ollamaconnect'] = async () => {
+ await this.terminal.ollamaManager.connect();
+ this.terminal.updateOllamaStatus();
+ };
+ this.commands['ollamadisconnect'] = () => {
+ this.terminal.ollamaManager.connected = false;
+ this.terminal.ollamaManager.models = [];
+ this.terminal.print('Ollama disconnected', 'info');
+ this.terminal.updateOllamaStatus();
+ };
+ this.commands['ollamamodels'] = () => {
+ const models = this.terminal.ollamaManager.getModels();
+ if(models.length === 0) return this.terminal.print("No models found. Connect first.");
+ models.forEach(m => this.terminal.print(`${m.name} (${(m.size/1e9).toFixed(1)}GB)`));
+ };
+ this.commands['ollamasetmodel'] = (args) => {
+ if(!args[0]) return this.terminal.print("Usage: ollamasetmodel <name>", 'warning');
+ this.terminal.ollamaManager.setModel(args[0]);
+ };
+ this.commands['ollamasetproxy'] = (args) => {
+ if(!args[0]) {
+ const ep = this.terminal.ollamaManager.endpoint;
+ return this.terminal.print(`Current Ollama endpoint: ${ep}`, 'info');
}
- registerCommands() {
- this.commands['ollama'] = () => { this.terminal.openOllamaManager(); };
- this.commands['ollamaconnect'] = async () => {
- await this.terminal.ollamaManager.connect();
- this.terminal.updateOllamaStatus();
- };
- this.commands['ollamadisconnect'] = () => {
- this.terminal.ollamaManager.connected = false;
- this.terminal.ollamaManager.models = [];
- this.terminal.print('Ollama disconnected', 'info');
- this.terminal.updateOllamaStatus();
- };
- this.commands['ollamamodels'] = () => {
- const models = this.terminal.ollamaManager.getModels();
- if(models.length === 0) return this.terminal.print("No models found. Connect first.");
- models.forEach(m => this.terminal.print(`${m.name} (${(m.size/1e9).toFixed(1)}GB)`));
- };
- this.commands['ollamasetmodel'] = (args) => {
- if(!args[0]) return this.terminal.print("Usage: ollamasetmodel <name>", 'warning');
- this.terminal.ollamaManager.setModel(args[0]);
- };
- this.commands['ollamasetproxy'] = (args) => {
- if(!args[0]) {
- const ep = this.terminal.ollamaManager.endpoint;
- return this.terminal.print(`Current Ollama endpoint: ${ep}`, 'info');
- }
- this.terminal.ollamaManager.setEndpoint(args[0]);
- this.terminal.print(`Ollama endpoint set to: ${args[0]}`, 'success');
- };
- this.commands['ai'] = async (args) => {
- if(!args[0]) return this.terminal.print("Usage: ai <prompt>", 'warning');
- await this.terminal.ollamaManager.chat(args.join(' '));
- };
- this.commands['ask'] = async (args) => {
- if(!args[0]) return this.terminal.print("Usage: ask <prompt>", 'warning');
- await this.terminal.ollamaManager.chat(args.join(' '));
- };
+ this.terminal.ollamaManager.setEndpoint(args[0]);
+ this.terminal.print(`Ollama endpoint set to: ${args[0]}`, 'success');
+ };
+ this.commands['ai'] = async (args) => {
+ if(!args[0]) return this.terminal.print("Usage: ai <prompt>", 'warning');
+ await this.terminal.ollamaManager.chat(args.join(' '));
+ };
+ this.commands['ask'] = async (args) => {
+ if(!args[0]) return this.terminal.print("Usage: ask <prompt>", 'warning');
+ await this.terminal.ollamaManager.chat(args.join(' '));
+ };
+ // Merged from OllamaModelsModule
+ this.commands['models'] = () => this.listModels();
+ this.commands['model-info'] = (args) => this.modelInfo(args);
+ this.commands['model-pull'] = (args) => this.pullModel(args);
+ this.commands['model-delete'] = (args) => this.deleteModel(args);
+ this.commands['model-run'] = (args) => this.runModel(args);
+ }
+ async listModels() {
+ const endpoint = localStorage.getItem('webx11_ollama_endpoint') || 'http://localhost:11434';
+ try {
+ const response = await fetch(`${endpoint}/api/tags`);
+ if (!response.ok) throw new Error(`HTTP ${response.status}`);
+ const data = await response.json();
+ const models = data.models || [];
+ if (models.length === 0) {
+ this.terminal.print("No models found. Run 'ollama pull <model>' first.", "warning"); return;
}
+ this.terminal.print("=== Available Ollama Models ===", "info");
+ this.terminal.printHTML(`<table style="width: 100%; border-collapse: collapse; margin: 10px 0;">
+ <tr style="border-bottom: 1px solid #005500;">
+ <th style="text-align: left; padding: 5px;">Name</th>
+ <th style="text-align: left; padding: 5px;">Size</th>
+ <th style="text-align: left; padding: 5px;">Family</th>
+ </tr>`);
+ models.forEach(m => {
+ const sizeGB = (m.size / 1e9).toFixed(2);
+ this.terminal.printHTML(`<tr style="border-bottom: 1px solid #111;">
+ <td style="padding: 5px; color: #00ff00;">${m.name}</td>
+ <td style="padding: 5px; color: #888888;">${sizeGB} GB</td>
+ <td style="padding: 5px; color: #00aaff;">${m.details?.family || 'N/A'}</td>
+ </tr>`);
+ });
+ this.terminal.printHTML(`</table>`);
+ } catch (e) {
+ this.terminal.print(`Failed to fetch models: ${e.message}`, "error");
}
+ }
+ async modelInfo(args) {
+ if (!args[0]) {
+ this.terminal.print("Usage: model-info <model-name>", "warning"); return;
+ }
+ const endpoint = localStorage.getItem('webx11_ollama_endpoint') || 'http://localhost:11434';
+ try {
+ const response = await fetch(`${endpoint}/api/show`, {
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ name: args[0] })
+ });
+ if (!response.ok) throw new Error(`HTTP ${response.status}`);
+ const data = await response.json();
+ this.terminal.print(`=== ${args[0]} ===`, "info");
+ this.terminal.print(`License: ${data.license || 'N/A'}`);
+ this.terminal.print(`Parameters: ${data.details?.parameter_size || 'N/A'}`);
+ this.terminal.print(`Family: ${data.details?.family || 'N/A'}`);
+ } catch (e) {
+ this.terminal.print(`Failed to get model info: ${e.message}`, "error");
+ }
+ }
+ pullModel(args) {
+ this.terminal.print("⚠️ Model pulling must be done via Ollama CLI", "warning");
+ this.terminal.print(`Run: ollama pull ${args[0] || '<model-name>'}`, "info");
+ }
+ deleteModel(args) {
+ this.terminal.print("⚠️ Model deletion must be done via Ollama CLI", "warning");
+ this.terminal.print(`Run: ollama rm ${args[0] || '<model-name>'}`, "info");
+ }
+ async runModel(args) {
+ if (!args[0]) {
+ this.terminal.print("Usage: model-run <model-name> [prompt]", "warning"); return;
+ }
+ const model = args[0];
+ const prompt = args.slice(1).join(' ') || 'Hello!';
+ this.terminal.print(`Running ${model}...`, "info");
+ await this.terminal.ollamaManager.chat(prompt, model);
+ }
+} \ No newline at end of file