Proxytrace 1.5.0
Added
-
Ask Tracey everywhere. Context-aware ⚡ Ask Tracey buttons now appear throughout the
app — on a trace's detail drawer (anomaly-aware: flagged traces ask why did this anomaly
happen and how do we prevent it, with the detector hits passed along), on an agent's header
(pass-rate-aware: agents with weak suites ask for an improvement to A/B-test), on a test
run's header (explain the failures and suggest fixes), on a theory's drawer (walk through the
proposal and recommend accept/reject), and on the Anomalies and Dashboard pages (project-wide
investigation / health review). Clicking one jumps to Tracey AI and starts a fresh
conversation pre-loaded with the entity's context; the previous conversation is kept in the
history rail. -
Real-time blocking anomaly detectors. A custom anomaly detector can now also block: turn
on Block matching requests at the proxy and the proxy checks each incoming request's body
against the detector's phrase/regex triggers before forwarding — on a match the request is
rejected with an OpenAI-compatible403(code: proxytrace_blocked) and never reaches the
upstream provider. The canonical use case is stopping secrets (e.g. a password pattern) from
being sent to the LLM provider. Blocked calls still show up as traces, flagged Blocked at
proxy, with the detector and matched trigger attributed in the trace's anomaly banner, a live
entry on the Anomaly dashboard, and a notification. Blocking is trigger-match only (the LLM
review never runs in the request path), applies rule changes within ~30 seconds, fails open if
the rules cannot be loaded, and — for detectors scoped to specific agents — enforces only when
the client names its agent via thex-proxytrace-agentheader. Part of the Enterprise custom
anomaly detectors feature. -
Sortable trace table + composable filters. The Traces table can now be sorted by any
metric column — Latency, Tokens, Tools, Cached, or Time — with a click on the column header
(click again to flip direction); sorting is server-side, so "slowest call" means across all
matching traces, not just the visible page. The toolbar's agent dropdown and "Outliers only"
pill are replaced by a composable + Filter button that sits on the toolbar line beside
search and the time range: stack removable filter chips for agent, anomaly type (any, or a
specific reason like high latency or a custom-detector hit), tool name (picked from the tools
your traces actually called — and once you've picked an agent, only the tools that agent
used), model, HTTP status class (2xx/4xx/5xx), token/latency ranges,
and System traces (include traces from system agents — chosen from + Filter instead
of a separate toggle). Filters combine, the timeline follows them, and
your chips are remembered per project. Traces captured before this release are indexed
automatically on upgrade so the tool-name filter covers them too. -
A new Anomaly dashboard. A dedicated Anomalies page (in the sidebar, after Traces) brings
every agent's anomalies together in one place: a table of recently flagged calls (agent, message
preview, why it was flagged, when) beside a statistics column — a live, stacked per-agent
timeline with an agent legend (five-minute, hourly, or daily buckets), summary tiles (flagged
calls, statistical vs. detector flags, agents affected), and a Most flagged agents ranking
with proportional share bars. Filter by agent and click any row to open the trace's full detail
panel right on the dashboard (the same panel as the Traces page, with prev/next stepping through
the flagged calls). The whole page updates in real time as calls are captured and flagged. -
Custom LLM-based anomaly detectors (Enterprise). Define your own anomaly detectors per
project: describe what "anomalous" means in plain-language review instructions, pick a review
model, and set 1–20 trigger words or regular expressions that gate which calls get reviewed. When
a trigger matches a new turn, the detector's model reviews it and — on an anomalous verdict — flags
the call with a Custom detector chip, adds it to the Anomaly dashboard, and raises a
notification that deep-links to the trace. Scope a detector to all agents or selected ones, and
enable or disable it without losing its configuration. Because reviews cost one model call per
trigger-matched turn, triggers keep the LLM focused only on the calls that could be a problem.
Detectors are managed on the dashboard's Detectors tab — a two-column view (like Evaluators)
with the searchable detector list on the left and the selected detector's instructions, triggers,
and agent scope on the right, including a quick enable/disable toggle in the detail header. -
Anomalous traces announce themselves in the trace detail panel. Opening a flagged call's
details — from the Traces list or the Anomaly dashboard — now shows an Anomalous trace
warning banner right below the header: the statistical reasons as chips (high latency, high
token count, …) and, for custom-detector hits, the detector's name, the trigger that matched,
and the reviewer's reasoning. -
Non-LLM upstream endpoints now pass through the proxy. Any path under your project base URL
that isn't part of the OpenAI API (for example/{project}/health) is transparently forwarded to
your provider's upstream host instead of returning404, so clients can reach a provider's health
check or other endpoints through the same base URL they use for completions. These pass-through
calls are not captured as traces and still require a valid project API key. Redirect, throttling,
and caching response headers (Location,Retry-After,Allow,Cache-Control) are relayed,
and upstream redirects are passed back to the client verbatim instead of being followed
server-side.
Changed
-
Proxytrace is now source-available. The full source code is public at
github.com/Proxytrace/Proxytrace under the
Elastic License 2.0: read, build, run, and modify it freely. Providing Proxytrace as a
managed service to third parties and removing or circumventing the license-key
functionality are not permitted. Paid tiers keep working exactly as before — unlocked
with a license key. -
Quick-start now teaches deterministic agent naming. The ingestion quick-start — the
Traces empty state and the setup wizard's final step — and the proxy setup guide now show
the optionalx-proxytrace-agentheader, which attributes calls to the named agent
directly instead of relying on prompt-similarity matching. -
The dashboard is now a live mission control. A new full-width pulse band charts
per-minute call activity over the last hour and beats in real time as traces arrive. The
live trace feed moved to center stage with richer rows (agent identity, live age, arrival
flash), the token headline grew into an animated gradient display, and queue depth and p95
latency joined the stat tiles. Charts draw in on load; all motion honors reduced-motion
preferences. The old telemetry strip's proxy-version label was retired along with the strip
itself. -
The dashboard's lower half got the mission-control treatment. The old donut, one-bar
latency histogram, and agent-card grid are replaced by two denser, more honest sections:
an Agent fleet roster — one row per agent with its own activity sparkline (the top
pulse band, decomposed per agent), endpoint, token total and fleet share, trace count, and
last-active time — and a Latency spectrum showing each endpoint's min→max latency span
on a shared log scale with p50/p95/p99 markers, alongside the project-wide percentile
strip. The fleet header's proposals chip now shows the real count of pending
optimization proposals (it was previously a static placeholder) and links to the
Proposals view. -
The Proposals page is now a review desk. The four-column theory kanban (whose first two
columns sat empty most of the time) is replaced by a master/detail decision inbox. A queue
rail groups theories by urgency — Needs decision first, then Awaiting adoption, live
In flight items, and a collapsed History — and a loop strip across the top shows the
optimization pipeline at a glance (testing → need decision → awaiting adoption → decided,
closing with the total proven gain; each node jumps to its group). Selecting an item opens a
full-width dossier in place of the old drawer: the measured gain and significance lead, the
proposed change diff finally has room, evidence (A/B results, source runs, rationale) sits
alongside, and Promote / Dismiss live in a pinned decision bar. Promoted proposals surface
their handoff package first; validated-but-promoted, adopted, and dismissed items no longer
masquerade as reviewable. -
The sidebar now follows your workflow. Navigation is regrouped into Monitor
(Dashboard, Traces, Anomalies), Build (Agents, Agent Playground), and Improve — the
whole optimization loop in order (Test Suites, Evaluators, Evaluator Playground, Test Runs,
Proposals), so a proposal and the run that produced it finally live side by side. Tracey AI
moved to a dedicated slot at the top, and the Audit Log, an admin Settings shortcut,
and the Documentation link now sit together in a utility area above the project selector. -
Tracey AI chat is easier on the eyes — and looks the part. Chat messages, the composer, and
in-chat headings now render at a comfortable reading size instead of the app's compact data
scale, and the whole page picked up an identity: an animated gold-and-teal halo around Tracey's
avatar (it spins while she's thinking), a soft aurora across the top of the chat panel, a
gradient-lit wordmark and welcome screen, a shimmering Thinking… indicator, and larger
starter/follow-up chips. All motion respects your system's reduced-motion preference. -
Clearer trace detail header. The trace drawer's header now leads with the identity that
matters: the agent (entity-colored, click to open its page), the model, and the HTTP status
on the first line; the full trace ID (with copy) and the exact capture time — date and time
to the second — on the line below. Promote to test case is renamed to the shorter
Add test (the dialog it opens follows suit), and the redundant Create suite → link is
gone — the Add test tooltip now points to the Test Suites page when the agent has no suite
yet. -
Compact page layouts everywhere. The remaining pages that still opened with a large
title and subtitle — Proposals, Anomalies, Error Log, Audit Log, Users, and Account
security — now start directly with their content (the top bar's breadcrumb already names
the page). Filters and actions that lived in those headers moved into the pages' toolbars.
Fixed
- Provider endpoint URLs no longer need the
https://prefix. Entering an upstream
endpoint without a scheme (e.g.api.openai.com/v1) — in the setup wizard or in
Settings → Providers — previously failed with an unexpected-error toast.https://is now
assumed when no scheme is given, and a genuinely malformed URL returns a clear validation
message instead of a server error. - Live updates stop needing a page reload. Real-time streams (new traces, notifications,
anomalies, run progress) no longer go silent after a dropped connection. The stream credential is
single-use, so the browser's automatic reconnect was replaying a consumed ticket and getting
rejected — permanently killing the stream after the first blip (a server restart, a proxy timeout,
a laptop waking from sleep) until you reloaded the page. The client now reconnects with a fresh
ticket and an exponential backoff, so the Traces list and other live views keep updating on their
own. - The redesigned dashboard's labels (activity band, live feed, queue and latency tiles) are now
translated into German, Spanish, French, and Italian instead of falling back to English. - The proxy no longer errors on a bare base URL. Hitting the traced proxy surface with an empty
path —GET /openai/v1orGET /{project}/openai/v1with no trailing segment — used to throw a
NullReferenceExceptionand return an opaque500. The empty path is now handled cleanly instead
of faulting. - Dashboard metric tiles and the pass-rate gauge now show real numbers, not placeholders. The
trend chips on the Traces, Avg Latency, Throughput, and Pass Rate tiles were hardcoded (+24%,
-8%,+18%,+7pt) and never moved with your traffic; they now compare the first and last half
of each tile's own trend series and show the true change — or nothing at all when there isn't
enough data. The pass-rate gauge's footer showed a fabricated best and a made-up 90% target;
it now reports the real change since the previous run and the best pass rate across your recent
runs, and the fake target is gone. - Agent colors are distinct again in charts, legends, and badges. The per-agent color palette
had eight slots but only about three visibly different hues (three near-identical warm golds, plus
a repeated teal and green), so unrelated agents routinely drew the same color — on some seeds every
bar, dot, and legend entry on the Anomalies dashboard rendered the same amber, erasing the only
thing distinguishing one agent from another. The palette is now eight genuinely distinct,
theme-legible hues (also used for project and provider colors), so stacked timelines, the
most-flagged-agents ranking, agent badges, and the project/provider avatars stay readable. - Settings project and member avatars get distinct colors too. The Settings project list, the
Settings members list, and the add-member picker drew their avatar colors from a second, separate
palette that still carried the original defect — six slots collapsing to about three visible hues
(a repeated teal and three near-identical warm golds) — so unrelated projects and teammates kept
landing on the same or an indistinguishable color even after the agent palette was deduplicated.
These avatars now share the single eight-hue palette used everywhere else, so each project and
member reads as its own color. - The kiosk demo no longer spews failed test-run errors on boot. The showcase's seeded
incident run and its hidden A/B comparison runs were persisted in a not-yet-finished state and
then executed by the real test runner against the read-only demo model, which has no LLM
endpoint — so every case failed with a fail-level stack trace and raced the seeder. Those runs
are now seeded directly in their final state (a failed run stays failed, a completed run stays
completed), so nothing re-runs them and the boot logs stay clean. - The kiosk demo's "Data Analytics — SQL Correctness" suite passes on a live re-run. The
Data Analytics agent is told to answer from itsrun_sqltool rather than invent numbers, so
its first turn is a tool call. Each seeded case now includes the tool round-trip (the query and
its returned rows) in its input, so re-running the suite against a configured demo model scores
the final written answer instead of failing on the intermediate tool-call turn. - The kiosk demo's tool-name filter no longer lists tools whose traces have expired. With trace
retention active, a long-running kiosk (or in-memory demo) deleted old traces but left their
per-call tool-name rows behind, so the Traces tool-name filter kept offering tools that then
matched no traces. Retention now removes those child rows together with the trace, matching the
cascade the persistent PostgreSQL deployments already enforced (they were never affected).
Removed
- The dashboard API's live-telemetry payload no longer carries the unused
proxyVersionfield;
its only consumer was the retired telemetry strip.
Security
-
Role changes now take effect immediately. Session tokens bake the user's role at
login, but the API trusted that baked role for the token's full 7-day lifetime — so a
demoted admin kept admin access until their token expired. The API now re-reads the live
role from the database on every request and ignores the stale token claim, so a demotion
(or promotion) applies on the user's very next request. -
Official images now trust only the production license-signing key. Images published before
this release embedded a throwaway test key whose private half is public knowledge, so a
self-signed license token could unlock paid tiers on a stock image. The embedded key is rotated
to the current production key, and the test key is now baked into the development, e2e, and perf
images only, through a compile-time build argument — a shipped image trusts exactly the keys it
was built with and never a runtime value. No customer licenses were issued against the retired
key, so existing installations are unaffected; license keys issued by Proxytrace continue to
validate as before. -
The proxy's path-traversal guard now resists URL-encoding. The guard that rejects
..in a
forwarded proxy path previously matched only a literal.., so a percent-encoded%2e%2e(or
double-encoded%252e%252e) slipped past it. The path is now fully decoded before the check, on
both the traced and pass-through proxy routes. This was not exploitable — the forward host stays
pinned to the configured provider origin (no cross-host SSRF) — so the change is defense-in-depth.