Token Budgeting

Dynamic token budget management for large context handling

Token budgeting keeps retrieved context within each model’s window so agents never overflow the context limit.

python
from praisonaiagents import Agent, KnowledgeConfig

agent = Agent(
    name="Researcher",
    instructions="Answer from the knowledge base.",
    knowledge=KnowledgeConfig(sources=["./docs"], retrieval_k=5),
)
agent.start("What are the key features?")

The user asks a knowledge-heavy question; token budgeting trims retrieved chunks so the prompt stays within the model window.

Diagram

Token Budget Flow

🤖 Agent

📊 TokenBudget

📄 Context Chunks

💬 LLM Response

How It Works

Diagram
Token BudgetingAgentUserToken BudgetingAgentUserRequestProcess requestResult Agent–>>User: Response

Quick Start

  1. Agent with Knowledge

    Knowledge retrieval applies token budgets automatically when indexing and retrieving.

    python
    from praisonaiagents import Agent, KnowledgeConfig
    
    agent = Agent(
        name="BudgetAwareAgent",
        instructions="Answer questions using the knowledge base.",
        knowledge=KnowledgeConfig(sources=["./docs"], retrieval_k=5),
    )
    agent.start("What are the key features?")
  2. Long-Context Model (gpt-5)

    Pass a model name and the window resolves automatically — gpt-5 unlocks the full 1M context.

    python
    from praisonaiagents import Agent
    from praisonaiagents.rag import TokenBudget
    
    # Simplest agent-centric usage — model resolves to the 1M window
    agent = Agent(
        name="LongContextAgent",
        instructions="Answer using the full document.",
        llm="gpt-5",
    )
    
    # Under the hood
    budget = TokenBudget(model="gpt-5")
    print(budget.model_context_window)  # 1047576
  3. Direct Budget Control

    Use TokenBudget when building custom RAG pipelines.

    python
    from praisonaiagents.rag import TokenBudget, DefaultBudgetEnforcer
    
    budget = TokenBudget(model="gpt-4o-mini")
    available = budget.dynamic_budget(system_tokens=500, history_tokens=1000)
    
    enforcer = DefaultBudgetEnforcer()
    chunks = ["chunk one...", "chunk two...", "chunk three..."]
    enforced = enforcer.enforce(budget, chunks)
    print(f"Kept {len(enforced)} of {len(chunks)} chunks ({available} tokens available)")

Configuration

TokenBudget Options

OptionTypeDefaultDescription
modelstr"gpt-4o-mini"Model name for context window lookup
reserved_responseint4096Tokens reserved for the LLM response
reserved_systemint500Tokens reserved for system prompt
reserved_historyint1000Tokens reserved for chat history
python
from praisonaiagents.rag import TokenBudget

budget = TokenBudget(
    model="gpt-4o",
    reserved_response=4096,
    reserved_system=1000,
    reserved_history=2000,
)
print(budget.model_context_window)  # 128000
print(budget.max_context_tokens)

Model Context Windows

ModelContext Window
gpt-5, gpt-5-mini, gpt-5-nano1,047,576
gpt-4.1, gpt-4.1-mini, gpt-4.1-nano1,047,576
gpt-4o, gpt-4o-mini128,000
gpt-4-turbo128,000
gpt-48,192
gpt-4-32k32,768
gpt-3.5-turbo16,385
o3, o3-mini, o4-mini200,000
o1200,000
o1-mini, o1-preview128,000
claude-3-5-sonnet, claude-3-5-haiku200,000
claude-3-opus, claude-3-sonnet, claude-3-haiku200,000
gemini-1.5-pro2,097,152
gemini-1.5-flash, gemini-2.0-flash1,048,576

Budget Enforcement

python
from praisonaiagents.rag import TokenBudget, DefaultBudgetEnforcer

budget = TokenBudget(model="gpt-4o-mini")
enforcer = DefaultBudgetEnforcer()

chunks = ["chunk1 content...", "chunk2 content...", "chunk3 content..."]
enforced_chunks = enforcer.enforce(budget, chunks)

Implement BudgetEnforcerProtocol for priority-based or custom selection strategies.

CLI Usage

bash
praisonai knowledge stats --json
praisonai knowledge index ./docs --verbose

Best Practices

Reserve adequate response tokens

Leave enough headroom for complete answers — undersized reserved_response truncates outputs mid-sentence.

Account for chat history

Multi-turn conversations consume tokens quickly; increase reserved_history or enable context compaction on long sessions.

Match budget to model

Different models have different context windows — always pass the actual model name so dynamic_budget() calculates correctly.

Monitor with verbose indexing

Run praisonai knowledge index ./docs --verbose to see chunk counts and token estimates before production retrieval.


Related