GenerateSaaS

Tasks

Builder-declared AI tasks the end-user maps to a model and reasoning effort, per task and per device, stored on their own machine.

A task is a named unit of AI work your product runs - "review this content", "summarize this thread". You declare tasks in code; the end-user picks the model and reasoning effort each one runs at, on the Tasks screen in Settings.

Declaring a task

Tasks live in @repo/config/ai/tasks (aiTasks), which the desktop app reads:

// packages/config/src/ai/tasks.ts
export const aiTasks: AiTaskSpec[] = [
  {
    id: "verify-article",
    label: "Article verification",
    description: "Checks a draft before it publishes.",
  },
];
FieldPurpose
idStable id product code resolves the choice by, and the key a stored selection is saved under.
labelThe task's name on the Tasks screen.
descriptionOptional one-line hint under the label.
surfacesOptional ("web" | "desktop")[] - which surfaces show the task. Omit to show it everywhere.

aiTasks starts empty, so the Tasks entry stays out of the settings rail until you declare a task that targets the desktop.

The Tasks screen

Each declared desktop task is one row on this device: its label and description, the model it currently runs (an override, or the device default), a Change button opening the model picker, and - once an override is set - a Use device default button that clears it.

  • Per device: a selection is a model key plus a reasoning effort, stored on this machine in the runtime's own task-override document - and per workspace with multiTenant enabled. Nothing is written to your backend, and there is no account-wide override.
  • Sourced from this device: the picker offers what the Models screen lists - the connected coding CLIs. A task runs here, so credit-backed built-in models are never offered.
  • No mapping: a task with no override runs on the device's default model.

On this page