arize-phoenix 4.22.0__py3-none-any.whl → 4.23.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of arize-phoenix might be problematic. Click here for more details.
- {arize_phoenix-4.22.0.dist-info → arize_phoenix-4.23.0.dist-info}/METADATA +1 -1
- {arize_phoenix-4.22.0.dist-info → arize_phoenix-4.23.0.dist-info}/RECORD +30 -32
- phoenix/experiments/functions.py +4 -4
- phoenix/experiments/types.py +3 -3
- phoenix/server/api/context.py +0 -6
- phoenix/server/api/dataloaders/__init__.py +0 -9
- phoenix/server/api/mutations/dataset_mutations.py +52 -12
- phoenix/server/api/queries.py +30 -0
- phoenix/server/api/routers/v1/experiment_runs.py +7 -2
- phoenix/server/api/types/Evaluation.py +1 -26
- phoenix/server/api/types/Project.py +1 -60
- phoenix/server/api/types/Span.py +21 -11
- phoenix/server/api/types/User.py +13 -0
- phoenix/server/app.py +5 -11
- phoenix/server/dml_event_handler.py +0 -3
- phoenix/server/main.py +12 -0
- phoenix/server/static/.vite/manifest.json +31 -31
- phoenix/server/static/assets/{components-Bhx3QVW0.js → components-DBYPF96c.js} +48 -48
- phoenix/server/static/assets/index-DNxu4viw.js +100 -0
- phoenix/server/static/assets/{pages-DG-5zgoV.js → pages-BhOnrUmC.js} +229 -204
- phoenix/server/static/assets/{vendor-BMWfu6zp.js → vendor-CIqy43_9.js} +1 -1
- phoenix/server/static/assets/{vendor-arizeai-Sj74jm5V.js → vendor-arizeai-B1YgcWL8.js} +1 -1
- phoenix/server/static/assets/{vendor-codemirror-DO3VqEcD.js → vendor-codemirror-_bcwCA1C.js} +1 -1
- phoenix/server/static/assets/{vendor-recharts-BGN0SxgJ.js → vendor-recharts-C3pM_Wlg.js} +1 -1
- phoenix/server/templates/index.html +2 -1
- phoenix/session/session.py +1 -0
- phoenix/version.py +1 -1
- phoenix/server/api/dataloaders/evaluation_summaries.py +0 -149
- phoenix/server/api/dataloaders/span_evaluations.py +0 -35
- phoenix/server/api/dataloaders/trace_evaluations.py +0 -35
- phoenix/server/static/assets/index-CZg-95kd.js +0 -100
- {arize_phoenix-4.22.0.dist-info → arize_phoenix-4.23.0.dist-info}/WHEEL +0 -0
- {arize_phoenix-4.22.0.dist-info → arize_phoenix-4.23.0.dist-info}/licenses/IP_NOTICE +0 -0
- {arize_phoenix-4.22.0.dist-info → arize_phoenix-4.23.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
from collections import defaultdict
|
|
2
|
-
from datetime import datetime
|
|
3
|
-
from typing import (
|
|
4
|
-
Any,
|
|
5
|
-
DefaultDict,
|
|
6
|
-
List,
|
|
7
|
-
Literal,
|
|
8
|
-
Optional,
|
|
9
|
-
Tuple,
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
import pandas as pd
|
|
13
|
-
from aioitertools.itertools import groupby
|
|
14
|
-
from cachetools import LFUCache, TTLCache
|
|
15
|
-
from sqlalchemy import Select, func, or_, select
|
|
16
|
-
from strawberry.dataloader import AbstractCache, DataLoader
|
|
17
|
-
from typing_extensions import TypeAlias, assert_never
|
|
18
|
-
|
|
19
|
-
from phoenix.db import models
|
|
20
|
-
from phoenix.server.api.dataloaders.cache import TwoTierCache
|
|
21
|
-
from phoenix.server.api.input_types.TimeRange import TimeRange
|
|
22
|
-
from phoenix.server.api.types.EvaluationSummary import EvaluationSummary
|
|
23
|
-
from phoenix.server.types import DbSessionFactory
|
|
24
|
-
from phoenix.trace.dsl import SpanFilter
|
|
25
|
-
|
|
26
|
-
Kind: TypeAlias = Literal["span", "trace"]
|
|
27
|
-
ProjectRowId: TypeAlias = int
|
|
28
|
-
TimeInterval: TypeAlias = Tuple[Optional[datetime], Optional[datetime]]
|
|
29
|
-
FilterCondition: TypeAlias = Optional[str]
|
|
30
|
-
EvalName: TypeAlias = str
|
|
31
|
-
|
|
32
|
-
Segment: TypeAlias = Tuple[Kind, ProjectRowId, TimeInterval, FilterCondition]
|
|
33
|
-
Param: TypeAlias = EvalName
|
|
34
|
-
|
|
35
|
-
Key: TypeAlias = Tuple[Kind, ProjectRowId, Optional[TimeRange], FilterCondition, EvalName]
|
|
36
|
-
Result: TypeAlias = Optional[EvaluationSummary]
|
|
37
|
-
ResultPosition: TypeAlias = int
|
|
38
|
-
DEFAULT_VALUE: Result = None
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
def _cache_key_fn(key: Key) -> Tuple[Segment, Param]:
|
|
42
|
-
kind, project_rowid, time_range, filter_condition, eval_name = key
|
|
43
|
-
interval = (
|
|
44
|
-
(time_range.start, time_range.end) if isinstance(time_range, TimeRange) else (None, None)
|
|
45
|
-
)
|
|
46
|
-
return (kind, project_rowid, interval, filter_condition), eval_name
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
_Section: TypeAlias = Tuple[ProjectRowId, EvalName, Kind]
|
|
50
|
-
_SubKey: TypeAlias = Tuple[TimeInterval, FilterCondition]
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
class EvaluationSummaryCache(
|
|
54
|
-
TwoTierCache[Key, Result, _Section, _SubKey],
|
|
55
|
-
):
|
|
56
|
-
def __init__(self) -> None:
|
|
57
|
-
super().__init__(
|
|
58
|
-
# TTL=3600 (1-hour) because time intervals are always moving forward, but
|
|
59
|
-
# interval endpoints are rounded down to the hour by the UI, so anything
|
|
60
|
-
# older than an hour most likely won't be a cache-hit anyway.
|
|
61
|
-
main_cache=TTLCache(maxsize=64 * 32 * 2, ttl=3600),
|
|
62
|
-
sub_cache_factory=lambda: LFUCache(maxsize=2 * 2),
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
def invalidate_project(self, project_rowid: ProjectRowId) -> None:
|
|
66
|
-
for section in self._cache.keys():
|
|
67
|
-
if section[0] == project_rowid:
|
|
68
|
-
del self._cache[section]
|
|
69
|
-
|
|
70
|
-
def _cache_key(self, key: Key) -> Tuple[_Section, _SubKey]:
|
|
71
|
-
(kind, project_rowid, interval, filter_condition), eval_name = _cache_key_fn(key)
|
|
72
|
-
return (project_rowid, eval_name, kind), (interval, filter_condition)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
class EvaluationSummaryDataLoader(DataLoader[Key, Result]):
|
|
76
|
-
def __init__(
|
|
77
|
-
self,
|
|
78
|
-
db: DbSessionFactory,
|
|
79
|
-
cache_map: Optional[AbstractCache[Key, Result]] = None,
|
|
80
|
-
) -> None:
|
|
81
|
-
super().__init__(
|
|
82
|
-
load_fn=self._load_fn,
|
|
83
|
-
cache_key_fn=_cache_key_fn,
|
|
84
|
-
cache_map=cache_map,
|
|
85
|
-
)
|
|
86
|
-
self._db = db
|
|
87
|
-
|
|
88
|
-
async def _load_fn(self, keys: List[Key]) -> List[Result]:
|
|
89
|
-
results: List[Result] = [DEFAULT_VALUE] * len(keys)
|
|
90
|
-
arguments: DefaultDict[
|
|
91
|
-
Segment,
|
|
92
|
-
DefaultDict[Param, List[ResultPosition]],
|
|
93
|
-
] = defaultdict(lambda: defaultdict(list))
|
|
94
|
-
for position, key in enumerate(keys):
|
|
95
|
-
segment, param = _cache_key_fn(key)
|
|
96
|
-
arguments[segment][param].append(position)
|
|
97
|
-
for segment, params in arguments.items():
|
|
98
|
-
stmt = _get_stmt(segment, *params.keys())
|
|
99
|
-
async with self._db() as session:
|
|
100
|
-
data = await session.stream(stmt)
|
|
101
|
-
async for eval_name, group in groupby(data, lambda row: row.name):
|
|
102
|
-
summary = EvaluationSummary(pd.DataFrame(group))
|
|
103
|
-
for position in params[eval_name]:
|
|
104
|
-
results[position] = summary
|
|
105
|
-
return results
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
def _get_stmt(
|
|
109
|
-
segment: Segment,
|
|
110
|
-
*eval_names: Param,
|
|
111
|
-
) -> Select[Any]:
|
|
112
|
-
kind, project_rowid, (start_time, end_time), filter_condition = segment
|
|
113
|
-
stmt = select()
|
|
114
|
-
if kind == "span":
|
|
115
|
-
msa = models.SpanAnnotation
|
|
116
|
-
name_column, label_column, score_column = msa.name, msa.label, msa.score
|
|
117
|
-
annotator_kind_column = msa.annotator_kind
|
|
118
|
-
time_column = models.Span.start_time
|
|
119
|
-
stmt = stmt.join(models.Span).join_from(models.Span, models.Trace)
|
|
120
|
-
if filter_condition:
|
|
121
|
-
sf = SpanFilter(filter_condition)
|
|
122
|
-
stmt = sf(stmt)
|
|
123
|
-
elif kind == "trace":
|
|
124
|
-
mta = models.TraceAnnotation
|
|
125
|
-
name_column, label_column, score_column = mta.name, mta.label, mta.score
|
|
126
|
-
annotator_kind_column = mta.annotator_kind
|
|
127
|
-
time_column = models.Trace.start_time
|
|
128
|
-
stmt = stmt.join(models.Trace)
|
|
129
|
-
else:
|
|
130
|
-
assert_never(kind)
|
|
131
|
-
stmt = stmt.add_columns(
|
|
132
|
-
name_column,
|
|
133
|
-
label_column,
|
|
134
|
-
func.count().label("record_count"),
|
|
135
|
-
func.count(label_column).label("label_count"),
|
|
136
|
-
func.count(score_column).label("score_count"),
|
|
137
|
-
func.sum(score_column).label("score_sum"),
|
|
138
|
-
)
|
|
139
|
-
stmt = stmt.group_by(name_column, label_column)
|
|
140
|
-
stmt = stmt.order_by(name_column, label_column)
|
|
141
|
-
stmt = stmt.where(models.Trace.project_rowid == project_rowid)
|
|
142
|
-
stmt = stmt.where(annotator_kind_column == "LLM")
|
|
143
|
-
stmt = stmt.where(or_(score_column.is_not(None), label_column.is_not(None)))
|
|
144
|
-
stmt = stmt.where(name_column.in_(eval_names))
|
|
145
|
-
if start_time:
|
|
146
|
-
stmt = stmt.where(start_time <= time_column)
|
|
147
|
-
if end_time:
|
|
148
|
-
stmt = stmt.where(time_column < end_time)
|
|
149
|
-
return stmt
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
from collections import defaultdict
|
|
2
|
-
from typing import (
|
|
3
|
-
DefaultDict,
|
|
4
|
-
List,
|
|
5
|
-
)
|
|
6
|
-
|
|
7
|
-
from sqlalchemy import select
|
|
8
|
-
from strawberry.dataloader import DataLoader
|
|
9
|
-
from typing_extensions import TypeAlias
|
|
10
|
-
|
|
11
|
-
from phoenix.db import models
|
|
12
|
-
from phoenix.server.api.types.Evaluation import SpanEvaluation
|
|
13
|
-
from phoenix.server.types import DbSessionFactory
|
|
14
|
-
|
|
15
|
-
Key: TypeAlias = int
|
|
16
|
-
Result: TypeAlias = List[SpanEvaluation]
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class SpanEvaluationsDataLoader(DataLoader[Key, Result]):
|
|
20
|
-
def __init__(self, db: DbSessionFactory) -> None:
|
|
21
|
-
super().__init__(load_fn=self._load_fn)
|
|
22
|
-
self._db = db
|
|
23
|
-
|
|
24
|
-
async def _load_fn(self, keys: List[Key]) -> List[Result]:
|
|
25
|
-
span_evaluations_by_id: DefaultDict[Key, Result] = defaultdict(list)
|
|
26
|
-
msa = models.SpanAnnotation
|
|
27
|
-
async with self._db() as session:
|
|
28
|
-
data = await session.stream_scalars(
|
|
29
|
-
select(msa).where(msa.span_rowid.in_(keys)).where(msa.annotator_kind == "LLM")
|
|
30
|
-
)
|
|
31
|
-
async for span_evaluation in data:
|
|
32
|
-
span_evaluations_by_id[span_evaluation.span_rowid].append(
|
|
33
|
-
SpanEvaluation.from_sql_span_annotation(span_evaluation)
|
|
34
|
-
)
|
|
35
|
-
return [span_evaluations_by_id[key] for key in keys]
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
from collections import defaultdict
|
|
2
|
-
from typing import (
|
|
3
|
-
DefaultDict,
|
|
4
|
-
List,
|
|
5
|
-
)
|
|
6
|
-
|
|
7
|
-
from sqlalchemy import select
|
|
8
|
-
from strawberry.dataloader import DataLoader
|
|
9
|
-
from typing_extensions import TypeAlias
|
|
10
|
-
|
|
11
|
-
from phoenix.db import models
|
|
12
|
-
from phoenix.server.api.types.Evaluation import TraceEvaluation
|
|
13
|
-
from phoenix.server.types import DbSessionFactory
|
|
14
|
-
|
|
15
|
-
Key: TypeAlias = int
|
|
16
|
-
Result: TypeAlias = List[TraceEvaluation]
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class TraceEvaluationsDataLoader(DataLoader[Key, Result]):
|
|
20
|
-
def __init__(self, db: DbSessionFactory) -> None:
|
|
21
|
-
super().__init__(load_fn=self._load_fn)
|
|
22
|
-
self._db = db
|
|
23
|
-
|
|
24
|
-
async def _load_fn(self, keys: List[Key]) -> List[Result]:
|
|
25
|
-
trace_evaluations_by_id: DefaultDict[Key, Result] = defaultdict(list)
|
|
26
|
-
mta = models.TraceAnnotation
|
|
27
|
-
async with self._db() as session:
|
|
28
|
-
data = await session.stream_scalars(
|
|
29
|
-
select(mta).where(mta.trace_rowid.in_(keys)).where(mta.annotator_kind == "LLM")
|
|
30
|
-
)
|
|
31
|
-
async for trace_evaluation in data:
|
|
32
|
-
trace_evaluations_by_id[trace_evaluation.trace_rowid].append(
|
|
33
|
-
TraceEvaluation.from_sql_trace_annotation(trace_evaluation)
|
|
34
|
-
)
|
|
35
|
-
return [trace_evaluations_by_id[key] for key in keys]
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import{r as d,j as e,d2 as F,v as s,F as P,R as v,w as E,aN as L,d3 as R,d4 as S,d5 as a,d6 as w,d7 as z,b as A,d8 as j}from"./vendor-BMWfu6zp.js";import{S as C,j as k,Z as $,U as _,t as I,a4 as O}from"./vendor-arizeai-Sj74jm5V.js";import{b2 as T,d as D,R as N,b3 as G,b4 as M}from"./components-Bhx3QVW0.js";import{L as U,E as B,h as q,M as J,a as m,D as K,d as W,b as H,e as V,P as Y,c as Z,T as Q,p as X,f as u,g as ee,i as re,j as g,k as ae,l as h,m as x,n as oe,o as te,q as ne,r as se,s as le,A as ie}from"./pages-DG-5zgoV.js";import"./vendor-three-DwGkEfCM.js";import"./vendor-codemirror-DO3VqEcD.js";import"./vendor-recharts-BGN0SxgJ.js";(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))c(o);new MutationObserver(o=>{for(const t of o)if(t.type==="childList")for(const l of t.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&c(l)}).observe(document,{childList:!0,subtree:!0});function i(o){const t={};return o.integrity&&(t.integrity=o.integrity),o.referrerPolicy&&(t.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?t.credentials="include":o.crossOrigin==="anonymous"?t.credentials="omit":t.credentials="same-origin",t}function c(o){if(o.ep)return;o.ep=!0;const t=i(o);fetch(o.href,t)}})();const b="arize-phoenix-feature-flags",p={__CLEAR__:!0};function ce(){const r=localStorage.getItem(b);if(!r)return p;try{const n=JSON.parse(r);return Object.assign({},p,n)}catch{return p}}const f=d.createContext(null);function de(){const r=v.useContext(f);if(r===null)throw new Error("useFeatureFlags must be used within a FeatureFlagsProvider");return r}function pe(r){const[n,i]=d.useState(ce()),c=o=>{localStorage.setItem(b,JSON.stringify(o)),i(o)};return e(f.Provider,{value:{featureFlags:n,setFeatureFlags:c},children:e(me,{children:r.children})})}function me(r){const{children:n}=r,{featureFlags:i,setFeatureFlags:c}=de(),[o,t]=d.useState(!1);return F("ctrl+shift+f",()=>t(!0)),s(P,{children:[n,e(_,{type:"modal",isDismissable:!0,onDismiss:()=>t(!1),children:o&&e(C,{title:"Feature Flags",children:e(k,{height:"size-1000",padding:"size-100",children:Object.keys(i).map(l=>e($,{isSelected:i[l],onChange:y=>c({...i,[l]:y}),children:l},l))})})})]})}function ue(){return e(L,{styles:r=>E`
|
|
2
|
-
body {
|
|
3
|
-
background-color: var(--ac-global-color-grey-75);
|
|
4
|
-
color: var(--ac-global-text-color-900);
|
|
5
|
-
font-family: "Roboto";
|
|
6
|
-
font-size: ${r.typography.sizes.medium.fontSize}px;
|
|
7
|
-
margin: 0;
|
|
8
|
-
#root,
|
|
9
|
-
#root > div[data-overlay-container="true"],
|
|
10
|
-
#root > div[data-overlay-container="true"] > .ac-theme {
|
|
11
|
-
height: 100vh;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/* Remove list styling */
|
|
16
|
-
ul {
|
|
17
|
-
display: block;
|
|
18
|
-
list-style-type: none;
|
|
19
|
-
margin-block-start: none;
|
|
20
|
-
margin-block-end: 0;
|
|
21
|
-
padding-inline-start: 0;
|
|
22
|
-
margin-block-start: 0;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/* A reset style for buttons */
|
|
26
|
-
.button--reset {
|
|
27
|
-
background: none;
|
|
28
|
-
border: none;
|
|
29
|
-
padding: 0;
|
|
30
|
-
}
|
|
31
|
-
/* this css class is added to html via modernizr @see modernizr.js */
|
|
32
|
-
.no-hiddenscroll {
|
|
33
|
-
/* Works on Firefox */
|
|
34
|
-
* {
|
|
35
|
-
scrollbar-width: thin;
|
|
36
|
-
scrollbar-color: var(--ac-global-color-grey-300)
|
|
37
|
-
var(--ac-global-color-grey-400);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/* Works on Chrome, Edge, and Safari */
|
|
41
|
-
*::-webkit-scrollbar {
|
|
42
|
-
width: 14px;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
*::-webkit-scrollbar-track {
|
|
46
|
-
background: var(--ac-global-color-grey-100);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
*::-webkit-scrollbar-thumb {
|
|
50
|
-
background-color: var(--ac-global-color-grey-75);
|
|
51
|
-
border-radius: 8px;
|
|
52
|
-
border: 1px solid var(--ac-global-color-grey-300);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
:root {
|
|
57
|
-
--px-blue-color: ${r.colors.arizeBlue};
|
|
58
|
-
|
|
59
|
-
--px-flex-gap-sm: ${r.spacing.margin4}px;
|
|
60
|
-
--px-flex-gap-sm: ${r.spacing.margin8}px;
|
|
61
|
-
|
|
62
|
-
--px-section-background-color: ${r.colors.gray500};
|
|
63
|
-
|
|
64
|
-
/* An item is a typically something in a list */
|
|
65
|
-
--px-item-background-color: ${r.colors.gray800};
|
|
66
|
-
--px-item-border-color: ${r.colors.gray600};
|
|
67
|
-
|
|
68
|
-
--px-spacing-sm: ${r.spacing.padding4}px;
|
|
69
|
-
--px-spacing-med: ${r.spacing.padding8}px;
|
|
70
|
-
--px-spacing-lg: ${r.spacing.padding16}px;
|
|
71
|
-
|
|
72
|
-
--px-border-radius-med: ${r.borderRadius.medium}px;
|
|
73
|
-
|
|
74
|
-
--px-font-size-sm: ${r.typography.sizes.small.fontSize}px;
|
|
75
|
-
--px-font-size-med: ${r.typography.sizes.medium.fontSize}px;
|
|
76
|
-
--px-font-size-lg: ${r.typography.sizes.large.fontSize}px;
|
|
77
|
-
|
|
78
|
-
--px-gradient-bar-height: 8px;
|
|
79
|
-
|
|
80
|
-
--px-nav-collapsed-width: 45px;
|
|
81
|
-
--px-nav-expanded-width: 200px;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
.ac-theme--dark {
|
|
85
|
-
--px-primary-color: #9efcfd;
|
|
86
|
-
--px-primary-color--transparent: rgb(158, 252, 253, 0.2);
|
|
87
|
-
--px-reference-color: #baa1f9;
|
|
88
|
-
--px-reference-color--transparent: #baa1f982;
|
|
89
|
-
--px-corpus-color: #92969c;
|
|
90
|
-
--px-corpus-color--transparent: #92969c63;
|
|
91
|
-
}
|
|
92
|
-
.ac-theme--light {
|
|
93
|
-
--px-primary-color: #00add0;
|
|
94
|
-
--px-primary-color--transparent: rgba(0, 173, 208, 0.2);
|
|
95
|
-
--px-reference-color: #4500d9;
|
|
96
|
-
--px-reference-color--transparent: rgba(69, 0, 217, 0.2);
|
|
97
|
-
--px-corpus-color: #92969c;
|
|
98
|
-
--px-corpus-color--transparent: #92969c63;
|
|
99
|
-
}
|
|
100
|
-
`})}const ge=R(S(s(a,{path:"/",element:e(U,{}),errorElement:e(B,{}),children:[e(a,{index:!0,loader:q}),s(a,{path:"/model",handle:{crumb:()=>"model"},element:e(J,{}),children:[e(a,{index:!0,element:e(m,{})}),e(a,{element:e(m,{}),children:e(a,{path:"dimensions",children:e(a,{path:":dimensionId",element:e(K,{}),loader:W})})}),e(a,{path:"embeddings",children:e(a,{path:":embeddingDimensionId",element:e(H,{}),loader:V,handle:{crumb:r=>r.embedding.name}})})]}),s(a,{path:"/projects",handle:{crumb:()=>"projects"},element:e(Y,{}),children:[e(a,{index:!0,element:e(Z,{})}),s(a,{path:":projectId",element:e(Q,{}),loader:X,handle:{crumb:r=>r.project.name},children:[e(a,{index:!0,element:e(u,{})}),e(a,{element:e(u,{}),children:e(a,{path:"traces/:traceId",element:e(ee,{})})})]})]}),s(a,{path:"/datasets",handle:{crumb:()=>"datasets"},children:[e(a,{index:!0,element:e(re,{})}),s(a,{path:":datasetId",loader:g,handle:{crumb:r=>r.dataset.name},children:[s(a,{element:e(ae,{}),loader:g,children:[e(a,{index:!0,element:e(h,{}),loader:x}),e(a,{path:"experiments",element:e(h,{}),loader:x}),e(a,{path:"examples",element:e(oe,{}),loader:te,children:e(a,{path:":exampleId",element:e(ne,{})})})]}),e(a,{path:"compare",handle:{crumb:()=>"compare"},loader:se,element:e(le,{})})]})]}),e(a,{path:"/apis",element:e(ie,{}),handle:{crumb:()=>"APIs"}})]})),{basename:window.Config.basename});function he(){return e(w,{router:ge})}function xe(){return e(T,{children:e(be,{})})}function be(){const{theme:r}=D();return e(O,{theme:r,children:e(z,{theme:I,children:s(A.RelayEnvironmentProvider,{environment:N,children:[e(ue,{}),e(pe,{children:e(G,{children:e(d.Suspense,{children:e(M,{children:e(he,{})})})})})]})})})}const fe=document.getElementById("root"),ye=j.createRoot(fe);ye.render(e(xe,{}));
|
|
File without changes
|
|
File without changes
|
|
File without changes
|