whFalsa / app /services /trip_indexing.py
codeBOKER's picture
Fix trip seat filtering and enable null seats display
64075d7
Raw
History Blame Contribute Delete
2.02 kB
from typing import Any
from app.database.supabase import SupabaseRepository
from app.services.embedding_service import JinaEmbeddingService
from app.utils.departure import trip_departure_bucket, trip_departure_date
def build_trip_embedding_record(trip: dict[str, Any], embedding_model: str) -> dict[str, Any]:
driver = _first_or_dict(trip.get("drivers")) or {}
car = _first_or_dict(trip.get("driver_cars")) or {}
trip_id = str(trip.get("id") or trip.get("trip_id"))
departure_date = trip_departure_date(trip)
departure_time = trip_departure_bucket(trip)
available = trip.get("available_seats") or "unknown"
total = trip.get("total_seats") or "unknown"
chunk_text = (
f"Trip {trip_id}: {trip.get('departure')} to {trip.get('destination')} "
f"on {departure_date} during {departure_time}. "
f"Available seats: {available} of {total}. "
f"Vehicle: {car.get('car_type')}. Driver: {driver.get('name')}. "
f"Price: {trip.get('price')}. Status: {trip.get('status')}."
)
if trip.get("use_driver_message") and trip.get("driver_message"):
chunk_text += f" Driver message: {trip['driver_message']}"
return {
"trip_id": trip_id,
"chunk_text": chunk_text,
"embedding_model": embedding_model,
}
async def index_trip(
*,
repository: SupabaseRepository,
embeddings: JinaEmbeddingService,
embedding_model: str,
trip: dict[str, Any],
) -> None:
record = build_trip_embedding_record(trip, embedding_model)
record["embedding"] = (await embeddings.embed_passages([record["chunk_text"]]))[0]
await repository.upsert_trip_embeddings([record])
async def unindex_trip(*, repository: SupabaseRepository, trip_id: str) -> None:
await repository.delete_trip_embedding(trip_id)
def _first_or_dict(value: Any) -> dict[str, Any] | None:
if isinstance(value, list):
return value[0] if value else None
if isinstance(value, dict):
return value
return None