Skip to content

trading_agent.terminal.widgets.turn_view

One turn in the chat: what woke the desk, its steps, the text it is writing, and its answer.

The steps of a turn are only ever added at the end, and only the last tool run grows, so the view updates its step views by position and mounts views for new ones.

Typical usage example:

view = TurnView(turn) view.show(turn)

TurnView

TurnView(desk_name, turn)

Bases: Vertical

A turn's view.

Attributes:

Name Type Description
trigger_id

The trigger the turn belongs to.

Creates the view.

Parameters:

Name Type Description Default
desk_name str

The desk the turn belongs to, for its pictures.

required
turn ChatTurn

The turn.

required
Source code in src/trading_agent/terminal/widgets/turn_view.py
def __init__(self, desk_name: str, turn: chat_items.ChatTurn):
    """Creates the view.

    Args:
        desk_name (str): The desk the turn belongs to, for its pictures.
        turn (chat_items.ChatTurn): The turn.
    """
    super().__init__(classes='turn')
    self.trigger_id = turn.trigger_id
    self._desk_name = desk_name
    self._user_pictures = containers.Vertical(classes='turn-pictures')
    self._shown_user_pictures: set[str] = set()
    self._turn = turn
    self._formatter = formatter.Formatter()
    self._heading = widgets.Static('', classes='turn-heading')
    self._message = widgets.Static('', markup=False, classes='turn-message')
    self._steps = containers.Vertical(classes='turn-steps')
    self._writing = widgets.Markdown('', classes='turn-writing')
    self._answer = widgets.Markdown('', classes='turn-answer')
    self._plain_answer = widgets.Static(
        '', markup=False, classes='turn-answer plain'
    )
    self._error = widgets.Static('', markup=False, classes='turn-error')
    self._status = widgets.Static('', classes='turn-status')
    self._step_views: list[Any] = []
    self._shown_writing = ''
    self._shown_answer: str | None = None

compose

compose()

Builds the view's parts.

Yields:

Type Description
Widget

The heading, message, steps, writing, answer (as Markdown, or as plain text for a /command's reply), error and status.

Source code in src/trading_agent/terminal/widgets/turn_view.py
def compose(self):
    """Builds the view's parts.

    Yields:
        Widget: The heading, message, steps, writing, answer (as Markdown, or as plain text for a /command's reply), error and status.
    """
    yield self._heading
    yield self._message
    yield self._user_pictures
    yield self._steps
    yield self._writing
    yield self._answer
    yield self._plain_answer
    yield self._error
    yield self._status

on_mount

on_mount()

Fills the view once it is on screen.

Source code in src/trading_agent/terminal/widgets/turn_view.py
def on_mount(self) -> None:
    """Fills the view once it is on screen."""
    self.show(self._turn)

show

show(turn)

Updates the view from the turn.

Parameters:

Name Type Description Default
turn ChatTurn

The turn, perhaps with more steps, text or an answer.

required
Source code in src/trading_agent/terminal/widgets/turn_view.py
def show(self, turn: chat_items.ChatTurn) -> None:
    """Updates the view from the turn.

    Args:
        turn (chat_items.ChatTurn): The turn, perhaps with more steps, text or an answer.
    """
    self._turn = turn
    from_user = turn.source == 'user_message'
    self.set_class(from_user, 'from-user')
    self._heading.update(self._heading_content(turn))
    self._message.update(self._message_text(turn))
    self._message.display = bool(self._message_text(turn))
    self._show_user_pictures(turn)
    self._show_steps(turn)
    writing = turn.streaming_text
    if turn.answer is not None:
        writing = ''
    if writing != self._shown_writing:
        self._shown_writing = writing
        self._writing.update(writing)
    self._writing.display = bool(writing)
    answer = turn.answer
    if turn.silent:
        answer = None
    plain = turn.text.strip().startswith('/')
    if answer != self._shown_answer:
        self._shown_answer = answer
        if plain:
            self._plain_answer.update(answer or '')
        else:
            self._answer.update(answer or '')
    self._answer.display = bool(answer) and not plain
    self._plain_answer.display = bool(answer) and plain
    self._error.update(f'The turn failed: {turn.error}')
    self._error.display = turn.error is not None
    self._status.update(self._status_content(turn))

expand_tools

expand_tools(expanded)

Opens or folds every tool run of the turn.

Parameters:

Name Type Description Default
expanded bool

True to open, False to fold.

required
Source code in src/trading_agent/terminal/widgets/turn_view.py
def expand_tools(self, expanded: bool) -> None:
    """Opens or folds every tool run of the turn.

    Args:
        expanded (bool): True to open, False to fold.
    """
    for view in self._step_views:
        if isinstance(view, tool_run_view.ToolRunView):
            view.expand_all(expanded)