from typing import Any
from pydantic import BaseModel, Field
from vmk_data_collector.domain.enums import DealType
class SimilarSearchRequest(BaseModel):
"""Semantic search by text query (vector similarity)."""
query: str = Field(..., min_length=1, max_length=2000)
limit: int = Field(default=10, ge=1, le=100)
deal_type: DealType | None = None
city: str | None = Field(default=None, max_length=128)
min_price: float | None = Field(default=None, ge=0)
max_price: float | None = Field(default=None, ge=0)
class SimilarSearchResult(BaseModel):
"""One listing returned by semantic search."""
id: int
title: str | None = None
description: str | None = None
generated_description: str | None = None
deal_type: DealType | None = None
price: float | None = None
currency: str | None = None
city: str | None = None
district: str | None = None
rooms_count: int | None = None
total_area: float | None = None
url_source: str | None = None
images_count: int | None = None
similarity_score: float
created_at: str | None = None
class SimilarSearchResponse(BaseModel):
"""Response wrapper for semantic search."""
query: str
results: list[SimilarSearchResult]
total: int