Improve LLM

This commit is contained in:
Andras Schmelczer 2026-03-15 14:05:34 +00:00
parent 02712f41e8
commit 80c093b7ba
16 changed files with 898 additions and 278 deletions

View file

@ -42,6 +42,7 @@ interface AiFilterInputProps {
error: string | null;
errorType: AiFilterErrorType | null;
notes: string | null;
summary: string | null;
onSubmit: (query: string) => void;
isLoggedIn: boolean;
onLoginRequired: () => void;
@ -52,6 +53,7 @@ export default memo(function AiFilterInput({
error,
errorType,
notes,
summary,
onSubmit,
isLoggedIn,
onLoginRequired,
@ -88,7 +90,7 @@ export default memo(function AiFilterInput({
);
const hasContent = query.trim().length > 0;
const showExamples = expanded && !hasContent && !loading && !error && !notes;
const showExamples = expanded && !hasContent && !loading && !error && !notes && !summary;
if (!expanded) {
return (
@ -173,6 +175,11 @@ export default memo(function AiFilterInput({
{error}
</p>
)}
{summary && !error && !loading && (
<p className="mt-1 text-xs text-teal-600 dark:text-teal-400">
{summary}
</p>
)}
{notes && !error && !loading && (
<p className="mt-1 text-xs text-warm-500 dark:text-warm-400 italic">
{notes}

View file

@ -92,6 +92,7 @@ interface FiltersProps {
aiFilterError: string | null;
aiFilterErrorType: AiFilterErrorType | null;
aiFilterNotes: string | null;
aiFilterSummary: string | null;
onAiFilterSubmit: (query: string) => void;
isLoggedIn: boolean;
onLoginRequired: () => void;
@ -127,6 +128,7 @@ export default memo(function Filters({
aiFilterError,
aiFilterErrorType,
aiFilterNotes,
aiFilterSummary,
onAiFilterSubmit,
isLoggedIn,
onLoginRequired,
@ -285,7 +287,7 @@ export default memo(function Filters({
</div>
<div ref={scrollRef} className="md:flex-1 md:overflow-y-auto">
<AiFilterInput loading={aiFilterLoading} error={aiFilterError} errorType={aiFilterErrorType} notes={aiFilterNotes} onSubmit={onAiFilterSubmit} isLoggedIn={isLoggedIn} onLoginRequired={onLoginRequired} />
<AiFilterInput loading={aiFilterLoading} error={aiFilterError} errorType={aiFilterErrorType} notes={aiFilterNotes} summary={aiFilterSummary} onSubmit={onAiFilterSubmit} isLoggedIn={isLoggedIn} onLoginRequired={onLoginRequired} />
<div className="px-3 pb-2 space-y-2">
<div className="flex rounded-lg bg-warm-100 dark:bg-warm-800 p-0.5">
{(['historical', 'buy', 'rent'] as const).map((type) => {

View file

@ -148,22 +148,33 @@ export default function MapPage({
const handleAiFilterSubmit = useCallback(
async (query: string) => {
const result = await aiFilters.fetchAiFilters(query);
// Build context from current filters for conversational refinement
const context = {
filters,
travelTime: travelTime.activeEntries.map((entry) => ({
mode: entry.mode,
label: entry.label,
min: entry.timeRange?.[0],
max: entry.timeRange?.[1],
})),
};
const hasContext =
Object.keys(context.filters).length > 0 || context.travelTime.length > 0;
const result = await aiFilters.fetchAiFilters(query, hasContext ? context : undefined);
if (!result) return;
handleSetFilters(result.filters);
// Apply travel time filters from AI
if (result.travelTimeFilters.length > 0) {
const newEntries = result.travelTimeFilters.map((tt) => ({
mode: tt.mode,
slug: tt.slug,
label: tt.label,
timeRange: [tt.min ?? 0, tt.max ?? 120] as [number, number],
useBest: false,
}));
travelTime.handleSetEntries(newEntries);
}
// Always sync travel time entries — clear stale ones when AI returns none
const newEntries = result.travelTimeFilters.map((tt) => ({
mode: tt.mode,
slug: tt.slug,
label: tt.label,
timeRange: [tt.min ?? 0, tt.max ?? 120] as [number, number],
useBest: false,
}));
travelTime.handleSetEntries(newEntries);
},
[aiFilters.fetchAiFilters, handleSetFilters, travelTime.handleSetEntries]
[aiFilters.fetchAiFilters, handleSetFilters, travelTime.handleSetEntries, travelTime.activeEntries, filters]
);
const handleTravelTimeSetDestination = useCallback(
@ -514,6 +525,7 @@ export default function MapPage({
aiFilterError={aiFilters.error}
aiFilterErrorType={aiFilters.errorType}
aiFilterNotes={aiFilters.notes}
aiFilterSummary={aiFilters.summary}
onAiFilterSubmit={handleAiFilterSubmit}
isLoggedIn={!!user}
onLoginRequired={onRegisterClick ?? (() => {})}