Coverage for /home/admin/Documents/AI/applications/lexigram-dev/lexigram/experimental/ai/lexigram-ai-skills/src/lexigram/ai/skills/module.py: 87%

15 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-25 07:19 +0800

1"""SkillsModule — convenience façade for integrating the skills subsystem.""" 

2 

3from __future__ import annotations 

4 

5from typing import TYPE_CHECKING, Any 

6 

7from lexigram.contracts.ai.skills import SkillExecutorProtocol 

8from lexigram.di.module import DynamicModule, Module, module 

9 

10if TYPE_CHECKING: 

11 from lexigram.ai.skills.config import SkillsConfig 

12 

13 

14@module() 

15class SkillsModule(Module): 

16 """Application-level façade for the skills subsystem. 

17 

18 Provides a ``configure`` factory that creates a pre-configured 

19 :class:`SkillsProvider` ready for registration with the application 

20 container. 

21 

22 Usage:: 

23 

24 from lexigram.ai.skills import SkillsModule 

25 from lexigram.ai.skills.config import SkillsConfig 

26 

27 @module( 

28 imports=[SkillsModule.configure( 

29 SkillsConfig( 

30 enable_builtin=True, 

31 builtin_skills=["current_datetime", "math_calculate"], 

32 ) 

33 )] 

34 ) 

35 class AppModule(Module): 

36 pass 

37 """ 

38 

39 @classmethod 

40 def configure( 

41 cls, 

42 config: SkillsConfig | None = None, 

43 enable_tool_bridge: bool = False, 

44 **kwargs: Any, 

45 ) -> DynamicModule: 

46 """Create a SkillsModule with explicit configuration. 

47 

48 Args: 

49 config: :class:`SkillsConfig` or ``None`` to use defaults. 

50 enable_tool_bridge: Register the tool-bridge adapter so agent tool 

51 registries can invoke skills as first-class tools. Defaults to 

52 ``False``. 

53 **kwargs: Additional keyword arguments forwarded to 

54 :class:`SkillsProvider`. 

55 

56 Returns: 

57 A :class:`~lexigram.di.module.DynamicModule` descriptor. 

58 """ 

59 from lexigram.ai.skills.di.provider import SkillsProvider 

60 

61 return DynamicModule( 

62 module=cls, 

63 providers=[ 

64 SkillsProvider( 

65 config=config, 

66 enable_tool_bridge=enable_tool_bridge, 

67 **kwargs, 

68 ) 

69 ], 

70 exports=[ 

71 SkillExecutorProtocol, 

72 ], 

73 ) 

74 

75 @classmethod 

76 def stub(cls, config: SkillsConfig | None = None) -> DynamicModule: 

77 """Create a SkillsModule suitable for unit and integration testing. 

78 

79 Uses in-memory or no-op skill implementations with minimal side 

80 effects. Built-in skill registration is disabled by default to keep 

81 the test container lightweight. 

82 

83 Args: 

84 config: Optional :class:`SkillsConfig` override. Uses safe test 

85 defaults when ``None``. 

86 

87 Returns: 

88 A :class:`~lexigram.di.module.DynamicModule` descriptor. 

89 """ 

90 from lexigram.ai.skills.di.provider import SkillsProvider 

91 

92 return DynamicModule( 

93 module=cls, 

94 providers=[SkillsProvider(config=config, enable_tool_bridge=False)], 

95 exports=[ 

96 SkillExecutorProtocol, 

97 ], 

98 ) 

99 

100 

101__all__ = ["SkillsModule"]