feat(models): add background task model override config and runtime wiring
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import type { ModelRouter, ModelTier } from '../../models/router.js';
|
||||
import type { ChatRequest, Message, TokenUsage } from '../../models/types.js';
|
||||
import type { ChatRequest, Message, ModelClient, TokenUsage } from '../../models/types.js';
|
||||
import type { Session } from '../../session/index.js';
|
||||
import type { ToolRegistry } from '../../tools/registry.js';
|
||||
import type { ToolExecutor } from '../../tools/executor.js';
|
||||
@@ -22,6 +22,7 @@ import { CONTEXT_CHECKPOINT_PROMPT, MEMORY_EXTRACTION_PROMPT } from './prompts.j
|
||||
/** A single-turn, stateless request to a sub-agent at a specific tier. */
|
||||
export interface SubAgentRequest {
|
||||
tier: ModelTier;
|
||||
task?: keyof DelegationConfig;
|
||||
systemPrompt: string;
|
||||
message: string;
|
||||
maxTokens?: number;
|
||||
@@ -106,6 +107,12 @@ export interface OrchestratorConfig {
|
||||
primaryTier: ModelTier;
|
||||
/** Which tier to use for each delegation task type. */
|
||||
delegation: DelegationConfig;
|
||||
/** Optional direct provider/model overrides for specific delegation task types. */
|
||||
backgroundModelOverrides?: Partial<Record<keyof DelegationConfig, {
|
||||
client: ModelClient;
|
||||
label: string;
|
||||
fallbackTier: ModelTier;
|
||||
}>>;
|
||||
/** Maximum nesting depth for delegation calls (safety guard). */
|
||||
maxDelegationDepth: number;
|
||||
onToolUse?: (event: ToolUseEvent) => void;
|
||||
@@ -157,6 +164,11 @@ export class AgentOrchestrator {
|
||||
private _agent: NativeAgent;
|
||||
private _modelRouter: ModelRouter;
|
||||
private _delegation: DelegationConfig;
|
||||
private _backgroundModelOverrides: Partial<Record<keyof DelegationConfig, {
|
||||
client: ModelClient;
|
||||
label: string;
|
||||
fallbackTier: ModelTier;
|
||||
}>>;
|
||||
private _maxDelegationDepth: number;
|
||||
private _toolRegistry?: ToolRegistry;
|
||||
private _session?: Session;
|
||||
@@ -185,6 +197,7 @@ export class AgentOrchestrator {
|
||||
constructor(config: OrchestratorConfig) {
|
||||
this._modelRouter = config.modelRouter;
|
||||
this._delegation = config.delegation;
|
||||
this._backgroundModelOverrides = config.backgroundModelOverrides ?? {};
|
||||
this._maxDelegationDepth = config.maxDelegationDepth;
|
||||
this._toolRegistry = config.toolRegistry;
|
||||
this._session = config.session;
|
||||
@@ -262,6 +275,30 @@ export class AgentOrchestrator {
|
||||
chatRequest.tools = this._toolRegistry.filteredToAnthropicFormat(policyContext);
|
||||
}
|
||||
|
||||
const override = request.task ? this._backgroundModelOverrides[request.task] : undefined;
|
||||
if (override) {
|
||||
try {
|
||||
const response = await override.client.chat(chatRequest);
|
||||
this._trackUsage(tier, response.usage);
|
||||
console.log(
|
||||
`[Flynn:delegate] task=${request.task} provider_model=${override.label} fallback_tier=${override.fallbackTier} ` +
|
||||
`tokens=${response.usage.inputTokens}+${response.usage.outputTokens}`,
|
||||
);
|
||||
return {
|
||||
content: response.content,
|
||||
usage: response.usage,
|
||||
tier,
|
||||
};
|
||||
} catch (error) {
|
||||
const message = error instanceof Error ? error.message : String(error);
|
||||
console.warn(
|
||||
`[Flynn:delegate] task=${request.task} provider/model override failed (${override.label}): ${message}; ` +
|
||||
`falling back to tier='${override.fallbackTier}'`,
|
||||
);
|
||||
tier = override.fallbackTier;
|
||||
}
|
||||
}
|
||||
|
||||
const response = await this._modelRouter.chat(chatRequest, tier);
|
||||
|
||||
// Track cumulative usage for this tier
|
||||
@@ -645,6 +682,7 @@ export class AgentOrchestrator {
|
||||
try {
|
||||
const extractionTier = this.getDelegationTier('memory_extraction');
|
||||
const extraction = await this.delegate({
|
||||
task: 'memory_extraction',
|
||||
tier: extractionTier,
|
||||
systemPrompt: MEMORY_EXTRACTION_PROMPT,
|
||||
message: this._buildExtractionInput(userMessage, assistantText, toolCallsInRun),
|
||||
@@ -861,6 +899,7 @@ export class AgentOrchestrator {
|
||||
try {
|
||||
const tier = this.getDelegationTier('compaction');
|
||||
const result = await this.delegate({
|
||||
task: 'compaction',
|
||||
tier,
|
||||
systemPrompt: CONTEXT_CHECKPOINT_PROMPT,
|
||||
message: conversation,
|
||||
|
||||
Reference in New Issue
Block a user