From 0744194c84829eb108f76f855a5a9dceeb38b44e Mon Sep 17 00:00:00 2001 From: Bruno Deanoz Date: Wed, 24 Jun 2026 10:34:05 +0200 Subject: [PATCH] Expand auto-search to tech products, movies, series, comparisons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New pattern categories: - Tech products: iPhone/Galaxy/Pixel/iPad + version numbers, specs, release dates, "neuestes Handy", Apple Vision Pro, Meta Quest, etc. - Movies/series: Staffel/Season/Episode numbers, cast, ratings, neue Serie/neuer Film, IMDB, Rotten Tomatoes - Product comparisons: "vs" with model numbers, "lohnt sich" - Current leaders: Bundeskanzler, CEO, Präsident These are high-hallucination topics where the AI's training data is likely outdated — auto-search gives it fresh facts. 8 new tests (tech, movies, comparisons, leaders). --- .../java/dev/kaizen/app/chat/ChatModels.kt | 59 ++++++++++++++++--- .../java/dev/kaizen/app/DetectSearchTest.kt | 32 ++++++++++ 2 files changed, 83 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/dev/kaizen/app/chat/ChatModels.kt b/app/src/main/java/dev/kaizen/app/chat/ChatModels.kt index 1aadd99..51cba3e 100644 --- a/app/src/main/java/dev/kaizen/app/chat/ChatModels.kt +++ b/app/src/main/java/dev/kaizen/app/chat/ChatModels.kt @@ -66,16 +66,59 @@ val chatModes = listOf( ) private val SEARCH_PATTERNS = listOf( - "such nach", "suche nach", "was ist aktuell", "aktuelle", "neueste", - "wie ist das wetter", "wetter in", "was passiert gerade", "was ist heute", - "aktuelle news", "nachrichten", "was kostet", "aktienkurs", "kurs von", + // Explicit search intent + "such nach", "suche nach", "recherchier", "google mal", + "search for", "look up", "find me", "google", + + // Current events + news + "was ist aktuell", "aktuelle", "neueste", "neuester", "neuestes", + "was passiert gerade", "was ist heute", "was gibt es neues", + "aktuelle news", "nachrichten", "breaking", + "what is happening", "latest news", "current events", "breaking news", + + // Weather + time + location + "wie ist das wetter", "wetter in", "wie spät", "uhrzeit in", + "weather in", "weather today", "time in", + + // Prices + stocks + finance + "was kostet", "aktienkurs", "kurs von", "preis von", "preisvergleich", + "stock price", "how much is", "price of", + + // Sports + results "wer hat gewonnen", "ergebnis von", "stand von", "tabelle von", - "öffnungszeiten", "wie spät", "uhrzeit in", "einwohner von", - "search for", "look up", "find me", "what is happening", - "latest news", "current events", "weather in", "weather today", - "stock price", "who won", "what happened", "how much is", + "who won", "score of", "results of", + + // Facts + stats + "öffnungszeiten", "einwohner von", "hauptstadt von", + "opening hours", "population of", "capital of", + + // Tech products — hallucination-prone: specs, release dates, prices change + "iphone \\d", "galaxy s\\d", "pixel \\d", "ipad \\d", + "apple vision", "meta quest", "playstation \\d", "xbox", + "neues iphone", "neues samsung", "neues pixel", "neues ipad", + "neuestes handy", "neuestes smartphone", "neuestes tablet", + "specs von", "technische daten", "release.?date", "erscheinungsdatum", + "wann kommt .* raus", "wann erscheint", + "latest iphone", "latest samsung", "latest pixel", + "newest phone", "newest tablet", "release date", + "when does .* come out", "when is .* releasing", + + // Movies + series — cast, seasons, ratings change constantly + "staffel \\d", "season \\d", "episode \\d", "folge \\d", + "neue staffel", "neue serie", "neuer film", + "wann kommt staffel", "wann kommt die .* staffel", + "besetzung von", "cast von", "schauspieler in", + "imdb", "rotten tomatoes", "bewertung von", + "new season", "new episode", "new movie", + "cast of", "actors in", "rating of", "reviews of", + + // Comparisons where freshness matters (product-specific) + "vergleich.*\\d{4}", "vs\\.?\\s\\w+\\s?\\d", "lohnt sich", + "compared to", "vs \\w+ \\d", "worth buying", + + // When/who questions about current state "when did", "when was", "who is the current", "what are the latest", - "score of", "results of", "opening hours", "population of", + "wer ist.*präsident", "wer ist.*kanzler", "wer ist.*ceo", ).map { Regex(it, RegexOption.IGNORE_CASE) } fun detectSearchQuery(text: String): Boolean { diff --git a/app/src/test/java/dev/kaizen/app/DetectSearchTest.kt b/app/src/test/java/dev/kaizen/app/DetectSearchTest.kt index 9a8fcdb..f32515d 100644 --- a/app/src/test/java/dev/kaizen/app/DetectSearchTest.kt +++ b/app/src/test/java/dev/kaizen/app/DetectSearchTest.kt @@ -27,6 +27,38 @@ class DetectSearchTest { assertTrue(detectSearchQuery("Look up population of Germany")) } + @Test + fun detectsTechProducts() { + assertTrue(detectSearchQuery("Was kostet das iPhone 16 Pro?")) + assertTrue(detectSearchQuery("Specs von Galaxy S25 Ultra")) + assertTrue(detectSearchQuery("Wann kommt das neue iPad raus?")) + assertTrue(detectSearchQuery("Apple Vision Pro technische Daten")) + assertTrue(detectSearchQuery("Latest iPhone release date")) + assertTrue(detectSearchQuery("Neuestes Samsung Handy 2026")) + } + + @Test + fun detectsMoviesAndSeries() { + assertTrue(detectSearchQuery("Wann kommt Staffel 3 von Squid Game?")) + assertTrue(detectSearchQuery("Cast von The Last of Us Season 2")) + assertTrue(detectSearchQuery("Neue Serie auf Netflix")) + assertTrue(detectSearchQuery("Bewertung von Oppenheimer")) + assertTrue(detectSearchQuery("Rating of Dune Part 2")) + assertTrue(detectSearchQuery("Besetzung von Wednesday Staffel 2")) + } + + @Test + fun detectsComparisons() { + assertTrue(detectSearchQuery("iPhone 16 vs Galaxy S25")) + assertTrue(detectSearchQuery("Lohnt sich die PS5 Pro?")) + } + + @Test + fun detectsCurrentLeaders() { + assertTrue(detectSearchQuery("Wer ist aktuell Bundeskanzler?")) + assertTrue(detectSearchQuery("Who is the current CEO of OpenAI?")) + } + @Test fun doesNotTriggerOnNormalPrompts() { assertFalse(detectSearchQuery("Erkläre mir Quantencomputing"))