Saltar al contenido principal

Proveedores

Los proveedores son los servicios de IA que potencian cada etapa del pipeline de voz. VOCALS soporta proveedores intercambiables para tres tipos: STT (speech-to-text), LLM (modelo de lenguaje) y TTS (text-to-speech).

Cada configuracion de proveedor almacena una API key cifrada, el modelo seleccionado y configuraciones opcionales especificas del proveedor. Los agentes referencian IDs de proveedor para definir su pipeline.

Proveedores Disponibles

TipoNombreDescripcion
sttdeepgramDeepgram Nova STT en tiempo real
sttopenaiAPI de OpenAI Whisper STT
sttwhisperOpenAI Whisper (local) STT
sttelevenlabsElevenLabs STT
sttqwenAlibaba Qwen STT
sttfishFish Audio STT
llmopenaiModelos OpenAI GPT
llmclaudeModelos Anthropic Claude
llmgoogleModelos Google Gemini
llmkimiModelos Moonshot Kimi
ttsdeepgramDeepgram TTS
ttsopenaiOpenAI TTS
ttselevenlabsElevenLabs TTS
ttsqwenAlibaba Qwen TTS
ttsresembleResemble AI TTS
ttsfishFish Audio TTS
ttsgoogleGoogle Cloud TTS (Neural2/WaveNet, Chirp3-HD, Studio)
ttsgoogle_geminiGoogle Gemini TTS (Gemini API)
google y google_gemini son proveedores distintos

Apuntan a APIs de Google diferentes y no son intercambiables. google llama a Cloud Text-to-Speech y toma una API key de Cloud Text-to-Speech; google_gemini llama a la Gemini API y toma una API key de la Gemini API, que se factura por separado. Una clave de uno es rechazada por el otro. Consulta Integración de Proveedores para la comparación completa.

Modelos de Google Gemini TTS

google_gemini acepta uno de tres valores de model_id:

model_idNotas
gemini-2.5-flash-preview-ttsPredeterminado. Baja latencia y económico - el modelo a usar en telefonía.
gemini-2.5-pro-preview-ttsMayor calidad, orientado a salida tipo pódcast/audiolibro.
gemini-3.1-flash-tts-previewAjustado para narración expresiva.

Reproduce estos ids exactamente. Los modelos 2.5 terminan en -preview-tts mientras que el modelo 3.1 termina en -tts-preview; la inconsistencia es de Google, y un id "corregido" devuelve 404 en el momento de la síntesis. Los tres son modelos Preview y Google puede cambiar los ids cuando alcancen la versión estable.

La voz se define en el agente como un nombre preconstruido simple (por ejemplo Zephyr), no como un id completo con prefijo de locale, y google_gemini no toma ningún parámetro de idioma - el idioma hablado sigue al texto del agente.

Listar Proveedores

GET /providers

Devuelve todas las configuraciones de proveedores del tenant actual, ordenadas por tipo y nombre.

Respuesta

[
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"type": "stt",
"name": "deepgram",
"model_id": "nova-2",
"extra_config": null,
"is_active": true,
"created_at": "2026-01-15T10:30:00Z",
"updated_at": "2026-02-20T14:00:00Z"
}
]

Campos de Respuesta

CampoTipoDescripcion
iduuidID de configuracion del proveedor
typestringstt, llm, o tts
namestringNombre del proveedor (ej. deepgram, openai)
model_idstringIdentificador del modelo seleccionado
extra_configobject | nullConfiguracion especifica del proveedor
is_activebooleanSi el proveedor esta activo
created_atdatetimeMarca de tiempo de creacion
updated_atdatetimeMarca de tiempo de ultima actualizacion

La API key nunca se devuelve en las respuestas.

Obtener Proveedor

GET /providers/{provider_id}

Devuelve una configuracion de proveedor individual.

Respuesta

Mismo esquema que el elemento de la lista anterior.

Crear Proveedor

POST /providers

Cuerpo de la Solicitud

{
"type": "stt",
"name": "deepgram",
"api_key": "dg_live_abc123...",
"model_id": "nova-2",
"extra_config": { "language": "en" },
"is_active": true
}

Campos de la Solicitud

CampoTipoRequeridoPor defectoDescripcion
typestringSi--Tipo de proveedor: stt, llm, o tts
namestringSi--Nombre del proveedor (debe ser un proveedor registrado)
api_keystringSi--API key del proveedor (cifrada antes de almacenarse)
model_idstringSi--Identificador del modelo a usar
extra_configobjectNonullConfiguraciones especificas del proveedor
is_activebooleanNotrueSi el proveedor esta activo

Respuesta

201 Created -- Devuelve el objeto ProviderResponse.

Si el type no es stt, llm, o tts, la API devuelve 400. Si el name no es un proveedor registrado para el tipo dado, la API devuelve 400 con la lista de proveedores disponibles.

Predeterminado de Google Gemini: thinking_budget

Crear un proveedor LLM con name: "google" y sin thinking_budget en extra_config almacena "extra_config": { "thinking_budget": 0 }, lo que pide el menor razonamiento extendido que permita el modelo seleccionado: desactivado del todo en los modelos Gemini antiguos, y el nivel de razonamiento mas bajo en la generacion actual de Google, que no lo puede desactivar. El razonamiento anade segundos antes de que se pronuncie la primera palabra, y quien llama lo percibe como silencio. Envia tu propio thinking_budget en extra_config para mantener el razonamiento activo (por ejemplo { "thinking_budget": 1024 }); el valor que envies siempre se almacena tal cual.

Esto solo aplica a proveedores recien creados. Los proveedores existentes nunca se modifican, y PUT /providers/{provider_id} nunca anade el campo.

Actualizar Proveedor

PUT /providers/{provider_id}

Actualiza la API key, modelo, configuracion o estado activo de un proveedor. Solo incluye los campos que deseas cambiar.

Cuerpo de la Solicitud

{
"api_key": "new_key_here",
"model_id": "nova-2-general",
"is_active": true
}

Campos de la Solicitud

CampoTipoRequeridoDescripcion
api_keystringNoNueva API key (re-cifrada)
model_idstringNoNuevo identificador de modelo
extra_configobjectNoConfiguraciones especificas del proveedor actualizadas
is_activebooleanNoActivar o desactivar el proveedor

Respuesta

200 OK -- Devuelve el ProviderResponse actualizado.

Eliminar Proveedor

DELETE /providers/{provider_id}

Elimina permanentemente una configuracion de proveedor.

La eliminación se rechaza mientras algún agente siga referenciando el proveedor, de modo que ningún agente queda desvinculado como efecto colateral. Apunta esos agentes a otro proveedor o elimínalos primero, y vuelve a intentarlo.

Respuesta

204 No Content -- el proveedor se eliminó.

409 Conflict -- uno o más agentes todavía usan este proveedor. El cuerpo los nombra:

{
"detail": {
"error_code": "provider_in_use",
"message": "This provider is still used by Demo Restaurant, Reception Bot. Point those agents elsewhere or delete them, then try again.",
"agents": [
{ "id": "550e8400-e29b-41d4-a716-446655440000", "name": "Demo Restaurant" },
{ "id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8", "name": "Reception Bot" }
]
}
}
CampoTipoDescripción
error_codestringprovider_in_use
messagestringResumen legible, que nombra hasta cinco agentes
agentsarray[object]Todos los agentes que bloquean la eliminación, con id y name

403 Forbidden -- el proveedor es gestionado por VOCALS y no se puede eliminar aquí.

Listar Modelos Disponibles

GET /providers/{provider_id}/models

Obtiene la lista de modelos disponibles para un proveedor guardado usando su API key almacenada. Consulta la API del proveedor cuando es posible, o devuelve una lista predefinida para proveedores que no soportan la enumeracion de modelos.

Respuesta

{
"models": ["nova-2", "nova-2-general", "nova-2-meeting"],
"source": "api"
}
CampoTipoDescripcion
modelsarray[string]Identificadores de modelos disponibles
sourcestringapi (obtenido del proveedor), hardcoded (lista estatica), o error (fallo en la obtencion)

Para google_gemini esto devuelve los tres ids de modelo de Gemini TTS con el predeterminado primero y source: "hardcoded" - la lista es estática, por lo que no se hace ninguna llamada a Google.

Listar Voces de Google

GET /providers/{provider_id}/google-voices

Devuelve el catálogo estructurado de voces de Google Cloud TTS para un proveedor Google TTS guardado, usado para poblar el selector de voces del agente. Las voces Neural2/WaveNet/Chirp3-HD se obtienen en vivo del propio proyecto de Google Cloud del tenant (limitado a la API key almacenada). El proveedor debe ser un proveedor tts llamado google perteneciente al tenant actual.

Respuesta

{
"voices": [
{
"id": "en-US-Chirp3-HD-Charon",
"label": "Charon (Female)",
"tier": "chirp",
"language": "en-US",
"gender": "Female"
}
],
"source": "live"
}

Campos de la Respuesta

CampoTipoDescripcion
voicesarray[object]Entradas de voz para el selector
voices[].idstringIdentificador de voz completo a almacenar como el voice_id del agente
voices[].labelstringEtiqueta legible para mostrar
voices[].tierstringneural2, wavenet, o chirp
voices[].languagestringLocale BCP-47 (uno de los siete soportados: en-US, en-GB, es-ES, fr-FR, de-DE, pt-BR, it-IT)
voices[].genderstringMale, Female, Neutral, o vacío cuando no se especifica
sourcestringlive (obtenido de Google), cache (servido de una obtención reciente), o error (la obtención en vivo falló; voices viene vacío y el cliente debe recurrir a su propia lista estática)

Un source de error no es un fallo HTTP - el endpoint aún devuelve 200 con un array voices vacío para que el selector pueda degradarse con gracia a su propia lista estática. Las voces Studio nunca se devuelven (ya no son seleccionables para nuevas voces).

Devuelve 404 si el proveedor no se encuentra para el tenant o no es un proveedor Google Cloud TTS. Este endpoint es exclusivo de Cloud TTS: un proveedor google_gemini también devuelve 404, porque sus 30 voces preconstruidas son una lista fija definida por el modelo, sin catálogo por tenant que obtener.

Obtener Modelos (Ad-hoc)

POST /providers/models

Obtiene modelos disponibles sin guardar una configuracion de proveedor. Util para probar una API key antes de crear un proveedor.

Cuerpo de la Solicitud

{
"type": "stt",
"name": "deepgram",
"api_key": "dg_live_abc123..."
}

Respuesta

Mismo esquema ProviderModelsResponse que el anterior.

Probar Proveedor

POST /providers/{provider_id}/test

Valida que la API key y configuracion de un proveedor guardado funcionan correctamente. Llama al metodo validate() del proveedor.

Respuesta

{
"success": true,
"message": "Provider deepgram (stt) is working correctly."
}
CampoTipoDescripcion
successbooleanSi la validacion fue exitosa
messagestringMensaje de resultado legible

Devuelve 400 si la API key es invalida, o una respuesta con success: false si la validacion falla por otras razones.