---
name: metabase_create_model
kind: function
lang: py
domain: infra
version: "1.0.0"
purity: impure
signature: "def metabase_create_model(client: MetabaseClient, name: str, sql: str, database_id: int, collection_id: int = 0, description: str = '') -> dict"
description: "Crea un modelo de Metabase (card con type='model') que otras cards MBQL pueden usar como fuente via source-table: 'card__<id>'."
tags: [metabase, model, card, create, api, python, pendiente-usar]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [httpx]
params:
  - name: client
    desc: "instancia autenticada de MetabaseClient"
  - name: name
    desc: "nombre del modelo"
  - name: sql
    desc: "query SQL que define el modelo"
  - name: database_id
    desc: "ID de la database en Metabase donde vive la query"
  - name: collection_id
    desc: "ID de coleccion destino; 0 = root"
  - name: description
    desc: "descripcion opcional del modelo"
output: "dict con el modelo creado: id, name, type='model', dataset_query y metadata completa"
tested: false
tests: []
test_file_path: ""
file_path: "python/functions/metabase/cards.py"
---

## Ejemplo

```python
# Crear modelo base
model = metabase_create_model(
    client,
    name="supply_orders_base",
    sql="SELECT * FROM supply_orders WHERE status != 'cancelled'",
    database_id=6,
    collection_id=42,
    description="Ordenes de supply excluyendo canceladas",
)
print(model["id"])  # ej: 7820

# Usar el modelo como fuente en una card MBQL
card = metabase_create_card(client, "Revenue por proveedor", {
    "database": 6,
    "type": "query",
    "query": {
        "source-table": f"card__{model['id']}",
        "aggregation": [["sum", ["field", "total", None]]],
        "breakout": [["field", "supplier_id", None]],
    },
}, display="bar")
```

## Notas

Un modelo es una card con `type="model"`. Metabase lo trata como una capa de abstraccion — las cards MBQL que lo referencian via `source-table: "card__<id>"` se benefician del schema inferido del modelo (tipos de columna, foreign keys, etc.).

A diferencia de `metabase_create_card`, esta funcion fuerza `type="model"` y siempre usa query SQL nativa. Para modelos MBQL o con configuracion avanzada (result_metadata, column types), usar `metabase_create_card_raw` con `type="model"` en el payload.
