---
slug: 80-cookbook
title: Recetario
description: Patrones copy-paste de Synsema — validación de entrada con resultados parciales, más punteros a los patrones completos (API HTTP, CRUD, op LLM, tools de agente, secretos).
example_ids: [cookbook]
---

# Recetario

Patrones copy-paste. Cada uno es completo y está doctested en su página — empezá acá, después seguí el link.

## Validar entrada, conservar resultados parciales

Validá un payload a un valor tipado; sumá los válidos y saltá los malos con `try/recover`:

```synsema
-- Doc cookbook: validate a payload into a typed value, and sum valid ones with
-- partial results (try/recover skips the bad ones). A copy-paste-ready pattern.
intent: "doc cookbook: validate + partial results"

type Order
    id: number
    total: number

task validate_order(payload)
    when not contains(payload, "total")
        raise("missing total")
    when (payload["total"]) < 0
        raise("total must be >= 0")
    give Order(payload["id"], payload["total"])

task bad_order()
    give validate_order({"id": 2, "total": 0 - 5})

task safe_total(payloads)
    let total be 0
    each p in payloads
        try
            let o be validate_order(p)
            set total to total + (total of o)
        recover err
            log "skipped: " + err          -- partial results: skip the invalid ones
    give total

print("safe_total of mixed orders → " + text(safe_total([{"id": 1, "total": 10}, {"id": 2, "total": 0 - 1}, {"id": 3, "total": 5}])))

test "validate accepts good input and rejects bad"
    assert_eq(total of validate_order({"id": 1, "total": 100}), 100)
    assert_error(bad_order)

test "partial results: invalid orders are skipped"
    assert_eq(safe_total([{"id": 1, "total": 10}, {"id": 2, "total": 0 - 1}, {"id": 3, "total": 5}]), 15)
```

## Los otros patrones (cada uno mostrado completo en su página)

- **Una página con estilo desde layout + componentes** — `{ layout }`, slots nombrados, `{ include … with {props} }`, CSS inline en un bloque `{ raw }` → **[Construí un sitio web](/es/0.6.x/41a-build-a-website)**.
- **Un formulario clásico (sin JS)** — `<form method="post">` + `form of request` (urlencoded/multipart, archivos como bytes exactos) → **[Construí un sitio web](/es/0.6.x/41a-build-a-website)**.
- **Páginas 404/500 propias con status honestos** — `errors with <task>`; HTML para navegadores, JSON para agentes, `redirect` para un 401 → **[Servidor HTTP](/es/0.6.x/40-serve)**.
- **Datos seguros en un `<script>` inline** — `{ raw json_for_script(x) }` (jamás `json_encode` ahí) → **[Frontend](/es/0.6.x/41-frontend)**.
- **Rutas partidas en módulos** — `export routes` + `mount alias.grupo at "/prefix"` → **[Módulos](/es/0.6.x/14-modules)**.
- **API HTTP con auth + validación** — `auth with`, `expect body {…}`, los response helpers → **[Servidor HTTP](/es/0.6.x/40-serve)**.
- **CRUD sobre SQL** — `db_open` / `sql_exec` / `sql` (SQLite in-memory en el doctest) → **[SQL, Mongo y Redis](/es/0.6.x/33-sql-mongo-redis)**.
- **Una operación LLM** — `generate "…" given X`, ramificar con `llm_available()` → **[Primitivas LLM](/es/0.6.x/50-llm-primitives)**.
- **Un agente con tools** — el loop allow-list `llm_step` + `call_tool` → **[Tool calling](/es/0.6.x/51-llm-tool-calling)**.
- **Un secret en cualquier header** — `{"x-api-key": secret("KEY")}` / `bearer(...)`, materializado solo en el socket → **[Secretos](/es/0.6.x/21-secrets)**.
- **Leer/escribir un archivo con capacidades** — `require file(...)` + `read_file`/`write_file` → **[Archivos e I/O](/es/0.6.x/30-io-files)**.
- **El loop on-chain** — leer (nonce/fees/UTXOs) → construir → `confirm` con los números → firmar (la única puerta gateada) → enviar → espera acotada; EVM (incl. los L2 Base/Arbitrum/Optimism) → **[Blockchain](/es/0.6.x/38-blockchain)**, Bitcoin (cada satoshi contabilizado) → **[Bitcoin](/es/0.6.x/38a-bitcoin)**.
- **Custodia fría con PSBT** — el agente prepara y audita, un humano firma en su hardware wallet, el agente finaliza y difunde (la clave jamás toca la máquina del agente) → **[Bitcoin](/es/0.6.x/38a-bitcoin)**.
- **Una transferencia detrás de una puerta humana** — `confirm "… fee X?" within 15m` ANTES de `secp256k1_sign`, compuesto bajo `serve` con monitoreo cron y un `chart()` negociado → **[Blockchain](/es/0.6.x/38-blockchain)** (la ruta flagship).
- **Miles de feeds en vivo en un thread** — el event-loop `while` + `ws_select`, reconexión + keepalive opt-in, fan-out con `parallel_map` → **[WebSocket](/es/0.6.x/39-websocket)**.

Cada snippet de esas páginas está doctested contra esta versión, así que un LLM puede copiar uno y funciona.
