@@ -278,6 +278,7 @@ async def build_from_config(config_path: str) -> Any:
278278 TaskConfig as ACTaskConfig ,
279279 ConfidenceThresholds as ACThresholds ,
280280 )
281+ from apprentice .plugin_registry import PluginRegistrySet
281282 from apprentice .audit_log import AuditConfig , JsonLinesAuditLogger
282283 from apprentice .budget_manager import BudgetConfig , BudgetManager , PeriodLimit , PeriodType
283284 from apprentice .confidence_engine import ConfidenceEngine , ConfidenceEngineConfig
@@ -306,6 +307,14 @@ async def build_from_config(config_path: str) -> Any:
306307 # 1. Load validated config
307308 cfg = config_loader .load_config (Path (config_path ))
308309
310+ # 1.5. Construct Plugin Registry
311+ plugin_registry_set = PluginRegistrySet .with_defaults ()
312+ if cfg .plugins :
313+ plugin_registry_set .register_from_config (
314+ {domain : {name : {"factory" : entry .factory } for name , entry in plugins .items ()}
315+ for domain , plugins in cfg .plugins .items ()}
316+ )
317+
309318 # 2. Create directories
310319 base_dir = Path (".apprentice" )
311320 base_dir .mkdir (parents = True , exist_ok = True )
@@ -551,5 +560,41 @@ async def build_from_config(config_path: str) -> Any:
551560 apprentice ._ft_version_store = ft_version_store
552561 apprentice ._model_validator = model_validator
553562 apprentice ._real_config = cfg
563+ apprentice ._plugin_registry_set = plugin_registry_set
564+
565+ # Construct middleware pipeline if configured
566+ if cfg .middleware :
567+ from apprentice .middleware import MiddlewarePipeline
568+ middleware_registry = plugin_registry_set .get_registry ("middleware" )
569+ apprentice ._middleware_pipeline = MiddlewarePipeline .from_config (
570+ cfg .middleware , middleware_registry ,
571+ )
572+ else :
573+ apprentice ._middleware_pipeline = None
574+
575+ # Construct feedback collector if configured
576+ if cfg .feedback and cfg .feedback .enabled :
577+ from apprentice .feedback_collector import FeedbackCollector
578+ apprentice ._feedback_collector = FeedbackCollector (
579+ storage_dir = cfg .feedback .storage_dir ,
580+ enabled = True ,
581+ )
582+ else :
583+ apprentice ._feedback_collector = None
584+
585+ # Construct observer if configured
586+ if cfg .observer and cfg .observer .enabled :
587+ from apprentice .observer import Observer , ObserverConfig as ObsCfg
588+ apprentice ._observer = Observer (ObsCfg (
589+ enabled = True ,
590+ context_window_size = cfg .observer .context_window_size ,
591+ shadow_recommendation_rate = cfg .observer .shadow_recommendation_rate ,
592+ min_context_before_recommending = cfg .observer .min_context_before_recommending ,
593+ ))
594+ else :
595+ apprentice ._observer = None
596+
597+ # Store mode
598+ apprentice ._mode = cfg .mode
554599
555600 return apprentice
0 commit comments