langsmith 0.2.16-rc.0 → 0.2.16-rc.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.cjs CHANGED
@@ -8,4 +8,4 @@ Object.defineProperty(exports, "RunTree", { enumerable: true, get: function () {
8
8
  var fetch_js_1 = require("./singletons/fetch.cjs");
9
9
  Object.defineProperty(exports, "overrideFetchImplementation", { enumerable: true, get: function () { return fetch_js_1.overrideFetchImplementation; } });
10
10
  // Update using yarn bump-version
11
- exports.__version__ = "0.2.16-rc.0";
11
+ exports.__version__ = "0.2.16-rc.2";
package/dist/index.d.ts CHANGED
@@ -2,4 +2,4 @@ export { Client, type ClientConfig, type LangSmithTracingClientInterface, } from
2
2
  export type { Dataset, Example, TracerSession, Run, Feedback, RetrieverOutput, } from "./schemas.js";
3
3
  export { RunTree, type RunTreeConfig } from "./run_trees.js";
4
4
  export { overrideFetchImplementation } from "./singletons/fetch.js";
5
- export declare const __version__ = "0.2.16-rc.0";
5
+ export declare const __version__ = "0.2.16-rc.2";
package/dist/index.js CHANGED
@@ -2,4 +2,4 @@ export { Client, } from "./client.js";
2
2
  export { RunTree } from "./run_trees.js";
3
3
  export { overrideFetchImplementation } from "./singletons/fetch.js";
4
4
  // Update using yarn bump-version
5
- export const __version__ = "0.2.16-rc.0";
5
+ export const __version__ = "0.2.16-rc.2";
@@ -1,7 +1,17 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const reporter_js_1 = __importDefault(require("../utils/jestlike/reporter.cjs"));
7
- exports.default = reporter_js_1.default;
3
+ /* eslint-disable import/no-extraneous-dependencies */
4
+ const reporters_1 = require("@jest/reporters");
5
+ const reporter_js_1 = require("../utils/jestlike/reporter.cjs");
6
+ class LangSmithEvalReporter extends reporters_1.DefaultReporter {
7
+ async onTestResult(test, testResult, aggregatedResults) {
8
+ try {
9
+ await (0, reporter_js_1.printReporterTable)(testResult.testResults, testResult.failureMessage);
10
+ }
11
+ catch (e) {
12
+ console.log("Failed to display LangSmith eval results:", e.message);
13
+ return super.onTestResult(test, testResult, aggregatedResults);
14
+ }
15
+ }
16
+ }
17
+ exports.default = LangSmithEvalReporter;
@@ -1,2 +1,5 @@
1
- import CustomReporter from "../utils/jestlike/reporter.js";
2
- export default CustomReporter;
1
+ import { DefaultReporter } from "@jest/reporters";
2
+ declare class LangSmithEvalReporter extends DefaultReporter {
3
+ onTestResult(test: any, testResult: any, aggregatedResults: any): Promise<void>;
4
+ }
5
+ export default LangSmithEvalReporter;
@@ -1,2 +1,15 @@
1
- import CustomReporter from "../utils/jestlike/reporter.js";
2
- export default CustomReporter;
1
+ /* eslint-disable import/no-extraneous-dependencies */
2
+ import { DefaultReporter } from "@jest/reporters";
3
+ import { printReporterTable } from "../utils/jestlike/reporter.js";
4
+ class LangSmithEvalReporter extends DefaultReporter {
5
+ async onTestResult(test, testResult, aggregatedResults) {
6
+ try {
7
+ await printReporterTable(testResult.testResults, testResult.failureMessage);
8
+ }
9
+ catch (e) {
10
+ console.log("Failed to display LangSmith eval results:", e.message);
11
+ return super.onTestResult(test, testResult, aggregatedResults);
12
+ }
13
+ }
14
+ }
15
+ export default LangSmithEvalReporter;
@@ -26,9 +26,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- const reporters_1 = require("@jest/reporters");
29
+ exports.printReporterTable = void 0;
30
30
  const console_table_printer_1 = require("console-table-printer");
31
- const uuid_1 = require("uuid");
32
31
  const chalk_1 = __importDefault(require("chalk"));
33
32
  const os = __importStar(require("node:os"));
34
33
  const path = __importStar(require("node:path"));
@@ -73,126 +72,140 @@ function getColorParam(status) {
73
72
  }
74
73
  }
75
74
  function formatValue(value) {
76
- if (typeof value === 'object' && value !== null) {
75
+ if (typeof value === "object" && value !== null) {
77
76
  return Object.entries(value)
78
77
  .map(([k, v]) => {
79
- const rawValue = typeof v === 'string' ? v : JSON.stringify(v);
80
- const value = rawValue.length > 32 ? (rawValue.slice(0, 29) + "...") : rawValue;
78
+ const rawValue = typeof v === "string" ? v : JSON.stringify(v);
79
+ const value = rawValue.length > 32 ? rawValue.slice(0, 29) + "..." : rawValue;
81
80
  return `${k}: ${value}`;
82
81
  })
83
- .join(', ');
82
+ .join(", ");
84
83
  }
85
84
  if (value == null) {
86
85
  return;
87
86
  }
88
87
  return String(value);
89
88
  }
90
- class CustomReporter extends reporters_1.DefaultReporter {
91
- async onTestResult(test, testResult, aggregatedResults) {
92
- const rows = [];
93
- const feedbackKeys = new Set();
94
- try {
95
- for (const result of testResult.testResults) {
96
- const { title } = result;
97
- const titleComponents = title.split(":");
98
- const testId = titleComponents.length > 1 && !isNaN(parseInt(titleComponents[0], 10)) ? titleComponents[0] : undefined;
99
- const testName = testId !== undefined ? titleComponents.slice(1).join(":").trim() : titleComponents.join(":");
100
- // Non-LangSmith test
101
- if (testId === undefined) {
102
- rows.push([{
103
- Name: formatTestName(testName, result.duration),
104
- Result: getFormattedStatus(result.status),
105
- }, getColorParam(result.status)]);
106
- }
107
- else if (result.status === "pending") {
108
- // Skipped
109
- rows.push([{
110
- Name: formatTestName(testName, result.duration),
111
- Result: getFormattedStatus(result.status),
112
- }, getColorParam(result.status)]);
89
+ async function printReporterTable(results, failureMessage) {
90
+ const rows = [];
91
+ const feedbackKeys = new Set();
92
+ for (const result of results) {
93
+ const { title, duration, status } = result;
94
+ const titleComponents = title.split(":");
95
+ const testId = titleComponents.length > 1 && !isNaN(parseInt(titleComponents[0], 10))
96
+ ? titleComponents[0]
97
+ : undefined;
98
+ const testName = testId !== undefined
99
+ ? titleComponents.slice(1).join(":").trim()
100
+ : titleComponents.join(":");
101
+ // Non-LangSmith test
102
+ if (testId === undefined) {
103
+ rows.push([
104
+ {
105
+ Name: formatTestName(testName, duration),
106
+ Result: getFormattedStatus(status),
107
+ },
108
+ getColorParam(status),
109
+ ]);
110
+ }
111
+ else if (status === "pending") {
112
+ // Skipped
113
+ rows.push([
114
+ {
115
+ Name: formatTestName(testName, duration),
116
+ Result: getFormattedStatus(status),
117
+ },
118
+ getColorParam(status),
119
+ ]);
120
+ }
121
+ else {
122
+ const resultsPath = path.join(os.tmpdir(), "langsmith_test_results", `${testId}.json`);
123
+ let fileContent;
124
+ try {
125
+ fileContent = JSON.parse(await fs.readFile(resultsPath, "utf-8"));
126
+ await fs.unlink(resultsPath);
127
+ }
128
+ catch (e) {
129
+ throw new Error("Failed to display custom evaluation results. Falling back to default display...");
130
+ }
131
+ const feedback = fileContent.feedback.reduce((acc, current) => {
132
+ if (!RESERVED_KEYS.includes(current.key) &&
133
+ current.score !== undefined) {
134
+ feedbackKeys.add(current.key);
135
+ acc[current.key] = current.score;
113
136
  }
114
- else {
115
- const resultsPath = path.join(os.tmpdir(), "langsmith_test_results", `${testId}.json`);
116
- let fileContent;
117
- try {
118
- fileContent = JSON.parse(await fs.readFile(resultsPath));
137
+ return acc;
138
+ }, {});
139
+ rows.push([
140
+ {
141
+ Name: formatTestName(testName, duration),
142
+ Result: getFormattedStatus(status),
143
+ Inputs: formatValue(fileContent.inputs),
144
+ Expected: formatValue(fileContent.expected),
145
+ Actual: formatValue(fileContent.outputs),
146
+ ...feedback,
147
+ },
148
+ getColorParam(status),
149
+ ]);
150
+ }
151
+ }
152
+ for (const key of feedbackKeys) {
153
+ const scores = rows
154
+ .map(([row]) => row[key])
155
+ .filter((score) => score !== undefined);
156
+ if (scores.length > 0) {
157
+ const mean = scores.reduce((a, b) => a + b, 0) / scores.length;
158
+ const stdDev = Math.sqrt(scores.reduce((sq, n) => sq + Math.pow(n - mean, 2), 0) / scores.length);
159
+ for (const row of rows) {
160
+ const score = row[0][key];
161
+ if (score !== undefined) {
162
+ const deviation = (score - mean) / stdDev;
163
+ let coloredScore;
164
+ if (isNaN(deviation)) {
165
+ coloredScore = chalk_1.default.white(score);
119
166
  }
120
- catch (e) {
121
- throw new Error("Failed to display custom evaluation results. Falling back to default display...");
167
+ else if (deviation <= -1) {
168
+ coloredScore = chalk_1.default.redBright(score);
122
169
  }
123
- const feedback = fileContent.feedback.reduce((acc, current) => {
124
- if (!RESERVED_KEYS.includes(current.key)) {
125
- feedbackKeys.add(current.key);
126
- acc[current.key] = current.score;
127
- }
128
- return acc;
129
- }, {});
130
- rows.push([{
131
- Name: formatTestName(testName, result.duration),
132
- Result: getFormattedStatus(result.status),
133
- Inputs: formatValue(fileContent.inputs),
134
- Expected: formatValue(fileContent.expected),
135
- Actual: formatValue(fileContent.outputs),
136
- ...feedback,
137
- }, getColorParam(result.status)]);
138
- }
139
- }
140
- }
141
- catch (e) {
142
- console.log(e.message);
143
- return super.onTestResult(test, testResult, aggregatedResults);
144
- }
145
- for (const key of feedbackKeys) {
146
- const scores = rows
147
- .map(([row]) => row[key])
148
- .filter(score => score !== undefined);
149
- if (scores.length > 0) {
150
- const mean = scores.reduce((a, b) => a + b, 0) / scores.length;
151
- const stdDev = Math.sqrt(scores.reduce((sq, n) => sq + Math.pow(n - mean, 2), 0) / scores.length);
152
- for (const row of rows) {
153
- const score = row[0][key];
154
- if (score !== undefined) {
155
- const deviation = (score - mean) / stdDev;
156
- let coloredScore;
157
- if (isNaN(deviation)) {
158
- coloredScore = chalk_1.default.white(score);
159
- }
160
- else if (deviation <= -1) {
161
- coloredScore = chalk_1.default.redBright(score);
162
- }
163
- else if (deviation < -.5) {
164
- coloredScore = chalk_1.default.red(score);
165
- }
166
- else if (deviation < 0) {
167
- coloredScore = chalk_1.default.yellow(score);
168
- }
169
- else if (deviation === 0) {
170
- coloredScore = chalk_1.default.white(score);
171
- }
172
- else if (deviation <= .5) {
173
- coloredScore = chalk_1.default.green(score);
174
- }
175
- else {
176
- coloredScore = chalk_1.default.greenBright(score);
177
- }
178
- row[0][key] = coloredScore;
170
+ else if (deviation < -0.5) {
171
+ coloredScore = chalk_1.default.red(score);
172
+ }
173
+ else if (deviation < 0) {
174
+ coloredScore = chalk_1.default.yellow(score);
175
+ }
176
+ else if (deviation === 0) {
177
+ coloredScore = chalk_1.default.white(score);
178
+ }
179
+ else if (deviation <= 0.5) {
180
+ coloredScore = chalk_1.default.green(score);
181
+ }
182
+ else {
183
+ coloredScore = chalk_1.default.greenBright(score);
179
184
  }
185
+ row[0][key] = coloredScore;
180
186
  }
181
187
  }
182
188
  }
183
- console.log("");
184
- const table = new console_table_printer_1.Table({
185
- colorMap: {
186
- grey: "\x1b[90m",
187
- },
188
- });
189
- for (const row of rows) {
190
- table.addRow(...row);
191
- }
192
- if (testResult.failureMessage) {
193
- console.log(testResult.failureMessage);
194
- }
195
- table.printTable();
196
189
  }
190
+ console.log("");
191
+ const table = new console_table_printer_1.Table({
192
+ columns: [
193
+ { name: "Name", alignment: "left" },
194
+ { name: "Result", alignment: "left" },
195
+ { name: "Inputs", alignment: "left" },
196
+ { name: "Expected", alignment: "left" },
197
+ { name: "Actual", alignment: "left" },
198
+ ],
199
+ colorMap: {
200
+ grey: "\x1b[90m",
201
+ },
202
+ });
203
+ for (const row of rows) {
204
+ table.addRow(row[0], row[1]);
205
+ }
206
+ if (failureMessage) {
207
+ console.log(failureMessage);
208
+ }
209
+ table.printTable();
197
210
  }
198
- exports.default = CustomReporter;
211
+ exports.printReporterTable = printReporterTable;
@@ -1,5 +1,5 @@
1
- export default CustomReporter;
2
- declare class CustomReporter extends DefaultReporter {
3
- onTestResult(test: any, testResult: any, aggregatedResults: any): Promise<void>;
4
- }
5
- import { DefaultReporter } from "@jest/reporters";
1
+ export declare function printReporterTable(results: {
2
+ title: string;
3
+ duration: number;
4
+ status: string;
5
+ }[], failureMessage?: string): Promise<void>;
@@ -1,7 +1,5 @@
1
- import { DefaultReporter } from "@jest/reporters";
2
1
  import { Table } from "console-table-printer";
3
- import { validate as isUUID } from "uuid";
4
- import chalk from 'chalk';
2
+ import chalk from "chalk";
5
3
  import * as os from "node:os";
6
4
  import * as path from "node:path";
7
5
  import * as fs from "node:fs/promises";
@@ -45,126 +43,139 @@ function getColorParam(status) {
45
43
  }
46
44
  }
47
45
  function formatValue(value) {
48
- if (typeof value === 'object' && value !== null) {
46
+ if (typeof value === "object" && value !== null) {
49
47
  return Object.entries(value)
50
48
  .map(([k, v]) => {
51
- const rawValue = typeof v === 'string' ? v : JSON.stringify(v);
52
- const value = rawValue.length > 32 ? (rawValue.slice(0, 29) + "...") : rawValue;
49
+ const rawValue = typeof v === "string" ? v : JSON.stringify(v);
50
+ const value = rawValue.length > 32 ? rawValue.slice(0, 29) + "..." : rawValue;
53
51
  return `${k}: ${value}`;
54
52
  })
55
- .join(', ');
53
+ .join(", ");
56
54
  }
57
55
  if (value == null) {
58
56
  return;
59
57
  }
60
58
  return String(value);
61
59
  }
62
- class CustomReporter extends DefaultReporter {
63
- async onTestResult(test, testResult, aggregatedResults) {
64
- const rows = [];
65
- const feedbackKeys = new Set();
66
- try {
67
- for (const result of testResult.testResults) {
68
- const { title } = result;
69
- const titleComponents = title.split(":");
70
- const testId = titleComponents.length > 1 && !isNaN(parseInt(titleComponents[0], 10)) ? titleComponents[0] : undefined;
71
- const testName = testId !== undefined ? titleComponents.slice(1).join(":").trim() : titleComponents.join(":");
72
- // Non-LangSmith test
73
- if (testId === undefined) {
74
- rows.push([{
75
- Name: formatTestName(testName, result.duration),
76
- Result: getFormattedStatus(result.status),
77
- }, getColorParam(result.status)]);
78
- }
79
- else if (result.status === "pending") {
80
- // Skipped
81
- rows.push([{
82
- Name: formatTestName(testName, result.duration),
83
- Result: getFormattedStatus(result.status),
84
- }, getColorParam(result.status)]);
60
+ export async function printReporterTable(results, failureMessage) {
61
+ const rows = [];
62
+ const feedbackKeys = new Set();
63
+ for (const result of results) {
64
+ const { title, duration, status } = result;
65
+ const titleComponents = title.split(":");
66
+ const testId = titleComponents.length > 1 && !isNaN(parseInt(titleComponents[0], 10))
67
+ ? titleComponents[0]
68
+ : undefined;
69
+ const testName = testId !== undefined
70
+ ? titleComponents.slice(1).join(":").trim()
71
+ : titleComponents.join(":");
72
+ // Non-LangSmith test
73
+ if (testId === undefined) {
74
+ rows.push([
75
+ {
76
+ Name: formatTestName(testName, duration),
77
+ Result: getFormattedStatus(status),
78
+ },
79
+ getColorParam(status),
80
+ ]);
81
+ }
82
+ else if (status === "pending") {
83
+ // Skipped
84
+ rows.push([
85
+ {
86
+ Name: formatTestName(testName, duration),
87
+ Result: getFormattedStatus(status),
88
+ },
89
+ getColorParam(status),
90
+ ]);
91
+ }
92
+ else {
93
+ const resultsPath = path.join(os.tmpdir(), "langsmith_test_results", `${testId}.json`);
94
+ let fileContent;
95
+ try {
96
+ fileContent = JSON.parse(await fs.readFile(resultsPath, "utf-8"));
97
+ await fs.unlink(resultsPath);
98
+ }
99
+ catch (e) {
100
+ throw new Error("Failed to display custom evaluation results. Falling back to default display...");
101
+ }
102
+ const feedback = fileContent.feedback.reduce((acc, current) => {
103
+ if (!RESERVED_KEYS.includes(current.key) &&
104
+ current.score !== undefined) {
105
+ feedbackKeys.add(current.key);
106
+ acc[current.key] = current.score;
85
107
  }
86
- else {
87
- const resultsPath = path.join(os.tmpdir(), "langsmith_test_results", `${testId}.json`);
88
- let fileContent;
89
- try {
90
- fileContent = JSON.parse(await fs.readFile(resultsPath));
108
+ return acc;
109
+ }, {});
110
+ rows.push([
111
+ {
112
+ Name: formatTestName(testName, duration),
113
+ Result: getFormattedStatus(status),
114
+ Inputs: formatValue(fileContent.inputs),
115
+ Expected: formatValue(fileContent.expected),
116
+ Actual: formatValue(fileContent.outputs),
117
+ ...feedback,
118
+ },
119
+ getColorParam(status),
120
+ ]);
121
+ }
122
+ }
123
+ for (const key of feedbackKeys) {
124
+ const scores = rows
125
+ .map(([row]) => row[key])
126
+ .filter((score) => score !== undefined);
127
+ if (scores.length > 0) {
128
+ const mean = scores.reduce((a, b) => a + b, 0) / scores.length;
129
+ const stdDev = Math.sqrt(scores.reduce((sq, n) => sq + Math.pow(n - mean, 2), 0) / scores.length);
130
+ for (const row of rows) {
131
+ const score = row[0][key];
132
+ if (score !== undefined) {
133
+ const deviation = (score - mean) / stdDev;
134
+ let coloredScore;
135
+ if (isNaN(deviation)) {
136
+ coloredScore = chalk.white(score);
91
137
  }
92
- catch (e) {
93
- throw new Error("Failed to display custom evaluation results. Falling back to default display...");
138
+ else if (deviation <= -1) {
139
+ coloredScore = chalk.redBright(score);
94
140
  }
95
- const feedback = fileContent.feedback.reduce((acc, current) => {
96
- if (!RESERVED_KEYS.includes(current.key)) {
97
- feedbackKeys.add(current.key);
98
- acc[current.key] = current.score;
99
- }
100
- return acc;
101
- }, {});
102
- rows.push([{
103
- Name: formatTestName(testName, result.duration),
104
- Result: getFormattedStatus(result.status),
105
- Inputs: formatValue(fileContent.inputs),
106
- Expected: formatValue(fileContent.expected),
107
- Actual: formatValue(fileContent.outputs),
108
- ...feedback,
109
- }, getColorParam(result.status)]);
110
- }
111
- }
112
- }
113
- catch (e) {
114
- console.log(e.message);
115
- return super.onTestResult(test, testResult, aggregatedResults);
116
- }
117
- for (const key of feedbackKeys) {
118
- const scores = rows
119
- .map(([row]) => row[key])
120
- .filter(score => score !== undefined);
121
- if (scores.length > 0) {
122
- const mean = scores.reduce((a, b) => a + b, 0) / scores.length;
123
- const stdDev = Math.sqrt(scores.reduce((sq, n) => sq + Math.pow(n - mean, 2), 0) / scores.length);
124
- for (const row of rows) {
125
- const score = row[0][key];
126
- if (score !== undefined) {
127
- const deviation = (score - mean) / stdDev;
128
- let coloredScore;
129
- if (isNaN(deviation)) {
130
- coloredScore = chalk.white(score);
131
- }
132
- else if (deviation <= -1) {
133
- coloredScore = chalk.redBright(score);
134
- }
135
- else if (deviation < -.5) {
136
- coloredScore = chalk.red(score);
137
- }
138
- else if (deviation < 0) {
139
- coloredScore = chalk.yellow(score);
140
- }
141
- else if (deviation === 0) {
142
- coloredScore = chalk.white(score);
143
- }
144
- else if (deviation <= .5) {
145
- coloredScore = chalk.green(score);
146
- }
147
- else {
148
- coloredScore = chalk.greenBright(score);
149
- }
150
- row[0][key] = coloredScore;
141
+ else if (deviation < -0.5) {
142
+ coloredScore = chalk.red(score);
143
+ }
144
+ else if (deviation < 0) {
145
+ coloredScore = chalk.yellow(score);
146
+ }
147
+ else if (deviation === 0) {
148
+ coloredScore = chalk.white(score);
149
+ }
150
+ else if (deviation <= 0.5) {
151
+ coloredScore = chalk.green(score);
152
+ }
153
+ else {
154
+ coloredScore = chalk.greenBright(score);
151
155
  }
156
+ row[0][key] = coloredScore;
152
157
  }
153
158
  }
154
159
  }
155
- console.log("");
156
- const table = new Table({
157
- colorMap: {
158
- grey: "\x1b[90m",
159
- },
160
- });
161
- for (const row of rows) {
162
- table.addRow(...row);
163
- }
164
- if (testResult.failureMessage) {
165
- console.log(testResult.failureMessage);
166
- }
167
- table.printTable();
168
160
  }
161
+ console.log("");
162
+ const table = new Table({
163
+ columns: [
164
+ { name: "Name", alignment: "left" },
165
+ { name: "Result", alignment: "left" },
166
+ { name: "Inputs", alignment: "left" },
167
+ { name: "Expected", alignment: "left" },
168
+ { name: "Actual", alignment: "left" },
169
+ ],
170
+ colorMap: {
171
+ grey: "\x1b[90m",
172
+ },
173
+ });
174
+ for (const row of rows) {
175
+ table.addRow(row[0], row[1]);
176
+ }
177
+ if (failureMessage) {
178
+ console.log(failureMessage);
179
+ }
180
+ table.printTable();
169
181
  }
170
- export default CustomReporter;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-disable import/no-extraneous-dependencies */
4
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
5
+ // @ts-ignore Import does not to work with our CJS build order
6
+ const reporters_1 = require("vitest/reporters");
7
+ const reporter_js_1 = require("../utils/jestlike/reporter.cjs");
8
+ class LangSmithEvalReporter extends reporters_1.DefaultReporter {
9
+ async onFinished(files, errors) {
10
+ super.onFinished(files, errors);
11
+ for (const file of files) {
12
+ const testModule = this.ctx.state.getReportedEntity(file);
13
+ const tests = [...testModule.children.allTests()].map((test) => {
14
+ return {
15
+ title: test.name,
16
+ status: test.result()?.state ?? "skipped",
17
+ duration: Math.round(test.diagnostic()?.duration ?? 0),
18
+ };
19
+ });
20
+ await (0, reporter_js_1.printReporterTable)(tests);
21
+ }
22
+ this.end = performance.now();
23
+ }
24
+ }
25
+ exports.default = LangSmithEvalReporter;
@@ -0,0 +1,6 @@
1
+ import { DefaultReporter } from "vitest/reporters";
2
+ import { RunnerTestFile } from "vitest";
3
+ declare class LangSmithEvalReporter extends DefaultReporter {
4
+ onFinished(files: RunnerTestFile[], errors: unknown[]): Promise<void>;
5
+ }
6
+ export default LangSmithEvalReporter;
@@ -0,0 +1,23 @@
1
+ /* eslint-disable import/no-extraneous-dependencies */
2
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
3
+ // @ts-ignore Import does not to work with our CJS build order
4
+ import { DefaultReporter } from "vitest/reporters";
5
+ import { printReporterTable } from "../utils/jestlike/reporter.js";
6
+ class LangSmithEvalReporter extends DefaultReporter {
7
+ async onFinished(files, errors) {
8
+ super.onFinished(files, errors);
9
+ for (const file of files) {
10
+ const testModule = this.ctx.state.getReportedEntity(file);
11
+ const tests = [...testModule.children.allTests()].map((test) => {
12
+ return {
13
+ title: test.name,
14
+ status: test.result()?.state ?? "skipped",
15
+ duration: Math.round(test.diagnostic()?.duration ?? 0),
16
+ };
17
+ });
18
+ await printReporterTable(tests);
19
+ }
20
+ this.end = performance.now();
21
+ }
22
+ }
23
+ export default LangSmithEvalReporter;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "langsmith",
3
- "version": "0.2.16-rc.0",
3
+ "version": "0.2.16-rc.2",
4
4
  "description": "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform.",
5
5
  "packageManager": "yarn@1.22.19",
6
6
  "files": [
@@ -49,6 +49,10 @@
49
49
  "vitest.js",
50
50
  "vitest.d.ts",
51
51
  "vitest.d.cts",
52
+ "vitest/reporter.cjs",
53
+ "vitest/reporter.js",
54
+ "vitest/reporter.d.ts",
55
+ "vitest/reporter.d.cts",
52
56
  "wrappers.cjs",
53
57
  "wrappers.js",
54
58
  "wrappers.d.ts",
@@ -114,7 +118,7 @@
114
118
  "homepage": "https://github.com/langchain-ai/langsmith-sdk#readme",
115
119
  "dependencies": {
116
120
  "@types/uuid": "^10.0.0",
117
- "chalk": "5.4.1",
121
+ "chalk": "^4.1.2",
118
122
  "console-table-printer": "^2.12.1",
119
123
  "p-queue": "^6.6.2",
120
124
  "p-retry": "4",
@@ -280,6 +284,15 @@
280
284
  "import": "./vitest.js",
281
285
  "require": "./vitest.cjs"
282
286
  },
287
+ "./vitest/reporter": {
288
+ "types": {
289
+ "import": "./vitest/reporter.d.ts",
290
+ "require": "./vitest/reporter.d.cts",
291
+ "default": "./vitest/reporter.d.ts"
292
+ },
293
+ "import": "./vitest/reporter.js",
294
+ "require": "./vitest/reporter.cjs"
295
+ },
283
296
  "./wrappers": {
284
297
  "types": {
285
298
  "import": "./wrappers.d.ts",
@@ -0,0 +1 @@
1
+ module.exports = require('../dist/vitest/reporter.cjs');
@@ -0,0 +1 @@
1
+ export * from '../dist/vitest/reporter.js'
@@ -0,0 +1 @@
1
+ export * from '../dist/vitest/reporter.js'
@@ -0,0 +1 @@
1
+ export * from '../dist/vitest/reporter.js'