feat(ai): 50er-Pool Magie-Phrasen fuer Foto-description
This commit is contained in:
56
src/lib/server/ai/description-phrases.ts
Normal file
56
src/lib/server/ai/description-phrases.ts
Normal file
@@ -0,0 +1,56 @@
|
||||
export const DESCRIPTION_PHRASES: readonly string[] = [
|
||||
'Mit dem Zauberstab aus dem Kochbuch geholt.',
|
||||
'Foto-Magie frisch aus dem Ofen.',
|
||||
'Aus dem Bild herbeigezaubert.',
|
||||
'Ein Klick, ein Foto, fertig.',
|
||||
'Knipsen statt Abtippen.',
|
||||
'Von der Buchseite direkt in die Pfanne.',
|
||||
'Die Kamera hat mitgelesen.',
|
||||
'Abrakadabra — Rezept da.',
|
||||
'Per Linse in die Küche teleportiert.',
|
||||
'Von Oma abfotografiert, von der KI entziffert.',
|
||||
'Frisch aus dem Bilderrahmen.',
|
||||
'Klick, zisch, Rezept.',
|
||||
'Das Foto wurde überredet, sich zu verraten.',
|
||||
'Schnappschuss zur Schüssel.',
|
||||
'Einmal lesen lassen, schon da.',
|
||||
'Keine Hand hat dieses Rezept abgetippt.',
|
||||
'Vom Bild in die Bratpfanne.',
|
||||
'Papier ist geduldig, das Foto war es auch.',
|
||||
'Eine Seite, ein Foto, ein Rezept.',
|
||||
'Die KI hat drübergeschielt.',
|
||||
'Handschriftlich entziffert — oder zumindest versucht.',
|
||||
'Aus der Linse in die Liste.',
|
||||
'Vom Küchentisch zur Kachel.',
|
||||
'Knips und weg — zumindest der Zettel.',
|
||||
'Das Bild hat geredet.',
|
||||
'Keine Tippfehler, nur Sehfehler.',
|
||||
'Per Foto eingebürgert.',
|
||||
'Rezept-Übersetzung aus dem Bild.',
|
||||
'Die Seite hat sich verraten.',
|
||||
'Blitzlicht und dann Gulasch.',
|
||||
'Ein Augenzwinkern der Kamera genügte.',
|
||||
'Geknipst, gelesen, gespeichert.',
|
||||
'Fotografische Gedächtnishilfe.',
|
||||
'Aus der Schublade ans Licht.',
|
||||
'Das Rezept stand schon da — wir haben nur hingeguckt.',
|
||||
'Zaubertrick mit Kamera.',
|
||||
'Vom Papier befreit.',
|
||||
'Ein Foto sagt mehr als tausend Zutatenlisten.',
|
||||
'Eingescannt, rausgelesen, reingeschrieben.',
|
||||
'Die Kamera als Küchenhilfe.',
|
||||
'Handy hoch, Rezept runter.',
|
||||
'Aus dem Kochbuch gebeamt.',
|
||||
'Ein scharfes Foto, ein klares Rezept.',
|
||||
'Vom Regal zur App in einem Schritt.',
|
||||
'Aus dem Bild geschöpft wie Suppe aus dem Topf.',
|
||||
'Optisch erfasst, digital serviert.',
|
||||
'Das Kleingedruckte hat die KI gelesen.',
|
||||
'Vom Kladdenzettel in die Datenbank.',
|
||||
'Kurz gezückt, schon gekocht.',
|
||||
'Kein Schreibkrampf, nur ein Klick.'
|
||||
];
|
||||
|
||||
export function pickRandomPhrase(): string {
|
||||
return DESCRIPTION_PHRASES[Math.floor(Math.random() * DESCRIPTION_PHRASES.length)];
|
||||
}
|
||||
26
tests/unit/description-phrases.test.ts
Normal file
26
tests/unit/description-phrases.test.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import { DESCRIPTION_PHRASES, pickRandomPhrase } from '../../src/lib/server/ai/description-phrases';
|
||||
|
||||
describe('description-phrases', () => {
|
||||
it('contains exactly 50 entries', () => {
|
||||
expect(DESCRIPTION_PHRASES).toHaveLength(50);
|
||||
});
|
||||
|
||||
it('has no empty or whitespace-only entries', () => {
|
||||
for (const phrase of DESCRIPTION_PHRASES) {
|
||||
expect(phrase.trim().length).toBeGreaterThan(0);
|
||||
}
|
||||
});
|
||||
|
||||
it('has no duplicates', () => {
|
||||
const set = new Set(DESCRIPTION_PHRASES);
|
||||
expect(set.size).toBe(DESCRIPTION_PHRASES.length);
|
||||
});
|
||||
|
||||
it('pickRandomPhrase returns a member of the pool', () => {
|
||||
const pool = new Set(DESCRIPTION_PHRASES);
|
||||
for (let i = 0; i < 100; i++) {
|
||||
expect(pool.has(pickRandomPhrase())).toBe(true);
|
||||
}
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user