UGAssistant es un asistente multimodal local para Windows y Raspberry Pi 5. Procesa voz, imagen y texto en el propio equipo: no requiere suscripciones ni envia contenido de la conversacion a servicios de IA en la nube.
Estado: desarrollo activo. Windows es el entorno de desarrollo y Raspberry Pi 5 el objetivo de despliegue, con el mismo nucleo y modelos bloqueados.
La aplicacion incluye:
- Backend Python con FastAPI y WebSockets.
- Interfaz HTML, CSS y JavaScript para 1024 x 600.
- Maquina de estados independiente y probada.
- Avatar con expresiones de reposo, presencia, escucha, pensamiento, habla, error, aburrimiento y sueno.
- Mirada controlada por el raton y por la posicion del rostro.
- Captura de camara OpenCV a un maximo de 640 x 480, con perfil adaptativo de 1 a 5 FPS para Raspberry Pi.
- Deteccion facial local con el YuNet bloqueado.
- Deteccion local de hasta dos manos con 21 puntos por mano.
- Recuento de 0 a 5 dedos por mano y total estable de 0 a 10.
- Deteccion, seleccion y monitorizacion local de microfonos mediante PortAudio.
- Deteccion de actividad de sonido con nivel RMS, histeresis y estado
LISTENING. - Reconocimiento local con whisper.cpp y el modelo multilingue bloqueado
ggml-base.bin, limitado por la aplicacion a castellano y frances. - Flujo manual de prueba: escucha, cierre por silencio, transcripcion, seleccion automatica de idioma/voz y repeticion de la frase reconocida.
- Turno por palabra de activacion local:
holainicia el turno en espanol ysalutlo inicia en frances; despues escucha la pregunta y la procesa localmente. - LLM local mediante Ollama y el modelo bloqueado
gemma3:4b, con historial limitado, una unica inferencia pesada simultanea y eleccion verbal entre respuesta corta o completa antes de cada consulta. - Sintesis de texto local con Piper y las voces bloqueadas
es_ES-davefx-mediumyfr_FR-tom-medium. - Reproduccion por el altavoz seleccionado, volumen y velocidad configurables, sincronizacion labial por RMS y fragmentacion de respuestas extensas preparada en paralelo para evitar pausas artificiales entre partes.
- Paneo estereo suave segun la posicion horizontal del rostro detectado.
- Gestos geometricos: puno, palma, senalar, pulgar arriba/abajo y victoria.
- El avatar sonrie con pulgar arriba y muestra tristeza con lagrimas con pulgar abajo.
- Selector de camaras instaladas y opcion
Ninguna. - Enumeracion por backend OpenCV para conservar la correspondencia nombre-indice.
- Vista previa MJPEG local que no guarda fotogramas.
- Adaptadores simulados para pruebas sin hardware.
La pantalla principal esta pensada para 1024 x 600: muestra la palabra de activacion, hora y fecha junto al avatar. Durante una interaccion aparece un panel de lectura con la pregunta y la respuesta. Tras cada respuesta, el asistente permite pedir una aclaracion manteniendo el contexto local de la sesion; puede terminarse por silencio, una respuesta negativa o pulgar abajo.
El modal de configuracion concentra dispositivos, volumen, velocidad de voz, voces, palabras de activacion en castellano y frances, diagnosticos de camara y audio, y el cierre ordenado del sistema.
Los temporizadores activos aparecen encima del avatar y se ordenan por el que termina antes. Sus etiquetas conservan el orden de creacion: por ejemplo, si termina el temporizador 2 y siguen activos el 1 y el 3, el siguiente sera el 4. Cuando no queda ninguno, la siguiente cuenta vuelve a ser el temporizador 1.
Los runtimes de Piper y whisper.cpp, las voces TTS en castellano y frances y
ggml-base.bin ya estan instalados para desarrollo en Windows. Ollama y
gemma3:4b se instala deliberadamente mediante un paso explicito.
El proyecto toma como referencia la experiencia de BillAI Bass, sustituyendo el pez y los componentes mecanicos por el avatar de pantalla. La arquitectura no usa Strands, Bedrock ni otros servicios remotos: vision, voz y el futuro LLM se ejecutan localmente y sin suscripciones.
Abre PowerShell en el proyecto. Si la ejecucion de scripts esta bloqueada, habilitala solo para la ventana actual:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy BypassPrepara o actualiza el entorno:
.\scripts\setup_windows.ps1Descarga o verifica de forma explicita los modelos de vision bloqueados:
.\.venv\Scripts\python.exe scripts\download_models.py --model face_detection
.\.venv\Scripts\python.exe scripts\download_models.py --model palm_detection
.\.venv\Scripts\python.exe scripts\download_models.py --model hand_poseInstala el runtime bloqueado de Piper y descarga explicitamente las voces bloqueadas. DaveFX sigue siendo la voz predeterminada establecida en AGENTS.md; Tom es la voz francesa masculina solicitada y no sustituye a DaveFX:
.\.venv\Scripts\python.exe scripts\install_piper.py
.\.venv\Scripts\python.exe scripts\download_models.py --model tts
.\.venv\Scripts\python.exe scripts\download_models.py --model tts_config
.\.venv\Scripts\python.exe scripts\download_models.py --model tts_fr
.\.venv\Scripts\python.exe scripts\download_models.py --model tts_fr_configLos scripts verifican plataforma, tamano y SHA-256. No sustituyen la voz ni descargan el LLM automaticamente.
Instala Ollama y descarga explicitamente el unico LLM bloqueado:
winget install --id Ollama.Ollama --exact
.\.venv\Scripts\python.exe scripts\download_models.py --model llmOllama descarga el modelo una vez desde su registro y lo sirve despues por la
API local 127.0.0.1:11434; UGAssistant no usa una API de IA externa durante
el funcionamiento.
La seccion Actualizaciones de Configuracion ejecuta una unica revision
ordenada. Primero consulta origin/main y aplica git pull --ff-only cuando
existe un avance lineal. El repositorio debe estar limpio y los historiales
divergentes no se modifican. A continuacion comprueba Gemma, STT, TTS y vision
contra sus fuentes oficiales aprobadas.
Los candidatos de modelos se descargan temporalmente, se activan de forma atomica y se prueban en el equipo local: Whisper y Piper procesan frases de prueba en castellano y frances, OpenCV carga los modelos de vision y Gemma realiza una generacion minima. Ante cualquier fallo se restaura el ultimo conjunto funcional y su bloqueo. La interfaz muestra las revisiones instalada y disponible de cada componente y un estado compacto. Si se actualiza el software, reinicia UGAssistant al finalizar para cargar el nuevo codigo.
La operacion no modifica dependencias, preferencias ni datos de usuario.
Acceso movil crea una credencial persistente por dispositivo y un QR de
emparejamiento. Las credenciales se guardan como hashes revocables en
data/mobile_access.sqlite3; el telefono conserva su credencial solo en el
almacenamiento local del navegador. No se guardan audio ni conversaciones. El
asistente inicia un segundo servidor HTTPS local en el puerto 8443 despues
de reiniciarse. En Configuracion, genera el QR, reinicia UGAssistant y abrelo
desde el telefono conectado a la misma red Wi-Fi. La primera conexion desde
Android puede requerir aceptar el certificado local generado por UGAssistant.
El navegador solicita el permiso de microfono al pulsar Hablar, muestra los
dispositivos de entrada/salida que expone Android y reproduce Piper mediante
la salida predeterminada del telefono. Revocar un dispositivo invalida su
credencial inmediatamente y retira su registro de la lista.
La respuesta corta usa gemma3:4b con 2.048 tokens de contexto, hasta tres
frases y 384 tokens de salida para conservar una interaccion agil. La respuesta
completa anuncia que necesitara algo mas de tiempo y usa 4.096 tokens de
contexto con hasta 2.048 tokens de salida. Gemma no usa un modo de razonamiento
oculto en UGAssistant: el estado visual de pensamiento representa la inferencia
local, no una garantia de exactitud factual.
Los dos perfiles usan temperatura 0.2 y penalizacion de repeticion 1.08.
El prompt pide omitir los detalles inciertos antes que rellenarlos e impide
presentar una respuesta como autentica, tradicional, correcta, segura u oficial
sin poder sostenerlo. Esto reduce alucinaciones, pero un modelo local no puede
verificar hechos actuales ni sustituir fuentes especializadas.
La aplicacion ya no recorta el texto final por numero de caracteres. El limite
de salida de 2.048 tokens del perfil completo es una proteccion tecnica de
memoria y tiempo en Raspberry Pi; el modelo debe cerrar la respuesta de forma
natural. Puede ajustarse en config/app.yaml si el hardware final lo permite.
Instala el runtime bloqueado de whisper.cpp y descarga explicitamente el modelo STT multilingue bloqueado:
.\.venv\Scripts\python.exe scripts\install_whisper.py
.\.venv\Scripts\python.exe scripts\download_models.py --model stt
.\.venv\Scripts\python.exe scripts\check_stt.py --language es
.\.venv\Scripts\python.exe scripts\check_stt.py --language frComprueba que la camara configurada abre un fotograma:
.\.venv\Scripts\python.exe scripts\check_camera.pyEnumera microfonos y altavoces sin abrirlos:
.\.venv\Scripts\python.exe scripts\check_audio.pyGenera el ejecutable local de Windows (solo necesita hacerse tras cambios en el lanzador):
.\scripts\build_windows_launcher.ps1 -InstallBuildToolInicia UGAssistant desde el ejecutable UGAssistant.exe, que arranca el
backend local y abre el asistente en el navegador:
.\UGAssistant.exeTambien puedes usar .\scripts\run_windows.ps1, que usa el ejecutable cuando
existe. Dentro de Configuracion, el boton Cerrar sistema apaga el backend de
forma ordenada; el ejecutable espera ese cierre y termina tambien. Si ya hay
un servidor local iniciado manualmente, el ejecutable abre el navegador sin
tomar control de ese proceso.
La vista de desarrollo de vision esta disponible en
http://127.0.0.1:8000/debug/camera. Reutiliza la captura y la inferencia del
servicio principal; no abre la webcam ni ejecuta inferencias una segunda vez.
La vista de desarrollo de audio esta disponible en
http://127.0.0.1:8000/debug/audio. Muestra el nivel RMS, el umbral, el
historial reciente, los dispositivos seleccionados, el paneo y el estado del
asistente. Tambien permite elegir la voz instalada, escribir una frase y
reproducirla con Piper. Reconocer voz abre el microfono seleccionado, espera
una frase, termina tras 1,5 segundos de silencio, transcribe en castellano o
frances y reproduce el texto con DaveFX o Tom. El boton permite cancelar el
proceso mientras esta activo. Reutiliza los servicios principales y no abre un
segundo flujo de audio.
Con microfono y altavoz activos, el modo normal queda esperando hola o
salut. Tras reconocerlos, saluda en espanol o frances, espera una segunda
frase y pregunta si se desea una respuesta corta o completa antes de enviar
la consulta a gemma3:4b por la API local de Ollama. Si se elige una
respuesta completa, antes anuncia que tardara un poco mas. La respuesta se
reproduce con DaveFX o Tom segun el idioma transcrito. Si la
primera frase no contiene una de esas palabras, se descarta. Cada captura se
cierra tras dos segundos de silencio y vuelve a reposo si no hay activacion o
pregunta. El breve bufer necesario para no cortar la activacion permanece solo
en memoria y se borra despues de cada intento.
Para usar temporizadores di hola, temporizador. El asistente pregunta De cuanto tiempo?; por ejemplo, de 10 minutos, y confirma que empieza de
inmediato. Tambien se acepta hola, temporizador de 10 minutos. Al terminar,
se reproduce una alarma local de despertador de dos segundos, generada sin
archivos externos, y se anuncia el temporizador
finalizado. Un temporizador no bloquea preguntas, musica ni el resto del modo
de voz. Para cambiar o cancelar uno se puede decir hola, quiero modificar el temporizador o hola, cancelar temporizador; si hay varios activos, el
asistente pide el numero correspondiente. Los temporizadores son efimeros y se
cancelan al cerrar el proceso de UGAssistant.
Si la deteccion global de Whisper devuelve otro idioma, UGAssistant compara secuencialmente las transcripciones forzadas a castellano y frances. En frases intrinsecamente ambiguas, como una lista de numeros que se convierte solo en digitos, el idioma de la voz seleccionada sirve como desempate. No se ejecutan dos inferencias pesadas al mismo tiempo.
La pantalla principal agrupa la configuracion de camara, microfono, altavoces, idioma y voz en el boton de engranaje. Es posible elegir entre espanol/DaveFX y frances/Tom. Cada dispositivo y la voz conservan su seleccion, incluso al cerrar el modal y reiniciar el servidor.
Las preferencias locales se guardan en data/preferences.yaml mediante una
escritura atomica. Incluyen camara, microfono, altavoz, estados activo/inactivo,
volumen, velocidad, voz e idioma. Los dispositivos se restauran por nombre y backend, no
solo por el indice variable de Windows o ALSA. Si el dispositivo guardado no
esta conectado, UGAssistant selecciona ninguno en vez de cambiar a otro. El
archivo es local, no contiene audio o video y no se envia fuera del equipo.
La aplicacion enumera entradas y salidas con sounddevice y PortAudio. En
Windows prioriza WASAPI y en Raspberry Pi OS prioriza ALSA, evitando que el
mismo dispositivo aparezca repetido por varios backends. Cada dispositivo
informa de su indice real, canales, frecuencia predeterminada, backend y si es
el endpoint predeterminado.
Los selectores Micro y Altavoz permiten conservar una seleccion durante la
sesion o elegir Sin microfono/Sin altavoz. El boton Activar micro abre una
entrada mono, calcula el nivel RMS por bloques de 50 ms y descarta cada bloque
inmediatamente. Cuando el nivel supera el umbral estable, la maquina cambia a
LISTENING; tras el periodo de silencio vuelve a PERSON_DETECTED o IDLE.
La API equivalente es:
GET /api/audio/devicesGET /api/audioPOST /api/audio/select/input/{indice}POST /api/audio/select/output/{indice}POST /api/audio/enablePOST /api/audio/disablePOST /api/audio/output/enablePOST /api/audio/output/disablePOST /api/audio/output/volume/{porcentaje}WS /ws/audioGET /api/ttsPOST /api/tts/select/{voice_id}POST /api/tts/speed/{porcentaje}POST /api/tts/language/{idioma}POST /api/tts/speakcon JSON{"text": "Hola"}WS /ws/ttsGET /api/sttPOST /api/stt/recognizePOST /api/stt/cancelWS /ws/sttGET /api/llmPOST /api/llm/askcon JSON{"text": "Hola", "language": "es"}WS /ws/llmGET /api/assistantWS /ws/assistantGET /api/preferences
Usa -1 como indice para seleccionar ninguno. La monitorizacion ordinaria
descarta cada bloque de entrada inmediatamente. El reconocimiento mantiene la
frase solo en memoria y whisper.cpp elimina su WAV temporal al terminar. Los
umbrales, volumen y paneo se ajustan en audio; los tiempos de espera y silencio
del reconocimiento se ajustan en stt, dentro de config/app.yaml.
Al comenzar cada frase, el servicio toma la ultima coordenada horizontal del rostro. El centro se reproduce equilibrado; hacia la izquierda o derecha reduce suavemente el canal opuesto sin silenciarlo. El valor se congela durante esa frase para evitar saltos por fluctuaciones de deteccion. Sin rostro o con la camara apagada, la salida queda centrada.
Windows entrega el PCM original de Piper al mezclador WASAPI. En Linux/ALSA, si la salida necesita 48 kHz, UGAssistant utiliza remuestreo Lanczos por bloques con NumPy, ya incluido por OpenCV, y no requiere otra dependencia.
La camara empieza apagada. El menu superior enumera los dispositivos disponibles:
- Seleccionar una camara la abre y activa la deteccion.
Ningunacierra el dispositivo y descarta el ultimo fotograma.- El boton
Camarapermite pausar o reanudar el dispositivo seleccionado. - Si hay un rostro, el estado cambia a
PERSON_DETECTEDy las pupilas siguen su centro. - Las manos detectadas muestran sus 21 puntos y el gesto reconocido en la vista de desarrollo.
- Los fotogramas solo se mantienen en memoria y no se escriben en disco.
La deteccion usa los modelos MP-PalmDet y MP-HandPose de OpenCV Zoo mediante
OpenCV DNN sobre CPU. No depende del paquete mediapipe, lo que mantiene la
misma ruta de ejecucion en Windows x64 y Linux ARM64.
La cara y las manos comparten el mismo fotograma de la webcam. Para priorizar la voz en Raspberry Pi, el perfil es adaptativo: reposo a 1 FPS, rostro presente a 2 FPS y gestos a 5 FPS mientras escucha, habla o reproduce musica. Durante transcripcion y razonamiento se conserva la captura a 1 FPS, pero se suspenden YuNet y HandPose para que Whisper y Ollama tengan prioridad. Las manos se ejecutan cada tres fotogramas cuando el perfil las necesita y se limita la salida a dos manos.
Los gestos se clasifican a partir de la geometria de los 21 puntos, sin un
modelo adicional. Se reconocen CLOSED_FIST, OPEN_PALM, POINTING,
THUMB_UP, THUMB_DOWN y VICTORY; las poses ambiguas se informan como
UNKNOWN.
La vista de desarrollo muestra el recuento de cada mano y un total de 0 a 10.
El total se publica tras dos inferencias de mano consecutivas con el mismo
resultado para evitar parpadeos: 0 representa un puno cerrado y -- indica
que no hay una mano detectada. El dato se expone tambien como finger_count
en la API y el WebSocket de camara; no altera la expresion del avatar.
YuNet aporta ademas cinco puntos normalizados: ambos ojos, punta de la nariz y
las dos comisuras de la boca. Combinados con los puntos de la mano permiten
detectar BOTH_HANDS_OVER_EYES, POINTING_AT_NOSE, POINTING_AT_MOUTH,
HAND_OVER_MOUTH,
OPEN_PALM_NEAR_FACE, VICTORY_NEAR_FACE, THUMB_UP_NEAR_FACE y
THUMB_DOWN_NEAR_FACE. Son reglas espaciales deliberadas; no se infieren
emociones ni identidad.
POINTING_AT_MOUTH muestra la cremallera en el avatar y detiene una lectura
en curso de forma local.
La frecuencia se puede ajustar en config/app.yaml. Los valores de serie son
conservadores para Raspberry Pi 5 y tambien funcionan en Windows:
hands:
enabled: true
inference_interval_frames: 3
finger_count_stable_samples: 2
max_hands: 2El indice inicial se configura en config/app.yaml:
camera:
device_index: 0
enabled_by_default: false
preview_fps: 8
activity_fps:
idle: 1
person_detected: 2
processing: 1
gesture: 5La imagen MJPEG y sus anotaciones solo se codifican mientras esta abierta
/debug/camera; el frontal normal no consume esa CPU. El perfil debug usa
5 FPS con rostro y manos para conservar la utilidad de la vista de desarrollo.
Para probar otro indice desde la terminal:
.\.venv\Scripts\python.exe scripts\check_camera.py --device-index 1Al mover el raton, las pupilas siguen el cursor y la cara muestra curiosidad. Cuando no hay interaccion ni un rostro presente, el avatar pasa por este ciclo aproximado:
- Tras 35 segundos muestra aburrimiento.
- Tras 47 segundos entra en
SLEEPINGy muestrazZz. - Cerca del minuto despierta y vuelve a
IDLE.
Cualquier movimiento, clic, tecla o rostro detectado reinicia el ciclo.
Durante TRANSCRIBING, el avatar conserva el estado real en la interfaz y usa
la misma expresion y animacion visual que durante THINKING.
La dependencia esta fijada a opencv-python-headless==4.13.0.92. PyPI proporciona una rueda manylinux2014_aarch64, por lo que el script impide compilar OpenCV desde fuentes accidentalmente.
En Raspberry Pi OS de 64 bits:
cd ~/UGAssistant
chmod +x scripts/setup_raspberry.sh scripts/run_raspberry.sh
./scripts/setup_raspberry.sh
.venv/bin/python scripts/download_models.py --model face_detection
.venv/bin/python scripts/download_models.py --model palm_detection
.venv/bin/python scripts/download_models.py --model hand_pose
.venv/bin/python scripts/install_piper.py
.venv/bin/python scripts/download_models.py --model tts
.venv/bin/python scripts/download_models.py --model tts_config
.venv/bin/python scripts/download_models.py --model tts_fr
.venv/bin/python scripts/download_models.py --model tts_fr_config
.venv/bin/python scripts/install_whisper.py
.venv/bin/python scripts/download_models.py --model stt
.venv/bin/python scripts/download_models.py --model llm
.venv/bin/python scripts/check_stt.py --language es
.venv/bin/python scripts/check_stt.py --language fr
.venv/bin/python scripts/check_camera.py
.venv/bin/python scripts/check_audio.py
./scripts/run_raspberry.shPara el despliegue habitual en Raspberry, activa el inicio automatico una vez
terminada la configuracion. Crea un servicio systemd para el backend y un
autostart de Chromium en modo quiosco:
chmod +x scripts/install_raspberry_autostart.sh
sudo ./scripts/install_raspberry_autostart.shEl servicio usa Restart=on-failure: se inicia de nuevo en cada arranque del
sistema, pero el boton Cerrar sistema de Configuracion lo detiene de forma
intencionada y no se reinicia hasta el siguiente arranque o un systemctl start ugassistant.
Instala Ollama ARM64 de forma explicita antes de descargar el LLM:
curl -fsSL https://ollama.com/install.sh | sh
.venv/bin/python scripts/download_models.py --model llmEl setup instala libportaudio2 y alsa-utils si faltan. PortAudio utiliza
ALSA para enumerar el microfono USB y las salidas disponibles; no abre ningun
flujo durante la comprobacion.
La Logitech C270 se utiliza mediante V4L2 y aparecera como /dev/videoN. El usuario que ejecuta Chromium y UGAssistant debe tener acceso al grupo video. Si el indice cambia, modifica camera.device_index en config/app.yaml o usa --device-index en la comprobacion.
OpenCV 4 se mantiene deliberadamente: el archivo bloqueado face_detection_yunet_2023mar.onnx tiene dimensiones fijas y la documentacion oficial advierte de diferencias con el motor ONNX de OpenCV 5. No se sustituye por el modelo YuNet de 2026.
$env:PYTHONPATH = "src"
.\.venv\Scripts\python.exe scripts\check_hardware.pyLa comprobacion informa sobre plataforma, Python, Ollama, dispositivos de
camara y audio, OpenCV, whisper.cpp, Ollama, el modelo gemma3:4b instalado y
espacio libre.
$env:PYTHONPATH = "src"
.\.venv\Scripts\python.exe -m unittest discover -s testsLas pruebas unitarias usan adaptadores simulados y no necesitan abrir la camara ni acceder a Internet.
config/models.lock.yaml conserva exactamente:
- LLM: Ollama
gemma3:4b. - STT: whisper.cpp
ggml-base.bin. - TTS espanol: Piper
es_ES-davefx-medium.onnx. - TTS frances: Piper
fr_FR-tom-medium.onnx. - Vision: YuNet
face_detection_yunet_2023mar.onnx. - Palma: MP-PalmDet
palm_detection_mediapipe_2023feb.onnx. - Pose de mano: MP-HandPose
handpose_estimation_mediapipe_2023feb.onnx.
Los tres modelos de vision, las voces TTS DaveFX y Tom y el modelo STT estan
descargados y verificados. El modelo LLM se instala explicitamente con
scripts/download_models.py --model llm; su contenido y digest se gestionan
localmente por Ollama bajo la etiqueta bloqueada gemma3:4b.
config/runtimes.lock.yaml fija Piper 2023.11.14-2 y whisper.cpp v1.8.1
para Windows AMD64 y Linux ARM64; no se sustituye ningun modelo.
- Camara y microfono empiezan desactivados.
- No se guarda audio ni video.
- El WAV temporal generado por Piper se elimina inmediatamente despues de cargarlo en memoria para la reproduccion.
- El audio de reconocimiento se mantiene en memoria; el WAV temporal necesario para whisper.cpp se elimina al terminar cada transcripcion.
- No hay reconocimiento de identidad ni analisis de emociones.
- No se envia telemetria ni contenido a servicios externos.
- La previsualizacion y la deteccion se sirven unicamente desde
127.0.0.1.
Copyright (c) 2026 EMoyaP.
El codigo y la documentacion propios de UGAssistant se distribuyen bajo la
[Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International]
(https://creativecommons.org/licenses/by-nc-sa/4.0/). Puedes usar, adaptar y
redistribuir el proyecto solo con fines no comerciales, siempre que atribuyas
la autoria a EMoyaP, enlaces este repositorio e indiques los cambios
realizados. Las obras derivadas que se compartan deben conservar la misma
licencia o una compatible.
Consulta el texto legal completo en LICENSE. Los modelos, runtimes, bibliotecas y demas recursos de terceros mantienen sus propias licencias y no quedan relicenciados por esta declaracion.
El LLM Gemma 3 se descarga por separado y esta sujeto a los Gemma Terms of Use y a su politica de usos prohibidos. Sus pesos no se incluyen ni se redistribuyen con este repositorio. Consulta tambien THIRD_PARTY_NOTICES.md.