Source code for klea_utils.graph.context
#!/usr/bin/env python3
"""
Per-run runtime context for Klea graphs.
Carried by LangGraph's Runtime context mechanism (ADR-0033): the run
methods accept a ``context=`` value forwarded to ``ainvoke``/``astream``/
``astream_events``, and nodes read it inside execution via ambient
``get_runtime()``. This is the framework-native replacement for the
hand-rolled ``model_overrides_ctx`` contextvar removed in ADR-0033; the
LLM's per-invocation ``RunnableConfig`` merge is unchanged (ADR-0014).
File: klea_utils/graph/context.py
Copyright 2026 Ankur Sinha
Author: Ankur Sinha <sanjay DOT ankur AT gmail DOT com>
"""
import logging
from typing import Any
from pydantic import BaseModel, ConfigDict, Field
logger = logging.getLogger(__name__)
[docs]
class KleaRunContext(BaseModel):
"""Per-run runtime context for one graph invocation.
``model_overrides`` is the conventional key the shared nodes in
``klea_utils.nodes`` consume (``chat_core`` populates it from the
sessions database). ``extra="allow"`` keeps the schema generic
(ADR-0031): an app that wants its own keys validated at the run
boundary subclasses this model and registers the subclass as its
``context_schema`` (LangGraph coerces the ``context`` dict via
``context_schema(**context)``); an app that prefers to validate
custom keys itself reads them from ``model_extra``.
"""
model_config = ConfigDict(extra="allow")
#: Per-role model/API overrides; populated by ``chat_core`` from the
#: sessions database (ADR-0014 decisions on sourcing, merge and key
#: masking remain governing; ADR-0033 only changed the transport).
model_overrides: dict[str, dict[str, Any]] = Field(default_factory=dict)
[docs]
def model_overrides_from_context(
context: KleaRunContext | dict[str, Any] | None,
) -> dict[str, dict[str, Any]]:
"""Return the ``model_overrides`` slice from a run context, or ``{}``.
Tolerates a :class:`KleaRunContext` (attribute access), a plain dict
(``context["model_overrides"]``), or ``None`` -- ``Runtime.context``
*is* ``None`` when no ``context=`` was passed (ADR-0033,
probe-verified), so the shared nodes must never see ``None``.
:param context: The run context, e.g. ``get_runtime().context``.
:returns: The overrides dict (never ``None``).
"""
if context is None:
return {}
if isinstance(context, KleaRunContext):
return context.model_overrides
return context.get("model_overrides", {})