last_delivery: reusar dirección/zona del último pedido + retitular header

Persistencia: cuando confirm_order encola create_order y la orden tiene
shipping/zona/window, runTurn snapshot a context.last_delivery
{is_delivery, shipping_address, matched_zone, pending_location, delivery_window}.
pipeline preserva ese campo cuando resetea por stale (>24h), igual que
external_customer_id.

Agente lo ve via working_memory.last_delivery en cada turno.

Nueva tool reuse_last_delivery() que copia shipping_address + matched_zone
(+ pending_location) al order actual. Pickup-only sólo setea is_delivery=false.

systemPrompt: instrucciones para que el bot proactivamente ofrezca "te lo
mandamos al mismo lugar que la última vez (dirección, zona, $)" cuando
last_delivery existe y todavía no se eligió método de envío. Cliente puede
aceptar (reuse_last_delivery) o pedir otra dirección/retiro. delivery_window
NO se asume — siempre se vuelve a preguntar día/hora.

Smoke E2E: cliente recurrente con conversación stale 25h+
- 1ra orden: 1kg vacío → location → mar 12h → confirma.
- DB: context.last_delivery con zona Centro Test + dirección + ventana.
- 2da orden: "hola, 500g bondiola" → bot: "¿al mismo lugar (Av. Corrientes
  1234, Centro, $1.500)?" → "sí" → "¿qué día? La última fue mar 12h, puede
  ser otro" → "jueves 11hs" → orden cerrada sin re-pedir pin.

Header: "Bot Ops Console" → "Piaf Console" (index.html + ops-shell).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Lucas Tettamanti
2026-05-02 17:33:58 -03:00
parent 3c70eb5ff7
commit 448b3d7c44
9 changed files with 111 additions and 4 deletions

View File

@@ -90,6 +90,21 @@ ENVÍO Y ZONAS:
time_out_of_range, ofrecé las opciones que sí están disponibles según la zona
o el schedule.
CLIENTES QUE VUELVEN (last_delivery):
- Si working_memory.last_delivery existe (no null), el cliente ya hizo un pedido
antes y tenemos guardado: shipping_address, matched_zone, delivery_window.
- Cuando el cliente está armando un pedido nuevo y todavía no eligió método de
envío ni dio dirección, ofrecele proactivamente la opción de repetir:
"¿Te lo mandamos al mismo lugar que la última vez (Av. Corrientes 1234,
zona Centro, $1.500)? También podés pedirme otra dirección o retiro."
- Si confirma ("sí", "dale", "el mismo lugar", "como siempre"), llamá
reuse_last_delivery — copia dirección + zona y se salta el pedido del pin.
Después confirmá el día/horario (puede ser distinto al de la última).
- Si dice que no, o pide otro lugar, seguí el flujo normal (set_shipping →
pedir pin → set_address → set_delivery_window).
- last_delivery.delivery_window es sólo referencia, NO lo asumas como elegido
para esta orden. Preguntá día/hora aunque vayas a reutilizar el lugar.
LIMITES TÉCNICOS:
- Tenés un máximo de 10 tool calls por turno. No los gastes en búsquedas
redundantes — si una query ya devolvió X candidatos, NO la repitas.