Skip to content

Model Routing

Not every task needs the same model. Formatting a file is a waste of Opus. Designing an architecture is a bad fit for a small, fast model. Noodle's routing system lets you match models to tasks.

Defaults

Set your default model in .noodle.toml:

toml
[routing.defaults]
provider = "claude"
model = "claude-opus-4-6"

Every stage inherits this unless the stage explicitly sets provider and model in orders.json. This is the only runtime routing override path today.

Stage-level override

The scheduler can set provider and model directly per stage:

json
{
  "orders": [
    {
      "id": "todo-5",
      "title": "Refactor utils to use new date library",
      "stages": [
        {
          "skill": "execute",
          "status": "pending",
          "provider": "codex",
          "model": "gpt-5.3-codex"
        },
        {
          "skill": "test",
          "status": "pending",
          "provider": "claude",
          "model": "claude-sonnet-4-6"
        },
        {
          "skill": "review",
          "status": "pending",
          "provider": "claude",
          "model": "claude-opus-4-6",
          "prompt": "Review the refactor for correctness and edge cases"
        }
      ]
    }
  ]
}

This gives the scheduler full control, and allows you to define your own criteria for routing tasks to the right model.