feat(models): add background task model override config and runtime wiring

This commit is contained in:
William Valentin
2026-02-19 09:52:45 -08:00
parent 4df1291e64
commit 027f7ad283
6 changed files with 367 additions and 4 deletions
+77 -1
View File
@@ -2,12 +2,13 @@ import { randomUUID } from 'crypto';
import type { SessionManager } from '../session/manager.js';
import type { ModelClient } from '../models/types.js';
import type { ModelRouter, ModelTier } from '../models/router.js';
import { createClientFromConfig } from '../daemon/models.js';
import type { Config, ModelConfig, ModelProvider } from '../config/index.js';
import type { ToolRegistry } from '../tools/registry.js';
import type { ToolExecutor } from '../tools/executor.js';
import { AgentOrchestrator, type DelegationConfig } from '../backends/native/orchestrator.js';
import type { ToolUseEvent } from '../backends/native/agent.js';
import type { MemoryStore } from '../memory/store.js';
import type { Config } from '../config/index.js';
import { summarizeSessionOnEnd, type SessionEndSummaryConfig } from '../session/endSummary.js';
export interface SessionBridgeConfig {
@@ -284,6 +285,7 @@ export class SessionBridge {
tool_summarisation: config?.agents.delegation.tool_summarisation ?? 'fast',
complex_reasoning: config?.agents.delegation.complex_reasoning ?? 'complex',
};
const backgroundModelOverrides = this.buildBackgroundModelOverrides();
agent = new AgentOrchestrator({
modelRouter: this.config.modelClient as ModelRouter,
@@ -293,6 +295,7 @@ export class SessionBridge {
toolExecutor: this.config.toolExecutor,
primaryTier,
delegation: delegationConfig,
backgroundModelOverrides,
maxDelegationDepth: config?.agents.max_delegation_depth ?? 3,
maxIterations: config?.agents.max_iterations,
compaction: config?.compaction.enabled ? {
@@ -337,4 +340,77 @@ export class SessionBridge {
}
return agent;
}
private buildBackgroundModelOverrides(): Partial<Record<keyof DelegationConfig, {
client: ModelClient;
label: string;
fallbackTier: ModelTier;
}>> {
const runtimeConfig = this.config.config;
const overrides: Partial<Record<keyof DelegationConfig, {
client: ModelClient;
label: string;
fallbackTier: ModelTier;
}>> = {};
if (!runtimeConfig) {
return overrides;
}
const providerConfigs = this.buildProviderConfigMap(runtimeConfig);
const configured = runtimeConfig.agents?.background_models ?? {};
const tasks: Array<keyof DelegationConfig> = [
'compaction',
'memory_extraction',
'classification',
'tool_summarisation',
'complex_reasoning',
];
for (const task of tasks) {
const entry = configured[task];
if (!entry || entry.enabled === false) {
continue;
}
const template = providerConfigs[entry.provider];
try {
const client = createClientFromConfig(
template
? { ...template, provider: entry.provider, model: entry.model }
: { provider: entry.provider, model: entry.model },
);
overrides[task] = {
client,
label: `${entry.provider}/${entry.model}`,
fallbackTier: entry.fallback_tier,
};
} catch (error) {
console.warn(
`[Flynn:gateway] Failed to initialize background model override for ${task} ` +
`(${entry.provider}/${entry.model}): ${error instanceof Error ? error.message : String(error)}`,
);
}
}
return overrides;
}
private buildProviderConfigMap(config: Config): Partial<Record<ModelProvider, ModelConfig>> {
const providerConfigs: Partial<Record<ModelProvider, ModelConfig>> = {};
const modelConfigs: ModelConfig[] = [
config.models.default,
...(config.models.fast ? [config.models.fast] : []),
...(config.models.complex ? [config.models.complex] : []),
...(config.models.local ? [config.models.local] : []),
...Object.values(config.models.local_providers ?? {}),
];
for (const modelConfig of modelConfigs) {
providerConfigs[modelConfig.provider] = modelConfig;
if (modelConfig.fallback) {
providerConfigs[modelConfig.fallback.provider] = modelConfig.fallback;
}
}
return providerConfigs;
}
}