@@ -29,7 +29,7 @@ namespace DotCraft.Agents;
2929public sealed class AgentFactory : IAsyncDisposable
3030{
3131 private readonly AppConfig _config ;
32- private readonly IChatClient _chatClient ;
32+ private readonly IChatClient ? _chatClientOverride ;
3333 private readonly ConcurrentDictionary < string , TokenTracker > _tokenTrackers = new ( ) ;
3434 private readonly ConcurrentDictionary < CompactionPipelineKey , CompactionPipeline > _compactionPipelines = new ( ) ;
3535 private readonly TraceCollector ? _traceCollector ;
@@ -42,6 +42,8 @@ public sealed class AgentFactory : IAsyncDisposable
4242 private readonly IRemoteToolHostClient ? _remoteToolHostClient ;
4343 private readonly ChatClientRegistry _chatClientRegistry ;
4444 private readonly IChatClient ? _compactionChatClientOverride ;
45+ private CompactionPipeline ? _defaultCompactionPipeline ;
46+ private IMemoryConsolidator ? _defaultConsolidator ;
4547 private static readonly ConcurrentDictionary < MethodInfo , bool > StreamArgumentsOptOutCache = new ( ) ;
4648 private readonly CustomCommandLoader ? _customCommandLoader ;
4749 private readonly PlanStore ? _planStore ;
@@ -92,6 +94,7 @@ public AgentFactory(
9294 _onConsolidatorStatus = onConsolidatorStatus ;
9395 _memoryConsolidatorOverride = memoryConsolidator ;
9496 _compactionChatClientOverride = compactionChatClient ;
97+ _chatClientOverride = chatClient ;
9598 _toolDispatcher = toolDispatcher ?? new ToolDispatcher ( ) ;
9699 _remoteToolHostClient = remoteToolHostClient ;
97100 _loggerFactory = loggerFactory ?? NullLoggerFactory . Instance ;
@@ -101,67 +104,11 @@ public AgentFactory(
101104 ?? runtimeContext ? . ChatClientRegistry
102105 ?? new ChatClientRegistry ( new ModelProviderRegistry ( [ ] ) ) ;
103106
104- var mainRuntime = _chatClientRegistry . ResolveMainRuntime ( config ) ;
105- var mainModel = mainRuntime . Model ;
106- var mainCompactionConfig = ModelCatalog . ResolveCompactionConfig ( config , mainModel ) ;
107- _chatClient = chatClient ?? _chatClientRegistry . GetChatClient ( mainRuntime ) ;
108- var consolidationRuntime = _chatClientRegistry . ResolveConsolidationRuntime (
109- config ,
110- mainRuntime . ProviderId ,
111- mainModel ) ;
112- var maintenanceMainChatClient = ProviderChatClientAdapters . CreateRequestAdaptedClient (
113- _chatClient ,
114- config ,
115- mainRuntime ,
116- useDefaultReasoning : false ) ;
117- var consolidationChatClient = chatClient ?? _chatClientRegistry . GetChatClient ( consolidationRuntime ) ;
118- var legacyConsolidator = new MemoryConsolidator (
119- ProviderChatClientAdapters . CreateRequestAdaptedClient (
120- consolidationChatClient ,
121- config ,
122- consolidationRuntime ,
123- useDefaultReasoning : false ) ,
124- memoryStore ,
125- onConsolidatorStatus ) ;
126- Consolidator = _memoryConsolidatorOverride
127- ?? new MemoryForkConsolidator (
128- new MaintenanceForkRunner (
129- maintenanceMainChatClient ,
130- cacheOptions : new MaintenanceForkCacheOptions (
131- mainRuntime . Protocol ,
132- _config . PromptCaching ,
133- mainModel ) ) ,
134- legacyConsolidator ,
135- memoryStore ,
136- mainModel ,
137- consolidationRuntime . Model ,
138- mainCompactionConfig . BlockingLimit ( ) ,
139- workspacePath ) ;
140-
141- CompactionPipeline = new CompactionPipeline (
142- mainCompactionConfig ,
143- ProviderChatClientAdapters . CreateRequestAdaptedClient (
144- _compactionChatClientOverride ?? _chatClient ,
145- config ,
146- mainRuntime ,
147- useDefaultReasoning : false ) ,
148- _traceCollector ,
149- new MaintenanceForkCacheOptions (
150- mainRuntime . Protocol ,
151- _config . PromptCaching ,
152- mainModel ) ,
153- runtimeContext ? . Contributions ,
154- logger : _logger ) ;
155-
156- // Build the source-neutral runtime context.
157107 _runtimeContext = runtimeContext ?? new AgentRuntimeContext
158108 {
159109 Config = config ,
160- ChatClient = _chatClient ,
110+ ChatClient = chatClient ,
161111 ChatClientRegistry = _chatClientRegistry ,
162- EffectiveProviderId = mainRuntime . ProviderId ,
163- EffectiveProviderProtocol = mainRuntime . Protocol ,
164- EffectiveMainModel = mainModel ,
165112 WorkspacePath = workspacePath ,
166113 BotPath = dotcraftPath ,
167114 MemoryStore = memoryStore ,
@@ -260,7 +207,8 @@ await source.ReleaseRetiredThreadResourcesAsync(threadId, cancellationToken)
260207 /// <summary>
261208 /// Gets the layered context-compaction pipeline (auto / reactive / manual).
262209 /// </summary>
263- public CompactionPipeline CompactionPipeline { get ; }
210+ public CompactionPipeline CompactionPipeline =>
211+ _defaultCompactionPipeline ??= GetCompactionPipeline ( string . Empty ) ;
264212
265213 /// <summary>
266214 /// Gets the context-compaction pipeline for a thread's effective main model.
@@ -289,6 +237,7 @@ public CompactionPipeline GetCompactionPipeline(
289237 var ( factory , resolvedConfig , config ) = state ;
290238 var runtime = pipelineKey . ToRuntime ( ) ;
291239 var baseChatClient = factory . _compactionChatClientOverride
240+ ?? factory . _chatClientOverride
292241 ?? factory . _chatClientRegistry . GetChatClient ( runtime ) ;
293242 return new CompactionPipeline (
294243 resolvedConfig ,
@@ -327,7 +276,7 @@ public CompactionPipeline GetCompactionPipeline(
327276 mainRuntime . Model ) ;
328277 var fallback = new MemoryConsolidator (
329278 ProviderChatClientAdapters . CreateRequestAdaptedClient (
330- _chatClientRegistry . GetChatClient ( consolidationRuntime ) ,
279+ _chatClientOverride ?? _chatClientRegistry . GetChatClient ( consolidationRuntime ) ,
331280 config ,
332281 consolidationRuntime ,
333282 useDefaultReasoning : false ) ,
@@ -337,7 +286,7 @@ public CompactionPipeline GetCompactionPipeline(
337286 return new MemoryForkConsolidator (
338287 new MaintenanceForkRunner (
339288 ProviderChatClientAdapters . CreateRequestAdaptedClient (
340- _chatClientRegistry . GetChatClient ( mainRuntime ) ,
289+ _chatClientOverride ?? _chatClientRegistry . GetChatClient ( mainRuntime ) ,
341290 config ,
342291 mainRuntime ,
343292 useDefaultReasoning : false ) ,
@@ -362,7 +311,8 @@ public CompactionPipeline GetCompactionPipeline(
362311 /// Session Core drives consolidation independently from context
363312 /// compaction, using completed thread history as input.
364313 /// </summary>
365- public IMemoryConsolidator ? Consolidator { get ; }
314+ public IMemoryConsolidator ? Consolidator =>
315+ _defaultConsolidator ??= CreateConsolidatorForRuntime ( _config , null , null ) ;
366316
367317 /// <summary>
368318 /// Gets or creates a token tracker for the specified session.
@@ -386,7 +336,7 @@ public TokenTracker GetOrCreateTokenTracker(string sessionKey)
386336 public void RemoveTokenTracker ( string sessionKey )
387337 {
388338 _tokenTrackers . TryRemove ( sessionKey , out _ ) ;
389- CompactionPipeline . Forget ( sessionKey ) ;
339+ _defaultCompactionPipeline ? . Forget ( sessionKey ) ;
390340 foreach ( var pair in _compactionPipelines . Where ( pair =>
391341 string . Equals ( pair . Key . SessionKey , sessionKey , StringComparison . Ordinal ) ) . ToArray ( ) )
392342 {
@@ -713,7 +663,10 @@ when string.Equals(
713663 }
714664 }
715665 } ;
716- var chatClientBuilder = new ChatClientBuilder ( ctx . ChatClient ) ;
666+ var baseChatClient = ctx . ChatClient
667+ ?? _chatClientOverride
668+ ?? _chatClientRegistry . GetChatClient ( runtime ) ;
669+ var chatClientBuilder = new ChatClientBuilder ( baseChatClient ) ;
717670 var isNativeSubAgent = ctx . CurrentThreadSource ? . SubAgent is { } subAgentSource
718671 && string . Equals (
719672 subAgentSource . RuntimeType ,
0 commit comments