Workflow Metrics
Workflow, step, and session metrics for token usage and performance.
Token usage, timing, and step breakdowns from workflow runs.
1from kern.agent import Agent2from kern.db.sqlite import SqliteDb3from kern.models.openai import OpenAIResponses4from kern.team import Team5from kern.tools.hackernews import HackerNewsTools6from kern.tools.yfinance import YFinanceTools7from kern.workflow import Step, Workflow8from rich.pretty import pprint910hackernews_agent = Agent(11 name="HackerNews Agent",12 model=OpenAIResponses(id="gpt-5.2"),13 tools=[HackerNewsTools()],14 role="Extract key insights from HackerNews posts",15)1617finance_agent = Agent(18 name="Finance Agent",19 model=OpenAIResponses(id="gpt-5.2"),20 tools=[YFinanceTools()],21 role="Get stock prices and financial data",22)2324research_team = Team(25 name="Research Team",26 members=[hackernews_agent, finance_agent],27 instructions="Research tech topics from HackerNews and financial data",28)2930content_planner = Agent(31 name="Content Planner",32 model=OpenAIResponses(id="gpt-5.2"),33 instructions="Plan a content schedule based on research",34)3536workflow = Workflow(37 name="Content Creation Workflow",38 db=SqliteDb(db_file="tmp/workflow.db"),39 steps=[40 Step(name="Research Step", team=research_team),41 Step(name="Content Planning Step", agent=content_planner),42 ],43)4445response = workflow.run(input="AI trends in 2024")4647# Workflow metrics48if response.metrics:49 pprint(response.metrics.to_dict())5051# Step metrics52if response.metrics:53 for step_name, step_metrics in response.metrics.steps.items():54 print(f"{step_name}: {step_metrics.executor_name} ({step_metrics.executor_type})")55 if step_metrics.metrics:56 print(f" Duration: {step_metrics.metrics.duration:.2f}s, Tokens: {step_metrics.metrics.total_tokens}")5758# Session metrics59pprint(workflow.get_session_metrics().to_dict())Metrics are tracked at three levels:
| Level | Type | Access |
|---|---|---|
| Workflow | WorkflowMetrics | response.metrics |
| Per step | RunMetrics (via StepMetrics) | response.metrics.steps["step_name"].metrics |
| Per session | SessionMetrics | workflow.get_session_metrics() |
Workflow fields (WorkflowMetrics)
| Field | Description |
|---|---|
duration | Total workflow execution time in seconds (includes orchestration overhead). |
steps | Dictionary mapping step names to StepMetrics. |
Step fields (StepMetrics)
| Field | Description |
|---|---|
step_name | Name of the step. |
executor_type | Type of executor ("agent", "team", or "function"). |
executor_name | Name of the executor. |
metrics | RunMetrics with tokens, duration, and model information. See Metrics reference. |
Session metrics aggregate step metrics (tokens, duration) across all runs. They include only agent/team execution time, not workflow orchestration overhead.