UNPKG

evalite

Version:

Test your LLM-powered apps with a TypeScript-native, Vitest-based eval runner. No API key required.

17 lines (16 loc) 8.19 kB
import{o as N,r as b,j as e,B as O,d as U,p as F,u as Q,q as A,h as H,k as V,L as M,m as B,n as L,a as y}from"./index-Df2ALCV5.js";import{s as z,i as W,D as u,B as G,a as J,b as v,f as $,L as K}from"./utils-zzuvwK-H.js";/** * @license lucide-react v0.464.0 - ISC * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. */const X=N("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** * @license lucide-react v0.464.0 - ISC * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. */const Y=N("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);/** * @license lucide-react v0.464.0 - ISC * * This source code is licensed under the ISC license. * See the LICENSE file in the root directory of this source tree. */const Z=N("PanelLeftClose",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"m16 15-3-3 3-3",key:"14y99z"}]]);function ee({value:a,className:n,variant:r="ghost",size:i="icon",label:p="Copy",onCopied:t,...o}){const[l,j]=b.useState(!1);return b.useEffect(()=>{if(l){const f=setTimeout(()=>j(!1),2e3);return()=>clearTimeout(f)}},[l]),e.jsxs(O,{size:i,variant:r,className:U("text-muted-foreground hover:text-foreground",n),onClick:async()=>{try{await navigator.clipboard.writeText(a),j(!0),t==null||t()}catch(f){console.error("Failed to copy text:",f)}},...o,children:[l?e.jsx(X,{className:"size-4"}):e.jsx(Y,{className:"size-4"}),i!=="icon"&&(l?"Copied":p)]})}const c=({title:a,description:n,children:r,copyableText:i})=>e.jsxs("div",{className:"text-sm",children:[e.jsx("div",{className:"mb-3",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex-grow",children:[e.jsx("h2",{className:"font-medium text-base text-gray-600",children:a}),n&&e.jsx("p",{className:"text-gray-500 text-xs mt-1",children:n})]}),i&&e.jsx("div",{className:"flex items-center gap-2",children:e.jsx(ee,{value:i})})]})}),e.jsx("div",{className:"mt-1 text-gray-600",children:r})]}),x=()=>e.jsx(y,{className:"mt-6 mb-4",orientation:"horizontal"}),E=a=>{const n=a.endPercent-a.startPercent;return e.jsx(M,{to:"/eval/$name/result/$resultIndex",params:{name:a.name,resultIndex:a.resultIndex},search:{trace:a.traceIndex},className:"px-2 py-2 hover:bg-gray-100 transition-colors",activeProps:{className:"bg-gray-200 hover:bg-gray-200"},activeOptions:{includeSearch:!0,exact:!0},preload:"intent",resetScroll:!1,children:({isActive:r})=>e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"mb-1 flex items-center justify-between space-x-3",children:[e.jsx("span",{className:"block text-sm font-medium text-gray-600",children:a.title}),e.jsx("span",{className:"text-xs text-gray-600",children:$(a.duration)})]}),e.jsxs("div",{className:"relative w-full",children:[e.jsx("div",{className:U("w-full rounded-full h-1 bg-gray-200 transition-colors",r&&"bg-gray-300")}),e.jsx("div",{className:"absolute top-0 w-full rounded-full h-1 bg-gray-500",style:{left:`${a.startPercent}%`,width:`${n}%`}})]})]})})},ae=function(){var I,P;const{name:n,resultIndex:r}=F.useParams(),{timestamp:i,trace:p}=F.useSearch(),[{data:{result:t,prevResult:o,evaluation:l}},{data:j}]=Q({queries:[A({evalName:n,resultIndex:r,evalTimestamp:i??null}),H]}),S=V(j).isRunningEvalName(n)&&l.created_at===i,g=((I=t.traces[0])==null?void 0:I.start_time)??0,_=((P=t.traces[t.traces.length-1])==null?void 0:P.end_time)??0,w=_-g,d=p!=null?t.traces[p]:null,h=t.traces.length>0&&t.traces.every(s=>typeof s.completion_tokens=="number"&&typeof s.prompt_tokens=="number")?{prompt_tokens:z(t.traces,s=>s.prompt_tokens),completion_tokens:z(t.traces,s=>s.completion_tokens)}:void 0,k=W(t.rendered_columns),C=e.jsxs(e.Fragment,{children:[e.jsx(c,{title:"Input",description:"The input passed to the task.",copyableText:typeof t.input=="string"?t.input:void 0,children:e.jsx(u,{shouldTruncateText:!1,input:t.input})}),e.jsx(x,{}),t.expected?e.jsxs(e.Fragment,{children:[e.jsx(c,{title:"Expected",description:"A description of the expected output of the task.",copyableText:typeof t.expected=="string"?t.expected:void 0,children:e.jsx(u,{shouldTruncateText:!1,input:t.expected})}),e.jsx(x,{})]}):null,e.jsx(c,{title:"Output",description:"The output of the task.",copyableText:typeof t.output=="string"?t.output:void 0,children:e.jsx(u,{shouldTruncateText:!1,input:t.output})})]});return e.jsxs("div",{className:"flex flex-col h-full",children:[e.jsx("div",{className:"sticky top-0 z-50 bg-sidebar border-b border-sidebar-border shadow-sm",children:e.jsxs("div",{className:"p-2 flex items-center gap-3",children:[e.jsx(O,{size:"icon",variant:"ghost",asChild:!0,children:e.jsx(M,{to:"/eval/$name",params:{name:n},search:{timestamp:i??void 0},preload:"intent",resetScroll:!1,children:e.jsx(Z,{className:"size-5 rotate-180"})})}),e.jsxs("div",{children:[e.jsx("span",{className:"text-primary block font-semibold mb-1",children:"Trace"}),e.jsx(G,{children:e.jsxs(J,{children:[e.jsx(v,{children:e.jsx(B,{isRunning:S,score:t.score,state:L(t.score,o==null?void 0:o.score),evalStatus:l.status,resultStatus:t.status})}),e.jsx(y,{orientation:"vertical",className:"mx-1 h-4"}),e.jsx(v,{children:$(t.duration)}),e.jsx(y,{orientation:"vertical",className:"mx-1 h-4"}),e.jsx(v,{children:e.jsx(K,{date:l.created_at})}),h&&e.jsxs(e.Fragment,{children:[e.jsx(y,{orientation:"vertical",className:"mx-1 h-4"}),e.jsxs(v,{children:[h.prompt_tokens+h.completion_tokens," ","Tokens"]})]})]})})]})]})}),e.jsx("div",{className:"flex-1 overflow-auto",children:e.jsxs("div",{className:"flex flex-row h-full",children:[e.jsxs("div",{className:"w-44 flex flex-col gap-3 flex-shrink-0 p-2",children:[e.jsx(E,{duration:_-g,title:"Eval",startPercent:0,endPercent:100,name:n,resultIndex:r}),t.traces.map((s,m)=>{const T=s.start_time-g,D=s.end_time-g,R=T/w*100,q=D/w*100;return e.jsx(E,{duration:s.end_time-s.start_time,title:`Trace ${m+1}`,name:n,resultIndex:r,traceIndex:m,endPercent:q,startPercent:R},m)}),t.traces.length===0&&e.jsxs("span",{className:"text-xs block text-gray-500 text-center text-balance",children:["Use ",e.jsx("code",{children:"reportTrace"})," to capture traces."]})]}),e.jsxs("div",{className:"flex-grow border-l p-4",children:[d==null&&e.jsxs(e.Fragment,{children:[h&&e.jsxs(e.Fragment,{children:[e.jsxs(c,{title:"Token Usage",description:"How many tokens the entire evaluation used.",children:[e.jsxs("span",{className:"block mb-1 text-sm",children:["Prompt Tokens: ",h.prompt_tokens]}),e.jsxs("span",{className:"block",children:["Completion Tokens: ",h.completion_tokens]})]}),e.jsx(x,{})]}),!k&&C,k&&t.rendered_columns.map((s,m)=>e.jsxs(b.Fragment,{children:[m>0&&e.jsx(x,{}),e.jsx(c,{title:s.label,description:void 0,copyableText:typeof s.value=="string"?s.value:void 0,children:e.jsx(u,{shouldTruncateText:!1,input:s.value})})]},s.label)),t.scores.map(s=>{var m;return e.jsxs(b.Fragment,{children:[e.jsx(x,{}),e.jsx(c,{title:s.name,description:s.description,children:e.jsx(B,{isRunning:S,score:s.score??0,state:L(s.score??0,(m=o==null?void 0:o.scores.find(T=>T.name===s.name))==null?void 0:m.score),evalStatus:l.status,resultStatus:t.status})},s.name),s.metadata?e.jsx("div",{className:"mt-2",children:e.jsx(u,{shouldTruncateText:!1,input:s.metadata,name:"metadata"})}):null]},s.name)}),k&&e.jsxs(e.Fragment,{children:[e.jsx(x,{}),C]})]}),d&&e.jsxs(e.Fragment,{children:[typeof d.completion_tokens=="number"&&typeof d.prompt_tokens=="number"&&e.jsxs(e.Fragment,{children:[e.jsxs(c,{title:"Token Usage",description:"How many tokens were used by this trace.",children:[e.jsxs("span",{className:"block mb-1 text-sm",children:["Prompt Tokens: ",d.prompt_tokens]}),e.jsxs("span",{className:"block",children:["Completion Tokens:"," ",d.completion_tokens]})]}),e.jsx(x,{})]}),e.jsx(c,{title:"Input",children:e.jsx(u,{shouldTruncateText:!1,input:d.input})}),e.jsx(x,{}),e.jsx(c,{title:"Output",children:e.jsx(u,{shouldTruncateText:!1,input:d.output})})]})]})]})})]})};export{ae as component};