Add AI photo import via Ollama Vision

Users can upload a photo of a nail polish bottle; a background queue
job sends it to Ollama (llama3.2-vision at 192.168.30.172:11434),
extracts name, number and manufacturer, then creates the nail polish
and adds it to the user's collection automatically.

- ProcessNailPolishImage job (180s timeout, 2 tries)
- NailPolishImport model + migration (status tracking)
- AiSetting model + migration (Ollama URL + model, admin-configurable)
- NailPolishImportController: upload, status page (auto-refresh every 5s)
- Admin\AiSettingController: configure Ollama connection
- Views: drag-drop upload form, live status page, import history
- Navbar: "Foto importieren" link for all users
- Admin dropdown: "KI-Einstellungen"
- neonail-worker.conf: Supervisor config for the queue worker

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Housemann
2026-06-13 17:37:26 +02:00
co-authored by Claude Sonnet 4.6
parent 7a24e554b0
commit f715bc4552
15 changed files with 738 additions and 0 deletions
+8
View File
@@ -7,6 +7,8 @@ use App\Http\Controllers\AdminController;
use App\Http\Controllers\Auth\LoginController;
use App\Http\Controllers\Auth\SsoController;
use App\Http\Controllers\Admin\SsoSettingController;
use App\Http\Controllers\Admin\AiSettingController;
use App\Http\Controllers\NailPolishImportController;
use App\Http\Controllers\ManufacturerController;
// Startseite
@@ -50,6 +52,8 @@ Route::middleware(['auth'])->group(function () {
Route::get('/users/{user}/collection', [UserNailPolishController::class, 'showUserCollection'])->name('users.collection');
Route::get('/sso', [SsoSettingController::class, 'show'])->name('sso.show');
Route::put('/sso', [SsoSettingController::class, 'update'])->name('sso.update');
Route::get('/ai', [AiSettingController::class, 'show'])->name('ai.show');
Route::put('/ai', [AiSettingController::class, 'update'])->name('ai.update');
});
// Nagellack-Verwaltung (nur für Admin)
@@ -61,6 +65,10 @@ Route::middleware(['auth'])->group(function () {
// Hersteller-Verwaltung (für alle eingeloggten User)
Route::resource('manufacturers', ManufacturerController::class);
Route::get('/manufacturers-search', [ManufacturerController::class, 'search'])->name('manufacturers.search');
// KI Foto-Import (für alle eingeloggten User)
Route::resource('nail-polish-imports', NailPolishImportController::class)
->only(['index', 'create', 'store', 'show']);
});
// Fallback