{"id":770,"date":"2026-04-22T12:38:14","date_gmt":"2026-04-22T04:38:14","guid":{"rendered":"https:\/\/connectword.dpdns.org\/?p=770"},"modified":"2026-04-22T12:38:14","modified_gmt":"2026-04-22T04:38:14","slug":"openai-open-sources-euphony-a-browser-based-visualization-tool-for-harmony-chat-data-and-codex-session-logs","status":"publish","type":"post","link":"https:\/\/connectword.dpdns.org\/?p=770","title":{"rendered":"OpenAI Open-Sources Euphony: A Browser-Based Visualization Tool for Harmony Chat Data and Codex Session Logs"},"content":{"rendered":"<p>Debugging an AI agent that runs for dozens of steps: reading files, calling APIs, writing code, and revising its own output, is not like debugging a regular function. There is no single stack trace to read. Instead, developers are left staring at hundreds of lines of raw JSON, trying to reconstruct what the model was actually thinking and doing at each step. OpenAI team is taking a direct swing at that problem with the release of <strong>Euphony<\/strong>, a new open-source browser-based visualization tool designed to turn structured chat data and Codex session logs into readable, interactive conversation views.<\/p>\n<p><strong>Euphony<\/strong> is built specifically around two of OpenAI\u2019s own data formats: <strong>Harmony<\/strong> conversations and <strong>Codex session JSONL<\/strong> files. <\/p>\n<h3 class=\"wp-block-heading\"><strong>What is the Harmony Format?<\/strong><\/h3>\n<p>To understand why Euphony exists, you need a quick primer on Harmony. OpenAI\u2019s open-weight model series, <code>gpt-oss<\/code>, was trained on a specialized prompt format called the <strong>harmony response format<\/strong>. Unlike standard chat formats, Harmony supports multi-channel outputs \u2014 meaning the model can produce reasoning output, tool calling preambles, and regular responses all within a single structured conversation. It also supports role-based instruction hierarchies (<code>system<\/code>, <code>developer<\/code>, <code>user<\/code>, <code>assistant<\/code>) and named tool namespaces.<\/p>\n<p>The result is that a single Harmony conversation stored as a <code>.json<\/code> or <code>.jsonl<\/code> file can contain a lot more structured metadata than a typical OpenAI API response. This richness is useful for training, evaluation, and agent workflows but it also makes raw inspection painful. Without tooling, you are reading deeply nested JSON objects with token IDs, decoded tokens, and rendered display strings all interleaved. Euphony was built to solve exactly this problem.<\/p>\n<h3 class=\"wp-block-heading\"><strong>What Euphony Actually Does<\/strong><\/h3>\n<p>At its core, Euphony is a <strong>web component library and standalone web app<\/strong> that ingests Harmony JSON\/JSONL data or Codex session JSONL files and renders them as structured, browseable conversation timelines in the browser.<\/p>\n<p>The tool supports <strong>three data loading methods<\/strong> out of the box: pasting JSON or JSONL directly from the clipboard, loading a local <code>.json<\/code> or <code>.jsonl<\/code> file from disk, or pointing it at any public HTTP(S) URL serving JSON or JSONL \u2014 including Hugging Face dataset URLs. Euphony then auto-detects the format and renders accordingly across four cases: if the JSONL is a list of conversations, it renders all conversations; if it detects a Codex session file, it renders a structured Codex session timeline; if a conversation is stored under a top-level field, it renders all conversations and treats other top-level fields as per-conversation metadata; and if none of those match, it falls back to rendering the data as raw JSON objects. <\/p>\n<p>The feature set goes well beyond basic rendering. Euphony surfaces <strong>conversation-level and message-level metadata<\/strong> directly in the UI through a dedicated metadata inspection panel \u2014 useful when evaluating annotated datasets where each conversation carries extra fields like scores, sources, or labels. It also supports <strong>JMESPath-based filtering<\/strong>, which lets developers narrow down large datasets by querying over the JSON structure. There is a <strong>focus mode<\/strong> that filters visible messages by role, recipient, or content type, a <strong>grid view<\/strong> for skimming datasets quickly, and an <strong>editor mode<\/strong> for directly modifying JSONL content in the browser. Markdown rendering (including mathematical formulas) and optional HTML rendering are supported inside message content.<\/p>\n<h3 class=\"wp-block-heading\"><strong>Two Operating Modes: Frontend-Only vs. Backend-Assisted<\/strong><\/h3>\n<p>Euphony is designed with a clean architectural split. In <strong>frontend-only mode<\/strong> (configured via the <code>VITE_EUPHONY_FRONTEND_ONLY=true<\/code> environment variable), the entire app runs in the browser with no server dependency. In <strong>backend-assisted mode<\/strong>, a local FastAPI Python server handles remote JSON\/JSONL loading, backend translation, and Harmony rendering \u2014 which is particularly useful for loading large datasets. <\/p>\n<h3 class=\"wp-block-heading\"><strong>Embedding Euphony in Your Own Web App<\/strong><\/h3>\n<p>One of the more practical features for AI dev teams is that Euphony ships as <strong>reusable custom elements<\/strong> \u2014 standard Web Components that can be embedded in any frontend framework: React, Svelte, Vue, or plain HTML. After building the library with <code>pnpm run build:library<\/code> (which outputs the main entrypoint at <code>.\/lib\/euphony.js<\/code>), you can drop a <code>&lt;euphony-conversation&gt;<\/code> element into your UI and pass it a Harmony conversation either as a JSON string attribute or as a parsed JavaScript object via the DOM. Visual styling is fully overridable through CSS custom properties, covering padding, font colors, and role-specific color coding for user and assistant messages.<\/p>\n<p>The tech stack is primarily TypeScript (78.7% of the codebase) with CSS and a Python backend layer, and it is released under the <strong>Apache 2.0 license<\/strong>.<\/p>\n<h3 class=\"wp-block-heading\"><strong>Key Takeaways<\/strong><\/h3>\n<ul class=\"wp-block-list\">\n<li><strong>OpenAI open-sourced Euphony<\/strong>, a browser-based visualization tool that converts raw Harmony JSON\/JSONL conversations and Codex session JSONL files into structured, browseable conversation timelines \u2014 no custom log parsers needed.<\/li>\n<li><strong>Euphony supports four auto-detection modes<\/strong>: it recognizes lists of Harmony conversations, Codex session files, conversations nested under top-level fields, and falls back to rendering arbitrary data as raw JSON objects.<\/li>\n<li><strong>The tool ships with a rich inspection feature set<\/strong> \u2014 including JMESPath filtering, focus mode (filter by role, recipient, or content type), conversation-level and message-level metadata inspection, grid view for dataset skimming, and an in-browser JSONL editor mode.<\/li>\n<li><strong>Euphony runs in two modes<\/strong>: a frontend-only mode recommended for static or external hosting, and an optional local backend-assisted mode powered by a FastAPI server that adds remote JSON\/JSONL loading, backend translation, and Harmony rendering \u2014 with OpenAI explicitly warning against exposing the backend externally due to SSRF risk.<\/li>\n<li><strong>Euphony is designed to be embeddable<\/strong>: it ships as reusable Web Components (<code>&lt;euphony-conversation&gt;<\/code>) compatible with React, Svelte, Vue, and plain HTML, with fully customizable styling via CSS custom properties, and is released under the Apache 2.0 license.<\/li>\n<\/ul>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<p>Check out\u00a0the<strong>\u00a0<a href=\"https:\/\/github.com\/openai\/euphony\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub Repo<\/a> and <a href=\"https:\/\/openai.github.io\/euphony\/\" target=\"_blank\" rel=\"noreferrer noopener\">Demo<\/a><\/strong>.<strong>\u00a0<\/strong>Also,\u00a0feel free to follow us on\u00a0<strong><a href=\"https:\/\/x.com\/intent\/follow?screen_name=marktechpost\" target=\"_blank\" rel=\"noreferrer noopener\"><mark>Twitter<\/mark><\/a><\/strong>\u00a0and don\u2019t forget to join our\u00a0<strong><a href=\"https:\/\/www.reddit.com\/r\/machinelearningnews\/\" target=\"_blank\" rel=\"noreferrer noopener\">130k+ ML SubReddit<\/a><\/strong>\u00a0and Subscribe to\u00a0<strong><a href=\"https:\/\/www.aidevsignals.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">our Newsletter<\/a><\/strong>. Wait! are you on telegram?\u00a0<strong><a href=\"https:\/\/t.me\/machinelearningresearchnews\" target=\"_blank\" rel=\"noreferrer noopener\">now you can join us on telegram as well.<\/a><\/strong><\/p>\n<p>Need to partner with us for promoting your GitHub Repo OR Hugging Face Page OR Product Release OR Webinar etc.?\u00a0<strong><a href=\"https:\/\/forms.gle\/MTNLpmJtsFA3VRVd9\" target=\"_blank\" rel=\"noreferrer noopener\"><mark>Connect with us<\/mark><\/a><\/strong><\/p>\n<p>The post <a href=\"https:\/\/www.marktechpost.com\/2026\/04\/21\/openai-open-sources-euphony-a-browser-based-visualization-tool-for-harmony-chat-data-and-codex-session-logs\/\">OpenAI Open-Sources Euphony: A Browser-Based Visualization Tool for Harmony Chat Data and Codex Session Logs<\/a> appeared first on <a href=\"https:\/\/www.marktechpost.com\/\">MarkTechPost<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Debugging an AI agent that run&hellip;<\/p>\n","protected":false},"author":1,"featured_media":29,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-770","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=\/wp\/v2\/posts\/770","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=770"}],"version-history":[{"count":0,"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=\/wp\/v2\/posts\/770\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=\/wp\/v2\/media\/29"}],"wp:attachment":[{"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=770"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=770"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/connectword.dpdns.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=770"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}