Coverage for /home/admin/Documents/AI/applications/lexigram-dev/lexigram/experimental/ai/lexigram-ai-prompt/src/lexigram/ai/prompt/module.py: 87%
15 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 07:19 +0800
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 07:19 +0800
1"""Prompt module for Lexigram."""
3from __future__ import annotations
5from typing import TYPE_CHECKING, Any
7from lexigram.contracts.ai.llm import PromptTemplateProtocol
8from lexigram.di.module import DynamicModule, Module, module
10if TYPE_CHECKING:
11 from lexigram.ai.prompt.config import PromptConfig
14@module()
15class PromptModule(Module):
16 """Prompt template management and rendering integration.
18 Registers the :class:`~lexigram.ai.prompt.di.provider.PromptProvider`
19 which wires a :class:`~lexigram.ai.prompt.registry.registry.PromptRegistry`
20 into the container and exposes it as
21 :class:`~lexigram.contracts.ai.llm.PromptTemplateProtocol`.
23 Usage::
25 from lexigram.ai.prompt import PromptModule
26 from lexigram.ai.prompt.config import PromptConfig
28 @module(
29 imports=[
30 PromptModule.configure(
31 PromptConfig(default_format="jinja2")
32 )
33 ]
34 )
35 class AppModule(Module):
36 pass
38 Error Handling::
40 Prompt rendering and registry lookups surface typed exceptions that
41 can be caught directly or handled via the Result pattern::
43 from lexigram.ai.prompt.exceptions import (
44 PromptError, # base — catch-all
45 PromptRenderError, # template rendering failure
46 PromptValidationError,# variable type / value validation
47 PromptNotFoundError, # named template not in registry
48 PromptVersionError, # version conflict or invalid rollback
49 )
51 Exports:
52 :class:`~lexigram.contracts.ai.llm.PromptTemplateProtocol`,
53 :class:`~lexigram.ai.prompt.exceptions.PromptError`,
54 :class:`~lexigram.ai.prompt.exceptions.PromptRenderError`,
55 :class:`~lexigram.ai.prompt.exceptions.PromptValidationError`,
56 :class:`~lexigram.ai.prompt.exceptions.PromptNotFoundError`,
57 :class:`~lexigram.ai.prompt.exceptions.PromptVersionError`
58 """
60 @classmethod
61 def configure(
62 cls, config: PromptConfig | None = None, **kwargs: Any
63 ) -> DynamicModule:
64 """Create a PromptModule with explicit configuration.
66 Args:
67 config: :class:`~lexigram.ai.prompt.config.PromptConfig` or ``None``
68 to use defaults.
69 **kwargs: Additional keyword arguments forwarded to
70 :class:`~lexigram.ai.prompt.di.provider.PromptProvider`.
72 Returns:
73 A :class:`~lexigram.di.module.DynamicModule` descriptor.
74 """
75 from lexigram.ai.prompt.di.provider import PromptProvider
77 return DynamicModule(
78 module=cls,
79 providers=[PromptProvider(config=config, **kwargs)],
80 exports=[
81 PromptTemplateProtocol,
82 ],
83 )
85 @classmethod
86 def stub(cls, config: PromptConfig | None = None) -> DynamicModule:
87 """Create a PromptModule suitable for unit and integration testing.
89 Uses in-memory or no-op implementations with minimal side effects.
91 Args:
92 config: Optional config override. Uses safe test defaults when None.
94 Returns:
95 A :class:`~lexigram.di.module.DynamicModule` descriptor.
96 """
97 from lexigram.ai.prompt.di.provider import PromptProvider
99 return DynamicModule(
100 module=cls,
101 providers=[PromptProvider(config=config)],
102 exports=[
103 PromptTemplateProtocol,
104 ],
105 )
108__all__ = ["PromptModule"]