feat(HAI-098): add model selection and configuration support

- Extend Settings type with model provider and model name fields
- Add backend API endpoint to list available models
- Add frontend API client for fetching models
- Add model settings section to SettingsModal with provider/model dropdowns
- Update engine executor to use the selected model from settings
This commit is contained in:
Dustin Byrne
2026-03-26 20:09:23 -04:00
parent 615f31c777
commit a8b767d6fc
12 changed files with 350 additions and 6 deletions

View File

@@ -349,6 +349,8 @@ export class TaskExecutor {
customTools,
onText: agentLogger.onText,
onToolStart: agentLogger.onToolStart,
defaultProvider: settings.defaultProvider,
defaultModelId: settings.defaultModelId,
});
// Register session so the pause listener can terminate it

View File

@@ -30,6 +30,10 @@ export interface AgentOptions {
onText?: (delta: string) => void;
onToolStart?: (name: string, args?: Record<string, unknown>) => void;
onToolEnd?: (name: string, isError: boolean) => void;
/** Default model provider (e.g. "anthropic"). Used with `defaultModelId` to select a specific model. */
defaultProvider?: string;
/** Default model ID within the provider (e.g. "claude-sonnet-4-5"). Used with `defaultProvider`. */
defaultModelId?: string;
}
/**
@@ -50,6 +54,11 @@ export async function createHaiAgent(options: AgentOptions): Promise<AgentResult
retry: { enabled: true, maxRetries: 3 },
});
// Resolve explicit model selection if provider and model ID are specified
const selectedModel = options.defaultProvider && options.defaultModelId
? modelRegistry.find(options.defaultProvider, options.defaultModelId)
: undefined;
const resourceLoader = new DefaultResourceLoader({
cwd: options.cwd,
settingsManager,
@@ -67,6 +76,7 @@ export async function createHaiAgent(options: AgentOptions): Promise<AgentResult
customTools: options.customTools,
sessionManager: SessionManager.inMemory(),
settingsManager,
...(selectedModel ? { model: selectedModel } : {}),
});
// Wire up event listeners

View File

@@ -270,6 +270,8 @@ export class TriageProcessor {
customTools: this.createTriageTools(),
onText: agentLogger.onText,
onToolStart: agentLogger.onToolStart,
defaultProvider: settings.defaultProvider,
defaultModelId: settings.defaultModelId,
});
try {