← Volver al menú
Toyota · Prueba de Concepto

Arquitectura de la solución

De la voz del cliente a la respuesta del agente, en ~3 segundos. Stack 100% managed en ElevenAgents + Cloudflare Workers.

1. Flujo end-to-end

Todo el procesamiento de voz vive en ElevenAgents. Los tools (verde) llaman al backend propio hosteado en Cloudflare Workers. Las consultas a documentos (azul) usan el RAG nativo de ElevenLabs con embeddings multilingual.

flowchart TD
    Cliente["🧑 Cliente
voz · es-AR / pt-BR"] Widget["🌐 Widget web
Cloudflare Pages"] EL["🤖 ElevenAgents
servidor US"] ASR["📝 Scribe v2
Realtime ASR"] LLM["🧠 Gemini 3 Flash
+ cascade 2.0/2.5 · Haiku 4.5"] TTS["🔊 Flash v2.5 · es-AR
V3 Conversational · pt-BR"] Worker["⚡ Cloudflare Worker
poc-toyota-tools"] Data[("💾 JSONs bundleados
Salesforce · TPA · Kinto")] KB[("📚 Knowledge Base
multilingual e5-large")] Cliente <--> Widget Widget <--> EL EL --> ASR ASR --> LLM LLM --> TTS TTS --> EL LLM -.->|tool call
<200 ms| Worker Worker --> Data LLM -.->|RAG retrieval| KB classDef voice fill:#fce8ea,stroke:#EB0A1E,color:#000 classDef agent fill:#e4f0ff,stroke:#0b5ed7,color:#000 classDef tool fill:#e9f7e9,stroke:#22803b,color:#000 classDef data fill:#fff8e1,stroke:#b36b0a,color:#000 class Cliente,Widget,ASR,TTS voice class EL,LLM agent class Worker tool class Data,KB data

2. Métricas de latencia medidas

Números medidos en conversaciones reales del PoC (ES-AR y PT-BR). Worker en Cloudflare edge. LLM primary: gemini-3-flash-preview con cascade a gemini-2.0-flashgemini-2.5-flashclaude-haiku-4-5 (cascade timeout 5 s). TTS eleven_flash_v2_5 en es-AR · eleven_v3_conversational en pt-BR.

~75 ms
TTS TTFB (primera palabra)
100–400 ms
Tool call (Worker)
1.5–3 s
Turn response simple
(sin tool)
3–5 s
Turn response con tool
(user fin → agente habla)
< 300 ms
Barge-in (interrupción)
12 s
Turn timeout

Dónde se va el tiempo en un turn con tool: ASR (~200–400 ms) + LLM generation (~2–4 s) + tool execution (~150 ms) + TTS TTFB (~75 ms). El LLM domina el presupuesto — optimizaciones futuras apuntan ahí (prompt más corto, modelo más rápido, o RAG para reducir contexto).

Golpea los 5 endpoints del Worker con payload válido y mide status + latencia round-trip.

3. Mapa de agentes y sus backends

2 agentes consumen RAG puro, 2 combinan RAG + API, 3 son transaccionales (API pura). 7 endpoints expuestos.

#AgenteFuente de datosEndpoint / KB
1TASA Service 90kRAGService_Plan_ARG.md
2TASA Kinto RentalAPI/tools/kinto/availability
3TASA TPA VoucherAPI · 2/tools/tpa/account + send_voucher
4TDB Warranty T10RAGAPIWarranty_TOYOTA10.md + /tools/warranty/by_vin
5TDB Case StatusAPI/tools/salesforce/case_status
6TASA ConnectedRAGAPIConnected_Services_ARG.md + /tools/connected/lookup_vehicle_by_plate
7TDB Manual LexusRAG grandePDF UX300h MY25 · 500+ págs

4. Flujo detallado de un agente transaccional

Ejemplo del agente más complejo del PoC — TPA Voucher — con 2 tools encadenadas y lógica de branching según situación del plan.

sequenceDiagram
    participant C as Cliente
    participant E as ElevenAgents
    participant W as CF Worker
    participant D as Data JSON

    C->>E: "Necesito cupón, DNI 24916694"
    E->>W: POST /tools/tpa/account
{ dni: "24916694" } W->>D: lookup D-->>W: Gabriel Romay · NORMAL-PRENDARIO · Yaris W-->>E: { recomendacion: "emitir_cupon", email } alt recomendacion = emitir_cupon E->>C: "Confirme email XXXX@PRUEBA.COM.AR" C->>E: "Sí, correcto" E->>W: POST /tools/tpa/send_voucher
{ grupo, orden, email } W-->>E: { sent: true } E->>C: "Cupón enviado. Medios: PMC, Link, Mercado Pago..." else recomendacion = derivar_autogestion E->>C: "Cuenta con 4+ cuotas en mora. Use Portal de Autogestión..." else recomendacion = derivar_humano E->>C: "Cuenta en situación CANCELADOS. Le transfiero a un operador." end

5. Stack tecnológico

ElevenLabs Agents (managed)

  • ASR: Scribe v2 Realtime (quality high, keywords por agente)
  • LLM primary: gemini-3-flash-preview · temp 0.3 · max 400 tokens · thinking 0
  • LLM backup: cascade a gemini-2.0-flashgemini-2.5-flashclaude-haiku-4-5 · cascade timeout 5 s
  • TTS es-AR: eleven_flash_v2_5 + voz Melanie · speed 1.1 · stability 0.5
  • TTS pt-BR: eleven_v3_conversational + voz Fernanda
  • Pronunciation dict (TASA): SW4, RAV4, C-HR, VW, AT→"transmisión automática", MT→"manual"
  • Text normalization: ElevenLabs native · optimize_streaming_latency=3
  • Turn handling: eager + speculative_turn ON en los 7 agentes

Backend (self-hosted)

  • Runtime: Cloudflare Workers (edge global · V8 isolates)
  • Framework: Hono 4
  • Lenguaje: TypeScript
  • Data: JSONs bundleados in-memory (~1.4 MB)
  • Auth: header X-PoC-Token en tools · rutas públicas /, /health, /warmup
  • Validaciones: regex de patente AR en connected/lookup_vehicle_by_plate
  • Warmup: GET /warmup despacha in-process los 5 tools con payload válido
  • Bundle: 1.6 MB raw · 290 KB gzip

Knowledge Base (RAG)

  • Embedding: intfloat/multilingual-e5-large-instruct
  • Chunks retrieved: 6 · max chars 20.000
  • Distance threshold: 0.4 (estricto)
  • Docs indexados: 3 MD + 1 PDF (Lexus UX300h)

Frontend (demo)

  • Hosting: Cloudflare Pages
  • Dominio: poc-toyota-demo.pages.dev
  • Widget: embed oficial @elevenlabs/convai-widget-embed
  • Páginas: 1 dashboard + 7 agentes + arquitectura

6. Flujo de datos (ingesta → runtime)

flowchart LR
    subgraph Ingesta["📥 Ingesta (offline)"]
        XLS[".xlsx
Salesforce"] CSV[".csv"] PDF[".pdf
Manual Lexus"] DOC[".docx
Scripts"] end subgraph Procesamiento["🔧 Procesamiento"] PY["Python
openpyxl + csv"] MD["Markdown
normalizado"] JSON["JSON
slim"] end subgraph Runtime["🚀 Runtime"] KB["ElevenLabs KB
Multilingual"] WRKR["Worker
bundleado"] end XLS --> PY --> JSON --> WRKR CSV --> PY PDF --> KB DOC --> MD --> KB

7. Decisiones clave de arquitectura