@fallom/trace 0.2.10 → 0.2.13

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.
@@ -0,0 +1,305 @@
1
+ import {
2
+ __export
3
+ } from "./chunk-7P6ASYW6.mjs";
4
+
5
+ // src/models.ts
6
+ var models_exports = {};
7
+ __export(models_exports, {
8
+ get: () => get,
9
+ init: () => init
10
+ });
11
+ import { createHash } from "crypto";
12
+ var apiKey = null;
13
+ var baseUrl = "https://configs.fallom.com";
14
+ var initialized = false;
15
+ var syncInterval = null;
16
+ var debugMode = false;
17
+ var configCache = /* @__PURE__ */ new Map();
18
+ var SYNC_TIMEOUT = 2e3;
19
+ var RECORD_TIMEOUT = 1e3;
20
+ function log(msg) {
21
+ if (debugMode) {
22
+ console.log(`[Fallom] ${msg}`);
23
+ }
24
+ }
25
+ function evaluateTargeting(targeting, customerId, context) {
26
+ if (!targeting || targeting.enabled === false) {
27
+ return null;
28
+ }
29
+ const evalContext = {
30
+ ...context || {},
31
+ ...customerId ? { customerId } : {}
32
+ };
33
+ log(`Evaluating targeting with context: ${JSON.stringify(evalContext)}`);
34
+ if (targeting.individualTargets) {
35
+ for (const target of targeting.individualTargets) {
36
+ const fieldValue = evalContext[target.field];
37
+ if (fieldValue === target.value) {
38
+ log(`Individual target matched: ${target.field}=${target.value} -> variant ${target.variantIndex}`);
39
+ return target.variantIndex;
40
+ }
41
+ }
42
+ }
43
+ if (targeting.rules) {
44
+ for (const rule of targeting.rules) {
45
+ const allConditionsMatch = rule.conditions.every((condition) => {
46
+ const fieldValue = evalContext[condition.field];
47
+ if (fieldValue === void 0) return false;
48
+ switch (condition.operator) {
49
+ case "eq":
50
+ return fieldValue === condition.value;
51
+ case "neq":
52
+ return fieldValue !== condition.value;
53
+ case "in":
54
+ return Array.isArray(condition.value) && condition.value.includes(fieldValue);
55
+ case "nin":
56
+ return Array.isArray(condition.value) && !condition.value.includes(fieldValue);
57
+ case "contains":
58
+ return typeof condition.value === "string" && fieldValue.includes(condition.value);
59
+ case "startsWith":
60
+ return typeof condition.value === "string" && fieldValue.startsWith(condition.value);
61
+ case "endsWith":
62
+ return typeof condition.value === "string" && fieldValue.endsWith(condition.value);
63
+ default:
64
+ return false;
65
+ }
66
+ });
67
+ if (allConditionsMatch) {
68
+ log(`Rule matched: ${JSON.stringify(rule.conditions)} -> variant ${rule.variantIndex}`);
69
+ return rule.variantIndex;
70
+ }
71
+ }
72
+ }
73
+ log("No targeting rules matched, falling back to weighted random");
74
+ return null;
75
+ }
76
+ function init(options = {}) {
77
+ apiKey = options.apiKey || process.env.FALLOM_API_KEY || null;
78
+ baseUrl = options.baseUrl || process.env.FALLOM_CONFIGS_URL || process.env.FALLOM_BASE_URL || "https://configs.fallom.com";
79
+ initialized = true;
80
+ if (!apiKey) {
81
+ return;
82
+ }
83
+ fetchConfigs().catch(() => {
84
+ });
85
+ if (!syncInterval) {
86
+ syncInterval = setInterval(() => {
87
+ fetchConfigs().catch(() => {
88
+ });
89
+ }, 3e4);
90
+ syncInterval.unref();
91
+ }
92
+ }
93
+ function ensureInit() {
94
+ if (!initialized) {
95
+ try {
96
+ init();
97
+ } catch {
98
+ }
99
+ }
100
+ }
101
+ async function fetchConfigs(timeout = SYNC_TIMEOUT) {
102
+ if (!apiKey) {
103
+ log("_fetchConfigs: No API key, skipping");
104
+ return;
105
+ }
106
+ try {
107
+ log(`Fetching configs from ${baseUrl}/configs`);
108
+ const controller = new AbortController();
109
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
110
+ const resp = await fetch(`${baseUrl}/configs`, {
111
+ headers: { Authorization: `Bearer ${apiKey}` },
112
+ signal: controller.signal
113
+ });
114
+ clearTimeout(timeoutId);
115
+ log(`Response status: ${resp.status}`);
116
+ if (resp.ok) {
117
+ const data = await resp.json();
118
+ const configs = data.configs || [];
119
+ log(`Got ${configs.length} configs: ${configs.map((c) => c.key)}`);
120
+ for (const c of configs) {
121
+ const key = c.key;
122
+ const version = c.version || 1;
123
+ log(`Config '${key}' v${version}: ${JSON.stringify(c.variants)}`);
124
+ if (!configCache.has(key)) {
125
+ configCache.set(key, { versions: /* @__PURE__ */ new Map(), latest: null });
126
+ }
127
+ const cached = configCache.get(key);
128
+ cached.versions.set(version, c);
129
+ cached.latest = version;
130
+ }
131
+ } else {
132
+ log(`Fetch failed: ${resp.statusText}`);
133
+ }
134
+ } catch (e) {
135
+ log(`Fetch exception: ${e}`);
136
+ }
137
+ }
138
+ async function fetchSpecificVersion(configKey, version, timeout = SYNC_TIMEOUT) {
139
+ if (!apiKey) return null;
140
+ try {
141
+ const controller = new AbortController();
142
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
143
+ const resp = await fetch(
144
+ `${baseUrl}/configs/${configKey}/version/${version}`,
145
+ {
146
+ headers: { Authorization: `Bearer ${apiKey}` },
147
+ signal: controller.signal
148
+ }
149
+ );
150
+ clearTimeout(timeoutId);
151
+ if (resp.ok) {
152
+ const config = await resp.json();
153
+ if (!configCache.has(configKey)) {
154
+ configCache.set(configKey, { versions: /* @__PURE__ */ new Map(), latest: null });
155
+ }
156
+ configCache.get(configKey).versions.set(version, config);
157
+ return config;
158
+ }
159
+ } catch {
160
+ }
161
+ return null;
162
+ }
163
+ async function get(configKey, sessionId, options = {}) {
164
+ const { version, fallback, customerId, context, debug = false } = options;
165
+ debugMode = debug;
166
+ ensureInit();
167
+ log(
168
+ `get() called: configKey=${configKey}, sessionId=${sessionId}, fallback=${fallback}`
169
+ );
170
+ try {
171
+ let configData = configCache.get(configKey);
172
+ log(
173
+ `Cache lookup for '${configKey}': ${configData ? "found" : "not found"}`
174
+ );
175
+ if (!configData) {
176
+ log("Not in cache, fetching...");
177
+ await fetchConfigs(SYNC_TIMEOUT);
178
+ configData = configCache.get(configKey);
179
+ log(
180
+ `After fetch, cache lookup: ${configData ? "found" : "still not found"}`
181
+ );
182
+ }
183
+ if (!configData) {
184
+ log(`Config not found, using fallback: ${fallback}`);
185
+ if (fallback) {
186
+ console.warn(
187
+ `[Fallom WARNING] Config '${configKey}' not found, using fallback model: ${fallback}`
188
+ );
189
+ return returnModel(configKey, sessionId, fallback, 0);
190
+ }
191
+ throw new Error(
192
+ `Config '${configKey}' not found. Check that it exists in your Fallom dashboard.`
193
+ );
194
+ }
195
+ let config;
196
+ let targetVersion;
197
+ if (version !== void 0) {
198
+ config = configData.versions.get(version);
199
+ if (!config) {
200
+ config = await fetchSpecificVersion(configKey, version, SYNC_TIMEOUT) || void 0;
201
+ }
202
+ if (!config) {
203
+ if (fallback) {
204
+ console.warn(
205
+ `[Fallom WARNING] Config '${configKey}' version ${version} not found, using fallback: ${fallback}`
206
+ );
207
+ return returnModel(configKey, sessionId, fallback, 0);
208
+ }
209
+ throw new Error(`Config '${configKey}' version ${version} not found.`);
210
+ }
211
+ targetVersion = version;
212
+ } else {
213
+ targetVersion = configData.latest;
214
+ config = configData.versions.get(targetVersion);
215
+ if (!config) {
216
+ if (fallback) {
217
+ console.warn(
218
+ `[Fallom WARNING] Config '${configKey}' has no cached version, using fallback: ${fallback}`
219
+ );
220
+ return returnModel(configKey, sessionId, fallback, 0);
221
+ }
222
+ throw new Error(`Config '${configKey}' has no cached version.`);
223
+ }
224
+ }
225
+ const variantsRaw = config.variants;
226
+ const configVersion = config.version || targetVersion;
227
+ const variants = Array.isArray(variantsRaw) ? variantsRaw : Object.values(variantsRaw);
228
+ log(
229
+ `Config found! Version: ${configVersion}, Variants: ${JSON.stringify(
230
+ variants
231
+ )}`
232
+ );
233
+ const targetedVariantIndex = evaluateTargeting(config.targeting, customerId, context);
234
+ if (targetedVariantIndex !== null && variants[targetedVariantIndex]) {
235
+ const assignedModel2 = variants[targetedVariantIndex].model;
236
+ log(`\u2705 Assigned model via targeting: ${assignedModel2}`);
237
+ return returnModel(configKey, sessionId, assignedModel2, configVersion);
238
+ }
239
+ const hashBytes = createHash("md5").update(sessionId).digest();
240
+ const hashVal = hashBytes.readUInt32BE(0) % 1e6;
241
+ log(`Session hash: ${hashVal} (out of 1,000,000)`);
242
+ let cumulative = 0;
243
+ let assignedModel = variants[variants.length - 1].model;
244
+ for (const v of variants) {
245
+ const oldCumulative = cumulative;
246
+ cumulative += v.weight * 1e4;
247
+ log(
248
+ `Variant ${v.model}: weight=${v.weight}%, range=${oldCumulative}-${cumulative}, hash=${hashVal}, match=${hashVal < cumulative}`
249
+ );
250
+ if (hashVal < cumulative) {
251
+ assignedModel = v.model;
252
+ break;
253
+ }
254
+ }
255
+ log(`\u2705 Assigned model via weighted random: ${assignedModel}`);
256
+ return returnModel(configKey, sessionId, assignedModel, configVersion);
257
+ } catch (e) {
258
+ if (e instanceof Error && e.message.includes("not found")) {
259
+ throw e;
260
+ }
261
+ if (fallback) {
262
+ console.warn(
263
+ `[Fallom WARNING] Error getting model for '${configKey}': ${e}. Using fallback: ${fallback}`
264
+ );
265
+ return returnModel(configKey, sessionId, fallback, 0);
266
+ }
267
+ throw e;
268
+ }
269
+ }
270
+ function returnModel(configKey, sessionId, model, version) {
271
+ if (version > 0) {
272
+ recordSession(configKey, version, sessionId, model).catch(() => {
273
+ });
274
+ }
275
+ return model;
276
+ }
277
+ async function recordSession(configKey, version, sessionId, model) {
278
+ if (!apiKey) return;
279
+ try {
280
+ const controller = new AbortController();
281
+ const timeoutId = setTimeout(() => controller.abort(), RECORD_TIMEOUT);
282
+ await fetch(`${baseUrl}/sessions`, {
283
+ method: "POST",
284
+ headers: {
285
+ Authorization: `Bearer ${apiKey}`,
286
+ "Content-Type": "application/json"
287
+ },
288
+ body: JSON.stringify({
289
+ config_key: configKey,
290
+ config_version: version,
291
+ session_id: sessionId,
292
+ assigned_model: model
293
+ }),
294
+ signal: controller.signal
295
+ });
296
+ clearTimeout(timeoutId);
297
+ } catch {
298
+ }
299
+ }
300
+
301
+ export {
302
+ init,
303
+ get,
304
+ models_exports
305
+ };
@@ -0,0 +1,21 @@
1
+ import {
2
+ DEFAULT_JUDGE_MODEL,
3
+ _apiKey,
4
+ _baseUrl,
5
+ _initialized,
6
+ compareModels,
7
+ evaluate,
8
+ init,
9
+ uploadResultsPublic
10
+ } from "./chunk-2NGJF2JZ.mjs";
11
+ import "./chunk-7P6ASYW6.mjs";
12
+ export {
13
+ DEFAULT_JUDGE_MODEL,
14
+ _apiKey,
15
+ _baseUrl,
16
+ _initialized,
17
+ compareModels,
18
+ evaluate,
19
+ init,
20
+ uploadResultsPublic
21
+ };
package/dist/index.d.mts CHANGED
@@ -394,22 +394,35 @@ declare namespace prompts {
394
394
  }
395
395
 
396
396
  /**
397
- * Fallom Evals - Run LLM evaluations locally using G-Eval with LLM as a Judge.
398
- *
399
- * Evaluate production outputs or compare different models on your dataset.
400
- * Results are uploaded to Fallom dashboard for visualization.
401
- *
397
+ * Type definitions for Fallom Evals.
402
398
  */
399
+ /** Built-in metric names */
403
400
  type MetricName = "answer_relevancy" | "hallucination" | "toxicity" | "faithfulness" | "completeness";
401
+ /** List of all available built-in metrics */
404
402
  declare const AVAILABLE_METRICS: MetricName[];
403
+ /**
404
+ * Define a custom evaluation metric using G-Eval.
405
+ */
406
+ interface CustomMetric {
407
+ /** Unique identifier for the metric (e.g., "brand_alignment") */
408
+ name: string;
409
+ /** Description of what the metric evaluates */
410
+ criteria: string;
411
+ /** List of evaluation steps for the LLM judge to follow */
412
+ steps: string[];
413
+ }
414
+ /** Metric can be a built-in name or a custom metric */
415
+ type MetricInput = MetricName | CustomMetric;
405
416
  /** Dataset can be a list of items OR a string (dataset key to fetch from Fallom) */
406
417
  type DatasetInput = DatasetItem[] | string;
418
+ /** A single item in an evaluation dataset */
407
419
  interface DatasetItem {
408
420
  input: string;
409
421
  output: string;
410
422
  systemMessage?: string;
411
423
  metadata?: Record<string, unknown>;
412
424
  }
425
+ /** Evaluation result for a single item */
413
426
  interface EvalResult {
414
427
  input: string;
415
428
  output: string;
@@ -449,19 +462,23 @@ interface Model {
449
462
  name: string;
450
463
  callFn?: ModelCallable;
451
464
  }
465
+ /** Options for init() */
452
466
  interface InitOptions$1 {
453
467
  apiKey?: string;
454
468
  baseUrl?: string;
455
469
  }
470
+ /** Options for evaluate() */
456
471
  interface EvaluateOptions {
457
472
  dataset: DatasetInput;
458
- metrics?: MetricName[];
473
+ /** List of metrics to run (built-in or custom). Default: all built-in metrics */
474
+ metrics?: MetricInput[];
459
475
  judgeModel?: string;
460
476
  name?: string;
461
477
  description?: string;
462
478
  verbose?: boolean;
463
479
  _skipUpload?: boolean;
464
480
  }
481
+ /** Options for compareModels() */
465
482
  interface CompareModelsOptions extends EvaluateOptions {
466
483
  /**
467
484
  * List of models to test. Each can be:
@@ -472,31 +489,72 @@ interface CompareModelsOptions extends EvaluateOptions {
472
489
  includeProduction?: boolean;
473
490
  modelKwargs?: Record<string, unknown>;
474
491
  }
492
+ /** Type guard to check if a metric is a CustomMetric */
493
+ declare function isCustomMetric(metric: MetricInput): metric is CustomMetric;
494
+ /** Get the name of a metric (works for both built-in and custom) */
495
+ declare function getMetricName(metric: MetricInput): string;
496
+
497
+ /**
498
+ * G-Eval prompts for each metric.
499
+ */
500
+
501
+ /** G-Eval prompts for each built-in metric */
502
+ declare const METRIC_PROMPTS: Record<MetricName, {
503
+ criteria: string;
504
+ steps: string[];
505
+ }>;
506
+
507
+ /**
508
+ * Core evaluation functions.
509
+ */
510
+
511
+ declare const DEFAULT_JUDGE_MODEL = "openai/gpt-4o-mini";
475
512
  /**
476
513
  * Initialize Fallom evals.
477
514
  */
478
515
  declare function init$1(options?: InitOptions$1): void;
479
516
  /**
480
517
  * Evaluate production outputs against specified metrics using G-Eval.
518
+ *
481
519
  * Results are automatically uploaded to Fallom dashboard.
482
520
  */
483
521
  declare function evaluate(options: EvaluateOptions): Promise<EvalResult[]>;
484
522
  /**
485
- * Create a Model using OpenAI directly (for fine-tuned models or direct API access).
523
+ * Compare multiple models on the same dataset.
524
+ *
525
+ * Results are automatically uploaded to Fallom dashboard.
526
+ */
527
+ declare function compareModels(options: CompareModelsOptions): Promise<Record<string, EvalResult[]>>;
528
+ /**
529
+ * Public function to upload results manually.
530
+ */
531
+ declare function uploadResultsPublic(results: EvalResult[] | Record<string, EvalResult[]>, options: {
532
+ name: string;
533
+ description?: string;
534
+ judgeModel?: string;
535
+ }): Promise<string>;
536
+
537
+ /**
538
+ * Helper functions for creating models and datasets.
539
+ */
540
+
541
+ /**
542
+ * Create a Model using OpenAI directly (for fine-tuned models or Azure OpenAI).
486
543
  *
487
544
  * @param modelId - The OpenAI model ID (e.g., "gpt-4o" or "ft:gpt-4o-2024-08-06:org::id")
488
545
  * @param options - Configuration options
489
- * @returns A Model instance that can be used in compareModels()
546
+ * @returns Model instance that can be used in compareModels()
490
547
  */
491
548
  declare function createOpenAIModel(modelId: string, options?: {
492
549
  name?: string;
493
550
  apiKey?: string;
494
- baseURL?: string;
551
+ baseUrl?: string;
495
552
  temperature?: number;
496
553
  maxTokens?: number;
497
554
  }): Model;
498
555
  /**
499
556
  * Create a Model for any OpenAI-compatible API endpoint.
557
+ *
500
558
  * Works with self-hosted models (vLLM, Ollama, LMStudio, etc.), custom endpoints,
501
559
  * or any service that follows the OpenAI chat completions API format.
502
560
  *
@@ -510,12 +568,13 @@ declare function createCustomModel(name: string, options: {
510
568
  headers?: Record<string, string>;
511
569
  modelField?: string;
512
570
  modelValue?: string;
513
- temperature?: number;
514
- maxTokens?: number;
571
+ extraParams?: Record<string, unknown>;
515
572
  }): Model;
516
573
  /**
517
574
  * Create a Model from any callable function.
518
- * This is the most flexible option - you provide a function that handles the model call.
575
+ *
576
+ * This is the most flexible option - you provide a function that takes
577
+ * messages and returns a response.
519
578
  *
520
579
  * @param name - Display name for the model
521
580
  * @param callFn - Function that takes messages and returns a response
@@ -523,17 +582,19 @@ declare function createCustomModel(name: string, options: {
523
582
  */
524
583
  declare function createModelFromCallable(name: string, callFn: ModelCallable): Model;
525
584
  /**
526
- * Compare multiple models on the same dataset.
527
- */
528
- declare function compareModels(options: CompareModelsOptions): Promise<Record<string, EvalResult[]>>;
529
- /**
530
- * Manually upload evaluation results to Fallom dashboard.
531
- * Note: Results are automatically uploaded after evaluate() and compareModels(),
532
- * so this is only needed for custom scenarios.
585
+ * Create a custom evaluation metric using G-Eval.
586
+ *
587
+ * @param name - Unique identifier for the metric (e.g., "brand_alignment")
588
+ * @param criteria - Description of what the metric evaluates
589
+ * @param steps - List of evaluation steps for the LLM judge to follow
590
+ * @returns A CustomMetric instance
533
591
  */
534
- declare function uploadResults(results: EvalResult[] | Record<string, EvalResult[]>, name: string, description?: string, judgeModel?: string): Promise<string>;
592
+ declare function customMetric(name: string, criteria: string, steps: string[]): CustomMetric;
535
593
  /**
536
594
  * Create a dataset from Fallom trace data.
595
+ *
596
+ * @param traces - List of trace objects with attributes
597
+ * @returns List of DatasetItem ready for evaluation
537
598
  */
538
599
  declare function datasetFromTraces(traces: Array<{
539
600
  attributes?: Record<string, unknown>;
@@ -542,27 +603,34 @@ declare function datasetFromTraces(traces: Array<{
542
603
  * Fetch a dataset stored in Fallom by its key.
543
604
  *
544
605
  * @param datasetKey - The unique key of the dataset (e.g., "customer-support-qa")
545
- * @param version - Specific version number to fetch. If undefined, fetches the latest version.
606
+ * @param version - Specific version number to fetch. If undefined, fetches latest.
607
+ * @param config - Internal config (api key, base url, initialized flag)
546
608
  * @returns List of DatasetItem ready for evaluation
547
609
  */
548
- declare function datasetFromFallom(datasetKey: string, version?: number): Promise<DatasetItem[]>;
549
- declare const _default$1: {
550
- init: typeof init$1;
551
- evaluate: typeof evaluate;
552
- compareModels: typeof compareModels;
553
- uploadResults: typeof uploadResults;
554
- datasetFromTraces: typeof datasetFromTraces;
555
- datasetFromFallom: typeof datasetFromFallom;
556
- AVAILABLE_METRICS: MetricName[];
557
- };
610
+ declare function datasetFromFallom(datasetKey: string, version?: number, config?: {
611
+ _apiKey?: string | null;
612
+ _baseUrl?: string;
613
+ _initialized?: boolean;
614
+ }): Promise<DatasetItem[]>;
615
+
616
+ /**
617
+ * Fallom Evals - Run LLM evaluations locally using G-Eval with LLM as a Judge.
618
+ *
619
+ * Evaluate production outputs or compare different models on your dataset.
620
+ * Results are uploaded to Fallom dashboard for visualization.
621
+ */
558
622
 
559
623
  declare const evals_AVAILABLE_METRICS: typeof AVAILABLE_METRICS;
560
624
  type evals_CompareModelsOptions = CompareModelsOptions;
625
+ type evals_CustomMetric = CustomMetric;
626
+ declare const evals_DEFAULT_JUDGE_MODEL: typeof DEFAULT_JUDGE_MODEL;
561
627
  type evals_DatasetInput = DatasetInput;
562
628
  type evals_DatasetItem = DatasetItem;
563
629
  type evals_EvalResult = EvalResult;
564
630
  type evals_EvaluateOptions = EvaluateOptions;
631
+ declare const evals_METRIC_PROMPTS: typeof METRIC_PROMPTS;
565
632
  type evals_Message = Message;
633
+ type evals_MetricInput = MetricInput;
566
634
  type evals_MetricName = MetricName;
567
635
  type evals_Model = Model;
568
636
  type evals_ModelCallable = ModelCallable;
@@ -571,12 +639,14 @@ declare const evals_compareModels: typeof compareModels;
571
639
  declare const evals_createCustomModel: typeof createCustomModel;
572
640
  declare const evals_createModelFromCallable: typeof createModelFromCallable;
573
641
  declare const evals_createOpenAIModel: typeof createOpenAIModel;
642
+ declare const evals_customMetric: typeof customMetric;
574
643
  declare const evals_datasetFromFallom: typeof datasetFromFallom;
575
644
  declare const evals_datasetFromTraces: typeof datasetFromTraces;
576
645
  declare const evals_evaluate: typeof evaluate;
577
- declare const evals_uploadResults: typeof uploadResults;
646
+ declare const evals_getMetricName: typeof getMetricName;
647
+ declare const evals_isCustomMetric: typeof isCustomMetric;
578
648
  declare namespace evals {
579
- export { evals_AVAILABLE_METRICS as AVAILABLE_METRICS, type evals_CompareModelsOptions as CompareModelsOptions, type evals_DatasetInput as DatasetInput, type evals_DatasetItem as DatasetItem, type evals_EvalResult as EvalResult, type evals_EvaluateOptions as EvaluateOptions, type InitOptions$1 as InitOptions, type evals_Message as Message, type evals_MetricName as MetricName, type evals_Model as Model, type evals_ModelCallable as ModelCallable, type evals_ModelResponse as ModelResponse, evals_compareModels as compareModels, evals_createCustomModel as createCustomModel, evals_createModelFromCallable as createModelFromCallable, evals_createOpenAIModel as createOpenAIModel, evals_datasetFromFallom as datasetFromFallom, evals_datasetFromTraces as datasetFromTraces, _default$1 as default, evals_evaluate as evaluate, init$1 as init, evals_uploadResults as uploadResults };
649
+ export { evals_AVAILABLE_METRICS as AVAILABLE_METRICS, type evals_CompareModelsOptions as CompareModelsOptions, type evals_CustomMetric as CustomMetric, evals_DEFAULT_JUDGE_MODEL as DEFAULT_JUDGE_MODEL, type evals_DatasetInput as DatasetInput, type evals_DatasetItem as DatasetItem, type evals_EvalResult as EvalResult, type evals_EvaluateOptions as EvaluateOptions, type InitOptions$1 as InitOptions, evals_METRIC_PROMPTS as METRIC_PROMPTS, type evals_Message as Message, type evals_MetricInput as MetricInput, type evals_MetricName as MetricName, type evals_Model as Model, type evals_ModelCallable as ModelCallable, type evals_ModelResponse as ModelResponse, evals_compareModels as compareModels, evals_createCustomModel as createCustomModel, evals_createModelFromCallable as createModelFromCallable, evals_createOpenAIModel as createOpenAIModel, evals_customMetric as customMetric, evals_datasetFromFallom as datasetFromFallom, evals_datasetFromTraces as datasetFromTraces, evals_evaluate as evaluate, evals_getMetricName as getMetricName, init$1 as init, evals_isCustomMetric as isCustomMetric, uploadResultsPublic as uploadResults };
580
650
  }
581
651
 
582
652
  /**