Context Optimizer
The Context Optimizer provides multiple strategies for reducing context size when approaching model limits, preventing overflow errors and reducing costs.
Agent-Centric Quick Start
from praisonaiagents import Agent
from praisonaiagents import ManagerConfig
# Configure optimization strategy via context param
agent = Agent(
instructions="You are helpful.",
context=ManagerConfig(
auto_compact=True,
compact_threshold=0.8, # Trigger at 80% usage
strategy="smart", # truncate, sliding_window, prune_tools, summarize, smart
),
)
# Optimization happens automatically when threshold is reached
response = agent.chat("Hello!")
Optimization Strategies
Smart Strategy Flow (Default)
Low-Level API
from praisonaiagents import get_optimizer, OptimizerStrategy
# Get an optimizer
optimizer = get_optimizer(OptimizerStrategy.SMART)
# Optimize messages to target token count
messages = [...] # Your conversation history
optimized, stats = optimizer.optimize(messages, target_tokens=50000)
print(f"Reduced from {len(messages)} to {len(optimized)} messages")
print(f"Saved {stats.tokens_saved} tokens")
Strategy Reference
Truncate
Removes oldest messages first, preserving system prompt and recent context.
from praisonaiagents import TruncateOptimizer
optimizer = TruncateOptimizer()
result, stats = optimizer.optimize(messages, target_tokens=10000)
Best for: Simple cases where old context is not important.
Sliding Window
Keeps the N most recent messages within a token window.
from praisonaiagents import SlidingWindowOptimizer
optimizer = SlidingWindowOptimizer()
result, stats = optimizer.optimize(messages, target_tokens=10000)
Best for: Conversations where recent context matters most.
Truncates old tool outputs while preserving recent ones.
from praisonaiagents import PruneToolsOptimizer
optimizer = PruneToolsOptimizer(
protect_recent=5, # Keep last 5 tool outputs intact
max_output_tokens=500, # Truncate older outputs to 500 tokens
)
result, stats = optimizer.optimize(messages, target_tokens=10000)
Best for: Tool-heavy conversations with large outputs.
Summarize
Uses LLM to create a summary of older conversation.
from praisonaiagents import SummarizeOptimizer
optimizer = SummarizeOptimizer(
keep_recent=4, # Keep last 4 turns intact
model="gpt-4o-mini",
)
result, stats = optimizer.optimize(messages, target_tokens=10000)
Best for: Long conversations where context continuity matters.
Non-Destructive
Tags messages for exclusion without deleting them (enables undo).
from praisonaiagents import NonDestructiveOptimizer
optimizer = NonDestructiveOptimizer()
result, stats = optimizer.optimize(messages, target_tokens=10000)
# Messages are tagged with 'excluded': True
# Use get_effective_history() to filter
Best for: When you need to preserve full history for audit/undo.
Smart (Recommended)
Combines all strategies intelligently based on content analysis.
from praisonaiagents import SmartOptimizer
optimizer = SmartOptimizer()
result, stats = optimizer.optimize(messages, target_tokens=10000)
Order of operations (Smart Strategy):
- Summarize tool outputs - Uses LLM to intelligently summarize large tool outputs (preserves key info)
- Truncate tool outputs - Fallback truncation for remaining large outputs
- Sliding window - Remove oldest messages
- Summarize conversation - LLM summary of older conversation if still over limit
Tool output summarization uses LLM to preserve key information instead of blindly truncating. This is enabled by default when llm_summarize=True.
Factory Function
from praisonaiagents import get_optimizer, OptimizerStrategy
# Available strategies
strategies = [
OptimizerStrategy.TRUNCATE,
OptimizerStrategy.SLIDING_WINDOW,
OptimizerStrategy.PRUNE_TOOLS,
OptimizerStrategy.SUMMARIZE,
OptimizerStrategy.NON_DESTRUCTIVE,
OptimizerStrategy.SMART,
]
for strategy in strategies:
optimizer = get_optimizer(strategy)
result, stats = optimizer.optimize(messages, target_tokens=10000)
print(f"{strategy.value}: {len(result)} messages")
Optimization Result
from praisonaiagents import OptimizationResult
# stats returned from optimize()
stats: OptimizationResult
print(f"Original tokens: {stats.original_tokens}")
print(f"Optimized tokens: {stats.optimized_tokens}")
print(f"Tokens saved: {stats.tokens_saved}")
print(f"Strategy used: {stats.strategy_used}")
print(f"Messages removed: {stats.messages_removed}")
print(f"Tool outputs pruned: {stats.tool_outputs_pruned}")
print(f"Tool outputs summarized: {stats.tool_outputs_summarized}")
print(f"Tokens saved by summarization: {stats.tokens_saved_by_summarization}")
print(f"Tokens saved by truncation: {stats.tokens_saved_by_truncation}")
The optimizer preserves tool_call/tool_result pairs to maintain API validity:
# These pairs are kept together or removed together
{"role": "assistant", "tool_calls": [{"id": "call_123", ...}]}
{"role": "tool", "tool_call_id": "call_123", "content": "..."}
CLI Usage
# Set optimization strategy
praisonai chat --context-strategy smart
# Set trigger threshold
praisonai chat --context-threshold 0.8
# Manual optimization in session
/context compact
Configuration
# config.yaml
context:
auto_compact: true
compact_threshold: 0.8
strategy: smart
Next Steps