generated from knso/webklar-preview-template
- Backend-Proxy (Cloudflare Worker in proxy/): API-Key serverseitig, Modell-Whitelist, max_tokens-Deckel, Tageslimits pro Gerät und IP - Modell-Split: Analyse auf Sonnet 5, Übersetzung/Antwort auf Haiku 4.5 - Bild-Downscaling auf 2000px vor dem Upload (ScanScreen) - Expo SDK 56 -> 57 Upgrade - Freemium: 3 Gratis-Analysen mit lokalem Zähler und Paywall-Hinweis - Einstellungen: API-Key-Feld nur noch im Dev-Modus (NUTZT_PROXY) - Build-Setup: Bundle-IDs, eas.json, Splash-Screen-Plugin - Tests: jest-expo + 17 Tests für die Ampel-/Fristlogik - Rechtliches: Datenschutzerklärung (Entwurf), Webseite (webseite/, live auf behoerdenklar.pages.dev), Store-Texte (store/) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
73 lines
2.5 KiB
TypeScript
73 lines
2.5 KiB
TypeScript
/**
|
|
* Antwort-Generator: erzeugt einen formellen deutschen Antwort-Entwurf
|
|
* passend zum Brieftyp und zur gewählten Vorlage. Der Nutzer kann den
|
|
* Entwurf danach frei bearbeiten und als PDF exportieren.
|
|
*/
|
|
import { AntwortTyp, ANTWORT_TYP_LABEL, BriefAnalyse } from '../types';
|
|
import { claudeJsonAufruf, MODELL_EINFACH } from './claudeClient';
|
|
|
|
const ANTWORT_SCHEMA = {
|
|
type: 'object',
|
|
additionalProperties: false,
|
|
required: ['betreff', 'text'],
|
|
properties: {
|
|
betreff: { type: 'string', description: 'Betreffzeile des Antwortbriefs.' },
|
|
text: {
|
|
type: 'string',
|
|
description:
|
|
'Vollständiger Brieftext inkl. Anrede und Grußformel. Platzhalter in eckigen Klammern für persönliche Daten, z. B. [Ihr Name], [Ihre Adresse], [Kundennummer].',
|
|
},
|
|
},
|
|
} as const;
|
|
|
|
export interface AntwortEntwurf {
|
|
betreff: string;
|
|
text: string;
|
|
}
|
|
|
|
/**
|
|
* @param analyse - Analyse des Original-Briefs (liefert Kontext)
|
|
* @param typ - gewählte Antwort-Vorlage
|
|
* @param hinweise - optionale Angaben des Nutzers (z. B. Wunschtermin, Grund)
|
|
*/
|
|
export async function generiereAntwort(
|
|
analyse: BriefAnalyse,
|
|
typ: AntwortTyp,
|
|
hinweise: string
|
|
): Promise<AntwortEntwurf> {
|
|
return claudeJsonAufruf<AntwortEntwurf>({
|
|
modell: MODELL_EINFACH,
|
|
maxTokens: 4000,
|
|
system: `Du schreibst formelle, höfliche Antwortbriefe an deutsche Behörden im Namen von Privatpersonen. Regeln:
|
|
- Korrektes, formelles Deutsch (der Empfänger ist eine Behörde — hier KEINE einfache Sprache).
|
|
- Kurz und präzise, keine Floskeln über das Nötige hinaus.
|
|
- Persönliche Daten, die du nicht kennst, als Platzhalter in eckigen Klammern: [Ihr Name], [Ihre Adresse], [Aktenzeichen] usw.
|
|
- Aktenzeichen/Kundennummer aus dem Original-Brief referenzieren, falls bekannt.
|
|
- Bei Widersprüchen: sachlich, Frist wahren, Begründung ankündigen falls der Nutzer keine angegeben hat. Weise am Ende des Textes in einer Zeile "[Hinweis: ...]" darauf hin, dass bei rechtlichen Fragen eine Beratungsstelle oder ein Anwalt helfen kann — die App ersetzt keine Rechtsberatung.`,
|
|
schema: ANTWORT_SCHEMA,
|
|
messages: [
|
|
{
|
|
role: 'user',
|
|
content: `Schreibe eine Antwort auf diesen Behördenbrief.
|
|
|
|
Art der Antwort: ${ANTWORT_TYP_LABEL[typ]}
|
|
|
|
Analyse des Original-Briefs:
|
|
${JSON.stringify(
|
|
{
|
|
brieftyp: analyse.brieftyp,
|
|
absender: analyse.absender,
|
|
kernaussage: analyse.kernaussage,
|
|
frist: analyse.frist,
|
|
termin: analyse.termin,
|
|
},
|
|
null,
|
|
2
|
|
)}
|
|
|
|
Zusätzliche Angaben des Nutzers: ${hinweise.trim() || 'keine'}`,
|
|
},
|
|
],
|
|
});
|
|
}
|