Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
9e59779
refactor: replace icon imports with specific icon components in Evalu…
bekossy Dec 30, 2025
23b05c0
refactor: improve layout and styling in evaluation result components
bekossy Dec 31, 2025
b0e9904
refactor: enhance layout and add typography to AggregatedOverviewSect…
bekossy Dec 31, 2025
e301624
refactor: enhance EvaluatorMetricsChart with delta computation and im…
bekossy Dec 31, 2025
d73c4e5
refactor: add toneOverride and showIconOverride props to reference la…
bekossy Dec 31, 2025
3ebb2e5
refactor: enhance PreviewEvalRunMeta with comparison functionality an…
bekossy Dec 31, 2025
aed9351
refactor: streamline CompareRunsMenu and PreviewEvalRunHeader compone…
bekossy Jan 2, 2026
fbf2cba
refactor: implement EvaluationRunTag component and integrate it into …
bekossy Jan 2, 2026
710daa4
refactor: update EvalRunDetailsTable and evaluations.css for improved…
bekossy Jan 2, 2026
89f2c0a
refactor: simplify FocusDrawerSidePanel by removing unused metric nod…
bekossy Jan 2, 2026
0a7fa80
refactor: enhance CustomTreeComponent integration and improve styling…
bekossy Jan 2, 2026
08ee759
refactor: enhance GeneralSection and InvocationSection components, im…
bekossy Jan 3, 2026
7bac587
refactor: enhance FocusDrawer component structure and styling, improv…
bekossy Jan 3, 2026
31be0ce
Merge branch 'AGE-3539-/-frontend-unify-evaluation-result-scenarios-p…
bekossy Jan 3, 2026
0718d75
fix(frontend): keep scenario row tint on hover
bekossy Jan 5, 2026
67eb181
fix
bekossy Jan 5, 2026
2e858c2
Merge pull request #3349 from Agenta-AI/AGE-3539-/-frontend-unify-eva…
bekossy Jan 5, 2026
5ac29f8
Merge pull request #3348 from Agenta-AI/AGE-3539-/-frontend-unify-eva…
bekossy Jan 5, 2026
5ae542b
fix
bekossy Jan 5, 2026
8f99c1b
Merge branch 'main' into AGE-3539-/-frontend-unify-evaluation-result-…
bekossy Jan 5, 2026
dcdaae8
Merge branch 'frontend-feat/new-testsets-integration' into AGE-3539-/…
bekossy Jan 5, 2026
2a22514
Merge branch 'frontend-feat/new-testsets-integration' into AGE-3539-/…
bekossy Jan 5, 2026
fe8c7b9
fix
bekossy Jan 5, 2026
3cae37b
fix
bekossy Jan 5, 2026
18a430e
Merge branch 'release/v0.73.0' into AGE-3539-/-frontend-unify-evaluat…
bekossy Jan 5, 2026
aaaca36
Merge branch 'main' into AGE-3539-/-frontend-unify-evaluation-result-…
bekossy Jan 6, 2026
0b8183f
Enhance accessibility and keyboard navigation for tree and configurat…
bekossy Jan 6, 2026
5350265
Refactor layout and styles for EvaluatorMetricsChart, AggregatedOverv…
bekossy Jan 6, 2026
adc5272
v0.76.0
junaway Jan 7, 2026
a57b9e3
Enhance evaluation result overview: refactor table export logic, impr…
bekossy Jan 7, 2026
44b7efc
updated compare runs menu
bekossy Jan 7, 2026
d46b80c
Refactor EvalRunDetails components: improve overflow handling in Tabl…
bekossy Jan 7, 2026
7f99d05
fix
bekossy Jan 7, 2026
4c291e4
Refactor EvalRunDetails components: streamline layout, enhance access…
bekossy Jan 8, 2026
9d14463
fix
bekossy Jan 8, 2026
f5606dd
Merge branch 'main' into AGE-3539-/-frontend-unify-evaluation-result-…
bekossy Jan 8, 2026
3e9aefb
fix
bekossy Jan 8, 2026
3399f74
fix
bekossy Jan 8, 2026
8cd277a
fix
bekossy Jan 8, 2026
2b5f929
fix
bekossy Jan 8, 2026
6ab63ba
Merge pull request #3336 from Agenta-AI/AGE-3539-/-frontend-unify-eva…
bekossy Jan 8, 2026
9a6e99b
Merge branch 'main' into release/v0.76.0
bekossy Jan 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion api/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "api"
version = "0.75.1"
version = "0.76.0"
description = "Agenta API"
authors = [
{ name = "Mahmoud Mabrouk", email = "[email protected]" },
Expand Down
2 changes: 1 addition & 1 deletion sdk/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "agenta"
version = "0.75.1"
version = "0.76.0"
description = "The SDK for agenta is an open-source LLMOps platform."
readme = "README.md"
authors = [
Expand Down
2 changes: 1 addition & 1 deletion web/ee/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@agenta/ee",
"version": "0.75.1",
"version": "0.76.0",
"private": true,
"engines": {
"node": ">=18"
Expand Down
2 changes: 1 addition & 1 deletion web/oss/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@agenta/oss",
"version": "0.75.1",
"version": "0.76.0",
"private": true,
"engines": {
"node": ">=18"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,22 @@ export const useStyles = createUseStyles((theme: JSSTheme) => ({
position: "absolute",
left: 6,
top: 0,
bottom: -6,
bottom: -12,
width: 1,
backgroundColor: theme.colorBorder,
},
"&.last::before": {
height: "50%",
bottom: "auto",
},
},
nodeLabel: {
position: "relative",
cursor: "default",
display: "flex",
alignItems: "center",
marginTop: 4,
marginBottom: 4,
marginTop: 12,
marginBottom: 12,
"&::before": {
content: "''",
position: "absolute",
Expand Down
117 changes: 80 additions & 37 deletions web/oss/src/components/CustomUIs/CustomTreeComponent/index.tsx
Original file line number Diff line number Diff line change
@@ -1,67 +1,96 @@
import React, {useState} from "react"
import React, {useMemo, useState} from "react"

import {MinusSquareOutlined, PlusSquareOutlined} from "@ant-design/icons"

import {TreeContent} from "@/oss/components/SharedDrawers/TraceDrawer/components/TraceTree"
import {TraceSpanNode} from "@/oss/services/tracing/types"

import {useStyles} from "./assets/styles"

/**
* CustomTree is a recursive tree view component for rendering a hierarchy of nodes.
*
* This component is highly customizable and highlights the selected node.
* It supports displaying additional metrics like latency, cost, and token usage.
* It supports custom node rendering and optional default expansion.
*
* Example usage:
* ```tsx
* <CustomTree
* data={rootNode}
* settings={{ latency: true, cost: false, tokens: true }}
* getKey={(node) => node.id}
* getChildren={(node) => node.children}
* renderLabel={(node) => node.title}
* selectedKey={selectedNodeId}
* onSelect={(key) => setSelectedNodeId(key)}
* onSelect={(key, node) => setSelectedNodeId(key)}
* />
* ```
*/
interface TreeProps {
interface TreeProps<TNode> {
/**
* Root node of the hierarchical data structure.
*/
data: TraceSpanNode
data: TNode

/**
* Returns a stable key for a node.
*/
getKey: (node: TNode) => string

/**
* Settings for what additional metrics to show in each node.
* Returns child nodes for a node.
*/
settings: {
latency: boolean
cost: boolean
tokens: boolean
}
getChildren: (node: TNode) => TNode[] | undefined

/**
* Render the label content for a node.
*/
renderLabel: (node: TNode) => React.ReactNode

/**
* The currently selected node key (ID).
*/
selectedKey: string | null
selectedKey?: string | null

/**
* Function to handle when a node is selected.
*/
onSelect: (key: string) => void
onSelect?: (key: string, node: TNode) => void

/**
* Default expansion state for nodes without explicit `expanded` metadata.
*/
defaultExpanded?: boolean
}

const TreeNodeComponent: React.FC<{
node: TraceSpanNode
const TreeNodeComponent = <TNode,>({
node,
isLast,
getKey,
getChildren,
renderLabel,
selectedKey,
onSelect,
defaultExpanded = true,
isRoot = false,
}: {
node: TNode
isLast: boolean
settings: {latency: boolean; cost: boolean; tokens: boolean}
selectedKey: string | null
onSelect: (key: string) => void
getKey: (node: TNode) => string
getChildren: (node: TNode) => TNode[] | undefined
renderLabel: (node: TNode) => React.ReactNode
selectedKey?: string | null
onSelect?: (key: string, node: TNode) => void
defaultExpanded?: boolean
isRoot?: boolean
}> = ({node, isLast, settings, selectedKey, onSelect, isRoot = false}) => {
}) => {
const classes = useStyles()
const [expanded, setExpanded] = useState(
typeof (node as any).expanded === "boolean" ? (node as any).expanded : true,
)
const hasChildren = node.children && node.children.length > 0
const initialExpanded = useMemo(() => {
if (typeof (node as {expanded?: boolean}).expanded === "boolean") {
return (node as {expanded?: boolean}).expanded as boolean
}
return defaultExpanded
}, [defaultExpanded, node])
const [expanded, setExpanded] = useState(initialExpanded)
const children = getChildren(node) ?? []
const hasChildren = children.length > 0
const nodeKey = getKey(node)

const toggle = () => setExpanded((prev) => !prev)

Expand All @@ -81,7 +110,7 @@ const TreeNodeComponent: React.FC<{
? `${classes.nodeLabel} ${shouldShowAsLast ? "last" : ""}`
: "flex items-center"
}
onClick={() => onSelect(node.span_id)}
onClick={() => onSelect?.(nodeKey, node)}
>
{hasChildren && (
<span
Expand All @@ -98,24 +127,27 @@ const TreeNodeComponent: React.FC<{
className={
classes.nodeLabelContent +
" " +
(node.span_id === selectedKey ? "bg-[#F5F7FA]" : "")
(nodeKey === selectedKey ? "bg-[#F5F7FA]" : "")
}
>
<TreeContent value={node} settings={settings} />
{renderLabel(node)}
</div>
</div>
</div>

{hasChildren && expanded && (
<div>
{node.children!.map((child, index) => (
{children.map((child, index) => (
<TreeNodeComponent
key={index}
key={getKey(child)}
node={child}
isLast={index === node.children!.length - 1}
settings={settings}
isLast={index === children.length - 1}
getKey={getKey}
getChildren={getChildren}
renderLabel={renderLabel}
selectedKey={selectedKey}
onSelect={onSelect}
defaultExpanded={defaultExpanded}
isRoot={false}
/>
))}
Expand All @@ -125,15 +157,26 @@ const TreeNodeComponent: React.FC<{
)
}

const CustomTree: React.FC<TreeProps> = ({data, settings, selectedKey, onSelect}) => {
const CustomTree = <TNode,>({
data,
getKey,
getChildren,
renderLabel,
selectedKey,
onSelect,
defaultExpanded,
}: TreeProps<TNode>) => {
return (
<div className={"h-full overflow-y-auto p-2"}>
<div className={"overflow-y-auto p-2"}>
<TreeNodeComponent
node={data}
isLast={false}
settings={settings}
getKey={getKey}
getChildren={getChildren}
renderLabel={renderLabel}
selectedKey={selectedKey}
onSelect={onSelect}
defaultExpanded={defaultExpanded}
isRoot={true}
/>
</div>
Expand Down
Loading