fix(localai): Fix RPC data handling - expect returns array directly
The LuCI rpc.declare with expect: { models: [] } returns the array
directly, not wrapped in {models: [...]}. Fixed all views to handle
this correctly.
- models.js: Check Array.isArray(data) first
- dashboard.js: Extract array from results[1] directly
- chat.js: Same array handling fix
Version: 0.1.0-r12
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
6f713b1041
commit
63c0bb3e5a
@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
|
|||||||
|
|
||||||
PKG_NAME:=luci-app-localai
|
PKG_NAME:=luci-app-localai
|
||||||
PKG_VERSION:=0.1.0
|
PKG_VERSION:=0.1.0
|
||||||
PKG_RELEASE:=10
|
PKG_RELEASE:=12
|
||||||
PKG_ARCH:=all
|
PKG_ARCH:=all
|
||||||
|
|
||||||
PKG_LICENSE:=Apache-2.0
|
PKG_LICENSE:=Apache-2.0
|
||||||
|
|||||||
@ -27,7 +27,8 @@ return view.extend({
|
|||||||
|
|
||||||
render: function(data) {
|
render: function(data) {
|
||||||
var self = this;
|
var self = this;
|
||||||
var models = data.models || [];
|
// RPC with expect returns array directly
|
||||||
|
var models = Array.isArray(data) ? data : (data && data.models ? data.models : []);
|
||||||
|
|
||||||
var container = E('div', { 'class': 'localai-chat' }, [
|
var container = E('div', { 'class': 'localai-chat' }, [
|
||||||
E('style', {}, this.getCSS()),
|
E('style', {}, this.getCSS()),
|
||||||
|
|||||||
@ -75,10 +75,13 @@ return view.extend({
|
|||||||
callHealth(),
|
callHealth(),
|
||||||
callMetrics()
|
callMetrics()
|
||||||
]).then(function(results) {
|
]).then(function(results) {
|
||||||
|
console.log('LocalAI Dashboard RPC results:', JSON.stringify(results));
|
||||||
|
// RPC with expect returns arrays directly, not wrapped objects
|
||||||
|
var modelsData = Array.isArray(results[1]) ? results[1] : [];
|
||||||
return {
|
return {
|
||||||
status: results[0] || {},
|
status: results[0] || {},
|
||||||
models: results[1] || { models: [] },
|
models: modelsData,
|
||||||
health: results[2] || { healthy: false },
|
health: results[2] || {},
|
||||||
metrics: results[3] || {}
|
metrics: results[3] || {}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
@ -117,7 +120,7 @@ return view.extend({
|
|||||||
E('span', { 'class': 'lai-quick-stat-label' }, _('Models'))
|
E('span', { 'class': 'lai-quick-stat-label' }, _('Models'))
|
||||||
]),
|
]),
|
||||||
E('div', { 'class': 'lai-quick-stat-value', 'id': 'models-count' },
|
E('div', { 'class': 'lai-quick-stat-value', 'id': 'models-count' },
|
||||||
(data.models.models || []).length.toString()
|
(data.models || []).length.toString()
|
||||||
),
|
),
|
||||||
E('div', { 'class': 'lai-quick-stat-sub' }, _('Installed'))
|
E('div', { 'class': 'lai-quick-stat-sub' }, _('Installed'))
|
||||||
]),
|
]),
|
||||||
@ -216,11 +219,11 @@ return view.extend({
|
|||||||
_('Installed Models')
|
_('Installed Models')
|
||||||
]),
|
]),
|
||||||
E('div', { 'class': 'lai-card-badge' },
|
E('div', { 'class': 'lai-card-badge' },
|
||||||
(data.models.models || []).length + ' ' + _('models')
|
(data.models || []).length + ' ' + _('models')
|
||||||
)
|
)
|
||||||
]),
|
]),
|
||||||
E('div', { 'class': 'lai-card-body' }, [
|
E('div', { 'class': 'lai-card-body' }, [
|
||||||
this.renderModelsList(data.models.models || [])
|
this.renderModelsList(data.models || [])
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
]),
|
]),
|
||||||
|
|||||||
@ -35,12 +35,20 @@ return view.extend({
|
|||||||
title: _('LocalAI Models'),
|
title: _('LocalAI Models'),
|
||||||
|
|
||||||
load: function() {
|
load: function() {
|
||||||
return callModels();
|
return callModels().then(function(result) {
|
||||||
|
console.log('LocalAI models RPC result:', JSON.stringify(result));
|
||||||
|
return result;
|
||||||
|
}).catch(function(err) {
|
||||||
|
console.error('LocalAI models RPC error:', err);
|
||||||
|
return { models: [] };
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
render: function(data) {
|
render: function(data) {
|
||||||
var self = this;
|
var self = this;
|
||||||
var models = data.models || [];
|
console.log('LocalAI render data:', JSON.stringify(data));
|
||||||
|
// RPC with expect returns array directly, not {models: [...]}
|
||||||
|
var models = Array.isArray(data) ? data : (data && data.models ? data.models : []);
|
||||||
|
|
||||||
var presets = [
|
var presets = [
|
||||||
{ name: 'tinyllama', desc: 'TinyLlama 1.1B - Ultra-lightweight', size: '669 MB' },
|
{ name: 'tinyllama', desc: 'TinyLlama 1.1B - Ultra-lightweight', size: '669 MB' },
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user