> Source: https://wexa.ai/docs/agents/list-models

# list-models

List the AI models this organization can run, and which one is the default. Needs the `fabric:orchestrate.read` grant.

**List models**

**Wexa MCP server**

```bash
curl -sS -X POST https://fabric.wexa.ai/mcp/$FABRIC_PROJECT_ID \
  -H "authorization: Bearer $FABRIC_API_KEY" \
  -H "Mcp-Session-Id: $MCP_SESSION_ID" \
  -H "content-type: application/json" -H "accept: application/json" \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"list-models","arguments":{}}}'
```

```json
{
  "content": [
    {
      "type": "text",
      "text": "{\"lifecycle_id\":\"qlc_000171\",\"result\":{\"available\":[{\"label_name\":\"WEXA System Model\",\"model_name\":\"system_model\"}],\"default\":{\"chosen\":true,\"model\":\"mdl_bx_anthropic-claude-haiku-4-5-20251001-v1_28ccc24bfca8\",\"source\":\"AI Models registry\"},\"registry\":\"\\u2026\",\"settable\":\"\\u2026\"}}"
    }
  ],
  "isError": false
}
```

**REST API**

```bash
curl -sS https://fabric.wexa.ai/v1/list-models \
  -H "authorization: Bearer $FABRIC_API_KEY" \
  -H "content-type: application/json" \
  -d '{}'
```

```json
{
  "lifecycle_id": "qlc_000171",
  "result": {
    "available": [
      {
        "label_name": "WEXA System Model",
        "model_name": "system_model"
      }
    ],
    "default": {
      "chosen": true,
      "model": "mdl_bx_anthropic-claude-haiku-4-5-20251001-v1_28ccc24bfca8",
      "source": "AI Models registry"
    },
    "registry": "\u2026",
    "settable": "\u2026"
  }
}
```

**TypeScript SDK**

```ts
import { Fabric } from '@wexa-fabric/sdk'

const fabric = new Fabric()
const result = await fabric.listModels({})
```

```ts
// result is the payload itself, with no `.result` to read
{
  available: [
    {
      label_name: 'WEXA System Model',
      model_name: 'system_model'
    }
  ],
  default: {
    chosen: true,
    model: 'mdl_bx_anthropic-claude-haiku-4-5-20251001-v1_28ccc24bfca8',
    source: 'AI Models registry'
  },
  registry: '…',
  settable: '…'
}
```

**Python SDK**

```python
from wexa import Fabric

fabric = Fabric()
out = fabric.list_models()
```

```python
# out is the result, already unwrapped
{
    "available": [
        {
            "label_name": "WEXA System Model",
            "model_name": "system_model"
        }
    ],
    "default": {
        "chosen": True,
        "model": "mdl_bx_anthropic-claude-haiku-4-5-20251001-v1_28ccc24bfca8",
        "source": "AI Models registry"
    },
    "registry": "\u2026",
    "settable": "\u2026"
}
```

## Parameters

| Parameter | Type | Required | Notes |
| --- | --- | --- | --- |
| none |  |  | This tool takes no parameters. Send an empty object: the organization comes from your credential. |

**Show full response**

A real response, captured from a live call to `list-models`:

`registry` and `settable` came back populated and are shown as `…` here, because the real value runs to thousands of characters. Read them from your own call rather than from this page.

**Result of list-models**

**REST API**

```json
{
  "lifecycle_id": "qlc_000171",
  "result": {
    "available": [
      {
        "label_name": "WEXA System Model",
        "model_name": "system_model"
      }
    ],
    "default": {
      "chosen": true,
      "model": "mdl_bx_anthropic-claude-haiku-4-5-20251001-v1_28ccc24bfca8",
      "source": "AI Models registry"
    },
    "registry": "\u2026",
    "selected": {
      "embedding_model_to_use": null,
      "fallback_model_to_use": "system_model",
      "has_chosen_default_model": true,
      "organization_id": "6a79a770b6c128ccc24bfca8",
      "resolved_default_model": "mdl_bx_anthropic-claude-haiku-4-5-20251001-v1_28ccc24bfca8"
    },
    "settable": "\u2026"
  }
}
```

**Wexa MCP server**

```json
{
  "content": [
    {
      "type": "text",
      "text": "{\"lifecycle_id\":\"qlc_000171\",\"result\":{\"available\":[{\"label_name\":\"WEXA System Model\",\"model_name\":\"system_model\"}],\"default\":{\"chosen\":true,\"model\":\"mdl_bx_anthropic-claude-haiku-4-5-20251001-v1_28ccc24bfca8\",\"source\":\"AI Models registry\"},\"registry\":\"\\u2026\",\"selected\":{\"embedding_model_to_use\":null,\"fallback_model_to_use\":\"system_model\",\"has_chosen_default_model\":true,\"organization_id\":\"6a79a770b6c128ccc24bfca8\",\"resolved_default_model\":\"mdl_bx_anthropic-claude-haiku-4-5-20251001-v1_28ccc24bfca8\"},\"settable\":\"\\u2026\"}}"
    }
  ],
  "isError": false
}
```

**TypeScript SDK**

```ts
// the object you get back IS the result — there is no `.result` to read
{
  available: [
    {
      label_name: 'WEXA System Model',
      model_name: 'system_model'
    }
  ],
  default: {
    chosen: true,
    model: 'mdl_bx_anthropic-claude-haiku-4-5-20251001-v1_28ccc24bfca8',
    source: 'AI Models registry'
  },
  registry: '…',
  selected: {
    embedding_model_to_use: null,
    fallback_model_to_use: 'system_model',
    has_chosen_default_model: true,
    organization_id: '6a79a770b6c128ccc24bfca8',
    resolved_default_model: 'mdl_bx_anthropic-claude-haiku-4-5-20251001-v1_28ccc24bfca8'
  },
  settable: '…'
}

// The TS SDK names these camelCase — lifecycleId, traceId — where Python uses
// lifecycle_id and trace_id. Both are non-enumerable: readable, but omitted by
// Object.keys() and JSON.stringify(). `result.lifecycleId` here is undefined.
result.lifecycleId // 'qlc_000171'
```

**Python SDK**

```python
# a dict subclass; `result` is already unwrapped
{
 "available": [
  {
   "label_name": "WEXA System Model",
   "model_name": "system_model"
  }
 ],
 "default": {
  "chosen": True,
  "model": "mdl_bx_anthropic-claude-haiku-4-5-20251001-v1_28ccc24bfca8",
  "source": "AI Models registry"
 },
 "registry": "\u2026",
 "selected": {
  "embedding_model_to_use": None,
  "fallback_model_to_use": "system_model",
  "has_chosen_default_model": True,
  "organization_id": "6a79a770b6c128ccc24bfca8",
  "resolved_default_model": "mdl_bx_anthropic-claude-haiku-4-5-20251001-v1_28ccc24bfca8"
 },
 "settable": "\u2026"
}

out.lifecycle_id  # 'qlc_000171' — an attribute, not a key
```

**More details**

`default` names the model that will actually run for an agent that does not name its own: one answer, resolved the same way every call path in the platform resolves it. The result holds two families of id, and both are valid in an agent's `llm.model`. `registry` holds the organization's AI Models registry entries (ids like `mdl_...`): an id, a name, a provider, a health status and whether it is the default. These are the only ids `create-agent` and `create-process-flow` accept, so prefer them. `available` is what the running service reports it can reach: the `system_model` sentinel, plus composite ids naming one model from one provider for one organization (`instance#provider#org#model`). `settable` lists the ids [set-model](/docs/agents/set-model) accepts, which is the registry ids, because the organization default lives in the registry. In the console the registry is the **AI Models** page.

The registry is read from a separate service. When it is unavailable, the result says so instead of returning a short list that looks complete. Treat a missing registry as "not known right now", not as "no registry models".

### How an agent gets its model

An agent's definition has an `llm` block whose `model` names the LLM. Created without a model, the agent is stored with the organization's default from the AI Models registry, or the first registry model when none is marked default. That stored id is real, so the agent keeps it when the default changes later. Agents made before this rule can still carry the sentinel `system_model`, which means whichever model the organization has chosen. A new agent cannot be given `system_model`: it is refused.

To choose a model for one agent, put a real model id in that agent's `llm.model`. Only that agent changes, and it stops following the organization default. In the console, open the agent and set its **Model**. Over the API, pass `model` to [create-agent](/docs/agents/create-agent), or `llm.model` to [update-agent](/docs/agents/update-agent). Each agent in a process flow manifest carries its own `llm` block, so one [process flow](/docs/automation/create-process-flow) can mix models on purpose.

To change the default for the organization, see [set-model](/docs/agents/set-model). To call a model with no agent involved, see [run-model](/docs/agents/run-model). For who bills you and what it costs, platform-provided or bring-your-own, see [Platform-provided or bring-your-own](/docs/agents/run-model#platform-provided-or-bring-your-own).

Every tool call works the same way: [How every tool call works](/docs/sdks-and-apis/how-every-tool-call-works).
