Skip to content

trading_agent.terminal.widgets.context_card

The side panel's Context card: how full the model's context window is, and with what.

A bar of coloured blocks shows each category's share, in the web page's swatch colours, followed by one row per category. Categories the model loads only when needed ("deferred") are listed apart.

Typical usage example:

card = ContextCard() card.show(context_document)

ContextCard

ContextCard(collapsed=False)

Bases: SideCard

The Context card.

Creates the card.

Parameters:

Name Type Description Default
collapsed bool

Whether it starts folded.

False
Source code in src/trading_agent/terminal/widgets/context_card.py
def __init__(self, collapsed: bool = False):
    """Creates the card.

    Args:
        collapsed (bool): Whether it starts folded.
    """
    super().__init__('context', 'Context', collapsed=collapsed)
    self._formatter = formatter.Formatter()

show

show(usage, error)

Shows the context window's use.

Parameters:

Name Type Description Default
usage dict[str, Any] | None

The usage snapshot, or None before the desk's first turn.

required
error str | None

Why it could not be read, or None.

required
Source code in src/trading_agent/terminal/widgets/context_card.py
def show(self, usage: dict[str, Any] | None, error: str | None) -> None:
    """Shows the context window's use.

    Args:
        usage (dict[str, Any] | None): The usage snapshot, or None before the desk's first turn.
        error (str | None): Why it could not be read, or None.
    """
    if usage is None:
        self.show_aside('')
        self.show_body(
            self.note(error or "Shown after the desk's next turn.")
        )
        return
    window = max(int(usage.get('context_window') or 0), 1)
    total = int(usage.get('total_tokens') or 0)
    self.show_aside('' if usage.get('measured') else 'estimated')
    used = self._formatter.share(total, window).replace('.0%', '%')
    loaded = []
    deferred = []
    for category in usage.get('categories') or []:
        if category.get('deferred'):
            deferred.append(category)
        else:
            loaded.append(category)
    lines = [
        Content.from_markup(
            '[b]$used used[/b]  [dim]$tokens / $window[/dim]',
            used=used,
            tokens=self._formatter.token_count(total),
            window=self._formatter.token_count(window),
        ),
        self._bar(loaded, window),
    ]
    for category in loaded:
        lines.append(self._row(category, window))
    if deferred:
        lines.append(Content.from_markup('[dim]Loaded when needed[/dim]'))
        for category in deferred:
            lines.append(self._row(category, window))
    how = 'estimated from the conversation'
    if usage.get('measured'):
        how = 'measured by Claude Code'
    lines.append(
        self.note(
            f'{usage.get("backend", "")} · {how} at {self._formatter.time(str(usage.get("recorded_at", "")))}'
        )
    )
    self.show_body(Content('\n').join(lines))