Two of the chat panel's features are declared on the harness config rather than in the UI, because both belong to the conversation rather than to a single render. Both are options on AgAiHarnessConfig.
Offering a Choice of Model Copy Link
List models and the chat panel shows a model picker beside its send button. Each entry needs an id, which your adapter receives, and a label, which is the wording the reader sees. A model that offers a choice of effort declares its own efforts, so the two pickers stay in step and switching model switches to that model's efforts:
<ag-studio
[ai]="ai"
/* other studio properties ... */ />
this.ai = ({ api }) =>
createAiHarness(api, {
adapter,
models: [
{
id: 'gpt-5.6-terra',
label: 'GPT-5.6 Terra',
efforts: [
{ id: 'low', label: 'Low' },
{ id: 'high', label: 'High' },
],
},
{ id: 'gpt-5.6-sol', label: 'GPT-5.6 Sol' },
{ id: 'gpt-5.6-luna', label: 'GPT-5.6 Luna' },
],
});Omit models and no picker is shown - the adapter answers on whatever model it was built with. A model with no efforts shows only the model picker.
The choice belongs to the conversation. Each thread keeps the model it was last set to, and a new thread starts on whichever model was picked most recently. Every message carries the choice through to your adapter, which decides what to do with it.
Passed through to the adapter as AgAiModelSelection.id.
|
The wording the reader sees for this model.
|
The efforts this model offers, in the order they are shown. Omit for a model that offers no choice of effort, and the reader is asked only to pick the model.
|
Passed through to the adapter as AgAiModelSelection.effort.
|
The wording the reader sees for this effort.
|
Suggesting Prompts Copy Link
promptStarters seeds an empty thread with prompts a reader can click instead of typing. They show only before the first message, so they are an opening move rather than a menu:
<ag-studio
[ai]="ai"
/* other studio properties ... */ />
this.ai = ({ api }) =>
createAiHarness(api, {
adapter,
promptStarters: [
{ label: 'Summarise this page', prompt: 'Summarise what this dashboard shows.' },
{ label: 'Find outliers', prompt: 'Which cities are unusual in this data, and why?' },
],
}); The words on the button. Keep it short - it is not what the agent receives.
|
The message sent when the suggestion is chosen.
|
An icon shown before the label. One of: string - an SVG string { className: string } - a CSS class name { url: string } - a URL to an SVG |
Write them for the data in front of the reader. A starter that mentions a field the dashboard does not have shows the reader that the assistant does not know their data.
Next Copy Link
- Chat UI - what the panel renders
- Built-in Harness - the rest of the harness config
- Direct LLM Runner - what an adapter does with the chosen model