La API de Jarv1s está construida con FastAPI y proporciona endpoints RESTful para interactuar con el sistema de IA conversacional. Todos los endpoints están disponibles en http://localhost:8000 por defecto.
Actualmente, la API no requiere autenticación ya que está diseñada para uso local. En futuras versiones se implementará autenticación para acceso remoto.
Endpoint principal para la interacción conversacional completa.
URL: /interact
Método: POST
Content-Type: multipart/form-data
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
audio |
File | Sí | Archivo de audio en formato WebM, WAV, MP3 o M4A |
curl -X POST "http://localhost:8000/interact" \
-H "accept: application/json" \
-H "Content-Type: multipart/form-data" \
-F "audio=@recording.webm"Código: 200 OK
Content-Type: application/json
{
"transcription": "Hola, ¿cómo estás?",
"response": "¡Hola! Estoy muy bien, gracias por preguntar. ¿En qué puedo ayudarte hoy?",
"audio_base64": "UklGRiQAAABXQVZFZm10IBAAAAABAAEA...",
"processing_time": {
"stt": 1.23,
"llm": 0.87,
"tts": 0.45,
"total": 2.55
}
}| Campo | Tipo | Descripción |
|---|---|---|
transcription |
string | Texto transcrito del audio de entrada |
response |
string | Respuesta generada por el LLM |
audio_base64 |
string | Audio de respuesta codificado en base64 (formato WAV) |
processing_time |
object | Tiempos de procesamiento de cada componente |
400 Bad Request
{
"detail": "No audio file provided"
}415 Unsupported Media Type
{
"detail": "Unsupported audio format. Supported formats: webm, wav, mp3, m4a"
}500 Internal Server Error
{
"detail": "STT processing failed: [error details]"
}Endpoint para verificar el estado del sistema.
URL: /health
Método: GET
{
"status": "healthy",
"timestamp": "2025-01-16T10:30:00Z",
"services": {
"stt": "operational",
"llm": "operational",
"tts": "operational"
},
"models": {
"whisper": "small",
"tts_voice": "es_ES-sharvard-medium"
}
}Obtiene el historial de la conversación actual.
URL: /conversation/history
Método: GET
{
"history": [
{
"role": "user",
"content": "Hola, ¿cómo estás?",
"timestamp": "2025-01-16T10:25:00Z"
},
{
"role": "assistant",
"content": "¡Hola! Estoy muy bien, gracias por preguntar. ¿En qué puedo ayudarte hoy?",
"timestamp": "2025-01-16T10:25:02Z"
}
],
"message_count": 2
}Limpia el historial de conversación.
URL: /conversation/history
Método: DELETE
{
"message": "Conversation history cleared",
"cleared_messages": 4
}Transcribe audio a texto usando solo el servicio STT.
URL: /stt/transcribe
Método: POST
Content-Type: multipart/form-data
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
audio |
File | Sí | Archivo de audio |
{
"transcription": "Texto transcrito del audio",
"processing_time": 1.23,
"model_used": "small"
}Genera respuesta usando solo el servicio LLM.
URL: /llm/generate
Método: POST
Content-Type: application/json
{
"message": "Tu mensaje aquí",
"include_history": true
}{
"response": "Respuesta generada por el LLM",
"processing_time": 0.87,
"tokens_used": 45
}Sintetiza texto a audio usando solo el servicio TTS.
URL: /tts/synthesize
Método: POST
Content-Type: application/json
{
"text": "Texto a sintetizar",
"voice": "es_ES-sharvard-medium"
}{
"audio_base64": "UklGRiQAAABXQVZFZm10IBAAAAABAAEA...",
"processing_time": 0.45,
"audio_duration": 2.1
}Obtiene la configuración actual del sistema.
URL: /config
Método: GET
{
"llm": {
"api_base": "http://localhost:1234/v1",
"model_name": "openai/lmstudio-local-model"
},
"stt": {
"model": "small",
"language": "auto"
},
"tts": {
"voice": "es_ES-sharvard-medium",
"sample_rate": 22050
}
}Actualiza la configuración del sistema.
URL: /config
Método: POST
Content-Type: application/json
{
"llm": {
"model_name": "nuevo-modelo"
},
"stt": {
"model": "base"
}
}| Código | Descripción |
|---|---|
| 200 | Operación exitosa |
| 400 | Solicitud malformada o parámetros inválidos |
| 415 | Tipo de media no soportado |
| 422 | Error de validación de datos |
| 500 | Error interno del servidor |
| 503 | Servicio no disponible (modelo no cargado) |
- Tamaño máximo: 50MB
- Duración máxima: 10 minutos
- Formatos soportados: WebM, WAV, MP3, M4A
- Sample rate recomendado: 16kHz
- Requests por minuto: 60
- Requests concurrentes: 5
- STT processing: 30 segundos
- LLM generation: 60 segundos
- TTS synthesis: 15 segundos
// Enviar audio para interacción completa
const interactWithJarvis = async (audioBlob: Blob) => {
const formData = new FormData();
formData.append('audio', audioBlob);
try {
const response = await fetch('http://localhost:8000/interact', {
method: 'POST',
body: formData
});
const data = await response.json();
// Reproducir audio de respuesta
const audioData = atob(data.audio_base64);
const audioBlob = new Blob([audioData], { type: 'audio/wav' });
const audioUrl = URL.createObjectURL(audioBlob);
const audio = new Audio(audioUrl);
audio.play();
return data;
} catch (error) {
console.error('Error:', error);
}
};import requests
import base64
import io
from pydub import AudioSegment
from pydub.playback import play
def interact_with_jarvis(audio_file_path: str):
with open(audio_file_path, 'rb') as audio_file:
files = {'audio': audio_file}
response = requests.post('http://localhost:8000/interact', files=files)
if response.status_code == 200:
data = response.json()
# Decodificar y reproducir audio
audio_data = base64.b64decode(data['audio_base64'])
audio_segment = AudioSegment.from_wav(io.BytesIO(audio_data))
play(audio_segment)
return data
else:
print(f"Error: {response.status_code} - {response.text}")
# Uso
result = interact_with_jarvis('mi_grabacion.wav')
print(f"Transcripción: {result['transcription']}")
print(f"Respuesta: {result['response']}")# Interacción completa
curl -X POST "http://localhost:8000/interact" \
-H "accept: application/json" \
-H "Content-Type: multipart/form-data" \
-F "audio=@recording.webm" \
| jq '.'
# Solo transcripción
curl -X POST "http://localhost:8000/stt/transcribe" \
-H "accept: application/json" \
-H "Content-Type: multipart/form-data" \
-F "audio=@recording.webm" \
| jq '.transcription'
# Solo generación de texto
curl -X POST "http://localhost:8000/llm/generate" \
-H "accept: application/json" \
-H "Content-Type: application/json" \
-d '{"message": "Hola, ¿cómo estás?", "include_history": true}' \
| jq '.response'En futuras versiones se implementará una API WebSocket para streaming en tiempo real:
// Ejemplo futuro de WebSocket
const ws = new WebSocket('ws://localhost:8000/ws/stream');
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === 'transcription_partial') {
console.log('Transcripción parcial:', data.text);
}
};
// Enviar audio en chunks
const sendAudioChunk = (audioChunk: ArrayBuffer) => {
ws.send(audioChunk);
};