feat(api): URL-Kontext auch in /decks/generate + fetchUrlContent extrahieren

- `lib/url-fetch.ts`: fetchUrlContent aus decks-from-image herausgezogen
  — gemeinsam genutzte Logik für mana-search + direktes HTTP-Fetch-Fallback
- `decks-generate.ts`: optionales `url`-Feld im Input-Schema;
  URL-Inhalt wird an den Prompt angehängt wenn vorhanden
- `decks.ts` (web): `generateDeck()` akzeptiert jetzt `url?: string`
- UI: imageUrl wird für Text-KI + Bild-KI als Kontext genutzt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-05-10 16:39:39 +02:00
parent 595f1f9cb6
commit dc382a795d
6 changed files with 63 additions and 55 deletions

View file

@ -22,7 +22,7 @@ export function deleteDeck(id: string) {
return api<{ deleted: string }>(`/api/v1/decks/${id}`, { method: 'DELETE' });
}
export function generateDeck(input: { prompt: string; language?: 'de' | 'en'; count?: number }) {
export function generateDeck(input: { prompt: string; language?: 'de' | 'en'; count?: number; url?: string }) {
return api<{ deck: Deck; cards_created: number }>('/api/v1/decks/generate', {
method: 'POST',
body: input,

View file

@ -130,7 +130,7 @@
aiError = null;
generating = true;
try {
const result = await generateDeck({ prompt: name.trim(), count, language });
const result = await generateDeck({ prompt: name.trim(), count, language, url: imageUrl.trim() || undefined });
toasts.success(`✨ "${result.deck.name}" mit ${result.cards_created} Karten erstellt`);
goto(`/decks/${result.deck.id}`);
} catch (err) {

View file

@ -106,7 +106,7 @@
aiError = null;
generating = true;
try {
const result = await generateDeck({ prompt: name.trim(), count, language });
const result = await generateDeck({ prompt: name.trim(), count, language, url: imageUrl.trim() || undefined });
toasts.success(`✨ "${result.deck.name}" mit ${result.cards_created} Karten erstellt`);
goto(`/decks/${result.deck.id}`);
} catch (err) {