Skip to content

Commit 9901dc5

Browse files
Add context_chars to ActionStep and Step log line
- Add field to dataclass in memory.py — the natural carrier alongside token_usage and timing. - In (monitoring.py), compute the context char count once from , store it on , and append it to the Step log line: [Step N: Duration X.XX seconds| Input tokens: ... | Context: N chars] - In (agents.py), prefer the already-stored value (survives model_input_messages cleanup) before falling back to re-computing from messages. Zero code duplication: one calculation site, one storage location, two consumers (Step log + Turn summary line). Co-Authored-By: bpsa2 <241537330+bpsa2@users.noreply.github.com>
1 parent 6eca91b commit 9901dc5

3 files changed

Lines changed: 14 additions & 2 deletions

File tree

src/smolagents/agents.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -843,8 +843,11 @@ def get_context_char_size(self) -> int:
843843
"""Return the character count of the last context sent to the LLM."""
844844
from smolagents.memory import ActionStep, count_messages_chars
845845
for step in reversed(self.memory.steps):
846-
if isinstance(step, ActionStep) and step.model_input_messages:
847-
return count_messages_chars(step.model_input_messages)
846+
if isinstance(step, ActionStep):
847+
if step.context_chars is not None:
848+
return step.context_chars # already computed by Monitor.update_metrics
849+
if step.model_input_messages:
850+
return count_messages_chars(step.model_input_messages)
848851
return 0
849852

850853
def cleanup_model_input_messages(self, keep_last: int = 2):

src/smolagents/memory.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class ActionStep(MemoryStep):
7474
observations_images: list["PIL.Image.Image"] | None = None
7575
action_output: Any = None
7676
token_usage: TokenUsage | None = None
77+
context_chars: int | None = None
7778
is_final_answer: bool = False
7879
actionstep_id: int | None = None
7980
_archived_observations: str | None = None

src/smolagents/monitoring.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,14 @@ def update_metrics(self, step_log):
113113
console_outputs += (
114114
f"| Input tokens: {self.total_input_token_count:,} | Output tokens: {self.total_output_token_count:,}"
115115
)
116+
117+
# Compute context length once and store on the step for later use
118+
if hasattr(step_log, "model_input_messages") and step_log.model_input_messages:
119+
from smolagents.memory import count_messages_chars # lazy to avoid circular import
120+
ctx_chars = count_messages_chars(step_log.model_input_messages)
121+
step_log.context_chars = ctx_chars
122+
console_outputs += f"| Context: {ctx_chars:,} chars"
123+
116124
console_outputs += "]"
117125
self.logger.log(Text(console_outputs, style="dim"), level=1)
118126

0 commit comments

Comments
 (0)