Changelog

Release Notes

New features, SDK improvements, and platform updates.

2026

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 ×
a1b2c3db-analyst
connection: prod-dbteam: sales
e5f6a7db-analyst
connection: prod-dbdb_type: postgres
c9d0e1db-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.