Files
neonail-database/resources/views/admin/ai/show.blade.php
T
HousemannandClaude Sonnet 4.6 9861a74e1e Fix admin AI nav bug, add rescan feature
- Fix Blade parse error in admin AI settings (Blade was interpreting
  JSON braces in DEFAULT_PROMPT as template tags, breaking the navbar)
  — pass defaultPrompt from controller instead
- Add rescan: POST /nail-polishes/{id}/rescan creates a new import for
  an existing nail polish and updates its fields after AI analysis
- Add KI-Rescan button on collection cards (only if image exists)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-13 18:22:41 +02:00

102 lines
5.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@extends('layouts.app')
@section('title', 'KI-Einstellungen NeoNail DB')
@section('content')
<div class="page-hero mb-4">
<h1><i class="fas fa-robot me-2"></i>KI-Einstellungen</h1>
<p>Ollama-Konfiguration für den automatischen Foto-Import</p>
</div>
<div class="row g-4">
<div class="col-lg-7">
<div class="card">
<div class="card-header"><i class="fas fa-cog me-2"></i>Ollama Verbindung</div>
<div class="card-body p-4">
<form method="POST" action="{{ route('admin.ai.update') }}">
@csrf
@method('PUT')
<div class="mb-3">
<label class="form-label" for="ollama_url">Ollama URL <span class="text-danger">*</span></label>
<input type="url" class="form-control @error('ollama_url') is-invalid @enderror"
id="ollama_url" name="ollama_url"
value="{{ old('ollama_url', $ai->ollama_url) }}"
placeholder="http://192.168.30.172:11434">
@error('ollama_url')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
<div class="form-text">URL des Ollama-Containers/Servers ohne abschließenden Slash.</div>
</div>
<div class="mb-3">
<label class="form-label" for="ollama_model">Modell <span class="text-danger">*</span></label>
<input type="text" class="form-control @error('ollama_model') is-invalid @enderror"
id="ollama_model" name="ollama_model"
value="{{ old('ollama_model', $ai->ollama_model) }}"
placeholder="llama3.2-vision">
@error('ollama_model')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
<div class="form-text">Muss ein Vision-fähiges Modell sein (z.B. <code>llama3.2-vision</code>, <code>llava</code>).</div>
</div>
<div class="mb-4">
<label class="form-label" for="prompt">
Erkennungs-Prompt
<span class="badge bg-secondary ms-1" style="font-size:.65rem;">optional</span>
</label>
<textarea class="form-control @error('prompt') is-invalid @enderror"
id="prompt" name="prompt" rows="12"
placeholder="Leer lassen für Standard-Prompt"
style="font-family: monospace; font-size: .82rem;">{{ old('prompt', $ai->prompt) }}</textarea>
@error('prompt')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
<div class="form-text">
Leer lassen um den Standard-Prompt zu verwenden.
<a href="#" onclick="resetPrompt(); return false;">Standard-Prompt einfügen</a>
</div>
<div class="mt-2 p-3" style="background:#f9fafb; border-radius:10px; border:1px solid #e5e7eb;">
<p style="font-size:.75rem; color:#6b7280; margin:0 0 6px; font-weight:600;">AKTUELL AKTIVER PROMPT:</p>
<pre style="font-size:.75rem; color:#374151; margin:0; white-space:pre-wrap; word-break:break-word;">{{ $ai->getActivePrompt() }}</pre>
</div>
</div>
<button type="submit" class="btn btn-primary">
<i class="fas fa-save me-2"></i>Speichern
</button>
</form>
</div>
</div>
</div>
<div class="col-lg-5">
<div class="card">
<div class="card-header"><i class="fas fa-info-circle me-2"></i>Queue Worker</div>
<div class="card-body p-3">
<p style="font-size:.83rem; color:#374151; margin-bottom:10px;">
Jobs werden über die <strong>Datenbank-Queue</strong> verarbeitet. Auf dem Server muss dauerhaft ein Worker laufen:
</p>
<code style="display:block; background:#f3f4f6; padding:10px 12px; border-radius:8px; font-size:.78rem; white-space:pre-wrap;">php artisan queue:work \
--timeout=180 \
--tries=2 \
--sleep=3</code>
<p style="font-size:.78rem; color:#9ca3af; margin-top:10px; margin-bottom:0;">
Empfohlen: Als Supervisor-Dienst einrichten, damit der Worker nach Crashes neu startet.
</p>
</div>
</div>
</div>
</div>
@section('scripts')
<script>
const defaultPrompt = @json($defaultPrompt);
function resetPrompt() {
document.getElementById('prompt').value = defaultPrompt;
}
</script>
@endsection