|
|
@@ -94,6 +94,7 @@ class AgentLogger:
|
|
|
self._seq: int = 0
|
|
|
self._jsonl_fh: Any | None = None
|
|
|
self._agent_name: str | None = None
|
|
|
+ self._last_model: str | None = None
|
|
|
|
|
|
@property
|
|
|
def run_id(self) -> str | None:
|
|
|
@@ -103,6 +104,10 @@ class AgentLogger:
|
|
|
def agent_name(self) -> str | None:
|
|
|
return self._agent_name
|
|
|
|
|
|
+ @property
|
|
|
+ def last_model(self) -> str | None:
|
|
|
+ return self._last_model
|
|
|
+
|
|
|
@property
|
|
|
def log_file(self) -> Path | None:
|
|
|
return self._log_file
|
|
|
@@ -127,6 +132,7 @@ class AgentLogger:
|
|
|
short_id = uuid.uuid4().hex[:8]
|
|
|
slug = _slugify_agent_name(agent_name)
|
|
|
self._agent_name = agent_name
|
|
|
+ self._last_model = model
|
|
|
if slug:
|
|
|
self._run_id = f"{slug}_{timestamp}_{short_id}"
|
|
|
else:
|
|
|
@@ -178,6 +184,7 @@ class AgentLogger:
|
|
|
if not self.enabled or not self._logger:
|
|
|
return
|
|
|
|
|
|
+ self._last_model = model
|
|
|
payload = {
|
|
|
"iteration": iteration,
|
|
|
"model": model,
|
|
|
@@ -199,6 +206,9 @@ class AgentLogger:
|
|
|
iteration: int,
|
|
|
response: Message,
|
|
|
raw_response: Any | None = None,
|
|
|
+ *,
|
|
|
+ model: str | None = None,
|
|
|
+ provider: str = "openrouter",
|
|
|
) -> None:
|
|
|
"""Log the complete LLM response, highlighting reasoning and tool calls."""
|
|
|
if not self.enabled or not self._logger:
|
|
|
@@ -207,9 +217,13 @@ class AgentLogger:
|
|
|
parsed = response.model_dump()
|
|
|
tool_calls = parsed.get("tool_calls") or []
|
|
|
usage = _extract_usage(raw_response)
|
|
|
+ resolved_model = model or self._extract_model(raw_response) or self._last_model
|
|
|
+ if resolved_model:
|
|
|
+ self._last_model = resolved_model
|
|
|
|
|
|
payload: dict[str, Any] = {
|
|
|
"iteration": iteration,
|
|
|
+ "model": resolved_model,
|
|
|
"content": parsed.get("content"),
|
|
|
"reasoning": parsed.get("reasoning"),
|
|
|
"tool_calls": tool_calls,
|
|
|
@@ -230,6 +244,12 @@ class AgentLogger:
|
|
|
iteration=iteration,
|
|
|
title=f"LLM OUTPUT | step={self._seq + 1} | iteration={iteration}",
|
|
|
)
|
|
|
+ self._record_usage(
|
|
|
+ iteration=iteration,
|
|
|
+ model=resolved_model,
|
|
|
+ usage=usage,
|
|
|
+ provider=provider,
|
|
|
+ )
|
|
|
|
|
|
def log_tool_call(
|
|
|
self,
|
|
|
@@ -305,6 +325,37 @@ class AgentLogger:
|
|
|
self._jsonl_fh.close()
|
|
|
self._jsonl_fh = None
|
|
|
|
|
|
+ def _extract_model(self, raw_response: Any) -> str | None:
|
|
|
+ if raw_response is None:
|
|
|
+ return None
|
|
|
+ model = getattr(raw_response, "model", None)
|
|
|
+ if model is None and isinstance(raw_response, dict):
|
|
|
+ model = raw_response.get("model")
|
|
|
+ return str(model) if model else None
|
|
|
+
|
|
|
+ def _record_usage(
|
|
|
+ self,
|
|
|
+ *,
|
|
|
+ iteration: int,
|
|
|
+ model: str | None,
|
|
|
+ usage: dict[str, Any] | None,
|
|
|
+ provider: str,
|
|
|
+ ) -> None:
|
|
|
+ if not usage:
|
|
|
+ return
|
|
|
+ from supply_agent.logging.usage import record_llm_usage
|
|
|
+
|
|
|
+ record_llm_usage(
|
|
|
+ {
|
|
|
+ "run_id": self._run_id,
|
|
|
+ "agent_name": self._agent_name,
|
|
|
+ "model": model,
|
|
|
+ "provider": provider,
|
|
|
+ "iteration": iteration,
|
|
|
+ "usage": usage,
|
|
|
+ }
|
|
|
+ )
|
|
|
+
|
|
|
def _emit(
|
|
|
self,
|
|
|
event: str,
|