Team Metrics

Access RunMetrics, MessageMetrics, and SessionMetrics from team runs.

The TeamRunOutput from a team run includes detailed metrics about token usage, cost, timing, and per-model breakdowns for the team leader. Member metrics are stored separately on each member's RunOutput.

1from kern.agent import Agent
2from kern.db.sqlite import SqliteDb
3from kern.models.openai import OpenAIResponses
4from kern.team import Team
5from kern.tools.yfinance import YFinanceTools
6from rich.pretty import pprint
7
8stock_agent = Agent(
9 name="Stock Agent",
10 model=OpenAIResponses(id="gpt-5.2"),
11 role="Get stock prices and financial data.",
12 tools=[YFinanceTools()],
13)
14
15team = Team(
16 name="Finance Team",
17 model=OpenAIResponses(id="gpt-5.2"),
18 members=[stock_agent],
19 db=SqliteDb(db_file="tmp/teams.db"),
20 markdown=True,
21 store_member_responses=True,
22)
23
24run_response = team.run("What is the stock price of NVDA?")
25
26# Team leader message metrics (MessageMetrics)
27for message in run_response.messages:
28 if message.role == "assistant":
29 pprint(message.metrics.to_dict())
30
31# Team leader run metrics (RunMetrics)
32pprint(run_response.metrics.to_dict())
33
34# Per-model breakdown (leader only)
35if run_response.metrics.details:
36 for model_type, model_metrics_list in run_response.metrics.details.items():
37 for m in model_metrics_list:
38 print(f"{model_type}: {m.provider}/{m.id} - {m.total_tokens} tokens")
39
40# Member run metrics (RunMetrics per member)
41if run_response.member_responses:
42 for member_response in run_response.member_responses:
43 print(f"Member: {member_response.agent_name}")
44 pprint(member_response.metrics.to_dict())
45
46# Session metrics (SessionMetrics) - aggregates leader + all members
47pprint(team.get_session_metrics().to_dict())

Metrics are available at multiple levels:

  • Per message: Each assistant message has MessageMetrics with per-API-call token counts and timing.
  • Per member run: Each team member run has its own RunMetrics. Set store_member_responses=True to access them.
  • Team leader run: TeamRunOutput.metrics has RunMetrics for the team leader's model calls only.
  • Per session: team.get_session_metrics() returns SessionMetrics aggregated across leader and all members.
LevelTypeAccess
Per messageMessageMetricsmessage.metrics
Per member runRunMetricsmember_response.metrics (requires store_member_responses=True)
Team leader runRunMetricsrun_response.metrics
Per sessionSessionMetricsteam.get_session_metrics()

Run fields (RunMetrics)

FieldDescription
input_tokensTokens sent to the model.
output_tokensTokens generated by the model.
total_tokensSum of input_tokens and output_tokens.
audio_input_tokensAudio tokens in the input.
audio_output_tokensAudio tokens in the output.
audio_total_tokensTotal audio tokens.
cache_read_tokensTokens served from cache.
cache_write_tokensTokens written to cache.
reasoning_tokensTokens used for reasoning.
costCost of the run.
durationRun duration in seconds.
time_to_first_tokenTime from run start to first token (seconds).
detailsPer-model breakdown by model type. See Metrics reference.
additional_metricsExtra metrics (e.g., eval_duration).

Message fields (MessageMetrics)

FieldDescription
input_tokensTokens sent to the model.
output_tokensTokens generated by the model.
total_tokensSum of input_tokens and output_tokens.
audio_input_tokensAudio tokens in the input.
audio_output_tokensAudio tokens in the output.
audio_total_tokensTotal audio tokens.
cache_read_tokensTokens served from cache.
cache_write_tokensTokens written to cache.
reasoning_tokensTokens used for reasoning.
costCost of this API call.
durationDuration of this API call (seconds).
time_to_first_tokenTime to first token for this API call (seconds).
provider_metricsProvider-specific metrics (e.g., Ollama timing, Groq timing, Cerebras timing).

Developer Resources