How to use from
llama.cpp
# Gated model: Login with a HF token with gated access permission
hf auth login
Install (macOS, Linux)
curl -LsSf https://llama.app/install.sh | sh
# Start a local OpenAI-compatible embeddings server:
llama serve -hf Lilgarca/my-model-v01:Q4_0 --embeddings
Install from WinGet (Windows)
winget install llama.cpp
# Start a local OpenAI-compatible embeddings server:
llama serve -hf Lilgarca/my-model-v01:Q4_0 --embeddings
Build from source code
git clone https://github.com/ggml-org/llama.cpp.git
cd llama.cpp
cmake -B build
cmake --build build -j --target llama-app
# Start a local OpenAI-compatible embeddings server:
./build/bin/llama serve -hf Lilgarca/my-model-v01:Q4_0 --embeddings
Quick Links

You need to agree to share your Hugging Face information to access this model

This repository is publicly accessible, but you have to accept the conditions to access its files and content.

Log in or Sign Up to review the conditions and access this model content.

Cyrah

Modelo Cyrah, creado por Juan Ignacio Robledo.

Arquitectura propia cyrah (CyrahAnyToAnyForConditionalGeneration), entrenada desde cero sobre un decodificador hibrido de 14 capas y 1024 de hidden (244 M de parametros) que unifica en un solo bloque las ideas de atencion, mezcla de expertos y convolucion corta que hoy dominan los modelos abiertos.

Componente Que aporta
Gated DeltaNet-2 memoria lineal con decaimiento acotado, sin matriz de atencion
Attention Residuals camino residual por capa sobre la salida de atencion
SwiGLU / SiTU activacion de la MLP densa y de la mezcla de expertos
RoPE parcial + QK-norm rotacion solo en la mitad de la cabeza, norma en Q y K
XSA atencion con estado extra compartido entre cabezas
Convolucion corta dual-gate mezcla local de 3 pasos con puerta previa y posterior
Ventana deslizante atencion local alternada con atencion completa
Puerta de salida de atencion escala aprendida por cabeza sobre la salida
MLA con compresion latente cache KV comprimido en un latente de baja dimension
MoE sqrtsoftplus / sigmoid enrutado suave y estable de expertos
Indexador DSA seleccion dispersa de claves relevantes
RoPE intercalado pares real/imaginario intercalados en lugar de mitades
K == V una sola proyeccion para clave y valor
Softcapping de logits cota tanh sobre los logits finales

Plan de capas: conv (convolucion corta) y full_attention alternadas, con linear_attention (GDN-2) y sliding_attention disponibles por configuracion. La MLP es densa en la primera capa y mezcla de expertos en el resto. El tokenizer de texto se reutiliza tal cual, sin introducir uno nuevo.

Los pesos se entrenan de forma autonoma y continua sobre datasets reales de HF.co (chat, razonamiento, matematicas, tool calling y conocimiento) mas un corpus sintetico de identidad.

Modalidades

Cyrah es omni: no hay cabezas separadas por modalidad. Todo se expresa como tokens en un unico vocabulario plano y una sola cabeza causal los predice, asi que cualquier modalidad puede condicionar a cualquier otra.

Rango Modalidad Tamano
0 .. 65535 texto 65536
65536 .. 73727 audio (8 codebooks RVQ x 1024) 8192
73728 .. 81919 imagen y video (VQ 8192) 8192
81920 .. 90111 3D (nubes gaussianas, mallas) 8192
90112 .. 91135 senal (series, sensores, acciones) 1024
91136 .. 91199 especiales (think, tool, modalidad) 64

Cuatro codecs neuronales convierten la senal continua a ese vocabulario y de vuelta:

  • CyrahAudioCodec β€” autoencoder convolucional con cuantizacion residual (RVQ) de 8 codebooks. 24 kHz, hop 320, 75 tokens/s por codebook (600 tokens/s en total).
  • CyrahImageCodec β€” autoencoder convolucional con cuantizacion vectorial (VQ) de 8192 entradas. 128x128 px, rejilla 16x16, 256 tokens por imagen.
  • CyrahGaussianCodec β€” VQ sobre nubes de puntos gaussianas de 14 canales (xyz, armΓ³nicos esfΓ©ricos DC, opacidad, escala, cuaternion).
  • CyrahSignalCodec β€” VQ sobre series temporales de 8 canales.

El video se trata como una secuencia de fotogramas codificados con el codec de imagen, y la edicion como continuacion del flujo de tokens con la modalidad marcada. Una modality_embed aprendida (95 filas, una por modalidad) se suma al embedding de token para que la pila sepa que esta leyendo.

model = AutoModelForCausalLM.from_pretrained("lilgarca/my-model-v01", trust_remote_code=True)
model.ensure_codecs()

tokens = model.image_to_tokens(pil_image)          # -> ids del rango imagen
wav    = model.tokens_to_audio(model.audio_to_tokens(waveform))
out    = model.generate_omni(ids, max_new_tokens=256)
model.split_tokens(out[0])                          # -> {texto, audio, imagen}

# any-to-any: la entrada y la salida pueden ser cualquier modalidad
ids, mods = model.generate_any([("text", prompt_ids)], max_new_tokens=256)
model.decode_any(ids, mods)                         # -> {"text": [...], "audio": [...]}

Los codecs se inicializan con el modelo y necesitan su propio entrenamiento de reconstruccion antes de que el audio y las imagenes sean inteligibles; el bucle autonomo ya reserva una pasada para eso.

Calidad seleccionable

La resolucion de cada modalidad no esta fijada en el codigo: se elige por peticion con el parametro quality (auto, minimo, bajo, medio, alto, maximo). auto la deduce del hardware disponible. Cada nivel ajusta audio_codebooks, image_grid, video_frames, video_fps, gaussian_tokens, signal_tokens, top_k y el numero de pasos de entrenamiento.

ids, mods = model.generate_any(
    [("text", prompt_ids)], quality="maximo", max_new_tokens=512)

Capacidades

  • Identidad propia: responde que se llama Cyrah y que su creador es Juan Ignacio Robledo.
  • Razonamiento explicito con thinking ... </think>.
  • Tool calling con <|tool_call_start|>[fn(arg='valor')]<|tool_call_end|>.
  • 95 modalidades en un solo flujo de tokens, agrupadas en texto, audio, imagen, video, 3D, ciencia, meta y conversiones.
  • Texto, codigo, matematicas, traduccion, OCR, tablas y grafos.
  • Audio: voz (TTS), musica, efectos y edicion de audio.
  • Imagen: generacion, edicion, inpaint, upscale, restauracion, estilo, profundidad, normales, segmentacion, deteccion y pose.
  • Video: generacion, edicion, tracking, movimiento y modelos de mundo.
  • 3D: nubes gaussianas, mallas, nubes de puntos y avatares.
  • Ciencia: moleculas, proteinas, ADN, series temporales, sensores y acciones.
  • Meta: embeddings, VQA y evaluacion.
  • 49 conversiones explicitas entre modalidades (txt2img, img2vid, vid2audio, audio2music, 3d2mesh, sig2action, ...).
  • Edicion: la salida se genera condicionada al contenido de entrada.
  • Calidad seleccionable por peticion (auto, minimo ... maximo).

Arquitecturas descubiertas en HF.co

El bucle lee el config.json real de modelos publicados de cada modalidad y pliega el consenso de sus hiperparametros en la configuracion de Cyrah. Ultimo barrido: 11 modelos en 6 modalidades.

Modalidad Modelo Tipo Hidden Capas Codebook Hz
texto HuggingFaceTB/SmolLM2-360M llama 960 32 - -
texto Qwen/Qwen2.5-1.5B qwen2 1536 28 - -
audio facebook/encodec_24khz encodec 128 - 1024 24000
audio facebook/encodec_32khz encodec 128 - 2048 32000
musica facebook/musicgen-small encodec 128 24 2048 32000
musica facebook/musicgen-melody encodec 128 48 2048 32000
imagen stabilityai/sd-vae-ft-mse - - - - -
imagen stabilityai/sd-vae-ft-ema - - - - -
video Wan-AI/Wan2.1-T2V-1.3B t2v - - - -
omni Qwen/Qwen2.5-Omni-3B qwen2_5_omni 896 24 - -
omni google/gemma-3n-E4B-it gemma3n_audio 1536 35 - -

Uso por modalidad

Cada modalidad se invoca con el mismo modelo y el mismo tokenizer. Despliega la que necesites:

Texto, razonamiento y tool calling
from transformers import AutoModelForCausalLM, AutoTokenizer

tok = AutoTokenizer.from_pretrained("lilgarca/my-model-v01")
model = AutoModelForCausalLM.from_pretrained("lilgarca/my-model-v01", trust_remote_code=True)

msgs = [{"role": "user", "content": "Como te llamas?"}]
ids = tok.apply_chat_template(msgs, add_generation_prompt=True, return_tensors="pt")
print(tok.decode(model.generate(ids, max_new_tokens=128)[0][ids.shape[-1]:],
                 skip_special_tokens=False))

Para razonamiento explicito pide thinking ... </think>; para herramientas el modelo emite <|tool_call_start|>[fn(arg='valor')]<|tool_call_end|>.

Texto a audio (TTS)
model.ensure_codecs()
ids, mods = model.generate_any(
    [("text", tok("Di: hola, soy Cyrah.").input_ids)],
    max_new_tokens=600, quality="alto")
wav = model.tokens_to_audio(model.decode_any(ids, mods)["audio"][0])
# wav: tensor float32 a model.config.audio_sample_rate (24 kHz)
Texto a musica
ids, mods = model.generate_any(
    [("text", tok("Genera 8 segundos de musica lo-fi con piano.").input_ids)],
    max_new_tokens=1200, quality="maximo")
wav = model.tokens_to_audio(model.decode_any(ids, mods)["audio"][0])
Texto a imagen
ids, mods = model.generate_any(
    [("text", tok("Un faro al atardecer, oleo.").input_ids)],
    max_new_tokens=256, quality="alto")
img = model.tokens_to_image(model.decode_any(ids, mods)["image"][0])
img.save("salida.png")
Imagen a imagen (edicion, estilo, upscale, inpaint)
from PIL import Image
src = Image.open("entrada.png").convert("RGB")

prefix = [("image", model.image_to_tokens(src))]
head   = tok("Convierte a acuarela.").input_ids
ids, mods = model.generate_any(prefix + [("text", head)],
                               max_new_tokens=256, quality="alto")
model.tokens_to_image(model.decode_any(ids, mods)["image"][0]).save("editada.png")
Texto a video
ids, mods = model.generate_any(
    [("text", tok("Olas rompiendo en una playa, 8 fotogramas.").input_ids)],
    max_new_tokens=2048, quality="medio")
frames = model.tokens_to_video(model.decode_any(ids, mods)["image"][0],
                               frames=8)
# frames: lista de PIL.Image; guarda como gif o mp4
frames[0].save("salida.gif", save_all=True, append_images=frames[1:], duration=125)
Video a video
import imageio.v3 as iio
src = [Image.fromarray(f) for f in iio.imread("entrada.mp4")]

prefix = [("image", model.video_to_tokens(src))]
ids, mods = model.generate_any(prefix + [("text", tok("Ponlo en blanco y negro.").input_ids)],
                               max_new_tokens=2048, quality="medio")
frames = model.tokens_to_video(model.decode_any(ids, mods)["image"][0],
                               frames=len(src))
Texto a 3D (nubes gaussianas, mallas)
ids, mods = model.generate_any(
    [("text", tok("Una taza de cafe en 3D.").input_ids)],
    max_new_tokens=512, quality="alto")
prims = model.tokens_to_gaussian(model.decode_any(ids, mods)["3d"][0])
model.to_ply(prims, "salida.ply")     # abre en cualquier visor de splats
Imagen a 3D
prefix = [("image", model.image_to_tokens(Image.open("objeto.png").convert("RGB")))]
ids, mods = model.generate_any(prefix, max_new_tokens=512, quality="alto")
model.to_ply(model.tokens_to_gaussian(model.decode_any(ids, mods)["3d"][0]),
             "objeto.ply")
Texto a senal (series temporales, sensores, acciones)
ids, mods = model.generate_any(
    [("text", tok("Una senal senoidal de 8 canales con ruido.").input_ids)],
    max_new_tokens=128, quality="medio")
sig = model.tokens_to_signal(model.decode_any(ids, mods)["signal"][0])
# sig: tensor (8, N)
Audio a audio (limpieza, cambio de estilo)
import soundfile as sf
wav, sr = sf.read("entrada.wav", dtype="float32")

prefix = [("audio", model.audio_to_tokens(wav))]
ids, mods = model.generate_any(prefix + [("text", tok("Quita el ruido.").input_ids)],
                               max_new_tokens=600, quality="alto")
out = model.tokens_to_audio(model.decode_any(ids, mods)["audio"][0])
sf.write("limpio.wav", out.numpy(), sr)
Audio a texto (transcripcion)
prefix = [("audio", model.audio_to_tokens(wav))]
ids, mods = model.generate_any(prefix + [("text", tok("Transcribe.").input_ids)],
                               max_new_tokens=256)
print(tok.decode(model.decode_any(ids, mods)["text"][0], skip_special_tokens=True))
Imagen a texto (caption, OCR, VQA)
prefix = [("image", model.image_to_tokens(Image.open("foto.png").convert("RGB")))]
ids, mods = model.generate_any(prefix + [("text", tok("Describe la imagen.").input_ids)],
                               max_new_tokens=256)
print(tok.decode(model.decode_any(ids, mods)["text"][0], skip_special_tokens=True))
Any-to-any (el modelo elige la salida)
# sin decir la modalidad de salida: el router decide
ids, mods = model.generate_any(
    [("text", tok("Explicame la fotosintesis y ponlo en audio.").input_ids)],
    max_new_tokens=800, quality="auto")
for modality, chunks in model.decode_any(ids, mods).items():
    print(modality, len(chunks))
Inspeccionar la configuracion en tiempo de ejecucion
print(model.describe())          # modalidades, rangos, codecs, calidad
print(model.config.token_layout())

configuration_cyrah.py y modeling_cyrah.py definen la arquitectura cyrah / CyrahAnyToAnyForConditionalGeneration; con trust_remote_code=True se cargan solos.

GGUF

llama.cpp no incluye convertidor para la arquitectura cyrah, asi que este repo se publica en formato transformers (safetensors + modeling_cyrah.py).

Entrenamiento

  • Ciclo: 609
  • Ejemplos del dataset: 48280
  • Actualizado: 2026-11-08 01:55:27
Downloads last month
4,242
Safetensors
Model size
0.3B params
Tensor type
F32
Β·
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ 1 Ask for provider support

Space using Lilgarca/my-model-v01 1