New features, SDK improvements, and platform updates.
2026
2026.8Platform · UI
August 2026
Session detail page, redesigned
DURATION
14.2s
EVENTS
14
LLM CALLS
5
COST
$0.04
ERRORS
0
TimelineGraphPolicyRaw Events
A clearer, more scannable layout: status, cost, and tags up front; a stat strip showing duration, event count, LLM calls, cost, and errors at a glance; a dedicated Graph tab; and a searchable, filterable timeline you can navigate with the keyboard. Event detail now leads with the answer, not the raw input.
2026.8Platform · UI
August 2026
Event graph: pan, zoom, and a clear starting point
+−
Drag to pan and scroll to zoom instead of scrollbars. Every session graph now starts from a single visible node instead of scattered top-level steps, and tool calls show their real name — not a generic "tool" label.
2026.8SDK
August 2026
Trace cause and effect between LLM calls and the actions they trigger
niitaka.log_tool(
parent_event_id=
get_last_llm_event_id()
)
→
Event Graph
● planner (llm)
└describe_table (tool)
log_tool(), log_decision(), and log_error() now accept a parent_event_id — nest an event under the LLM call that caused it, so the timeline and graph show real causal structure instead of a flat list of unconnected steps.
log_tool() now accepts the same metadata your LLM calls already use — attach a latency and see it in the timeline and graph exactly like an LLM call's duration.
log_tool(..., metadata={"latency": seconds})
2026.8Platform · Bug fix
August 2026
Model and cost accuracy
Cost by model
claude-haiku-4-5$0.0091
gemini-2.5-flash-lite$0.0004
llama3.2:3b (local)$0.0000
unreleased-model-xno pricing data
Sessions now show which model they used — including when a session mixes models — derived automatically from your LLM calls. Fixed Gemini calls under-reporting cost despite correct token counts, added pricing for newer models, and models with no pricing data are now flagged instead of silently showing $0.
2026.8Platform · Bug fix
August 2026
More resilient under load
Couldn't load sessions
503 Service Unavailable
Retry
Live session updates no longer cut off early just because a session's status changed. Hardened backend request handling so brief overload is handled gracefully instead of cascading. A failed request to load your sessions list now shows a clear retry prompt instead of looking like an empty account.
2026.7Platform · Bug fix
July 2026
Closed a gap in event delivery
connection dropped
→
retried
→
delivered
Closed an edge case where a batch of events could be silently dropped during a brief network hiccup in the ingestion pipeline. Events are now retried until they're confirmed durable, instead of being lost if the hiccup landed at the wrong moment.
2026.6Feature · Dashboard
June 2026
Track outcome metrics, broken down any way you like
goal_completed · score
0.82
Group by: agent
db-analyst0.91
sql-planner0.74
summariser0.58
A new Metrics tab on Analytics discovers every set_metrics() key automatically and infers its type — score, rating, sentiment, boolean, or numeric. See distribution and trend per key, then group results by agent or any tag (model, connection, environment) to compare performance across your fleet.
session_ctx.set_metrics({...})
2026.6SDK
June 2026
Faster agent startup
with niitaka.start_session() as s:
returns instantly
reply = run_agent(message)
# policies + pricing → fetched in background
start_session() no longer waits on network round-trips to fetch policies and pricing — both happen in the background now, and session end is fire-and-forget too. Startup latency is no longer coupled to Niitaka's response time, even on a slow connection.
start_session() — returns instantly
2026.6SDK
June 2026
Thread-safe session tracking
main thread
_tls.session_id
a1b2c3…
llm-judge thread
_tls.session_id
e5f6a7…
Session state is now fully isolated per thread. Fixed a race condition where a background thread — an async LLM-judge call, a parallel tool run — could cross-contaminate session state with the main request thread under concurrent load.
2026.6Security · SDK
June 2026
Credentials redacted, local models priced correctly
LLM event · input
{ model: "ollama/llama3",
api_key: "***",
... }
cost$0.00 · local
LLM call inputs are now scrubbed of api_key, api_base, and other credential fields before they reach Niitaka. Local models (Ollama and friends) get accurate $0 cost tracking instead of being billed at fallback rates — and any unrecognised model now shows $0 rather than a guessed price.
2026.6Platform
June 2026
Connection reliability
backend
databasekeepalive
Hardened backend connection handling against transient network drops, and fixed a rare error when viewing decision traces for background-thread sessions.
2026.5Feature · UI + SDK
May 2026
Filter sessions by custom tags
Active filtersconnection: prod-db ×
a1b2c3…db-analyst
connection: prod-dbteam: sales
e5f6a7…db-analyst
connection: prod-dbdb_type: postgres
c9d0e1…db-analyst
connection: prod-dbregion: us-west
Tag any session with key-value pairs — connection name, team, region, user ID, or any dimension that matters to you. Tags appear as clickable chips in the Sessions table: click a chip to filter instantly. Stack multiple tag filters; the stat tiles update in real time to reflect only the tagged subset.
start_session(tags={...})
2026.5SDK
May 2026
SDK works gracefully without configuration
with niitaka.start_session(
goal="analyze", agent_id="bot") as s:
reply = run_agent(message)
# works with or without api_key
No more defensive boilerplate. When api_key is not set, start_session() silently returns a no-op context manager and all logging calls are silent. Your agent code is identical whether Niitaka is configured or not — adopt it at your own pace or disable it in test environments.
start_session() returns no-op when unconfigured · niitaka.create_session()
2026.4Feature · SDK + Dashboard
May 2026
Name your LLM call sites, configure prompts from the dashboard
with niitaka.
prompt_slot("planner"):
call_llm(...)
→
Prompt Slots
planneractive
You are a planning assistant. Break down…
executor
Execute each step precisely. Report all…
Tag each LLM call site in your agent with a named slot — "planner", "sql_generator", "interpreter". When a runtime config or experiment variant defines a prompt_slots override for that name, the correct system prompt is injected automatically — no code changes, no redeploy.
niitaka.prompt_slot("name")
2026.4SDK
May 2026
Async LiteLLM fully instrumented
async def handle(msg):
resp = await litellm.acompletion(…)
● captured
return reply(resp)
# niitaka.instrument_litellm() ← once at startup
litellm.acompletion() is now captured alongside synchronous litellm.completion(). Async agents — FastAPI backends, asyncio pipelines, async LangChain chains — are fully observed with zero extra setup after calling instrument_litellm().
niitaka.instrument_litellm()
2026.4Feature · SDK + Dashboard
May 2026
Organise agents into folder hierarchies
Agents
team-alpha
research
summariser
analyst
ops
monitor
Group related agents under slash-separated folder paths. Folders are created automatically on first use — no dashboard setup required. Navigate the hierarchy in the Agents view, or scope policies and runtime configs to an entire folder at once.
start_session(folder_path="team/subfolder")
2026.3Feature · UI
April 2026
Search across all sessions and events
"rate limit error"
session goal: analyze Q3 sales data
API call failed — rate limit error on gpt-4o at step 3
session goal: summarise customer feedback
Retrying after rate limit error (attempt 2/3)…
Full-text search across session goals, event content, tool inputs/outputs, decisions, and error messages — all from one search bar. PostgreSQL trigram indexes power fast partial-match results with highlighted snippets so you can spot the relevant line without opening each event.
2026.3Feature · Platform
April 2026
One-click Slack integration for alerts
Connect to Slack
Post to channel
#ops-alerts✓
#general
#engineering
Connect your Slack workspace directly from the Alerts settings page — no webhook URL hunting or manual channel configuration. OAuth scopes are minimal: Niitaka only requests permission to post to the channels you select. Existing webhook-based channels continue to work unchanged.