Skip to content

symfonic.memory.models.context

context

AssembledContext and ContextBudget models.

Deprecated: These models are no longer used by the active hydration path. Hydration is handled by SymfonicAgent._hydrate() which returns HydratedMemory. MemoryOrchestrator.hydrate_context() which produces AssembledContext is never called by anyone in the current codebase.

AssembledContext

AssembledContext(**data: Any)

Bases: BaseModel

Fully assembled context ready for LLM consumption.

.. deprecated:: AssembledContext is deprecated. Hydration is handled by SymfonicAgent._hydrate() which returns HydratedMemory.

Source code in symfonic/memory/models/context.py
def __init__(self, **data: Any) -> None:
    warnings.warn(
        "AssembledContext is deprecated. Hydration is handled by "
        "SymfonicAgent._hydrate().",
        DeprecationWarning,
        stacklevel=2,
    )
    super().__init__(**data)

is_within_budget

is_within_budget(budget: ContextBudget) -> bool

Check whether this context respects all budget constraints.

Returns True if all component counts are within the budget limits. max_memory_entries was removed in v5.6.0 (v6.0 API freeze prep); memory-entry count is no longer budget-enforced -- the live SymfonicAgent._hydrate path uses max_tokens instead.

Source code in symfonic/memory/models/context.py
def is_within_budget(self, budget: ContextBudget) -> bool:
    """Check whether this context respects all budget constraints.

    Returns True if all component counts are within the budget limits.
    ``max_memory_entries`` was removed in v5.6.0 (v6.0 API freeze prep);
    memory-entry count is no longer budget-enforced -- the live
    ``SymfonicAgent._hydrate`` path uses ``max_tokens`` instead.
    """
    if len(self.selected_tools) > budget.max_tools:
        return False
    return not len(self.conversation_history) > budget.max_history_messages

ContextBudget

ContextBudget(**data: Any)

Bases: BaseModel

Defines the limits for context assembly.

.. deprecated:: ContextBudget is deprecated. Budget constraints are now handled internally by SymfonicAgent._hydrate() via FrameworkConfig.

Source code in symfonic/memory/models/context.py
def __init__(self, **data: Any) -> None:
    warnings.warn(
        "ContextBudget is deprecated. Budget constraints are handled internally "
        "by SymfonicAgent._hydrate() via FrameworkConfig.",
        DeprecationWarning,
        stacklevel=2,
    )
    super().__init__(**data)

framework_default classmethod

framework_default() -> ContextBudget

The framework's own default, built without the adopter-facing warning.

OrchestratorConfig.context_budget needs an instance, and taking it from __init__ made the framework fire a deprecation about its own default on the first line of every platform program — pinned as EX-3 in the warning budget and recorded there as "not actionable by an adopter", because there was nothing for them to change.

A deprecation warns whoever chose the deprecated thing. Nobody chose this one, so nobody is warned for it. An adopter who constructs ContextBudget() is still warned, and a test pins both halves.

model_construct rather than a suppressed __init__: suppression needs warnings.catch_warnings, which mutates process-global filter state and would briefly swallow another thread's warnings. Validation loses nothing here — every field is a literal default this class declares, with no input to check.

Source code in symfonic/memory/models/context.py
@classmethod
def framework_default(cls) -> ContextBudget:
    """The framework's own default, built without the adopter-facing warning.

    ``OrchestratorConfig.context_budget`` needs an instance, and taking it
    from ``__init__`` made the framework fire a deprecation *about its own
    default* on the first line of every platform program — pinned as EX-3 in
    the warning budget and recorded there as "not actionable by an adopter",
    because there was nothing for them to change.

    A deprecation warns whoever chose the deprecated thing. Nobody chose
    this one, so nobody is warned for it. An adopter who constructs
    ``ContextBudget()`` **is** still warned, and a test pins both halves.

    ``model_construct`` rather than a suppressed ``__init__``: suppression
    needs ``warnings.catch_warnings``, which mutates process-global filter
    state and would briefly swallow another thread's warnings. Validation
    loses nothing here — every field is a literal default this class
    declares, with no input to check.
    """
    return cls.model_construct()