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:
CyberMind-FR 2026-01-21 17:29:50 +01:00
parent 6f713b1041
commit 63c0bb3e5a
4 changed files with 21 additions and 9 deletions

View File

@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-localai
PKG_VERSION:=0.1.0
PKG_RELEASE:=10
PKG_RELEASE:=12
PKG_ARCH:=all
PKG_LICENSE:=Apache-2.0

View File

@ -27,7 +27,8 @@ return view.extend({
render: function(data) {
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' }, [
E('style', {}, this.getCSS()),

View File

@ -75,10 +75,13 @@ return view.extend({
callHealth(),
callMetrics()
]).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 {
status: results[0] || {},
models: results[1] || { models: [] },
health: results[2] || { healthy: false },
models: modelsData,
health: results[2] || {},
metrics: results[3] || {}
};
});
@ -117,7 +120,7 @@ return view.extend({
E('span', { 'class': 'lai-quick-stat-label' }, _('Models'))
]),
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'))
]),
@ -216,11 +219,11 @@ return view.extend({
_('Installed Models')
]),
E('div', { 'class': 'lai-card-badge' },
(data.models.models || []).length + ' ' + _('models')
(data.models || []).length + ' ' + _('models')
)
]),
E('div', { 'class': 'lai-card-body' }, [
this.renderModelsList(data.models.models || [])
this.renderModelsList(data.models || [])
])
])
]),

View File

@ -35,12 +35,20 @@ return view.extend({
title: _('LocalAI Models'),
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) {
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 = [
{ name: 'tinyllama', desc: 'TinyLlama 1.1B - Ultra-lightweight', size: '669 MB' },