gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 815Rust 56Shell 37Markdown 291229 Definiciones

⎇ 54bf3e810e1f1e48a51f6dd3ad5151410512f105 recipes/ia-modelo-chat.toml TOML · 70 líneas · 4.1 KB Historia crudo

ia: el modelo de chat, pineado — Qwen2.5-1.5B-Instruct Q4_K_M (Apache-2.0) 54bf3e810 · Sergio ·

1# ia-modelo-chat — el modelo que contesta en la barra lateral de `atuq` (SDD 26 §6.7).
2#
3# ══ QUÉ ES ═════════════════════════════════════════════════════════════════════════════════════
4# **Qwen2.5-1.5B-Instruct, cuantizado Q4_K_M**: 1.117.320.736 bytes de GGUF. Es el modelo de chat de
5# la distro, y entra como los pesos entran en cualquier lado — **fuente pineada por sha256**, no un
6# build que lo produzca. Nadie entrena nada acá.
7#
8# ══ POR QUÉ ÉSTE ═══════════════════════════════════════════════════════════════════════════════
9# Tres cosas, y las tres se pueden discutir cambiando un sha256:
10#
11#   · **licencia Apache-2.0**, que es lo que una distro puede shipear sin letra chica. Las
12#     alternativas obvias (Llama-3.2, Gemma) traen licencias propias con restricciones de uso, y eso
13#     en una imagen que se distribuye no es un detalle;
14#   · **habla español**, que es el idioma de quien va a usar esto. Medido antes de pinearlo, no
15#     supuesto: se le preguntó qué es una distribución de GNU/Linux y contestó dos frases correctas
16#     en español;
17#   · **entra en la imagen y corre en CPU**: 1,04 GiB y **20,1 tokens/s** medidos en el hub sin GPU
18#     (89 tokens en 4,4 s). Un modelo de 7B con la misma licencia daría mejores respuestas y
19#     quintuplicaría el peso, con la mitad de la velocidad.
20#
21# ══ POR QUÉ EL TARBALL ES NUESTRO Y LA URL NO RESUELVE ═════════════════════════════════════════
22# takana extrae toda fuente con `tar`, y un `.gguf` pelado no es un tar. Así que el objeto pineado es
23# un tar que envuelve el fichero, publicado en el mirror de fuentes y servido **por sha256** — el
24# mismo camino que `firefox-pgo-profile`. La URL `.invalid` no resuelve a propósito (ADR 0013: la URL
25# no entra en `hash_inputs`, sólo el sha256).
26#
27# La PROCEDENCIA, para que nadie tenga que confiar en nuestro tar:
28#   upstream  https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct-GGUF
29#   fichero   qwen2.5-1.5b-instruct-q4_k_m.gguf
30#   sha256    6a1a2eb6d15622bf3c96857206351ba97e1af16c30d7a74ee38970e434e9407e   ← del GGUF, no del tar
31# Ese sha256 es el que HuggingFace publica como `lfs.oid`, y es el que se verificó al bajarlo.
32#
33# ⚠ `strip_components = 0`: el tar lleva el fichero en la raíz. Con el default (1) se recorta lo
34# único que hay y el install muere con un `cp: cannot stat` que no menciona el recorte.
35name    = "ia-modelo-chat"
36version = "qwen2.5-1.5b-instruct-q4_k_m"
37license = "Apache-2.0"
38
39[source]
40tarball = "https://no-hay-upstream.invalid/takana/ia-modelo-chat.tar"
41sha256  = "2560ee9452a979116ae24278615c51ecced38d2e62288ffe29f4a4bf7ddfc1c6"
42strip_components = 0
43
44[build]
45compiler = "zig-cc"
46
47[build.phases]
48configure = "true"
49compile   = "true"
50install = '''
51set -e
52mkdir -p /out/usr/share/takana/ia
53cp qwen2.5-1.5b-instruct-q4_k_m.gguf /out/usr/share/takana/ia/modelo.gguf
54
55M=/out/usr/share/takana/ia/modelo.gguf
56
57# ── GUARDIÁN: QUE SEA UN GGUF, NO UN FICHERO GRANDE ─────────────────────────────────────────
58# El modo de fallo callado acá es el de siempre: un fichero truncado o un HTML de error de 200 K
59# renombrado a `.gguf` se instala igual, sella en verde, y lo único que falla es la respuesta —
60# cuando ya no hay nadie mirando el build. Se comprueban las dos cosas que un GGUF de verdad tiene:
61# el número mágico `GGUF` en los primeros cuatro bytes, y el tamaño.
62head -c 4 "$M" | grep -q GGUF || {
63  echo "!! el fichero instalado no empieza con el mágico GGUF" >&2
64  head -c 64 "$M" | od -c | head -3 >&2
65  exit 1
66}
67n=$(stat -c%s "$M")
68test "$n" -gt 900000000 || { echo "!! el GGUF pesa $n bytes: está truncado" >&2; exit 1; }
69echo "guardián: GGUF válido — $n bytes"
70'''