judgeval 0.3.1 → 0.3.2

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.
package/dist/index.mjs CHANGED
@@ -1,2 +1,5 @@
1
- import{OTLPTraceExporter as t}from"@opentelemetry/exporter-trace-otlp-http";import{SpanKind as e,context as r,trace as i}from"@opentelemetry/api";import{resourceFromAttributes as s}from"@opentelemetry/resources";import{BatchSpanProcessor as n,WebTracerProvider as a}from"@opentelemetry/sdk-trace-web";import{NodeSDK as o}from"@opentelemetry/sdk-node";import{BatchSpanProcessor as c}from"@opentelemetry/sdk-trace-node";class u{constructor(e,r,i,s){if(!s||""===s.trim())throw new Error("projectId is required for JudgmentSpanExporter");this.delegate=new t({url:e,headers:{Authorization:`Bearer ${r}`,"X-Organization-Id":i,"X-Project-Id":s}})}static builder(){return new h}export(t,e){this.delegate.export(t,e)}shutdown(){return this.delegate.shutdown()}forceFlush(){return this.delegate.forceFlush?.()??Promise.resolve()}}class h{constructor(){}endpoint(t){return this._endpoint=t,this}apiKey(t){return this._apiKey=t,this}organizationId(t){return this._organizationId=t,this}projectId(t){return this._projectId=t,this}build(){if(!this._endpoint||""===this._endpoint.trim())throw new Error("Endpoint is required");if(!this._apiKey||""===this._apiKey.trim())throw new Error("API key is required");if(!this._organizationId||""===this._organizationId.trim())throw new Error("Organization ID is required");if(!this._projectId||""===this._projectId.trim())throw new Error("Project ID is required");return new u(this._endpoint,this._apiKey,this._organizationId,this._projectId)}}class d{export(t,e){e({code:0})}flush(){return Promise.resolve()}shutdown(){return Promise.resolve()}}class l{}function p(t,e){return process.env[t]||(e??null)}l.AttributeKeys={JUDGMENT_SPAN_KIND:"judgment.span_kind",JUDGMENT_INPUT:"judgment.input",JUDGMENT_OUTPUT:"judgment.output",JUDGMENT_OFFLINE_MODE:"judgment.offline_mode",JUDGMENT_UPDATE_ID:"judgment.update_id",JUDGMENT_CUSTOMER_ID:"judgment.customer_id",JUDGMENT_AGENT_ID:"judgment.agent_id",JUDGMENT_PARENT_AGENT_ID:"judgment.parent_agent_id",JUDGMENT_AGENT_CLASS_NAME:"judgment.agent_class_name",JUDGMENT_AGENT_INSTANCE_NAME:"judgment.agent_instance_name",PENDING_TRACE_EVAL:"judgment.pending_trace_eval",GEN_AI_PROMPT:"gen_ai.prompt",GEN_AI_COMPLETION:"gen_ai.completion",GEN_AI_REQUEST_MODEL:"gen_ai.request.model",GEN_AI_RESPONSE_MODEL:"gen_ai.response.model",GEN_AI_SYSTEM:"gen_ai.system",GEN_AI_USAGE_INPUT_TOKENS:"gen_ai.usage.input_tokens",GEN_AI_USAGE_OUTPUT_TOKENS:"gen_ai.usage.output_tokens",GEN_AI_USAGE_COMPLETION_TOKENS:"gen_ai.usage.completion_tokens",GEN_AI_REQUEST_TEMPERATURE:"gen_ai.request.temperature",GEN_AI_REQUEST_MAX_TOKENS:"gen_ai.request.max_tokens",GEN_AI_RESPONSE_FINISH_REASONS:"gen_ai.response.finish_reasons",GEN_AI_USAGE_TOTAL_COST:"gen_ai.usage.total_cost_usd"},l.InternalAttributeKeys={DISABLE_PARTIAL_EMIT:"disable_partial_emit",CANCELLED:"cancelled"},l.ResourceKeys={SERVICE_NAME:"service.name",TELEMETRY_SDK_LANGUAGE:"telemetry.sdk.language",TELEMETRY_SDK_NAME:"telemetry.sdk.name",TELEMETRY_SDK_VERSION:"telemetry.sdk.version",JUDGMENT_PROJECT_ID:"judgment.project_id"};const _=p("JUDGMENT_API_KEY"),E=p("JUDGMENT_ORG_ID"),g=p("JUDGMENT_API_URL","https://api.judgmentlabs.ai"),m=p("JUDGMENT_DEFAULT_GPT_MODEL","gpt-4.1"),T=p("JUDGMENT_ENABLE_MONITORING","true"),w=p("JUDGMENT_ENABLE_EVALUATIONS","true"),f=p("JUDGMENT_NO_COLOR");class N{constructor(t,e,r){this.baseUrl=t,this.apiKey=e,this.organizationId=r}buildUrl(t){return this.baseUrl+t}buildHeaders(){if(!this.apiKey||!this.organizationId)throw new Error("API key and organization ID cannot be null");return{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`,"X-Organization-Id":this.organizationId}}async addToRunEvalQueueExamples(t){const e=this.buildUrl("/add_to_run_eval_queue/examples"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw new Error(`HTTP Error: ${r.status} - ${await r.text()}`)}async addToRunEvalQueueTraces(t){const e=this.buildUrl("/add_to_run_eval_queue/traces"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw new Error(`HTTP Error: ${r.status} - ${await r.text()}`)}async logEvalResults(t){const e=this.buildUrl("/log_eval_results/"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw new Error(`HTTP Error: ${r.status} - ${await r.text()}`)}async fetchExperimentRun(t){const e=this.buildUrl("/fetch_experiment_run/"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw new Error(`HTTP Error: ${r.status} - ${await r.text()}`)}async getEvaluationStatus(t,e){const r=new URLSearchParams;r.set("experiment_run_id",t),r.set("project_name",e);const i=this.buildUrl("/get_evaluation_status/"+(r.toString()?"?"+r.toString():"")),s=await fetch(i,{method:"GET",headers:this.buildHeaders()});if(!s.ok)throw new Error(`HTTP Error: ${s.status} - ${await s.text()}`)}async scorerExists(t){const e=this.buildUrl("/scorer_exists/"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw new Error(`HTTP Error: ${r.status} - ${await r.text()}`);return await r.json()}async saveScorer(t){const e=this.buildUrl("/save_scorer/"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw new Error(`HTTP Error: ${r.status} - ${await r.text()}`);return await r.json()}async fetchScorers(t){const e=this.buildUrl("/fetch_scorers/"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw new Error(`HTTP Error: ${r.status} - ${await r.text()}`);return await r.json()}async projectsResolve(t){const e=this.buildUrl("/projects/resolve/"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw new Error(`HTTP Error: ${r.status} - ${await r.text()}`);return await r.json()}}const S=/^([^(]+?)=>/,I=/^[^(]*\(\s*([^)]*)\)/m,y=/,/,A=/^\s*(_?)(\S+?)\1\s*$/,R=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;function v(t){const e=function(t){const e=function(t){return Function.prototype.toString.call(t)}(t).replace(R,"");return e.match(S)||e.match(I)}(t);return e&&e[1]?e[1].split(y).map(t=>t.replace(A,(t,e,r)=>r).trim()).filter(t=>t.length>0):[]}class O{static initialize(){if(!O.initialized){const t=process.env.JUDGMENT_NO_COLOR;O.useColor=!t&&process.stdout.isTTY,O.initialized=!0}}static setLevel(t){O.currentLevel=t}static setUseColor(t){O.useColor=t}static log(t,e){if(O.initialize(),t<O.currentLevel)return;let r=`${(new Date).toISOString().replace("T"," ").substring(0,19)} - judgeval - ${Object.keys(O.Level).find(e=>O.Level[e]===t)||"UNKNOWN"} - ${e}`;O.useColor&&(r=`${t===O.Level.DEBUG||t===O.Level.INFO?O.GRAY:t===O.Level.WARNING?O.YELLOW:O.RED}${r}${O.RESET}`),(t>=O.Level.ERROR?process.stderr:process.stdout).write(r+"\n")}static debug(t){O.log(O.Level.DEBUG,t)}static info(t){O.log(O.Level.INFO,t)}static warning(t){O.log(O.Level.WARNING,t)}static warn(t){O.log(O.Level.WARNING,t)}static error(t){O.log(O.Level.ERROR,t)}static critical(t){O.log(O.Level.CRITICAL,t)}}O.RESET="",O.RED="",O.YELLOW="",O.GRAY="",O.Level={DEBUG:0,INFO:1,WARNING:2,ERROR:3,CRITICAL:4},O.initialized=!1,O.currentLevel=O.Level.INFO,O.useColor=!0;class P{getConfiguration(){return this.configuration}getProjectId(){return this.projectId}getSerializer(){return this.serializer}constructor(t){this.tracer=null,this.serializer=JSON.stringify,this._initialized=!1,this.projectId=null,this.configuration=t,this.apiClient=new N(this.configuration.apiUrl,this.configuration.apiKey,this.configuration.organizationId),this._initialized=!1}async resolveProjectId(){try{O.info(`Resolving project ID for project: ${this.configuration.projectName}`);const t=await this.apiClient.projectsResolve({project_name:this.configuration.projectName});O.info(`Resolved project ID: ${t.project_id}`);const e=t.project_id?.toString();if(!e)throw new Error(`Project ID not found for project: ${this.configuration.projectName}`);return this.projectId=e,O.info(`Successfully resolved project ID: ${this.projectId}`),this.projectId}catch(t){throw new Error(`Failed to resolve project ID: ${t instanceof Error?t.message:String(t)}`)}}static getExporter(t,e,r){const i=g?.endsWith("/")?`${g}otel/v1/traces`:`${g}/otel/v1/traces`;return u.builder().endpoint(i).apiKey(t).organizationId(e).projectId(r).build()}async getSpanExporter(){try{const t=await this.resolveProjectId();return this.createJudgmentSpanExporter(t)}catch(t){return O.error("Failed to resolve project "+this.configuration.projectName+", please create it first at https://app.judgmentlabs.ai/org/"+(this.configuration.organizationId||"unknown")+"/projects. Skipping Judgment export."),new d}}setSpanKind(t){const e=i.getActiveSpan();e?null!==t&&e.setAttribute(l.AttributeKeys.JUDGMENT_SPAN_KIND,t):O.warn("No active span found, skipping setSpanKind")}setAttribute(t,e){const r=i.getActiveSpan();r?r.setAttribute(t,this.serializer(e)):O.warn("No active span found, skipping setAttribute")}setLLMSpan(){this.setSpanKind("llm")}setToolSpan(){this.setSpanKind("tool")}setGeneralSpan(){this.setSpanKind("span")}setAttributes(t){if(!t)return;const e=i.getActiveSpan();if(e)for(const[r,i]of Object.entries(t))e.setAttribute(r,this.serializer(i));else O.warn("No active span found, skipping setAttributes")}setInput(t){this.setAttribute(l.AttributeKeys.JUDGMENT_INPUT,t)}setOutput(t){this.setAttribute(l.AttributeKeys.JUDGMENT_OUTPUT,t)}asyncEvaluate(t,e,r){if(!this._initialized)return void O.warn("Tracer not initialized, skipping asyncEvaluate");if(!this.configuration.enableEvaluation)return;const s=i.getActiveSpan();if(!s)return void O.warn("No active span found, skipping asyncEvaluate");if(!s.isRecording())return void O.warn("Active span is not recording, skipping asyncEvaluate");const n=s.spanContext(),a=n.traceId,o=n.spanId;O.info(`asyncEvaluate: project=${this.configuration.projectName}, traceId=${a}, spanId=${o}, scorer=${t.name}`);const c=this.createEvaluationRun(t,e,r,a,o);this.enqueueEvaluation(c)}asyncTraceEvaluate(t,e){if(!this._initialized)return void O.warn("Tracer not initialized, skipping asyncTraceEvaluate");if(!this.configuration.enableEvaluation)return;const r=i.getActiveSpan();if(!r)return void O.warn("No active span found, skipping asyncTraceEvaluate");if(!r.isRecording())return void O.warn("Active span is not recording, skipping asyncTraceEvaluate");const s=r.spanContext(),n=s.traceId,a=s.spanId;O.info(`asyncTraceEvaluate: project=${this.configuration.projectName}, traceId=${n}, spanId=${a}, scorer=${t.name}`);try{const i=this.createTraceEvaluationRun(t,e,n,a),s=this.serializer(i);r.setAttribute(l.AttributeKeys.PENDING_TRACE_EVAL,s)}catch(t){O.error(`Failed to serialize trace evaluation: ${t instanceof Error?t.message:String(t)}`)}}createTraceEvaluationRun(t,e,r,i){const s=`async_trace_evaluate_${i||Date.now()}`,n=e||m,a=t.getScorerConfig();return{project_name:this.configuration.projectName,eval_name:s,scorer:a,model:n,organization_id:this.configuration.organizationId,trace_id:r,trace_span_id:i}}createJudgmentSpanExporter(t){const e=this.configuration.apiUrl.endsWith("/")?`${this.configuration.apiUrl}otel/v1/traces`:`${this.configuration.apiUrl}/otel/v1/traces`;return u.builder().endpoint(e).apiKey(this.configuration.apiKey).organizationId(this.configuration.organizationId).projectId(t).build()}createEvaluationRun(t,e,r,i,s){const n=`async_evaluate_${s||Date.now()}`,a=r||m,o=t.getScorerConfig();return{project_name:this.configuration.projectName,eval_name:n,examples:[e],custom_scorers:[],judgment_scorers:[o],model:a,trace_id:i,trace_span_id:s}}async enqueueEvaluation(t){if(this.apiClient)try{await this.apiClient.addToRunEvalQueueExamples(t),O.info(`Enqueuing evaluation run: ${t.eval_name}`)}catch(t){O.error(`Failed to enqueue evaluation run: ${t instanceof Error?t.message:String(t)}`)}else O.warn("API client not available, skipping evaluation enqueue")}observe(t,s="span"){return(...n)=>{const a=i.getActiveSpan();if(!a)return O.warn("No active span found, skipping observe"),t(...n);const o=t.name||"anonymous",c=i.getTracer(this.configuration.tracerName);return r.with(i.setSpan(r.active(),a),()=>c.startActiveSpan(o,{kind:e.INTERNAL},e=>{try{e.setAttribute(l.AttributeKeys.JUDGMENT_SPAN_KIND,s);const r=v(t);if(r.length===n.length){const t={};r.forEach((e,r)=>{t[e]=n[r]}),e.setAttribute(l.AttributeKeys.JUDGMENT_INPUT,this.serializer(t))}const i=t(...n);return i instanceof Promise?i.then(t=>(e.setAttribute(l.AttributeKeys.JUDGMENT_OUTPUT,this.serializer(t)),e.end(),t)).catch(t=>{throw e.recordException(t),e.end(),t}):(e.setAttribute(l.AttributeKeys.JUDGMENT_OUTPUT,this.serializer(i)),e.end(),i)}catch(t){throw e.recordException(t),e.end(),t}}))}}async shutdown(){}}P.instances=new Map;const b="opentelemetry.instrumentation.judgeval";class U{constructor(t,e,r,i,s,n=b){this.projectName=t,this.apiKey=e,this.organizationId=r,this.apiUrl=i,this.enableEvaluation=s,this.tracerName=n}static createDefault(t){return(new D).projectName(t).build()}static builder(){return new D}}class D{constructor(){this._apiKey=_,this._organizationId=E,this._apiUrl=g,this._enableEvaluation=!0,this._tracerName=b}projectName(t){return this._projectName=t,this}apiKey(t){return this._apiKey=t,this}organizationId(t){return this._organizationId=t,this}apiUrl(t){return this._apiUrl=t,this}enableEvaluation(t){return this._enableEvaluation=t,this}tracerName(t){return this._tracerName=t,this}build(){if(!this._projectName)throw new Error("Project name is required");if(!this._apiKey)throw new Error("API key is required");if(!this._organizationId)throw new Error("Organization ID is required");if(!this._apiUrl)throw new Error("API URL is required");return new U(this._projectName,this._apiKey,this._organizationId,this._apiUrl,this._enableEvaluation,this._tracerName)}}function j(t){return{example_id:void 0,created_at:(new Date).toISOString(),name:null,...t}}var C,L;function M(){const t={score_type:"",class_name:"BaseScorer",name:"",addModel:e=>{t.model=e},successCheck:()=>{if(null!=t.error)return!1;if(null==t.score)return!1;const e=t.threshold??.5,r=t.score;return null!=e&&null!=r&&r>=e},getRequiredParams:()=>[],getScorerConfig:()=>({score_type:t.score_type,name:t.name,threshold:t.threshold??.5,strict_mode:t.strict_mode??!1,required_params:[],kwargs:{}})};return t.name=t.class_name,!0===t.strict_mode&&(t.threshold=1),t}function $(t,e){const r=M();return r.scoreType=t,r.name=t,r.score_type=t,r.requiredParams=e,r.setThreshold=t=>{if(t<0||t>1)throw new Error(`Threshold must be between 0 and 1, got: ${t}`);r.threshold=t},r.getScoreType=()=>r.scoreType,r.setRequiredParams=t=>{r.requiredParams=t},r}!function(t){t.INPUT="input",t.ACTUAL_OUTPUT="actual_output",t.EXPECTED_OUTPUT="expected_output",t.CONTEXT="context",t.RETRIEVAL_CONTEXT="retrieval_context",t.TOOLS_CALLED="tools_called",t.EXPECTED_TOOLS="expected_tools",t.ADDITIONAL_METADATA="additional_metadata"}(C||(C={})),function(t){t.PROMPT_SCORER="Prompt Scorer",t.TRACE_PROMPT_SCORER="Trace Prompt Scorer",t.FAITHFULNESS="Faithfulness",t.ANSWER_RELEVANCY="Answer Relevancy",t.ANSWER_CORRECTNESS="Answer Correctness",t.INSTRUCTION_ADHERENCE="Instruction Adherence",t.EXECUTION_ORDER="Execution Order",t.TOOL_ORDER="Tool Order",t.CLASSIFIER="Classifier",t.TOOL_DEPENDENCY="Tool Dependency",t.CUSTOM="Custom"}(L||(L={}));class G extends Error{constructor(t,e){super(e),this.statusCode=t,this.name="JudgmentAPIError"}}async function z(t,e,r,i,s=_||"",n=E||"",a){if(!g||!s||!n)throw new Error("Missing required API credentials");const o=new N(g,s,n);return(await o.saveScorer({name:t,prompt:e,threshold:r,options:i,is_trace:a})).name}async function K(t,e=_||"",r=E||""){if(!g||!e||!r)throw new Error("Missing required API credentials");const i=new N(g,e,r),s=await i.fetchScorers({names:[t]});if(0===s.scorers.length)throw new G(404,`Scorer with name ${t} not found`);const{created_at:n,updated_at:a,...o}=s.scorers[0];return o}async function x(t,e=_||"",r=E||""){if(!g||!e||!r)throw new Error("Missing required API credentials");const i=new N(g,e,r);return(await i.scorerExists({name:t})).exists}class k{constructor(t,e,r,i,s,n,a=_||"",o=E||""){this.scoreType=t,this.name=e,this.prompt=r,this.threshold=i,this.requiredParams=s,this.options=n,this.judgmentApiKey=a,this.organizationId=o,this.score_type=t,this.class_name="BasePromptScorer",this.model=void 0,this.score=void 0,this.error=null,this.strict_mode=!1}static async get(t,e=_||"",r=E||""){const i=await K(t,e,r),s=!0===i.is_trace;if(s!==(this.prototype.scoreType===L.TRACE_PROMPT_SCORER))throw new G(400,`Scorer with name ${t} is not a ${this.name}`);return new this(s?L.TRACE_PROMPT_SCORER:L.PROMPT_SCORER,i.name,i.prompt,i.threshold,[],i.options,e,r)}static async create(t,e,r=.5,i,s=_||"",n=E||""){if(await x(t,s,n))throw new G(400,`Scorer with name ${t} already exists. Either use the existing scorer with the get() method or use a new name.`);const a=this.prototype.scoreType===L.TRACE_PROMPT_SCORER,o=a?L.TRACE_PROMPT_SCORER:L.PROMPT_SCORER;return await z(t,e,r,i,s,n,a),new this(o,t,e,r,[],i,s,n)}async updateThreshold(t){this.setThreshold(t),await this.pushPromptScorer()}async setPrompt(t){this.prompt=t,await this.pushPromptScorer()}async setOptions(t){this.options=t,await this.pushPromptScorer()}async appendToPrompt(t){this.prompt+=t,await this.pushPromptScorer()}getThreshold(){return this.threshold}getPrompt(){return this.prompt}getOptions(){return this.options?{...this.options}:null}getName(){return this.name}getConfig(){return{name:this.name,prompt:this.prompt,threshold:this.threshold,options:this.options}}async pushPromptScorer(){await z(this.name,this.prompt,this.threshold,this.options,this.judgmentApiKey,this.organizationId)}toString(){return`${this.constructor.name}(name=${this.name}, prompt=${this.prompt}, threshold=${this.threshold}, options=${JSON.stringify(this.options)})`}addModel(t){this.model=t}successCheck(){if(null!=this.error)return!1;if(null==this.score)return!1;const t=this.threshold??.5,e=this.score;return null!=t&&null!=e&&e>=t}getRequiredParams(){return Array.isArray(this.requiredParams)?[...this.requiredParams]:[]}setThreshold(t){if(t<0||t>1)throw new Error(`Threshold must be between 0 and 1, got: ${t}`);this.threshold=t}getScoreType(){return this.scoreType}setRequiredParams(t){this.requiredParams=t}getScorerConfig(){return{score_type:this.getScoreType(),name:this.getName(),threshold:this.getThreshold(),strict_mode:this.strict_mode??!1,required_params:this.getRequiredParams(),kwargs:{prompt:this.getPrompt(),...this.getOptions()?{options:this.getOptions()}:{}}}}}class J extends k{constructor(t,e,r,i,s=[],n,a=_||"",o=E||""){super(t,e,r,i,s,n,a,o)}}class q extends k{constructor(t,e,r,i,s=[],n,a=_||"",o=E||""){super(t,e,r,i,s,n,a,o)}}const H="0.3.1";class F extends P{async initialize(t={}){if(this._initialized)return this;try{const e={[l.ResourceKeys.SERVICE_NAME]:this.configuration.projectName,[l.ResourceKeys.TELEMETRY_SDK_VERSION]:H,...t.resourceAttributes},r=await this.getSpanExporter();return this.webTracerProvider=new a({resource:s(e),spanProcessors:[new n(r)]}),this.webTracerProvider.register(),this._initialized=!0,this}catch(t){throw new Error(`Failed to initialize browser tracer: ${t instanceof Error?t.message:String(t)}`)}}static getInstance(t){const e=`BrowserTracer:${t.projectName}`;return P.instances.has(e)||P.instances.set(e,new F(t)),P.instances.get(e)}static createDefault(t){const e=U.builder().projectName(t).build();return F.getInstance(e)}static createWithConfiguration(t){return new F(t)}}class Y extends P{async initialize(t={}){if(this._initialized)return this;try{const e={[l.ResourceKeys.SERVICE_NAME]:this.configuration.projectName,[l.ResourceKeys.TELEMETRY_SDK_VERSION]:H,...t.resourceAttributes},r=await this.getSpanExporter();return this.nodeSDK=new o({resource:s(e),instrumentations:t.instrumentations,spanProcessor:new c(r),...t}),this.nodeSDK.start(),this._initialized=!0,this}catch(t){throw new Error(`Failed to initialize node tracer: ${t instanceof Error?t.message:String(t)}`)}}static getInstance(t){const e=`NodeTracer:${t.projectName}`;return P.instances.has(e)||P.instances.set(e,new Y(t)),P.instances.get(e)}static createDefault(t){const e=U.builder().projectName(t).enableEvaluation(!0).build();return Y.getInstance(e)}static createWithConfiguration(t){return new Y(t)}async shutdown(){this.nodeSDK&&await this.nodeSDK.shutdown()}}export{L as APIScorerType,k as BasePromptScorer,F as BrowserTracer,C as ExampleParams,_ as JUDGMENT_API_KEY,g as JUDGMENT_API_URL,m as JUDGMENT_DEFAULT_GPT_MODEL,w as JUDGMENT_ENABLE_EVALUATIONS,T as JUDGMENT_ENABLE_MONITORING,f as JUDGMENT_NO_COLOR,E as JUDGMENT_ORG_ID,G as JudgmentAPIError,N as JudgmentApiClient,u as JudgmentSpanExporter,O as Logger,d as NoOpSpanExporter,Y as NodeTracer,l as OpenTelemetryKeys,J as PromptScorer,q as TracePromptScorer,P as Tracer,U as TracerConfiguration,D as TracerConfigurationBuilder,$ as createAPIScorer,M as createBaseScorer,j as createExample,K as fetchPromptScorer,v as parseFunctionArgs,z as pushPromptScorer,x as scorerExists};
2
- //# sourceMappingURL=index.mjs.map
1
+ import{OTLPTraceExporter as k}from"@opentelemetry/exporter-trace-otlp-http";class v{delegate;constructor(t,e,r,n){if(!n||n.trim()==="")throw Error("projectId is required for JudgmentSpanExporter");this.delegate=new k({url:t,headers:{Authorization:`Bearer ${e}`,"X-Organization-Id":r,"X-Project-Id":n}})}static builder(){return new M}export(t,e){this.delegate.export(t,e)}shutdown(){return this.delegate.shutdown()}forceFlush(){return this.delegate.forceFlush?.()??Promise.resolve()}}class M{_endpoint;_apiKey;_organizationId;_projectId;constructor(){}endpoint(t){return this._endpoint=t,this}apiKey(t){return this._apiKey=t,this}organizationId(t){return this._organizationId=t,this}projectId(t){return this._projectId=t,this}build(){if(!this._endpoint||this._endpoint.trim()==="")throw Error("Endpoint is required");if(!this._apiKey||this._apiKey.trim()==="")throw Error("API key is required");if(!this._organizationId||this._organizationId.trim()==="")throw Error("Organization ID is required");if(!this._projectId||this._projectId.trim()==="")throw Error("Project ID is required");return new v(this._endpoint,this._apiKey,this._organizationId,this._projectId)}}class A{export(t,e){e({code:0})}flush(){return Promise.resolve()}shutdown(){return Promise.resolve()}}class u{static AttributeKeys={JUDGMENT_SPAN_KIND:"judgment.span_kind",JUDGMENT_INPUT:"judgment.input",JUDGMENT_OUTPUT:"judgment.output",JUDGMENT_OFFLINE_MODE:"judgment.offline_mode",JUDGMENT_UPDATE_ID:"judgment.update_id",JUDGMENT_CUSTOMER_ID:"judgment.customer_id",JUDGMENT_AGENT_ID:"judgment.agent_id",JUDGMENT_PARENT_AGENT_ID:"judgment.parent_agent_id",JUDGMENT_AGENT_CLASS_NAME:"judgment.agent_class_name",JUDGMENT_AGENT_INSTANCE_NAME:"judgment.agent_instance_name",PENDING_TRACE_EVAL:"judgment.pending_trace_eval",GEN_AI_PROMPT:"gen_ai.prompt",GEN_AI_COMPLETION:"gen_ai.completion",GEN_AI_REQUEST_MODEL:"gen_ai.request.model",GEN_AI_RESPONSE_MODEL:"gen_ai.response.model",GEN_AI_SYSTEM:"gen_ai.system",GEN_AI_USAGE_INPUT_TOKENS:"gen_ai.usage.input_tokens",GEN_AI_USAGE_OUTPUT_TOKENS:"gen_ai.usage.output_tokens",GEN_AI_USAGE_COMPLETION_TOKENS:"gen_ai.usage.completion_tokens",GEN_AI_REQUEST_TEMPERATURE:"gen_ai.request.temperature",GEN_AI_REQUEST_MAX_TOKENS:"gen_ai.request.max_tokens",GEN_AI_RESPONSE_FINISH_REASONS:"gen_ai.response.finish_reasons",GEN_AI_USAGE_TOTAL_COST:"gen_ai.usage.total_cost_usd"};static InternalAttributeKeys={DISABLE_PARTIAL_EMIT:"disable_partial_emit",CANCELLED:"cancelled"};static ResourceKeys={SERVICE_NAME:"service.name",TELEMETRY_SDK_LANGUAGE:"telemetry.sdk.language",TELEMETRY_SDK_NAME:"telemetry.sdk.name",TELEMETRY_SDK_VERSION:"telemetry.sdk.version",JUDGMENT_PROJECT_ID:"judgment.project_id"}}import{context as C,SpanKind as Y,trace as f}from"@opentelemetry/api";function g(t,e){let r=process.env[t];if(!r)return e??null;return r}var p=g("JUDGMENT_API_KEY"),E=g("JUDGMENT_ORG_ID"),m=g("JUDGMENT_API_URL","https://api.judgmentlabs.ai"),I=g("JUDGMENT_DEFAULT_GPT_MODEL","gpt-4.1"),pt=g("JUDGMENT_ENABLE_MONITORING","true"),Et=g("JUDGMENT_ENABLE_EVALUATIONS","true"),dt=g("JUDGMENT_NO_COLOR");class N{baseUrl;apiKey;organizationId;constructor(t,e,r){this.baseUrl=t,this.apiKey=e,this.organizationId=r}buildUrl(t){return this.baseUrl+t}buildHeaders(){if(!this.apiKey||!this.organizationId)throw Error("API key and organization ID cannot be null");return{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`,"X-Organization-Id":this.organizationId}}async addToRunEvalQueueExamples(t){let e=this.buildUrl("/add_to_run_eval_queue/examples"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw Error(`HTTP Error: ${r.status} - ${await r.text()}`);return}async addToRunEvalQueueTraces(t){let e=this.buildUrl("/add_to_run_eval_queue/traces"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw Error(`HTTP Error: ${r.status} - ${await r.text()}`);return}async logEvalResults(t){let e=this.buildUrl("/log_eval_results/"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw Error(`HTTP Error: ${r.status} - ${await r.text()}`);return}async fetchExperimentRun(t){let e=this.buildUrl("/fetch_experiment_run/"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw Error(`HTTP Error: ${r.status} - ${await r.text()}`);return}async getEvaluationStatus(t,e){let r=new URLSearchParams;r.set("experiment_run_id",t),r.set("project_name",e);let n=this.buildUrl("/get_evaluation_status/"+(r.toString()?"?"+r.toString():"")),s=await fetch(n,{method:"GET",headers:this.buildHeaders()});if(!s.ok)throw Error(`HTTP Error: ${s.status} - ${await s.text()}`);return}async scorerExists(t){let e=this.buildUrl("/scorer_exists/"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw Error(`HTTP Error: ${r.status} - ${await r.text()}`);return await r.json()}async saveScorer(t){let e=this.buildUrl("/save_scorer/"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw Error(`HTTP Error: ${r.status} - ${await r.text()}`);return await r.json()}async fetchScorers(t){let e=this.buildUrl("/fetch_scorers/"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw Error(`HTTP Error: ${r.status} - ${await r.text()}`);return await r.json()}async projectsResolve(t){let e=this.buildUrl("/projects/resolve/"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw Error(`HTTP Error: ${r.status} - ${await r.text()}`);return await r.json()}}var z=/^([^(]+?)=>/,F=/^[^(]*\(\s*([^)]*)\)/m,H=/,/,q=/^\s*(_?)(\S+?)\1\s*$/,B=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;function V(t){return Function.prototype.toString.call(t)}function W(t){let e=V(t).replace(B,"");return e.match(z)||e.match(F)}function G(t){let e=W(t);if(!e||!e[1])return[];return e[1].split(H).map((r)=>{return r.replace(q,(s,a,o)=>o).trim()}).filter((r)=>r.length>0)}class i{static RESET="\x1B[0m";static RED="\x1B[31m";static YELLOW="\x1B[33m";static GRAY="\x1B[90m";static Level={DEBUG:0,INFO:1,WARNING:2,ERROR:3,CRITICAL:4};static initialized=!1;static currentLevel=i.Level.INFO;static useColor=!0;static initialize(){if(!i.initialized){let t=process.env.JUDGMENT_NO_COLOR;i.useColor=!t&&process.stdout.isTTY,i.initialized=!0}}static setLevel(t){i.currentLevel=t}static setUseColor(t){i.useColor=t}static log(t,e){if(i.initialize(),t<i.currentLevel)return;let r=new Date().toISOString().replace("T"," ").substring(0,19),n=Object.keys(i.Level).find((o)=>i.Level[o]===t)||"UNKNOWN",s=`${r} - judgeval - ${n} - ${e}`;if(i.useColor)s=`${t===i.Level.DEBUG||t===i.Level.INFO?i.GRAY:t===i.Level.WARNING?i.YELLOW:i.RED}${s}${i.RESET}`;(t>=i.Level.ERROR?process.stderr:process.stdout).write(s+`
2
+ `)}static debug(t){i.log(i.Level.DEBUG,t)}static info(t){i.log(i.Level.INFO,t)}static warning(t){i.log(i.Level.WARNING,t)}static warn(t){i.log(i.Level.WARNING,t)}static error(t){i.log(i.Level.ERROR,t)}static critical(t){i.log(i.Level.CRITICAL,t)}}class _{static instances=new Map;apiClient;tracer=null;serializer=JSON.stringify;_initialized=!1;projectId=null;configuration;getConfiguration(){return this.configuration}getProjectId(){return this.projectId}getSerializer(){return this.serializer}constructor(t){this.configuration=t,this.apiClient=new N(this.configuration.apiUrl,this.configuration.apiKey,this.configuration.organizationId),this._initialized=!1}async resolveProjectId(){try{i.info(`Resolving project ID for project: ${this.configuration.projectName}`);let t=await this.apiClient.projectsResolve({project_name:this.configuration.projectName});i.info(`Resolved project ID: ${t.project_id}`);let e=t.project_id?.toString();if(!e)throw Error(`Project ID not found for project: ${this.configuration.projectName}`);return this.projectId=e,i.info(`Successfully resolved project ID: ${this.projectId}`),this.projectId}catch(t){throw Error(`Failed to resolve project ID: ${t instanceof Error?t.message:String(t)}`)}}static getExporter(t,e,r){let n=m?.endsWith("/")?`${m}otel/v1/traces`:`${m}/otel/v1/traces`;return v.builder().endpoint(n).apiKey(t).organizationId(e).projectId(r).build()}async getSpanExporter(){try{let t=await this.resolveProjectId();return this.createJudgmentSpanExporter(t)}catch(t){return i.error("Failed to resolve project "+this.configuration.projectName+", please create it first at https://app.judgmentlabs.ai/org/"+(this.configuration.organizationId||"unknown")+"/projects. Skipping Judgment export."),new A}}setSpanKind(t){let e=f.getActiveSpan();if(!e){i.warn("No active span found, skipping setSpanKind");return}if(t!==null)e.setAttribute(u.AttributeKeys.JUDGMENT_SPAN_KIND,t)}setAttribute(t,e){let r=f.getActiveSpan();if(!r){i.warn("No active span found, skipping setAttribute");return}r.setAttribute(t,this.serializer(e))}setLLMSpan(){this.setSpanKind("llm")}setToolSpan(){this.setSpanKind("tool")}setGeneralSpan(){this.setSpanKind("span")}setAttributes(t){if(!t)return;let e=f.getActiveSpan();if(!e){i.warn("No active span found, skipping setAttributes");return}for(let[r,n]of Object.entries(t))e.setAttribute(r,this.serializer(n))}setInput(t){this.setAttribute(u.AttributeKeys.JUDGMENT_INPUT,t)}setOutput(t){this.setAttribute(u.AttributeKeys.JUDGMENT_OUTPUT,t)}asyncEvaluate(t,e,r){if(!this._initialized){i.warn("Tracer not initialized, skipping asyncEvaluate");return}if(!this.configuration.enableEvaluation)return;let n=f.getActiveSpan();if(!n){i.warn("No active span found, skipping asyncEvaluate");return}if(!n.isRecording()){i.warn("Active span is not recording, skipping asyncEvaluate");return}let s=n.spanContext(),a=s.traceId,o=s.spanId;i.info(`asyncEvaluate: project=${this.configuration.projectName}, traceId=${a}, spanId=${o}, scorer=${t.name}`);let c=this.createEvaluationRun(t,e,r,a,o);this.enqueueEvaluation(c)}asyncTraceEvaluate(t,e){if(!this._initialized){i.warn("Tracer not initialized, skipping asyncTraceEvaluate");return}if(!this.configuration.enableEvaluation)return;let r=f.getActiveSpan();if(!r){i.warn("No active span found, skipping asyncTraceEvaluate");return}if(!r.isRecording()){i.warn("Active span is not recording, skipping asyncTraceEvaluate");return}let n=r.spanContext(),s=n.traceId,a=n.spanId;i.info(`asyncTraceEvaluate: project=${this.configuration.projectName}, traceId=${s}, spanId=${a}, scorer=${t.name}`);try{let o=this.createTraceEvaluationRun(t,e,s,a),c=this.serializer(o);r.setAttribute(u.AttributeKeys.PENDING_TRACE_EVAL,c)}catch(o){i.error(`Failed to serialize trace evaluation: ${o instanceof Error?o.message:String(o)}`)}}createTraceEvaluationRun(t,e,r,n){let s=`async_trace_evaluate_${n||Date.now()}`,a=e||I,o=t.getScorerConfig();return{project_name:this.configuration.projectName,eval_name:s,scorer:o,model:a,organization_id:this.configuration.organizationId,trace_id:r,trace_span_id:n}}createJudgmentSpanExporter(t){let e=this.configuration.apiUrl.endsWith("/")?`${this.configuration.apiUrl}otel/v1/traces`:`${this.configuration.apiUrl}/otel/v1/traces`;return v.builder().endpoint(e).apiKey(this.configuration.apiKey).organizationId(this.configuration.organizationId).projectId(t).build()}createEvaluationRun(t,e,r,n,s){let a=`async_evaluate_${s||Date.now()}`,o=r||I,c=t.getScorerConfig();return{project_name:this.configuration.projectName,eval_name:a,examples:[e],custom_scorers:[],judgment_scorers:[c],model:o,trace_id:n,trace_span_id:s}}async enqueueEvaluation(t){if(!this.apiClient){i.warn("API client not available, skipping evaluation enqueue");return}try{await this.apiClient.addToRunEvalQueueExamples(t),i.info(`Enqueuing evaluation run: ${t.eval_name}`)}catch(e){i.error(`Failed to enqueue evaluation run: ${e instanceof Error?e.message:String(e)}`)}}observe(t,e="span"){return(...r)=>{let n=f.getActiveSpan();if(!n)return i.warn("No active span found, skipping observe"),t(...r);let s=t.name||"anonymous",a=f.getTracer(this.configuration.tracerName);return C.with(f.setSpan(C.active(),n),()=>{return a.startActiveSpan(s,{kind:Y.INTERNAL},(o)=>{try{o.setAttribute(u.AttributeKeys.JUDGMENT_SPAN_KIND,e);let c=G(t);if(c.length===r.length){let T={};c.forEach((K,d)=>{T[K]=r[d]}),o.setAttribute(u.AttributeKeys.JUDGMENT_INPUT,this.serializer(T))}let l=t(...r);if(l instanceof Promise)return l.then((T)=>{return o.setAttribute(u.AttributeKeys.JUDGMENT_OUTPUT,this.serializer(T)),o.end(),T}).catch((T)=>{throw o.recordException(T),o.end(),T});else return o.setAttribute(u.AttributeKeys.JUDGMENT_OUTPUT,this.serializer(l)),o.end(),l}catch(c){throw o.recordException(c),o.end(),c}})})}}async shutdown(){}}var D="opentelemetry.instrumentation.judgeval";class h{projectName;apiKey;organizationId;apiUrl;enableEvaluation;tracerName;constructor(t,e,r,n,s,a=D){this.projectName=t;this.apiKey=e;this.organizationId=r;this.apiUrl=n;this.enableEvaluation=s;this.tracerName=a}static createDefault(t){return new U().projectName(t).build()}static builder(){return new U}}class U{_projectName;_apiKey=p;_organizationId=E;_apiUrl=m;_enableEvaluation=!0;_tracerName=D;projectName(t){return this._projectName=t,this}apiKey(t){return this._apiKey=t,this}organizationId(t){return this._organizationId=t,this}apiUrl(t){return this._apiUrl=t,this}enableEvaluation(t){return this._enableEvaluation=t,this}tracerName(t){return this._tracerName=t,this}build(){if(!this._projectName)throw Error("Project name is required");if(!this._apiKey)throw Error("API key is required");if(!this._organizationId)throw Error("Organization ID is required");if(!this._apiUrl)throw Error("API URL is required");return new h(this._projectName,this._apiKey,this._organizationId,this._apiUrl,this._enableEvaluation,this._tracerName)}}function Gt(t){return{example_id:void 0,created_at:new Date().toISOString(),name:null,...t}}var X;((l)=>{l.INPUT="input";l.ACTUAL_OUTPUT="actual_output";l.EXPECTED_OUTPUT="expected_output";l.CONTEXT="context";l.RETRIEVAL_CONTEXT="retrieval_context";l.TOOLS_CALLED="tools_called";l.EXPECTED_TOOLS="expected_tools";l.ADDITIONAL_METADATA="additional_metadata"})(X||={});function $(){let t={score_type:"",class_name:"",name:"",addModel:(e)=>{t.model=e},successCheck:()=>{if(t.error!=null)return!1;if(t.score==null)return!1;let e=t.threshold??0.5,r=t.score;return e!=null&&r!=null&&r>=e},getRequiredParams:()=>{return[]},getScorerConfig:()=>{return{score_type:t.score_type,name:t.name,threshold:t.threshold??0.5,strict_mode:t.strict_mode??!1,required_params:[],kwargs:{}}}};if(t.class_name="BaseScorer",t.name=t.class_name,t.strict_mode===!0)t.threshold=1;return t}var J;((d)=>{d.PROMPT_SCORER="Prompt Scorer";d.TRACE_PROMPT_SCORER="Trace Prompt Scorer";d.FAITHFULNESS="Faithfulness";d.ANSWER_RELEVANCY="Answer Relevancy";d.ANSWER_CORRECTNESS="Answer Correctness";d.INSTRUCTION_ADHERENCE="Instruction Adherence";d.EXECUTION_ORDER="Execution Order";d.TOOL_ORDER="Tool Order";d.CLASSIFIER="Classifier";d.TOOL_DEPENDENCY="Tool Dependency";d.CUSTOM="Custom"})(J||={});function Ft(t,e){let r=$();return r.scoreType=t,r.name=t,r.score_type=t,r.requiredParams=e,r.setThreshold=(n)=>{if(n<0||n>1)throw Error(`Threshold must be between 0 and 1, got: ${n}`);r.threshold=n},r.getScoreType=()=>{return r.scoreType},r.setRequiredParams=(n)=>{r.requiredParams=n},r}class S extends Error{statusCode;constructor(t,e){super(e);this.statusCode=t;this.name="JudgmentAPIError"}}async function b(t,e,r,n,s=p||"",a=E||"",o){if(!m||!s||!a)throw Error("Missing required API credentials");return(await new N(m,s,a).saveScorer({name:t,prompt:e,threshold:r,options:n,is_trace:o})).name}async function O(t,e=p||"",r=E||""){if(!m||!e||!r)throw Error("Missing required API credentials");let s=await new N(m,e,r).fetchScorers({names:[t]});if(s.scorers.length===0)throw new S(404,`Scorer with name ${t} not found`);let{created_at:a,updated_at:o,...c}=s.scorers[0];return c}async function P(t,e=p||"",r=E||""){if(!m||!e||!r)throw Error("Missing required API credentials");return(await new N(m,e,r).scorerExists({name:t})).exists}class R{scoreType;name;prompt;threshold;options;judgmentApiKey;organizationId;requiredParams;score_type;class_name;model;score;error;strict_mode;constructor(t,e,r,n,s,a,o=p||"",c=E||""){this.scoreType=t,this.name=e,this.prompt=r,this.threshold=n,this.requiredParams=s,this.options=a,this.judgmentApiKey=o,this.organizationId=c,this.score_type=t,this.class_name="BasePromptScorer",this.model=void 0,this.score=void 0,this.error=null,this.strict_mode=!1}score_breakdown;reason;using_native_model;success;model_client;additional_metadata;user;server_hosted;static async get(t,e=p||"",r=E||""){let n=await O(t,e,r),s=n.is_trace===!0,a=this.prototype.scoreType==="Trace Prompt Scorer";if(s!==a)throw new S(400,`Scorer with name ${t} is not a ${this.name}`);let o=s?"Trace Prompt Scorer":"Prompt Scorer";return new this(o,n.name,n.prompt,n.threshold,[],n.options,e,r)}static async create(t,e,r=0.5,n,s=p||"",a=E||""){if(await P(t,s,a))throw new S(400,`Scorer with name ${t} already exists. Either use the existing scorer with the get() method or use a new name.`);let o=this.prototype.scoreType==="Trace Prompt Scorer",c=o?"Trace Prompt Scorer":"Prompt Scorer";return await b(t,e,r,n,s,a,o),new this(c,t,e,r,[],n,s,a)}async updateThreshold(t){this.setThreshold(t),await this.pushPromptScorer()}async setPrompt(t){this.prompt=t,await this.pushPromptScorer()}async setOptions(t){this.options=t,await this.pushPromptScorer()}async appendToPrompt(t){this.prompt+=t,await this.pushPromptScorer()}getThreshold(){return this.threshold}getPrompt(){return this.prompt}getOptions(){return this.options?{...this.options}:null}getName(){return this.name}getConfig(){return{name:this.name,prompt:this.prompt,threshold:this.threshold,options:this.options}}async pushPromptScorer(){await b(this.name,this.prompt,this.threshold,this.options,this.judgmentApiKey,this.organizationId)}toString(){return`${this.constructor.name}(name=${this.name}, prompt=${this.prompt}, threshold=${this.threshold}, options=${JSON.stringify(this.options)})`}addModel(t){this.model=t}successCheck(){if(this.error!=null)return!1;if(this.score==null)return!1;let t=this.threshold??0.5,e=this.score;return t!=null&&e!=null&&e>=t}getRequiredParams(){if(Array.isArray(this.requiredParams))return[...this.requiredParams];return[]}setThreshold(t){if(t<0||t>1)throw Error(`Threshold must be between 0 and 1, got: ${t}`);this.threshold=t}getScoreType(){return this.scoreType}setRequiredParams(t){this.requiredParams=t}getScorerConfig(){return{score_type:this.getScoreType(),name:this.getName(),threshold:this.getThreshold(),strict_mode:this.strict_mode??!1,required_params:this.getRequiredParams(),kwargs:{prompt:this.getPrompt(),...this.getOptions()?{options:this.getOptions()}:{}}}}}class j extends R{constructor(t,e,r,n,s=[],a,o=p||"",c=E||""){super(t,e,r,n,s,a,o,c)}}class L extends R{constructor(t,e,r,n,s=[],a,o=p||"",c=E||""){super(t,e,r,n,s,a,o,c)}}import{resourceFromAttributes as Q}from"@opentelemetry/resources";import{BatchSpanProcessor as Z,WebTracerProvider as tt}from"@opentelemetry/sdk-trace-web";var y="0.3.2";class x extends _{webTracerProvider;async initialize(t={}){if(this._initialized)return this;try{let e={[u.ResourceKeys.SERVICE_NAME]:this.configuration.projectName,[u.ResourceKeys.TELEMETRY_SDK_VERSION]:y,...t.resourceAttributes},r=await this.getSpanExporter();return this.webTracerProvider=new tt({resource:Q(e),spanProcessors:[new Z(r)]}),this.webTracerProvider.register(),this._initialized=!0,this}catch(e){throw Error(`Failed to initialize browser tracer: ${e instanceof Error?e.message:String(e)}`)}}static getInstance(t){let e=`BrowserTracer:${t.projectName}`;if(!_.instances.has(e))_.instances.set(e,new x(t));return _.instances.get(e)}static createDefault(t){let e=h.builder().projectName(t).build();return x.getInstance(e)}static createWithConfiguration(t){return new x(t)}}import{resourceFromAttributes as et}from"@opentelemetry/resources";import{NodeSDK as rt}from"@opentelemetry/sdk-node";import{BatchSpanProcessor as nt}from"@opentelemetry/sdk-trace-node";class w extends _{nodeSDK;async initialize(t={}){if(this._initialized)return this;try{let e={[u.ResourceKeys.SERVICE_NAME]:this.configuration.projectName,[u.ResourceKeys.TELEMETRY_SDK_VERSION]:y,...t.resourceAttributes},r=await this.getSpanExporter();return this.nodeSDK=new rt({resource:et(e),instrumentations:t.instrumentations,spanProcessor:new nt(r),...t}),this.nodeSDK.start(),this._initialized=!0,this}catch(e){throw Error(`Failed to initialize node tracer: ${e instanceof Error?e.message:String(e)}`)}}static getInstance(t){let e=`NodeTracer:${t.projectName}`;if(!_.instances.has(e))_.instances.set(e,new w(t));return _.instances.get(e)}static createDefault(t){let e=h.builder().projectName(t).enableEvaluation(!0).build();return w.getInstance(e)}static createWithConfiguration(t){return new w(t)}async shutdown(){if(this.nodeSDK)await this.nodeSDK.shutdown()}}export{P as scorerExists,b as pushPromptScorer,G as parseFunctionArgs,O as fetchPromptScorer,Gt as createExample,$ as createBaseScorer,Ft as createAPIScorer,U as TracerConfigurationBuilder,h as TracerConfiguration,_ as Tracer,L as TracePromptScorer,j as PromptScorer,u as OpenTelemetryKeys,w as NodeTracer,A as NoOpSpanExporter,i as Logger,v as JudgmentSpanExporter,N as JudgmentApiClient,S as JudgmentAPIError,E as JUDGMENT_ORG_ID,dt as JUDGMENT_NO_COLOR,pt as JUDGMENT_ENABLE_MONITORING,Et as JUDGMENT_ENABLE_EVALUATIONS,I as JUDGMENT_DEFAULT_GPT_MODEL,m as JUDGMENT_API_URL,p as JUDGMENT_API_KEY,X as ExampleParams,x as BrowserTracer,R as BasePromptScorer,J as APIScorerType};
3
+
4
+ //# debugId=6A697B7F3936AB8164756E2164756E21
5
+ //# sourceMappingURL=index.mjs.map
@@ -1 +1,30 @@
1
- {"version":3,"file":"index.mjs","mappings":"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","sources":["webpack://judgeval/./src/tracer/exporters/JudgmentSpanExporter.ts","webpack://judgeval/./src/tracer/exporters/NoOpSpanExporter.ts","webpack://judgeval/./src/tracer/OpenTelemetryKeys.ts","webpack://judgeval/./src/env.ts","webpack://judgeval/./src/internal/api/index.ts","webpack://judgeval/./src/utils/annotate.ts","webpack://judgeval/./src/utils/logger.ts","webpack://judgeval/./src/tracer/Tracer.ts","webpack://judgeval/./src/constants.ts","webpack://judgeval/./src/tracer/TracerConfiguration.ts","webpack://judgeval/./src/data/example.ts","webpack://judgeval/./src/data/example-params.ts","webpack://judgeval/./src/scorers/api-scorer.ts","webpack://judgeval/./src/scorers/base-scorer.ts","webpack://judgeval/./src/scorers/api_scorers/prompt_scorer/prompt-scorer-utils.ts","webpack://judgeval/./src/scorers/api_scorers/prompt_scorer/base-prompt-scorer.ts","webpack://judgeval/./src/scorers/api_scorers/prompt_scorer/prompt-scorer.ts","webpack://judgeval/./src/scorers/api_scorers/prompt_scorer/trace-prompt-scorer.ts","webpack://judgeval/./src/version.ts","webpack://judgeval/./src/tracer/BrowserTracer.ts","webpack://judgeval/./src/tracer/NodeTracer.ts"],"sourcesContent":["import { ExportResult } from \"@opentelemetry/core\";\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\";\nimport { ReadableSpan, SpanExporter } from \"@opentelemetry/sdk-trace-base\";\n\n/**\n * SpanExporter implementation that sends spans to Judgment Labs with project identification.\n *\n * This exporter wraps the OTLP HTTP exporter and adds Judgment Labs specific headers and project\n * identification to all exported spans.\n */\nexport class JudgmentSpanExporter implements SpanExporter {\n private readonly delegate: SpanExporter;\n\n /**\n * Creates a new JudgmentSpanExporter with the specified configuration.\n *\n * @param endpoint the OTLP endpoint URL\n * @param apiKey the API key for authentication\n * @param organizationId the organization ID\n * @param projectId the project ID (must not be null or empty)\n * @throws Error if projectId is null or empty\n */\n constructor(\n endpoint: string,\n apiKey: string,\n organizationId: string,\n projectId: string,\n ) {\n if (!projectId || projectId.trim() === \"\") {\n throw new Error(\"projectId is required for JudgmentSpanExporter\");\n }\n\n this.delegate = new OTLPTraceExporter({\n url: endpoint,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"X-Organization-Id\": organizationId,\n \"X-Project-Id\": projectId,\n },\n });\n }\n\n /**\n * Creates a new builder for constructing JudgmentSpanExporter instances.\n */\n public static builder(): JudgmentSpanExporterBuilder {\n return new JudgmentSpanExporterBuilder();\n }\n\n /**\n * Exports a collection of spans.\n */\n export(\n spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n this.delegate.export(spans, resultCallback);\n }\n\n /**\n * Shuts down the exporter.\n */\n shutdown(): Promise<void> {\n return this.delegate.shutdown();\n }\n\n /**\n * Forces the exporter to flush any pending spans.\n */\n forceFlush(): Promise<void> {\n return this.delegate.forceFlush?.() ?? Promise.resolve();\n }\n}\n\n/**\n * Builder for creating JudgmentSpanExporter instances.\n */\nexport class JudgmentSpanExporterBuilder {\n private _endpoint?: string;\n private _apiKey?: string;\n private _organizationId?: string;\n private _projectId?: string;\n\n constructor() {}\n\n /**\n * Sets the OTLP endpoint URL.\n *\n * @param endpoint the endpoint URL\n * @return this builder for method chaining\n */\n public endpoint(endpoint: string): this {\n this._endpoint = endpoint;\n return this;\n }\n\n /**\n * Sets the API key for authentication.\n *\n * @param apiKey the API key\n * @return this builder for method chaining\n */\n public apiKey(apiKey: string): this {\n this._apiKey = apiKey;\n return this;\n }\n\n /**\n * Sets the organization ID.\n *\n * @param organizationId the organization ID\n * @return this builder for method chaining\n */\n public organizationId(organizationId: string): this {\n this._organizationId = organizationId;\n return this;\n }\n\n /**\n * Sets the project ID.\n *\n * @param projectId the project ID\n * @return this builder for method chaining\n */\n public projectId(projectId: string): this {\n this._projectId = projectId;\n return this;\n }\n\n /**\n * Builds a new JudgmentSpanExporter with the current configuration.\n *\n * @return a new JudgmentSpanExporter instance\n * @throws Error if required fields are missing\n */\n public build(): JudgmentSpanExporter {\n if (!this._endpoint || this._endpoint.trim() === \"\") {\n throw new Error(\"Endpoint is required\");\n }\n if (!this._apiKey || this._apiKey.trim() === \"\") {\n throw new Error(\"API key is required\");\n }\n if (!this._organizationId || this._organizationId.trim() === \"\") {\n throw new Error(\"Organization ID is required\");\n }\n if (!this._projectId || this._projectId.trim() === \"\") {\n throw new Error(\"Project ID is required\");\n }\n\n return new JudgmentSpanExporter(\n this._endpoint,\n this._apiKey,\n this._organizationId,\n this._projectId,\n );\n }\n}\n","import { ExportResult } from \"@opentelemetry/core\";\nimport { ReadableSpan, SpanExporter } from \"@opentelemetry/sdk-trace-base\";\n\n/**\n * A no-op span exporter that does nothing.\n * Used when project resolution fails or tracing is disabled.\n */\nexport class NoOpSpanExporter implements SpanExporter {\n export(\n spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n resultCallback({ code: 0 });\n }\n\n flush(): Promise<void> {\n return Promise.resolve();\n }\n\n shutdown(): Promise<void> {\n return Promise.resolve();\n }\n}\n","export abstract class OpenTelemetryKeys {\n public static readonly AttributeKeys = {\n JUDGMENT_SPAN_KIND: \"judgment.span_kind\",\n JUDGMENT_INPUT: \"judgment.input\",\n JUDGMENT_OUTPUT: \"judgment.output\",\n JUDGMENT_OFFLINE_MODE: \"judgment.offline_mode\",\n JUDGMENT_UPDATE_ID: \"judgment.update_id\",\n\n JUDGMENT_CUSTOMER_ID: \"judgment.customer_id\",\n\n JUDGMENT_AGENT_ID: \"judgment.agent_id\",\n\n JUDGMENT_PARENT_AGENT_ID: \"judgment.parent_agent_id\",\n JUDGMENT_AGENT_CLASS_NAME: \"judgment.agent_class_name\",\n JUDGMENT_AGENT_INSTANCE_NAME: \"judgment.agent_instance_name\",\n\n PENDING_TRACE_EVAL: \"judgment.pending_trace_eval\",\n\n GEN_AI_PROMPT: \"gen_ai.prompt\",\n GEN_AI_COMPLETION: \"gen_ai.completion\",\n GEN_AI_REQUEST_MODEL: \"gen_ai.request.model\",\n GEN_AI_RESPONSE_MODEL: \"gen_ai.response.model\",\n GEN_AI_SYSTEM: \"gen_ai.system\",\n GEN_AI_USAGE_INPUT_TOKENS: \"gen_ai.usage.input_tokens\",\n GEN_AI_USAGE_OUTPUT_TOKENS: \"gen_ai.usage.output_tokens\",\n GEN_AI_USAGE_COMPLETION_TOKENS: \"gen_ai.usage.completion_tokens\",\n GEN_AI_REQUEST_TEMPERATURE: \"gen_ai.request.temperature\",\n GEN_AI_REQUEST_MAX_TOKENS: \"gen_ai.request.max_tokens\",\n GEN_AI_RESPONSE_FINISH_REASONS: \"gen_ai.response.finish_reasons\",\n\n GEN_AI_USAGE_TOTAL_COST: \"gen_ai.usage.total_cost_usd\",\n } as const;\n\n public static readonly InternalAttributeKeys = {\n DISABLE_PARTIAL_EMIT: \"disable_partial_emit\",\n CANCELLED: \"cancelled\",\n } as const;\n\n public static readonly ResourceKeys = {\n SERVICE_NAME: \"service.name\",\n TELEMETRY_SDK_LANGUAGE: \"telemetry.sdk.language\",\n TELEMETRY_SDK_NAME: \"telemetry.sdk.name\",\n TELEMETRY_SDK_VERSION: \"telemetry.sdk.version\",\n JUDGMENT_PROJECT_ID: \"judgment.project_id\",\n } as const;\n}\n","function getEnvVar(varName: string): string | null;\nfunction getEnvVar(varName: string, defaultValue: string): string;\nfunction getEnvVar(varName: string, defaultValue?: string): string | null {\n const value = process.env[varName];\n if (!value) {\n return defaultValue ?? null;\n }\n return value;\n}\n\nexport const JUDGMENT_API_KEY = getEnvVar(\"JUDGMENT_API_KEY\");\nexport const JUDGMENT_ORG_ID = getEnvVar(\"JUDGMENT_ORG_ID\");\nexport const JUDGMENT_API_URL = getEnvVar(\n \"JUDGMENT_API_URL\",\n \"https://api.judgmentlabs.ai\",\n);\nexport const JUDGMENT_DEFAULT_GPT_MODEL = getEnvVar(\n \"JUDGMENT_DEFAULT_GPT_MODEL\",\n \"gpt-4.1\",\n);\nexport const JUDGMENT_ENABLE_MONITORING = getEnvVar(\n \"JUDGMENT_ENABLE_MONITORING\",\n \"true\",\n);\nexport const JUDGMENT_ENABLE_EVALUATIONS = getEnvVar(\n \"JUDGMENT_ENABLE_EVALUATIONS\",\n \"true\",\n);\nexport const JUDGMENT_NO_COLOR = getEnvVar(\"JUDGMENT_NO_COLOR\");\n","/**\n * Auto-generated by scripts/generate-client.ts\n * DO NOT EDIT MANUALLY - This file is generated automatically\n */\nimport * as Models from \"./models\";\n\nexport class JudgmentApiClient {\n private baseUrl: string;\n private apiKey: string;\n private organizationId: string;\n\n constructor(baseUrl: string, apiKey: string, organizationId: string) {\n this.baseUrl = baseUrl;\n this.apiKey = apiKey;\n this.organizationId = organizationId;\n }\n\n private buildUrl(path: string): string {\n return this.baseUrl + path;\n }\n\n private buildHeaders(): Record<string, string> {\n if (!this.apiKey || !this.organizationId) {\n throw new Error(\"API key and organization ID cannot be null\");\n }\n return {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n \"X-Organization-Id\": this.organizationId,\n };\n }\n\n async addToRunEvalQueueExamples(\n payload: Models.ExampleEvaluationRun,\n ): Promise<void> {\n const url = this.buildUrl(\"/add_to_run_eval_queue/examples\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async addToRunEvalQueueTraces(\n payload: Models.TraceEvaluationRun,\n ): Promise<void> {\n const url = this.buildUrl(\"/add_to_run_eval_queue/traces\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async logEvalResults(payload: Models.EvalResults): Promise<void> {\n const url = this.buildUrl(\"/log_eval_results/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async fetchExperimentRun(payload: Models.EvalResultsFetch): Promise<void> {\n const url = this.buildUrl(\"/fetch_experiment_run/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async getEvaluationStatus(\n experiment_run_id: string,\n project_name: string,\n ): Promise<void> {\n const queryParams = new URLSearchParams();\n queryParams.set(\"experiment_run_id\", experiment_run_id);\n queryParams.set(\"project_name\", project_name);\n const url = this.buildUrl(\n \"/get_evaluation_status/\" +\n (queryParams.toString() ? \"?\" + queryParams.toString() : \"\"),\n );\n const response = await fetch(url, {\n method: \"GET\",\n headers: this.buildHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async scorerExists(\n payload: Models.ScorerExistsRequest,\n ): Promise<Models.ScorerExistsResponse> {\n const url = this.buildUrl(\"/scorer_exists/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return (await response.json()) as Models.ScorerExistsResponse;\n }\n\n async saveScorer(\n payload: Models.SavePromptScorerRequest,\n ): Promise<Models.SavePromptScorerResponse> {\n const url = this.buildUrl(\"/save_scorer/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return (await response.json()) as Models.SavePromptScorerResponse;\n }\n\n async fetchScorers(\n payload: Models.FetchPromptScorersRequest,\n ): Promise<Models.FetchPromptScorersResponse> {\n const url = this.buildUrl(\"/fetch_scorers/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return (await response.json()) as Models.FetchPromptScorersResponse;\n }\n\n async projectsResolve(\n payload: Models.ResolveProjectNameRequest,\n ): Promise<Models.ResolveProjectNameResponse> {\n const url = this.buildUrl(\"/projects/resolve/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return (await response.json()) as Models.ResolveProjectNameResponse;\n }\n}\n","// Adopted from https://github.com/angular/angular.js/blob/master/src/auto/injector.js\n\nconst ARROW_ARG = /^([^(]+?)=>/;\nconst FN_ARGS = /^[^(]*\\(\\s*([^)]*)\\)/m;\nconst FN_ARG_SPLIT = /,/;\nconst FN_ARG = /^\\s*(_?)(\\S+?)\\1\\s*$/;\nconst STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;\n\nfunction stringifyFn(fn: Function): string {\n return Function.prototype.toString.call(fn);\n}\n\nfunction extractArgs(fn: Function): RegExpMatchArray | null {\n const fnText = stringifyFn(fn).replace(STRIP_COMMENTS, \"\");\n return fnText.match(ARROW_ARG) || fnText.match(FN_ARGS);\n}\n\nexport function parseFunctionArgs(fn: Function): string[] {\n const args = extractArgs(fn);\n if (!args || !args[1]) {\n return [];\n }\n\n return args[1]\n .split(FN_ARG_SPLIT)\n .map((arg) => {\n const match = arg.replace(FN_ARG, (all, underscore, name) => name);\n return match.trim();\n })\n .filter((name) => name.length > 0);\n}\n","export class Logger {\n private static readonly RESET = \"\\x1b[0m\";\n private static readonly RED = \"\\x1b[31m\";\n private static readonly YELLOW = \"\\x1b[33m\";\n private static readonly GRAY = \"\\x1b[90m\";\n\n public static Level = {\n DEBUG: 0,\n INFO: 1,\n WARNING: 2,\n ERROR: 3,\n CRITICAL: 4,\n } as const;\n\n private static initialized = false;\n private static currentLevel: number = Logger.Level.INFO;\n private static useColor = true;\n\n private static initialize(): void {\n if (!Logger.initialized) {\n const noColor = process.env.JUDGMENT_NO_COLOR;\n Logger.useColor = !noColor && process.stdout.isTTY;\n Logger.initialized = true;\n }\n }\n\n public static setLevel(level: number): void {\n Logger.currentLevel = level;\n }\n\n public static setUseColor(useColor: boolean): void {\n Logger.useColor = useColor;\n }\n\n private static log(level: number, message: string): void {\n Logger.initialize();\n\n if (level < Logger.currentLevel) {\n return;\n }\n\n const timestamp = new Date()\n .toISOString()\n .replace(\"T\", \" \")\n .substring(0, 19);\n const levelName =\n Object.keys(Logger.Level).find(\n (key) => Logger.Level[key as keyof typeof Logger.Level] === level,\n ) || \"UNKNOWN\";\n let formattedMessage = `${timestamp} - judgeval - ${levelName} - ${message}`;\n\n if (Logger.useColor) {\n const color =\n level === Logger.Level.DEBUG || level === Logger.Level.INFO\n ? Logger.GRAY\n : level === Logger.Level.WARNING\n ? Logger.YELLOW\n : Logger.RED;\n formattedMessage = `${color}${formattedMessage}${Logger.RESET}`;\n }\n\n const output =\n level >= Logger.Level.ERROR ? process.stderr : process.stdout;\n output.write(formattedMessage + \"\\n\");\n }\n\n public static debug(message: string): void {\n Logger.log(Logger.Level.DEBUG, message);\n }\n\n public static info(message: string): void {\n Logger.log(Logger.Level.INFO, message);\n }\n\n public static warning(message: string): void {\n Logger.log(Logger.Level.WARNING, message);\n }\n\n public static warn(message: string): void {\n Logger.log(Logger.Level.WARNING, message);\n }\n\n public static error(message: string): void {\n Logger.log(Logger.Level.ERROR, message);\n }\n\n public static critical(message: string): void {\n Logger.log(Logger.Level.CRITICAL, message);\n }\n}\n","import {\n context,\n SpanKind as OpenTelemetrySpanKind,\n trace,\n} from \"@opentelemetry/api\";\nimport { JUDGMENT_API_URL, JUDGMENT_DEFAULT_GPT_MODEL } from \"../env\";\nimport { JudgmentApiClient } from \"../internal/api\";\nimport {\n ExampleEvaluationRun,\n Example as ExampleModel,\n} from \"../internal/api/models\";\nimport { BaseScorer } from \"../scorers/base-scorer\";\nimport { parseFunctionArgs } from \"../utils/annotate\";\nimport { Logger } from \"../utils/logger\";\nimport { JudgmentSpanExporter, NoOpSpanExporter } from \"./exporters\";\nimport { OpenTelemetryKeys } from \"./OpenTelemetryKeys\";\nimport { TracerConfiguration } from \"./TracerConfiguration\";\n\nexport type Serializer = (obj: unknown) => string;\ntype SpanKind = (\"llm\" | \"tool\" | \"span\") & {};\n\nexport type TracerInitializeOptions = {\n resourceAttributes?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\nexport abstract class Tracer {\n protected static instances: Map<string, Tracer> = new Map();\n\n public apiClient: JudgmentApiClient;\n public tracer: unknown = null;\n public serializer: Serializer = JSON.stringify;\n\n protected _initialized: boolean = false;\n\n private projectId: string | null = null;\n protected configuration: TracerConfiguration;\n\n public getConfiguration(): TracerConfiguration {\n return this.configuration;\n }\n\n public getProjectId(): string | null {\n return this.projectId;\n }\n\n public getSerializer(): Serializer {\n return this.serializer;\n }\n\n public constructor(configuration: TracerConfiguration) {\n this.configuration = configuration;\n\n this.apiClient = new JudgmentApiClient(\n this.configuration.apiUrl,\n this.configuration.apiKey,\n this.configuration.organizationId,\n );\n\n this._initialized = false;\n }\n\n public abstract initialize(options: TracerInitializeOptions): Promise<Tracer>;\n\n private async resolveProjectId(): Promise<string> {\n try {\n Logger.info(\n `Resolving project ID for project: ${this.configuration.projectName}`,\n );\n\n const response = await this.apiClient.projectsResolve({\n project_name: this.configuration.projectName,\n });\n Logger.info(`Resolved project ID: ${response.project_id}`);\n const resolvedProjectId = response.project_id?.toString();\n\n if (!resolvedProjectId) {\n throw new Error(\n `Project ID not found for project: ${this.configuration.projectName}`,\n );\n }\n\n this.projectId = resolvedProjectId;\n Logger.info(`Successfully resolved project ID: ${this.projectId}`);\n\n return this.projectId;\n } catch (error) {\n throw new Error(\n `Failed to resolve project ID: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n public static getExporter(\n apiKey: string,\n organizationId: string,\n projectId: string,\n ): JudgmentSpanExporter {\n const endpoint = JUDGMENT_API_URL?.endsWith(\"/\")\n ? `${JUDGMENT_API_URL}otel/v1/traces`\n : `${JUDGMENT_API_URL}/otel/v1/traces`;\n\n return JudgmentSpanExporter.builder()\n .endpoint(endpoint)\n .apiKey(apiKey)\n .organizationId(organizationId)\n .projectId(projectId)\n .build();\n }\n\n public async getSpanExporter(): Promise<\n JudgmentSpanExporter | NoOpSpanExporter\n > {\n try {\n const projectId = await this.resolveProjectId();\n return this.createJudgmentSpanExporter(projectId);\n } catch (error) {\n Logger.error(\n \"Failed to resolve project \" +\n this.configuration.projectName +\n \", please create it first at https://app.judgmentlabs.ai/org/\" +\n (this.configuration.organizationId || \"unknown\") +\n \"/projects. Skipping Judgment export.\",\n );\n return new NoOpSpanExporter();\n }\n }\n\n public setSpanKind(kind: SpanKind): void {\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping setSpanKind\");\n return;\n }\n if (kind !== null) {\n currentSpan.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_SPAN_KIND,\n kind,\n );\n }\n }\n\n public setAttribute(key: string, value: unknown): void {\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping setAttribute\");\n return;\n }\n currentSpan.setAttribute(key, this.serializer(value));\n }\n\n public setLLMSpan(): void {\n this.setSpanKind(\"llm\");\n }\n\n public setToolSpan(): void {\n this.setSpanKind(\"tool\");\n }\n\n public setGeneralSpan(): void {\n this.setSpanKind(\"span\");\n }\n\n public setAttributes(attributes: Record<string, unknown>): void {\n if (!attributes) {\n return;\n }\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping setAttributes\");\n return;\n }\n for (const [key, value] of Object.entries(attributes)) {\n currentSpan.setAttribute(key, this.serializer(value));\n }\n }\n\n public setInput(input: unknown): void {\n this.setAttribute(OpenTelemetryKeys.AttributeKeys.JUDGMENT_INPUT, input);\n }\n\n public setOutput(output: unknown): void {\n this.setAttribute(OpenTelemetryKeys.AttributeKeys.JUDGMENT_OUTPUT, output);\n }\n\n public asyncEvaluate(\n scorer: BaseScorer,\n example: ExampleModel,\n model?: string,\n ): void {\n if (!this._initialized) {\n Logger.warn(\"Tracer not initialized, skipping asyncEvaluate\");\n return;\n }\n\n if (!this.configuration.enableEvaluation) {\n return;\n }\n\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping asyncEvaluate\");\n return;\n }\n if (!currentSpan.isRecording()) {\n Logger.warn(\"Active span is not recording, skipping asyncEvaluate\");\n return;\n }\n\n const spanContext = currentSpan.spanContext();\n const traceId = spanContext.traceId;\n const spanId = spanContext.spanId;\n\n Logger.info(\n `asyncEvaluate: project=${this.configuration.projectName}, traceId=${traceId}, spanId=${spanId}, scorer=${scorer.name}`,\n );\n\n const evaluationRun = this.createEvaluationRun(\n scorer,\n example,\n model,\n traceId,\n spanId,\n );\n this.enqueueEvaluation(evaluationRun);\n }\n\n public asyncTraceEvaluate(scorer: BaseScorer, model?: string): void {\n if (!this._initialized) {\n Logger.warn(\"Tracer not initialized, skipping asyncTraceEvaluate\");\n return;\n }\n\n if (!this.configuration.enableEvaluation) {\n return;\n }\n\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping asyncTraceEvaluate\");\n return;\n }\n if (!currentSpan.isRecording()) {\n Logger.warn(\"Active span is not recording, skipping asyncTraceEvaluate\");\n return;\n }\n\n const spanContext = currentSpan.spanContext();\n const traceId = spanContext.traceId;\n const spanId = spanContext.spanId;\n\n Logger.info(\n `asyncTraceEvaluate: project=${this.configuration.projectName}, traceId=${traceId}, spanId=${spanId}, scorer=${scorer.name}`,\n );\n\n try {\n const traceEvaluationRun = this.createTraceEvaluationRun(\n scorer,\n model,\n traceId,\n spanId,\n );\n const traceEvalJson = this.serializer(traceEvaluationRun);\n currentSpan.setAttribute(\n OpenTelemetryKeys.AttributeKeys.PENDING_TRACE_EVAL,\n traceEvalJson,\n );\n } catch (error) {\n Logger.error(\n `Failed to serialize trace evaluation: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n private createTraceEvaluationRun(\n scorer: BaseScorer,\n model: string | undefined,\n traceId: string,\n spanId: string,\n ): Record<string, unknown> {\n const evalName = `async_trace_evaluate_${spanId || Date.now()}`;\n const modelName = model || JUDGMENT_DEFAULT_GPT_MODEL;\n\n const scorerConfig = scorer.getScorerConfig();\n\n return {\n project_name: this.configuration.projectName,\n eval_name: evalName,\n scorer: scorerConfig,\n model: modelName,\n organization_id: this.configuration.organizationId,\n trace_id: traceId,\n trace_span_id: spanId,\n };\n }\n\n private createJudgmentSpanExporter(projectId: string): JudgmentSpanExporter {\n const endpoint = this.configuration.apiUrl.endsWith(\"/\")\n ? `${this.configuration.apiUrl}otel/v1/traces`\n : `${this.configuration.apiUrl}/otel/v1/traces`;\n\n return JudgmentSpanExporter.builder()\n .endpoint(endpoint)\n .apiKey(this.configuration.apiKey)\n .organizationId(this.configuration.organizationId)\n .projectId(projectId)\n .build();\n }\n\n private createEvaluationRun(\n scorer: BaseScorer,\n example: ExampleModel,\n model: string | undefined,\n traceId: string,\n spanId: string,\n ): ExampleEvaluationRun {\n const runId = `async_evaluate_${spanId || Date.now()}`;\n const modelName = model || JUDGMENT_DEFAULT_GPT_MODEL;\n\n const scorerConfig = scorer.getScorerConfig();\n\n const evaluationRun: ExampleEvaluationRun = {\n project_name: this.configuration.projectName,\n eval_name: runId,\n examples: [example],\n custom_scorers: [],\n judgment_scorers: [scorerConfig],\n model: modelName,\n trace_id: traceId,\n trace_span_id: spanId,\n };\n\n return evaluationRun;\n }\n\n private async enqueueEvaluation(\n evaluationRun: ExampleEvaluationRun,\n ): Promise<void> {\n if (!this.apiClient) {\n Logger.warn(\"API client not available, skipping evaluation enqueue\");\n return;\n }\n\n try {\n await this.apiClient.addToRunEvalQueueExamples(evaluationRun);\n Logger.info(`Enqueuing evaluation run: ${evaluationRun.eval_name}`);\n } catch (error) {\n Logger.error(\n `Failed to enqueue evaluation run: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n public observe<TArgs extends any[], TResult>(\n func: (...args: TArgs) => TResult,\n spanKind: SpanKind = \"span\",\n ): (...args: TArgs) => TResult {\n return (...args: TArgs) => {\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping observe\");\n return func(...args);\n }\n\n const spanName = func.name || \"anonymous\";\n const tracer = trace.getTracer(this.configuration.tracerName);\n\n return context.with(trace.setSpan(context.active(), currentSpan), () => {\n return tracer.startActiveSpan(\n spanName,\n { kind: OpenTelemetrySpanKind.INTERNAL },\n (span) => {\n try {\n span.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_SPAN_KIND,\n spanKind,\n );\n\n const argNames = parseFunctionArgs(func);\n if (argNames.length === args.length) {\n const inputObj: Record<string, unknown> = {};\n argNames.forEach((name, index) => {\n inputObj[name] = args[index];\n });\n span.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_INPUT,\n this.serializer(inputObj),\n );\n }\n\n const result = func(...args);\n\n if (result instanceof Promise) {\n return result\n .then((res) => {\n span.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_OUTPUT,\n this.serializer(res),\n );\n span.end();\n return res;\n })\n .catch((err) => {\n span.recordException(err as Error);\n span.end();\n throw err;\n }) as TResult;\n } else {\n span.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_OUTPUT,\n this.serializer(result),\n );\n span.end();\n return result;\n }\n } catch (err) {\n span.recordException(err as Error);\n span.end();\n throw err;\n }\n },\n );\n });\n };\n }\n\n public async shutdown(): Promise<void> {}\n}\n","export const JUDGEVAL_TRACER_INSTRUMENTING_MODULE_NAME =\n \"opentelemetry.instrumentation.judgeval\" as const;\n","import { JUDGEVAL_TRACER_INSTRUMENTING_MODULE_NAME } from \"../constants\";\nimport { JUDGMENT_API_KEY, JUDGMENT_API_URL, JUDGMENT_ORG_ID } from \"../env\";\n\n/**\n * Configuration for the Judgment Tracer that controls how tracing and evaluation behave.\n *\n * This class encapsulates all configuration parameters needed to initialize a Tracer.\n *\n * @example\n * ```typescript\n * const config = TracerConfiguration.builder()\n * .projectName(\"my-project\")\n * .apiKey(\"your-api-key\")\n * .organizationId(\"your-org-id\")\n * .enableEvaluation(true)\n * .build();\n *\n * const tracer = Tracer.createWithConfiguration(config);\n * ```\n */\nexport class TracerConfiguration {\n constructor(\n public readonly projectName: string,\n public readonly apiKey: string,\n public readonly organizationId: string,\n public readonly apiUrl: string,\n public readonly enableEvaluation: boolean,\n public readonly tracerName: string = JUDGEVAL_TRACER_INSTRUMENTING_MODULE_NAME,\n ) {}\n\n /**\n * Creates a default configuration with the given project name.\n *\n * This method uses default values from environment variables:\n * - API Key: JUDGMENT_API_KEY\n * - Organization ID: JUDGMENT_ORG_ID\n * - API URL: JUDGMENT_API_URL\n * - Evaluation: enabled\n *\n * @param projectName the name of the project\n * @returns a new TracerConfiguration with default values\n * @throws Error if project name is null or empty\n */\n public static createDefault(projectName: string): TracerConfiguration {\n return new TracerConfigurationBuilder().projectName(projectName).build();\n }\n\n public static builder(): TracerConfigurationBuilder {\n return new TracerConfigurationBuilder();\n }\n}\n\n/**\n * Builder for creating TracerConfiguration instances.\n *\n * @example\n * ```typescript\n * const config = TracerConfiguration.builder()\n * .projectName(\"my-project\")\n * .apiKey(\"custom-api-key\")\n * .organizationId(\"custom-org-id\")\n * .apiUrl(\"https://custom-api.judgmentlabs.ai\")\n * .enableEvaluation(false)\n * .build();\n * ```\n */\nexport class TracerConfigurationBuilder {\n private _projectName?: string;\n private _apiKey: string | null = JUDGMENT_API_KEY;\n private _organizationId: string | null = JUDGMENT_ORG_ID;\n private _apiUrl: string = JUDGMENT_API_URL;\n private _enableEvaluation: boolean = true;\n private _tracerName: string = JUDGEVAL_TRACER_INSTRUMENTING_MODULE_NAME;\n\n public projectName(projectName: string): this {\n this._projectName = projectName;\n return this;\n }\n\n public apiKey(apiKey: string): this {\n this._apiKey = apiKey;\n return this;\n }\n\n public organizationId(organizationId: string): this {\n this._organizationId = organizationId;\n return this;\n }\n\n public apiUrl(apiUrl: string): this {\n this._apiUrl = apiUrl;\n return this;\n }\n\n public enableEvaluation(enableEvaluation: boolean): this {\n this._enableEvaluation = enableEvaluation;\n return this;\n }\n\n public tracerName(tracerName: string): this {\n this._tracerName = tracerName;\n return this;\n }\n\n public build(): TracerConfiguration {\n if (!this._projectName) {\n throw new Error(\"Project name is required\");\n }\n\n if (!this._apiKey) {\n throw new Error(\"API key is required\");\n }\n\n if (!this._organizationId) {\n throw new Error(\"Organization ID is required\");\n }\n\n if (!this._apiUrl) {\n throw new Error(\"API URL is required\");\n }\n\n return new TracerConfiguration(\n this._projectName,\n this._apiKey,\n this._organizationId,\n this._apiUrl,\n this._enableEvaluation,\n this._tracerName,\n );\n }\n}\n","import { Example as ExampleModel } from \"../internal/api/models/Example\";\n\nexport type Example<T extends Record<string, any> = Record<string, any>> =\n ExampleModel & T;\n\nexport function createExample<T extends Record<string, any>>(\n properties: T,\n): Example<T> {\n const example: Example<T> = {\n example_id: undefined,\n created_at: new Date().toISOString(),\n name: null,\n ...properties,\n } as Example<T>;\n\n return example;\n}\n","export enum ExampleParams {\n INPUT = \"input\",\n ACTUAL_OUTPUT = \"actual_output\",\n EXPECTED_OUTPUT = \"expected_output\",\n CONTEXT = \"context\",\n RETRIEVAL_CONTEXT = \"retrieval_context\",\n TOOLS_CALLED = \"tools_called\",\n EXPECTED_TOOLS = \"expected_tools\",\n ADDITIONAL_METADATA = \"additional_metadata\",\n}\n\nexport type ExampleParamKeys = keyof typeof ExampleParams;\nexport type ExampleParamValues = `${ExampleParams}`;\n","import { BaseScorer, createBaseScorer } from \"./base-scorer\";\n\nexport enum APIScorerType {\n PROMPT_SCORER = \"Prompt Scorer\",\n TRACE_PROMPT_SCORER = \"Trace Prompt Scorer\",\n FAITHFULNESS = \"Faithfulness\",\n ANSWER_RELEVANCY = \"Answer Relevancy\",\n ANSWER_CORRECTNESS = \"Answer Correctness\",\n INSTRUCTION_ADHERENCE = \"Instruction Adherence\",\n EXECUTION_ORDER = \"Execution Order\",\n TOOL_ORDER = \"Tool Order\",\n CLASSIFIER = \"Classifier\",\n TOOL_DEPENDENCY = \"Tool Dependency\",\n CUSTOM = \"Custom\",\n}\n\nexport type APIScorer<\n T extends APIScorerType = APIScorerType,\n P extends readonly string[] = readonly string[],\n> = BaseScorer & {\n scoreType: T;\n requiredParams: P;\n setThreshold: (threshold: number) => void;\n getScoreType: () => T;\n setRequiredParams: (params: P) => void;\n};\n\nexport function createAPIScorer<\n T extends APIScorerType,\n P extends readonly string[],\n>(scoreType: T, requiredParams: P): APIScorer<T, P> {\n const scorer = createBaseScorer() as APIScorer<T, P>;\n\n scorer.scoreType = scoreType;\n scorer.name = scoreType;\n scorer.score_type = scoreType;\n scorer.requiredParams = requiredParams;\n\n scorer.setThreshold = (threshold: number) => {\n if (threshold < 0 || threshold > 1) {\n throw new Error(`Threshold must be between 0 and 1, got: ${threshold}`);\n }\n scorer.threshold = threshold;\n };\n\n scorer.getScoreType = () => {\n return scorer.scoreType;\n };\n\n scorer.setRequiredParams = (params: P) => {\n scorer.requiredParams = params;\n };\n\n return scorer;\n}\n","import { ScorerConfig } from \"../internal/api/models\";\nimport { BaseScorer as BaseScorerModel } from \"../internal/api/models/BaseScorer\";\n\nexport type BaseScorer = BaseScorerModel & {\n addModel: (model: string) => void;\n successCheck: () => boolean;\n getRequiredParams: () => string[];\n getScorerConfig: () => ScorerConfig;\n};\n\nexport function createBaseScorer(): BaseScorer {\n const scorer: BaseScorer = {\n score_type: \"\",\n class_name: \"\",\n name: \"\",\n addModel: (model: string) => {\n scorer.model = model;\n },\n successCheck: () => {\n if (scorer.error != null) {\n return false;\n }\n if (scorer.score == null) {\n return false;\n }\n const threshold = scorer.threshold ?? 0.5;\n const score = scorer.score;\n return threshold != null && score != null && score >= threshold;\n },\n getRequiredParams: () => {\n return [];\n },\n getScorerConfig: () => {\n return {\n score_type: scorer.score_type,\n name: scorer.name,\n threshold: scorer.threshold ?? 0.5,\n strict_mode: scorer.strict_mode ?? false,\n required_params: [],\n kwargs: {},\n };\n },\n };\n\n scorer.class_name = \"BaseScorer\";\n scorer.name = scorer.class_name;\n if (scorer.strict_mode === true) {\n scorer.threshold = 1.0;\n }\n\n return scorer;\n}\n","import {\n JUDGMENT_API_KEY,\n JUDGMENT_API_URL,\n JUDGMENT_ORG_ID,\n} from \"../../../env\";\nimport { JudgmentApiClient } from \"../../../internal/api\";\n\nexport class JudgmentAPIError extends Error {\n constructor(\n public statusCode: number,\n message: string,\n ) {\n super(message);\n this.name = \"JudgmentAPIError\";\n }\n}\n\nexport async function pushPromptScorer(\n name: string,\n prompt: string,\n threshold: number,\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n isTrace?: boolean,\n): Promise<string> {\n if (!JUDGMENT_API_URL || !judgmentApiKey || !organizationId) {\n throw new Error(\"Missing required API credentials\");\n }\n\n const client = new JudgmentApiClient(\n JUDGMENT_API_URL,\n judgmentApiKey,\n organizationId,\n );\n const response = await client.saveScorer({\n name,\n prompt,\n threshold,\n options,\n is_trace: isTrace,\n });\n return response.name;\n}\n\nexport async function fetchPromptScorer(\n name: string,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n) {\n if (!JUDGMENT_API_URL || !judgmentApiKey || !organizationId) {\n throw new Error(\"Missing required API credentials\");\n }\n\n const client = new JudgmentApiClient(\n JUDGMENT_API_URL,\n judgmentApiKey,\n organizationId,\n );\n const response = await client.fetchScorers({ names: [name] });\n if (response.scorers.length === 0) {\n throw new JudgmentAPIError(404, `Scorer with name ${name} not found`);\n }\n const { created_at, updated_at, ...config } = response.scorers[0];\n return config;\n}\n\nexport async function scorerExists(\n name: string,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n): Promise<boolean> {\n if (!JUDGMENT_API_URL || !judgmentApiKey || !organizationId) {\n throw new Error(\"Missing required API credentials\");\n }\n\n const client = new JudgmentApiClient(\n JUDGMENT_API_URL,\n judgmentApiKey,\n organizationId,\n );\n const response = await client.scorerExists({ name });\n return response.exists;\n}\n","import { JUDGMENT_API_KEY, JUDGMENT_ORG_ID } from \"../../../env\";\nimport { ScorerConfig } from \"../../../internal/api/models\";\nimport { APIScorer, APIScorerType } from \"../../api-scorer\";\nimport {\n fetchPromptScorer,\n JudgmentAPIError,\n pushPromptScorer,\n scorerExists,\n} from \"./prompt-scorer-utils\";\n\nexport abstract class BasePromptScorer\n implements APIScorer<APIScorerType, readonly string[]>\n{\n public scoreType: APIScorerType;\n public name: string;\n public prompt: string;\n public threshold: number;\n public options?: Record<string, number> | null;\n public judgmentApiKey: string;\n public organizationId: string;\n public requiredParams: readonly string[];\n public score_type: string;\n public class_name: string;\n public model?: string;\n public score?: number;\n public error?: string | null;\n public strict_mode?: boolean;\n\n constructor(\n scoreType: APIScorerType,\n name: string,\n prompt: string,\n threshold: number,\n requiredParams: readonly string[],\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ) {\n this.scoreType = scoreType;\n this.name = name;\n this.prompt = prompt;\n this.threshold = threshold;\n this.requiredParams = requiredParams;\n this.options = options;\n this.judgmentApiKey = judgmentApiKey;\n this.organizationId = organizationId;\n this.score_type = scoreType;\n this.class_name = \"BasePromptScorer\";\n this.model = undefined;\n this.score = undefined;\n this.error = null;\n this.strict_mode = false;\n }\n score_breakdown?: Record<string, any> | null | undefined;\n reason?: string | null | undefined;\n using_native_model?: boolean | null | undefined;\n success?: boolean | null | undefined;\n model_client?: any;\n additional_metadata?: Record<string, any> | null | undefined;\n user?: string | null | undefined;\n server_hosted?: boolean | undefined;\n\n static async get<T extends BasePromptScorer>(\n this: new (...args: any[]) => T,\n name: string,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ): Promise<T> {\n const config = await fetchPromptScorer(\n name,\n judgmentApiKey,\n organizationId,\n );\n\n const isTrace = config.is_trace === true;\n const expectedIsTrace =\n this.prototype.scoreType === APIScorerType.TRACE_PROMPT_SCORER;\n\n if (isTrace !== expectedIsTrace) {\n throw new JudgmentAPIError(\n 400,\n `Scorer with name ${name} is not a ${this.name}`,\n );\n }\n\n const scoreType = isTrace\n ? APIScorerType.TRACE_PROMPT_SCORER\n : APIScorerType.PROMPT_SCORER;\n\n return new this(\n scoreType,\n config.name, // Use config.name instead of name parameter\n config.prompt,\n config.threshold,\n [],\n config.options,\n judgmentApiKey,\n organizationId,\n );\n }\n\n static async create<T extends BasePromptScorer>(\n this: new (...args: any[]) => T,\n name: string,\n prompt: string,\n threshold: number = 0.5,\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ): Promise<T> {\n if (await scorerExists(name, judgmentApiKey, organizationId)) {\n throw new JudgmentAPIError(\n 400,\n `Scorer with name ${name} already exists. Either use the existing scorer with the get() method or use a new name.`,\n );\n }\n\n const isTrace =\n this.prototype.scoreType === APIScorerType.TRACE_PROMPT_SCORER;\n const scoreType = isTrace\n ? APIScorerType.TRACE_PROMPT_SCORER\n : APIScorerType.PROMPT_SCORER;\n\n await pushPromptScorer(\n name,\n prompt,\n threshold,\n options,\n judgmentApiKey,\n organizationId,\n isTrace,\n );\n\n return new this(\n scoreType,\n name,\n prompt,\n threshold,\n [],\n options,\n judgmentApiKey,\n organizationId,\n );\n }\n\n async updateThreshold(threshold: number): Promise<void> {\n this.setThreshold(threshold);\n await this.pushPromptScorer();\n }\n\n async setPrompt(prompt: string): Promise<void> {\n this.prompt = prompt;\n await this.pushPromptScorer();\n }\n\n async setOptions(options: Record<string, number> | null): Promise<void> {\n this.options = options;\n await this.pushPromptScorer();\n }\n\n async appendToPrompt(promptAddition: string): Promise<void> {\n this.prompt += promptAddition;\n await this.pushPromptScorer();\n }\n\n getThreshold(): number {\n return this.threshold;\n }\n\n getPrompt(): string {\n return this.prompt;\n }\n\n getOptions(): Record<string, number> | null {\n return this.options ? { ...this.options } : null;\n }\n\n getName(): string {\n return this.name;\n }\n\n getConfig(): Record<string, any> {\n return {\n name: this.name,\n prompt: this.prompt,\n threshold: this.threshold,\n options: this.options,\n } as const;\n }\n\n async pushPromptScorer(): Promise<void> {\n await pushPromptScorer(\n this.name,\n this.prompt,\n this.threshold,\n this.options,\n this.judgmentApiKey,\n this.organizationId,\n );\n }\n\n toString(): string {\n return `${this.constructor.name}(name=${this.name}, prompt=${\n this.prompt\n }, threshold=${this.threshold}, options=${JSON.stringify(this.options)})`;\n }\n\n addModel(model: string): void {\n this.model = model;\n }\n\n successCheck(): boolean {\n if (this.error != null) {\n return false;\n }\n if (this.score == null) {\n return false;\n }\n const threshold = this.threshold ?? 0.5;\n const score = this.score;\n return threshold != null && score != null && score >= threshold;\n }\n\n getRequiredParams(): string[] {\n if (Array.isArray(this.requiredParams)) {\n return [...this.requiredParams];\n }\n return [];\n }\n\n setThreshold(threshold: number): void {\n if (threshold < 0 || threshold > 1) {\n throw new Error(`Threshold must be between 0 and 1, got: ${threshold}`);\n }\n this.threshold = threshold;\n }\n\n getScoreType(): APIScorerType {\n return this.scoreType;\n }\n\n setRequiredParams(params: readonly string[]): void {\n this.requiredParams = params;\n }\n\n getScorerConfig(): ScorerConfig {\n return {\n score_type: this.getScoreType(),\n name: this.getName(),\n threshold: this.getThreshold(),\n strict_mode: this.strict_mode ?? false,\n required_params: this.getRequiredParams(),\n kwargs: {\n prompt: this.getPrompt(),\n ...(this.getOptions() ? { options: this.getOptions() } : {}),\n },\n };\n }\n}\n","import { JUDGMENT_API_KEY, JUDGMENT_ORG_ID } from \"../../../env\";\nimport { APIScorerType } from \"../../api-scorer\";\nimport { BasePromptScorer } from \"./base-prompt-scorer\";\nexport {\n fetchPromptScorer,\n JudgmentAPIError,\n pushPromptScorer,\n scorerExists,\n} from \"./prompt-scorer-utils\";\n\nexport class PromptScorer extends BasePromptScorer {\n constructor(\n scoreType: APIScorerType,\n name: string,\n prompt: string,\n threshold: number,\n requiredParams: readonly string[] = [],\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ) {\n super(\n scoreType,\n name,\n prompt,\n threshold,\n requiredParams,\n options,\n judgmentApiKey,\n organizationId,\n );\n }\n}\n","import { JUDGMENT_API_KEY, JUDGMENT_ORG_ID } from \"../../../env\";\nimport { APIScorerType } from \"../../api-scorer\";\nimport { BasePromptScorer } from \"./base-prompt-scorer\";\n\nexport class TracePromptScorer extends BasePromptScorer {\n constructor(\n scoreType: APIScorerType,\n name: string,\n prompt: string,\n threshold: number,\n requiredParams: readonly string[] = [],\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ) {\n super(\n scoreType,\n name,\n prompt,\n threshold,\n requiredParams,\n options,\n judgmentApiKey,\n organizationId,\n );\n }\n}\n","export const VERSION = \"0.3.1\";\n","import { resourceFromAttributes } from \"@opentelemetry/resources\";\nimport {\n BatchSpanProcessor,\n WebTracerProvider,\n} from \"@opentelemetry/sdk-trace-web\";\nimport { VERSION } from \"../version\";\nimport { OpenTelemetryKeys } from \"./OpenTelemetryKeys\";\nimport { Tracer, TracerInitializeOptions } from \"./Tracer\";\nimport { TracerConfiguration } from \"./TracerConfiguration\";\n\nexport type BrowserTracerInitializeOptions = TracerInitializeOptions & {};\n\nexport class BrowserTracer extends Tracer {\n private webTracerProvider?: WebTracerProvider;\n\n public async initialize(\n options: BrowserTracerInitializeOptions = {},\n ): Promise<BrowserTracer> {\n if (this._initialized) {\n return this;\n }\n\n try {\n const resourceAttributes = {\n [OpenTelemetryKeys.ResourceKeys.SERVICE_NAME]:\n this.configuration.projectName,\n [OpenTelemetryKeys.ResourceKeys.TELEMETRY_SDK_VERSION]: VERSION,\n ...options.resourceAttributes,\n };\n\n const spanExporter = await this.getSpanExporter();\n\n this.webTracerProvider = new WebTracerProvider({\n resource: resourceFromAttributes(resourceAttributes),\n spanProcessors: [new BatchSpanProcessor(spanExporter)],\n });\n\n this.webTracerProvider.register();\n\n this._initialized = true;\n return this;\n } catch (error) {\n throw new Error(\n `Failed to initialize browser tracer: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n public static getInstance(configuration: TracerConfiguration): BrowserTracer {\n const key = `BrowserTracer:${configuration.projectName}`;\n if (!Tracer.instances.has(key)) {\n Tracer.instances.set(key, new BrowserTracer(configuration));\n }\n return Tracer.instances.get(key) as BrowserTracer;\n }\n\n public static createDefault(projectName: string): BrowserTracer {\n const configuration = TracerConfiguration.builder()\n .projectName(projectName)\n .build();\n return BrowserTracer.getInstance(configuration);\n }\n\n public static createWithConfiguration(\n configuration: TracerConfiguration,\n ): BrowserTracer {\n return new BrowserTracer(configuration);\n }\n}\n","import { resourceFromAttributes } from \"@opentelemetry/resources\";\nimport { NodeSDK, NodeSDKConfiguration } from \"@opentelemetry/sdk-node\";\nimport { BatchSpanProcessor } from \"@opentelemetry/sdk-trace-node\";\nimport { VERSION } from \"../version\";\nimport { OpenTelemetryKeys } from \"./OpenTelemetryKeys\";\nimport { Tracer, TracerInitializeOptions } from \"./Tracer\";\nimport { TracerConfiguration } from \"./TracerConfiguration\";\n\nexport type NodeTracerInitializeOptions = TracerInitializeOptions & {\n instrumentations?: NodeSDKConfiguration[\"instrumentations\"];\n resourceAttributes?: Record<string, unknown>;\n};\n\nexport class NodeTracer extends Tracer {\n private nodeSDK?: NodeSDK;\n\n public async initialize(\n options: NodeTracerInitializeOptions = {},\n ): Promise<NodeTracer> {\n if (this._initialized) {\n return this;\n }\n\n try {\n const resourceAttributes = {\n [OpenTelemetryKeys.ResourceKeys.SERVICE_NAME]:\n this.configuration.projectName,\n [OpenTelemetryKeys.ResourceKeys.TELEMETRY_SDK_VERSION]: VERSION,\n ...options.resourceAttributes,\n };\n\n const spanExporter = await this.getSpanExporter();\n\n this.nodeSDK = new NodeSDK({\n resource: resourceFromAttributes(resourceAttributes),\n instrumentations: options.instrumentations,\n spanProcessor: new BatchSpanProcessor(spanExporter),\n ...options,\n });\n\n this.nodeSDK.start();\n\n this._initialized = true;\n return this;\n } catch (error) {\n throw new Error(\n `Failed to initialize node tracer: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n public static getInstance(configuration: TracerConfiguration): NodeTracer {\n const key = `NodeTracer:${configuration.projectName}`;\n if (!Tracer.instances.has(key)) {\n Tracer.instances.set(key, new NodeTracer(configuration));\n }\n return Tracer.instances.get(key) as NodeTracer;\n }\n\n public static createDefault(projectName: string): NodeTracer {\n const configuration = TracerConfiguration.builder()\n .projectName(projectName)\n .enableEvaluation(true)\n .build();\n return NodeTracer.getInstance(configuration);\n }\n\n public static createWithConfiguration(\n configuration: TracerConfiguration,\n ): NodeTracer {\n return new NodeTracer(configuration);\n }\n\n public async shutdown(): Promise<void> {\n if (this.nodeSDK) {\n await this.nodeSDK.shutdown();\n }\n }\n}\n"],"names":["JudgmentSpanExporter","constructor","endpoint","apiKey","organizationId","projectId","trim","Error","this","delegate","OTLPTraceExporter","url","headers","Authorization","builder","JudgmentSpanExporterBuilder","spans","resultCallback","export","shutdown","forceFlush","Promise","resolve","_endpoint","_apiKey","_organizationId","_projectId","build","NoOpSpanExporter","code","flush","OpenTelemetryKeys","getEnvVar","varName","defaultValue","process","env","AttributeKeys","JUDGMENT_SPAN_KIND","JUDGMENT_INPUT","JUDGMENT_OUTPUT","JUDGMENT_OFFLINE_MODE","JUDGMENT_UPDATE_ID","JUDGMENT_CUSTOMER_ID","JUDGMENT_AGENT_ID","JUDGMENT_PARENT_AGENT_ID","JUDGMENT_AGENT_CLASS_NAME","JUDGMENT_AGENT_INSTANCE_NAME","PENDING_TRACE_EVAL","GEN_AI_PROMPT","GEN_AI_COMPLETION","GEN_AI_REQUEST_MODEL","GEN_AI_RESPONSE_MODEL","GEN_AI_SYSTEM","GEN_AI_USAGE_INPUT_TOKENS","GEN_AI_USAGE_OUTPUT_TOKENS","GEN_AI_USAGE_COMPLETION_TOKENS","GEN_AI_REQUEST_TEMPERATURE","GEN_AI_REQUEST_MAX_TOKENS","GEN_AI_RESPONSE_FINISH_REASONS","GEN_AI_USAGE_TOTAL_COST","InternalAttributeKeys","DISABLE_PARTIAL_EMIT","CANCELLED","ResourceKeys","SERVICE_NAME","TELEMETRY_SDK_LANGUAGE","TELEMETRY_SDK_NAME","TELEMETRY_SDK_VERSION","JUDGMENT_PROJECT_ID","JUDGMENT_API_KEY","JUDGMENT_ORG_ID","JUDGMENT_API_URL","JUDGMENT_DEFAULT_GPT_MODEL","JUDGMENT_ENABLE_MONITORING","JUDGMENT_ENABLE_EVALUATIONS","JUDGMENT_NO_COLOR","JudgmentApiClient","baseUrl","buildUrl","path","buildHeaders","addToRunEvalQueueExamples","payload","response","fetch","method","body","JSON","stringify","ok","status","text","addToRunEvalQueueTraces","logEvalResults","fetchExperimentRun","getEvaluationStatus","experiment_run_id","project_name","queryParams","URLSearchParams","set","toString","scorerExists","json","saveScorer","fetchScorers","projectsResolve","ARROW_ARG","FN_ARGS","FN_ARG_SPLIT","FN_ARG","STRIP_COMMENTS","parseFunctionArgs","fn","args","fnText","Function","prototype","call","stringifyFn","replace","match","extractArgs","split","map","arg","all","underscore","name","filter","length","Logger","initialize","initialized","noColor","useColor","stdout","isTTY","setLevel","level","currentLevel","setUseColor","log","message","formattedMessage","Date","toISOString","substring","Object","keys","Level","find","key","DEBUG","INFO","GRAY","WARNING","YELLOW","RED","RESET","ERROR","stderr","write","debug","info","warning","warn","error","critical","CRITICAL","Tracer","getConfiguration","configuration","getProjectId","getSerializer","serializer","tracer","_initialized","apiClient","apiUrl","resolveProjectId","projectName","project_id","resolvedProjectId","String","getExporter","endsWith","getSpanExporter","createJudgmentSpanExporter","setSpanKind","kind","currentSpan","trace","getActiveSpan","setAttribute","value","setLLMSpan","setToolSpan","setGeneralSpan","setAttributes","attributes","entries","setInput","input","setOutput","output","asyncEvaluate","scorer","example","model","enableEvaluation","isRecording","spanContext","traceId","spanId","evaluationRun","createEvaluationRun","enqueueEvaluation","asyncTraceEvaluate","traceEvaluationRun","createTraceEvaluationRun","traceEvalJson","evalName","now","modelName","scorerConfig","getScorerConfig","eval_name","organization_id","trace_id","trace_span_id","runId","examples","custom_scorers","judgment_scorers","observe","func","spanKind","spanName","getTracer","tracerName","context","with","setSpan","active","startActiveSpan","INTERNAL","span","argNames","inputObj","forEach","index","result","then","res","end","catch","err","recordException","instances","Map","JUDGEVAL_TRACER_INSTRUMENTING_MODULE_NAME","TracerConfiguration","createDefault","TracerConfigurationBuilder","_apiUrl","_enableEvaluation","_tracerName","_projectName","createExample","properties","example_id","undefined","created_at","ExampleParams","APIScorerType","createBaseScorer","score_type","class_name","addModel","successCheck","score","threshold","getRequiredParams","strict_mode","required_params","kwargs","createAPIScorer","scoreType","requiredParams","setThreshold","getScoreType","setRequiredParams","params","JudgmentAPIError","statusCode","super","async","pushPromptScorer","prompt","options","judgmentApiKey","isTrace","client","is_trace","fetchPromptScorer","names","scorers","updated_at","config","exists","BasePromptScorer","get","TRACE_PROMPT_SCORER","PROMPT_SCORER","create","updateThreshold","setPrompt","setOptions","appendToPrompt","promptAddition","getThreshold","getPrompt","getOptions","getName","getConfig","Array","isArray","PromptScorer","TracePromptScorer","VERSION","BrowserTracer","resourceAttributes","spanExporter","webTracerProvider","WebTracerProvider","resource","resourceFromAttributes","spanProcessors","BatchSpanProcessor","register","getInstance","has","createWithConfiguration","NodeTracer","nodeSDK","NodeSDK","instrumentations","spanProcessor","start"],"sourceRoot":""}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/tracer/exporters/JudgmentSpanExporter.ts", "../src/tracer/exporters/NoOpSpanExporter.ts", "../src/tracer/OpenTelemetryKeys.ts", "../src/tracer/Tracer.ts", "../src/env.ts", "../src/internal/api/index.ts", "../src/utils/annotate.ts", "../src/utils/logger.ts", "../src/constants.ts", "../src/tracer/TracerConfiguration.ts", "../src/data/example.ts", "../src/data/example-params.ts", "../src/scorers/base-scorer.ts", "../src/scorers/api-scorer.ts", "../src/scorers/api_scorers/prompt_scorer/prompt-scorer-utils.ts", "../src/scorers/api_scorers/prompt_scorer/base-prompt-scorer.ts", "../src/scorers/api_scorers/prompt_scorer/prompt-scorer.ts", "../src/scorers/api_scorers/prompt_scorer/trace-prompt-scorer.ts", "../src/tracer/BrowserTracer.ts", "../src/version.ts", "../src/tracer/NodeTracer.ts"],
4
+ "sourcesContent": [
5
+ "import { ExportResult } from \"@opentelemetry/core\";\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\";\nimport { ReadableSpan, SpanExporter } from \"@opentelemetry/sdk-trace-base\";\n\n/**\n * SpanExporter implementation that sends spans to Judgment Labs with project identification.\n *\n * This exporter wraps the OTLP HTTP exporter and adds Judgment Labs specific headers and project\n * identification to all exported spans.\n */\nexport class JudgmentSpanExporter implements SpanExporter {\n private readonly delegate: SpanExporter;\n\n /**\n * Creates a new JudgmentSpanExporter with the specified configuration.\n *\n * @param endpoint the OTLP endpoint URL\n * @param apiKey the API key for authentication\n * @param organizationId the organization ID\n * @param projectId the project ID (must not be null or empty)\n * @throws Error if projectId is null or empty\n */\n constructor(\n endpoint: string,\n apiKey: string,\n organizationId: string,\n projectId: string,\n ) {\n if (!projectId || projectId.trim() === \"\") {\n throw new Error(\"projectId is required for JudgmentSpanExporter\");\n }\n\n this.delegate = new OTLPTraceExporter({\n url: endpoint,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"X-Organization-Id\": organizationId,\n \"X-Project-Id\": projectId,\n },\n });\n }\n\n /**\n * Creates a new builder for constructing JudgmentSpanExporter instances.\n */\n public static builder(): JudgmentSpanExporterBuilder {\n return new JudgmentSpanExporterBuilder();\n }\n\n /**\n * Exports a collection of spans.\n */\n export(\n spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n this.delegate.export(spans, resultCallback);\n }\n\n /**\n * Shuts down the exporter.\n */\n shutdown(): Promise<void> {\n return this.delegate.shutdown();\n }\n\n /**\n * Forces the exporter to flush any pending spans.\n */\n forceFlush(): Promise<void> {\n return this.delegate.forceFlush?.() ?? Promise.resolve();\n }\n}\n\n/**\n * Builder for creating JudgmentSpanExporter instances.\n */\nexport class JudgmentSpanExporterBuilder {\n private _endpoint?: string;\n private _apiKey?: string;\n private _organizationId?: string;\n private _projectId?: string;\n\n constructor() {}\n\n /**\n * Sets the OTLP endpoint URL.\n *\n * @param endpoint the endpoint URL\n * @return this builder for method chaining\n */\n public endpoint(endpoint: string): this {\n this._endpoint = endpoint;\n return this;\n }\n\n /**\n * Sets the API key for authentication.\n *\n * @param apiKey the API key\n * @return this builder for method chaining\n */\n public apiKey(apiKey: string): this {\n this._apiKey = apiKey;\n return this;\n }\n\n /**\n * Sets the organization ID.\n *\n * @param organizationId the organization ID\n * @return this builder for method chaining\n */\n public organizationId(organizationId: string): this {\n this._organizationId = organizationId;\n return this;\n }\n\n /**\n * Sets the project ID.\n *\n * @param projectId the project ID\n * @return this builder for method chaining\n */\n public projectId(projectId: string): this {\n this._projectId = projectId;\n return this;\n }\n\n /**\n * Builds a new JudgmentSpanExporter with the current configuration.\n *\n * @return a new JudgmentSpanExporter instance\n * @throws Error if required fields are missing\n */\n public build(): JudgmentSpanExporter {\n if (!this._endpoint || this._endpoint.trim() === \"\") {\n throw new Error(\"Endpoint is required\");\n }\n if (!this._apiKey || this._apiKey.trim() === \"\") {\n throw new Error(\"API key is required\");\n }\n if (!this._organizationId || this._organizationId.trim() === \"\") {\n throw new Error(\"Organization ID is required\");\n }\n if (!this._projectId || this._projectId.trim() === \"\") {\n throw new Error(\"Project ID is required\");\n }\n\n return new JudgmentSpanExporter(\n this._endpoint,\n this._apiKey,\n this._organizationId,\n this._projectId,\n );\n }\n}\n",
6
+ "import { ExportResult } from \"@opentelemetry/core\";\nimport { ReadableSpan, SpanExporter } from \"@opentelemetry/sdk-trace-base\";\n\n/**\n * A no-op span exporter that does nothing.\n * Used when project resolution fails or tracing is disabled.\n */\nexport class NoOpSpanExporter implements SpanExporter {\n export(\n spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n resultCallback({ code: 0 });\n }\n\n flush(): Promise<void> {\n return Promise.resolve();\n }\n\n shutdown(): Promise<void> {\n return Promise.resolve();\n }\n}\n",
7
+ "export abstract class OpenTelemetryKeys {\n public static readonly AttributeKeys = {\n JUDGMENT_SPAN_KIND: \"judgment.span_kind\",\n JUDGMENT_INPUT: \"judgment.input\",\n JUDGMENT_OUTPUT: \"judgment.output\",\n JUDGMENT_OFFLINE_MODE: \"judgment.offline_mode\",\n JUDGMENT_UPDATE_ID: \"judgment.update_id\",\n\n JUDGMENT_CUSTOMER_ID: \"judgment.customer_id\",\n\n JUDGMENT_AGENT_ID: \"judgment.agent_id\",\n\n JUDGMENT_PARENT_AGENT_ID: \"judgment.parent_agent_id\",\n JUDGMENT_AGENT_CLASS_NAME: \"judgment.agent_class_name\",\n JUDGMENT_AGENT_INSTANCE_NAME: \"judgment.agent_instance_name\",\n\n PENDING_TRACE_EVAL: \"judgment.pending_trace_eval\",\n\n GEN_AI_PROMPT: \"gen_ai.prompt\",\n GEN_AI_COMPLETION: \"gen_ai.completion\",\n GEN_AI_REQUEST_MODEL: \"gen_ai.request.model\",\n GEN_AI_RESPONSE_MODEL: \"gen_ai.response.model\",\n GEN_AI_SYSTEM: \"gen_ai.system\",\n GEN_AI_USAGE_INPUT_TOKENS: \"gen_ai.usage.input_tokens\",\n GEN_AI_USAGE_OUTPUT_TOKENS: \"gen_ai.usage.output_tokens\",\n GEN_AI_USAGE_COMPLETION_TOKENS: \"gen_ai.usage.completion_tokens\",\n GEN_AI_REQUEST_TEMPERATURE: \"gen_ai.request.temperature\",\n GEN_AI_REQUEST_MAX_TOKENS: \"gen_ai.request.max_tokens\",\n GEN_AI_RESPONSE_FINISH_REASONS: \"gen_ai.response.finish_reasons\",\n\n GEN_AI_USAGE_TOTAL_COST: \"gen_ai.usage.total_cost_usd\",\n } as const;\n\n public static readonly InternalAttributeKeys = {\n DISABLE_PARTIAL_EMIT: \"disable_partial_emit\",\n CANCELLED: \"cancelled\",\n } as const;\n\n public static readonly ResourceKeys = {\n SERVICE_NAME: \"service.name\",\n TELEMETRY_SDK_LANGUAGE: \"telemetry.sdk.language\",\n TELEMETRY_SDK_NAME: \"telemetry.sdk.name\",\n TELEMETRY_SDK_VERSION: \"telemetry.sdk.version\",\n JUDGMENT_PROJECT_ID: \"judgment.project_id\",\n } as const;\n}\n",
8
+ "import {\n context,\n SpanKind as OpenTelemetrySpanKind,\n trace,\n} from \"@opentelemetry/api\";\nimport { JUDGMENT_API_URL, JUDGMENT_DEFAULT_GPT_MODEL } from \"../env\";\nimport { JudgmentApiClient } from \"../internal/api\";\nimport {\n ExampleEvaluationRun,\n Example as ExampleModel,\n} from \"../internal/api/models\";\nimport { BaseScorer } from \"../scorers/base-scorer\";\nimport { parseFunctionArgs } from \"../utils/annotate\";\nimport { Logger } from \"../utils/logger\";\nimport { JudgmentSpanExporter, NoOpSpanExporter } from \"./exporters\";\nimport { OpenTelemetryKeys } from \"./OpenTelemetryKeys\";\nimport { TracerConfiguration } from \"./TracerConfiguration\";\n\nexport type Serializer = (obj: unknown) => string;\ntype SpanKind = (\"llm\" | \"tool\" | \"span\") & {};\n\nexport type TracerInitializeOptions = {\n resourceAttributes?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\nexport abstract class Tracer {\n protected static instances: Map<string, Tracer> = new Map();\n\n public apiClient: JudgmentApiClient;\n public tracer: unknown = null;\n public serializer: Serializer = JSON.stringify;\n\n protected _initialized: boolean = false;\n\n private projectId: string | null = null;\n protected configuration: TracerConfiguration;\n\n public getConfiguration(): TracerConfiguration {\n return this.configuration;\n }\n\n public getProjectId(): string | null {\n return this.projectId;\n }\n\n public getSerializer(): Serializer {\n return this.serializer;\n }\n\n public constructor(configuration: TracerConfiguration) {\n this.configuration = configuration;\n\n this.apiClient = new JudgmentApiClient(\n this.configuration.apiUrl,\n this.configuration.apiKey,\n this.configuration.organizationId,\n );\n\n this._initialized = false;\n }\n\n public abstract initialize(options: TracerInitializeOptions): Promise<Tracer>;\n\n private async resolveProjectId(): Promise<string> {\n try {\n Logger.info(\n `Resolving project ID for project: ${this.configuration.projectName}`,\n );\n\n const response = await this.apiClient.projectsResolve({\n project_name: this.configuration.projectName,\n });\n Logger.info(`Resolved project ID: ${response.project_id}`);\n const resolvedProjectId = response.project_id?.toString();\n\n if (!resolvedProjectId) {\n throw new Error(\n `Project ID not found for project: ${this.configuration.projectName}`,\n );\n }\n\n this.projectId = resolvedProjectId;\n Logger.info(`Successfully resolved project ID: ${this.projectId}`);\n\n return this.projectId;\n } catch (error) {\n throw new Error(\n `Failed to resolve project ID: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n public static getExporter(\n apiKey: string,\n organizationId: string,\n projectId: string,\n ): JudgmentSpanExporter {\n const endpoint = JUDGMENT_API_URL?.endsWith(\"/\")\n ? `${JUDGMENT_API_URL}otel/v1/traces`\n : `${JUDGMENT_API_URL}/otel/v1/traces`;\n\n return JudgmentSpanExporter.builder()\n .endpoint(endpoint)\n .apiKey(apiKey)\n .organizationId(organizationId)\n .projectId(projectId)\n .build();\n }\n\n public async getSpanExporter(): Promise<\n JudgmentSpanExporter | NoOpSpanExporter\n > {\n try {\n const projectId = await this.resolveProjectId();\n return this.createJudgmentSpanExporter(projectId);\n } catch (error) {\n Logger.error(\n \"Failed to resolve project \" +\n this.configuration.projectName +\n \", please create it first at https://app.judgmentlabs.ai/org/\" +\n (this.configuration.organizationId || \"unknown\") +\n \"/projects. Skipping Judgment export.\",\n );\n return new NoOpSpanExporter();\n }\n }\n\n public setSpanKind(kind: SpanKind): void {\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping setSpanKind\");\n return;\n }\n if (kind !== null) {\n currentSpan.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_SPAN_KIND,\n kind,\n );\n }\n }\n\n public setAttribute(key: string, value: unknown): void {\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping setAttribute\");\n return;\n }\n currentSpan.setAttribute(key, this.serializer(value));\n }\n\n public setLLMSpan(): void {\n this.setSpanKind(\"llm\");\n }\n\n public setToolSpan(): void {\n this.setSpanKind(\"tool\");\n }\n\n public setGeneralSpan(): void {\n this.setSpanKind(\"span\");\n }\n\n public setAttributes(attributes: Record<string, unknown>): void {\n if (!attributes) {\n return;\n }\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping setAttributes\");\n return;\n }\n for (const [key, value] of Object.entries(attributes)) {\n currentSpan.setAttribute(key, this.serializer(value));\n }\n }\n\n public setInput(input: unknown): void {\n this.setAttribute(OpenTelemetryKeys.AttributeKeys.JUDGMENT_INPUT, input);\n }\n\n public setOutput(output: unknown): void {\n this.setAttribute(OpenTelemetryKeys.AttributeKeys.JUDGMENT_OUTPUT, output);\n }\n\n public asyncEvaluate(\n scorer: BaseScorer,\n example: ExampleModel,\n model?: string,\n ): void {\n if (!this._initialized) {\n Logger.warn(\"Tracer not initialized, skipping asyncEvaluate\");\n return;\n }\n\n if (!this.configuration.enableEvaluation) {\n return;\n }\n\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping asyncEvaluate\");\n return;\n }\n if (!currentSpan.isRecording()) {\n Logger.warn(\"Active span is not recording, skipping asyncEvaluate\");\n return;\n }\n\n const spanContext = currentSpan.spanContext();\n const traceId = spanContext.traceId;\n const spanId = spanContext.spanId;\n\n Logger.info(\n `asyncEvaluate: project=${this.configuration.projectName}, traceId=${traceId}, spanId=${spanId}, scorer=${scorer.name}`,\n );\n\n const evaluationRun = this.createEvaluationRun(\n scorer,\n example,\n model,\n traceId,\n spanId,\n );\n this.enqueueEvaluation(evaluationRun);\n }\n\n public asyncTraceEvaluate(scorer: BaseScorer, model?: string): void {\n if (!this._initialized) {\n Logger.warn(\"Tracer not initialized, skipping asyncTraceEvaluate\");\n return;\n }\n\n if (!this.configuration.enableEvaluation) {\n return;\n }\n\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping asyncTraceEvaluate\");\n return;\n }\n if (!currentSpan.isRecording()) {\n Logger.warn(\"Active span is not recording, skipping asyncTraceEvaluate\");\n return;\n }\n\n const spanContext = currentSpan.spanContext();\n const traceId = spanContext.traceId;\n const spanId = spanContext.spanId;\n\n Logger.info(\n `asyncTraceEvaluate: project=${this.configuration.projectName}, traceId=${traceId}, spanId=${spanId}, scorer=${scorer.name}`,\n );\n\n try {\n const traceEvaluationRun = this.createTraceEvaluationRun(\n scorer,\n model,\n traceId,\n spanId,\n );\n const traceEvalJson = this.serializer(traceEvaluationRun);\n currentSpan.setAttribute(\n OpenTelemetryKeys.AttributeKeys.PENDING_TRACE_EVAL,\n traceEvalJson,\n );\n } catch (error) {\n Logger.error(\n `Failed to serialize trace evaluation: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n private createTraceEvaluationRun(\n scorer: BaseScorer,\n model: string | undefined,\n traceId: string,\n spanId: string,\n ): Record<string, unknown> {\n const evalName = `async_trace_evaluate_${spanId || Date.now()}`;\n const modelName = model || JUDGMENT_DEFAULT_GPT_MODEL;\n\n const scorerConfig = scorer.getScorerConfig();\n\n return {\n project_name: this.configuration.projectName,\n eval_name: evalName,\n scorer: scorerConfig,\n model: modelName,\n organization_id: this.configuration.organizationId,\n trace_id: traceId,\n trace_span_id: spanId,\n };\n }\n\n private createJudgmentSpanExporter(projectId: string): JudgmentSpanExporter {\n const endpoint = this.configuration.apiUrl.endsWith(\"/\")\n ? `${this.configuration.apiUrl}otel/v1/traces`\n : `${this.configuration.apiUrl}/otel/v1/traces`;\n\n return JudgmentSpanExporter.builder()\n .endpoint(endpoint)\n .apiKey(this.configuration.apiKey)\n .organizationId(this.configuration.organizationId)\n .projectId(projectId)\n .build();\n }\n\n private createEvaluationRun(\n scorer: BaseScorer,\n example: ExampleModel,\n model: string | undefined,\n traceId: string,\n spanId: string,\n ): ExampleEvaluationRun {\n const runId = `async_evaluate_${spanId || Date.now()}`;\n const modelName = model || JUDGMENT_DEFAULT_GPT_MODEL;\n\n const scorerConfig = scorer.getScorerConfig();\n\n const evaluationRun: ExampleEvaluationRun = {\n project_name: this.configuration.projectName,\n eval_name: runId,\n examples: [example],\n custom_scorers: [],\n judgment_scorers: [scorerConfig],\n model: modelName,\n trace_id: traceId,\n trace_span_id: spanId,\n };\n\n return evaluationRun;\n }\n\n private async enqueueEvaluation(\n evaluationRun: ExampleEvaluationRun,\n ): Promise<void> {\n if (!this.apiClient) {\n Logger.warn(\"API client not available, skipping evaluation enqueue\");\n return;\n }\n\n try {\n await this.apiClient.addToRunEvalQueueExamples(evaluationRun);\n Logger.info(`Enqueuing evaluation run: ${evaluationRun.eval_name}`);\n } catch (error) {\n Logger.error(\n `Failed to enqueue evaluation run: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n public observe<TArgs extends any[], TResult>(\n func: (...args: TArgs) => TResult,\n spanKind: SpanKind = \"span\",\n ): (...args: TArgs) => TResult {\n return (...args: TArgs) => {\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping observe\");\n return func(...args);\n }\n\n const spanName = func.name || \"anonymous\";\n const tracer = trace.getTracer(this.configuration.tracerName);\n\n return context.with(trace.setSpan(context.active(), currentSpan), () => {\n return tracer.startActiveSpan(\n spanName,\n { kind: OpenTelemetrySpanKind.INTERNAL },\n (span) => {\n try {\n span.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_SPAN_KIND,\n spanKind,\n );\n\n const argNames = parseFunctionArgs(func);\n if (argNames.length === args.length) {\n const inputObj: Record<string, unknown> = {};\n argNames.forEach((name, index) => {\n inputObj[name] = args[index];\n });\n span.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_INPUT,\n this.serializer(inputObj),\n );\n }\n\n const result = func(...args);\n\n if (result instanceof Promise) {\n return result\n .then((res) => {\n span.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_OUTPUT,\n this.serializer(res),\n );\n span.end();\n return res;\n })\n .catch((err) => {\n span.recordException(err as Error);\n span.end();\n throw err;\n }) as TResult;\n } else {\n span.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_OUTPUT,\n this.serializer(result),\n );\n span.end();\n return result;\n }\n } catch (err) {\n span.recordException(err as Error);\n span.end();\n throw err;\n }\n },\n );\n });\n };\n }\n\n public async shutdown(): Promise<void> {}\n}\n",
9
+ "function getEnvVar(varName: string): string | null;\nfunction getEnvVar(varName: string, defaultValue: string): string;\nfunction getEnvVar(varName: string, defaultValue?: string): string | null {\n const value = process.env[varName];\n if (!value) {\n return defaultValue ?? null;\n }\n return value;\n}\n\nexport const JUDGMENT_API_KEY = getEnvVar(\"JUDGMENT_API_KEY\");\nexport const JUDGMENT_ORG_ID = getEnvVar(\"JUDGMENT_ORG_ID\");\nexport const JUDGMENT_API_URL = getEnvVar(\n \"JUDGMENT_API_URL\",\n \"https://api.judgmentlabs.ai\",\n);\nexport const JUDGMENT_DEFAULT_GPT_MODEL = getEnvVar(\n \"JUDGMENT_DEFAULT_GPT_MODEL\",\n \"gpt-4.1\",\n);\nexport const JUDGMENT_ENABLE_MONITORING = getEnvVar(\n \"JUDGMENT_ENABLE_MONITORING\",\n \"true\",\n);\nexport const JUDGMENT_ENABLE_EVALUATIONS = getEnvVar(\n \"JUDGMENT_ENABLE_EVALUATIONS\",\n \"true\",\n);\nexport const JUDGMENT_NO_COLOR = getEnvVar(\"JUDGMENT_NO_COLOR\");\n",
10
+ "/**\n * Auto-generated by scripts/generate-client.ts\n * DO NOT EDIT MANUALLY - This file is generated automatically\n */\nimport * as Models from \"./models\";\n\nexport class JudgmentApiClient {\n private baseUrl: string;\n private apiKey: string;\n private organizationId: string;\n\n constructor(baseUrl: string, apiKey: string, organizationId: string) {\n this.baseUrl = baseUrl;\n this.apiKey = apiKey;\n this.organizationId = organizationId;\n }\n\n private buildUrl(path: string): string {\n return this.baseUrl + path;\n }\n\n private buildHeaders(): Record<string, string> {\n if (!this.apiKey || !this.organizationId) {\n throw new Error(\"API key and organization ID cannot be null\");\n }\n return {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n \"X-Organization-Id\": this.organizationId,\n };\n }\n\n async addToRunEvalQueueExamples(\n payload: Models.ExampleEvaluationRun,\n ): Promise<void> {\n const url = this.buildUrl(\"/add_to_run_eval_queue/examples\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async addToRunEvalQueueTraces(\n payload: Models.TraceEvaluationRun,\n ): Promise<void> {\n const url = this.buildUrl(\"/add_to_run_eval_queue/traces\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async logEvalResults(payload: Models.EvalResults): Promise<void> {\n const url = this.buildUrl(\"/log_eval_results/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async fetchExperimentRun(payload: Models.EvalResultsFetch): Promise<void> {\n const url = this.buildUrl(\"/fetch_experiment_run/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async getEvaluationStatus(\n experiment_run_id: string,\n project_name: string,\n ): Promise<void> {\n const queryParams = new URLSearchParams();\n queryParams.set(\"experiment_run_id\", experiment_run_id);\n queryParams.set(\"project_name\", project_name);\n const url = this.buildUrl(\n \"/get_evaluation_status/\" +\n (queryParams.toString() ? \"?\" + queryParams.toString() : \"\"),\n );\n const response = await fetch(url, {\n method: \"GET\",\n headers: this.buildHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async scorerExists(\n payload: Models.ScorerExistsRequest,\n ): Promise<Models.ScorerExistsResponse> {\n const url = this.buildUrl(\"/scorer_exists/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return (await response.json()) as Models.ScorerExistsResponse;\n }\n\n async saveScorer(\n payload: Models.SavePromptScorerRequest,\n ): Promise<Models.SavePromptScorerResponse> {\n const url = this.buildUrl(\"/save_scorer/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return (await response.json()) as Models.SavePromptScorerResponse;\n }\n\n async fetchScorers(\n payload: Models.FetchPromptScorersRequest,\n ): Promise<Models.FetchPromptScorersResponse> {\n const url = this.buildUrl(\"/fetch_scorers/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return (await response.json()) as Models.FetchPromptScorersResponse;\n }\n\n async projectsResolve(\n payload: Models.ResolveProjectNameRequest,\n ): Promise<Models.ResolveProjectNameResponse> {\n const url = this.buildUrl(\"/projects/resolve/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return (await response.json()) as Models.ResolveProjectNameResponse;\n }\n}\n",
11
+ "// Adopted from https://github.com/angular/angular.js/blob/master/src/auto/injector.js\n\nconst ARROW_ARG = /^([^(]+?)=>/;\nconst FN_ARGS = /^[^(]*\\(\\s*([^)]*)\\)/m;\nconst FN_ARG_SPLIT = /,/;\nconst FN_ARG = /^\\s*(_?)(\\S+?)\\1\\s*$/;\nconst STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;\n\nfunction stringifyFn(fn: Function): string {\n return Function.prototype.toString.call(fn);\n}\n\nfunction extractArgs(fn: Function): RegExpMatchArray | null {\n const fnText = stringifyFn(fn).replace(STRIP_COMMENTS, \"\");\n return fnText.match(ARROW_ARG) || fnText.match(FN_ARGS);\n}\n\nexport function parseFunctionArgs(fn: Function): string[] {\n const args = extractArgs(fn);\n if (!args || !args[1]) {\n return [];\n }\n\n return args[1]\n .split(FN_ARG_SPLIT)\n .map((arg) => {\n const match = arg.replace(FN_ARG, (all, underscore, name) => name);\n return match.trim();\n })\n .filter((name) => name.length > 0);\n}\n",
12
+ "export class Logger {\n private static readonly RESET = \"\\x1b[0m\";\n private static readonly RED = \"\\x1b[31m\";\n private static readonly YELLOW = \"\\x1b[33m\";\n private static readonly GRAY = \"\\x1b[90m\";\n\n public static Level = {\n DEBUG: 0,\n INFO: 1,\n WARNING: 2,\n ERROR: 3,\n CRITICAL: 4,\n } as const;\n\n private static initialized = false;\n private static currentLevel: number = Logger.Level.INFO;\n private static useColor = true;\n\n private static initialize(): void {\n if (!Logger.initialized) {\n const noColor = process.env.JUDGMENT_NO_COLOR;\n Logger.useColor = !noColor && process.stdout.isTTY;\n Logger.initialized = true;\n }\n }\n\n public static setLevel(level: number): void {\n Logger.currentLevel = level;\n }\n\n public static setUseColor(useColor: boolean): void {\n Logger.useColor = useColor;\n }\n\n private static log(level: number, message: string): void {\n Logger.initialize();\n\n if (level < Logger.currentLevel) {\n return;\n }\n\n const timestamp = new Date()\n .toISOString()\n .replace(\"T\", \" \")\n .substring(0, 19);\n const levelName =\n Object.keys(Logger.Level).find(\n (key) => Logger.Level[key as keyof typeof Logger.Level] === level,\n ) || \"UNKNOWN\";\n let formattedMessage = `${timestamp} - judgeval - ${levelName} - ${message}`;\n\n if (Logger.useColor) {\n const color =\n level === Logger.Level.DEBUG || level === Logger.Level.INFO\n ? Logger.GRAY\n : level === Logger.Level.WARNING\n ? Logger.YELLOW\n : Logger.RED;\n formattedMessage = `${color}${formattedMessage}${Logger.RESET}`;\n }\n\n const output =\n level >= Logger.Level.ERROR ? process.stderr : process.stdout;\n output.write(formattedMessage + \"\\n\");\n }\n\n public static debug(message: string): void {\n Logger.log(Logger.Level.DEBUG, message);\n }\n\n public static info(message: string): void {\n Logger.log(Logger.Level.INFO, message);\n }\n\n public static warning(message: string): void {\n Logger.log(Logger.Level.WARNING, message);\n }\n\n public static warn(message: string): void {\n Logger.log(Logger.Level.WARNING, message);\n }\n\n public static error(message: string): void {\n Logger.log(Logger.Level.ERROR, message);\n }\n\n public static critical(message: string): void {\n Logger.log(Logger.Level.CRITICAL, message);\n }\n}\n",
13
+ "export const JUDGEVAL_TRACER_INSTRUMENTING_MODULE_NAME =\n \"opentelemetry.instrumentation.judgeval\" as const;\n",
14
+ "import { JUDGEVAL_TRACER_INSTRUMENTING_MODULE_NAME } from \"../constants\";\nimport { JUDGMENT_API_KEY, JUDGMENT_API_URL, JUDGMENT_ORG_ID } from \"../env\";\n\n/**\n * Configuration for the Judgment Tracer that controls how tracing and evaluation behave.\n *\n * This class encapsulates all configuration parameters needed to initialize a Tracer.\n *\n * @example\n * ```typescript\n * const config = TracerConfiguration.builder()\n * .projectName(\"my-project\")\n * .apiKey(\"your-api-key\")\n * .organizationId(\"your-org-id\")\n * .enableEvaluation(true)\n * .build();\n *\n * const tracer = Tracer.createWithConfiguration(config);\n * ```\n */\nexport class TracerConfiguration {\n constructor(\n public readonly projectName: string,\n public readonly apiKey: string,\n public readonly organizationId: string,\n public readonly apiUrl: string,\n public readonly enableEvaluation: boolean,\n public readonly tracerName: string = JUDGEVAL_TRACER_INSTRUMENTING_MODULE_NAME,\n ) {}\n\n /**\n * Creates a default configuration with the given project name.\n *\n * This method uses default values from environment variables:\n * - API Key: JUDGMENT_API_KEY\n * - Organization ID: JUDGMENT_ORG_ID\n * - API URL: JUDGMENT_API_URL\n * - Evaluation: enabled\n *\n * @param projectName the name of the project\n * @returns a new TracerConfiguration with default values\n * @throws Error if project name is null or empty\n */\n public static createDefault(projectName: string): TracerConfiguration {\n return new TracerConfigurationBuilder().projectName(projectName).build();\n }\n\n public static builder(): TracerConfigurationBuilder {\n return new TracerConfigurationBuilder();\n }\n}\n\n/**\n * Builder for creating TracerConfiguration instances.\n *\n * @example\n * ```typescript\n * const config = TracerConfiguration.builder()\n * .projectName(\"my-project\")\n * .apiKey(\"custom-api-key\")\n * .organizationId(\"custom-org-id\")\n * .apiUrl(\"https://custom-api.judgmentlabs.ai\")\n * .enableEvaluation(false)\n * .build();\n * ```\n */\nexport class TracerConfigurationBuilder {\n private _projectName?: string;\n private _apiKey: string | null = JUDGMENT_API_KEY;\n private _organizationId: string | null = JUDGMENT_ORG_ID;\n private _apiUrl: string = JUDGMENT_API_URL;\n private _enableEvaluation: boolean = true;\n private _tracerName: string = JUDGEVAL_TRACER_INSTRUMENTING_MODULE_NAME;\n\n public projectName(projectName: string): this {\n this._projectName = projectName;\n return this;\n }\n\n public apiKey(apiKey: string): this {\n this._apiKey = apiKey;\n return this;\n }\n\n public organizationId(organizationId: string): this {\n this._organizationId = organizationId;\n return this;\n }\n\n public apiUrl(apiUrl: string): this {\n this._apiUrl = apiUrl;\n return this;\n }\n\n public enableEvaluation(enableEvaluation: boolean): this {\n this._enableEvaluation = enableEvaluation;\n return this;\n }\n\n public tracerName(tracerName: string): this {\n this._tracerName = tracerName;\n return this;\n }\n\n public build(): TracerConfiguration {\n if (!this._projectName) {\n throw new Error(\"Project name is required\");\n }\n\n if (!this._apiKey) {\n throw new Error(\"API key is required\");\n }\n\n if (!this._organizationId) {\n throw new Error(\"Organization ID is required\");\n }\n\n if (!this._apiUrl) {\n throw new Error(\"API URL is required\");\n }\n\n return new TracerConfiguration(\n this._projectName,\n this._apiKey,\n this._organizationId,\n this._apiUrl,\n this._enableEvaluation,\n this._tracerName,\n );\n }\n}\n",
15
+ "import { Example as ExampleModel } from \"../internal/api/models/Example\";\n\nexport type Example<T extends Record<string, any> = Record<string, any>> =\n ExampleModel & T;\n\nexport function createExample<T extends Record<string, any>>(\n properties: T,\n): Example<T> {\n const example: Example<T> = {\n example_id: undefined,\n created_at: new Date().toISOString(),\n name: null,\n ...properties,\n } as Example<T>;\n\n return example;\n}\n",
16
+ "export enum ExampleParams {\n INPUT = \"input\",\n ACTUAL_OUTPUT = \"actual_output\",\n EXPECTED_OUTPUT = \"expected_output\",\n CONTEXT = \"context\",\n RETRIEVAL_CONTEXT = \"retrieval_context\",\n TOOLS_CALLED = \"tools_called\",\n EXPECTED_TOOLS = \"expected_tools\",\n ADDITIONAL_METADATA = \"additional_metadata\",\n}\n\nexport type ExampleParamKeys = keyof typeof ExampleParams;\nexport type ExampleParamValues = `${ExampleParams}`;\n",
17
+ "import { ScorerConfig } from \"../internal/api/models\";\nimport { BaseScorer as BaseScorerModel } from \"../internal/api/models/BaseScorer\";\n\nexport type BaseScorer = BaseScorerModel & {\n addModel: (model: string) => void;\n successCheck: () => boolean;\n getRequiredParams: () => string[];\n getScorerConfig: () => ScorerConfig;\n};\n\nexport function createBaseScorer(): BaseScorer {\n const scorer: BaseScorer = {\n score_type: \"\",\n class_name: \"\",\n name: \"\",\n addModel: (model: string) => {\n scorer.model = model;\n },\n successCheck: () => {\n if (scorer.error != null) {\n return false;\n }\n if (scorer.score == null) {\n return false;\n }\n const threshold = scorer.threshold ?? 0.5;\n const score = scorer.score;\n return threshold != null && score != null && score >= threshold;\n },\n getRequiredParams: () => {\n return [];\n },\n getScorerConfig: () => {\n return {\n score_type: scorer.score_type,\n name: scorer.name,\n threshold: scorer.threshold ?? 0.5,\n strict_mode: scorer.strict_mode ?? false,\n required_params: [],\n kwargs: {},\n };\n },\n };\n\n scorer.class_name = \"BaseScorer\";\n scorer.name = scorer.class_name;\n if (scorer.strict_mode === true) {\n scorer.threshold = 1.0;\n }\n\n return scorer;\n}\n",
18
+ "import { BaseScorer, createBaseScorer } from \"./base-scorer\";\n\nexport enum APIScorerType {\n PROMPT_SCORER = \"Prompt Scorer\",\n TRACE_PROMPT_SCORER = \"Trace Prompt Scorer\",\n FAITHFULNESS = \"Faithfulness\",\n ANSWER_RELEVANCY = \"Answer Relevancy\",\n ANSWER_CORRECTNESS = \"Answer Correctness\",\n INSTRUCTION_ADHERENCE = \"Instruction Adherence\",\n EXECUTION_ORDER = \"Execution Order\",\n TOOL_ORDER = \"Tool Order\",\n CLASSIFIER = \"Classifier\",\n TOOL_DEPENDENCY = \"Tool Dependency\",\n CUSTOM = \"Custom\",\n}\n\nexport type APIScorer<\n T extends APIScorerType = APIScorerType,\n P extends readonly string[] = readonly string[],\n> = BaseScorer & {\n scoreType: T;\n requiredParams: P;\n setThreshold: (threshold: number) => void;\n getScoreType: () => T;\n setRequiredParams: (params: P) => void;\n};\n\nexport function createAPIScorer<\n T extends APIScorerType,\n P extends readonly string[],\n>(scoreType: T, requiredParams: P): APIScorer<T, P> {\n const scorer = createBaseScorer() as APIScorer<T, P>;\n\n scorer.scoreType = scoreType;\n scorer.name = scoreType;\n scorer.score_type = scoreType;\n scorer.requiredParams = requiredParams;\n\n scorer.setThreshold = (threshold: number) => {\n if (threshold < 0 || threshold > 1) {\n throw new Error(`Threshold must be between 0 and 1, got: ${threshold}`);\n }\n scorer.threshold = threshold;\n };\n\n scorer.getScoreType = () => {\n return scorer.scoreType;\n };\n\n scorer.setRequiredParams = (params: P) => {\n scorer.requiredParams = params;\n };\n\n return scorer;\n}\n",
19
+ "import {\n JUDGMENT_API_KEY,\n JUDGMENT_API_URL,\n JUDGMENT_ORG_ID,\n} from \"../../../env\";\nimport { JudgmentApiClient } from \"../../../internal/api\";\n\nexport class JudgmentAPIError extends Error {\n constructor(\n public statusCode: number,\n message: string,\n ) {\n super(message);\n this.name = \"JudgmentAPIError\";\n }\n}\n\nexport async function pushPromptScorer(\n name: string,\n prompt: string,\n threshold: number,\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n isTrace?: boolean,\n): Promise<string> {\n if (!JUDGMENT_API_URL || !judgmentApiKey || !organizationId) {\n throw new Error(\"Missing required API credentials\");\n }\n\n const client = new JudgmentApiClient(\n JUDGMENT_API_URL,\n judgmentApiKey,\n organizationId,\n );\n const response = await client.saveScorer({\n name,\n prompt,\n threshold,\n options,\n is_trace: isTrace,\n });\n return response.name;\n}\n\nexport async function fetchPromptScorer(\n name: string,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n) {\n if (!JUDGMENT_API_URL || !judgmentApiKey || !organizationId) {\n throw new Error(\"Missing required API credentials\");\n }\n\n const client = new JudgmentApiClient(\n JUDGMENT_API_URL,\n judgmentApiKey,\n organizationId,\n );\n const response = await client.fetchScorers({ names: [name] });\n if (response.scorers.length === 0) {\n throw new JudgmentAPIError(404, `Scorer with name ${name} not found`);\n }\n const { created_at, updated_at, ...config } = response.scorers[0];\n return config;\n}\n\nexport async function scorerExists(\n name: string,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n): Promise<boolean> {\n if (!JUDGMENT_API_URL || !judgmentApiKey || !organizationId) {\n throw new Error(\"Missing required API credentials\");\n }\n\n const client = new JudgmentApiClient(\n JUDGMENT_API_URL,\n judgmentApiKey,\n organizationId,\n );\n const response = await client.scorerExists({ name });\n return response.exists;\n}\n",
20
+ "import { JUDGMENT_API_KEY, JUDGMENT_ORG_ID } from \"../../../env\";\nimport { ScorerConfig } from \"../../../internal/api/models\";\nimport { APIScorer, APIScorerType } from \"../../api-scorer\";\nimport {\n fetchPromptScorer,\n JudgmentAPIError,\n pushPromptScorer,\n scorerExists,\n} from \"./prompt-scorer-utils\";\n\nexport abstract class BasePromptScorer\n implements APIScorer<APIScorerType, readonly string[]>\n{\n public scoreType: APIScorerType;\n public name: string;\n public prompt: string;\n public threshold: number;\n public options?: Record<string, number> | null;\n public judgmentApiKey: string;\n public organizationId: string;\n public requiredParams: readonly string[];\n public score_type: string;\n public class_name: string;\n public model?: string;\n public score?: number;\n public error?: string | null;\n public strict_mode?: boolean;\n\n constructor(\n scoreType: APIScorerType,\n name: string,\n prompt: string,\n threshold: number,\n requiredParams: readonly string[],\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ) {\n this.scoreType = scoreType;\n this.name = name;\n this.prompt = prompt;\n this.threshold = threshold;\n this.requiredParams = requiredParams;\n this.options = options;\n this.judgmentApiKey = judgmentApiKey;\n this.organizationId = organizationId;\n this.score_type = scoreType;\n this.class_name = \"BasePromptScorer\";\n this.model = undefined;\n this.score = undefined;\n this.error = null;\n this.strict_mode = false;\n }\n score_breakdown?: Record<string, any> | null | undefined;\n reason?: string | null | undefined;\n using_native_model?: boolean | null | undefined;\n success?: boolean | null | undefined;\n model_client?: any;\n additional_metadata?: Record<string, any> | null | undefined;\n user?: string | null | undefined;\n server_hosted?: boolean | undefined;\n\n static async get<T extends BasePromptScorer>(\n this: new (...args: any[]) => T,\n name: string,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ): Promise<T> {\n const config = await fetchPromptScorer(\n name,\n judgmentApiKey,\n organizationId,\n );\n\n const isTrace = config.is_trace === true;\n const expectedIsTrace =\n this.prototype.scoreType === APIScorerType.TRACE_PROMPT_SCORER;\n\n if (isTrace !== expectedIsTrace) {\n throw new JudgmentAPIError(\n 400,\n `Scorer with name ${name} is not a ${this.name}`,\n );\n }\n\n const scoreType = isTrace\n ? APIScorerType.TRACE_PROMPT_SCORER\n : APIScorerType.PROMPT_SCORER;\n\n return new this(\n scoreType,\n config.name, // Use config.name instead of name parameter\n config.prompt,\n config.threshold,\n [],\n config.options,\n judgmentApiKey,\n organizationId,\n );\n }\n\n static async create<T extends BasePromptScorer>(\n this: new (...args: any[]) => T,\n name: string,\n prompt: string,\n threshold: number = 0.5,\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ): Promise<T> {\n if (await scorerExists(name, judgmentApiKey, organizationId)) {\n throw new JudgmentAPIError(\n 400,\n `Scorer with name ${name} already exists. Either use the existing scorer with the get() method or use a new name.`,\n );\n }\n\n const isTrace =\n this.prototype.scoreType === APIScorerType.TRACE_PROMPT_SCORER;\n const scoreType = isTrace\n ? APIScorerType.TRACE_PROMPT_SCORER\n : APIScorerType.PROMPT_SCORER;\n\n await pushPromptScorer(\n name,\n prompt,\n threshold,\n options,\n judgmentApiKey,\n organizationId,\n isTrace,\n );\n\n return new this(\n scoreType,\n name,\n prompt,\n threshold,\n [],\n options,\n judgmentApiKey,\n organizationId,\n );\n }\n\n async updateThreshold(threshold: number): Promise<void> {\n this.setThreshold(threshold);\n await this.pushPromptScorer();\n }\n\n async setPrompt(prompt: string): Promise<void> {\n this.prompt = prompt;\n await this.pushPromptScorer();\n }\n\n async setOptions(options: Record<string, number> | null): Promise<void> {\n this.options = options;\n await this.pushPromptScorer();\n }\n\n async appendToPrompt(promptAddition: string): Promise<void> {\n this.prompt += promptAddition;\n await this.pushPromptScorer();\n }\n\n getThreshold(): number {\n return this.threshold;\n }\n\n getPrompt(): string {\n return this.prompt;\n }\n\n getOptions(): Record<string, number> | null {\n return this.options ? { ...this.options } : null;\n }\n\n getName(): string {\n return this.name;\n }\n\n getConfig(): Record<string, any> {\n return {\n name: this.name,\n prompt: this.prompt,\n threshold: this.threshold,\n options: this.options,\n } as const;\n }\n\n async pushPromptScorer(): Promise<void> {\n await pushPromptScorer(\n this.name,\n this.prompt,\n this.threshold,\n this.options,\n this.judgmentApiKey,\n this.organizationId,\n );\n }\n\n toString(): string {\n return `${this.constructor.name}(name=${this.name}, prompt=${\n this.prompt\n }, threshold=${this.threshold}, options=${JSON.stringify(this.options)})`;\n }\n\n addModel(model: string): void {\n this.model = model;\n }\n\n successCheck(): boolean {\n if (this.error != null) {\n return false;\n }\n if (this.score == null) {\n return false;\n }\n const threshold = this.threshold ?? 0.5;\n const score = this.score;\n return threshold != null && score != null && score >= threshold;\n }\n\n getRequiredParams(): string[] {\n if (Array.isArray(this.requiredParams)) {\n return [...this.requiredParams];\n }\n return [];\n }\n\n setThreshold(threshold: number): void {\n if (threshold < 0 || threshold > 1) {\n throw new Error(`Threshold must be between 0 and 1, got: ${threshold}`);\n }\n this.threshold = threshold;\n }\n\n getScoreType(): APIScorerType {\n return this.scoreType;\n }\n\n setRequiredParams(params: readonly string[]): void {\n this.requiredParams = params;\n }\n\n getScorerConfig(): ScorerConfig {\n return {\n score_type: this.getScoreType(),\n name: this.getName(),\n threshold: this.getThreshold(),\n strict_mode: this.strict_mode ?? false,\n required_params: this.getRequiredParams(),\n kwargs: {\n prompt: this.getPrompt(),\n ...(this.getOptions() ? { options: this.getOptions() } : {}),\n },\n };\n }\n}\n",
21
+ "import { JUDGMENT_API_KEY, JUDGMENT_ORG_ID } from \"../../../env\";\nimport { APIScorerType } from \"../../api-scorer\";\nimport { BasePromptScorer } from \"./base-prompt-scorer\";\nexport {\n fetchPromptScorer,\n JudgmentAPIError,\n pushPromptScorer,\n scorerExists,\n} from \"./prompt-scorer-utils\";\n\nexport class PromptScorer extends BasePromptScorer {\n constructor(\n scoreType: APIScorerType,\n name: string,\n prompt: string,\n threshold: number,\n requiredParams: readonly string[] = [],\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ) {\n super(\n scoreType,\n name,\n prompt,\n threshold,\n requiredParams,\n options,\n judgmentApiKey,\n organizationId,\n );\n }\n}\n",
22
+ "import { JUDGMENT_API_KEY, JUDGMENT_ORG_ID } from \"../../../env\";\nimport { APIScorerType } from \"../../api-scorer\";\nimport { BasePromptScorer } from \"./base-prompt-scorer\";\n\nexport class TracePromptScorer extends BasePromptScorer {\n constructor(\n scoreType: APIScorerType,\n name: string,\n prompt: string,\n threshold: number,\n requiredParams: readonly string[] = [],\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ) {\n super(\n scoreType,\n name,\n prompt,\n threshold,\n requiredParams,\n options,\n judgmentApiKey,\n organizationId,\n );\n }\n}\n",
23
+ "import { resourceFromAttributes } from \"@opentelemetry/resources\";\nimport {\n BatchSpanProcessor,\n WebTracerProvider,\n} from \"@opentelemetry/sdk-trace-web\";\nimport { VERSION } from \"../version\";\nimport { OpenTelemetryKeys } from \"./OpenTelemetryKeys\";\nimport { Tracer, TracerInitializeOptions } from \"./Tracer\";\nimport { TracerConfiguration } from \"./TracerConfiguration\";\n\nexport type BrowserTracerInitializeOptions = TracerInitializeOptions & {};\n\nexport class BrowserTracer extends Tracer {\n private webTracerProvider?: WebTracerProvider;\n\n public async initialize(\n options: BrowserTracerInitializeOptions = {},\n ): Promise<BrowserTracer> {\n if (this._initialized) {\n return this;\n }\n\n try {\n const resourceAttributes = {\n [OpenTelemetryKeys.ResourceKeys.SERVICE_NAME]:\n this.configuration.projectName,\n [OpenTelemetryKeys.ResourceKeys.TELEMETRY_SDK_VERSION]: VERSION,\n ...options.resourceAttributes,\n };\n\n const spanExporter = await this.getSpanExporter();\n\n this.webTracerProvider = new WebTracerProvider({\n resource: resourceFromAttributes(resourceAttributes),\n spanProcessors: [new BatchSpanProcessor(spanExporter)],\n });\n\n this.webTracerProvider.register();\n\n this._initialized = true;\n return this;\n } catch (error) {\n throw new Error(\n `Failed to initialize browser tracer: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n public static getInstance(configuration: TracerConfiguration): BrowserTracer {\n const key = `BrowserTracer:${configuration.projectName}`;\n if (!Tracer.instances.has(key)) {\n Tracer.instances.set(key, new BrowserTracer(configuration));\n }\n return Tracer.instances.get(key) as BrowserTracer;\n }\n\n public static createDefault(projectName: string): BrowserTracer {\n const configuration = TracerConfiguration.builder()\n .projectName(projectName)\n .build();\n return BrowserTracer.getInstance(configuration);\n }\n\n public static createWithConfiguration(\n configuration: TracerConfiguration,\n ): BrowserTracer {\n return new BrowserTracer(configuration);\n }\n}\n",
24
+ "export const VERSION = \"0.3.2\";\n",
25
+ "import { resourceFromAttributes } from \"@opentelemetry/resources\";\nimport { NodeSDK, NodeSDKConfiguration } from \"@opentelemetry/sdk-node\";\nimport { BatchSpanProcessor } from \"@opentelemetry/sdk-trace-node\";\nimport { VERSION } from \"../version\";\nimport { OpenTelemetryKeys } from \"./OpenTelemetryKeys\";\nimport { Tracer, TracerInitializeOptions } from \"./Tracer\";\nimport { TracerConfiguration } from \"./TracerConfiguration\";\n\nexport type NodeTracerInitializeOptions = TracerInitializeOptions & {\n instrumentations?: NodeSDKConfiguration[\"instrumentations\"];\n resourceAttributes?: Record<string, unknown>;\n};\n\nexport class NodeTracer extends Tracer {\n private nodeSDK?: NodeSDK;\n\n public async initialize(\n options: NodeTracerInitializeOptions = {},\n ): Promise<NodeTracer> {\n if (this._initialized) {\n return this;\n }\n\n try {\n const resourceAttributes = {\n [OpenTelemetryKeys.ResourceKeys.SERVICE_NAME]:\n this.configuration.projectName,\n [OpenTelemetryKeys.ResourceKeys.TELEMETRY_SDK_VERSION]: VERSION,\n ...options.resourceAttributes,\n };\n\n const spanExporter = await this.getSpanExporter();\n\n this.nodeSDK = new NodeSDK({\n resource: resourceFromAttributes(resourceAttributes),\n instrumentations: options.instrumentations,\n spanProcessor: new BatchSpanProcessor(spanExporter),\n ...options,\n });\n\n this.nodeSDK.start();\n\n this._initialized = true;\n return this;\n } catch (error) {\n throw new Error(\n `Failed to initialize node tracer: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n public static getInstance(configuration: TracerConfiguration): NodeTracer {\n const key = `NodeTracer:${configuration.projectName}`;\n if (!Tracer.instances.has(key)) {\n Tracer.instances.set(key, new NodeTracer(configuration));\n }\n return Tracer.instances.get(key) as NodeTracer;\n }\n\n public static createDefault(projectName: string): NodeTracer {\n const configuration = TracerConfiguration.builder()\n .projectName(projectName)\n .enableEvaluation(true)\n .build();\n return NodeTracer.getInstance(configuration);\n }\n\n public static createWithConfiguration(\n configuration: TracerConfiguration,\n ): NodeTracer {\n return new NodeTracer(configuration);\n }\n\n public async shutdown(): Promise<void> {\n if (this.nodeSDK) {\n await this.nodeSDK.shutdown();\n }\n }\n}\n"
26
+ ],
27
+ "mappings": "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",
28
+ "debugId": "6A697B7F3936AB8164756E2164756E21",
29
+ "names": []
30
+ }
package/dist/index.umd.js CHANGED
@@ -1,2 +1,5 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@opentelemetry/exporter-trace-otlp-http"),require("@opentelemetry/api"),require("@opentelemetry/resources"),require("@opentelemetry/sdk-trace-web"),require("@opentelemetry/sdk-node"),require("@opentelemetry/sdk-trace-node")):"function"==typeof define&&define.amd?define(["@opentelemetry/exporter-trace-otlp-http","@opentelemetry/api","@opentelemetry/resources","@opentelemetry/sdk-trace-web","@opentelemetry/sdk-node","@opentelemetry/sdk-trace-node"],t):"object"==typeof exports?exports.JudgevalJS=t(require("@opentelemetry/exporter-trace-otlp-http"),require("@opentelemetry/api"),require("@opentelemetry/resources"),require("@opentelemetry/sdk-trace-web"),require("@opentelemetry/sdk-node"),require("@opentelemetry/sdk-trace-node")):e.JudgevalJS=t(e["@opentelemetry/exporter-trace-otlp-http"],e["@opentelemetry/api"],e["@opentelemetry/resources"],e["@opentelemetry/sdk-trace-web"],e["@opentelemetry/sdk-node"],e["@opentelemetry/sdk-trace-node"])}(this,(e,t,r,i,s,n)=>(()=>{"use strict";var o={67:e=>{e.exports=n},186:t=>{t.exports=e},276:e=>{e.exports=t},404:e=>{e.exports=i},625:e=>{e.exports=r},839:e=>{e.exports=s}},a={};function c(e){var t=a[e];if(void 0!==t)return t.exports;var r=a[e]={exports:{}};return o[e](r,r.exports,c),r.exports}c.d=(e,t)=>{for(var r in t)c.o(t,r)&&!c.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},c.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),c.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var u={};c.r(u),c.d(u,{APIScorerType:()=>G,BasePromptScorer:()=>F,BrowserTracer:()=>X,ExampleParams:()=>x,JUDGMENT_API_KEY:()=>g,JUDGMENT_API_URL:()=>N,JUDGMENT_DEFAULT_GPT_MODEL:()=>f,JUDGMENT_ENABLE_EVALUATIONS:()=>y,JUDGMENT_ENABLE_MONITORING:()=>w,JUDGMENT_NO_COLOR:()=>S,JUDGMENT_ORG_ID:()=>T,JudgmentAPIError:()=>z,JudgmentApiClient:()=>I,JudgmentSpanExporter:()=>l,Logger:()=>U,NoOpSpanExporter:()=>p,NodeTracer:()=>ee,OpenTelemetryKeys:()=>_,PromptScorer:()=>H,TracePromptScorer:()=>B,Tracer:()=>D,TracerConfiguration:()=>C,TracerConfigurationBuilder:()=>M,createAPIScorer:()=>K,createBaseScorer:()=>$,createExample:()=>L,fetchPromptScorer:()=>k,parseFunctionArgs:()=>b,pushPromptScorer:()=>J,scorerExists:()=>q});var d=c(186);class l{constructor(e,t,r,i){if(!i||""===i.trim())throw new Error("projectId is required for JudgmentSpanExporter");this.delegate=new d.OTLPTraceExporter({url:e,headers:{Authorization:`Bearer ${t}`,"X-Organization-Id":r,"X-Project-Id":i}})}static builder(){return new h}export(e,t){this.delegate.export(e,t)}shutdown(){return this.delegate.shutdown()}forceFlush(){return this.delegate.forceFlush?.()??Promise.resolve()}}class h{constructor(){}endpoint(e){return this._endpoint=e,this}apiKey(e){return this._apiKey=e,this}organizationId(e){return this._organizationId=e,this}projectId(e){return this._projectId=e,this}build(){if(!this._endpoint||""===this._endpoint.trim())throw new Error("Endpoint is required");if(!this._apiKey||""===this._apiKey.trim())throw new Error("API key is required");if(!this._organizationId||""===this._organizationId.trim())throw new Error("Organization ID is required");if(!this._projectId||""===this._projectId.trim())throw new Error("Project ID is required");return new l(this._endpoint,this._apiKey,this._organizationId,this._projectId)}}class p{export(e,t){t({code:0})}flush(){return Promise.resolve()}shutdown(){return Promise.resolve()}}class _{}_.AttributeKeys={JUDGMENT_SPAN_KIND:"judgment.span_kind",JUDGMENT_INPUT:"judgment.input",JUDGMENT_OUTPUT:"judgment.output",JUDGMENT_OFFLINE_MODE:"judgment.offline_mode",JUDGMENT_UPDATE_ID:"judgment.update_id",JUDGMENT_CUSTOMER_ID:"judgment.customer_id",JUDGMENT_AGENT_ID:"judgment.agent_id",JUDGMENT_PARENT_AGENT_ID:"judgment.parent_agent_id",JUDGMENT_AGENT_CLASS_NAME:"judgment.agent_class_name",JUDGMENT_AGENT_INSTANCE_NAME:"judgment.agent_instance_name",PENDING_TRACE_EVAL:"judgment.pending_trace_eval",GEN_AI_PROMPT:"gen_ai.prompt",GEN_AI_COMPLETION:"gen_ai.completion",GEN_AI_REQUEST_MODEL:"gen_ai.request.model",GEN_AI_RESPONSE_MODEL:"gen_ai.response.model",GEN_AI_SYSTEM:"gen_ai.system",GEN_AI_USAGE_INPUT_TOKENS:"gen_ai.usage.input_tokens",GEN_AI_USAGE_OUTPUT_TOKENS:"gen_ai.usage.output_tokens",GEN_AI_USAGE_COMPLETION_TOKENS:"gen_ai.usage.completion_tokens",GEN_AI_REQUEST_TEMPERATURE:"gen_ai.request.temperature",GEN_AI_REQUEST_MAX_TOKENS:"gen_ai.request.max_tokens",GEN_AI_RESPONSE_FINISH_REASONS:"gen_ai.response.finish_reasons",GEN_AI_USAGE_TOTAL_COST:"gen_ai.usage.total_cost_usd"},_.InternalAttributeKeys={DISABLE_PARTIAL_EMIT:"disable_partial_emit",CANCELLED:"cancelled"},_.ResourceKeys={SERVICE_NAME:"service.name",TELEMETRY_SDK_LANGUAGE:"telemetry.sdk.language",TELEMETRY_SDK_NAME:"telemetry.sdk.name",TELEMETRY_SDK_VERSION:"telemetry.sdk.version",JUDGMENT_PROJECT_ID:"judgment.project_id"};var E=c(276);function m(e,t){return process.env[e]||(t??null)}const g=m("JUDGMENT_API_KEY"),T=m("JUDGMENT_ORG_ID"),N=m("JUDGMENT_API_URL","https://api.judgmentlabs.ai"),f=m("JUDGMENT_DEFAULT_GPT_MODEL","gpt-4.1"),w=m("JUDGMENT_ENABLE_MONITORING","true"),y=m("JUDGMENT_ENABLE_EVALUATIONS","true"),S=m("JUDGMENT_NO_COLOR");class I{constructor(e,t,r){this.baseUrl=e,this.apiKey=t,this.organizationId=r}buildUrl(e){return this.baseUrl+e}buildHeaders(){if(!this.apiKey||!this.organizationId)throw new Error("API key and organization ID cannot be null");return{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`,"X-Organization-Id":this.organizationId}}async addToRunEvalQueueExamples(e){const t=this.buildUrl("/add_to_run_eval_queue/examples"),r=await fetch(t,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(e)});if(!r.ok)throw new Error(`HTTP Error: ${r.status} - ${await r.text()}`)}async addToRunEvalQueueTraces(e){const t=this.buildUrl("/add_to_run_eval_queue/traces"),r=await fetch(t,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(e)});if(!r.ok)throw new Error(`HTTP Error: ${r.status} - ${await r.text()}`)}async logEvalResults(e){const t=this.buildUrl("/log_eval_results/"),r=await fetch(t,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(e)});if(!r.ok)throw new Error(`HTTP Error: ${r.status} - ${await r.text()}`)}async fetchExperimentRun(e){const t=this.buildUrl("/fetch_experiment_run/"),r=await fetch(t,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(e)});if(!r.ok)throw new Error(`HTTP Error: ${r.status} - ${await r.text()}`)}async getEvaluationStatus(e,t){const r=new URLSearchParams;r.set("experiment_run_id",e),r.set("project_name",t);const i=this.buildUrl("/get_evaluation_status/"+(r.toString()?"?"+r.toString():"")),s=await fetch(i,{method:"GET",headers:this.buildHeaders()});if(!s.ok)throw new Error(`HTTP Error: ${s.status} - ${await s.text()}`)}async scorerExists(e){const t=this.buildUrl("/scorer_exists/"),r=await fetch(t,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(e)});if(!r.ok)throw new Error(`HTTP Error: ${r.status} - ${await r.text()}`);return await r.json()}async saveScorer(e){const t=this.buildUrl("/save_scorer/"),r=await fetch(t,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(e)});if(!r.ok)throw new Error(`HTTP Error: ${r.status} - ${await r.text()}`);return await r.json()}async fetchScorers(e){const t=this.buildUrl("/fetch_scorers/"),r=await fetch(t,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(e)});if(!r.ok)throw new Error(`HTTP Error: ${r.status} - ${await r.text()}`);return await r.json()}async projectsResolve(e){const t=this.buildUrl("/projects/resolve/"),r=await fetch(t,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(e)});if(!r.ok)throw new Error(`HTTP Error: ${r.status} - ${await r.text()}`);return await r.json()}}const A=/^([^(]+?)=>/,v=/^[^(]*\(\s*([^)]*)\)/m,P=/,/,O=/^\s*(_?)(\S+?)\1\s*$/,R=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;function b(e){const t=function(e){const t=function(e){return Function.prototype.toString.call(e)}(e).replace(R,"");return t.match(A)||t.match(v)}(e);return t&&t[1]?t[1].split(P).map(e=>e.replace(O,(e,t,r)=>r).trim()).filter(e=>e.length>0):[]}class U{static initialize(){if(!U.initialized){const e=process.env.JUDGMENT_NO_COLOR;U.useColor=!e&&process.stdout.isTTY,U.initialized=!0}}static setLevel(e){U.currentLevel=e}static setUseColor(e){U.useColor=e}static log(e,t){if(U.initialize(),e<U.currentLevel)return;let r=`${(new Date).toISOString().replace("T"," ").substring(0,19)} - judgeval - ${Object.keys(U.Level).find(t=>U.Level[t]===e)||"UNKNOWN"} - ${t}`;U.useColor&&(r=`${e===U.Level.DEBUG||e===U.Level.INFO?U.GRAY:e===U.Level.WARNING?U.YELLOW:U.RED}${r}${U.RESET}`),(e>=U.Level.ERROR?process.stderr:process.stdout).write(r+"\n")}static debug(e){U.log(U.Level.DEBUG,e)}static info(e){U.log(U.Level.INFO,e)}static warning(e){U.log(U.Level.WARNING,e)}static warn(e){U.log(U.Level.WARNING,e)}static error(e){U.log(U.Level.ERROR,e)}static critical(e){U.log(U.Level.CRITICAL,e)}}U.RESET="",U.RED="",U.YELLOW="",U.GRAY="",U.Level={DEBUG:0,INFO:1,WARNING:2,ERROR:3,CRITICAL:4},U.initialized=!1,U.currentLevel=U.Level.INFO,U.useColor=!0;class D{getConfiguration(){return this.configuration}getProjectId(){return this.projectId}getSerializer(){return this.serializer}constructor(e){this.tracer=null,this.serializer=JSON.stringify,this._initialized=!1,this.projectId=null,this.configuration=e,this.apiClient=new I(this.configuration.apiUrl,this.configuration.apiKey,this.configuration.organizationId),this._initialized=!1}async resolveProjectId(){try{U.info(`Resolving project ID for project: ${this.configuration.projectName}`);const e=await this.apiClient.projectsResolve({project_name:this.configuration.projectName});U.info(`Resolved project ID: ${e.project_id}`);const t=e.project_id?.toString();if(!t)throw new Error(`Project ID not found for project: ${this.configuration.projectName}`);return this.projectId=t,U.info(`Successfully resolved project ID: ${this.projectId}`),this.projectId}catch(e){throw new Error(`Failed to resolve project ID: ${e instanceof Error?e.message:String(e)}`)}}static getExporter(e,t,r){const i=N?.endsWith("/")?`${N}otel/v1/traces`:`${N}/otel/v1/traces`;return l.builder().endpoint(i).apiKey(e).organizationId(t).projectId(r).build()}async getSpanExporter(){try{const e=await this.resolveProjectId();return this.createJudgmentSpanExporter(e)}catch(e){return U.error("Failed to resolve project "+this.configuration.projectName+", please create it first at https://app.judgmentlabs.ai/org/"+(this.configuration.organizationId||"unknown")+"/projects. Skipping Judgment export."),new p}}setSpanKind(e){const t=E.trace.getActiveSpan();t?null!==e&&t.setAttribute(_.AttributeKeys.JUDGMENT_SPAN_KIND,e):U.warn("No active span found, skipping setSpanKind")}setAttribute(e,t){const r=E.trace.getActiveSpan();r?r.setAttribute(e,this.serializer(t)):U.warn("No active span found, skipping setAttribute")}setLLMSpan(){this.setSpanKind("llm")}setToolSpan(){this.setSpanKind("tool")}setGeneralSpan(){this.setSpanKind("span")}setAttributes(e){if(!e)return;const t=E.trace.getActiveSpan();if(t)for(const[r,i]of Object.entries(e))t.setAttribute(r,this.serializer(i));else U.warn("No active span found, skipping setAttributes")}setInput(e){this.setAttribute(_.AttributeKeys.JUDGMENT_INPUT,e)}setOutput(e){this.setAttribute(_.AttributeKeys.JUDGMENT_OUTPUT,e)}asyncEvaluate(e,t,r){if(!this._initialized)return void U.warn("Tracer not initialized, skipping asyncEvaluate");if(!this.configuration.enableEvaluation)return;const i=E.trace.getActiveSpan();if(!i)return void U.warn("No active span found, skipping asyncEvaluate");if(!i.isRecording())return void U.warn("Active span is not recording, skipping asyncEvaluate");const s=i.spanContext(),n=s.traceId,o=s.spanId;U.info(`asyncEvaluate: project=${this.configuration.projectName}, traceId=${n}, spanId=${o}, scorer=${e.name}`);const a=this.createEvaluationRun(e,t,r,n,o);this.enqueueEvaluation(a)}asyncTraceEvaluate(e,t){if(!this._initialized)return void U.warn("Tracer not initialized, skipping asyncTraceEvaluate");if(!this.configuration.enableEvaluation)return;const r=E.trace.getActiveSpan();if(!r)return void U.warn("No active span found, skipping asyncTraceEvaluate");if(!r.isRecording())return void U.warn("Active span is not recording, skipping asyncTraceEvaluate");const i=r.spanContext(),s=i.traceId,n=i.spanId;U.info(`asyncTraceEvaluate: project=${this.configuration.projectName}, traceId=${s}, spanId=${n}, scorer=${e.name}`);try{const i=this.createTraceEvaluationRun(e,t,s,n),o=this.serializer(i);r.setAttribute(_.AttributeKeys.PENDING_TRACE_EVAL,o)}catch(e){U.error(`Failed to serialize trace evaluation: ${e instanceof Error?e.message:String(e)}`)}}createTraceEvaluationRun(e,t,r,i){const s=`async_trace_evaluate_${i||Date.now()}`,n=t||f,o=e.getScorerConfig();return{project_name:this.configuration.projectName,eval_name:s,scorer:o,model:n,organization_id:this.configuration.organizationId,trace_id:r,trace_span_id:i}}createJudgmentSpanExporter(e){const t=this.configuration.apiUrl.endsWith("/")?`${this.configuration.apiUrl}otel/v1/traces`:`${this.configuration.apiUrl}/otel/v1/traces`;return l.builder().endpoint(t).apiKey(this.configuration.apiKey).organizationId(this.configuration.organizationId).projectId(e).build()}createEvaluationRun(e,t,r,i,s){const n=`async_evaluate_${s||Date.now()}`,o=r||f,a=e.getScorerConfig();return{project_name:this.configuration.projectName,eval_name:n,examples:[t],custom_scorers:[],judgment_scorers:[a],model:o,trace_id:i,trace_span_id:s}}async enqueueEvaluation(e){if(this.apiClient)try{await this.apiClient.addToRunEvalQueueExamples(e),U.info(`Enqueuing evaluation run: ${e.eval_name}`)}catch(e){U.error(`Failed to enqueue evaluation run: ${e instanceof Error?e.message:String(e)}`)}else U.warn("API client not available, skipping evaluation enqueue")}observe(e,t="span"){return(...r)=>{const i=E.trace.getActiveSpan();if(!i)return U.warn("No active span found, skipping observe"),e(...r);const s=e.name||"anonymous",n=E.trace.getTracer(this.configuration.tracerName);return E.context.with(E.trace.setSpan(E.context.active(),i),()=>n.startActiveSpan(s,{kind:E.SpanKind.INTERNAL},i=>{try{i.setAttribute(_.AttributeKeys.JUDGMENT_SPAN_KIND,t);const s=b(e);if(s.length===r.length){const e={};s.forEach((t,i)=>{e[t]=r[i]}),i.setAttribute(_.AttributeKeys.JUDGMENT_INPUT,this.serializer(e))}const n=e(...r);return n instanceof Promise?n.then(e=>(i.setAttribute(_.AttributeKeys.JUDGMENT_OUTPUT,this.serializer(e)),i.end(),e)).catch(e=>{throw i.recordException(e),i.end(),e}):(i.setAttribute(_.AttributeKeys.JUDGMENT_OUTPUT,this.serializer(n)),i.end(),n)}catch(e){throw i.recordException(e),i.end(),e}}))}}async shutdown(){}}D.instances=new Map;const j="opentelemetry.instrumentation.judgeval";class C{constructor(e,t,r,i,s,n=j){this.projectName=e,this.apiKey=t,this.organizationId=r,this.apiUrl=i,this.enableEvaluation=s,this.tracerName=n}static createDefault(e){return(new M).projectName(e).build()}static builder(){return new M}}class M{constructor(){this._apiKey=g,this._organizationId=T,this._apiUrl=N,this._enableEvaluation=!0,this._tracerName=j}projectName(e){return this._projectName=e,this}apiKey(e){return this._apiKey=e,this}organizationId(e){return this._organizationId=e,this}apiUrl(e){return this._apiUrl=e,this}enableEvaluation(e){return this._enableEvaluation=e,this}tracerName(e){return this._tracerName=e,this}build(){if(!this._projectName)throw new Error("Project name is required");if(!this._apiKey)throw new Error("API key is required");if(!this._organizationId)throw new Error("Organization ID is required");if(!this._apiUrl)throw new Error("API URL is required");return new C(this._projectName,this._apiKey,this._organizationId,this._apiUrl,this._enableEvaluation,this._tracerName)}}function L(e){return{example_id:void 0,created_at:(new Date).toISOString(),name:null,...e}}var x,G;function $(){const e={score_type:"",class_name:"BaseScorer",name:"",addModel:t=>{e.model=t},successCheck:()=>{if(null!=e.error)return!1;if(null==e.score)return!1;const t=e.threshold??.5,r=e.score;return null!=t&&null!=r&&r>=t},getRequiredParams:()=>[],getScorerConfig:()=>({score_type:e.score_type,name:e.name,threshold:e.threshold??.5,strict_mode:e.strict_mode??!1,required_params:[],kwargs:{}})};return e.name=e.class_name,!0===e.strict_mode&&(e.threshold=1),e}function K(e,t){const r=$();return r.scoreType=e,r.name=e,r.score_type=e,r.requiredParams=t,r.setThreshold=e=>{if(e<0||e>1)throw new Error(`Threshold must be between 0 and 1, got: ${e}`);r.threshold=e},r.getScoreType=()=>r.scoreType,r.setRequiredParams=e=>{r.requiredParams=e},r}!function(e){e.INPUT="input",e.ACTUAL_OUTPUT="actual_output",e.EXPECTED_OUTPUT="expected_output",e.CONTEXT="context",e.RETRIEVAL_CONTEXT="retrieval_context",e.TOOLS_CALLED="tools_called",e.EXPECTED_TOOLS="expected_tools",e.ADDITIONAL_METADATA="additional_metadata"}(x||(x={})),function(e){e.PROMPT_SCORER="Prompt Scorer",e.TRACE_PROMPT_SCORER="Trace Prompt Scorer",e.FAITHFULNESS="Faithfulness",e.ANSWER_RELEVANCY="Answer Relevancy",e.ANSWER_CORRECTNESS="Answer Correctness",e.INSTRUCTION_ADHERENCE="Instruction Adherence",e.EXECUTION_ORDER="Execution Order",e.TOOL_ORDER="Tool Order",e.CLASSIFIER="Classifier",e.TOOL_DEPENDENCY="Tool Dependency",e.CUSTOM="Custom"}(G||(G={}));class z extends Error{constructor(e,t){super(t),this.statusCode=e,this.name="JudgmentAPIError"}}async function J(e,t,r,i,s=g||"",n=T||"",o){if(!N||!s||!n)throw new Error("Missing required API credentials");const a=new I(N,s,n);return(await a.saveScorer({name:e,prompt:t,threshold:r,options:i,is_trace:o})).name}async function k(e,t=g||"",r=T||""){if(!N||!t||!r)throw new Error("Missing required API credentials");const i=new I(N,t,r),s=await i.fetchScorers({names:[e]});if(0===s.scorers.length)throw new z(404,`Scorer with name ${e} not found`);const{created_at:n,updated_at:o,...a}=s.scorers[0];return a}async function q(e,t=g||"",r=T||""){if(!N||!t||!r)throw new Error("Missing required API credentials");const i=new I(N,t,r);return(await i.scorerExists({name:e})).exists}class F{constructor(e,t,r,i,s,n,o=g||"",a=T||""){this.scoreType=e,this.name=t,this.prompt=r,this.threshold=i,this.requiredParams=s,this.options=n,this.judgmentApiKey=o,this.organizationId=a,this.score_type=e,this.class_name="BasePromptScorer",this.model=void 0,this.score=void 0,this.error=null,this.strict_mode=!1}static async get(e,t=g||"",r=T||""){const i=await k(e,t,r),s=!0===i.is_trace;if(s!==(this.prototype.scoreType===G.TRACE_PROMPT_SCORER))throw new z(400,`Scorer with name ${e} is not a ${this.name}`);return new this(s?G.TRACE_PROMPT_SCORER:G.PROMPT_SCORER,i.name,i.prompt,i.threshold,[],i.options,t,r)}static async create(e,t,r=.5,i,s=g||"",n=T||""){if(await q(e,s,n))throw new z(400,`Scorer with name ${e} already exists. Either use the existing scorer with the get() method or use a new name.`);const o=this.prototype.scoreType===G.TRACE_PROMPT_SCORER,a=o?G.TRACE_PROMPT_SCORER:G.PROMPT_SCORER;return await J(e,t,r,i,s,n,o),new this(a,e,t,r,[],i,s,n)}async updateThreshold(e){this.setThreshold(e),await this.pushPromptScorer()}async setPrompt(e){this.prompt=e,await this.pushPromptScorer()}async setOptions(e){this.options=e,await this.pushPromptScorer()}async appendToPrompt(e){this.prompt+=e,await this.pushPromptScorer()}getThreshold(){return this.threshold}getPrompt(){return this.prompt}getOptions(){return this.options?{...this.options}:null}getName(){return this.name}getConfig(){return{name:this.name,prompt:this.prompt,threshold:this.threshold,options:this.options}}async pushPromptScorer(){await J(this.name,this.prompt,this.threshold,this.options,this.judgmentApiKey,this.organizationId)}toString(){return`${this.constructor.name}(name=${this.name}, prompt=${this.prompt}, threshold=${this.threshold}, options=${JSON.stringify(this.options)})`}addModel(e){this.model=e}successCheck(){if(null!=this.error)return!1;if(null==this.score)return!1;const e=this.threshold??.5,t=this.score;return null!=e&&null!=t&&t>=e}getRequiredParams(){return Array.isArray(this.requiredParams)?[...this.requiredParams]:[]}setThreshold(e){if(e<0||e>1)throw new Error(`Threshold must be between 0 and 1, got: ${e}`);this.threshold=e}getScoreType(){return this.scoreType}setRequiredParams(e){this.requiredParams=e}getScorerConfig(){return{score_type:this.getScoreType(),name:this.getName(),threshold:this.getThreshold(),strict_mode:this.strict_mode??!1,required_params:this.getRequiredParams(),kwargs:{prompt:this.getPrompt(),...this.getOptions()?{options:this.getOptions()}:{}}}}}class H extends F{constructor(e,t,r,i,s=[],n,o=g||"",a=T||""){super(e,t,r,i,s,n,o,a)}}class B extends F{constructor(e,t,r,i,s=[],n,o=g||"",a=T||""){super(e,t,r,i,s,n,o,a)}}var Y=c(625),W=c(404);const V="0.3.1";class X extends D{async initialize(e={}){if(this._initialized)return this;try{const t={[_.ResourceKeys.SERVICE_NAME]:this.configuration.projectName,[_.ResourceKeys.TELEMETRY_SDK_VERSION]:V,...e.resourceAttributes},r=await this.getSpanExporter();return this.webTracerProvider=new W.WebTracerProvider({resource:(0,Y.resourceFromAttributes)(t),spanProcessors:[new W.BatchSpanProcessor(r)]}),this.webTracerProvider.register(),this._initialized=!0,this}catch(e){throw new Error(`Failed to initialize browser tracer: ${e instanceof Error?e.message:String(e)}`)}}static getInstance(e){const t=`BrowserTracer:${e.projectName}`;return D.instances.has(t)||D.instances.set(t,new X(e)),D.instances.get(t)}static createDefault(e){const t=C.builder().projectName(e).build();return X.getInstance(t)}static createWithConfiguration(e){return new X(e)}}var Q=c(839),Z=c(67);class ee extends D{async initialize(e={}){if(this._initialized)return this;try{const t={[_.ResourceKeys.SERVICE_NAME]:this.configuration.projectName,[_.ResourceKeys.TELEMETRY_SDK_VERSION]:V,...e.resourceAttributes},r=await this.getSpanExporter();return this.nodeSDK=new Q.NodeSDK({resource:(0,Y.resourceFromAttributes)(t),instrumentations:e.instrumentations,spanProcessor:new Z.BatchSpanProcessor(r),...e}),this.nodeSDK.start(),this._initialized=!0,this}catch(e){throw new Error(`Failed to initialize node tracer: ${e instanceof Error?e.message:String(e)}`)}}static getInstance(e){const t=`NodeTracer:${e.projectName}`;return D.instances.has(t)||D.instances.set(t,new ee(e)),D.instances.get(t)}static createDefault(e){const t=C.builder().projectName(e).enableEvaluation(!0).build();return ee.getInstance(t)}static createWithConfiguration(e){return new ee(e)}async shutdown(){this.nodeSDK&&await this.nodeSDK.shutdown()}}return u})());
2
- //# sourceMappingURL=index.umd.js.map
1
+ (()=>{var{defineProperty:G,getOwnPropertyNames:X,getOwnPropertyDescriptor:Q}=Object,Z=Object.prototype.hasOwnProperty;var k=new WeakMap,tt=(t)=>{var e=k.get(t),r;if(e)return e;if(e=G({},"__esModule",{value:!0}),t&&typeof t==="object"||typeof t==="function")X(t).map((n)=>!Z.call(e,n)&&G(e,n,{get:()=>t[n],enumerable:!(r=Q(t,n))||r.enumerable}));return k.set(t,e),e};var et=(t,e)=>{for(var r in e)G(t,r,{get:e[r],enumerable:!0,configurable:!0,set:(n)=>e[r]=()=>n})};var S=((t)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var mt={};et(mt,{scorerExists:()=>y,pushPromptScorer:()=>x,parseFunctionArgs:()=>C,fetchPromptScorer:()=>P,createExample:()=>Et,createBaseScorer:()=>J,createAPIScorer:()=>dt,TracerConfigurationBuilder:()=>D,TracerConfiguration:()=>R,Tracer:()=>T,TracePromptScorer:()=>K,PromptScorer:()=>L,OpenTelemetryKeys:()=>u,NodeTracer:()=>A,NoOpSpanExporter:()=>O,Logger:()=>i,JudgmentSpanExporter:()=>v,JudgmentApiClient:()=>g,JudgmentAPIError:()=>N,JUDGMENT_ORG_ID:()=>E,JUDGMENT_NO_COLOR:()=>it,JUDGMENT_ENABLE_MONITORING:()=>rt,JUDGMENT_ENABLE_EVALUATIONS:()=>nt,JUDGMENT_DEFAULT_GPT_MODEL:()=>I,JUDGMENT_API_URL:()=>d,JUDGMENT_API_KEY:()=>p,ExampleParams:()=>H,BrowserTracer:()=>w,BasePromptScorer:()=>b,APIScorerType:()=>j});var z=S("@opentelemetry/exporter-trace-otlp-http");class v{delegate;constructor(t,e,r,n){if(!n||n.trim()==="")throw Error("projectId is required for JudgmentSpanExporter");this.delegate=new z.OTLPTraceExporter({url:t,headers:{Authorization:`Bearer ${e}`,"X-Organization-Id":r,"X-Project-Id":n}})}static builder(){return new F}export(t,e){this.delegate.export(t,e)}shutdown(){return this.delegate.shutdown()}forceFlush(){return this.delegate.forceFlush?.()??Promise.resolve()}}class F{_endpoint;_apiKey;_organizationId;_projectId;constructor(){}endpoint(t){return this._endpoint=t,this}apiKey(t){return this._apiKey=t,this}organizationId(t){return this._organizationId=t,this}projectId(t){return this._projectId=t,this}build(){if(!this._endpoint||this._endpoint.trim()==="")throw Error("Endpoint is required");if(!this._apiKey||this._apiKey.trim()==="")throw Error("API key is required");if(!this._organizationId||this._organizationId.trim()==="")throw Error("Organization ID is required");if(!this._projectId||this._projectId.trim()==="")throw Error("Project ID is required");return new v(this._endpoint,this._apiKey,this._organizationId,this._projectId)}}class O{export(t,e){e({code:0})}flush(){return Promise.resolve()}shutdown(){return Promise.resolve()}}class u{static AttributeKeys={JUDGMENT_SPAN_KIND:"judgment.span_kind",JUDGMENT_INPUT:"judgment.input",JUDGMENT_OUTPUT:"judgment.output",JUDGMENT_OFFLINE_MODE:"judgment.offline_mode",JUDGMENT_UPDATE_ID:"judgment.update_id",JUDGMENT_CUSTOMER_ID:"judgment.customer_id",JUDGMENT_AGENT_ID:"judgment.agent_id",JUDGMENT_PARENT_AGENT_ID:"judgment.parent_agent_id",JUDGMENT_AGENT_CLASS_NAME:"judgment.agent_class_name",JUDGMENT_AGENT_INSTANCE_NAME:"judgment.agent_instance_name",PENDING_TRACE_EVAL:"judgment.pending_trace_eval",GEN_AI_PROMPT:"gen_ai.prompt",GEN_AI_COMPLETION:"gen_ai.completion",GEN_AI_REQUEST_MODEL:"gen_ai.request.model",GEN_AI_RESPONSE_MODEL:"gen_ai.response.model",GEN_AI_SYSTEM:"gen_ai.system",GEN_AI_USAGE_INPUT_TOKENS:"gen_ai.usage.input_tokens",GEN_AI_USAGE_OUTPUT_TOKENS:"gen_ai.usage.output_tokens",GEN_AI_USAGE_COMPLETION_TOKENS:"gen_ai.usage.completion_tokens",GEN_AI_REQUEST_TEMPERATURE:"gen_ai.request.temperature",GEN_AI_REQUEST_MAX_TOKENS:"gen_ai.request.max_tokens",GEN_AI_RESPONSE_FINISH_REASONS:"gen_ai.response.finish_reasons",GEN_AI_USAGE_TOTAL_COST:"gen_ai.usage.total_cost_usd"};static InternalAttributeKeys={DISABLE_PARTIAL_EMIT:"disable_partial_emit",CANCELLED:"cancelled"};static ResourceKeys={SERVICE_NAME:"service.name",TELEMETRY_SDK_LANGUAGE:"telemetry.sdk.language",TELEMETRY_SDK_NAME:"telemetry.sdk.name",TELEMETRY_SDK_VERSION:"telemetry.sdk.version",JUDGMENT_PROJECT_ID:"judgment.project_id"}}var m=S("@opentelemetry/api");function h(t,e){let r=process.env[t];if(!r)return e??null;return r}var p=h("JUDGMENT_API_KEY"),E=h("JUDGMENT_ORG_ID"),d=h("JUDGMENT_API_URL","https://api.judgmentlabs.ai"),I=h("JUDGMENT_DEFAULT_GPT_MODEL","gpt-4.1"),rt=h("JUDGMENT_ENABLE_MONITORING","true"),nt=h("JUDGMENT_ENABLE_EVALUATIONS","true"),it=h("JUDGMENT_NO_COLOR");class g{baseUrl;apiKey;organizationId;constructor(t,e,r){this.baseUrl=t,this.apiKey=e,this.organizationId=r}buildUrl(t){return this.baseUrl+t}buildHeaders(){if(!this.apiKey||!this.organizationId)throw Error("API key and organization ID cannot be null");return{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`,"X-Organization-Id":this.organizationId}}async addToRunEvalQueueExamples(t){let e=this.buildUrl("/add_to_run_eval_queue/examples"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw Error(`HTTP Error: ${r.status} - ${await r.text()}`);return}async addToRunEvalQueueTraces(t){let e=this.buildUrl("/add_to_run_eval_queue/traces"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw Error(`HTTP Error: ${r.status} - ${await r.text()}`);return}async logEvalResults(t){let e=this.buildUrl("/log_eval_results/"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw Error(`HTTP Error: ${r.status} - ${await r.text()}`);return}async fetchExperimentRun(t){let e=this.buildUrl("/fetch_experiment_run/"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw Error(`HTTP Error: ${r.status} - ${await r.text()}`);return}async getEvaluationStatus(t,e){let r=new URLSearchParams;r.set("experiment_run_id",t),r.set("project_name",e);let n=this.buildUrl("/get_evaluation_status/"+(r.toString()?"?"+r.toString():"")),s=await fetch(n,{method:"GET",headers:this.buildHeaders()});if(!s.ok)throw Error(`HTTP Error: ${s.status} - ${await s.text()}`);return}async scorerExists(t){let e=this.buildUrl("/scorer_exists/"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw Error(`HTTP Error: ${r.status} - ${await r.text()}`);return await r.json()}async saveScorer(t){let e=this.buildUrl("/save_scorer/"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw Error(`HTTP Error: ${r.status} - ${await r.text()}`);return await r.json()}async fetchScorers(t){let e=this.buildUrl("/fetch_scorers/"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw Error(`HTTP Error: ${r.status} - ${await r.text()}`);return await r.json()}async projectsResolve(t){let e=this.buildUrl("/projects/resolve/"),r=await fetch(e,{method:"POST",headers:this.buildHeaders(),body:JSON.stringify(t)});if(!r.ok)throw Error(`HTTP Error: ${r.status} - ${await r.text()}`);return await r.json()}}var st=/^([^(]+?)=>/,ot=/^[^(]*\(\s*([^)]*)\)/m,at=/,/,ct=/^\s*(_?)(\S+?)\1\s*$/,ut=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;function lt(t){return Function.prototype.toString.call(t)}function pt(t){let e=lt(t).replace(ut,"");return e.match(st)||e.match(ot)}function C(t){let e=pt(t);if(!e||!e[1])return[];return e[1].split(at).map((r)=>{return r.replace(ct,(s,a,o)=>o).trim()}).filter((r)=>r.length>0)}class i{static RESET="\x1B[0m";static RED="\x1B[31m";static YELLOW="\x1B[33m";static GRAY="\x1B[90m";static Level={DEBUG:0,INFO:1,WARNING:2,ERROR:3,CRITICAL:4};static initialized=!1;static currentLevel=i.Level.INFO;static useColor=!0;static initialize(){if(!i.initialized){let t=process.env.JUDGMENT_NO_COLOR;i.useColor=!t&&process.stdout.isTTY,i.initialized=!0}}static setLevel(t){i.currentLevel=t}static setUseColor(t){i.useColor=t}static log(t,e){if(i.initialize(),t<i.currentLevel)return;let r=new Date().toISOString().replace("T"," ").substring(0,19),n=Object.keys(i.Level).find((o)=>i.Level[o]===t)||"UNKNOWN",s=`${r} - judgeval - ${n} - ${e}`;if(i.useColor)s=`${t===i.Level.DEBUG||t===i.Level.INFO?i.GRAY:t===i.Level.WARNING?i.YELLOW:i.RED}${s}${i.RESET}`;(t>=i.Level.ERROR?process.stderr:process.stdout).write(s+`
2
+ `)}static debug(t){i.log(i.Level.DEBUG,t)}static info(t){i.log(i.Level.INFO,t)}static warning(t){i.log(i.Level.WARNING,t)}static warn(t){i.log(i.Level.WARNING,t)}static error(t){i.log(i.Level.ERROR,t)}static critical(t){i.log(i.Level.CRITICAL,t)}}class T{static instances=new Map;apiClient;tracer=null;serializer=JSON.stringify;_initialized=!1;projectId=null;configuration;getConfiguration(){return this.configuration}getProjectId(){return this.projectId}getSerializer(){return this.serializer}constructor(t){this.configuration=t,this.apiClient=new g(this.configuration.apiUrl,this.configuration.apiKey,this.configuration.organizationId),this._initialized=!1}async resolveProjectId(){try{i.info(`Resolving project ID for project: ${this.configuration.projectName}`);let t=await this.apiClient.projectsResolve({project_name:this.configuration.projectName});i.info(`Resolved project ID: ${t.project_id}`);let e=t.project_id?.toString();if(!e)throw Error(`Project ID not found for project: ${this.configuration.projectName}`);return this.projectId=e,i.info(`Successfully resolved project ID: ${this.projectId}`),this.projectId}catch(t){throw Error(`Failed to resolve project ID: ${t instanceof Error?t.message:String(t)}`)}}static getExporter(t,e,r){let n=d?.endsWith("/")?`${d}otel/v1/traces`:`${d}/otel/v1/traces`;return v.builder().endpoint(n).apiKey(t).organizationId(e).projectId(r).build()}async getSpanExporter(){try{let t=await this.resolveProjectId();return this.createJudgmentSpanExporter(t)}catch(t){return i.error("Failed to resolve project "+this.configuration.projectName+", please create it first at https://app.judgmentlabs.ai/org/"+(this.configuration.organizationId||"unknown")+"/projects. Skipping Judgment export."),new O}}setSpanKind(t){let e=m.trace.getActiveSpan();if(!e){i.warn("No active span found, skipping setSpanKind");return}if(t!==null)e.setAttribute(u.AttributeKeys.JUDGMENT_SPAN_KIND,t)}setAttribute(t,e){let r=m.trace.getActiveSpan();if(!r){i.warn("No active span found, skipping setAttribute");return}r.setAttribute(t,this.serializer(e))}setLLMSpan(){this.setSpanKind("llm")}setToolSpan(){this.setSpanKind("tool")}setGeneralSpan(){this.setSpanKind("span")}setAttributes(t){if(!t)return;let e=m.trace.getActiveSpan();if(!e){i.warn("No active span found, skipping setAttributes");return}for(let[r,n]of Object.entries(t))e.setAttribute(r,this.serializer(n))}setInput(t){this.setAttribute(u.AttributeKeys.JUDGMENT_INPUT,t)}setOutput(t){this.setAttribute(u.AttributeKeys.JUDGMENT_OUTPUT,t)}asyncEvaluate(t,e,r){if(!this._initialized){i.warn("Tracer not initialized, skipping asyncEvaluate");return}if(!this.configuration.enableEvaluation)return;let n=m.trace.getActiveSpan();if(!n){i.warn("No active span found, skipping asyncEvaluate");return}if(!n.isRecording()){i.warn("Active span is not recording, skipping asyncEvaluate");return}let s=n.spanContext(),a=s.traceId,o=s.spanId;i.info(`asyncEvaluate: project=${this.configuration.projectName}, traceId=${a}, spanId=${o}, scorer=${t.name}`);let c=this.createEvaluationRun(t,e,r,a,o);this.enqueueEvaluation(c)}asyncTraceEvaluate(t,e){if(!this._initialized){i.warn("Tracer not initialized, skipping asyncTraceEvaluate");return}if(!this.configuration.enableEvaluation)return;let r=m.trace.getActiveSpan();if(!r){i.warn("No active span found, skipping asyncTraceEvaluate");return}if(!r.isRecording()){i.warn("Active span is not recording, skipping asyncTraceEvaluate");return}let n=r.spanContext(),s=n.traceId,a=n.spanId;i.info(`asyncTraceEvaluate: project=${this.configuration.projectName}, traceId=${s}, spanId=${a}, scorer=${t.name}`);try{let o=this.createTraceEvaluationRun(t,e,s,a),c=this.serializer(o);r.setAttribute(u.AttributeKeys.PENDING_TRACE_EVAL,c)}catch(o){i.error(`Failed to serialize trace evaluation: ${o instanceof Error?o.message:String(o)}`)}}createTraceEvaluationRun(t,e,r,n){let s=`async_trace_evaluate_${n||Date.now()}`,a=e||I,o=t.getScorerConfig();return{project_name:this.configuration.projectName,eval_name:s,scorer:o,model:a,organization_id:this.configuration.organizationId,trace_id:r,trace_span_id:n}}createJudgmentSpanExporter(t){let e=this.configuration.apiUrl.endsWith("/")?`${this.configuration.apiUrl}otel/v1/traces`:`${this.configuration.apiUrl}/otel/v1/traces`;return v.builder().endpoint(e).apiKey(this.configuration.apiKey).organizationId(this.configuration.organizationId).projectId(t).build()}createEvaluationRun(t,e,r,n,s){let a=`async_evaluate_${s||Date.now()}`,o=r||I,c=t.getScorerConfig();return{project_name:this.configuration.projectName,eval_name:a,examples:[e],custom_scorers:[],judgment_scorers:[c],model:o,trace_id:n,trace_span_id:s}}async enqueueEvaluation(t){if(!this.apiClient){i.warn("API client not available, skipping evaluation enqueue");return}try{await this.apiClient.addToRunEvalQueueExamples(t),i.info(`Enqueuing evaluation run: ${t.eval_name}`)}catch(e){i.error(`Failed to enqueue evaluation run: ${e instanceof Error?e.message:String(e)}`)}}observe(t,e="span"){return(...r)=>{let n=m.trace.getActiveSpan();if(!n)return i.warn("No active span found, skipping observe"),t(...r);let s=t.name||"anonymous",a=m.trace.getTracer(this.configuration.tracerName);return m.context.with(m.trace.setSpan(m.context.active(),n),()=>{return a.startActiveSpan(s,{kind:m.SpanKind.INTERNAL},(o)=>{try{o.setAttribute(u.AttributeKeys.JUDGMENT_SPAN_KIND,e);let c=C(t);if(c.length===r.length){let f={};c.forEach((Y,_)=>{f[Y]=r[_]}),o.setAttribute(u.AttributeKeys.JUDGMENT_INPUT,this.serializer(f))}let l=t(...r);if(l instanceof Promise)return l.then((f)=>{return o.setAttribute(u.AttributeKeys.JUDGMENT_OUTPUT,this.serializer(f)),o.end(),f}).catch((f)=>{throw o.recordException(f),o.end(),f});else return o.setAttribute(u.AttributeKeys.JUDGMENT_OUTPUT,this.serializer(l)),o.end(),l}catch(c){throw o.recordException(c),o.end(),c}})})}}async shutdown(){}}var $="opentelemetry.instrumentation.judgeval";class R{projectName;apiKey;organizationId;apiUrl;enableEvaluation;tracerName;constructor(t,e,r,n,s,a=$){this.projectName=t;this.apiKey=e;this.organizationId=r;this.apiUrl=n;this.enableEvaluation=s;this.tracerName=a}static createDefault(t){return new D().projectName(t).build()}static builder(){return new D}}class D{_projectName;_apiKey=p;_organizationId=E;_apiUrl=d;_enableEvaluation=!0;_tracerName=$;projectName(t){return this._projectName=t,this}apiKey(t){return this._apiKey=t,this}organizationId(t){return this._organizationId=t,this}apiUrl(t){return this._apiUrl=t,this}enableEvaluation(t){return this._enableEvaluation=t,this}tracerName(t){return this._tracerName=t,this}build(){if(!this._projectName)throw Error("Project name is required");if(!this._apiKey)throw Error("API key is required");if(!this._organizationId)throw Error("Organization ID is required");if(!this._apiUrl)throw Error("API URL is required");return new R(this._projectName,this._apiKey,this._organizationId,this._apiUrl,this._enableEvaluation,this._tracerName)}}function Et(t){return{example_id:void 0,created_at:new Date().toISOString(),name:null,...t}}var H;((l)=>{l.INPUT="input";l.ACTUAL_OUTPUT="actual_output";l.EXPECTED_OUTPUT="expected_output";l.CONTEXT="context";l.RETRIEVAL_CONTEXT="retrieval_context";l.TOOLS_CALLED="tools_called";l.EXPECTED_TOOLS="expected_tools";l.ADDITIONAL_METADATA="additional_metadata"})(H||={});function J(){let t={score_type:"",class_name:"",name:"",addModel:(e)=>{t.model=e},successCheck:()=>{if(t.error!=null)return!1;if(t.score==null)return!1;let e=t.threshold??0.5,r=t.score;return e!=null&&r!=null&&r>=e},getRequiredParams:()=>{return[]},getScorerConfig:()=>{return{score_type:t.score_type,name:t.name,threshold:t.threshold??0.5,strict_mode:t.strict_mode??!1,required_params:[],kwargs:{}}}};if(t.class_name="BaseScorer",t.name=t.class_name,t.strict_mode===!0)t.threshold=1;return t}var j;((_)=>{_.PROMPT_SCORER="Prompt Scorer";_.TRACE_PROMPT_SCORER="Trace Prompt Scorer";_.FAITHFULNESS="Faithfulness";_.ANSWER_RELEVANCY="Answer Relevancy";_.ANSWER_CORRECTNESS="Answer Correctness";_.INSTRUCTION_ADHERENCE="Instruction Adherence";_.EXECUTION_ORDER="Execution Order";_.TOOL_ORDER="Tool Order";_.CLASSIFIER="Classifier";_.TOOL_DEPENDENCY="Tool Dependency";_.CUSTOM="Custom"})(j||={});function dt(t,e){let r=J();return r.scoreType=t,r.name=t,r.score_type=t,r.requiredParams=e,r.setThreshold=(n)=>{if(n<0||n>1)throw Error(`Threshold must be between 0 and 1, got: ${n}`);r.threshold=n},r.getScoreType=()=>{return r.scoreType},r.setRequiredParams=(n)=>{r.requiredParams=n},r}class N extends Error{statusCode;constructor(t,e){super(e);this.statusCode=t;this.name="JudgmentAPIError"}}async function x(t,e,r,n,s=p||"",a=E||"",o){if(!d||!s||!a)throw Error("Missing required API credentials");return(await new g(d,s,a).saveScorer({name:t,prompt:e,threshold:r,options:n,is_trace:o})).name}async function P(t,e=p||"",r=E||""){if(!d||!e||!r)throw Error("Missing required API credentials");let s=await new g(d,e,r).fetchScorers({names:[t]});if(s.scorers.length===0)throw new N(404,`Scorer with name ${t} not found`);let{created_at:a,updated_at:o,...c}=s.scorers[0];return c}async function y(t,e=p||"",r=E||""){if(!d||!e||!r)throw Error("Missing required API credentials");return(await new g(d,e,r).scorerExists({name:t})).exists}class b{scoreType;name;prompt;threshold;options;judgmentApiKey;organizationId;requiredParams;score_type;class_name;model;score;error;strict_mode;constructor(t,e,r,n,s,a,o=p||"",c=E||""){this.scoreType=t,this.name=e,this.prompt=r,this.threshold=n,this.requiredParams=s,this.options=a,this.judgmentApiKey=o,this.organizationId=c,this.score_type=t,this.class_name="BasePromptScorer",this.model=void 0,this.score=void 0,this.error=null,this.strict_mode=!1}score_breakdown;reason;using_native_model;success;model_client;additional_metadata;user;server_hosted;static async get(t,e=p||"",r=E||""){let n=await P(t,e,r),s=n.is_trace===!0,a=this.prototype.scoreType==="Trace Prompt Scorer";if(s!==a)throw new N(400,`Scorer with name ${t} is not a ${this.name}`);let o=s?"Trace Prompt Scorer":"Prompt Scorer";return new this(o,n.name,n.prompt,n.threshold,[],n.options,e,r)}static async create(t,e,r=0.5,n,s=p||"",a=E||""){if(await y(t,s,a))throw new N(400,`Scorer with name ${t} already exists. Either use the existing scorer with the get() method or use a new name.`);let o=this.prototype.scoreType==="Trace Prompt Scorer",c=o?"Trace Prompt Scorer":"Prompt Scorer";return await x(t,e,r,n,s,a,o),new this(c,t,e,r,[],n,s,a)}async updateThreshold(t){this.setThreshold(t),await this.pushPromptScorer()}async setPrompt(t){this.prompt=t,await this.pushPromptScorer()}async setOptions(t){this.options=t,await this.pushPromptScorer()}async appendToPrompt(t){this.prompt+=t,await this.pushPromptScorer()}getThreshold(){return this.threshold}getPrompt(){return this.prompt}getOptions(){return this.options?{...this.options}:null}getName(){return this.name}getConfig(){return{name:this.name,prompt:this.prompt,threshold:this.threshold,options:this.options}}async pushPromptScorer(){await x(this.name,this.prompt,this.threshold,this.options,this.judgmentApiKey,this.organizationId)}toString(){return`${this.constructor.name}(name=${this.name}, prompt=${this.prompt}, threshold=${this.threshold}, options=${JSON.stringify(this.options)})`}addModel(t){this.model=t}successCheck(){if(this.error!=null)return!1;if(this.score==null)return!1;let t=this.threshold??0.5,e=this.score;return t!=null&&e!=null&&e>=t}getRequiredParams(){if(Array.isArray(this.requiredParams))return[...this.requiredParams];return[]}setThreshold(t){if(t<0||t>1)throw Error(`Threshold must be between 0 and 1, got: ${t}`);this.threshold=t}getScoreType(){return this.scoreType}setRequiredParams(t){this.requiredParams=t}getScorerConfig(){return{score_type:this.getScoreType(),name:this.getName(),threshold:this.getThreshold(),strict_mode:this.strict_mode??!1,required_params:this.getRequiredParams(),kwargs:{prompt:this.getPrompt(),...this.getOptions()?{options:this.getOptions()}:{}}}}}class L extends b{constructor(t,e,r,n,s=[],a,o=p||"",c=E||""){super(t,e,r,n,s,a,o,c)}}class K extends b{constructor(t,e,r,n,s=[],a,o=p||"",c=E||""){super(t,e,r,n,s,a,o,c)}}var q=S("@opentelemetry/resources"),M=S("@opentelemetry/sdk-trace-web");var U="0.3.2";class w extends T{webTracerProvider;async initialize(t={}){if(this._initialized)return this;try{let e={[u.ResourceKeys.SERVICE_NAME]:this.configuration.projectName,[u.ResourceKeys.TELEMETRY_SDK_VERSION]:U,...t.resourceAttributes},r=await this.getSpanExporter();return this.webTracerProvider=new M.WebTracerProvider({resource:q.resourceFromAttributes(e),spanProcessors:[new M.BatchSpanProcessor(r)]}),this.webTracerProvider.register(),this._initialized=!0,this}catch(e){throw Error(`Failed to initialize browser tracer: ${e instanceof Error?e.message:String(e)}`)}}static getInstance(t){let e=`BrowserTracer:${t.projectName}`;if(!T.instances.has(e))T.instances.set(e,new w(t));return T.instances.get(e)}static createDefault(t){let e=R.builder().projectName(t).build();return w.getInstance(e)}static createWithConfiguration(t){return new w(t)}}var B=S("@opentelemetry/resources"),V=S("@opentelemetry/sdk-node"),W=S("@opentelemetry/sdk-trace-node");class A extends T{nodeSDK;async initialize(t={}){if(this._initialized)return this;try{let e={[u.ResourceKeys.SERVICE_NAME]:this.configuration.projectName,[u.ResourceKeys.TELEMETRY_SDK_VERSION]:U,...t.resourceAttributes},r=await this.getSpanExporter();return this.nodeSDK=new V.NodeSDK({resource:B.resourceFromAttributes(e),instrumentations:t.instrumentations,spanProcessor:new W.BatchSpanProcessor(r),...t}),this.nodeSDK.start(),this._initialized=!0,this}catch(e){throw Error(`Failed to initialize node tracer: ${e instanceof Error?e.message:String(e)}`)}}static getInstance(t){let e=`NodeTracer:${t.projectName}`;if(!T.instances.has(e))T.instances.set(e,new A(t));return T.instances.get(e)}static createDefault(t){let e=R.builder().projectName(t).enableEvaluation(!0).build();return A.getInstance(e)}static createWithConfiguration(t){return new A(t)}async shutdown(){if(this.nodeSDK)await this.nodeSDK.shutdown()}}})();
3
+
4
+ //# debugId=B7CCA58D2A18793064756E2164756E21
5
+ //# sourceMappingURL=index.umd.js.map
@@ -1 +1,30 @@
1
- {"version":3,"file":"index.umd.js","mappings":"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","sources":["webpack://JudgevalJS/webpack/universalModuleDefinition","webpack://JudgevalJS/external umd \"@opentelemetry/sdk-trace-node\"","webpack://JudgevalJS/external umd \"@opentelemetry/exporter-trace-otlp-http\"","webpack://JudgevalJS/external umd \"@opentelemetry/api\"","webpack://JudgevalJS/external umd \"@opentelemetry/sdk-trace-web\"","webpack://JudgevalJS/external umd \"@opentelemetry/resources\"","webpack://JudgevalJS/external umd \"@opentelemetry/sdk-node\"","webpack://JudgevalJS/webpack/bootstrap","webpack://JudgevalJS/webpack/runtime/define property getters","webpack://JudgevalJS/webpack/runtime/hasOwnProperty shorthand","webpack://JudgevalJS/webpack/runtime/make namespace object","webpack://JudgevalJS/./src/tracer/exporters/JudgmentSpanExporter.ts","webpack://JudgevalJS/./src/tracer/exporters/NoOpSpanExporter.ts","webpack://JudgevalJS/./src/tracer/OpenTelemetryKeys.ts","webpack://JudgevalJS/./src/env.ts","webpack://JudgevalJS/./src/internal/api/index.ts","webpack://JudgevalJS/./src/utils/annotate.ts","webpack://JudgevalJS/./src/utils/logger.ts","webpack://JudgevalJS/./src/tracer/Tracer.ts","webpack://JudgevalJS/./src/constants.ts","webpack://JudgevalJS/./src/tracer/TracerConfiguration.ts","webpack://JudgevalJS/./src/data/example.ts","webpack://JudgevalJS/./src/data/example-params.ts","webpack://JudgevalJS/./src/scorers/api-scorer.ts","webpack://JudgevalJS/./src/scorers/base-scorer.ts","webpack://JudgevalJS/./src/scorers/api_scorers/prompt_scorer/prompt-scorer-utils.ts","webpack://JudgevalJS/./src/scorers/api_scorers/prompt_scorer/base-prompt-scorer.ts","webpack://JudgevalJS/./src/scorers/api_scorers/prompt_scorer/prompt-scorer.ts","webpack://JudgevalJS/./src/scorers/api_scorers/prompt_scorer/trace-prompt-scorer.ts","webpack://JudgevalJS/./src/version.ts","webpack://JudgevalJS/./src/tracer/BrowserTracer.ts","webpack://JudgevalJS/./src/tracer/NodeTracer.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"@opentelemetry/exporter-trace-otlp-http\"), require(\"@opentelemetry/api\"), require(\"@opentelemetry/resources\"), require(\"@opentelemetry/sdk-trace-web\"), require(\"@opentelemetry/sdk-node\"), require(\"@opentelemetry/sdk-trace-node\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"@opentelemetry/exporter-trace-otlp-http\", \"@opentelemetry/api\", \"@opentelemetry/resources\", \"@opentelemetry/sdk-trace-web\", \"@opentelemetry/sdk-node\", \"@opentelemetry/sdk-trace-node\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"JudgevalJS\"] = factory(require(\"@opentelemetry/exporter-trace-otlp-http\"), require(\"@opentelemetry/api\"), require(\"@opentelemetry/resources\"), require(\"@opentelemetry/sdk-trace-web\"), require(\"@opentelemetry/sdk-node\"), require(\"@opentelemetry/sdk-trace-node\"));\n\telse\n\t\troot[\"JudgevalJS\"] = factory(root[\"@opentelemetry/exporter-trace-otlp-http\"], root[\"@opentelemetry/api\"], root[\"@opentelemetry/resources\"], root[\"@opentelemetry/sdk-trace-web\"], root[\"@opentelemetry/sdk-node\"], root[\"@opentelemetry/sdk-trace-node\"]);\n})(this, (__WEBPACK_EXTERNAL_MODULE__186__, __WEBPACK_EXTERNAL_MODULE__276__, __WEBPACK_EXTERNAL_MODULE__625__, __WEBPACK_EXTERNAL_MODULE__404__, __WEBPACK_EXTERNAL_MODULE__839__, __WEBPACK_EXTERNAL_MODULE__67__) => {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE__67__;","module.exports = __WEBPACK_EXTERNAL_MODULE__186__;","module.exports = __WEBPACK_EXTERNAL_MODULE__276__;","module.exports = __WEBPACK_EXTERNAL_MODULE__404__;","module.exports = __WEBPACK_EXTERNAL_MODULE__625__;","module.exports = __WEBPACK_EXTERNAL_MODULE__839__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { ExportResult } from \"@opentelemetry/core\";\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\";\nimport { ReadableSpan, SpanExporter } from \"@opentelemetry/sdk-trace-base\";\n\n/**\n * SpanExporter implementation that sends spans to Judgment Labs with project identification.\n *\n * This exporter wraps the OTLP HTTP exporter and adds Judgment Labs specific headers and project\n * identification to all exported spans.\n */\nexport class JudgmentSpanExporter implements SpanExporter {\n private readonly delegate: SpanExporter;\n\n /**\n * Creates a new JudgmentSpanExporter with the specified configuration.\n *\n * @param endpoint the OTLP endpoint URL\n * @param apiKey the API key for authentication\n * @param organizationId the organization ID\n * @param projectId the project ID (must not be null or empty)\n * @throws Error if projectId is null or empty\n */\n constructor(\n endpoint: string,\n apiKey: string,\n organizationId: string,\n projectId: string,\n ) {\n if (!projectId || projectId.trim() === \"\") {\n throw new Error(\"projectId is required for JudgmentSpanExporter\");\n }\n\n this.delegate = new OTLPTraceExporter({\n url: endpoint,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"X-Organization-Id\": organizationId,\n \"X-Project-Id\": projectId,\n },\n });\n }\n\n /**\n * Creates a new builder for constructing JudgmentSpanExporter instances.\n */\n public static builder(): JudgmentSpanExporterBuilder {\n return new JudgmentSpanExporterBuilder();\n }\n\n /**\n * Exports a collection of spans.\n */\n export(\n spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n this.delegate.export(spans, resultCallback);\n }\n\n /**\n * Shuts down the exporter.\n */\n shutdown(): Promise<void> {\n return this.delegate.shutdown();\n }\n\n /**\n * Forces the exporter to flush any pending spans.\n */\n forceFlush(): Promise<void> {\n return this.delegate.forceFlush?.() ?? Promise.resolve();\n }\n}\n\n/**\n * Builder for creating JudgmentSpanExporter instances.\n */\nexport class JudgmentSpanExporterBuilder {\n private _endpoint?: string;\n private _apiKey?: string;\n private _organizationId?: string;\n private _projectId?: string;\n\n constructor() {}\n\n /**\n * Sets the OTLP endpoint URL.\n *\n * @param endpoint the endpoint URL\n * @return this builder for method chaining\n */\n public endpoint(endpoint: string): this {\n this._endpoint = endpoint;\n return this;\n }\n\n /**\n * Sets the API key for authentication.\n *\n * @param apiKey the API key\n * @return this builder for method chaining\n */\n public apiKey(apiKey: string): this {\n this._apiKey = apiKey;\n return this;\n }\n\n /**\n * Sets the organization ID.\n *\n * @param organizationId the organization ID\n * @return this builder for method chaining\n */\n public organizationId(organizationId: string): this {\n this._organizationId = organizationId;\n return this;\n }\n\n /**\n * Sets the project ID.\n *\n * @param projectId the project ID\n * @return this builder for method chaining\n */\n public projectId(projectId: string): this {\n this._projectId = projectId;\n return this;\n }\n\n /**\n * Builds a new JudgmentSpanExporter with the current configuration.\n *\n * @return a new JudgmentSpanExporter instance\n * @throws Error if required fields are missing\n */\n public build(): JudgmentSpanExporter {\n if (!this._endpoint || this._endpoint.trim() === \"\") {\n throw new Error(\"Endpoint is required\");\n }\n if (!this._apiKey || this._apiKey.trim() === \"\") {\n throw new Error(\"API key is required\");\n }\n if (!this._organizationId || this._organizationId.trim() === \"\") {\n throw new Error(\"Organization ID is required\");\n }\n if (!this._projectId || this._projectId.trim() === \"\") {\n throw new Error(\"Project ID is required\");\n }\n\n return new JudgmentSpanExporter(\n this._endpoint,\n this._apiKey,\n this._organizationId,\n this._projectId,\n );\n }\n}\n","import { ExportResult } from \"@opentelemetry/core\";\nimport { ReadableSpan, SpanExporter } from \"@opentelemetry/sdk-trace-base\";\n\n/**\n * A no-op span exporter that does nothing.\n * Used when project resolution fails or tracing is disabled.\n */\nexport class NoOpSpanExporter implements SpanExporter {\n export(\n spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n resultCallback({ code: 0 });\n }\n\n flush(): Promise<void> {\n return Promise.resolve();\n }\n\n shutdown(): Promise<void> {\n return Promise.resolve();\n }\n}\n","export abstract class OpenTelemetryKeys {\n public static readonly AttributeKeys = {\n JUDGMENT_SPAN_KIND: \"judgment.span_kind\",\n JUDGMENT_INPUT: \"judgment.input\",\n JUDGMENT_OUTPUT: \"judgment.output\",\n JUDGMENT_OFFLINE_MODE: \"judgment.offline_mode\",\n JUDGMENT_UPDATE_ID: \"judgment.update_id\",\n\n JUDGMENT_CUSTOMER_ID: \"judgment.customer_id\",\n\n JUDGMENT_AGENT_ID: \"judgment.agent_id\",\n\n JUDGMENT_PARENT_AGENT_ID: \"judgment.parent_agent_id\",\n JUDGMENT_AGENT_CLASS_NAME: \"judgment.agent_class_name\",\n JUDGMENT_AGENT_INSTANCE_NAME: \"judgment.agent_instance_name\",\n\n PENDING_TRACE_EVAL: \"judgment.pending_trace_eval\",\n\n GEN_AI_PROMPT: \"gen_ai.prompt\",\n GEN_AI_COMPLETION: \"gen_ai.completion\",\n GEN_AI_REQUEST_MODEL: \"gen_ai.request.model\",\n GEN_AI_RESPONSE_MODEL: \"gen_ai.response.model\",\n GEN_AI_SYSTEM: \"gen_ai.system\",\n GEN_AI_USAGE_INPUT_TOKENS: \"gen_ai.usage.input_tokens\",\n GEN_AI_USAGE_OUTPUT_TOKENS: \"gen_ai.usage.output_tokens\",\n GEN_AI_USAGE_COMPLETION_TOKENS: \"gen_ai.usage.completion_tokens\",\n GEN_AI_REQUEST_TEMPERATURE: \"gen_ai.request.temperature\",\n GEN_AI_REQUEST_MAX_TOKENS: \"gen_ai.request.max_tokens\",\n GEN_AI_RESPONSE_FINISH_REASONS: \"gen_ai.response.finish_reasons\",\n\n GEN_AI_USAGE_TOTAL_COST: \"gen_ai.usage.total_cost_usd\",\n } as const;\n\n public static readonly InternalAttributeKeys = {\n DISABLE_PARTIAL_EMIT: \"disable_partial_emit\",\n CANCELLED: \"cancelled\",\n } as const;\n\n public static readonly ResourceKeys = {\n SERVICE_NAME: \"service.name\",\n TELEMETRY_SDK_LANGUAGE: \"telemetry.sdk.language\",\n TELEMETRY_SDK_NAME: \"telemetry.sdk.name\",\n TELEMETRY_SDK_VERSION: \"telemetry.sdk.version\",\n JUDGMENT_PROJECT_ID: \"judgment.project_id\",\n } as const;\n}\n","function getEnvVar(varName: string): string | null;\nfunction getEnvVar(varName: string, defaultValue: string): string;\nfunction getEnvVar(varName: string, defaultValue?: string): string | null {\n const value = process.env[varName];\n if (!value) {\n return defaultValue ?? null;\n }\n return value;\n}\n\nexport const JUDGMENT_API_KEY = getEnvVar(\"JUDGMENT_API_KEY\");\nexport const JUDGMENT_ORG_ID = getEnvVar(\"JUDGMENT_ORG_ID\");\nexport const JUDGMENT_API_URL = getEnvVar(\n \"JUDGMENT_API_URL\",\n \"https://api.judgmentlabs.ai\",\n);\nexport const JUDGMENT_DEFAULT_GPT_MODEL = getEnvVar(\n \"JUDGMENT_DEFAULT_GPT_MODEL\",\n \"gpt-4.1\",\n);\nexport const JUDGMENT_ENABLE_MONITORING = getEnvVar(\n \"JUDGMENT_ENABLE_MONITORING\",\n \"true\",\n);\nexport const JUDGMENT_ENABLE_EVALUATIONS = getEnvVar(\n \"JUDGMENT_ENABLE_EVALUATIONS\",\n \"true\",\n);\nexport const JUDGMENT_NO_COLOR = getEnvVar(\"JUDGMENT_NO_COLOR\");\n","/**\n * Auto-generated by scripts/generate-client.ts\n * DO NOT EDIT MANUALLY - This file is generated automatically\n */\nimport * as Models from \"./models\";\n\nexport class JudgmentApiClient {\n private baseUrl: string;\n private apiKey: string;\n private organizationId: string;\n\n constructor(baseUrl: string, apiKey: string, organizationId: string) {\n this.baseUrl = baseUrl;\n this.apiKey = apiKey;\n this.organizationId = organizationId;\n }\n\n private buildUrl(path: string): string {\n return this.baseUrl + path;\n }\n\n private buildHeaders(): Record<string, string> {\n if (!this.apiKey || !this.organizationId) {\n throw new Error(\"API key and organization ID cannot be null\");\n }\n return {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n \"X-Organization-Id\": this.organizationId,\n };\n }\n\n async addToRunEvalQueueExamples(\n payload: Models.ExampleEvaluationRun,\n ): Promise<void> {\n const url = this.buildUrl(\"/add_to_run_eval_queue/examples\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async addToRunEvalQueueTraces(\n payload: Models.TraceEvaluationRun,\n ): Promise<void> {\n const url = this.buildUrl(\"/add_to_run_eval_queue/traces\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async logEvalResults(payload: Models.EvalResults): Promise<void> {\n const url = this.buildUrl(\"/log_eval_results/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async fetchExperimentRun(payload: Models.EvalResultsFetch): Promise<void> {\n const url = this.buildUrl(\"/fetch_experiment_run/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async getEvaluationStatus(\n experiment_run_id: string,\n project_name: string,\n ): Promise<void> {\n const queryParams = new URLSearchParams();\n queryParams.set(\"experiment_run_id\", experiment_run_id);\n queryParams.set(\"project_name\", project_name);\n const url = this.buildUrl(\n \"/get_evaluation_status/\" +\n (queryParams.toString() ? \"?\" + queryParams.toString() : \"\"),\n );\n const response = await fetch(url, {\n method: \"GET\",\n headers: this.buildHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async scorerExists(\n payload: Models.ScorerExistsRequest,\n ): Promise<Models.ScorerExistsResponse> {\n const url = this.buildUrl(\"/scorer_exists/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return (await response.json()) as Models.ScorerExistsResponse;\n }\n\n async saveScorer(\n payload: Models.SavePromptScorerRequest,\n ): Promise<Models.SavePromptScorerResponse> {\n const url = this.buildUrl(\"/save_scorer/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return (await response.json()) as Models.SavePromptScorerResponse;\n }\n\n async fetchScorers(\n payload: Models.FetchPromptScorersRequest,\n ): Promise<Models.FetchPromptScorersResponse> {\n const url = this.buildUrl(\"/fetch_scorers/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return (await response.json()) as Models.FetchPromptScorersResponse;\n }\n\n async projectsResolve(\n payload: Models.ResolveProjectNameRequest,\n ): Promise<Models.ResolveProjectNameResponse> {\n const url = this.buildUrl(\"/projects/resolve/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return (await response.json()) as Models.ResolveProjectNameResponse;\n }\n}\n","// Adopted from https://github.com/angular/angular.js/blob/master/src/auto/injector.js\n\nconst ARROW_ARG = /^([^(]+?)=>/;\nconst FN_ARGS = /^[^(]*\\(\\s*([^)]*)\\)/m;\nconst FN_ARG_SPLIT = /,/;\nconst FN_ARG = /^\\s*(_?)(\\S+?)\\1\\s*$/;\nconst STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;\n\nfunction stringifyFn(fn: Function): string {\n return Function.prototype.toString.call(fn);\n}\n\nfunction extractArgs(fn: Function): RegExpMatchArray | null {\n const fnText = stringifyFn(fn).replace(STRIP_COMMENTS, \"\");\n return fnText.match(ARROW_ARG) || fnText.match(FN_ARGS);\n}\n\nexport function parseFunctionArgs(fn: Function): string[] {\n const args = extractArgs(fn);\n if (!args || !args[1]) {\n return [];\n }\n\n return args[1]\n .split(FN_ARG_SPLIT)\n .map((arg) => {\n const match = arg.replace(FN_ARG, (all, underscore, name) => name);\n return match.trim();\n })\n .filter((name) => name.length > 0);\n}\n","export class Logger {\n private static readonly RESET = \"\\x1b[0m\";\n private static readonly RED = \"\\x1b[31m\";\n private static readonly YELLOW = \"\\x1b[33m\";\n private static readonly GRAY = \"\\x1b[90m\";\n\n public static Level = {\n DEBUG: 0,\n INFO: 1,\n WARNING: 2,\n ERROR: 3,\n CRITICAL: 4,\n } as const;\n\n private static initialized = false;\n private static currentLevel: number = Logger.Level.INFO;\n private static useColor = true;\n\n private static initialize(): void {\n if (!Logger.initialized) {\n const noColor = process.env.JUDGMENT_NO_COLOR;\n Logger.useColor = !noColor && process.stdout.isTTY;\n Logger.initialized = true;\n }\n }\n\n public static setLevel(level: number): void {\n Logger.currentLevel = level;\n }\n\n public static setUseColor(useColor: boolean): void {\n Logger.useColor = useColor;\n }\n\n private static log(level: number, message: string): void {\n Logger.initialize();\n\n if (level < Logger.currentLevel) {\n return;\n }\n\n const timestamp = new Date()\n .toISOString()\n .replace(\"T\", \" \")\n .substring(0, 19);\n const levelName =\n Object.keys(Logger.Level).find(\n (key) => Logger.Level[key as keyof typeof Logger.Level] === level,\n ) || \"UNKNOWN\";\n let formattedMessage = `${timestamp} - judgeval - ${levelName} - ${message}`;\n\n if (Logger.useColor) {\n const color =\n level === Logger.Level.DEBUG || level === Logger.Level.INFO\n ? Logger.GRAY\n : level === Logger.Level.WARNING\n ? Logger.YELLOW\n : Logger.RED;\n formattedMessage = `${color}${formattedMessage}${Logger.RESET}`;\n }\n\n const output =\n level >= Logger.Level.ERROR ? process.stderr : process.stdout;\n output.write(formattedMessage + \"\\n\");\n }\n\n public static debug(message: string): void {\n Logger.log(Logger.Level.DEBUG, message);\n }\n\n public static info(message: string): void {\n Logger.log(Logger.Level.INFO, message);\n }\n\n public static warning(message: string): void {\n Logger.log(Logger.Level.WARNING, message);\n }\n\n public static warn(message: string): void {\n Logger.log(Logger.Level.WARNING, message);\n }\n\n public static error(message: string): void {\n Logger.log(Logger.Level.ERROR, message);\n }\n\n public static critical(message: string): void {\n Logger.log(Logger.Level.CRITICAL, message);\n }\n}\n","import {\n context,\n SpanKind as OpenTelemetrySpanKind,\n trace,\n} from \"@opentelemetry/api\";\nimport { JUDGMENT_API_URL, JUDGMENT_DEFAULT_GPT_MODEL } from \"../env\";\nimport { JudgmentApiClient } from \"../internal/api\";\nimport {\n ExampleEvaluationRun,\n Example as ExampleModel,\n} from \"../internal/api/models\";\nimport { BaseScorer } from \"../scorers/base-scorer\";\nimport { parseFunctionArgs } from \"../utils/annotate\";\nimport { Logger } from \"../utils/logger\";\nimport { JudgmentSpanExporter, NoOpSpanExporter } from \"./exporters\";\nimport { OpenTelemetryKeys } from \"./OpenTelemetryKeys\";\nimport { TracerConfiguration } from \"./TracerConfiguration\";\n\nexport type Serializer = (obj: unknown) => string;\ntype SpanKind = (\"llm\" | \"tool\" | \"span\") & {};\n\nexport type TracerInitializeOptions = {\n resourceAttributes?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\nexport abstract class Tracer {\n protected static instances: Map<string, Tracer> = new Map();\n\n public apiClient: JudgmentApiClient;\n public tracer: unknown = null;\n public serializer: Serializer = JSON.stringify;\n\n protected _initialized: boolean = false;\n\n private projectId: string | null = null;\n protected configuration: TracerConfiguration;\n\n public getConfiguration(): TracerConfiguration {\n return this.configuration;\n }\n\n public getProjectId(): string | null {\n return this.projectId;\n }\n\n public getSerializer(): Serializer {\n return this.serializer;\n }\n\n public constructor(configuration: TracerConfiguration) {\n this.configuration = configuration;\n\n this.apiClient = new JudgmentApiClient(\n this.configuration.apiUrl,\n this.configuration.apiKey,\n this.configuration.organizationId,\n );\n\n this._initialized = false;\n }\n\n public abstract initialize(options: TracerInitializeOptions): Promise<Tracer>;\n\n private async resolveProjectId(): Promise<string> {\n try {\n Logger.info(\n `Resolving project ID for project: ${this.configuration.projectName}`,\n );\n\n const response = await this.apiClient.projectsResolve({\n project_name: this.configuration.projectName,\n });\n Logger.info(`Resolved project ID: ${response.project_id}`);\n const resolvedProjectId = response.project_id?.toString();\n\n if (!resolvedProjectId) {\n throw new Error(\n `Project ID not found for project: ${this.configuration.projectName}`,\n );\n }\n\n this.projectId = resolvedProjectId;\n Logger.info(`Successfully resolved project ID: ${this.projectId}`);\n\n return this.projectId;\n } catch (error) {\n throw new Error(\n `Failed to resolve project ID: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n public static getExporter(\n apiKey: string,\n organizationId: string,\n projectId: string,\n ): JudgmentSpanExporter {\n const endpoint = JUDGMENT_API_URL?.endsWith(\"/\")\n ? `${JUDGMENT_API_URL}otel/v1/traces`\n : `${JUDGMENT_API_URL}/otel/v1/traces`;\n\n return JudgmentSpanExporter.builder()\n .endpoint(endpoint)\n .apiKey(apiKey)\n .organizationId(organizationId)\n .projectId(projectId)\n .build();\n }\n\n public async getSpanExporter(): Promise<\n JudgmentSpanExporter | NoOpSpanExporter\n > {\n try {\n const projectId = await this.resolveProjectId();\n return this.createJudgmentSpanExporter(projectId);\n } catch (error) {\n Logger.error(\n \"Failed to resolve project \" +\n this.configuration.projectName +\n \", please create it first at https://app.judgmentlabs.ai/org/\" +\n (this.configuration.organizationId || \"unknown\") +\n \"/projects. Skipping Judgment export.\",\n );\n return new NoOpSpanExporter();\n }\n }\n\n public setSpanKind(kind: SpanKind): void {\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping setSpanKind\");\n return;\n }\n if (kind !== null) {\n currentSpan.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_SPAN_KIND,\n kind,\n );\n }\n }\n\n public setAttribute(key: string, value: unknown): void {\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping setAttribute\");\n return;\n }\n currentSpan.setAttribute(key, this.serializer(value));\n }\n\n public setLLMSpan(): void {\n this.setSpanKind(\"llm\");\n }\n\n public setToolSpan(): void {\n this.setSpanKind(\"tool\");\n }\n\n public setGeneralSpan(): void {\n this.setSpanKind(\"span\");\n }\n\n public setAttributes(attributes: Record<string, unknown>): void {\n if (!attributes) {\n return;\n }\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping setAttributes\");\n return;\n }\n for (const [key, value] of Object.entries(attributes)) {\n currentSpan.setAttribute(key, this.serializer(value));\n }\n }\n\n public setInput(input: unknown): void {\n this.setAttribute(OpenTelemetryKeys.AttributeKeys.JUDGMENT_INPUT, input);\n }\n\n public setOutput(output: unknown): void {\n this.setAttribute(OpenTelemetryKeys.AttributeKeys.JUDGMENT_OUTPUT, output);\n }\n\n public asyncEvaluate(\n scorer: BaseScorer,\n example: ExampleModel,\n model?: string,\n ): void {\n if (!this._initialized) {\n Logger.warn(\"Tracer not initialized, skipping asyncEvaluate\");\n return;\n }\n\n if (!this.configuration.enableEvaluation) {\n return;\n }\n\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping asyncEvaluate\");\n return;\n }\n if (!currentSpan.isRecording()) {\n Logger.warn(\"Active span is not recording, skipping asyncEvaluate\");\n return;\n }\n\n const spanContext = currentSpan.spanContext();\n const traceId = spanContext.traceId;\n const spanId = spanContext.spanId;\n\n Logger.info(\n `asyncEvaluate: project=${this.configuration.projectName}, traceId=${traceId}, spanId=${spanId}, scorer=${scorer.name}`,\n );\n\n const evaluationRun = this.createEvaluationRun(\n scorer,\n example,\n model,\n traceId,\n spanId,\n );\n this.enqueueEvaluation(evaluationRun);\n }\n\n public asyncTraceEvaluate(scorer: BaseScorer, model?: string): void {\n if (!this._initialized) {\n Logger.warn(\"Tracer not initialized, skipping asyncTraceEvaluate\");\n return;\n }\n\n if (!this.configuration.enableEvaluation) {\n return;\n }\n\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping asyncTraceEvaluate\");\n return;\n }\n if (!currentSpan.isRecording()) {\n Logger.warn(\"Active span is not recording, skipping asyncTraceEvaluate\");\n return;\n }\n\n const spanContext = currentSpan.spanContext();\n const traceId = spanContext.traceId;\n const spanId = spanContext.spanId;\n\n Logger.info(\n `asyncTraceEvaluate: project=${this.configuration.projectName}, traceId=${traceId}, spanId=${spanId}, scorer=${scorer.name}`,\n );\n\n try {\n const traceEvaluationRun = this.createTraceEvaluationRun(\n scorer,\n model,\n traceId,\n spanId,\n );\n const traceEvalJson = this.serializer(traceEvaluationRun);\n currentSpan.setAttribute(\n OpenTelemetryKeys.AttributeKeys.PENDING_TRACE_EVAL,\n traceEvalJson,\n );\n } catch (error) {\n Logger.error(\n `Failed to serialize trace evaluation: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n private createTraceEvaluationRun(\n scorer: BaseScorer,\n model: string | undefined,\n traceId: string,\n spanId: string,\n ): Record<string, unknown> {\n const evalName = `async_trace_evaluate_${spanId || Date.now()}`;\n const modelName = model || JUDGMENT_DEFAULT_GPT_MODEL;\n\n const scorerConfig = scorer.getScorerConfig();\n\n return {\n project_name: this.configuration.projectName,\n eval_name: evalName,\n scorer: scorerConfig,\n model: modelName,\n organization_id: this.configuration.organizationId,\n trace_id: traceId,\n trace_span_id: spanId,\n };\n }\n\n private createJudgmentSpanExporter(projectId: string): JudgmentSpanExporter {\n const endpoint = this.configuration.apiUrl.endsWith(\"/\")\n ? `${this.configuration.apiUrl}otel/v1/traces`\n : `${this.configuration.apiUrl}/otel/v1/traces`;\n\n return JudgmentSpanExporter.builder()\n .endpoint(endpoint)\n .apiKey(this.configuration.apiKey)\n .organizationId(this.configuration.organizationId)\n .projectId(projectId)\n .build();\n }\n\n private createEvaluationRun(\n scorer: BaseScorer,\n example: ExampleModel,\n model: string | undefined,\n traceId: string,\n spanId: string,\n ): ExampleEvaluationRun {\n const runId = `async_evaluate_${spanId || Date.now()}`;\n const modelName = model || JUDGMENT_DEFAULT_GPT_MODEL;\n\n const scorerConfig = scorer.getScorerConfig();\n\n const evaluationRun: ExampleEvaluationRun = {\n project_name: this.configuration.projectName,\n eval_name: runId,\n examples: [example],\n custom_scorers: [],\n judgment_scorers: [scorerConfig],\n model: modelName,\n trace_id: traceId,\n trace_span_id: spanId,\n };\n\n return evaluationRun;\n }\n\n private async enqueueEvaluation(\n evaluationRun: ExampleEvaluationRun,\n ): Promise<void> {\n if (!this.apiClient) {\n Logger.warn(\"API client not available, skipping evaluation enqueue\");\n return;\n }\n\n try {\n await this.apiClient.addToRunEvalQueueExamples(evaluationRun);\n Logger.info(`Enqueuing evaluation run: ${evaluationRun.eval_name}`);\n } catch (error) {\n Logger.error(\n `Failed to enqueue evaluation run: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n public observe<TArgs extends any[], TResult>(\n func: (...args: TArgs) => TResult,\n spanKind: SpanKind = \"span\",\n ): (...args: TArgs) => TResult {\n return (...args: TArgs) => {\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping observe\");\n return func(...args);\n }\n\n const spanName = func.name || \"anonymous\";\n const tracer = trace.getTracer(this.configuration.tracerName);\n\n return context.with(trace.setSpan(context.active(), currentSpan), () => {\n return tracer.startActiveSpan(\n spanName,\n { kind: OpenTelemetrySpanKind.INTERNAL },\n (span) => {\n try {\n span.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_SPAN_KIND,\n spanKind,\n );\n\n const argNames = parseFunctionArgs(func);\n if (argNames.length === args.length) {\n const inputObj: Record<string, unknown> = {};\n argNames.forEach((name, index) => {\n inputObj[name] = args[index];\n });\n span.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_INPUT,\n this.serializer(inputObj),\n );\n }\n\n const result = func(...args);\n\n if (result instanceof Promise) {\n return result\n .then((res) => {\n span.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_OUTPUT,\n this.serializer(res),\n );\n span.end();\n return res;\n })\n .catch((err) => {\n span.recordException(err as Error);\n span.end();\n throw err;\n }) as TResult;\n } else {\n span.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_OUTPUT,\n this.serializer(result),\n );\n span.end();\n return result;\n }\n } catch (err) {\n span.recordException(err as Error);\n span.end();\n throw err;\n }\n },\n );\n });\n };\n }\n\n public async shutdown(): Promise<void> {}\n}\n","export const JUDGEVAL_TRACER_INSTRUMENTING_MODULE_NAME =\n \"opentelemetry.instrumentation.judgeval\" as const;\n","import { JUDGEVAL_TRACER_INSTRUMENTING_MODULE_NAME } from \"../constants\";\nimport { JUDGMENT_API_KEY, JUDGMENT_API_URL, JUDGMENT_ORG_ID } from \"../env\";\n\n/**\n * Configuration for the Judgment Tracer that controls how tracing and evaluation behave.\n *\n * This class encapsulates all configuration parameters needed to initialize a Tracer.\n *\n * @example\n * ```typescript\n * const config = TracerConfiguration.builder()\n * .projectName(\"my-project\")\n * .apiKey(\"your-api-key\")\n * .organizationId(\"your-org-id\")\n * .enableEvaluation(true)\n * .build();\n *\n * const tracer = Tracer.createWithConfiguration(config);\n * ```\n */\nexport class TracerConfiguration {\n constructor(\n public readonly projectName: string,\n public readonly apiKey: string,\n public readonly organizationId: string,\n public readonly apiUrl: string,\n public readonly enableEvaluation: boolean,\n public readonly tracerName: string = JUDGEVAL_TRACER_INSTRUMENTING_MODULE_NAME,\n ) {}\n\n /**\n * Creates a default configuration with the given project name.\n *\n * This method uses default values from environment variables:\n * - API Key: JUDGMENT_API_KEY\n * - Organization ID: JUDGMENT_ORG_ID\n * - API URL: JUDGMENT_API_URL\n * - Evaluation: enabled\n *\n * @param projectName the name of the project\n * @returns a new TracerConfiguration with default values\n * @throws Error if project name is null or empty\n */\n public static createDefault(projectName: string): TracerConfiguration {\n return new TracerConfigurationBuilder().projectName(projectName).build();\n }\n\n public static builder(): TracerConfigurationBuilder {\n return new TracerConfigurationBuilder();\n }\n}\n\n/**\n * Builder for creating TracerConfiguration instances.\n *\n * @example\n * ```typescript\n * const config = TracerConfiguration.builder()\n * .projectName(\"my-project\")\n * .apiKey(\"custom-api-key\")\n * .organizationId(\"custom-org-id\")\n * .apiUrl(\"https://custom-api.judgmentlabs.ai\")\n * .enableEvaluation(false)\n * .build();\n * ```\n */\nexport class TracerConfigurationBuilder {\n private _projectName?: string;\n private _apiKey: string | null = JUDGMENT_API_KEY;\n private _organizationId: string | null = JUDGMENT_ORG_ID;\n private _apiUrl: string = JUDGMENT_API_URL;\n private _enableEvaluation: boolean = true;\n private _tracerName: string = JUDGEVAL_TRACER_INSTRUMENTING_MODULE_NAME;\n\n public projectName(projectName: string): this {\n this._projectName = projectName;\n return this;\n }\n\n public apiKey(apiKey: string): this {\n this._apiKey = apiKey;\n return this;\n }\n\n public organizationId(organizationId: string): this {\n this._organizationId = organizationId;\n return this;\n }\n\n public apiUrl(apiUrl: string): this {\n this._apiUrl = apiUrl;\n return this;\n }\n\n public enableEvaluation(enableEvaluation: boolean): this {\n this._enableEvaluation = enableEvaluation;\n return this;\n }\n\n public tracerName(tracerName: string): this {\n this._tracerName = tracerName;\n return this;\n }\n\n public build(): TracerConfiguration {\n if (!this._projectName) {\n throw new Error(\"Project name is required\");\n }\n\n if (!this._apiKey) {\n throw new Error(\"API key is required\");\n }\n\n if (!this._organizationId) {\n throw new Error(\"Organization ID is required\");\n }\n\n if (!this._apiUrl) {\n throw new Error(\"API URL is required\");\n }\n\n return new TracerConfiguration(\n this._projectName,\n this._apiKey,\n this._organizationId,\n this._apiUrl,\n this._enableEvaluation,\n this._tracerName,\n );\n }\n}\n","import { Example as ExampleModel } from \"../internal/api/models/Example\";\n\nexport type Example<T extends Record<string, any> = Record<string, any>> =\n ExampleModel & T;\n\nexport function createExample<T extends Record<string, any>>(\n properties: T,\n): Example<T> {\n const example: Example<T> = {\n example_id: undefined,\n created_at: new Date().toISOString(),\n name: null,\n ...properties,\n } as Example<T>;\n\n return example;\n}\n","export enum ExampleParams {\n INPUT = \"input\",\n ACTUAL_OUTPUT = \"actual_output\",\n EXPECTED_OUTPUT = \"expected_output\",\n CONTEXT = \"context\",\n RETRIEVAL_CONTEXT = \"retrieval_context\",\n TOOLS_CALLED = \"tools_called\",\n EXPECTED_TOOLS = \"expected_tools\",\n ADDITIONAL_METADATA = \"additional_metadata\",\n}\n\nexport type ExampleParamKeys = keyof typeof ExampleParams;\nexport type ExampleParamValues = `${ExampleParams}`;\n","import { BaseScorer, createBaseScorer } from \"./base-scorer\";\n\nexport enum APIScorerType {\n PROMPT_SCORER = \"Prompt Scorer\",\n TRACE_PROMPT_SCORER = \"Trace Prompt Scorer\",\n FAITHFULNESS = \"Faithfulness\",\n ANSWER_RELEVANCY = \"Answer Relevancy\",\n ANSWER_CORRECTNESS = \"Answer Correctness\",\n INSTRUCTION_ADHERENCE = \"Instruction Adherence\",\n EXECUTION_ORDER = \"Execution Order\",\n TOOL_ORDER = \"Tool Order\",\n CLASSIFIER = \"Classifier\",\n TOOL_DEPENDENCY = \"Tool Dependency\",\n CUSTOM = \"Custom\",\n}\n\nexport type APIScorer<\n T extends APIScorerType = APIScorerType,\n P extends readonly string[] = readonly string[],\n> = BaseScorer & {\n scoreType: T;\n requiredParams: P;\n setThreshold: (threshold: number) => void;\n getScoreType: () => T;\n setRequiredParams: (params: P) => void;\n};\n\nexport function createAPIScorer<\n T extends APIScorerType,\n P extends readonly string[],\n>(scoreType: T, requiredParams: P): APIScorer<T, P> {\n const scorer = createBaseScorer() as APIScorer<T, P>;\n\n scorer.scoreType = scoreType;\n scorer.name = scoreType;\n scorer.score_type = scoreType;\n scorer.requiredParams = requiredParams;\n\n scorer.setThreshold = (threshold: number) => {\n if (threshold < 0 || threshold > 1) {\n throw new Error(`Threshold must be between 0 and 1, got: ${threshold}`);\n }\n scorer.threshold = threshold;\n };\n\n scorer.getScoreType = () => {\n return scorer.scoreType;\n };\n\n scorer.setRequiredParams = (params: P) => {\n scorer.requiredParams = params;\n };\n\n return scorer;\n}\n","import { ScorerConfig } from \"../internal/api/models\";\nimport { BaseScorer as BaseScorerModel } from \"../internal/api/models/BaseScorer\";\n\nexport type BaseScorer = BaseScorerModel & {\n addModel: (model: string) => void;\n successCheck: () => boolean;\n getRequiredParams: () => string[];\n getScorerConfig: () => ScorerConfig;\n};\n\nexport function createBaseScorer(): BaseScorer {\n const scorer: BaseScorer = {\n score_type: \"\",\n class_name: \"\",\n name: \"\",\n addModel: (model: string) => {\n scorer.model = model;\n },\n successCheck: () => {\n if (scorer.error != null) {\n return false;\n }\n if (scorer.score == null) {\n return false;\n }\n const threshold = scorer.threshold ?? 0.5;\n const score = scorer.score;\n return threshold != null && score != null && score >= threshold;\n },\n getRequiredParams: () => {\n return [];\n },\n getScorerConfig: () => {\n return {\n score_type: scorer.score_type,\n name: scorer.name,\n threshold: scorer.threshold ?? 0.5,\n strict_mode: scorer.strict_mode ?? false,\n required_params: [],\n kwargs: {},\n };\n },\n };\n\n scorer.class_name = \"BaseScorer\";\n scorer.name = scorer.class_name;\n if (scorer.strict_mode === true) {\n scorer.threshold = 1.0;\n }\n\n return scorer;\n}\n","import {\n JUDGMENT_API_KEY,\n JUDGMENT_API_URL,\n JUDGMENT_ORG_ID,\n} from \"../../../env\";\nimport { JudgmentApiClient } from \"../../../internal/api\";\n\nexport class JudgmentAPIError extends Error {\n constructor(\n public statusCode: number,\n message: string,\n ) {\n super(message);\n this.name = \"JudgmentAPIError\";\n }\n}\n\nexport async function pushPromptScorer(\n name: string,\n prompt: string,\n threshold: number,\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n isTrace?: boolean,\n): Promise<string> {\n if (!JUDGMENT_API_URL || !judgmentApiKey || !organizationId) {\n throw new Error(\"Missing required API credentials\");\n }\n\n const client = new JudgmentApiClient(\n JUDGMENT_API_URL,\n judgmentApiKey,\n organizationId,\n );\n const response = await client.saveScorer({\n name,\n prompt,\n threshold,\n options,\n is_trace: isTrace,\n });\n return response.name;\n}\n\nexport async function fetchPromptScorer(\n name: string,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n) {\n if (!JUDGMENT_API_URL || !judgmentApiKey || !organizationId) {\n throw new Error(\"Missing required API credentials\");\n }\n\n const client = new JudgmentApiClient(\n JUDGMENT_API_URL,\n judgmentApiKey,\n organizationId,\n );\n const response = await client.fetchScorers({ names: [name] });\n if (response.scorers.length === 0) {\n throw new JudgmentAPIError(404, `Scorer with name ${name} not found`);\n }\n const { created_at, updated_at, ...config } = response.scorers[0];\n return config;\n}\n\nexport async function scorerExists(\n name: string,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n): Promise<boolean> {\n if (!JUDGMENT_API_URL || !judgmentApiKey || !organizationId) {\n throw new Error(\"Missing required API credentials\");\n }\n\n const client = new JudgmentApiClient(\n JUDGMENT_API_URL,\n judgmentApiKey,\n organizationId,\n );\n const response = await client.scorerExists({ name });\n return response.exists;\n}\n","import { JUDGMENT_API_KEY, JUDGMENT_ORG_ID } from \"../../../env\";\nimport { ScorerConfig } from \"../../../internal/api/models\";\nimport { APIScorer, APIScorerType } from \"../../api-scorer\";\nimport {\n fetchPromptScorer,\n JudgmentAPIError,\n pushPromptScorer,\n scorerExists,\n} from \"./prompt-scorer-utils\";\n\nexport abstract class BasePromptScorer\n implements APIScorer<APIScorerType, readonly string[]>\n{\n public scoreType: APIScorerType;\n public name: string;\n public prompt: string;\n public threshold: number;\n public options?: Record<string, number> | null;\n public judgmentApiKey: string;\n public organizationId: string;\n public requiredParams: readonly string[];\n public score_type: string;\n public class_name: string;\n public model?: string;\n public score?: number;\n public error?: string | null;\n public strict_mode?: boolean;\n\n constructor(\n scoreType: APIScorerType,\n name: string,\n prompt: string,\n threshold: number,\n requiredParams: readonly string[],\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ) {\n this.scoreType = scoreType;\n this.name = name;\n this.prompt = prompt;\n this.threshold = threshold;\n this.requiredParams = requiredParams;\n this.options = options;\n this.judgmentApiKey = judgmentApiKey;\n this.organizationId = organizationId;\n this.score_type = scoreType;\n this.class_name = \"BasePromptScorer\";\n this.model = undefined;\n this.score = undefined;\n this.error = null;\n this.strict_mode = false;\n }\n score_breakdown?: Record<string, any> | null | undefined;\n reason?: string | null | undefined;\n using_native_model?: boolean | null | undefined;\n success?: boolean | null | undefined;\n model_client?: any;\n additional_metadata?: Record<string, any> | null | undefined;\n user?: string | null | undefined;\n server_hosted?: boolean | undefined;\n\n static async get<T extends BasePromptScorer>(\n this: new (...args: any[]) => T,\n name: string,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ): Promise<T> {\n const config = await fetchPromptScorer(\n name,\n judgmentApiKey,\n organizationId,\n );\n\n const isTrace = config.is_trace === true;\n const expectedIsTrace =\n this.prototype.scoreType === APIScorerType.TRACE_PROMPT_SCORER;\n\n if (isTrace !== expectedIsTrace) {\n throw new JudgmentAPIError(\n 400,\n `Scorer with name ${name} is not a ${this.name}`,\n );\n }\n\n const scoreType = isTrace\n ? APIScorerType.TRACE_PROMPT_SCORER\n : APIScorerType.PROMPT_SCORER;\n\n return new this(\n scoreType,\n config.name, // Use config.name instead of name parameter\n config.prompt,\n config.threshold,\n [],\n config.options,\n judgmentApiKey,\n organizationId,\n );\n }\n\n static async create<T extends BasePromptScorer>(\n this: new (...args: any[]) => T,\n name: string,\n prompt: string,\n threshold: number = 0.5,\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ): Promise<T> {\n if (await scorerExists(name, judgmentApiKey, organizationId)) {\n throw new JudgmentAPIError(\n 400,\n `Scorer with name ${name} already exists. Either use the existing scorer with the get() method or use a new name.`,\n );\n }\n\n const isTrace =\n this.prototype.scoreType === APIScorerType.TRACE_PROMPT_SCORER;\n const scoreType = isTrace\n ? APIScorerType.TRACE_PROMPT_SCORER\n : APIScorerType.PROMPT_SCORER;\n\n await pushPromptScorer(\n name,\n prompt,\n threshold,\n options,\n judgmentApiKey,\n organizationId,\n isTrace,\n );\n\n return new this(\n scoreType,\n name,\n prompt,\n threshold,\n [],\n options,\n judgmentApiKey,\n organizationId,\n );\n }\n\n async updateThreshold(threshold: number): Promise<void> {\n this.setThreshold(threshold);\n await this.pushPromptScorer();\n }\n\n async setPrompt(prompt: string): Promise<void> {\n this.prompt = prompt;\n await this.pushPromptScorer();\n }\n\n async setOptions(options: Record<string, number> | null): Promise<void> {\n this.options = options;\n await this.pushPromptScorer();\n }\n\n async appendToPrompt(promptAddition: string): Promise<void> {\n this.prompt += promptAddition;\n await this.pushPromptScorer();\n }\n\n getThreshold(): number {\n return this.threshold;\n }\n\n getPrompt(): string {\n return this.prompt;\n }\n\n getOptions(): Record<string, number> | null {\n return this.options ? { ...this.options } : null;\n }\n\n getName(): string {\n return this.name;\n }\n\n getConfig(): Record<string, any> {\n return {\n name: this.name,\n prompt: this.prompt,\n threshold: this.threshold,\n options: this.options,\n } as const;\n }\n\n async pushPromptScorer(): Promise<void> {\n await pushPromptScorer(\n this.name,\n this.prompt,\n this.threshold,\n this.options,\n this.judgmentApiKey,\n this.organizationId,\n );\n }\n\n toString(): string {\n return `${this.constructor.name}(name=${this.name}, prompt=${\n this.prompt\n }, threshold=${this.threshold}, options=${JSON.stringify(this.options)})`;\n }\n\n addModel(model: string): void {\n this.model = model;\n }\n\n successCheck(): boolean {\n if (this.error != null) {\n return false;\n }\n if (this.score == null) {\n return false;\n }\n const threshold = this.threshold ?? 0.5;\n const score = this.score;\n return threshold != null && score != null && score >= threshold;\n }\n\n getRequiredParams(): string[] {\n if (Array.isArray(this.requiredParams)) {\n return [...this.requiredParams];\n }\n return [];\n }\n\n setThreshold(threshold: number): void {\n if (threshold < 0 || threshold > 1) {\n throw new Error(`Threshold must be between 0 and 1, got: ${threshold}`);\n }\n this.threshold = threshold;\n }\n\n getScoreType(): APIScorerType {\n return this.scoreType;\n }\n\n setRequiredParams(params: readonly string[]): void {\n this.requiredParams = params;\n }\n\n getScorerConfig(): ScorerConfig {\n return {\n score_type: this.getScoreType(),\n name: this.getName(),\n threshold: this.getThreshold(),\n strict_mode: this.strict_mode ?? false,\n required_params: this.getRequiredParams(),\n kwargs: {\n prompt: this.getPrompt(),\n ...(this.getOptions() ? { options: this.getOptions() } : {}),\n },\n };\n }\n}\n","import { JUDGMENT_API_KEY, JUDGMENT_ORG_ID } from \"../../../env\";\nimport { APIScorerType } from \"../../api-scorer\";\nimport { BasePromptScorer } from \"./base-prompt-scorer\";\nexport {\n fetchPromptScorer,\n JudgmentAPIError,\n pushPromptScorer,\n scorerExists,\n} from \"./prompt-scorer-utils\";\n\nexport class PromptScorer extends BasePromptScorer {\n constructor(\n scoreType: APIScorerType,\n name: string,\n prompt: string,\n threshold: number,\n requiredParams: readonly string[] = [],\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ) {\n super(\n scoreType,\n name,\n prompt,\n threshold,\n requiredParams,\n options,\n judgmentApiKey,\n organizationId,\n );\n }\n}\n","import { JUDGMENT_API_KEY, JUDGMENT_ORG_ID } from \"../../../env\";\nimport { APIScorerType } from \"../../api-scorer\";\nimport { BasePromptScorer } from \"./base-prompt-scorer\";\n\nexport class TracePromptScorer extends BasePromptScorer {\n constructor(\n scoreType: APIScorerType,\n name: string,\n prompt: string,\n threshold: number,\n requiredParams: readonly string[] = [],\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ) {\n super(\n scoreType,\n name,\n prompt,\n threshold,\n requiredParams,\n options,\n judgmentApiKey,\n organizationId,\n );\n }\n}\n","export const VERSION = \"0.3.1\";\n","import { resourceFromAttributes } from \"@opentelemetry/resources\";\nimport {\n BatchSpanProcessor,\n WebTracerProvider,\n} from \"@opentelemetry/sdk-trace-web\";\nimport { VERSION } from \"../version\";\nimport { OpenTelemetryKeys } from \"./OpenTelemetryKeys\";\nimport { Tracer, TracerInitializeOptions } from \"./Tracer\";\nimport { TracerConfiguration } from \"./TracerConfiguration\";\n\nexport type BrowserTracerInitializeOptions = TracerInitializeOptions & {};\n\nexport class BrowserTracer extends Tracer {\n private webTracerProvider?: WebTracerProvider;\n\n public async initialize(\n options: BrowserTracerInitializeOptions = {},\n ): Promise<BrowserTracer> {\n if (this._initialized) {\n return this;\n }\n\n try {\n const resourceAttributes = {\n [OpenTelemetryKeys.ResourceKeys.SERVICE_NAME]:\n this.configuration.projectName,\n [OpenTelemetryKeys.ResourceKeys.TELEMETRY_SDK_VERSION]: VERSION,\n ...options.resourceAttributes,\n };\n\n const spanExporter = await this.getSpanExporter();\n\n this.webTracerProvider = new WebTracerProvider({\n resource: resourceFromAttributes(resourceAttributes),\n spanProcessors: [new BatchSpanProcessor(spanExporter)],\n });\n\n this.webTracerProvider.register();\n\n this._initialized = true;\n return this;\n } catch (error) {\n throw new Error(\n `Failed to initialize browser tracer: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n public static getInstance(configuration: TracerConfiguration): BrowserTracer {\n const key = `BrowserTracer:${configuration.projectName}`;\n if (!Tracer.instances.has(key)) {\n Tracer.instances.set(key, new BrowserTracer(configuration));\n }\n return Tracer.instances.get(key) as BrowserTracer;\n }\n\n public static createDefault(projectName: string): BrowserTracer {\n const configuration = TracerConfiguration.builder()\n .projectName(projectName)\n .build();\n return BrowserTracer.getInstance(configuration);\n }\n\n public static createWithConfiguration(\n configuration: TracerConfiguration,\n ): BrowserTracer {\n return new BrowserTracer(configuration);\n }\n}\n","import { resourceFromAttributes } from \"@opentelemetry/resources\";\nimport { NodeSDK, NodeSDKConfiguration } from \"@opentelemetry/sdk-node\";\nimport { BatchSpanProcessor } from \"@opentelemetry/sdk-trace-node\";\nimport { VERSION } from \"../version\";\nimport { OpenTelemetryKeys } from \"./OpenTelemetryKeys\";\nimport { Tracer, TracerInitializeOptions } from \"./Tracer\";\nimport { TracerConfiguration } from \"./TracerConfiguration\";\n\nexport type NodeTracerInitializeOptions = TracerInitializeOptions & {\n instrumentations?: NodeSDKConfiguration[\"instrumentations\"];\n resourceAttributes?: Record<string, unknown>;\n};\n\nexport class NodeTracer extends Tracer {\n private nodeSDK?: NodeSDK;\n\n public async initialize(\n options: NodeTracerInitializeOptions = {},\n ): Promise<NodeTracer> {\n if (this._initialized) {\n return this;\n }\n\n try {\n const resourceAttributes = {\n [OpenTelemetryKeys.ResourceKeys.SERVICE_NAME]:\n this.configuration.projectName,\n [OpenTelemetryKeys.ResourceKeys.TELEMETRY_SDK_VERSION]: VERSION,\n ...options.resourceAttributes,\n };\n\n const spanExporter = await this.getSpanExporter();\n\n this.nodeSDK = new NodeSDK({\n resource: resourceFromAttributes(resourceAttributes),\n instrumentations: options.instrumentations,\n spanProcessor: new BatchSpanProcessor(spanExporter),\n ...options,\n });\n\n this.nodeSDK.start();\n\n this._initialized = true;\n return this;\n } catch (error) {\n throw new Error(\n `Failed to initialize node tracer: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n public static getInstance(configuration: TracerConfiguration): NodeTracer {\n const key = `NodeTracer:${configuration.projectName}`;\n if (!Tracer.instances.has(key)) {\n Tracer.instances.set(key, new NodeTracer(configuration));\n }\n return Tracer.instances.get(key) as NodeTracer;\n }\n\n public static createDefault(projectName: string): NodeTracer {\n const configuration = TracerConfiguration.builder()\n .projectName(projectName)\n .enableEvaluation(true)\n .build();\n return NodeTracer.getInstance(configuration);\n }\n\n public static createWithConfiguration(\n configuration: TracerConfiguration,\n ): NodeTracer {\n return new NodeTracer(configuration);\n }\n\n public async shutdown(): Promise<void> {\n if (this.nodeSDK) {\n await this.nodeSDK.shutdown();\n }\n }\n}\n"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE__186__","__WEBPACK_EXTERNAL_MODULE__276__","__WEBPACK_EXTERNAL_MODULE__625__","__WEBPACK_EXTERNAL_MODULE__404__","__WEBPACK_EXTERNAL_MODULE__839__","__WEBPACK_EXTERNAL_MODULE__67__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","d","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","JudgmentSpanExporter","constructor","endpoint","apiKey","organizationId","projectId","trim","Error","delegate","OTLPTraceExporter","url","headers","Authorization","builder","JudgmentSpanExporterBuilder","spans","resultCallback","export","shutdown","forceFlush","Promise","resolve","_endpoint","_apiKey","_organizationId","_projectId","build","NoOpSpanExporter","code","flush","OpenTelemetryKeys","AttributeKeys","JUDGMENT_SPAN_KIND","JUDGMENT_INPUT","JUDGMENT_OUTPUT","JUDGMENT_OFFLINE_MODE","JUDGMENT_UPDATE_ID","JUDGMENT_CUSTOMER_ID","JUDGMENT_AGENT_ID","JUDGMENT_PARENT_AGENT_ID","JUDGMENT_AGENT_CLASS_NAME","JUDGMENT_AGENT_INSTANCE_NAME","PENDING_TRACE_EVAL","GEN_AI_PROMPT","GEN_AI_COMPLETION","GEN_AI_REQUEST_MODEL","GEN_AI_RESPONSE_MODEL","GEN_AI_SYSTEM","GEN_AI_USAGE_INPUT_TOKENS","GEN_AI_USAGE_OUTPUT_TOKENS","GEN_AI_USAGE_COMPLETION_TOKENS","GEN_AI_REQUEST_TEMPERATURE","GEN_AI_REQUEST_MAX_TOKENS","GEN_AI_RESPONSE_FINISH_REASONS","GEN_AI_USAGE_TOTAL_COST","InternalAttributeKeys","DISABLE_PARTIAL_EMIT","CANCELLED","ResourceKeys","SERVICE_NAME","TELEMETRY_SDK_LANGUAGE","TELEMETRY_SDK_NAME","TELEMETRY_SDK_VERSION","JUDGMENT_PROJECT_ID","getEnvVar","varName","defaultValue","process","env","JUDGMENT_API_KEY","JUDGMENT_ORG_ID","JUDGMENT_API_URL","JUDGMENT_DEFAULT_GPT_MODEL","JUDGMENT_ENABLE_MONITORING","JUDGMENT_ENABLE_EVALUATIONS","JUDGMENT_NO_COLOR","JudgmentApiClient","baseUrl","buildUrl","path","buildHeaders","addToRunEvalQueueExamples","payload","response","fetch","method","body","JSON","stringify","ok","status","text","addToRunEvalQueueTraces","logEvalResults","fetchExperimentRun","getEvaluationStatus","experiment_run_id","project_name","queryParams","URLSearchParams","set","toString","scorerExists","json","saveScorer","fetchScorers","projectsResolve","ARROW_ARG","FN_ARGS","FN_ARG_SPLIT","FN_ARG","STRIP_COMMENTS","parseFunctionArgs","fn","args","fnText","Function","stringifyFn","replace","match","extractArgs","split","map","arg","all","underscore","name","filter","length","Logger","initialize","initialized","noColor","useColor","stdout","isTTY","setLevel","level","currentLevel","setUseColor","log","message","formattedMessage","Date","toISOString","substring","keys","Level","find","DEBUG","INFO","GRAY","WARNING","YELLOW","RED","RESET","ERROR","stderr","write","debug","info","warning","warn","error","critical","CRITICAL","Tracer","getConfiguration","configuration","getProjectId","getSerializer","serializer","tracer","_initialized","apiClient","apiUrl","resolveProjectId","projectName","project_id","resolvedProjectId","String","getExporter","endsWith","getSpanExporter","createJudgmentSpanExporter","setSpanKind","kind","currentSpan","trace","getActiveSpan","setAttribute","setLLMSpan","setToolSpan","setGeneralSpan","setAttributes","attributes","entries","setInput","input","setOutput","output","asyncEvaluate","scorer","example","model","enableEvaluation","isRecording","spanContext","traceId","spanId","evaluationRun","createEvaluationRun","enqueueEvaluation","asyncTraceEvaluate","traceEvaluationRun","createTraceEvaluationRun","traceEvalJson","evalName","now","modelName","scorerConfig","getScorerConfig","eval_name","organization_id","trace_id","trace_span_id","runId","examples","custom_scorers","judgment_scorers","observe","func","spanKind","spanName","getTracer","tracerName","context","with","setSpan","active","startActiveSpan","INTERNAL","span","argNames","inputObj","forEach","index","result","then","res","end","catch","err","recordException","instances","Map","JUDGEVAL_TRACER_INSTRUMENTING_MODULE_NAME","TracerConfiguration","createDefault","TracerConfigurationBuilder","_apiUrl","_enableEvaluation","_tracerName","_projectName","createExample","properties","example_id","created_at","ExampleParams","APIScorerType","createBaseScorer","score_type","class_name","addModel","successCheck","score","threshold","getRequiredParams","strict_mode","required_params","kwargs","createAPIScorer","scoreType","requiredParams","setThreshold","getScoreType","setRequiredParams","params","JudgmentAPIError","statusCode","super","async","pushPromptScorer","prompt","options","judgmentApiKey","isTrace","client","is_trace","fetchPromptScorer","names","scorers","updated_at","config","exists","BasePromptScorer","TRACE_PROMPT_SCORER","PROMPT_SCORER","create","updateThreshold","setPrompt","setOptions","appendToPrompt","promptAddition","getThreshold","getPrompt","getOptions","getName","getConfig","Array","isArray","PromptScorer","TracePromptScorer","VERSION","BrowserTracer","resourceAttributes","spanExporter","webTracerProvider","WebTracerProvider","resource","resourceFromAttributes","spanProcessors","BatchSpanProcessor","register","getInstance","has","createWithConfiguration","NodeTracer","nodeSDK","NodeSDK","instrumentations","spanProcessor","start"],"sourceRoot":""}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/tracer/exporters/JudgmentSpanExporter.ts", "../src/tracer/exporters/NoOpSpanExporter.ts", "../src/tracer/OpenTelemetryKeys.ts", "../src/tracer/Tracer.ts", "../src/env.ts", "../src/internal/api/index.ts", "../src/utils/annotate.ts", "../src/utils/logger.ts", "../src/constants.ts", "../src/tracer/TracerConfiguration.ts", "../src/data/example.ts", "../src/data/example-params.ts", "../src/scorers/base-scorer.ts", "../src/scorers/api-scorer.ts", "../src/scorers/api_scorers/prompt_scorer/prompt-scorer-utils.ts", "../src/scorers/api_scorers/prompt_scorer/base-prompt-scorer.ts", "../src/scorers/api_scorers/prompt_scorer/prompt-scorer.ts", "../src/scorers/api_scorers/prompt_scorer/trace-prompt-scorer.ts", "../src/tracer/BrowserTracer.ts", "../src/version.ts", "../src/tracer/NodeTracer.ts"],
4
+ "sourcesContent": [
5
+ "import { ExportResult } from \"@opentelemetry/core\";\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\";\nimport { ReadableSpan, SpanExporter } from \"@opentelemetry/sdk-trace-base\";\n\n/**\n * SpanExporter implementation that sends spans to Judgment Labs with project identification.\n *\n * This exporter wraps the OTLP HTTP exporter and adds Judgment Labs specific headers and project\n * identification to all exported spans.\n */\nexport class JudgmentSpanExporter implements SpanExporter {\n private readonly delegate: SpanExporter;\n\n /**\n * Creates a new JudgmentSpanExporter with the specified configuration.\n *\n * @param endpoint the OTLP endpoint URL\n * @param apiKey the API key for authentication\n * @param organizationId the organization ID\n * @param projectId the project ID (must not be null or empty)\n * @throws Error if projectId is null or empty\n */\n constructor(\n endpoint: string,\n apiKey: string,\n organizationId: string,\n projectId: string,\n ) {\n if (!projectId || projectId.trim() === \"\") {\n throw new Error(\"projectId is required for JudgmentSpanExporter\");\n }\n\n this.delegate = new OTLPTraceExporter({\n url: endpoint,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"X-Organization-Id\": organizationId,\n \"X-Project-Id\": projectId,\n },\n });\n }\n\n /**\n * Creates a new builder for constructing JudgmentSpanExporter instances.\n */\n public static builder(): JudgmentSpanExporterBuilder {\n return new JudgmentSpanExporterBuilder();\n }\n\n /**\n * Exports a collection of spans.\n */\n export(\n spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n this.delegate.export(spans, resultCallback);\n }\n\n /**\n * Shuts down the exporter.\n */\n shutdown(): Promise<void> {\n return this.delegate.shutdown();\n }\n\n /**\n * Forces the exporter to flush any pending spans.\n */\n forceFlush(): Promise<void> {\n return this.delegate.forceFlush?.() ?? Promise.resolve();\n }\n}\n\n/**\n * Builder for creating JudgmentSpanExporter instances.\n */\nexport class JudgmentSpanExporterBuilder {\n private _endpoint?: string;\n private _apiKey?: string;\n private _organizationId?: string;\n private _projectId?: string;\n\n constructor() {}\n\n /**\n * Sets the OTLP endpoint URL.\n *\n * @param endpoint the endpoint URL\n * @return this builder for method chaining\n */\n public endpoint(endpoint: string): this {\n this._endpoint = endpoint;\n return this;\n }\n\n /**\n * Sets the API key for authentication.\n *\n * @param apiKey the API key\n * @return this builder for method chaining\n */\n public apiKey(apiKey: string): this {\n this._apiKey = apiKey;\n return this;\n }\n\n /**\n * Sets the organization ID.\n *\n * @param organizationId the organization ID\n * @return this builder for method chaining\n */\n public organizationId(organizationId: string): this {\n this._organizationId = organizationId;\n return this;\n }\n\n /**\n * Sets the project ID.\n *\n * @param projectId the project ID\n * @return this builder for method chaining\n */\n public projectId(projectId: string): this {\n this._projectId = projectId;\n return this;\n }\n\n /**\n * Builds a new JudgmentSpanExporter with the current configuration.\n *\n * @return a new JudgmentSpanExporter instance\n * @throws Error if required fields are missing\n */\n public build(): JudgmentSpanExporter {\n if (!this._endpoint || this._endpoint.trim() === \"\") {\n throw new Error(\"Endpoint is required\");\n }\n if (!this._apiKey || this._apiKey.trim() === \"\") {\n throw new Error(\"API key is required\");\n }\n if (!this._organizationId || this._organizationId.trim() === \"\") {\n throw new Error(\"Organization ID is required\");\n }\n if (!this._projectId || this._projectId.trim() === \"\") {\n throw new Error(\"Project ID is required\");\n }\n\n return new JudgmentSpanExporter(\n this._endpoint,\n this._apiKey,\n this._organizationId,\n this._projectId,\n );\n }\n}\n",
6
+ "import { ExportResult } from \"@opentelemetry/core\";\nimport { ReadableSpan, SpanExporter } from \"@opentelemetry/sdk-trace-base\";\n\n/**\n * A no-op span exporter that does nothing.\n * Used when project resolution fails or tracing is disabled.\n */\nexport class NoOpSpanExporter implements SpanExporter {\n export(\n spans: ReadableSpan[],\n resultCallback: (result: ExportResult) => void,\n ): void {\n resultCallback({ code: 0 });\n }\n\n flush(): Promise<void> {\n return Promise.resolve();\n }\n\n shutdown(): Promise<void> {\n return Promise.resolve();\n }\n}\n",
7
+ "export abstract class OpenTelemetryKeys {\n public static readonly AttributeKeys = {\n JUDGMENT_SPAN_KIND: \"judgment.span_kind\",\n JUDGMENT_INPUT: \"judgment.input\",\n JUDGMENT_OUTPUT: \"judgment.output\",\n JUDGMENT_OFFLINE_MODE: \"judgment.offline_mode\",\n JUDGMENT_UPDATE_ID: \"judgment.update_id\",\n\n JUDGMENT_CUSTOMER_ID: \"judgment.customer_id\",\n\n JUDGMENT_AGENT_ID: \"judgment.agent_id\",\n\n JUDGMENT_PARENT_AGENT_ID: \"judgment.parent_agent_id\",\n JUDGMENT_AGENT_CLASS_NAME: \"judgment.agent_class_name\",\n JUDGMENT_AGENT_INSTANCE_NAME: \"judgment.agent_instance_name\",\n\n PENDING_TRACE_EVAL: \"judgment.pending_trace_eval\",\n\n GEN_AI_PROMPT: \"gen_ai.prompt\",\n GEN_AI_COMPLETION: \"gen_ai.completion\",\n GEN_AI_REQUEST_MODEL: \"gen_ai.request.model\",\n GEN_AI_RESPONSE_MODEL: \"gen_ai.response.model\",\n GEN_AI_SYSTEM: \"gen_ai.system\",\n GEN_AI_USAGE_INPUT_TOKENS: \"gen_ai.usage.input_tokens\",\n GEN_AI_USAGE_OUTPUT_TOKENS: \"gen_ai.usage.output_tokens\",\n GEN_AI_USAGE_COMPLETION_TOKENS: \"gen_ai.usage.completion_tokens\",\n GEN_AI_REQUEST_TEMPERATURE: \"gen_ai.request.temperature\",\n GEN_AI_REQUEST_MAX_TOKENS: \"gen_ai.request.max_tokens\",\n GEN_AI_RESPONSE_FINISH_REASONS: \"gen_ai.response.finish_reasons\",\n\n GEN_AI_USAGE_TOTAL_COST: \"gen_ai.usage.total_cost_usd\",\n } as const;\n\n public static readonly InternalAttributeKeys = {\n DISABLE_PARTIAL_EMIT: \"disable_partial_emit\",\n CANCELLED: \"cancelled\",\n } as const;\n\n public static readonly ResourceKeys = {\n SERVICE_NAME: \"service.name\",\n TELEMETRY_SDK_LANGUAGE: \"telemetry.sdk.language\",\n TELEMETRY_SDK_NAME: \"telemetry.sdk.name\",\n TELEMETRY_SDK_VERSION: \"telemetry.sdk.version\",\n JUDGMENT_PROJECT_ID: \"judgment.project_id\",\n } as const;\n}\n",
8
+ "import {\n context,\n SpanKind as OpenTelemetrySpanKind,\n trace,\n} from \"@opentelemetry/api\";\nimport { JUDGMENT_API_URL, JUDGMENT_DEFAULT_GPT_MODEL } from \"../env\";\nimport { JudgmentApiClient } from \"../internal/api\";\nimport {\n ExampleEvaluationRun,\n Example as ExampleModel,\n} from \"../internal/api/models\";\nimport { BaseScorer } from \"../scorers/base-scorer\";\nimport { parseFunctionArgs } from \"../utils/annotate\";\nimport { Logger } from \"../utils/logger\";\nimport { JudgmentSpanExporter, NoOpSpanExporter } from \"./exporters\";\nimport { OpenTelemetryKeys } from \"./OpenTelemetryKeys\";\nimport { TracerConfiguration } from \"./TracerConfiguration\";\n\nexport type Serializer = (obj: unknown) => string;\ntype SpanKind = (\"llm\" | \"tool\" | \"span\") & {};\n\nexport type TracerInitializeOptions = {\n resourceAttributes?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\nexport abstract class Tracer {\n protected static instances: Map<string, Tracer> = new Map();\n\n public apiClient: JudgmentApiClient;\n public tracer: unknown = null;\n public serializer: Serializer = JSON.stringify;\n\n protected _initialized: boolean = false;\n\n private projectId: string | null = null;\n protected configuration: TracerConfiguration;\n\n public getConfiguration(): TracerConfiguration {\n return this.configuration;\n }\n\n public getProjectId(): string | null {\n return this.projectId;\n }\n\n public getSerializer(): Serializer {\n return this.serializer;\n }\n\n public constructor(configuration: TracerConfiguration) {\n this.configuration = configuration;\n\n this.apiClient = new JudgmentApiClient(\n this.configuration.apiUrl,\n this.configuration.apiKey,\n this.configuration.organizationId,\n );\n\n this._initialized = false;\n }\n\n public abstract initialize(options: TracerInitializeOptions): Promise<Tracer>;\n\n private async resolveProjectId(): Promise<string> {\n try {\n Logger.info(\n `Resolving project ID for project: ${this.configuration.projectName}`,\n );\n\n const response = await this.apiClient.projectsResolve({\n project_name: this.configuration.projectName,\n });\n Logger.info(`Resolved project ID: ${response.project_id}`);\n const resolvedProjectId = response.project_id?.toString();\n\n if (!resolvedProjectId) {\n throw new Error(\n `Project ID not found for project: ${this.configuration.projectName}`,\n );\n }\n\n this.projectId = resolvedProjectId;\n Logger.info(`Successfully resolved project ID: ${this.projectId}`);\n\n return this.projectId;\n } catch (error) {\n throw new Error(\n `Failed to resolve project ID: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n public static getExporter(\n apiKey: string,\n organizationId: string,\n projectId: string,\n ): JudgmentSpanExporter {\n const endpoint = JUDGMENT_API_URL?.endsWith(\"/\")\n ? `${JUDGMENT_API_URL}otel/v1/traces`\n : `${JUDGMENT_API_URL}/otel/v1/traces`;\n\n return JudgmentSpanExporter.builder()\n .endpoint(endpoint)\n .apiKey(apiKey)\n .organizationId(organizationId)\n .projectId(projectId)\n .build();\n }\n\n public async getSpanExporter(): Promise<\n JudgmentSpanExporter | NoOpSpanExporter\n > {\n try {\n const projectId = await this.resolveProjectId();\n return this.createJudgmentSpanExporter(projectId);\n } catch (error) {\n Logger.error(\n \"Failed to resolve project \" +\n this.configuration.projectName +\n \", please create it first at https://app.judgmentlabs.ai/org/\" +\n (this.configuration.organizationId || \"unknown\") +\n \"/projects. Skipping Judgment export.\",\n );\n return new NoOpSpanExporter();\n }\n }\n\n public setSpanKind(kind: SpanKind): void {\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping setSpanKind\");\n return;\n }\n if (kind !== null) {\n currentSpan.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_SPAN_KIND,\n kind,\n );\n }\n }\n\n public setAttribute(key: string, value: unknown): void {\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping setAttribute\");\n return;\n }\n currentSpan.setAttribute(key, this.serializer(value));\n }\n\n public setLLMSpan(): void {\n this.setSpanKind(\"llm\");\n }\n\n public setToolSpan(): void {\n this.setSpanKind(\"tool\");\n }\n\n public setGeneralSpan(): void {\n this.setSpanKind(\"span\");\n }\n\n public setAttributes(attributes: Record<string, unknown>): void {\n if (!attributes) {\n return;\n }\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping setAttributes\");\n return;\n }\n for (const [key, value] of Object.entries(attributes)) {\n currentSpan.setAttribute(key, this.serializer(value));\n }\n }\n\n public setInput(input: unknown): void {\n this.setAttribute(OpenTelemetryKeys.AttributeKeys.JUDGMENT_INPUT, input);\n }\n\n public setOutput(output: unknown): void {\n this.setAttribute(OpenTelemetryKeys.AttributeKeys.JUDGMENT_OUTPUT, output);\n }\n\n public asyncEvaluate(\n scorer: BaseScorer,\n example: ExampleModel,\n model?: string,\n ): void {\n if (!this._initialized) {\n Logger.warn(\"Tracer not initialized, skipping asyncEvaluate\");\n return;\n }\n\n if (!this.configuration.enableEvaluation) {\n return;\n }\n\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping asyncEvaluate\");\n return;\n }\n if (!currentSpan.isRecording()) {\n Logger.warn(\"Active span is not recording, skipping asyncEvaluate\");\n return;\n }\n\n const spanContext = currentSpan.spanContext();\n const traceId = spanContext.traceId;\n const spanId = spanContext.spanId;\n\n Logger.info(\n `asyncEvaluate: project=${this.configuration.projectName}, traceId=${traceId}, spanId=${spanId}, scorer=${scorer.name}`,\n );\n\n const evaluationRun = this.createEvaluationRun(\n scorer,\n example,\n model,\n traceId,\n spanId,\n );\n this.enqueueEvaluation(evaluationRun);\n }\n\n public asyncTraceEvaluate(scorer: BaseScorer, model?: string): void {\n if (!this._initialized) {\n Logger.warn(\"Tracer not initialized, skipping asyncTraceEvaluate\");\n return;\n }\n\n if (!this.configuration.enableEvaluation) {\n return;\n }\n\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping asyncTraceEvaluate\");\n return;\n }\n if (!currentSpan.isRecording()) {\n Logger.warn(\"Active span is not recording, skipping asyncTraceEvaluate\");\n return;\n }\n\n const spanContext = currentSpan.spanContext();\n const traceId = spanContext.traceId;\n const spanId = spanContext.spanId;\n\n Logger.info(\n `asyncTraceEvaluate: project=${this.configuration.projectName}, traceId=${traceId}, spanId=${spanId}, scorer=${scorer.name}`,\n );\n\n try {\n const traceEvaluationRun = this.createTraceEvaluationRun(\n scorer,\n model,\n traceId,\n spanId,\n );\n const traceEvalJson = this.serializer(traceEvaluationRun);\n currentSpan.setAttribute(\n OpenTelemetryKeys.AttributeKeys.PENDING_TRACE_EVAL,\n traceEvalJson,\n );\n } catch (error) {\n Logger.error(\n `Failed to serialize trace evaluation: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n private createTraceEvaluationRun(\n scorer: BaseScorer,\n model: string | undefined,\n traceId: string,\n spanId: string,\n ): Record<string, unknown> {\n const evalName = `async_trace_evaluate_${spanId || Date.now()}`;\n const modelName = model || JUDGMENT_DEFAULT_GPT_MODEL;\n\n const scorerConfig = scorer.getScorerConfig();\n\n return {\n project_name: this.configuration.projectName,\n eval_name: evalName,\n scorer: scorerConfig,\n model: modelName,\n organization_id: this.configuration.organizationId,\n trace_id: traceId,\n trace_span_id: spanId,\n };\n }\n\n private createJudgmentSpanExporter(projectId: string): JudgmentSpanExporter {\n const endpoint = this.configuration.apiUrl.endsWith(\"/\")\n ? `${this.configuration.apiUrl}otel/v1/traces`\n : `${this.configuration.apiUrl}/otel/v1/traces`;\n\n return JudgmentSpanExporter.builder()\n .endpoint(endpoint)\n .apiKey(this.configuration.apiKey)\n .organizationId(this.configuration.organizationId)\n .projectId(projectId)\n .build();\n }\n\n private createEvaluationRun(\n scorer: BaseScorer,\n example: ExampleModel,\n model: string | undefined,\n traceId: string,\n spanId: string,\n ): ExampleEvaluationRun {\n const runId = `async_evaluate_${spanId || Date.now()}`;\n const modelName = model || JUDGMENT_DEFAULT_GPT_MODEL;\n\n const scorerConfig = scorer.getScorerConfig();\n\n const evaluationRun: ExampleEvaluationRun = {\n project_name: this.configuration.projectName,\n eval_name: runId,\n examples: [example],\n custom_scorers: [],\n judgment_scorers: [scorerConfig],\n model: modelName,\n trace_id: traceId,\n trace_span_id: spanId,\n };\n\n return evaluationRun;\n }\n\n private async enqueueEvaluation(\n evaluationRun: ExampleEvaluationRun,\n ): Promise<void> {\n if (!this.apiClient) {\n Logger.warn(\"API client not available, skipping evaluation enqueue\");\n return;\n }\n\n try {\n await this.apiClient.addToRunEvalQueueExamples(evaluationRun);\n Logger.info(`Enqueuing evaluation run: ${evaluationRun.eval_name}`);\n } catch (error) {\n Logger.error(\n `Failed to enqueue evaluation run: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n public observe<TArgs extends any[], TResult>(\n func: (...args: TArgs) => TResult,\n spanKind: SpanKind = \"span\",\n ): (...args: TArgs) => TResult {\n return (...args: TArgs) => {\n const currentSpan = trace.getActiveSpan();\n if (!currentSpan) {\n Logger.warn(\"No active span found, skipping observe\");\n return func(...args);\n }\n\n const spanName = func.name || \"anonymous\";\n const tracer = trace.getTracer(this.configuration.tracerName);\n\n return context.with(trace.setSpan(context.active(), currentSpan), () => {\n return tracer.startActiveSpan(\n spanName,\n { kind: OpenTelemetrySpanKind.INTERNAL },\n (span) => {\n try {\n span.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_SPAN_KIND,\n spanKind,\n );\n\n const argNames = parseFunctionArgs(func);\n if (argNames.length === args.length) {\n const inputObj: Record<string, unknown> = {};\n argNames.forEach((name, index) => {\n inputObj[name] = args[index];\n });\n span.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_INPUT,\n this.serializer(inputObj),\n );\n }\n\n const result = func(...args);\n\n if (result instanceof Promise) {\n return result\n .then((res) => {\n span.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_OUTPUT,\n this.serializer(res),\n );\n span.end();\n return res;\n })\n .catch((err) => {\n span.recordException(err as Error);\n span.end();\n throw err;\n }) as TResult;\n } else {\n span.setAttribute(\n OpenTelemetryKeys.AttributeKeys.JUDGMENT_OUTPUT,\n this.serializer(result),\n );\n span.end();\n return result;\n }\n } catch (err) {\n span.recordException(err as Error);\n span.end();\n throw err;\n }\n },\n );\n });\n };\n }\n\n public async shutdown(): Promise<void> {}\n}\n",
9
+ "function getEnvVar(varName: string): string | null;\nfunction getEnvVar(varName: string, defaultValue: string): string;\nfunction getEnvVar(varName: string, defaultValue?: string): string | null {\n const value = process.env[varName];\n if (!value) {\n return defaultValue ?? null;\n }\n return value;\n}\n\nexport const JUDGMENT_API_KEY = getEnvVar(\"JUDGMENT_API_KEY\");\nexport const JUDGMENT_ORG_ID = getEnvVar(\"JUDGMENT_ORG_ID\");\nexport const JUDGMENT_API_URL = getEnvVar(\n \"JUDGMENT_API_URL\",\n \"https://api.judgmentlabs.ai\",\n);\nexport const JUDGMENT_DEFAULT_GPT_MODEL = getEnvVar(\n \"JUDGMENT_DEFAULT_GPT_MODEL\",\n \"gpt-4.1\",\n);\nexport const JUDGMENT_ENABLE_MONITORING = getEnvVar(\n \"JUDGMENT_ENABLE_MONITORING\",\n \"true\",\n);\nexport const JUDGMENT_ENABLE_EVALUATIONS = getEnvVar(\n \"JUDGMENT_ENABLE_EVALUATIONS\",\n \"true\",\n);\nexport const JUDGMENT_NO_COLOR = getEnvVar(\"JUDGMENT_NO_COLOR\");\n",
10
+ "/**\n * Auto-generated by scripts/generate-client.ts\n * DO NOT EDIT MANUALLY - This file is generated automatically\n */\nimport * as Models from \"./models\";\n\nexport class JudgmentApiClient {\n private baseUrl: string;\n private apiKey: string;\n private organizationId: string;\n\n constructor(baseUrl: string, apiKey: string, organizationId: string) {\n this.baseUrl = baseUrl;\n this.apiKey = apiKey;\n this.organizationId = organizationId;\n }\n\n private buildUrl(path: string): string {\n return this.baseUrl + path;\n }\n\n private buildHeaders(): Record<string, string> {\n if (!this.apiKey || !this.organizationId) {\n throw new Error(\"API key and organization ID cannot be null\");\n }\n return {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n \"X-Organization-Id\": this.organizationId,\n };\n }\n\n async addToRunEvalQueueExamples(\n payload: Models.ExampleEvaluationRun,\n ): Promise<void> {\n const url = this.buildUrl(\"/add_to_run_eval_queue/examples\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async addToRunEvalQueueTraces(\n payload: Models.TraceEvaluationRun,\n ): Promise<void> {\n const url = this.buildUrl(\"/add_to_run_eval_queue/traces\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async logEvalResults(payload: Models.EvalResults): Promise<void> {\n const url = this.buildUrl(\"/log_eval_results/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async fetchExperimentRun(payload: Models.EvalResultsFetch): Promise<void> {\n const url = this.buildUrl(\"/fetch_experiment_run/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async getEvaluationStatus(\n experiment_run_id: string,\n project_name: string,\n ): Promise<void> {\n const queryParams = new URLSearchParams();\n queryParams.set(\"experiment_run_id\", experiment_run_id);\n queryParams.set(\"project_name\", project_name);\n const url = this.buildUrl(\n \"/get_evaluation_status/\" +\n (queryParams.toString() ? \"?\" + queryParams.toString() : \"\"),\n );\n const response = await fetch(url, {\n method: \"GET\",\n headers: this.buildHeaders(),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return;\n }\n\n async scorerExists(\n payload: Models.ScorerExistsRequest,\n ): Promise<Models.ScorerExistsResponse> {\n const url = this.buildUrl(\"/scorer_exists/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return (await response.json()) as Models.ScorerExistsResponse;\n }\n\n async saveScorer(\n payload: Models.SavePromptScorerRequest,\n ): Promise<Models.SavePromptScorerResponse> {\n const url = this.buildUrl(\"/save_scorer/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return (await response.json()) as Models.SavePromptScorerResponse;\n }\n\n async fetchScorers(\n payload: Models.FetchPromptScorersRequest,\n ): Promise<Models.FetchPromptScorersResponse> {\n const url = this.buildUrl(\"/fetch_scorers/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return (await response.json()) as Models.FetchPromptScorersResponse;\n }\n\n async projectsResolve(\n payload: Models.ResolveProjectNameRequest,\n ): Promise<Models.ResolveProjectNameResponse> {\n const url = this.buildUrl(\"/projects/resolve/\");\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(\n `HTTP Error: ${response.status} - ${await response.text()}`,\n );\n }\n\n return (await response.json()) as Models.ResolveProjectNameResponse;\n }\n}\n",
11
+ "// Adopted from https://github.com/angular/angular.js/blob/master/src/auto/injector.js\n\nconst ARROW_ARG = /^([^(]+?)=>/;\nconst FN_ARGS = /^[^(]*\\(\\s*([^)]*)\\)/m;\nconst FN_ARG_SPLIT = /,/;\nconst FN_ARG = /^\\s*(_?)(\\S+?)\\1\\s*$/;\nconst STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;\n\nfunction stringifyFn(fn: Function): string {\n return Function.prototype.toString.call(fn);\n}\n\nfunction extractArgs(fn: Function): RegExpMatchArray | null {\n const fnText = stringifyFn(fn).replace(STRIP_COMMENTS, \"\");\n return fnText.match(ARROW_ARG) || fnText.match(FN_ARGS);\n}\n\nexport function parseFunctionArgs(fn: Function): string[] {\n const args = extractArgs(fn);\n if (!args || !args[1]) {\n return [];\n }\n\n return args[1]\n .split(FN_ARG_SPLIT)\n .map((arg) => {\n const match = arg.replace(FN_ARG, (all, underscore, name) => name);\n return match.trim();\n })\n .filter((name) => name.length > 0);\n}\n",
12
+ "export class Logger {\n private static readonly RESET = \"\\x1b[0m\";\n private static readonly RED = \"\\x1b[31m\";\n private static readonly YELLOW = \"\\x1b[33m\";\n private static readonly GRAY = \"\\x1b[90m\";\n\n public static Level = {\n DEBUG: 0,\n INFO: 1,\n WARNING: 2,\n ERROR: 3,\n CRITICAL: 4,\n } as const;\n\n private static initialized = false;\n private static currentLevel: number = Logger.Level.INFO;\n private static useColor = true;\n\n private static initialize(): void {\n if (!Logger.initialized) {\n const noColor = process.env.JUDGMENT_NO_COLOR;\n Logger.useColor = !noColor && process.stdout.isTTY;\n Logger.initialized = true;\n }\n }\n\n public static setLevel(level: number): void {\n Logger.currentLevel = level;\n }\n\n public static setUseColor(useColor: boolean): void {\n Logger.useColor = useColor;\n }\n\n private static log(level: number, message: string): void {\n Logger.initialize();\n\n if (level < Logger.currentLevel) {\n return;\n }\n\n const timestamp = new Date()\n .toISOString()\n .replace(\"T\", \" \")\n .substring(0, 19);\n const levelName =\n Object.keys(Logger.Level).find(\n (key) => Logger.Level[key as keyof typeof Logger.Level] === level,\n ) || \"UNKNOWN\";\n let formattedMessage = `${timestamp} - judgeval - ${levelName} - ${message}`;\n\n if (Logger.useColor) {\n const color =\n level === Logger.Level.DEBUG || level === Logger.Level.INFO\n ? Logger.GRAY\n : level === Logger.Level.WARNING\n ? Logger.YELLOW\n : Logger.RED;\n formattedMessage = `${color}${formattedMessage}${Logger.RESET}`;\n }\n\n const output =\n level >= Logger.Level.ERROR ? process.stderr : process.stdout;\n output.write(formattedMessage + \"\\n\");\n }\n\n public static debug(message: string): void {\n Logger.log(Logger.Level.DEBUG, message);\n }\n\n public static info(message: string): void {\n Logger.log(Logger.Level.INFO, message);\n }\n\n public static warning(message: string): void {\n Logger.log(Logger.Level.WARNING, message);\n }\n\n public static warn(message: string): void {\n Logger.log(Logger.Level.WARNING, message);\n }\n\n public static error(message: string): void {\n Logger.log(Logger.Level.ERROR, message);\n }\n\n public static critical(message: string): void {\n Logger.log(Logger.Level.CRITICAL, message);\n }\n}\n",
13
+ "export const JUDGEVAL_TRACER_INSTRUMENTING_MODULE_NAME =\n \"opentelemetry.instrumentation.judgeval\" as const;\n",
14
+ "import { JUDGEVAL_TRACER_INSTRUMENTING_MODULE_NAME } from \"../constants\";\nimport { JUDGMENT_API_KEY, JUDGMENT_API_URL, JUDGMENT_ORG_ID } from \"../env\";\n\n/**\n * Configuration for the Judgment Tracer that controls how tracing and evaluation behave.\n *\n * This class encapsulates all configuration parameters needed to initialize a Tracer.\n *\n * @example\n * ```typescript\n * const config = TracerConfiguration.builder()\n * .projectName(\"my-project\")\n * .apiKey(\"your-api-key\")\n * .organizationId(\"your-org-id\")\n * .enableEvaluation(true)\n * .build();\n *\n * const tracer = Tracer.createWithConfiguration(config);\n * ```\n */\nexport class TracerConfiguration {\n constructor(\n public readonly projectName: string,\n public readonly apiKey: string,\n public readonly organizationId: string,\n public readonly apiUrl: string,\n public readonly enableEvaluation: boolean,\n public readonly tracerName: string = JUDGEVAL_TRACER_INSTRUMENTING_MODULE_NAME,\n ) {}\n\n /**\n * Creates a default configuration with the given project name.\n *\n * This method uses default values from environment variables:\n * - API Key: JUDGMENT_API_KEY\n * - Organization ID: JUDGMENT_ORG_ID\n * - API URL: JUDGMENT_API_URL\n * - Evaluation: enabled\n *\n * @param projectName the name of the project\n * @returns a new TracerConfiguration with default values\n * @throws Error if project name is null or empty\n */\n public static createDefault(projectName: string): TracerConfiguration {\n return new TracerConfigurationBuilder().projectName(projectName).build();\n }\n\n public static builder(): TracerConfigurationBuilder {\n return new TracerConfigurationBuilder();\n }\n}\n\n/**\n * Builder for creating TracerConfiguration instances.\n *\n * @example\n * ```typescript\n * const config = TracerConfiguration.builder()\n * .projectName(\"my-project\")\n * .apiKey(\"custom-api-key\")\n * .organizationId(\"custom-org-id\")\n * .apiUrl(\"https://custom-api.judgmentlabs.ai\")\n * .enableEvaluation(false)\n * .build();\n * ```\n */\nexport class TracerConfigurationBuilder {\n private _projectName?: string;\n private _apiKey: string | null = JUDGMENT_API_KEY;\n private _organizationId: string | null = JUDGMENT_ORG_ID;\n private _apiUrl: string = JUDGMENT_API_URL;\n private _enableEvaluation: boolean = true;\n private _tracerName: string = JUDGEVAL_TRACER_INSTRUMENTING_MODULE_NAME;\n\n public projectName(projectName: string): this {\n this._projectName = projectName;\n return this;\n }\n\n public apiKey(apiKey: string): this {\n this._apiKey = apiKey;\n return this;\n }\n\n public organizationId(organizationId: string): this {\n this._organizationId = organizationId;\n return this;\n }\n\n public apiUrl(apiUrl: string): this {\n this._apiUrl = apiUrl;\n return this;\n }\n\n public enableEvaluation(enableEvaluation: boolean): this {\n this._enableEvaluation = enableEvaluation;\n return this;\n }\n\n public tracerName(tracerName: string): this {\n this._tracerName = tracerName;\n return this;\n }\n\n public build(): TracerConfiguration {\n if (!this._projectName) {\n throw new Error(\"Project name is required\");\n }\n\n if (!this._apiKey) {\n throw new Error(\"API key is required\");\n }\n\n if (!this._organizationId) {\n throw new Error(\"Organization ID is required\");\n }\n\n if (!this._apiUrl) {\n throw new Error(\"API URL is required\");\n }\n\n return new TracerConfiguration(\n this._projectName,\n this._apiKey,\n this._organizationId,\n this._apiUrl,\n this._enableEvaluation,\n this._tracerName,\n );\n }\n}\n",
15
+ "import { Example as ExampleModel } from \"../internal/api/models/Example\";\n\nexport type Example<T extends Record<string, any> = Record<string, any>> =\n ExampleModel & T;\n\nexport function createExample<T extends Record<string, any>>(\n properties: T,\n): Example<T> {\n const example: Example<T> = {\n example_id: undefined,\n created_at: new Date().toISOString(),\n name: null,\n ...properties,\n } as Example<T>;\n\n return example;\n}\n",
16
+ "export enum ExampleParams {\n INPUT = \"input\",\n ACTUAL_OUTPUT = \"actual_output\",\n EXPECTED_OUTPUT = \"expected_output\",\n CONTEXT = \"context\",\n RETRIEVAL_CONTEXT = \"retrieval_context\",\n TOOLS_CALLED = \"tools_called\",\n EXPECTED_TOOLS = \"expected_tools\",\n ADDITIONAL_METADATA = \"additional_metadata\",\n}\n\nexport type ExampleParamKeys = keyof typeof ExampleParams;\nexport type ExampleParamValues = `${ExampleParams}`;\n",
17
+ "import { ScorerConfig } from \"../internal/api/models\";\nimport { BaseScorer as BaseScorerModel } from \"../internal/api/models/BaseScorer\";\n\nexport type BaseScorer = BaseScorerModel & {\n addModel: (model: string) => void;\n successCheck: () => boolean;\n getRequiredParams: () => string[];\n getScorerConfig: () => ScorerConfig;\n};\n\nexport function createBaseScorer(): BaseScorer {\n const scorer: BaseScorer = {\n score_type: \"\",\n class_name: \"\",\n name: \"\",\n addModel: (model: string) => {\n scorer.model = model;\n },\n successCheck: () => {\n if (scorer.error != null) {\n return false;\n }\n if (scorer.score == null) {\n return false;\n }\n const threshold = scorer.threshold ?? 0.5;\n const score = scorer.score;\n return threshold != null && score != null && score >= threshold;\n },\n getRequiredParams: () => {\n return [];\n },\n getScorerConfig: () => {\n return {\n score_type: scorer.score_type,\n name: scorer.name,\n threshold: scorer.threshold ?? 0.5,\n strict_mode: scorer.strict_mode ?? false,\n required_params: [],\n kwargs: {},\n };\n },\n };\n\n scorer.class_name = \"BaseScorer\";\n scorer.name = scorer.class_name;\n if (scorer.strict_mode === true) {\n scorer.threshold = 1.0;\n }\n\n return scorer;\n}\n",
18
+ "import { BaseScorer, createBaseScorer } from \"./base-scorer\";\n\nexport enum APIScorerType {\n PROMPT_SCORER = \"Prompt Scorer\",\n TRACE_PROMPT_SCORER = \"Trace Prompt Scorer\",\n FAITHFULNESS = \"Faithfulness\",\n ANSWER_RELEVANCY = \"Answer Relevancy\",\n ANSWER_CORRECTNESS = \"Answer Correctness\",\n INSTRUCTION_ADHERENCE = \"Instruction Adherence\",\n EXECUTION_ORDER = \"Execution Order\",\n TOOL_ORDER = \"Tool Order\",\n CLASSIFIER = \"Classifier\",\n TOOL_DEPENDENCY = \"Tool Dependency\",\n CUSTOM = \"Custom\",\n}\n\nexport type APIScorer<\n T extends APIScorerType = APIScorerType,\n P extends readonly string[] = readonly string[],\n> = BaseScorer & {\n scoreType: T;\n requiredParams: P;\n setThreshold: (threshold: number) => void;\n getScoreType: () => T;\n setRequiredParams: (params: P) => void;\n};\n\nexport function createAPIScorer<\n T extends APIScorerType,\n P extends readonly string[],\n>(scoreType: T, requiredParams: P): APIScorer<T, P> {\n const scorer = createBaseScorer() as APIScorer<T, P>;\n\n scorer.scoreType = scoreType;\n scorer.name = scoreType;\n scorer.score_type = scoreType;\n scorer.requiredParams = requiredParams;\n\n scorer.setThreshold = (threshold: number) => {\n if (threshold < 0 || threshold > 1) {\n throw new Error(`Threshold must be between 0 and 1, got: ${threshold}`);\n }\n scorer.threshold = threshold;\n };\n\n scorer.getScoreType = () => {\n return scorer.scoreType;\n };\n\n scorer.setRequiredParams = (params: P) => {\n scorer.requiredParams = params;\n };\n\n return scorer;\n}\n",
19
+ "import {\n JUDGMENT_API_KEY,\n JUDGMENT_API_URL,\n JUDGMENT_ORG_ID,\n} from \"../../../env\";\nimport { JudgmentApiClient } from \"../../../internal/api\";\n\nexport class JudgmentAPIError extends Error {\n constructor(\n public statusCode: number,\n message: string,\n ) {\n super(message);\n this.name = \"JudgmentAPIError\";\n }\n}\n\nexport async function pushPromptScorer(\n name: string,\n prompt: string,\n threshold: number,\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n isTrace?: boolean,\n): Promise<string> {\n if (!JUDGMENT_API_URL || !judgmentApiKey || !organizationId) {\n throw new Error(\"Missing required API credentials\");\n }\n\n const client = new JudgmentApiClient(\n JUDGMENT_API_URL,\n judgmentApiKey,\n organizationId,\n );\n const response = await client.saveScorer({\n name,\n prompt,\n threshold,\n options,\n is_trace: isTrace,\n });\n return response.name;\n}\n\nexport async function fetchPromptScorer(\n name: string,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n) {\n if (!JUDGMENT_API_URL || !judgmentApiKey || !organizationId) {\n throw new Error(\"Missing required API credentials\");\n }\n\n const client = new JudgmentApiClient(\n JUDGMENT_API_URL,\n judgmentApiKey,\n organizationId,\n );\n const response = await client.fetchScorers({ names: [name] });\n if (response.scorers.length === 0) {\n throw new JudgmentAPIError(404, `Scorer with name ${name} not found`);\n }\n const { created_at, updated_at, ...config } = response.scorers[0];\n return config;\n}\n\nexport async function scorerExists(\n name: string,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n): Promise<boolean> {\n if (!JUDGMENT_API_URL || !judgmentApiKey || !organizationId) {\n throw new Error(\"Missing required API credentials\");\n }\n\n const client = new JudgmentApiClient(\n JUDGMENT_API_URL,\n judgmentApiKey,\n organizationId,\n );\n const response = await client.scorerExists({ name });\n return response.exists;\n}\n",
20
+ "import { JUDGMENT_API_KEY, JUDGMENT_ORG_ID } from \"../../../env\";\nimport { ScorerConfig } from \"../../../internal/api/models\";\nimport { APIScorer, APIScorerType } from \"../../api-scorer\";\nimport {\n fetchPromptScorer,\n JudgmentAPIError,\n pushPromptScorer,\n scorerExists,\n} from \"./prompt-scorer-utils\";\n\nexport abstract class BasePromptScorer\n implements APIScorer<APIScorerType, readonly string[]>\n{\n public scoreType: APIScorerType;\n public name: string;\n public prompt: string;\n public threshold: number;\n public options?: Record<string, number> | null;\n public judgmentApiKey: string;\n public organizationId: string;\n public requiredParams: readonly string[];\n public score_type: string;\n public class_name: string;\n public model?: string;\n public score?: number;\n public error?: string | null;\n public strict_mode?: boolean;\n\n constructor(\n scoreType: APIScorerType,\n name: string,\n prompt: string,\n threshold: number,\n requiredParams: readonly string[],\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ) {\n this.scoreType = scoreType;\n this.name = name;\n this.prompt = prompt;\n this.threshold = threshold;\n this.requiredParams = requiredParams;\n this.options = options;\n this.judgmentApiKey = judgmentApiKey;\n this.organizationId = organizationId;\n this.score_type = scoreType;\n this.class_name = \"BasePromptScorer\";\n this.model = undefined;\n this.score = undefined;\n this.error = null;\n this.strict_mode = false;\n }\n score_breakdown?: Record<string, any> | null | undefined;\n reason?: string | null | undefined;\n using_native_model?: boolean | null | undefined;\n success?: boolean | null | undefined;\n model_client?: any;\n additional_metadata?: Record<string, any> | null | undefined;\n user?: string | null | undefined;\n server_hosted?: boolean | undefined;\n\n static async get<T extends BasePromptScorer>(\n this: new (...args: any[]) => T,\n name: string,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ): Promise<T> {\n const config = await fetchPromptScorer(\n name,\n judgmentApiKey,\n organizationId,\n );\n\n const isTrace = config.is_trace === true;\n const expectedIsTrace =\n this.prototype.scoreType === APIScorerType.TRACE_PROMPT_SCORER;\n\n if (isTrace !== expectedIsTrace) {\n throw new JudgmentAPIError(\n 400,\n `Scorer with name ${name} is not a ${this.name}`,\n );\n }\n\n const scoreType = isTrace\n ? APIScorerType.TRACE_PROMPT_SCORER\n : APIScorerType.PROMPT_SCORER;\n\n return new this(\n scoreType,\n config.name, // Use config.name instead of name parameter\n config.prompt,\n config.threshold,\n [],\n config.options,\n judgmentApiKey,\n organizationId,\n );\n }\n\n static async create<T extends BasePromptScorer>(\n this: new (...args: any[]) => T,\n name: string,\n prompt: string,\n threshold: number = 0.5,\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ): Promise<T> {\n if (await scorerExists(name, judgmentApiKey, organizationId)) {\n throw new JudgmentAPIError(\n 400,\n `Scorer with name ${name} already exists. Either use the existing scorer with the get() method or use a new name.`,\n );\n }\n\n const isTrace =\n this.prototype.scoreType === APIScorerType.TRACE_PROMPT_SCORER;\n const scoreType = isTrace\n ? APIScorerType.TRACE_PROMPT_SCORER\n : APIScorerType.PROMPT_SCORER;\n\n await pushPromptScorer(\n name,\n prompt,\n threshold,\n options,\n judgmentApiKey,\n organizationId,\n isTrace,\n );\n\n return new this(\n scoreType,\n name,\n prompt,\n threshold,\n [],\n options,\n judgmentApiKey,\n organizationId,\n );\n }\n\n async updateThreshold(threshold: number): Promise<void> {\n this.setThreshold(threshold);\n await this.pushPromptScorer();\n }\n\n async setPrompt(prompt: string): Promise<void> {\n this.prompt = prompt;\n await this.pushPromptScorer();\n }\n\n async setOptions(options: Record<string, number> | null): Promise<void> {\n this.options = options;\n await this.pushPromptScorer();\n }\n\n async appendToPrompt(promptAddition: string): Promise<void> {\n this.prompt += promptAddition;\n await this.pushPromptScorer();\n }\n\n getThreshold(): number {\n return this.threshold;\n }\n\n getPrompt(): string {\n return this.prompt;\n }\n\n getOptions(): Record<string, number> | null {\n return this.options ? { ...this.options } : null;\n }\n\n getName(): string {\n return this.name;\n }\n\n getConfig(): Record<string, any> {\n return {\n name: this.name,\n prompt: this.prompt,\n threshold: this.threshold,\n options: this.options,\n } as const;\n }\n\n async pushPromptScorer(): Promise<void> {\n await pushPromptScorer(\n this.name,\n this.prompt,\n this.threshold,\n this.options,\n this.judgmentApiKey,\n this.organizationId,\n );\n }\n\n toString(): string {\n return `${this.constructor.name}(name=${this.name}, prompt=${\n this.prompt\n }, threshold=${this.threshold}, options=${JSON.stringify(this.options)})`;\n }\n\n addModel(model: string): void {\n this.model = model;\n }\n\n successCheck(): boolean {\n if (this.error != null) {\n return false;\n }\n if (this.score == null) {\n return false;\n }\n const threshold = this.threshold ?? 0.5;\n const score = this.score;\n return threshold != null && score != null && score >= threshold;\n }\n\n getRequiredParams(): string[] {\n if (Array.isArray(this.requiredParams)) {\n return [...this.requiredParams];\n }\n return [];\n }\n\n setThreshold(threshold: number): void {\n if (threshold < 0 || threshold > 1) {\n throw new Error(`Threshold must be between 0 and 1, got: ${threshold}`);\n }\n this.threshold = threshold;\n }\n\n getScoreType(): APIScorerType {\n return this.scoreType;\n }\n\n setRequiredParams(params: readonly string[]): void {\n this.requiredParams = params;\n }\n\n getScorerConfig(): ScorerConfig {\n return {\n score_type: this.getScoreType(),\n name: this.getName(),\n threshold: this.getThreshold(),\n strict_mode: this.strict_mode ?? false,\n required_params: this.getRequiredParams(),\n kwargs: {\n prompt: this.getPrompt(),\n ...(this.getOptions() ? { options: this.getOptions() } : {}),\n },\n };\n }\n}\n",
21
+ "import { JUDGMENT_API_KEY, JUDGMENT_ORG_ID } from \"../../../env\";\nimport { APIScorerType } from \"../../api-scorer\";\nimport { BasePromptScorer } from \"./base-prompt-scorer\";\nexport {\n fetchPromptScorer,\n JudgmentAPIError,\n pushPromptScorer,\n scorerExists,\n} from \"./prompt-scorer-utils\";\n\nexport class PromptScorer extends BasePromptScorer {\n constructor(\n scoreType: APIScorerType,\n name: string,\n prompt: string,\n threshold: number,\n requiredParams: readonly string[] = [],\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ) {\n super(\n scoreType,\n name,\n prompt,\n threshold,\n requiredParams,\n options,\n judgmentApiKey,\n organizationId,\n );\n }\n}\n",
22
+ "import { JUDGMENT_API_KEY, JUDGMENT_ORG_ID } from \"../../../env\";\nimport { APIScorerType } from \"../../api-scorer\";\nimport { BasePromptScorer } from \"./base-prompt-scorer\";\n\nexport class TracePromptScorer extends BasePromptScorer {\n constructor(\n scoreType: APIScorerType,\n name: string,\n prompt: string,\n threshold: number,\n requiredParams: readonly string[] = [],\n options?: Record<string, number> | null,\n judgmentApiKey: string = JUDGMENT_API_KEY || \"\",\n organizationId: string = JUDGMENT_ORG_ID || \"\",\n ) {\n super(\n scoreType,\n name,\n prompt,\n threshold,\n requiredParams,\n options,\n judgmentApiKey,\n organizationId,\n );\n }\n}\n",
23
+ "import { resourceFromAttributes } from \"@opentelemetry/resources\";\nimport {\n BatchSpanProcessor,\n WebTracerProvider,\n} from \"@opentelemetry/sdk-trace-web\";\nimport { VERSION } from \"../version\";\nimport { OpenTelemetryKeys } from \"./OpenTelemetryKeys\";\nimport { Tracer, TracerInitializeOptions } from \"./Tracer\";\nimport { TracerConfiguration } from \"./TracerConfiguration\";\n\nexport type BrowserTracerInitializeOptions = TracerInitializeOptions & {};\n\nexport class BrowserTracer extends Tracer {\n private webTracerProvider?: WebTracerProvider;\n\n public async initialize(\n options: BrowserTracerInitializeOptions = {},\n ): Promise<BrowserTracer> {\n if (this._initialized) {\n return this;\n }\n\n try {\n const resourceAttributes = {\n [OpenTelemetryKeys.ResourceKeys.SERVICE_NAME]:\n this.configuration.projectName,\n [OpenTelemetryKeys.ResourceKeys.TELEMETRY_SDK_VERSION]: VERSION,\n ...options.resourceAttributes,\n };\n\n const spanExporter = await this.getSpanExporter();\n\n this.webTracerProvider = new WebTracerProvider({\n resource: resourceFromAttributes(resourceAttributes),\n spanProcessors: [new BatchSpanProcessor(spanExporter)],\n });\n\n this.webTracerProvider.register();\n\n this._initialized = true;\n return this;\n } catch (error) {\n throw new Error(\n `Failed to initialize browser tracer: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n public static getInstance(configuration: TracerConfiguration): BrowserTracer {\n const key = `BrowserTracer:${configuration.projectName}`;\n if (!Tracer.instances.has(key)) {\n Tracer.instances.set(key, new BrowserTracer(configuration));\n }\n return Tracer.instances.get(key) as BrowserTracer;\n }\n\n public static createDefault(projectName: string): BrowserTracer {\n const configuration = TracerConfiguration.builder()\n .projectName(projectName)\n .build();\n return BrowserTracer.getInstance(configuration);\n }\n\n public static createWithConfiguration(\n configuration: TracerConfiguration,\n ): BrowserTracer {\n return new BrowserTracer(configuration);\n }\n}\n",
24
+ "export const VERSION = \"0.3.2\";\n",
25
+ "import { resourceFromAttributes } from \"@opentelemetry/resources\";\nimport { NodeSDK, NodeSDKConfiguration } from \"@opentelemetry/sdk-node\";\nimport { BatchSpanProcessor } from \"@opentelemetry/sdk-trace-node\";\nimport { VERSION } from \"../version\";\nimport { OpenTelemetryKeys } from \"./OpenTelemetryKeys\";\nimport { Tracer, TracerInitializeOptions } from \"./Tracer\";\nimport { TracerConfiguration } from \"./TracerConfiguration\";\n\nexport type NodeTracerInitializeOptions = TracerInitializeOptions & {\n instrumentations?: NodeSDKConfiguration[\"instrumentations\"];\n resourceAttributes?: Record<string, unknown>;\n};\n\nexport class NodeTracer extends Tracer {\n private nodeSDK?: NodeSDK;\n\n public async initialize(\n options: NodeTracerInitializeOptions = {},\n ): Promise<NodeTracer> {\n if (this._initialized) {\n return this;\n }\n\n try {\n const resourceAttributes = {\n [OpenTelemetryKeys.ResourceKeys.SERVICE_NAME]:\n this.configuration.projectName,\n [OpenTelemetryKeys.ResourceKeys.TELEMETRY_SDK_VERSION]: VERSION,\n ...options.resourceAttributes,\n };\n\n const spanExporter = await this.getSpanExporter();\n\n this.nodeSDK = new NodeSDK({\n resource: resourceFromAttributes(resourceAttributes),\n instrumentations: options.instrumentations,\n spanProcessor: new BatchSpanProcessor(spanExporter),\n ...options,\n });\n\n this.nodeSDK.start();\n\n this._initialized = true;\n return this;\n } catch (error) {\n throw new Error(\n `Failed to initialize node tracer: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n public static getInstance(configuration: TracerConfiguration): NodeTracer {\n const key = `NodeTracer:${configuration.projectName}`;\n if (!Tracer.instances.has(key)) {\n Tracer.instances.set(key, new NodeTracer(configuration));\n }\n return Tracer.instances.get(key) as NodeTracer;\n }\n\n public static createDefault(projectName: string): NodeTracer {\n const configuration = TracerConfiguration.builder()\n .projectName(projectName)\n .enableEvaluation(true)\n .build();\n return NodeTracer.getInstance(configuration);\n }\n\n public static createWithConfiguration(\n configuration: TracerConfiguration,\n ): NodeTracer {\n return new NodeTracer(configuration);\n }\n\n public async shutdown(): Promise<void> {\n if (this.nodeSDK) {\n await this.nodeSDK.shutdown();\n }\n }\n}\n"
26
+ ],
27
+ "mappings": "45CACkC,IAAlC,+CASO,MAAM,CAA6C,CACvC,SAWjB,WAAW,CACT,EACA,EACA,EACA,EACA,CACA,GAAI,CAAC,GAAa,EAAU,KAAK,IAAM,GACrC,MAAU,MAAM,gDAAgD,EAGlE,KAAK,SAAW,IAAI,oBAAkB,CACpC,IAAK,EACL,QAAS,CACP,cAAe,UAAU,IACzB,oBAAqB,EACrB,eAAgB,CAClB,CACF,CAAC,QAMW,QAAO,EAAgC,CACnD,OAAO,IAAI,EAMb,MAAM,CACJ,EACA,EACM,CACN,KAAK,SAAS,OAAO,EAAO,CAAc,EAM5C,QAAQ,EAAkB,CACxB,OAAO,KAAK,SAAS,SAAS,EAMhC,UAAU,EAAkB,CAC1B,OAAO,KAAK,SAAS,aAAa,GAAK,QAAQ,QAAQ,EAE3D,CAKO,MAAM,CAA4B,CAC/B,UACA,QACA,gBACA,WAER,WAAW,EAAG,EAQP,QAAQ,CAAC,EAAwB,CAEtC,OADA,KAAK,UAAY,EACV,KASF,MAAM,CAAC,EAAsB,CAElC,OADA,KAAK,QAAU,EACR,KASF,cAAc,CAAC,EAA8B,CAElD,OADA,KAAK,gBAAkB,EAChB,KASF,SAAS,CAAC,EAAyB,CAExC,OADA,KAAK,WAAa,EACX,KASF,KAAK,EAAyB,CACnC,GAAI,CAAC,KAAK,WAAa,KAAK,UAAU,KAAK,IAAM,GAC/C,MAAU,MAAM,sBAAsB,EAExC,GAAI,CAAC,KAAK,SAAW,KAAK,QAAQ,KAAK,IAAM,GAC3C,MAAU,MAAM,qBAAqB,EAEvC,GAAI,CAAC,KAAK,iBAAmB,KAAK,gBAAgB,KAAK,IAAM,GAC3D,MAAU,MAAM,6BAA6B,EAE/C,GAAI,CAAC,KAAK,YAAc,KAAK,WAAW,KAAK,IAAM,GACjD,MAAU,MAAM,wBAAwB,EAG1C,OAAO,IAAI,EACT,KAAK,UACL,KAAK,QACL,KAAK,gBACL,KAAK,UACP,EAEJ,CCrJO,MAAM,CAAyC,CACpD,MAAM,CACJ,EACA,EACM,CACN,EAAe,CAAE,KAAM,CAAE,CAAC,EAG5B,KAAK,EAAkB,CACrB,OAAO,QAAQ,QAAQ,EAGzB,QAAQ,EAAkB,CACxB,OAAO,QAAQ,QAAQ,EAE3B,CCtBO,MAAe,CAAkB,OACf,eAAgB,CACrC,mBAAoB,qBACpB,eAAgB,iBAChB,gBAAiB,kBACjB,sBAAuB,wBACvB,mBAAoB,qBAEpB,qBAAsB,uBAEtB,kBAAmB,oBAEnB,yBAA0B,2BAC1B,0BAA2B,4BAC3B,6BAA8B,+BAE9B,mBAAoB,8BAEpB,cAAe,gBACf,kBAAmB,oBACnB,qBAAsB,uBACtB,sBAAuB,wBACvB,cAAe,gBACf,0BAA2B,4BAC3B,2BAA4B,6BAC5B,+BAAgC,iCAChC,2BAA4B,6BAC5B,0BAA2B,4BAC3B,+BAAgC,iCAEhC,wBAAyB,6BAC3B,QAEuB,uBAAwB,CAC7C,qBAAsB,uBACtB,UAAW,WACb,QAEuB,cAAe,CACpC,aAAc,eACd,uBAAwB,yBACxB,mBAAoB,qBACpB,sBAAuB,wBACvB,oBAAqB,qBACvB,CACF,CCzCO,IAJP,0BCEA,SAAS,CAAS,CAAC,EAAiB,EAAsC,CACxE,IAAM,EAAQ,QAAQ,IAAI,GAC1B,GAAI,CAAC,EACH,OAAO,GAAgB,KAEzB,OAAO,EAGF,IAAM,EAAmB,EAAU,kBAAkB,EAC/C,EAAkB,EAAU,iBAAiB,EAC7C,EAAmB,EAC9B,mBACA,6BACF,EACa,EAA6B,EACxC,6BACA,SACF,EACa,GAA6B,EACxC,6BACA,MACF,EACa,GAA8B,EACzC,8BACA,MACF,EACa,GAAoB,EAAU,mBAAmB,ECtBvD,MAAM,CAAkB,CACrB,QACA,OACA,eAER,WAAW,CAAC,EAAiB,EAAgB,EAAwB,CACnE,KAAK,QAAU,EACf,KAAK,OAAS,EACd,KAAK,eAAiB,EAGhB,QAAQ,CAAC,EAAsB,CACrC,OAAO,KAAK,QAAU,EAGhB,YAAY,EAA2B,CAC7C,GAAI,CAAC,KAAK,QAAU,CAAC,KAAK,eACxB,MAAU,MAAM,4CAA4C,EAE9D,MAAO,CACL,eAAgB,mBAChB,cAAe,UAAU,KAAK,SAC9B,oBAAqB,KAAK,cAC5B,OAGI,0BAAyB,CAC7B,EACe,CACf,IAAM,EAAM,KAAK,SAAS,iCAAiC,EACrD,EAAW,MAAM,MAAM,EAAK,CAChC,OAAQ,OACR,QAAS,KAAK,aAAa,EAC3B,KAAM,KAAK,UAAU,CAAO,CAC9B,CAAC,EAED,GAAI,CAAC,EAAS,GACZ,MAAU,MACR,eAAe,EAAS,YAAY,MAAM,EAAS,KAAK,GAC1D,EAGF,YAGI,wBAAuB,CAC3B,EACe,CACf,IAAM,EAAM,KAAK,SAAS,+BAA+B,EACnD,EAAW,MAAM,MAAM,EAAK,CAChC,OAAQ,OACR,QAAS,KAAK,aAAa,EAC3B,KAAM,KAAK,UAAU,CAAO,CAC9B,CAAC,EAED,GAAI,CAAC,EAAS,GACZ,MAAU,MACR,eAAe,EAAS,YAAY,MAAM,EAAS,KAAK,GAC1D,EAGF,YAGI,eAAc,CAAC,EAA4C,CAC/D,IAAM,EAAM,KAAK,SAAS,oBAAoB,EACxC,EAAW,MAAM,MAAM,EAAK,CAChC,OAAQ,OACR,QAAS,KAAK,aAAa,EAC3B,KAAM,KAAK,UAAU,CAAO,CAC9B,CAAC,EAED,GAAI,CAAC,EAAS,GACZ,MAAU,MACR,eAAe,EAAS,YAAY,MAAM,EAAS,KAAK,GAC1D,EAGF,YAGI,mBAAkB,CAAC,EAAiD,CACxE,IAAM,EAAM,KAAK,SAAS,wBAAwB,EAC5C,EAAW,MAAM,MAAM,EAAK,CAChC,OAAQ,OACR,QAAS,KAAK,aAAa,EAC3B,KAAM,KAAK,UAAU,CAAO,CAC9B,CAAC,EAED,GAAI,CAAC,EAAS,GACZ,MAAU,MACR,eAAe,EAAS,YAAY,MAAM,EAAS,KAAK,GAC1D,EAGF,YAGI,oBAAmB,CACvB,EACA,EACe,CACf,IAAM,EAAc,IAAI,gBACxB,EAAY,IAAI,oBAAqB,CAAiB,EACtD,EAAY,IAAI,eAAgB,CAAY,EAC5C,IAAM,EAAM,KAAK,SACf,2BACG,EAAY,SAAS,EAAI,IAAM,EAAY,SAAS,EAAI,GAC7D,EACM,EAAW,MAAM,MAAM,EAAK,CAChC,OAAQ,MACR,QAAS,KAAK,aAAa,CAC7B,CAAC,EAED,GAAI,CAAC,EAAS,GACZ,MAAU,MACR,eAAe,EAAS,YAAY,MAAM,EAAS,KAAK,GAC1D,EAGF,YAGI,aAAY,CAChB,EACsC,CACtC,IAAM,EAAM,KAAK,SAAS,iBAAiB,EACrC,EAAW,MAAM,MAAM,EAAK,CAChC,OAAQ,OACR,QAAS,KAAK,aAAa,EAC3B,KAAM,KAAK,UAAU,CAAO,CAC9B,CAAC,EAED,GAAI,CAAC,EAAS,GACZ,MAAU,MACR,eAAe,EAAS,YAAY,MAAM,EAAS,KAAK,GAC1D,EAGF,OAAQ,MAAM,EAAS,KAAK,OAGxB,WAAU,CACd,EAC0C,CAC1C,IAAM,EAAM,KAAK,SAAS,eAAe,EACnC,EAAW,MAAM,MAAM,EAAK,CAChC,OAAQ,OACR,QAAS,KAAK,aAAa,EAC3B,KAAM,KAAK,UAAU,CAAO,CAC9B,CAAC,EAED,GAAI,CAAC,EAAS,GACZ,MAAU,MACR,eAAe,EAAS,YAAY,MAAM,EAAS,KAAK,GAC1D,EAGF,OAAQ,MAAM,EAAS,KAAK,OAGxB,aAAY,CAChB,EAC4C,CAC5C,IAAM,EAAM,KAAK,SAAS,iBAAiB,EACrC,EAAW,MAAM,MAAM,EAAK,CAChC,OAAQ,OACR,QAAS,KAAK,aAAa,EAC3B,KAAM,KAAK,UAAU,CAAO,CAC9B,CAAC,EAED,GAAI,CAAC,EAAS,GACZ,MAAU,MACR,eAAe,EAAS,YAAY,MAAM,EAAS,KAAK,GAC1D,EAGF,OAAQ,MAAM,EAAS,KAAK,OAGxB,gBAAe,CACnB,EAC4C,CAC5C,IAAM,EAAM,KAAK,SAAS,oBAAoB,EACxC,EAAW,MAAM,MAAM,EAAK,CAChC,OAAQ,OACR,QAAS,KAAK,aAAa,EAC3B,KAAM,KAAK,UAAU,CAAO,CAC9B,CAAC,EAED,GAAI,CAAC,EAAS,GACZ,MAAU,MACR,eAAe,EAAS,YAAY,MAAM,EAAS,KAAK,GAC1D,EAGF,OAAQ,MAAM,EAAS,KAAK,EAEhC,CC1MA,IAAM,GAAY,cACZ,GAAU,wBACV,GAAe,IACf,GAAS,uBACT,GAAiB,mCAEvB,SAAS,EAAW,CAAC,EAAsB,CACzC,OAAO,SAAS,UAAU,SAAS,KAAK,CAAE,EAG5C,SAAS,EAAW,CAAC,EAAuC,CAC1D,IAAM,EAAS,GAAY,CAAE,EAAE,QAAQ,GAAgB,EAAE,EACzD,OAAO,EAAO,MAAM,EAAS,GAAK,EAAO,MAAM,EAAO,EAGjD,SAAS,CAAiB,CAAC,EAAwB,CACxD,IAAM,EAAO,GAAY,CAAE,EAC3B,GAAI,CAAC,GAAQ,CAAC,EAAK,GACjB,MAAO,CAAC,EAGV,OAAO,EAAK,GACT,MAAM,EAAY,EAClB,IAAI,CAAC,IAAQ,CAEZ,OADc,EAAI,QAAQ,GAAQ,CAAC,EAAK,EAAY,IAAS,CAAI,EACpD,KAAK,EACnB,EACA,OAAO,CAAC,IAAS,EAAK,OAAS,CAAC,EC7B9B,MAAM,CAAO,OACM,OAAQ,gBACR,KAAM,iBACN,QAAS,iBACT,MAAO,iBAEjB,OAAQ,CACpB,MAAO,EACP,KAAM,EACN,QAAS,EACT,MAAO,EACP,SAAU,CACZ,QAEe,aAAc,SACd,cAAuB,EAAO,MAAM,WACpC,UAAW,SAEX,WAAU,EAAS,CAChC,GAAI,CAAC,EAAO,YAAa,CACvB,IAAM,EAAU,QAAQ,IAAI,kBAC5B,EAAO,SAAW,CAAC,GAAW,QAAQ,OAAO,MAC7C,EAAO,YAAc,UAIX,SAAQ,CAAC,EAAqB,CAC1C,EAAO,aAAe,QAGV,YAAW,CAAC,EAAyB,CACjD,EAAO,SAAW,QAGL,IAAG,CAAC,EAAe,EAAuB,CAGvD,GAFA,EAAO,WAAW,EAEd,EAAQ,EAAO,aACjB,OAGF,IAAM,EAAY,IAAI,KAAK,EACxB,YAAY,EACZ,QAAQ,IAAK,GAAG,EAChB,UAAU,EAAG,EAAE,EACZ,EACJ,OAAO,KAAK,EAAO,KAAK,EAAE,KACxB,CAAC,IAAQ,EAAO,MAAM,KAAsC,CAC9D,GAAK,UACH,EAAmB,GAAG,kBAA0B,OAAe,IAEnE,GAAI,EAAO,SAOT,EAAmB,GALjB,IAAU,EAAO,MAAM,OAAS,IAAU,EAAO,MAAM,KACnD,EAAO,KACP,IAAU,EAAO,MAAM,QACrB,EAAO,OACP,EAAO,MACe,IAAmB,EAAO,SAIxD,GAAS,EAAO,MAAM,MAAQ,QAAQ,OAAS,QAAQ,QAClD,MAAM,EAAmB;AAAA,CAAI,QAGxB,MAAK,CAAC,EAAuB,CACzC,EAAO,IAAI,EAAO,MAAM,MAAO,CAAO,QAG1B,KAAI,CAAC,EAAuB,CACxC,EAAO,IAAI,EAAO,MAAM,KAAM,CAAO,QAGzB,QAAO,CAAC,EAAuB,CAC3C,EAAO,IAAI,EAAO,MAAM,QAAS,CAAO,QAG5B,KAAI,CAAC,EAAuB,CACxC,EAAO,IAAI,EAAO,MAAM,QAAS,CAAO,QAG5B,MAAK,CAAC,EAAuB,CACzC,EAAO,IAAI,EAAO,MAAM,MAAO,CAAO,QAG1B,SAAQ,CAAC,EAAuB,CAC5C,EAAO,IAAI,EAAO,MAAM,SAAU,CAAO,EAE7C,CJ/DO,MAAe,CAAO,OACV,WAAiC,IAAI,IAE/C,UACA,OAAkB,KAClB,WAAyB,KAAK,UAE3B,aAAwB,GAE1B,UAA2B,KACzB,cAEH,gBAAgB,EAAwB,CAC7C,OAAO,KAAK,cAGP,YAAY,EAAkB,CACnC,OAAO,KAAK,UAGP,aAAa,EAAe,CACjC,OAAO,KAAK,WAGP,WAAW,CAAC,EAAoC,CACrD,KAAK,cAAgB,EAErB,KAAK,UAAY,IAAI,EACnB,KAAK,cAAc,OACnB,KAAK,cAAc,OACnB,KAAK,cAAc,cACrB,EAEA,KAAK,aAAe,QAKR,iBAAgB,EAAoB,CAChD,GAAI,CACF,EAAO,KACL,qCAAqC,KAAK,cAAc,aAC1D,EAEA,IAAM,EAAW,MAAM,KAAK,UAAU,gBAAgB,CACpD,aAAc,KAAK,cAAc,WACnC,CAAC,EACD,EAAO,KAAK,wBAAwB,EAAS,YAAY,EACzD,IAAM,EAAoB,EAAS,YAAY,SAAS,EAExD,GAAI,CAAC,EACH,MAAU,MACR,qCAAqC,KAAK,cAAc,aAC1D,EAMF,OAHA,KAAK,UAAY,EACjB,EAAO,KAAK,qCAAqC,KAAK,WAAW,EAE1D,KAAK,UACZ,MAAO,EAAO,CACd,MAAU,MACR,iCAAiC,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,GACxF,SAIU,YAAW,CACvB,EACA,EACA,EACsB,CACtB,IAAM,EAAW,GAAkB,SAAS,GAAG,EAC3C,GAAG,kBACH,GAAG,mBAEP,OAAO,EAAqB,QAAQ,EACjC,SAAS,CAAQ,EACjB,OAAO,CAAM,EACb,eAAe,CAAc,EAC7B,UAAU,CAAS,EACnB,MAAM,OAGE,gBAAe,EAE1B,CACA,GAAI,CACF,IAAM,EAAY,MAAM,KAAK,iBAAiB,EAC9C,OAAO,KAAK,2BAA2B,CAAS,EAChD,MAAO,EAAO,CAQd,OAPA,EAAO,MACL,6BACE,KAAK,cAAc,YACnB,gEACC,KAAK,cAAc,gBAAkB,WACtC,sCACJ,EACO,IAAI,GAIR,WAAW,CAAC,EAAsB,CACvC,IAAM,EAAc,QAAM,cAAc,EACxC,GAAI,CAAC,EAAa,CAChB,EAAO,KAAK,4CAA4C,EACxD,OAEF,GAAI,IAAS,KACX,EAAY,aACV,EAAkB,cAAc,mBAChC,CACF,EAIG,YAAY,CAAC,EAAa,EAAsB,CACrD,IAAM,EAAc,QAAM,cAAc,EACxC,GAAI,CAAC,EAAa,CAChB,EAAO,KAAK,6CAA6C,EACzD,OAEF,EAAY,aAAa,EAAK,KAAK,WAAW,CAAK,CAAC,EAG/C,UAAU,EAAS,CACxB,KAAK,YAAY,KAAK,EAGjB,WAAW,EAAS,CACzB,KAAK,YAAY,MAAM,EAGlB,cAAc,EAAS,CAC5B,KAAK,YAAY,MAAM,EAGlB,aAAa,CAAC,EAA2C,CAC9D,GAAI,CAAC,EACH,OAEF,IAAM,EAAc,QAAM,cAAc,EACxC,GAAI,CAAC,EAAa,CAChB,EAAO,KAAK,8CAA8C,EAC1D,OAEF,QAAY,EAAK,KAAU,OAAO,QAAQ,CAAU,EAClD,EAAY,aAAa,EAAK,KAAK,WAAW,CAAK,CAAC,EAIjD,QAAQ,CAAC,EAAsB,CACpC,KAAK,aAAa,EAAkB,cAAc,eAAgB,CAAK,EAGlE,SAAS,CAAC,EAAuB,CACtC,KAAK,aAAa,EAAkB,cAAc,gBAAiB,CAAM,EAGpE,aAAa,CAClB,EACA,EACA,EACM,CACN,GAAI,CAAC,KAAK,aAAc,CACtB,EAAO,KAAK,gDAAgD,EAC5D,OAGF,GAAI,CAAC,KAAK,cAAc,iBACtB,OAGF,IAAM,EAAc,QAAM,cAAc,EACxC,GAAI,CAAC,EAAa,CAChB,EAAO,KAAK,8CAA8C,EAC1D,OAEF,GAAI,CAAC,EAAY,YAAY,EAAG,CAC9B,EAAO,KAAK,sDAAsD,EAClE,OAGF,IAAM,EAAc,EAAY,YAAY,EACtC,EAAU,EAAY,QACtB,EAAS,EAAY,OAE3B,EAAO,KACL,0BAA0B,KAAK,cAAc,wBAAwB,aAAmB,aAAkB,EAAO,MACnH,EAEA,IAAM,EAAgB,KAAK,oBACzB,EACA,EACA,EACA,EACA,CACF,EACA,KAAK,kBAAkB,CAAa,EAG/B,kBAAkB,CAAC,EAAoB,EAAsB,CAClE,GAAI,CAAC,KAAK,aAAc,CACtB,EAAO,KAAK,qDAAqD,EACjE,OAGF,GAAI,CAAC,KAAK,cAAc,iBACtB,OAGF,IAAM,EAAc,QAAM,cAAc,EACxC,GAAI,CAAC,EAAa,CAChB,EAAO,KAAK,mDAAmD,EAC/D,OAEF,GAAI,CAAC,EAAY,YAAY,EAAG,CAC9B,EAAO,KAAK,2DAA2D,EACvE,OAGF,IAAM,EAAc,EAAY,YAAY,EACtC,EAAU,EAAY,QACtB,EAAS,EAAY,OAE3B,EAAO,KACL,+BAA+B,KAAK,cAAc,wBAAwB,aAAmB,aAAkB,EAAO,MACxH,EAEA,GAAI,CACF,IAAM,EAAqB,KAAK,yBAC9B,EACA,EACA,EACA,CACF,EACM,EAAgB,KAAK,WAAW,CAAkB,EACxD,EAAY,aACV,EAAkB,cAAc,mBAChC,CACF,EACA,MAAO,EAAO,CACd,EAAO,MACL,yCAAyC,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,GAChG,GAII,wBAAwB,CAC9B,EACA,EACA,EACA,EACyB,CACzB,IAAM,EAAW,wBAAwB,GAAU,KAAK,IAAI,IACtD,EAAY,GAAS,EAErB,EAAe,EAAO,gBAAgB,EAE5C,MAAO,CACL,aAAc,KAAK,cAAc,YACjC,UAAW,EACX,OAAQ,EACR,MAAO,EACP,gBAAiB,KAAK,cAAc,eACpC,SAAU,EACV,cAAe,CACjB,EAGM,0BAA0B,CAAC,EAAyC,CAC1E,IAAM,EAAW,KAAK,cAAc,OAAO,SAAS,GAAG,EACnD,GAAG,KAAK,cAAc,uBACtB,GAAG,KAAK,cAAc,wBAE1B,OAAO,EAAqB,QAAQ,EACjC,SAAS,CAAQ,EACjB,OAAO,KAAK,cAAc,MAAM,EAChC,eAAe,KAAK,cAAc,cAAc,EAChD,UAAU,CAAS,EACnB,MAAM,EAGH,mBAAmB,CACzB,EACA,EACA,EACA,EACA,EACsB,CACtB,IAAM,EAAQ,kBAAkB,GAAU,KAAK,IAAI,IAC7C,EAAY,GAAS,EAErB,EAAe,EAAO,gBAAgB,EAa5C,MAX4C,CAC1C,aAAc,KAAK,cAAc,YACjC,UAAW,EACX,SAAU,CAAC,CAAO,EAClB,eAAgB,CAAC,EACjB,iBAAkB,CAAC,CAAY,EAC/B,MAAO,EACP,SAAU,EACV,cAAe,CACjB,OAKY,kBAAiB,CAC7B,EACe,CACf,GAAI,CAAC,KAAK,UAAW,CACnB,EAAO,KAAK,uDAAuD,EACnE,OAGF,GAAI,CACF,MAAM,KAAK,UAAU,0BAA0B,CAAa,EAC5D,EAAO,KAAK,6BAA6B,EAAc,WAAW,EAClE,MAAO,EAAO,CACd,EAAO,MACL,qCAAqC,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,GAC5F,GAIG,OAAqC,CAC1C,EACA,EAAqB,OACQ,CAC7B,MAAO,IAAI,IAAgB,CACzB,IAAM,EAAc,QAAM,cAAc,EACxC,GAAI,CAAC,EAEH,OADA,EAAO,KAAK,wCAAwC,EAC7C,EAAK,GAAG,CAAI,EAGrB,IAAM,EAAW,EAAK,MAAQ,YACxB,EAAS,QAAM,UAAU,KAAK,cAAc,UAAU,EAE5D,OAAO,UAAQ,KAAK,QAAM,QAAQ,UAAQ,OAAO,EAAG,CAAW,EAAG,IAAM,CACtE,OAAO,EAAO,gBACZ,EACA,CAAE,KAAM,WAAsB,QAAS,EACvC,CAAC,IAAS,CACR,GAAI,CACF,EAAK,aACH,EAAkB,cAAc,mBAChC,CACF,EAEA,IAAM,EAAW,EAAkB,CAAI,EACvC,GAAI,EAAS,SAAW,EAAK,OAAQ,CACnC,IAAM,EAAoC,CAAC,EAC3C,EAAS,QAAQ,CAAC,EAAM,IAAU,CAChC,EAAS,GAAQ,EAAK,GACvB,EACD,EAAK,aACH,EAAkB,cAAc,eAChC,KAAK,WAAW,CAAQ,CAC1B,EAGF,IAAM,EAAS,EAAK,GAAG,CAAI,EAE3B,GAAI,aAAkB,QACpB,OAAO,EACJ,KAAK,CAAC,IAAQ,CAMb,OALA,EAAK,aACH,EAAkB,cAAc,gBAChC,KAAK,WAAW,CAAG,CACrB,EACA,EAAK,IAAI,EACF,EACR,EACA,MAAM,CAAC,IAAQ,CAGd,MAFA,EAAK,gBAAgB,CAAY,EACjC,EAAK,IAAI,EACH,EACP,EAOH,YALA,EAAK,aACH,EAAkB,cAAc,gBAChC,KAAK,WAAW,CAAM,CACxB,EACA,EAAK,IAAI,EACF,EAET,MAAO,EAAK,CAGZ,MAFA,EAAK,gBAAgB,CAAY,EACjC,EAAK,IAAI,EACH,GAGZ,EACD,QAIQ,SAAQ,EAAkB,EACzC,CK3aO,IAAM,EACX,yCCmBK,MAAM,CAAoB,CAEb,YACA,OACA,eACA,OACA,iBACA,WANlB,WAAW,CACO,EACA,EACA,EACA,EACA,EACA,EAAqB,EACrC,CANgB,mBACA,cACA,sBACA,cACA,wBACA,wBAgBJ,cAAa,CAAC,EAA0C,CACpE,OAAO,IAAI,EAA2B,EAAE,YAAY,CAAW,EAAE,MAAM,QAG3D,QAAO,EAA+B,CAClD,OAAO,IAAI,EAEf,CAgBO,MAAM,CAA2B,CAC9B,aACA,QAAyB,EACzB,gBAAiC,EACjC,QAAkB,EAClB,kBAA6B,GAC7B,YAAsB,EAEvB,WAAW,CAAC,EAA2B,CAE5C,OADA,KAAK,aAAe,EACb,KAGF,MAAM,CAAC,EAAsB,CAElC,OADA,KAAK,QAAU,EACR,KAGF,cAAc,CAAC,EAA8B,CAElD,OADA,KAAK,gBAAkB,EAChB,KAGF,MAAM,CAAC,EAAsB,CAElC,OADA,KAAK,QAAU,EACR,KAGF,gBAAgB,CAAC,EAAiC,CAEvD,OADA,KAAK,kBAAoB,EAClB,KAGF,UAAU,CAAC,EAA0B,CAE1C,OADA,KAAK,YAAc,EACZ,KAGF,KAAK,EAAwB,CAClC,GAAI,CAAC,KAAK,aACR,MAAU,MAAM,0BAA0B,EAG5C,GAAI,CAAC,KAAK,QACR,MAAU,MAAM,qBAAqB,EAGvC,GAAI,CAAC,KAAK,gBACR,MAAU,MAAM,6BAA6B,EAG/C,GAAI,CAAC,KAAK,QACR,MAAU,MAAM,qBAAqB,EAGvC,OAAO,IAAI,EACT,KAAK,aACL,KAAK,QACL,KAAK,gBACL,KAAK,QACL,KAAK,kBACL,KAAK,WACP,EAEJ,CC7HO,SAAS,EAA4C,CAC1D,EACY,CAQZ,MAP4B,CAC1B,WAAY,OACZ,WAAY,IAAI,KAAK,EAAE,YAAY,EACnC,KAAM,QACH,CACL,ECbK,IAAK,GAAL,CAAK,IAAL,CACL,QAAQ,QACR,gBAAgB,gBAChB,kBAAkB,kBAClB,UAAU,UACV,oBAAoB,oBACpB,eAAe,eACf,iBAAiB,iBACjB,sBAAsB,wBARZ,QCUL,SAAS,CAAgB,EAAe,CAC7C,IAAM,EAAqB,CACzB,WAAY,GACZ,WAAY,GACZ,KAAM,GACN,SAAU,CAAC,IAAkB,CAC3B,EAAO,MAAQ,GAEjB,aAAc,IAAM,CAClB,GAAI,EAAO,OAAS,KAClB,MAAO,GAET,GAAI,EAAO,OAAS,KAClB,MAAO,GAET,IAAM,EAAY,EAAO,WAAa,IAChC,EAAQ,EAAO,MACrB,OAAO,GAAa,MAAQ,GAAS,MAAQ,GAAS,GAExD,kBAAmB,IAAM,CACvB,MAAO,CAAC,GAEV,gBAAiB,IAAM,CACrB,MAAO,CACL,WAAY,EAAO,WACnB,KAAM,EAAO,KACb,UAAW,EAAO,WAAa,IAC/B,YAAa,EAAO,aAAe,GACnC,gBAAiB,CAAC,EAClB,OAAQ,CAAC,CACX,EAEJ,EAIA,GAFA,EAAO,WAAa,aACpB,EAAO,KAAO,EAAO,WACjB,EAAO,cAAgB,GACzB,EAAO,UAAY,EAGrB,OAAO,EChDF,IAAK,GAAL,CAAK,IAAL,CACL,gBAAgB,gBAChB,sBAAsB,sBACtB,eAAe,eACf,mBAAmB,mBACnB,qBAAqB,qBACrB,wBAAwB,wBACxB,kBAAkB,kBAClB,aAAa,aACb,aAAa,aACb,kBAAkB,kBAClB,SAAS,WAXC,QAyBL,SAAS,EAGf,CAAC,EAAc,EAAoC,CAClD,IAAM,EAAS,EAAiB,EAsBhC,OApBA,EAAO,UAAY,EACnB,EAAO,KAAO,EACd,EAAO,WAAa,EACpB,EAAO,eAAiB,EAExB,EAAO,aAAe,CAAC,IAAsB,CAC3C,GAAI,EAAY,GAAK,EAAY,EAC/B,MAAU,MAAM,2CAA2C,GAAW,EAExE,EAAO,UAAY,GAGrB,EAAO,aAAe,IAAM,CAC1B,OAAO,EAAO,WAGhB,EAAO,kBAAoB,CAAC,IAAc,CACxC,EAAO,eAAiB,GAGnB,EC9CF,MAAM,UAAyB,KAAM,CAEjC,WADT,WAAW,CACF,EACP,EACA,CACA,MAAM,CAAO,EAHN,kBAIP,KAAK,KAAO,mBAEhB,CAEA,eAAsB,CAAgB,CACpC,EACA,EACA,EACA,EACA,EAAyB,GAAoB,GAC7C,EAAyB,GAAmB,GAC5C,EACiB,CACjB,GAAI,CAAC,GAAoB,CAAC,GAAkB,CAAC,EAC3C,MAAU,MAAM,kCAAkC,EAepD,OAPiB,MALF,IAAI,EACjB,EACA,EACA,CACF,EAC8B,WAAW,CACvC,OACA,SACA,YACA,UACA,SAAU,CACZ,CAAC,GACe,KAGlB,eAAsB,CAAiB,CACrC,EACA,EAAyB,GAAoB,GAC7C,EAAyB,GAAmB,GAC5C,CACA,GAAI,CAAC,GAAoB,CAAC,GAAkB,CAAC,EAC3C,MAAU,MAAM,kCAAkC,EAQpD,IAAM,EAAW,MALF,IAAI,EACjB,EACA,EACA,CACF,EAC8B,aAAa,CAAE,MAAO,CAAC,CAAI,CAAE,CAAC,EAC5D,GAAI,EAAS,QAAQ,SAAW,EAC9B,MAAM,IAAI,EAAiB,IAAK,oBAAoB,aAAgB,EAEtE,IAAQ,aAAY,gBAAe,GAAW,EAAS,QAAQ,GAC/D,OAAO,EAGT,eAAsB,CAAY,CAChC,EACA,EAAyB,GAAoB,GAC7C,EAAyB,GAAmB,GAC1B,CAClB,GAAI,CAAC,GAAoB,CAAC,GAAkB,CAAC,EAC3C,MAAU,MAAM,kCAAkC,EASpD,OADiB,MALF,IAAI,EACjB,EACA,EACA,CACF,EAC8B,aAAa,CAAE,MAAK,CAAC,GACnC,OCxEX,MAAe,CAEtB,CACS,UACA,KACA,OACA,UACA,QACA,eACA,eACA,eACA,WACA,WACA,MACA,MACA,MACA,YAEP,WAAW,CACT,EACA,EACA,EACA,EACA,EACA,EACA,EAAyB,GAAoB,GAC7C,EAAyB,GAAmB,GAC5C,CACA,KAAK,UAAY,EACjB,KAAK,KAAO,EACZ,KAAK,OAAS,EACd,KAAK,UAAY,EACjB,KAAK,eAAiB,EACtB,KAAK,QAAU,EACf,KAAK,eAAiB,EACtB,KAAK,eAAiB,EACtB,KAAK,WAAa,EAClB,KAAK,WAAa,mBAClB,KAAK,MAAQ,OACb,KAAK,MAAQ,OACb,KAAK,MAAQ,KACb,KAAK,YAAc,GAErB,gBACA,OACA,mBACA,QACA,aACA,oBACA,KACA,0BAEa,IAA+B,CAE1C,EACA,EAAyB,GAAoB,GAC7C,EAAyB,GAAmB,GAChC,CACZ,IAAM,EAAS,MAAM,EACnB,EACA,EACA,CACF,EAEM,EAAU,EAAO,WAAa,GAC9B,EACJ,KAAK,UAAU,kCAEjB,GAAI,IAAY,EACd,MAAM,IAAI,EACR,IACA,oBAAoB,cAAiB,KAAK,MAC5C,EAGF,IAAM,EAAY,wCAIlB,OAAO,IAAI,KACT,EACA,EAAO,KACP,EAAO,OACP,EAAO,UACP,CAAC,EACD,EAAO,QACP,EACA,CACF,cAGW,OAAkC,CAE7C,EACA,EACA,EAAoB,IACpB,EACA,EAAyB,GAAoB,GAC7C,EAAyB,GAAmB,GAChC,CACZ,GAAI,MAAM,EAAa,EAAM,EAAgB,CAAc,EACzD,MAAM,IAAI,EACR,IACA,oBAAoB,2FACtB,EAGF,IAAM,EACJ,KAAK,UAAU,kCACX,EAAY,wCAclB,OAVA,MAAM,EACJ,EACA,EACA,EACA,EACA,EACA,EACA,CACF,EAEO,IAAI,KACT,EACA,EACA,EACA,EACA,CAAC,EACD,EACA,EACA,CACF,OAGI,gBAAe,CAAC,EAAkC,CACtD,KAAK,aAAa,CAAS,EAC3B,MAAM,KAAK,iBAAiB,OAGxB,UAAS,CAAC,EAA+B,CAC7C,KAAK,OAAS,EACd,MAAM,KAAK,iBAAiB,OAGxB,WAAU,CAAC,EAAuD,CACtE,KAAK,QAAU,EACf,MAAM,KAAK,iBAAiB,OAGxB,eAAc,CAAC,EAAuC,CAC1D,KAAK,QAAU,EACf,MAAM,KAAK,iBAAiB,EAG9B,YAAY,EAAW,CACrB,OAAO,KAAK,UAGd,SAAS,EAAW,CAClB,OAAO,KAAK,OAGd,UAAU,EAAkC,CAC1C,OAAO,KAAK,QAAU,IAAK,KAAK,OAAQ,EAAI,KAG9C,OAAO,EAAW,CAChB,OAAO,KAAK,KAGd,SAAS,EAAwB,CAC/B,MAAO,CACL,KAAM,KAAK,KACX,OAAQ,KAAK,OACb,UAAW,KAAK,UAChB,QAAS,KAAK,OAChB,OAGI,iBAAgB,EAAkB,CACtC,MAAM,EACJ,KAAK,KACL,KAAK,OACL,KAAK,UACL,KAAK,QACL,KAAK,eACL,KAAK,cACP,EAGF,QAAQ,EAAW,CACjB,MAAO,GAAG,KAAK,YAAY,aAAa,KAAK,gBAC3C,KAAK,qBACQ,KAAK,sBAAsB,KAAK,UAAU,KAAK,OAAO,KAGvE,QAAQ,CAAC,EAAqB,CAC5B,KAAK,MAAQ,EAGf,YAAY,EAAY,CACtB,GAAI,KAAK,OAAS,KAChB,MAAO,GAET,GAAI,KAAK,OAAS,KAChB,MAAO,GAET,IAAM,EAAY,KAAK,WAAa,IAC9B,EAAQ,KAAK,MACnB,OAAO,GAAa,MAAQ,GAAS,MAAQ,GAAS,EAGxD,iBAAiB,EAAa,CAC5B,GAAI,MAAM,QAAQ,KAAK,cAAc,EACnC,MAAO,CAAC,GAAG,KAAK,cAAc,EAEhC,MAAO,CAAC,EAGV,YAAY,CAAC,EAAyB,CACpC,GAAI,EAAY,GAAK,EAAY,EAC/B,MAAU,MAAM,2CAA2C,GAAW,EAExE,KAAK,UAAY,EAGnB,YAAY,EAAkB,CAC5B,OAAO,KAAK,UAGd,iBAAiB,CAAC,EAAiC,CACjD,KAAK,eAAiB,EAGxB,eAAe,EAAiB,CAC9B,MAAO,CACL,WAAY,KAAK,aAAa,EAC9B,KAAM,KAAK,QAAQ,EACnB,UAAW,KAAK,aAAa,EAC7B,YAAa,KAAK,aAAe,GACjC,gBAAiB,KAAK,kBAAkB,EACxC,OAAQ,CACN,OAAQ,KAAK,UAAU,KACnB,KAAK,WAAW,EAAI,CAAE,QAAS,KAAK,WAAW,CAAE,EAAI,CAAC,CAC5D,CACF,EAEJ,CCxPO,MAAM,UAAqB,CAAiB,CACjD,WAAW,CACT,EACA,EACA,EACA,EACA,EAAoC,CAAC,EACrC,EACA,EAAyB,GAAoB,GAC7C,EAAyB,GAAmB,GAC5C,CACA,MACE,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACF,EAEJ,CC5BO,MAAM,UAA0B,CAAiB,CACtD,WAAW,CACT,EACA,EACA,EACA,EACA,EAAoC,CAAC,EACrC,EACA,EAAyB,GAAoB,GAC7C,EAAyB,GAAmB,GAC5C,CACA,MACE,EACA,EACA,EACA,EACA,EACA,EACA,EACA,CACF,EAEJ,CC1BuC,IAAvC,gCACA,oCCDO,IAAM,EAAU,QDYhB,MAAM,UAAsB,CAAO,CAChC,uBAEK,WAAU,CACrB,EAA0C,CAAC,EACnB,CACxB,GAAI,KAAK,aACP,OAAO,KAGT,GAAI,CACF,IAAM,EAAqB,EACxB,EAAkB,aAAa,cAC9B,KAAK,cAAc,aACpB,EAAkB,aAAa,uBAAwB,KACrD,EAAQ,kBACb,EAEM,EAAe,MAAM,KAAK,gBAAgB,EAUhD,OARA,KAAK,kBAAoB,IAAI,oBAAkB,CAC7C,SAAU,yBAAuB,CAAkB,EACnD,eAAgB,CAAC,IAAI,qBAAmB,CAAY,CAAC,CACvD,CAAC,EAED,KAAK,kBAAkB,SAAS,EAEhC,KAAK,aAAe,GACb,KACP,MAAO,EAAO,CACd,MAAU,MACR,wCAAwC,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,GAC/F,SAIU,YAAW,CAAC,EAAmD,CAC3E,IAAM,EAAM,iBAAiB,EAAc,cAC3C,GAAI,CAAC,EAAO,UAAU,IAAI,CAAG,EAC3B,EAAO,UAAU,IAAI,EAAK,IAAI,EAAc,CAAa,CAAC,EAE5D,OAAO,EAAO,UAAU,IAAI,CAAG,QAGnB,cAAa,CAAC,EAAoC,CAC9D,IAAM,EAAgB,EAAoB,QAAQ,EAC/C,YAAY,CAAW,EACvB,MAAM,EACT,OAAO,EAAc,YAAY,CAAa,QAGlC,wBAAuB,CACnC,EACe,CACf,OAAO,IAAI,EAAc,CAAa,EAE1C,CEpEuC,IAAvC,gCACA,+BACA,qCAWO,MAAM,UAAmB,CAAO,CAC7B,aAEK,WAAU,CACrB,EAAuC,CAAC,EACnB,CACrB,GAAI,KAAK,aACP,OAAO,KAGT,GAAI,CACF,IAAM,EAAqB,EACxB,EAAkB,aAAa,cAC9B,KAAK,cAAc,aACpB,EAAkB,aAAa,uBAAwB,KACrD,EAAQ,kBACb,EAEM,EAAe,MAAM,KAAK,gBAAgB,EAYhD,OAVA,KAAK,QAAU,IAAI,UAAQ,CACzB,SAAU,yBAAuB,CAAkB,EACnD,iBAAkB,EAAQ,iBAC1B,cAAe,IAAI,qBAAmB,CAAY,KAC/C,CACL,CAAC,EAED,KAAK,QAAQ,MAAM,EAEnB,KAAK,aAAe,GACb,KACP,MAAO,EAAO,CACd,MAAU,MACR,qCAAqC,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,GAC5F,SAIU,YAAW,CAAC,EAAgD,CACxE,IAAM,EAAM,cAAc,EAAc,cACxC,GAAI,CAAC,EAAO,UAAU,IAAI,CAAG,EAC3B,EAAO,UAAU,IAAI,EAAK,IAAI,EAAW,CAAa,CAAC,EAEzD,OAAO,EAAO,UAAU,IAAI,CAAG,QAGnB,cAAa,CAAC,EAAiC,CAC3D,IAAM,EAAgB,EAAoB,QAAQ,EAC/C,YAAY,CAAW,EACvB,iBAAiB,EAAI,EACrB,MAAM,EACT,OAAO,EAAW,YAAY,CAAa,QAG/B,wBAAuB,CACnC,EACY,CACZ,OAAO,IAAI,EAAW,CAAa,OAGxB,SAAQ,EAAkB,CACrC,GAAI,KAAK,QACP,MAAM,KAAK,QAAQ,SAAS,EAGlC",
28
+ "debugId": "B7CCA58D2A18793064756E2164756E21",
29
+ "names": []
30
+ }
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.3.1";
1
+ export declare const VERSION = "0.3.2";
2
2
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "judgeval",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "JavaScript/TypeScript client for Judgment evaluation platform",
5
5
  "main": "./dist/index.mjs",
6
6
  "module": "./dist/index.mjs",
@@ -19,17 +19,17 @@
19
19
  "LICENSE"
20
20
  ],
21
21
  "scripts": {
22
- "build": "npm run build:types && npm run build:lib && npm run build:umd",
22
+ "build": "bun run check && bun run build:types && bun scripts/build.ts lib umd",
23
23
  "build:types": "tsc -p tsconfig.build.json",
24
- "build:lib": "webpack --mode production --config webpack.config.js --env target=lib",
25
- "build:umd": "webpack --mode production --config webpack.config.js --env target=umd",
26
- "build:dev": "npm run build:types && webpack --mode development --config webpack.config.js --env target=lib",
24
+ "build:lib": "bun scripts/build.ts lib",
25
+ "build:umd": "bun scripts/build.ts umd",
26
+ "build:dev": "bun run build:types && bun scripts/build.ts lib --dev",
27
27
  "check": "tsc --noEmit",
28
28
  "format": "prettier --write \"src/**/*.ts\"",
29
- "generate-client": "ts-node scripts/generate-client.ts && npm run format",
30
- "test": "ts-node test.ts",
29
+ "generate-client": "bunx tsx scripts/generate-client.ts && bun run format",
30
+ "test": "bunx tsx test.ts",
31
31
  "clean": "rimraf dist",
32
- "prepublishOnly": "npm run clean && npm run build"
32
+ "prepublishOnly": "bun run clean && bun run build"
33
33
  },
34
34
  "keywords": [
35
35
  "judgment",
@@ -54,23 +54,20 @@
54
54
  "@opentelemetry/sdk-node": "^0.205.0",
55
55
  "@opentelemetry/sdk-trace-base": "^2.1.0",
56
56
  "@opentelemetry/sdk-trace-node": "^2.1.0",
57
- "@opentelemetry/sdk-trace-web": "^2.1.0",
58
- "@opentelemetry/semantic-conventions": "^1.18.1"
57
+ "@opentelemetry/sdk-trace-web": "^2.1.0"
59
58
  },
60
59
  "devDependencies": {
61
60
  "@opentelemetry/auto-instrumentations-node": "^0.64.1",
62
61
  "@opentelemetry/sdk-metrics": "^2.1.0",
62
+ "@types/bun": "^1.2.22",
63
63
  "@types/node": "^24.5.2",
64
64
  "dotenv": "^17.2.2",
65
65
  "prettier": "^3.6.2",
66
66
  "rimraf": "^6.0.1",
67
- "ts-loader": "^9.5.4",
68
- "ts-node": "^10.9.2",
69
- "typescript": "^5.9.2",
70
- "webpack": "^5.101.3",
71
- "webpack-cli": "^6.0.1"
67
+ "typescript": "^5.9.2"
72
68
  },
73
69
  "engines": {
74
- "node": ">=18.0.0"
70
+ "node": ">=18.0.0",
71
+ "bun": ">=1.0.0"
75
72
  }
76
73
  }