All feature modules in PraisonAIUI implement a Protocol ABC pattern for type-safe, swappable backends.
| File | Protocol | SDK Class | Fallback | Getter |
|------|----------|-----------|----------|--------|
| guardrails.py | GuardrailProtocol | SDKGuardrailManager | SimpleGuardrailManager | get_guardrail_manager() |
guardrails.py
GuardrailProtocol
SDKGuardrailManager
SimpleGuardrailManager
get_guardrail_manager()
| tracing.py | TracingProtocol | SDKTracingManager | SimpleTracingManager | get_tracing_manager() |
tracing.py
TracingProtocol
SDKTracingManager
SimpleTracingManager
get_tracing_manager()
| eval.py | EvalProtocol | SDKEvalManager | SimpleEvalManager | get_eval_manager() |
eval.py
EvalProtocol
SDKEvalManager
SimpleEvalManager
get_eval_manager()
| approvals.py | ApprovalProtocol | SDKApprovalManager | SimpleApprovalManager | get_approval_manager() |
approvals.py
ApprovalProtocol
SDKApprovalManager
SimpleApprovalManager
get_approval_manager()
| security.py | SecurityProtocol | SDKSecurityManager | SimpleSecurityManager | get_security_manager() |
security.py
SecurityProtocol
SDKSecurityManager
SimpleSecurityManager
get_security_manager()
| telemetry.py | TelemetryProtocol | SDKTelemetryManager | SimpleTelemetryManager | get_telemetry_manager() |
telemetry.py
TelemetryProtocol
SDKTelemetryManager
SimpleTelemetryManager
get_telemetry_manager()
| jobs.py | JobStoreProtocol | SDKJobStore | SimpleJobStore | get_job_store() |
jobs.py
JobStoreProtocol
SDKJobStore
SimpleJobStore
get_job_store()
| agents.py | AgentRegistryProtocol | SDKAgentRegistry | SimpleAgentRegistry | get_agent_registry() |
agents.py
AgentRegistryProtocol
SDKAgentRegistry
SimpleAgentRegistry
get_agent_registry()
| File | Protocol | Notes |
|------|----------|-------|
| sessions_ext.py | SessionProtocol | Formalized existing SDK-first pattern |
sessions_ext.py
SessionProtocol
| schedules.py | ScheduleProtocol | Formalized existing SDK-first pattern |
schedules.py
ScheduleProtocol
| channels.py | ChannelProtocol | SDK gap: no channel management API |
channels.py
ChannelProtocol
| usage.py | UsageProtocol | SDK gap: no token/cost tracking API |
usage.py
UsageProtocol
| logs.py | LogProtocol | UI-only by design |
logs.py
LogProtocol
| auth.py | AuthProtocol | SDK gap: no auth API |
auth.py
AuthProtocol
| config_runtime.py | ConfigProtocol | UI-only by design |
config_runtime.py
ConfigProtocol
| nodes.py | NodeProtocol | SDK gap: no node/cluster API |
nodes.py
NodeProtocol
| memory.py | MemoryProtocol | P0 fix: SDK-first default |
memory.py
MemoryProtocol
| skills.py | BaseFeatureProtocol | P1 fix: get_tool_catalog() |
skills.py
BaseFeatureProtocol
get_tool_catalog()
Features where praisonaiagents SDK lacks backend support:
praisonaiagents
| Feature | Gap | Recommendation |
|---------|-----|----------------|
| Usage | No token/cost tracking API | Add UsageTracker to praisonaiagents.telemetry |
UsageTracker
praisonaiagents.telemetry
| Auth | No authentication module | Add praisonaiagents.auth with key/session persistence |
praisonaiagents.auth
| Nodes | No node/cluster management | Add praisonaiagents.nodes for node discovery |
praisonaiagents.nodes
| Channels | No channel management API | Add praisonaiagents.channels with ChannelStore |
praisonaiagents.channels
ChannelStore
| Config | No runtime config persistence | Add praisonaiagents.config with file-backed store |
praisonaiagents.config
All feature classes MUST follow the {Name}Feature pattern:
{Name}Feature
| ✅ Correct | ❌ Incorrect |
|-----------|------------|
| SchedulesFeature | PraisonAISchedules |
SchedulesFeature
PraisonAISchedules
| KnowledgeFeature | PraisonAIKnowledge |
KnowledgeFeature
PraisonAIKnowledge
| AgentsCrudFeature | PraisonAIAgentsFeature |
AgentsCrudFeature
PraisonAIAgentsFeature
| MemoryFeature | PraisonAIMemory |
MemoryFeature
PraisonAIMemory
1. Class name: {Name}Feature — PascalCase, ends with Feature
Feature
2. feature_name: lowercase_snake — this is the registry key, never change it
feature_name
lowercase_snake
3. Module file: {name}.py — matches feature_name
{name}.py
4. Backward-compat aliases: old PraisonAI{Name} names are kept as aliases
PraisonAI{Name}