instiller¶
Full name: tenets.core.instiller.instiller
instiller¶
Instiller module - Orchestrates intelligent tenet injection into context.
This module provides the main Instiller class that manages the injection of guiding principles (tenets) into generated context. It supports various injection strategies including: - Always inject - Periodic injection (every Nth time) - Adaptive injection based on context complexity - Session-aware smart injection
The instiller tracks injection history, analyzes context complexity using NLP components, and adapts injection frequency based on session patterns.
Classes¶
InjectionHistorydataclass¶
InjectionHistory(
session_id: str,
total_distills: int = 0,
total_injections: int = 0,
last_injection: Optional[datetime] = None,
last_injection_index: int = 0,
complexity_scores: List[float] = list(),
injected_tenets: Set[str] = set(),
reinforcement_count: int = 0,
system_instruction_injected: bool = False,
created_at: datetime = datetime.now(),
updated_at: datetime = datetime.now(),
)
Track injection history for a session.
| ATTRIBUTE | DESCRIPTION |
|---|---|
session_id | Session identifier TYPE: |
total_distills | Total number of distill operations TYPE: |
total_injections | Total number of tenet injections TYPE: |
last_injection | Timestamp of last injection |
last_injection_index | Index of last injection (for periodic) TYPE: |
complexity_scores | List of context complexity scores |
injected_tenets | Set of tenet IDs that have been injected |
reinforcement_count | Count of reinforcement injections TYPE: |
created_at | When this history was created TYPE: |
updated_at | Last update timestamp TYPE: |
Methods:¶
should_inject¶
should_inject(
frequency: str,
interval: int,
complexity: float,
complexity_threshold: float,
min_session_length: int,
) -> Tuple[bool, str]
Determine if tenets should be injected.
| PARAMETER | DESCRIPTION |
|---|---|
frequency | Injection frequency mode TYPE: |
interval | Injection interval for periodic mode TYPE: |
complexity | Current context complexity score TYPE: |
complexity_threshold | Threshold for complexity-based injection TYPE: |
min_session_length | Minimum session length before injection TYPE: |
| RETURNS | DESCRIPTION |
|---|---|
Tuple[bool, str] | Tuple of (should_inject, reason) |
Source code in tenets/core/instiller/instiller.py
def should_inject(
self,
frequency: str,
interval: int,
complexity: float,
complexity_threshold: float,
min_session_length: int,
) -> Tuple[bool, str]:
"""Determine if tenets should be injected.
Args:
frequency: Injection frequency mode
interval: Injection interval for periodic mode
complexity: Current context complexity score
complexity_threshold: Threshold for complexity-based injection
min_session_length: Minimum session length before injection
Returns:
Tuple of (should_inject, reason)
"""
# Always inject mode
if frequency == "always":
return True, "always_mode"
# Manual mode - never auto-inject
if frequency == "manual":
return False, "manual_mode"
# Periodic injection
if frequency == "periodic":
if self.total_distills % interval == 0 and self.total_distills > 0:
return True, f"periodic_interval_{interval}"
return False, f"not_at_interval_{self.total_distills % interval}/{interval}"
# Adaptive injection
if frequency == "adaptive":
# Special case: first distill with high complexity gets injection
# This ensures important context is established early
if self.total_distills == 1 and self.total_injections == 0:
if complexity >= complexity_threshold:
return True, "first_distill_in_session"
# After first distill, respect minimum session length
if self.total_distills < min_session_length:
return False, f"session_too_short_{self.total_distills}/{min_session_length}"
# Complexity-based injection
if complexity >= complexity_threshold:
# Check if we've injected recently
if self.last_injection:
time_since_last = datetime.now() - self.last_injection
if time_since_last < timedelta(minutes=5):
return False, "injected_recently"
return True, f"high_complexity_{complexity:.2f}"
# Check for reinforcement interval
if self.total_injections > 0:
injections_since_last = self.total_distills - self.last_injection_index
if injections_since_last >= interval * 2: # Double interval for adaptive
return True, f"reinforcement_needed_{injections_since_last}"
return False, "no_injection_criteria_met"
record_injection¶
Record that an injection occurred.
| PARAMETER | DESCRIPTION |
|---|---|
tenets | List of tenets that were injected |
complexity | Complexity score of the context TYPE: |
Source code in tenets/core/instiller/instiller.py
def record_injection(self, tenets: List[Tenet], complexity: float) -> None:
"""Record that an injection occurred.
Args:
tenets: List of tenets that were injected
complexity: Complexity score of the context
"""
self.total_injections += 1
self.last_injection = datetime.now()
self.last_injection_index = self.total_distills
self.complexity_scores.append(complexity)
for tenet in tenets:
self.injected_tenets.add(tenet.id)
self.updated_at = datetime.now()
get_stats¶
Get injection statistics for this session.
| RETURNS | DESCRIPTION |
|---|---|
Dict[str, Any] | Dictionary of statistics |
Source code in tenets/core/instiller/instiller.py
def get_stats(self) -> Dict[str, Any]:
"""Get injection statistics for this session.
Returns:
Dictionary of statistics
"""
avg_complexity = (
sum(self.complexity_scores) / len(self.complexity_scores)
if self.complexity_scores
else 0.0
)
injection_rate = (
self.total_injections / self.total_distills if self.total_distills > 0 else 0.0
)
return {
"session_id": self.session_id,
"total_distills": self.total_distills,
"total_injections": self.total_injections,
"injection_rate": injection_rate,
"average_complexity": avg_complexity,
"unique_tenets_injected": len(self.injected_tenets),
"reinforcement_count": self.reinforcement_count,
"session_duration": (self.updated_at - self.created_at).total_seconds(),
"last_injection": self.last_injection.isoformat() if self.last_injection else None,
}
InstillationResultdataclass¶
InstillationResult(
tenets_instilled: List[Tenet],
injection_positions: List[Dict[str, Any]],
token_increase: int,
strategy_used: str,
session: Optional[str] = None,
timestamp: datetime = datetime.now(),
success: bool = True,
error_message: Optional[str] = None,
metrics: Optional[Dict[str, Any]] = None,
complexity_score: float = 0.0,
skip_reason: Optional[str] = None,
)
Result of a tenet instillation operation.
| ATTRIBUTE | DESCRIPTION |
|---|---|
tenets_instilled | List of tenets that were instilled |
injection_positions | Where tenets were injected |
token_increase | Number of tokens added TYPE: |
strategy_used | Injection strategy that was used TYPE: |
session | Session identifier if any |
timestamp | When instillation occurred TYPE: |
success | Whether instillation succeeded TYPE: |
error_message | Error message if failed |
metrics | Additional metrics from the operation |
complexity_score | Complexity score of the context TYPE: |
skip_reason | Reason if injection was skipped |
Methods:¶
to_dict¶
Convert to dictionary for serialization.
Source code in tenets/core/instiller/instiller.py
def to_dict(self) -> Dict[str, Any]:
"""Convert to dictionary for serialization."""
return {
"tenets_instilled": [t.to_dict() for t in self.tenets_instilled],
"injection_positions": self.injection_positions,
"token_increase": self.token_increase,
"strategy_used": self.strategy_used,
"session": self.session,
"timestamp": self.timestamp.isoformat(),
"success": self.success,
"error_message": self.error_message,
"metrics": self.metrics,
"complexity_score": self.complexity_score,
"skip_reason": self.skip_reason,
}
ComplexityAnalyzer¶
Analyze context complexity to guide injection decisions.
Uses NLP components to analyze: - Token count and density - Code vs documentation ratio - Keyword diversity - Structural complexity - Topic coherence
Initialize complexity analyzer.
| PARAMETER | DESCRIPTION |
|---|---|
config | Configuration object TYPE: |
Source code in tenets/core/instiller/instiller.py
def __init__(self, config: TenetsConfig):
"""Initialize complexity analyzer.
Args:
config: Configuration object
"""
self.config = config
self.logger = get_logger(__name__)
# Lazy initialization flags
self._nlp_initialized = False
self.tokenizer = None
self.keyword_extractor = None
self.semantic_analyzer = None
self.ml_available = False
Methods:¶
analyze¶
Analyze context complexity.
| PARAMETER | DESCRIPTION |
|---|---|
context | Context to analyze (string or ContextResult) TYPE: |
| RETURNS | DESCRIPTION |
|---|---|
float | Complexity score between 0 and 1 |
Source code in tenets/core/instiller/instiller.py
def analyze(self, context: Union[str, ContextResult]) -> float:
"""Analyze context complexity.
Args:
context: Context to analyze (string or ContextResult)
Returns:
Complexity score between 0 and 1
"""
# Initialize NLP components lazily on first use
if not self._nlp_initialized:
self._init_nlp_components()
self._nlp_initialized = True
if isinstance(context, ContextResult):
text = context.context
metadata = context.metadata
else:
text = context
metadata = {}
if not text:
return 0.0
scores = []
# Length-based complexity
length_score = min(1.0, len(text) / 50000) # Normalize to 50k chars
scores.append(length_score * 0.2) # 20% weight
# Token diversity
if self.tokenizer:
tokens = self.tokenizer.tokenize(text)
unique_ratio = len(set(tokens)) / max(len(tokens), 1)
diversity_score = 1.0 - unique_ratio # Higher repetition = higher complexity
scores.append(diversity_score * 0.2) # 20% weight
# Keyword density
if self.keyword_extractor:
keywords = self.keyword_extractor.extract(text, max_keywords=30)
keyword_density = len(keywords) / max(len(text.split()), 1)
scores.append(min(1.0, keyword_density * 100) * 0.2) # 20% weight
# Code vs documentation ratio
code_blocks = text.count("```")
doc_sections = text.count("#") + text.count("##")
if code_blocks + doc_sections > 0:
code_ratio = code_blocks / (code_blocks + doc_sections)
scores.append(code_ratio * 0.2) # 20% weight
else:
scores.append(0.1) # Default low complexity
# File count from metadata
if metadata.get("file_count", 0) > 10:
file_complexity = min(1.0, metadata["file_count"] / 50)
scores.append(file_complexity * 0.2) # 20% weight
else:
scores.append(0.1)
# Calculate weighted average
if scores:
complexity = sum(scores)
else:
complexity = 0.5 # Default medium complexity
return min(1.0, max(0.0, complexity))
MetricsTracker¶
Track metrics for tenet instillation.
Tracks: - Instillation counts and frequencies - Token usage and increases - Strategy effectiveness - Session-specific metrics - Tenet performance
Initialize metrics tracker.
Source code in tenets/core/instiller/instiller.py
def __init__(self):
"""Initialize metrics tracker."""
self.instillations: List[Dict[str, Any]] = []
self.session_metrics: Dict[str, Dict[str, Any]] = defaultdict(
lambda: {
"total_instillations": 0,
"total_tenets": 0,
"total_tokens": 0,
"strategies_used": defaultdict(int),
"complexity_scores": [],
}
)
self.strategy_usage: Dict[str, int] = defaultdict(int)
self.tenet_usage: Dict[str, int] = defaultdict(int)
self.skip_reasons: Dict[str, int] = defaultdict(int)
Methods:¶
record_instillation¶
record_instillation(
tenet_count: int,
token_increase: int,
strategy: str,
session: Optional[str] = None,
complexity: float = 0.0,
skip_reason: Optional[str] = None,
) -> None
Record an instillation event.
| PARAMETER | DESCRIPTION |
|---|---|
tenet_count | Number of tenets instilled TYPE: |
token_increase | Tokens added TYPE: |
strategy | Strategy used TYPE: |
session | Session identifier |
complexity | Context complexity score TYPE: |
skip_reason | Reason if skipped |
Source code in tenets/core/instiller/instiller.py
def record_instillation(
self,
tenet_count: int,
token_increase: int,
strategy: str,
session: Optional[str] = None,
complexity: float = 0.0,
skip_reason: Optional[str] = None,
) -> None:
"""Record an instillation event.
Args:
tenet_count: Number of tenets instilled
token_increase: Tokens added
strategy: Strategy used
session: Session identifier
complexity: Context complexity score
skip_reason: Reason if skipped
"""
record = {
"timestamp": datetime.now().isoformat(),
"tenet_count": tenet_count,
"token_increase": token_increase,
"strategy": strategy,
"session": session,
"complexity": complexity,
"skip_reason": skip_reason,
}
self.instillations.append(record)
if skip_reason:
self.skip_reasons[skip_reason] += 1
return
self.strategy_usage[strategy] += 1
if session:
metrics = self.session_metrics[session]
metrics["total_instillations"] += 1
metrics["total_tenets"] += tenet_count
metrics["total_tokens"] += token_increase
metrics["strategies_used"][strategy] += 1
metrics["complexity_scores"].append(complexity)
record_tenet_usage¶
Record that a tenet was used.
| PARAMETER | DESCRIPTION |
|---|---|
tenet_id | Tenet identifier TYPE: |
get_metrics¶
Get aggregated metrics.
| PARAMETER | DESCRIPTION |
|---|---|
session | Optional session filter |
| RETURNS | DESCRIPTION |
|---|---|
Dict[str, Any] | Dictionary of metrics |
Source code in tenets/core/instiller/instiller.py
def get_metrics(self, session: Optional[str] = None) -> Dict[str, Any]:
"""Get aggregated metrics.
Args:
session: Optional session filter
Returns:
Dictionary of metrics
"""
if session:
records = [r for r in self.instillations if r["session"] == session]
else:
records = [r for r in self.instillations if not r.get("skip_reason")]
if not records:
return {"message": "No instillation records found"}
total_tenets = sum(r["tenet_count"] for r in records)
total_tokens = sum(r["token_increase"] for r in records)
complexities = [r["complexity"] for r in records if r["complexity"] > 0]
metrics = {
"total_instillations": len(records),
"total_tenets_instilled": total_tenets,
"total_token_increase": total_tokens,
"avg_tenets_per_context": total_tenets / len(records) if records else 0,
"avg_token_increase": total_tokens / len(records) if records else 0,
# Round to avoid floating comparison noise in tests
"avg_complexity": round(
(sum(complexities) / len(complexities)) if complexities else 0, 1
),
"strategy_distribution": dict(self.strategy_usage),
"skip_distribution": dict(self.skip_reasons),
"top_tenets": sorted(self.tenet_usage.items(), key=lambda x: x[1], reverse=True)[:10],
}
if session:
metrics["session_specific"] = self.session_metrics.get(session, {})
return metrics
get_all_metrics¶
Get all tracked metrics for export.
Source code in tenets/core/instiller/instiller.py
def get_all_metrics(self) -> Dict[str, Any]:
"""Get all tracked metrics for export."""
return {
"instillations": self.instillations,
"session_metrics": dict(self.session_metrics),
"strategy_usage": dict(self.strategy_usage),
"tenet_usage": dict(self.tenet_usage),
"skip_reasons": dict(self.skip_reasons),
"summary": self.get_metrics(),
}
Instiller¶
Main orchestrator for tenet instillation with smart injection.
The Instiller manages the entire process of injecting tenets into context, including: - Tracking injection history per session - Analyzing context complexity - Determining optimal injection frequency - Selecting appropriate tenets - Applying injection strategies - Recording metrics and effectiveness
It supports multiple injection modes: - Always: Inject into every context - Periodic: Inject every Nth distillation - Adaptive: Smart injection based on complexity and session - Manual: Only inject when explicitly requested
Initialize the Instiller.
| PARAMETER | DESCRIPTION |
|---|---|
config | Configuration object TYPE: |
Source code in tenets/core/instiller/instiller.py
def __init__(self, config: TenetsConfig):
"""Initialize the Instiller.
Args:
config: Configuration object
"""
self.config = config
self.logger = get_logger(__name__)
# Core components
self.manager = TenetManager(config)
self.injector = TenetInjector(config.tenet.injection_config)
self.complexity_analyzer = ComplexityAnalyzer(config)
self.metrics_tracker = MetricsTracker()
# Session tracking
self.session_histories: Dict[str, InjectionHistory] = {}
# Load histories only when cache is enabled to avoid test cross-contamination
try:
if getattr(self.config.cache, "enabled", False):
self._load_session_histories()
except Exception:
pass
# Track which sessions had system instruction injected (tests expect this map)
self.system_instruction_injected: Dict[str, bool] = {}
# Do NOT seed from persisted histories: once-per-session should apply
# only within the lifetime of this Instiller instance. Persisted
# histories are still maintained for analytics but must not block
# first injection in fresh instances (tests rely on this behavior).
self._load_session_histories()
# Cache for results
self._cache: Dict[str, InstillationResult] = {}
self.logger.info("Instiller initialized with smart injection capabilities")
Methods:¶
inject_system_instruction¶
inject_system_instruction(
content: str, format: str = "markdown", session: Optional[str] = None
) -> Tuple[str, Dict[str, Any]]
Inject system instruction (system prompt) according to config.
Behavior: - If system instruction is disabled or empty, return unchanged. - If session provided and once-per-session is enabled, inject only on first distill. - If no session, inject on every distill. - Placement controlled by system_instruction_position. - Formatting controlled by system_instruction_format.
Returns modified content and metadata about injection.
Source code in tenets/core/instiller/instiller.py
def inject_system_instruction(
self,
content: str,
format: str = "markdown",
session: Optional[str] = None,
) -> Tuple[str, Dict[str, Any]]:
"""Inject system instruction (system prompt) according to config.
Behavior:
- If system instruction is disabled or empty, return unchanged.
- If session provided and once-per-session is enabled, inject only on first distill.
- If no session, inject on every distill.
- Placement controlled by system_instruction_position.
- Formatting controlled by system_instruction_format.
Returns modified content and metadata about injection.
"""
cfg = self.config.tenet
meta: Dict[str, Any] = {
"system_instruction_enabled": cfg.system_instruction_enabled,
"system_instruction_injected": False,
}
if not cfg.system_instruction_enabled or not cfg.system_instruction:
meta["reason"] = "disabled_or_empty"
return content, meta
# Session-aware check: only once per session
if session and getattr(cfg, "system_instruction_once_per_session", False):
# Respect once-per-session within this instance and, when allowed,
# across instances via persisted history.
already = self.system_instruction_injected.get(session, False)
# Only consult persisted histories when policy allows it
if not already and self._should_respect_persisted_once_per_session():
hist = self.session_histories.get(session)
already = bool(hist and getattr(hist, "system_instruction_injected", False))
if already:
meta["reason"] = "already_injected_in_session"
return content, meta
# Mark as injecting now that we've passed guards
meta["system_instruction_injected"] = True
instruction = cfg.system_instruction
formatted_instr = self._format_system_instruction(
instruction, cfg.system_instruction_format
)
# Optional label and separator
label = getattr(cfg, "system_instruction_label", None) or "🎯 System Context"
separator = getattr(cfg, "system_instruction_separator", "\n---\n\n")
# Build final block per format
if cfg.system_instruction_format == "markdown":
formatted_block = f"## {label}\n\n{instruction.strip()}"
elif cfg.system_instruction_format == "plain":
formatted_block = f"{label}\n\n{instruction.strip()}"
elif cfg.system_instruction_format == "comment":
# For injected content, wrap as HTML comment so it embeds safely in text
formatted_block = f"<!-- {instruction.strip()} -->"
elif cfg.system_instruction_format == "xml":
# Integration tests expect hyphenated tag name here
formatted_block = f"<system-instruction>{instruction.strip()}</system-instruction>"
else:
# xml or comment, rely on formatter
formatted_block = formatted_instr
# Determine position
if cfg.system_instruction_position == "top":
modified = formatted_block + separator + content
position = "top"
elif cfg.system_instruction_position == "after_header":
# After first markdown header or beginning if not found
try:
import re
# Match first Markdown header line
header_match = re.search(r"^#+\s+.*$", content, flags=re.MULTILINE)
except Exception:
header_match = None
if header_match:
idx = header_match.end()
modified = content[:idx] + "\n\n" + formatted_block + content[idx:]
position = "after_header"
else:
modified = formatted_block + separator + content
position = "top_fallback"
elif cfg.system_instruction_position == "before_content":
# Before first non-empty line
lines = content.splitlines()
i = 0
while i < len(lines) and not lines[i].strip():
i += 1
prefix = "\n".join(lines[:i])
suffix = "\n".join(lines[i:])
between = "\n" if suffix else ""
modified = (
prefix
+ ("\n" if prefix else "")
+ formatted_instr
+ ("\n" if suffix else "")
+ suffix
)
position = "before_content"
else:
modified = formatted_block + separator + content
position = "top_default"
# Compute token increase (original first, then modified) so patched mocks match
orig_tokens = estimate_tokens(content)
meta.update(
{
"system_instruction_position": position,
"token_increase": estimate_tokens(modified) - orig_tokens,
}
)
# Persist info in metadata when enabled
if getattr(cfg, "system_instruction_persist_in_context", False):
meta["system_instruction_persisted"] = True
meta["system_instruction_content"] = instruction
# Mark as injected for this session and persist history if applicable
if session:
# Mark in the session map immediately (tests assert this)
self.system_instruction_injected[session] = True
# Also update history record if present
if session not in self.session_histories:
self.session_histories[session] = InjectionHistory(session_id=session)
hist = self.session_histories[session]
hist.system_instruction_injected = True
hist.updated_at = datetime.now()
# Best-effort save
try:
self._save_session_histories()
except Exception:
pass
return modified, meta
instill¶
instill(
context: Union[str, ContextResult],
session: Optional[str] = None,
force: bool = False,
strategy: Optional[str] = None,
max_tenets: Optional[int] = None,
check_frequency: bool = True,
inject_system_instruction: Optional[bool] = None,
) -> Union[str, ContextResult]
Instill tenets into context with smart injection.
| PARAMETER | DESCRIPTION |
|---|---|
context | Context to inject tenets into TYPE: |
session | Session identifier for tracking |
force | Force injection regardless of frequency settings TYPE: |
strategy | Override injection strategy |
max_tenets | Override maximum tenets |
check_frequency | Whether to check injection frequency TYPE: |
| RETURNS | DESCRIPTION |
|---|---|
Union[str, ContextResult] | Modified context with tenets injected (if applicable) |
Source code in tenets/core/instiller/instiller.py
def instill(
self,
context: Union[str, ContextResult],
session: Optional[str] = None,
force: bool = False,
strategy: Optional[str] = None,
max_tenets: Optional[int] = None,
check_frequency: bool = True,
inject_system_instruction: Optional[bool] = None,
) -> Union[str, ContextResult]:
"""Instill tenets into context with smart injection.
Args:
context: Context to inject tenets into
session: Session identifier for tracking
force: Force injection regardless of frequency settings
strategy: Override injection strategy
max_tenets: Override maximum tenets
check_frequency: Whether to check injection frequency
Returns:
Modified context with tenets injected (if applicable)
"""
start_time = time.time()
# Track session if provided
if session:
if session not in self.session_histories:
self.session_histories[session] = InjectionHistory(session_id=session)
history = self.session_histories[session]
history.total_distills += 1
else:
history = None
# Extract text and format
if isinstance(context, ContextResult):
text = context.context
format_type = context.format
is_context_result = True
else:
text = context
format_type = "markdown"
is_context_result = False
# Analyze complexity using the analyzer (tests patch this)
try:
complexity = float(
self.complexity_analyzer.analyze(context if is_context_result else text)
)
except Exception:
# Fallback lightweight heuristic
try:
text_len = len(text)
except Exception:
text_len = 0
complexity = min(1.0, max(0.0, text_len / 20000.0))
try:
self.logger.debug(f"Context complexity: {complexity:.2f}")
except Exception:
self.logger.debug("Context complexity computed")
# Optionally inject system instruction before tenets (when enabled)
sys_meta: Dict[str, Any] = {}
sys_injected_text: Optional[str] = None
# Determine whether to inject system instruction based on flag and config
sys_should = None
if inject_system_instruction is True:
sys_should = True
elif inject_system_instruction is False:
sys_should = False
else:
sys_should = bool(
self.config.tenet.system_instruction_enabled
and self.config.tenet.system_instruction
)
if sys_should:
modified_text, meta = self.inject_system_instruction(
text, format=format_type, session=session
)
# If actually injected, update text and tracking map
if meta.get("system_instruction_injected"):
text = modified_text
sys_injected_text = modified_text
sys_meta = meta
if session:
self.system_instruction_injected[session] = True
# Analyze complexity
complexity = self.complexity_analyzer.analyze(context)
self.logger.debug(f"Context complexity: {complexity:.2f}")
# Check if we should inject
should_inject = force
skip_reason = None
if not force and check_frequency:
if history:
should_inject, reason = history.should_inject(
frequency=self.config.tenet.injection_frequency,
interval=self.config.tenet.injection_interval,
complexity=complexity,
complexity_threshold=self.config.tenet.session_complexity_threshold,
min_session_length=self.config.tenet.min_session_length,
)
else:
# No session history – treat as new/unnamed session that needs tenets
freq = self.config.tenet.injection_frequency
if freq == "always":
should_inject, reason = True, "always_mode_no_session"
elif freq == "manual":
should_inject, reason = False, "manual_mode_no_session"
else:
# For periodic/adaptive without a session, INJECT to establish context
# Unnamed sessions are important - they need guiding principles
should_inject, reason = True, f"unnamed_session_needs_tenets"
if not force and check_frequency and history:
should_inject, reason = history.should_inject(
frequency=self.config.tenet.injection_frequency,
interval=self.config.tenet.injection_interval,
complexity=complexity,
complexity_threshold=self.config.tenet.session_complexity_threshold,
min_session_length=self.config.tenet.min_session_length,
)
if not should_inject:
skip_reason = reason
self.logger.debug(f"Skipping injection: {reason}")
# Record metrics even if skipping
if not should_inject:
self.metrics_tracker.record_instillation(
tenet_count=0,
token_increase=0,
strategy="skipped",
session=session,
complexity=complexity,
skip_reason=skip_reason,
)
# Save histories
self._save_session_histories()
# If we injected a system instruction earlier, return the modified
# content and include system_instruction metadata as tests expect.
if sys_meta.get("system_instruction_injected") and sys_injected_text is not None:
if is_context_result:
extra_meta: Dict[str, Any] = {
"system_instruction": sys_meta,
"injection_complexity": complexity,
}
modified_context = ContextResult(
files=context.files, # type: ignore[attr-defined]
context=sys_injected_text,
format=context.format, # type: ignore[attr-defined]
metadata={**context.metadata, **extra_meta}, # type: ignore[attr-defined]
)
return modified_context
else:
return sys_injected_text
return context # Return unchanged when nothing was injected
# Get tenets for injection
tenets = self._get_tenets_for_instillation(
session=session,
force=force,
content_length=len(text),
max_tenets=max_tenets or self.config.tenet.max_per_context,
history=history,
complexity=complexity,
)
if not tenets:
self.logger.info("No tenets available for instillation")
return context
# Determine injection strategy
if not strategy:
strategy = self._determine_injection_strategy(
content_length=len(text),
tenet_count=len(tenets),
format_type=format_type,
complexity=complexity,
)
self.logger.info(
f"Instilling {len(tenets)} tenets using {strategy} strategy"
f"{f' for session {session}' if session else ''}"
)
# Inject tenets - TenetInjector doesn't have a strategy parameter
modified_text, injection_metadata = self.injector.inject_tenets(
content=text, tenets=tenets, format=format_type, context_metadata={"strategy": strategy}
)
# Update tenet metrics
for tenet in tenets:
# Update metrics and status on the tenet
try:
tenet.metrics.update_injection()
tenet.instill()
except Exception:
pass
self.manager._save_tenet(tenet)
self.metrics_tracker.record_tenet_usage(tenet.id)
# Record injection in history
if history:
history.record_injection(tenets, complexity)
# Check for reinforcement
if (
self.config.tenet.reinforcement
and history.total_injections % self.config.tenet.reinforcement_interval == 0
):
history.reinforcement_count += 1
self.logger.info(f"Reinforcement injection #{history.reinforcement_count}")
# Create result
result = InstillationResult(
tenets_instilled=tenets,
injection_positions=injection_metadata.get("injections", []),
token_increase=injection_metadata.get("token_increase", 0),
strategy_used=strategy,
session=session,
complexity_score=complexity,
metrics={
"processing_time": time.time() - start_time,
"complexity": complexity,
"injection_metadata": injection_metadata,
},
)
# Cache result
cache_key = f"{session or 'global'}_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
self._cache[cache_key] = result
# Record metrics
self.metrics_tracker.record_instillation(
tenet_count=len(tenets),
token_increase=injection_metadata.get("token_increase", 0),
strategy=strategy,
session=session,
complexity=complexity,
)
# Save histories
self._save_session_histories()
# Return modified context
if is_context_result:
# Merge system instruction metadata if present
extra_meta: Dict[str, Any] = {
"tenet_instillation": result.to_dict(),
"tenets_injected": [t.id for t in tenets],
"injection_complexity": complexity,
}
if sys_meta:
extra_meta["system_instruction"] = sys_meta
modified_context = ContextResult(
files=context.files,
context=modified_text,
format=context.format,
metadata={**context.metadata, **extra_meta},
)
return modified_context
else:
return modified_text
get_session_stats¶
Get statistics for a specific session.
| PARAMETER | DESCRIPTION |
|---|---|
session | Session identifier TYPE: |
| RETURNS | DESCRIPTION |
|---|---|
Dict[str, Any] | Dictionary of session statistics |
Source code in tenets/core/instiller/instiller.py
def get_session_stats(self, session: str) -> Dict[str, Any]:
"""Get statistics for a specific session.
Args:
session: Session identifier
Returns:
Dictionary of session statistics
"""
if session not in self.session_histories:
return {"error": f"No history for session: {session}"}
history = self.session_histories[session]
stats = history.get_stats()
# Add metrics from tracker
session_metrics = self.metrics_tracker.session_metrics.get(session, {})
stats.update(session_metrics)
return stats
get_all_session_stats¶
analyze_effectiveness¶
Analyze the effectiveness of tenet instillation.
| PARAMETER | DESCRIPTION |
|---|---|
session | Optional session to analyze |
| RETURNS | DESCRIPTION |
|---|---|
Dict[str, Any] | Dictionary with analysis results and recommendations |
Source code in tenets/core/instiller/instiller.py
def analyze_effectiveness(self, session: Optional[str] = None) -> Dict[str, Any]:
"""Analyze the effectiveness of tenet instillation.
Args:
session: Optional session to analyze
Returns:
Dictionary with analysis results and recommendations
"""
# Get tenet effectiveness from manager
tenet_analysis = self.manager.analyze_tenet_effectiveness()
# Get instillation metrics
metrics = self.metrics_tracker.get_metrics(session)
# Session-specific analysis
session_analysis = {}
if session and session in self.session_histories:
session_analysis = self.get_session_stats(session)
# Generate recommendations
recommendations = []
# Check injection frequency
if metrics.get("total_instillations", 0) > 0:
avg_complexity = metrics.get("avg_complexity", 0.5)
if avg_complexity > 0.7:
recommendations.append(
"High average complexity detected. Consider reducing injection frequency "
"or using simpler tenets."
)
elif avg_complexity < 0.3:
recommendations.append(
"Low average complexity. You could increase injection frequency "
"for better reinforcement."
)
# Check skip reasons
skip_dist = metrics.get("skip_distribution", {})
if skip_dist:
top_skip = max(skip_dist.items(), key=lambda x: x[1])
if "session_too_short" in top_skip[0]:
recommendations.append(
f"Many skips due to short sessions. Consider reducing min_session_length "
f"(currently {self.config.tenet.min_session_length})."
)
# Check tenet usage
if tenet_analysis.get("need_reinforcement"):
recommendations.append(
f"Tenets needing reinforcement: {', '.join(tenet_analysis['need_reinforcement'][:3])}"
)
return {
"tenet_effectiveness": tenet_analysis,
"instillation_metrics": metrics,
"session_analysis": session_analysis,
"recommendations": recommendations,
"configuration": {
"injection_frequency": self.config.tenet.injection_frequency,
"injection_interval": self.config.tenet.injection_interval,
"complexity_threshold": self.config.tenet.session_complexity_threshold,
"min_session_length": self.config.tenet.min_session_length,
},
}
export_instillation_history¶
export_instillation_history(
output_path: Path, format: str = "json", session: Optional[str] = None
) -> None
Export instillation history to file.
| PARAMETER | DESCRIPTION |
|---|---|
output_path | Path to output file TYPE: |
format | Export format (json or csv) TYPE: |
session | Optional session filter |
| RAISES | DESCRIPTION |
|---|---|
ValueError | If format is not supported |
Source code in tenets/core/instiller/instiller.py
def export_instillation_history(
self,
output_path: Path,
format: str = "json",
session: Optional[str] = None,
) -> None:
"""Export instillation history to file.
Args:
output_path: Path to output file
format: Export format (json or csv)
session: Optional session filter
Raises:
ValueError: If format is not supported
"""
if format == "json":
# Export as JSON
data = {
"exported_at": datetime.now().isoformat(),
"configuration": {
"injection_frequency": self.config.tenet.injection_frequency,
"injection_interval": self.config.tenet.injection_interval,
},
"metrics": self.metrics_tracker.get_all_metrics(),
"session_histories": {},
"cached_results": {},
}
# Add session histories
for sid, history in self.session_histories.items():
if not session or sid == session:
data["session_histories"][sid] = history.get_stats()
# Add cached results
for key, result in self._cache.items():
if not session or result.session == session:
data["cached_results"][key] = result.to_dict()
with open(output_path, "w") as f:
json.dump(data, f, indent=2)
elif format == "csv":
# Export as CSV
import csv
rows = []
for record in self.metrics_tracker.instillations:
if not session or record.get("session") == session:
rows.append(
{
"Timestamp": record["timestamp"],
"Session": record.get("session", ""),
"Tenets": record["tenet_count"],
"Tokens": record["token_increase"],
"Strategy": record["strategy"],
"Complexity": f"{record.get('complexity', 0):.2f}",
"Skip Reason": record.get("skip_reason", ""),
}
)
if rows:
with open(output_path, "w", newline="") as f:
writer = csv.DictWriter(f, fieldnames=rows[0].keys())
writer.writeheader()
writer.writerows(rows)
else:
# Create empty file with headers
with open(output_path, "w", newline="") as f:
writer = csv.writer(f)
writer.writerow(
[
"Timestamp",
"Session",
"Tenets",
"Tokens",
"Strategy",
"Complexity",
"Skip Reason",
]
)
else:
raise ValueError(f"Unsupported export format: {format}")
self.logger.info(f"Exported instillation history to {output_path}")
reset_session_history¶
Reset injection history for a session.
| PARAMETER | DESCRIPTION |
|---|---|
session | Session identifier TYPE: |
| RETURNS | DESCRIPTION |
|---|---|
bool | True if reset, False if session not found |
Source code in tenets/core/instiller/instiller.py
def reset_session_history(self, session: str) -> bool:
"""Reset injection history for a session.
Args:
session: Session identifier
Returns:
True if reset, False if session not found
"""
if session in self.session_histories:
self.session_histories[session] = InjectionHistory(session_id=session)
self._save_session_histories()
self.logger.info(f"Reset injection history for session: {session}")
return True
return False
clear_cache¶
Functions:¶
estimate_tokens¶
Lightweight wrapper so tests can patch token estimation.
Defaults to the shared count_tokens utility.