fix(pos): chatbot busca partes automaticamente con traduccion ES→EN

- System prompt: SIEMPRE devuelve search_query en ingles
- Diccionario de traducciones (balatas→Brake Pad, etc.)
- Busca directo sin preguntar mas info
- Fallback: extrae keywords si AI no da search_query

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-02 07:39:47 +00:00
parent 9908c045c9
commit b5d62c2812
2 changed files with 42 additions and 21 deletions

View File

@@ -46,10 +46,23 @@ def chat():
vehicle_match = _resolve_vehicle(master, vehicle) vehicle_match = _resolve_vehicle(master, vehicle)
# Run catalog search if we have a search query # Run catalog search if we have a search query
if search_query and master and tenant: # Also search if AI identified a vehicle but didn't give a search_query
effective_query = search_query
if not effective_query and vehicle:
# Extract likely part keywords from the user's message
import re
# Remove brand/model/year from message to get the part description
part_words = user_message.lower()
for remove in [vehicle.get('brand',''), vehicle.get('model',''), str(vehicle.get('year',''))]:
part_words = part_words.replace(remove.lower(), '')
part_words = re.sub(r'necesito|quiero|busco|para|un|una|el|la|de|del|los|las|mi|\d{4}', '', part_words).strip()
if len(part_words) >= 3:
effective_query = part_words
if effective_query and master and tenant:
try: try:
results = catalog_service.smart_search( results = catalog_service.smart_search(
master, search_query, tenant, branch_id, limit=10 master, effective_query, tenant, branch_id, limit=10
) )
search_results = results if results else [] search_results = results if results else []
except Exception: except Exception:

View File

@@ -10,28 +10,36 @@ MODEL = "anthropic/claude-haiku-4.5" # Fast + cheap for chat
SYSTEM_PROMPT = """Eres un asistente de refaccionaria automotriz mexicana. Tu trabajo es ayudar a encontrar autopartes. SYSTEM_PROMPT = """Eres un asistente de refaccionaria automotriz mexicana. Tu trabajo es ayudar a encontrar autopartes.
Cuando el usuario describe lo que necesita, extrae: IMPORTANTE: Responde SIEMPRE en formato JSON valido con esta estructura:
1. Marca del vehiculo (si la menciona)
2. Modelo del vehiculo (si lo menciona)
3. Ano del vehiculo (si lo menciona)
4. Tipo de parte que busca
Responde en espanol, de forma breve y directa. Si puedes identificar el numero de parte OEM, incluyelo.
Si no tienes suficiente informacion, pregunta lo que falte.
IMPORTANTE: Responde SIEMPRE en formato JSON con esta estructura:
{ {
"message": "Tu respuesta al usuario", "message": "Tu respuesta al usuario en español",
"search_query": "texto para buscar en el catalogo" | null, "search_query": "termino de busqueda EN INGLES para el catalogo",
"vehicle": {"brand": "TOYOTA", "model": "Corolla", "year": 2020} | null "vehicle": {"brand": "TOYOTA", "model": "Corolla", "year": 2020}
} }
Reglas: Reglas OBLIGATORIAS:
- "message" es tu respuesta conversacional al usuario. 1. "search_query" SIEMPRE debe tener un valor cuando el usuario menciona una parte. NUNCA dejes null si el usuario pide algo.
- "search_query" es el texto clave para buscar partes en la base de datos (nombre de parte en ingles, numero OEM, etc). Usa null si no hay busqueda. 2. "search_query" debe estar EN INGLES porque el catalogo TecDoc tiene nombres en ingles. Traducciones comunes:
- "vehicle" extrae marca, modelo y ano si los menciona. Usa null si no hay vehiculo. - Balatas/Pastillas de freno = "Brake Pad"
- La marca debe ir en MAYUSCULAS (NISSAN, TOYOTA, CHEVROLET, etc). - Discos de freno = "Brake Disc"
- Nombres comunes mexicanos: Tsuru = Sentra/Tsuru, Aveo, Jetta, Pointer, Chevy = Corsa, Vocho = Beetle. - Amortiguador = "Shock Absorber"
- Filtro de aceite = "Oil Filter"
- Filtro de aire = "Air Filter"
- Bujias = "Spark Plug"
- Banda serpentina = "V-Belt" o "Serpentine Belt"
- Bomba de agua = "Water Pump"
- Alternador = "Alternator"
- Radiador = "Radiator"
- Sensor de oxigeno = "Oxygen Sensor"
- Terminal de direccion = "Tie Rod End"
- Bomba de gasolina = "Fuel Pump"
- Clutch/Embrague = "Clutch Kit"
- Mofle/Escape = "Exhaust"
- Inyector = "Injector"
3. "vehicle" extrae marca, modelo y ano. La marca en MAYUSCULAS.
4. Nombres mexicanos: Tsuru = TSURU, Aveo = AVEO, Jetta = JETTA, Pointer = POINTER, Chevy = CORSA, Vocho = BEETLE.
5. No preguntes mas info si ya puedes buscar. Si el usuario dice "balatas para Tsuru 2015", busca directo.
6. "message" es breve y directo: "Buscando balatas para Nissan Tsuru 2015..."
""" """