Sari la conținut
megapromotingHai să discutăm
Produse Kallina

Agenți vocali AI Platformă

Una buena conversación continúa con una acción.

Construimos agentes que atienden y lanzan llamadas, usan la información del negocio y trabajan con tus sistemas. De la primera pregunta hasta una solicitud completa, una confirmación o el traspaso a un compañero.

AscultăVerificăAcționeazăVOCE + CONTEXT + ACȚIUNE
Cum funcționează Kallina

Kallina

De la información al trabajo hecho.

01

Ascultă

Entiende la petición en el contexto de la conversación y de las reglas del negocio.

02

Verifică

Consulta la base de conocimiento y las integraciones autorizadas antes de responder.

03

Acționează

Completa los datos, ejecuta la acción permitida o traspasa la conversación a una persona.

Dónde se vuelve útil.

Recepción y soporte

Preguntas frecuentes, recogida de solicitudes y devolución de llamada a quien ha pedido que le contacten.

Pedidos y entregas

Confirmaciones y coordinación, con la información del sistema de pedidos conectado.

Cualificación y citas

Reúne los detalles necesarios. El acceso al calendario y la reserva se acuerdan para cada integración.

Los escenarios, el número de teléfono, los idiomas y las acciones se configuran para cada implantación. El equipo mantiene la posibilidad de tomar la conversación.

Kallina en detalle

Qué puedes hacer con este proyecto.

Kallina es la plataforma sobre la que construimos agentes que hablan por teléfono y en la página web. Un agente tiene un papel escrito, una base de conocimiento aprobada, un conjunto de herramientas que puede llamar y un límite más allá del cual entrega la conversación a una persona. La conversación no se acaba en el transcript: la llamada tiene duración, coste por proveedor, grabación y análisis, todo ligado a la cuenta del negocio.

El motor de voz no es uno solo. En la configuración del agente eliges entre ElevenLabs Conversational AI, OpenAI Realtime, Gemini Live o «auto», en cuyo caso Kallina elige el proveedor según el idioma, la carga y la disponibilidad. Por encima eliges aparte el cerebro de texto — el catálogo del código tiene 78 entradas de OpenAI, Google, Anthropic, xAI y ElevenLabs, cada una con su latencia y su coste por minuto a la vista en la interfaz, para que la elección sea informada y no de oídas.

La telefonía es nuestra, no alquilada al proveedor de voz. Las llamadas pasan por un Asterisk propio, con enrutado por horario y zona horaria, horario nocturno (por ejemplo 22:00 → 06:00) y coincidencia por prioridad: la cabecera SIP Diversion, luego el número de Kallina, luego la regla de reserva. Para OpenAI Realtime hay un puente AudioSocket que convierte el códec en los dos sentidos, g711_ulaw ↔ PCM16.

01

Tres proveedores de voz más una posición «auto»

En `AGENT_PROVIDERS` hay cuatro opciones: `elevenlabs` (ConvAI), `openai-realtime`, `gemini-live` y `auto`. Para text-to-speech en idiomas distintos del inglés, por defecto está `eleven_flash_v2_5` — 32 idiomas, unos 75 ms de latencia; la alternativa de más calidad, `eleven_turbo_v2_5`, cuesta unos 250 ms. La elección no está escondida en el código: es un campo de la configuración del agente.

02

Catálogo de modelos con latencia y coste a la vista

78 modelos en `LLM_MODELS`, agrupados por proveedor en la interfaz junto con la latencia medida y el coste por minuto — desde `gpt-5-nano` con unos 806 ms y unos 0,0004 $/min, hasta `claude-sonnet-4-6` con unos 1,55 s y unos 0,0225 $/min. Un cliente que pregunta «por qué responde despacio» recibe una respuesta con cifras, no una opinión.

03

Telefonía propia sobre Asterisk

El desvío de llamadas se configura por horario de trabajo y zona horaria, con soporte para horario nocturno y coincidencia por prioridad (cabecera SIP Diversion → número de Kallina → regla de reserva). El puente `openai-realtime-bridge` hace la conversión AudioSocket entre g711_ulaw y PCM16 para el flujo de audio bidireccional.

04

Embed de voz en una sola línea, sin id de agente en la página

`<script src="https://app.kallina.info/embed.js" data-widget="WIDGET_ID"></script>`. La página nunca se entera de qué agente responde y no guarda ninguna clave de proveedor: le pide a Kallina una sesión, y Kallina devuelve una URL firmada de corta duración. También existe el modo `data-mode="inline"`, en el que el embed no dibuja absolutamente nada y la página se hace su propia interfaz sobre la API `start()` / `stop()` / `toggle()` / `on(event, fn)`.

05

Campañas de llamadas salientes

Llamada por lotes con 1–10 llamadas simultáneas, importación de contactos desde CSV, lógica de reintento, seguimiento en tiempo real con pausa, reanudación y parada, más seguimiento por SMS.

06

Limbi

La configuración del agente acepta 32 idiomas (`LANGUAGES`), el mapa completo de idiomas de la plataforma tiene 41 entradas y el panel de administración está traducido a 20 (`src/i18n/locales`). El rumano es el idioma por defecto en `DEFAULT_VALUES`.

Datos y funcionamiento

Qué entra en el sistema. Qué hay que comprobar.

Dónde están los datos
PostgreSQL a través de Supabase, con Row Level Security y pg_cron; 559 migraciones versionadas. La lógica de servidor son funciones edge de Deno — 472 en el repositorio en la fecha de la comprobación.
Qué no llega nunca a la página del cliente
La clave del proveedor de voz y el identificador del agente. El embed pide `POST /functions/v1/widget-voice-session` con `widget_id` — la clave pública de `chat_widget_configs.widget_id`, no el id interno de la fila — y el servidor pide él mismo a ElevenLabs una URL firmada, mediante `convai/conversation/get_signed_url`, y la devuelve. La variante antigua, que ponía `agentId` directamente en el HTML, se saltaba Kallina por completo.
La base de conocimiento
Documentos cargados en la plataforma, sincronizados con el RAG de ElevenLabs. Encima se ponen barreras de conversación, esquemas de recogida de datos y criterios de evaluación del éxito de la llamada, definidos por agente.
Consumo medido antes, no después
La tabla `usage_events` guarda el consumo desglosado por proveedor y por agente. Antes de cualquier acción que cueste, la función `check-can-use` comprueba el crédito — la puerta está delante de la llamada, no en la factura de fin de mes.

De la exploración a la implantación

Cómo preparamos un proyecto con Kallina.

01

Elegimos un solo recorrido y le escribimos los bordes

Un escenario con entrada clara y salida clara — llamada recibida en recepción, confirmación de pedido, campaña de llamadas. Escribimos de forma explícita qué no puede hacer el agente y por qué vía entrega la conversación a una persona.

02

Conectamos el número y comprobamos en los dos sentidos

El número entra por el trunk SIP de nuestro Asterisk. Las llamadas entrantes y las salientes se prueban por separado, porque se pueden romper por separado: una restricción del operador en las salientes deja las entrantes funcionando perfectamente.

03

Comprobamos el recorrido sin gastar minutos

`scripts/verify-voice-path.mjs` recorre exactamente el camino de un navegador — la fila de configuración, `get-widget-config`, luego `widget-voice-session` — y se detiene en la URL firmada, sin abrir el websocket. Se ejecuta sobre un solo widget o sobre todos los que tienen voz activa, con 1–3 en paralelo, y devuelve código de salida, así que puede entrar directamente en un cron.

Preguntas que merece la pena aclarar.

¿Qué motor de voz usa, en concreto?

Eliges entre ElevenLabs Conversational AI, OpenAI Realtime y Gemini Live, o dejas «auto» y decide Kallina según el idioma y la disponibilidad. Para la síntesis de voz en idiomas distintos del inglés, por defecto está el modelo `eleven_flash_v2_5` — 32 idiomas, en torno a 75 ms; si quieres más calidad y aceptas más retardo, `eleven_turbo_v2_5` está en torno a 250 ms. Las voces de OpenAI Realtime son diez, y su motor llega hasta `gpt-realtime-2.1`.

¿Cómo se pone en un sitio web?

Una línea: `<script src="https://app.kallina.info/embed.js" data-widget="WIDGET_ID"></script>`, cargada como script normal, no como módulo. El fichero se sirve hoy y ocupa 13.762 bytes. Si quieres tu propia interfaz, `data-mode="inline"` no dibuja nada y te deja `start()`, `stop()`, `toggle()` y los eventos `state`, `message`, `error`. Ojo con el host: el fichero está en `app.kallina.info`, no en `kallina.info` — son dos aplicaciones en dos servidores distintos.

¿Se gastan minutos si el visitante rechaza el micrófono?

No. El orden en `embed.js` es: cargar el SDK, pedir el micrófono con `getUserMedia({audio:true})` y solo después llamar a `widget-voice-session`. Si la persona rechaza el micrófono, la petición de sesión ya no se hace, así que no se emite ninguna URL firmada y no se gasta nada.

¿Puede llamar él primero, no solo contestar?

Sí — llamada por lotes, 1–10 simultáneas, contactos desde CSV, reintentos y seguimiento por SMS. Pero las llamadas salientes dependen del operador telefónico, no solo de nosotros: en nuestro registro de incidencias está documentado un caso en el que la centralita del operador empezó a devolver `403 Forbidden` en todas las salidas, con nuestra configuración sin tocar y con las llamadas entrantes funcionando con normalidad. Por eso probamos las salidas por separado antes de prometer una campaña.

¿En cuántos idiomas habla y en cuántos se administra?

La configuración del agente acepta 32 idiomas, el mapa interno de idiomas tiene 41 entradas y el panel de administración está traducido a 20. El rumano es el idioma por defecto de los agentes nuevos.

¿Se publica automáticamente en cada cambio de código?

No, y conviene saberlo antes de planificar un lanzamiento. El workflow de GitHub del repositorio apunta a un proyecto de Supabase Cloud que se ha borrado, así que «push a main = publicación» ya no es cierto desde la migración a infraestructura propia. La publicación real se hace por SSH, con copia y reinicio. Consecuencia práctica: un cambio urgente necesita una persona, no solo un commit.

¿Qué pasa si el agente no sabe la respuesta?

La entrega a una persona forma parte del escenario, no es una excepción. Cada agente tiene límites escritos y una vía de traspaso configurada en la telefonía; y en la conversación hay barreras y criterios de evaluación del éxito, precisamente para que un caso fuera de su papel se detenga y no se improvise.

Ejemplo ilustrativo

Una llamada recibida de noche, que llega donde tiene que llegar

Un escenario de uso, sin datos de cliente ni resultados comerciales atribuidos.

La situación de partida

Alguien llama al número del negocio a las 23:40, fuera del horario de recepción.

Cómo trabaja

Asterisk aplica la regla de horario nocturno (por ejemplo 22:00 → 06:00) y hace la coincidencia por prioridad: la cabecera SIP Diversion, luego el número de Kallina, luego la regla de reserva. El agente de noche contesta con el proveedor elegido en la configuración, aclara la petición y llama a las herramientas que tiene permitido usar.

Rezultatul

La llamada queda en el historial con transcript, grabación de audio, duración y coste desglosado por proveedor. Lo que supera el papel del agente se detiene y se traspasa, en lugar de improvisarse.

Ce este necesar:Numărul conectat pe trunkul SIP al Asterisk-ului nostru, apelurile ieșite permise de operator dacă se dorește și sunat înapoi, plus un agent cu prompt, bază de cunoștințe aprobată și limite scrise.

Posibilidades de colaboración

Kallina, en el contexto de tu organización.

Información y recogida de solicitudes

Asistencia de voz sobre información aprobada, con paso a un operador y reglas claras sobre la grabación y la conservación de las conversaciones.

Empresas privadas

Definimos un piloto alrededor de un proceso real: usuarios, datos, integraciones, costes y criterios de aceptación. La ampliación viene después de evaluar el resultado.

Instituciones y empresas públicas

Fijamos los requisitos de accesibilidad, alojamiento, protección de datos e interoperabilidad. Cualquier conexión con los servicios de la Agencia de Gobernanza Electrónica de Moldavia (AGE) o del servicio nacional de tecnologías de la información (STISC) exige validar la elegibilidad, el acceso y las aprobaciones.

Estos son escenarios de adaptación, no declaraciones sobre contratos o alianzas existentes. Las funciones propuestas se confirman dentro del alcance de trabajo del proyecto.

Discută un pilot

Parte de un ecosistema.

¿Qué te gustaría que funcionara mejor?

Cuéntanos tu proceso. Juntos decidimos qué merece la pena construir, qué podemos conectar y cómo verificamos el resultado.

Hai să discutăm