Skip to content

Proxytrace 1.5.0

Choose a tag to compare

@github-actions github-actions released this 12 Jul 12:45
· 151 commits to master since this release
Immutable release. Only release title and notes can be modified.
0153e26

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-compatible 403 (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 the x-proxytrace-agent header. 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 returning 404, 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 optional x-proxytrace-agent header, 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/v1 or GET /{project}/openai/v1 with no trailing segment — used to throw a
    NullReferenceException and return an opaque 500. 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 its run_sql tool 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 proxyVersion field;
    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.