Sessions¶
Prerequisites: Working Memory (fact accumulation) and Concepts (Rule, Engine).
Sessions provide stateful, multi-step evaluation with snapshot support. Use sessions when you need to:
- Accumulate facts across multiple steps
- Save/restore state for recovery
- Isolate rule evaluation in separate execution contexts
Creating and using a session¶
Create a session via RuleService, then accumulate facts and evaluate:
# python skip
from fluxrules import Rule
from fluxrules.services.rule_service import RuleService
# Create service and add rules (demonstration - requires service layer setup)
service = RuleService.create()
rules = [
Rule(
name="verify_kyc",
condition_dsl={"type": "condition", "field": "kyc_status", "op": "==", "value": "verified"},
action="proceed_to_payment",
),
Rule(
name="check_amount",
condition_dsl={"type": "condition", "field": "amount", "op": ">", "value": 10000},
action="require_approval",
),
]
# For stateful workflows, use sessions:
# session = service.create_session()
# session.add_fact("kyc_status", "verified")
# session.add_fact("amount", 15000)
# result = session.evaluate()
# print(f"Actions: {result.actions}") # ["proceed_to_payment", "require_approval"]
Key point: Sessions accumulate facts. You evaluate once against all accumulated facts, not after each add_fact().
Session lifecycle¶
A session has these phases:
- Create -
service.create_session()initializes an empty session - Accumulate -
add_fact(),add_facts(),remove_fact(),clear_facts() - Evaluate -
evaluate()matches rules against accumulated facts - Save -
save()exports to JSON snapshot - Restore -
EvaluationSession.restore(json, service)reconstructs from snapshot
Evaluations are independent - each evaluate() is stateless. The session remembers facts but not evaluation history.
# python skip
# Multiple evaluations with different facts (demonstration)
# session.add_fact("risk_score", 50)
# result1 = session.evaluate()
#
# session.remove_fact("risk_score")
# session.add_fact("risk_score", 80)
# result2 = session.evaluate() # Different result due to updated fact
Snapshot: save and restore¶
Serialize a session to JSON for checkpointing or recovery:
# python skip
# Checkpoint current state (demonstration - requires session object)
# snapshot = session.save() # Returns JSON string
#
# Later: restore in a new process/thread
# restored = type(session).restore(snapshot, service)
# result = restored.evaluate()
#
# The restored session has the same facts and metadata
print(restored.facts) # Same as original session
Snapshots include: - execution_id - unique session identifier - facts - all accumulated fact key-value pairs - timestamp - when the snapshot was created - metadata - optional custom data (application-specific)
Use snapshots to: - Pause workflows - save after step 1, restore in step 2 - Recover failures - restart from a known state - Audit trail - keep JSON copies of evaluation context
Isolation¶
Each session is isolated. Facts in one session do not affect another:
# python skip
# Session isolation demonstration (requires service setup)
# session1 = service.create_session()
# session1.add_fact("user_type", "premium")
#
# session2 = service.create_session()
# session2.add_fact("user_type", "basic")
#
# result1 = session1.evaluate() # Evaluates with "premium"
# result2 = session2.evaluate() # Evaluates with "basic"
# # No cross-contamination
Use sessions to evaluate the same ruleset independently for different users, transactions, or workflows.
Next Steps¶
- Working Memory - See Working Memory for fact store details
- Example - See Example 12: API Usage for session patterns in HTTP services
- Persistence - See Persistence for database integration