// ══ src/services/ai/IAIService.ts — Typen (aktuell Zeilen 200–232) ══ // ── Exposé texts (Livia) ────────────────────────────────────────────────────── /** * Die Textabschnitte eines Exposés. Jeder lässt sich einzeln erzeugen — * gesamthaft heisst schlicht: alle nacheinander (Runde 4, §8.5.2). */ export const ExposeTextSection = { TITLE: 'TITLE', TEASER: 'TEASER', OBJECT: 'OBJECT', LOCATION: 'LOCATION', MUNICIPALITY: 'MUNICIPALITY', FEATURES: 'FEATURES', HIGHLIGHTS: 'HIGHLIGHTS', } as const export type ExposeTextSection = typeof ExposeTextSection[keyof typeof ExposeTextSection] export type ExposeTonality = 'SACHLICH' | 'HOCHWERTIG' | 'EINLADEND' export interface ExposeTextInput { section: ExposeTextSection tonality: ExposeTonality /** Ausschliesslich belegte Angaben aus «Meine Objekte» — nichts Erfundenes. */ facts: Record } export interface ExposeTextResult { section: ExposeTextSection text: string /** Angaben, die für einen vollständigen Text fehlen — statt sie zu erfinden. */ missingFacts: string[] } // ══ src/services/ai/IAIService.ts — Methode im Interface (Zeile 281) ══ recommendPreMarketRent(input: PreMarketRentInput): Promise> // Exposé-Texte (Livia) — pro Abschnitt auslösbar generateExposeText(input: ExposeTextInput): Promise> // Legacy methods // ══ src/services/ai/mock/MockAIService.ts — Importe (17-18, 25) ══ ExposeTextInput, ExposeTextResult, import { buildExposeText } from './exposeTextBuilder' // ══ src/services/ai/mock/MockAIService.ts — Implementierung (303-310) ══ }), generateExposeText: (input: ExposeTextInput) => traceMock('generateExposeText', async () => { await delay(SIMULATED_DELAY.medium) return { data: buildExposeText(input), provenance: mockProvenance() } }), // ══ src/services/ai/backend/BackendAIService.ts — Importe (62-63) ══ ExposeTextInput, ExposeTextResult, // ══ src/services/ai/backend/BackendAIService.ts — Delegation (678-690) ══ }, // ── generateExposeText ────────────────────────────────────────────────────── // // Bewusst ohne eigenen LLM-Aufruf: der Text darf ausschliesslich auf erfassten // Objektdaten beruhen (Runde 4, §8.5.2). Ein freies Sprachmodell würde genau // die fehlenden Angaben plausibel ergänzen, die hier rot markiert gehören. // Deshalb erzeugt auch im Backend-Betrieb der deterministische Builder den // Entwurf; er nennt Lücken, statt sie zu füllen. generateExposeText(input: ExposeTextInput): Promise> { return MockAIService.generateExposeText(input) },