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