From 9beb8c15a3a9c82f58fd6be626c1c520b10593e3 Mon Sep 17 00:00:00 2001 From: boban Date: Sun, 19 Apr 2026 08:04:02 +0200 Subject: [PATCH] Fix: unknown type logging, event_update fallback to create, multi-event example MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AgentAIService: Raw response + type=unknown immer loggen (Debug) - AgentActionService: event_update ohne Kandidaten + Zeitangabe → neu erstellen statt mit 'failed' abbrechen - AgentAIService Prompt: Pflicht-Beispiel Reifenwechsel+Volleyball als Multi-Event mit reminder_at, explizit FALSCH: task anlegen markiert Co-Authored-By: Claude Sonnet 4.6 --- src/app/Services/AgentAIService.php | 16 ++++++++++++++++ src/app/Services/AgentActionService.php | 14 +++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/app/Services/AgentAIService.php b/src/app/Services/AgentAIService.php index 0c23ab6..1e82dc9 100644 --- a/src/app/Services/AgentAIService.php +++ b/src/app/Services/AgentAIService.php @@ -104,6 +104,10 @@ class AgentAIService $content = $response['choices'][0]['message']['content'] ?? null; $usage = $response['usage'] ?? []; + \Log::info('AgentAI: Raw response', [ + 'content' => mb_substr($content ?? '', 0, 500), + ]); + $parsed = self::parseJson($content); // Multi-Action: Array von Aktionen @@ -112,6 +116,10 @@ class AgentAIService } if (($parsed['type'] ?? 'unknown') === 'unknown' && $content) { + \Log::warning('AgentAI: type=unknown – Raw content', [ + 'content' => mb_substr($content, 0, 500), + ]); + // Harte Sicherung: wenn das Modell rohen JSON-Text liefert, der // NICHT geparst werden konnte, darf der nie als "message" landen — // sonst liest die TTS geschweifte Klammern vor. @@ -652,6 +660,14 @@ EMAIL: Multi (PFLICHT bei mehreren Aktionen gleichzeitig!): [{"type": "event", "data": {"title": "Zahnarzt", "datetime": "2026-04-20 08:00"}}, {"type": "task", "data": {"title": "Zahnarzt vorbereiten", "priority": "medium"}}] +MULTI-EVENT MIT ERINNERUNG — KORREKT (PFLICHT-BEISPIEL): +User: "Ich hab morgen Reifenwechsel um 17 Uhr, erinnere mich um 7:55. Und heute um 14 Uhr Volleyball, erinnere mich um 7:58." +[ + {"type": "event", "data": {"title": "Reifenwechsel", "datetime": "{{ now('Europe/Vienna')->addDay()->setTime(17,0)->utc()->format('Y-m-d H:i') }}", "reminder_at": "{{ now('Europe/Vienna')->addDay()->setTime(7,55)->utc()->format('Y-m-d H:i:s') }}"}}, + {"type": "event", "data": {"title": "Volleyball", "datetime": "{{ now('Europe/Vienna')->setTime(14,0)->utc()->format('Y-m-d H:i') }}", "reminder_at": "{{ now('Europe/Vienna')->setTime(7,58)->utc()->format('Y-m-d H:i:s') }}"}} +] +FALSCH: Als task oder task_update anlegen — Termine mit Uhrzeit sind IMMER events! + PROMPT; } diff --git a/src/app/Services/AgentActionService.php b/src/app/Services/AgentActionService.php index fd48875..53fa7e8 100644 --- a/src/app/Services/AgentActionService.php +++ b/src/app/Services/AgentActionService.php @@ -236,12 +236,20 @@ class AgentActionService 'incoming_data' => $data, ]); - $event = $candidates->first() ? Event::find($candidates->first()->id) : null; - - if (!$event) { + // Kein Kandidat → neues Event erstellen falls Zeitangabe vorhanden + if ($candidates->isEmpty()) { + if (!empty($data['datetime']) || !empty($data['start'])) { + \Log::info('EventUpdate: Kein Kandidat gefunden → erstelle neues Event', ['search' => $search]); + $createData = array_merge($data, [ + 'title' => $data['title'] ?? $data['search'] ?? $search, + ]); + return self::handleEvent($user, $createData); + } return ['status' => 'failed', 'message' => "Kein Termin mit \"{$search}\" gefunden", 'meta' => ['search' => $search]]; } + $event = Event::find($candidates->first()->id); + \Log::info('EventUpdate: Ausgewählter Termin (vor Änderung)', [ 'event_id' => $event->id, 'title' => $event->title,