arize-phoenix 4.12.0rc1__py3-none-any.whl → 4.14.1__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.

Files changed (36) hide show
  1. {arize_phoenix-4.12.0rc1.dist-info → arize_phoenix-4.14.1.dist-info}/METADATA +10 -6
  2. {arize_phoenix-4.12.0rc1.dist-info → arize_phoenix-4.14.1.dist-info}/RECORD +35 -35
  3. phoenix/db/bulk_inserter.py +3 -1
  4. phoenix/experiments/evaluators/base.py +4 -0
  5. phoenix/experiments/evaluators/code_evaluators.py +80 -0
  6. phoenix/experiments/evaluators/llm_evaluators.py +77 -1
  7. phoenix/experiments/evaluators/utils.py +70 -21
  8. phoenix/experiments/functions.py +14 -14
  9. phoenix/server/api/dataloaders/average_experiment_run_latency.py +23 -23
  10. phoenix/server/api/dataloaders/experiment_error_rates.py +30 -10
  11. phoenix/server/api/dataloaders/experiment_run_counts.py +18 -5
  12. phoenix/server/api/input_types/{CreateSpanAnnotationsInput.py → CreateSpanAnnotationInput.py} +4 -2
  13. phoenix/server/api/input_types/{CreateTraceAnnotationsInput.py → CreateTraceAnnotationInput.py} +4 -2
  14. phoenix/server/api/input_types/{PatchAnnotationsInput.py → PatchAnnotationInput.py} +4 -2
  15. phoenix/server/api/mutations/span_annotations_mutations.py +12 -6
  16. phoenix/server/api/mutations/trace_annotations_mutations.py +12 -6
  17. phoenix/server/api/types/Experiment.py +2 -2
  18. phoenix/server/api/types/Inferences.py +1 -2
  19. phoenix/server/api/types/Model.py +1 -2
  20. phoenix/server/app.py +3 -7
  21. phoenix/server/static/.vite/manifest.json +31 -31
  22. phoenix/server/static/assets/{components-C8sm_r1F.js → components-DeS0YEmv.js} +2 -2
  23. phoenix/server/static/assets/index-CQgXRwU0.js +100 -0
  24. phoenix/server/static/assets/{pages-bN7juCjh.js → pages-hdjlFZhO.js} +275 -198
  25. phoenix/server/static/assets/{vendor-CUDAPm8e.js → vendor-DPvSDRn3.js} +1 -1
  26. phoenix/server/static/assets/{vendor-arizeai-Do2HOmcL.js → vendor-arizeai-CkvPT67c.js} +2 -2
  27. phoenix/server/static/assets/{vendor-codemirror-CrdxOlMs.js → vendor-codemirror-Cqwpwlua.js} +1 -1
  28. phoenix/server/static/assets/{vendor-recharts-PKRvByVe.js → vendor-recharts-5jlNaZuF.js} +1 -1
  29. phoenix/server/templates/index.html +51 -43
  30. phoenix/session/client.py +7 -5
  31. phoenix/trace/dsl/filter.py +40 -25
  32. phoenix/version.py +1 -1
  33. phoenix/server/static/assets/index-BEKPzgQs.js +0 -100
  34. {arize_phoenix-4.12.0rc1.dist-info → arize_phoenix-4.14.1.dist-info}/WHEEL +0 -0
  35. {arize_phoenix-4.12.0rc1.dist-info → arize_phoenix-4.14.1.dist-info}/licenses/IP_NOTICE +0 -0
  36. {arize_phoenix-4.12.0rc1.dist-info → arize_phoenix-4.14.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,43 +1,47 @@
1
- {% set rendered_files = [] %}
2
- {% set rendered_chunks = [] %}
3
-
4
- {% macro render_chunk(chunk_name, level=0) %}
5
- {% if chunk_name not in rendered_chunks %}
6
- {% set _ = rendered_chunks.append(chunk_name) %}
7
- {% set chunk = manifest[chunk_name] %}
8
-
9
- {% if chunk.css %}
10
- {% for css_file in chunk.css %}
11
- {% if css_file not in rendered_files %}
12
- <link rel="stylesheet" href="{{ basename }}/{{ css_file }}">
13
- {% set _ = rendered_files.append(css_file) %}
1
+ {%- set rendered_chunks = [] -%}
2
+ {%- set css_links = [] -%}
3
+ {%- set js_scripts = [] -%}
4
+ {%- macro collect_assets(chunk_name, level=0) -%}
5
+ {% if chunk_name not in rendered_chunks %}
6
+ {% set _ = rendered_chunks.append(chunk_name) %}
7
+ {% set chunk = manifest[chunk_name] %}
8
+ {% if chunk.css %}
9
+ {% for css_file in chunk.css %}
10
+ {% if css_file not in css_links %}
11
+ {% set _ = css_links.append((basename, css_file)) %}
12
+ {% endif %}
13
+ {% endfor %}
14
+ {% endif %}
15
+ {% if chunk.imports %}
16
+ {% for import in chunk.imports %}
17
+ {% set _ = collect_assets(import, level + 1) %}
18
+ {% endfor %}
19
+ {% endif %}
20
+ {% if chunk.file.endswith('.js') %}
21
+ {% if chunk.file not in js_scripts %}
22
+ {% set _ = js_scripts.append((basename, chunk.file, level == 0)) %}
23
+ {% endif %}
24
+ {% elif chunk.file.endswith('.css') %}
25
+ {% if chunk.file not in css_links %}
26
+ {% set _ = css_links.append((basename, chunk.file)) %}
27
+ {% endif %}
14
28
  {% endif %}
15
- {% endfor %}
16
- {% endif %}
17
-
18
- {% if chunk.imports %}
19
- {% for import in chunk.imports %}
20
- {{ render_chunk(import, level + 1) }}
21
- {% endfor %}
22
- {% endif %}
23
-
24
- {% if level == 0 %}
25
- {% if chunk.file.endswith('.js') and chunk.file not in rendered_files %}
26
- <script type="module" src="{{ basename }}/{{ chunk.file }}"></script>
27
- {% set _ = rendered_files.append(chunk.file) %}
28
- {% elif chunk.file.endswith('.css') and chunk.file not in rendered_files %}
29
- <link rel="stylesheet" href="{{ basename }}/{{ chunk.file }}">
30
- {% set _ = rendered_files.append(chunk.file) %}
31
- {% endif %}
32
- {% endif %}
33
-
34
- {% if chunk.file.endswith('.js') and chunk.file not in rendered_files %}
35
- <link rel="modulepreload" href="{{ basename }}/{{ chunk.file }}">
36
- {% set _ = rendered_files.append(chunk.file) %}
37
29
  {% endif %}
38
- {% endif %}
39
- {% endmacro %}
40
-
30
+ {%- endmacro -%}
31
+ {%- macro render_css() -%}
32
+ {%- for basename, css_file in css_links -%}
33
+ <link rel="stylesheet" href="{{ basename }}/{{ css_file }}">
34
+ {% endfor -%}
35
+ {%- endmacro -%}
36
+ {%- macro render_js() -%}
37
+ {%- for basename, js_file, is_entry in js_scripts -%}
38
+ {%- if is_entry -%}
39
+ <script type="module" src="{{ basename }}/{{ js_file }}"></script>
40
+ {% else -%}
41
+ <link rel="modulepreload" href="{{ basename }}/{{ js_file }}">
42
+ {% endif -%}
43
+ {%- endfor -%}
44
+ {%- endmacro -%}
41
45
  <!DOCTYPE html>
42
46
  <html>
43
47
  <head>
@@ -55,6 +59,10 @@
55
59
  rel="stylesheet"
56
60
  href="https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;400;500;700;900&display=swap"
57
61
  />
62
+ {% if not is_development -%}
63
+ {% set _ = collect_assets('index.tsx') -%}
64
+ {{- render_css() -}}
65
+ {%- endif -%}
58
66
  <script src="{{basename}}/modernizr.js"></script>
59
67
  </head>
60
68
  <body>
@@ -82,7 +90,7 @@
82
90
  writable: false
83
91
  });
84
92
  })()</script>
85
- {% if is_development %}
93
+ {% if is_development -%}
86
94
  <script type="module">
87
95
  import RefreshRuntime from 'http://localhost:5173/@react-refresh'
88
96
  RefreshRuntime.injectIntoGlobalHook(window)
@@ -92,8 +100,8 @@
92
100
  </script>
93
101
  <script type="module" src="http://localhost:5173/@vite/client"></script>
94
102
  <script type="module" src="http://localhost:5173/index.tsx"></script>
95
- {% else %}
96
- {{ render_chunk('index.tsx') }}
97
- {% endif %}
98
- </body>
103
+ {%- else -%}
104
+ {{- render_js() -}}
105
+ {%- endif -%}
106
+ </body>
99
107
  </html>
phoenix/session/client.py CHANGED
@@ -22,6 +22,7 @@ from typing import (
22
22
  cast,
23
23
  )
24
24
  from urllib.parse import quote, urljoin
25
+ from warnings import warn
25
26
 
26
27
  import httpx
27
28
  import pandas as pd
@@ -389,7 +390,6 @@ class Client(TraceDataExtractor):
389
390
  def get_dataset_versions(
390
391
  self,
391
392
  dataset_id: str,
392
- /,
393
393
  *,
394
394
  limit: Optional[int] = 100,
395
395
  ) -> pd.DataFrame:
@@ -410,7 +410,7 @@ class Client(TraceDataExtractor):
410
410
  if not (records := response.json()["data"]):
411
411
  return pd.DataFrame()
412
412
  df = pd.DataFrame.from_records(records, index="version_id")
413
- df["created_at"] = pd.to_datetime(df.created_at)
413
+ df["created_at"] = df["created_at"].apply(datetime.fromisoformat)
414
414
  return df
415
415
 
416
416
  def upload_dataset(
@@ -531,11 +531,15 @@ class Client(TraceDataExtractor):
531
531
  corresponding to an example in the dataset.
532
532
  metadata (Iterable[Mapping[str, Any]]): List of dictionaries object each
533
533
  corresponding to an example in the dataset.
534
- dataset_description: (Optional[str]): Description of the dataset.
535
534
 
536
535
  Returns:
537
536
  A Dataset object with its examples.
538
537
  """
538
+ if dataset_description is not None:
539
+ warn(
540
+ "The `dataset_description` parameter has been deprecated "
541
+ "and will be removed in a future release."
542
+ )
539
543
  if dataframe is not None or csv_file_path is not None:
540
544
  if dataframe is not None and csv_file_path is not None:
541
545
  raise ValueError(
@@ -555,7 +559,6 @@ class Client(TraceDataExtractor):
555
559
  input_keys=input_keys,
556
560
  output_keys=output_keys,
557
561
  metadata_keys=metadata_keys,
558
- dataset_description=dataset_description,
559
562
  action="append",
560
563
  )
561
564
  return self._upload_json_dataset(
@@ -563,7 +566,6 @@ class Client(TraceDataExtractor):
563
566
  inputs=inputs,
564
567
  outputs=outputs,
565
568
  metadata=metadata,
566
- dataset_description=dataset_description,
567
569
  action="append",
568
570
  )
569
571
 
@@ -5,8 +5,8 @@ import typing
5
5
  from dataclasses import dataclass, field
6
6
  from difflib import SequenceMatcher
7
7
  from itertools import chain
8
- from random import randint
9
8
  from types import MappingProxyType
9
+ from uuid import uuid4
10
10
 
11
11
  import sqlalchemy
12
12
  from sqlalchemy.orm import Mapped, aliased
@@ -22,11 +22,14 @@ _VALID_EVAL_ATTRIBUTES: typing.Tuple[str, ...] = tuple(
22
22
  )
23
23
 
24
24
 
25
- EvalAttribute: TypeAlias = typing.Literal["label", "score"]
26
- EvalExpression: TypeAlias = str
27
- EvalName: TypeAlias = str
25
+ AnnotationType: TypeAlias = typing.Literal["annotations", "evals"]
26
+ AnnotationAttribute: TypeAlias = typing.Literal["label", "score"]
27
+ AnnotationExpression: TypeAlias = str
28
+ AnnotationName: TypeAlias = str
28
29
 
29
- EVAL_EXPRESSION_PATTERN = re.compile(r"""\b(evals\[(".*?"|'.*?')\][.](label|score))\b""")
30
+ EVAL_EXPRESSION_PATTERN = re.compile(
31
+ r"""\b((annotations|evals)\[(".*?"|'.*?')\][.](label|score))\b"""
32
+ )
30
33
 
31
34
 
32
35
  @dataclass(frozen=True)
@@ -46,9 +49,10 @@ class AliasedAnnotationRelation:
46
49
 
47
50
  def __post_init__(self) -> None:
48
51
  table_alias = f"span_annotation_{self.index}"
49
- alias_id = f"{randint(0, 10**6):06d}" # prevent conflicts with user-defined attributes
52
+ alias_id = uuid4().hex
50
53
  label_attribute_alias = f"{table_alias}_label_{alias_id}"
51
54
  score_attribute_alias = f"{table_alias}_score_{alias_id}"
55
+
52
56
  table = aliased(models.SpanAnnotation, name=table_alias)
53
57
  object.__setattr__(self, "_label_attribute_alias", label_attribute_alias)
54
58
  object.__setattr__(self, "_score_attribute_alias", score_attribute_alias)
@@ -67,7 +71,7 @@ class AliasedAnnotationRelation:
67
71
  yield self._label_attribute_alias, self.table.label
68
72
  yield self._score_attribute_alias, self.table.score
69
73
 
70
- def attribute_alias(self, attribute: EvalAttribute) -> str:
74
+ def attribute_alias(self, attribute: AnnotationAttribute) -> str:
71
75
  """
72
76
  Returns an alias for the given attribute (i.e., column).
73
77
  """
@@ -579,7 +583,7 @@ def _validate_expression(
579
583
  _is_subscript(node, "metadata") or _is_subscript(node, "attributes")
580
584
  ) and _get_attribute_keys_list(node) is not None:
581
585
  continue
582
- elif _is_eval(node) and _get_subscript_key(node) is not None:
586
+ elif _is_annotation(node) and _get_subscript_key(node) is not None:
583
587
  # e.g. `evals["name"]`
584
588
  if not (eval_name := _get_subscript_key(node)) or (
585
589
  valid_eval_names is not None and eval_name not in valid_eval_names
@@ -601,7 +605,7 @@ def _validate_expression(
601
605
  else ""
602
606
  )
603
607
  continue
604
- elif isinstance(node, ast.Attribute) and _is_eval(node.value):
608
+ elif isinstance(node, ast.Attribute) and _is_annotation(node.value):
605
609
  # e.g. `evals["name"].score`
606
610
  if (attr := node.attr) not in valid_eval_attributes:
607
611
  source_segment = typing.cast(str, ast.get_source_segment(source, node))
@@ -662,19 +666,19 @@ def _as_attribute(
662
666
  ) -> ast.Subscript:
663
667
  return ast.Subscript(
664
668
  value=ast.Name(id="attributes", ctx=ast.Load()),
665
- slice=ast.List(elts=keys, ctx=ast.Load())
669
+ slice=ast.List(elts=keys, ctx=ast.Load()) # type: ignore[arg-type]
666
670
  if sys.version_info >= (3, 9)
667
- else ast.Index(value=ast.List(elts=keys, ctx=ast.Load())),
671
+ else ast.Index(value=ast.List(elts=keys, ctx=ast.Load())), # type: ignore
668
672
  ctx=ast.Load(),
669
673
  )
670
674
 
671
675
 
672
- def _is_eval(node: typing.Any) -> TypeGuard[ast.Subscript]:
676
+ def _is_annotation(node: typing.Any) -> TypeGuard[ast.Subscript]:
673
677
  # e.g. `evals["name"]`
674
678
  return (
675
679
  isinstance(node, ast.Subscript)
676
680
  and isinstance(value := node.value, ast.Name)
677
- and value.id == "evals"
681
+ and value.id in ["evals", "annotations"]
678
682
  )
679
683
 
680
684
 
@@ -817,34 +821,45 @@ def _apply_eval_aliasing(
817
821
  span_annotation_0_label_123 == 'correct' or span_annotation_0_score_456 < 0.5
818
822
  ```
819
823
  """
820
- eval_aliases: typing.Dict[EvalName, AliasedAnnotationRelation] = {}
821
- for eval_expression, eval_name, eval_attribute in _parse_eval_expressions_and_names(source):
822
- if (eval_alias := eval_aliases.get(eval_name)) is None:
823
- eval_alias = AliasedAnnotationRelation(index=len(eval_aliases), name=eval_name)
824
- eval_aliases[eval_name] = eval_alias
825
- alias_name = eval_alias.attribute_alias(eval_attribute)
826
- source = source.replace(eval_expression, alias_name)
824
+ eval_aliases: typing.Dict[AnnotationName, AliasedAnnotationRelation] = {}
825
+ for (
826
+ annotation_expression,
827
+ annotation_type,
828
+ annotation_name,
829
+ annotation_attribute,
830
+ ) in _parse_annotation_expressions_and_names(source):
831
+ if (eval_alias := eval_aliases.get(annotation_name)) is None:
832
+ eval_alias = AliasedAnnotationRelation(index=len(eval_aliases), name=annotation_name)
833
+ eval_aliases[annotation_name] = eval_alias
834
+ alias_name = eval_alias.attribute_alias(annotation_attribute)
835
+ source = source.replace(annotation_expression, alias_name)
827
836
  return source, tuple(eval_aliases.values())
828
837
 
829
838
 
830
- def _parse_eval_expressions_and_names(
839
+ def _parse_annotation_expressions_and_names(
831
840
  source: str,
832
- ) -> typing.Iterator[typing.Tuple[EvalExpression, EvalName, EvalAttribute]]:
841
+ ) -> typing.Iterator[
842
+ typing.Tuple[AnnotationExpression, AnnotationType, AnnotationName, AnnotationAttribute]
843
+ ]:
833
844
  """
834
845
  Parses filter conditions for evaluation expressions of the form:
835
846
 
836
847
  ```
837
848
  evals["<eval-name>"].<attribute>
849
+ annotations["eval-name"].<attribute>
838
850
  ```
839
851
  """
840
852
  for match in EVAL_EXPRESSION_PATTERN.finditer(source):
841
853
  (
842
- eval_expression,
854
+ annotation_expression,
855
+ annotation_type,
843
856
  quoted_eval_name,
844
857
  evaluation_attribute_name,
845
858
  ) = match.groups()
859
+ annotation_type = typing.cast(AnnotationType, annotation_type)
846
860
  yield (
847
- eval_expression,
861
+ annotation_expression,
862
+ annotation_type,
848
863
  quoted_eval_name[1:-1],
849
- typing.cast(EvalAttribute, evaluation_attribute_name),
864
+ typing.cast(AnnotationAttribute, evaluation_attribute_name),
850
865
  )
phoenix/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "4.12.0rc1"
1
+ __version__ = "4.14.1"
@@ -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-CUDAPm8e.js";import{Q as C,j as k,Y as _,S as $,t as I,a4 as O}from"./vendor-arizeai-Do2HOmcL.js";import{aY as D,d as T,R as N,aZ as G,a_ as M}from"./components-C8sm_r1F.js";import{L as B,E as U,h as Y,M as q,a as m,D as J,d as K,b as W,e as H,P as Q,c as V,f as Z,p as X,g as u,i as ee,j as re,k as g,l as ae,m as h,n as f,o as oe,q as te,r as ne,s as se,t as le,A as ie}from"./pages-bN7juCjh.js";import"./vendor-three-DwGkEfCM.js";import"./vendor-codemirror-CrdxOlMs.js";import"./vendor-recharts-PKRvByVe.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 x="arize-phoenix-feature-flags",p={__CLEAR__:!1};function ce(){const r=localStorage.getItem(x);if(!r)return p;try{const n=JSON.parse(r);return Object.assign({},p,n)}catch{return p}}const b=d.createContext(null);function de(){const r=v.useContext(b);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(x,JSON.stringify(o)),i(o)};return e(b.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(B,{}),errorElement:e(U,{}),children:[e(a,{index:!0,loader:Y}),s(a,{path:"/model",handle:{crumb:()=>"model"},element:e(q,{}),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(J,{}),loader:K})})}),e(a,{path:"embeddings",children:e(a,{path:":embeddingDimensionId",element:e(W,{}),loader:H,handle:{crumb:r=>r.embedding.name}})})]}),s(a,{path:"/projects",handle:{crumb:()=>"projects"},element:e(Q,{}),children:[e(a,{index:!0,element:e(V,{})}),s(a,{path:":projectId",element:e(Z,{}),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:f}),e(a,{path:"experiments",element:e(h,{}),loader:f}),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 fe(){return e(D,{children:e(xe,{})})}function xe(){const{theme:r}=T();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 be=document.getElementById("root"),ye=j.createRoot(be);ye.render(e(fe,{}));