langsmith 0.3.6 → 0.3.8

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.3.6";
11
+ exports.__version__ = "0.3.8";
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.3.6";
5
+ export declare const __version__ = "0.3.8";
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.3.6";
5
+ export const __version__ = "0.3.8";
@@ -432,6 +432,28 @@ class RunTree {
432
432
  toJSON() {
433
433
  return this._convertToCreate(this, undefined, false);
434
434
  }
435
+ /**
436
+ * Add an event to the run tree.
437
+ * @param event - A single event or string to add
438
+ */
439
+ addEvent(event) {
440
+ if (!this.events) {
441
+ this.events = [];
442
+ }
443
+ if (typeof event === "string") {
444
+ this.events.push({
445
+ name: "event",
446
+ time: new Date().toISOString(),
447
+ message: event,
448
+ });
449
+ }
450
+ else {
451
+ this.events.push({
452
+ ...event,
453
+ time: event.time ?? new Date().toISOString(),
454
+ });
455
+ }
456
+ }
435
457
  static fromRunnableConfig(parentConfig, props) {
436
458
  // We only handle the callback manager case for now
437
459
  const callbackManager = parentConfig?.callbacks;
@@ -87,6 +87,11 @@ export declare class RunTree implements BaseRun {
87
87
  postRun(excludeChildRuns?: boolean): Promise<void>;
88
88
  patchRun(): Promise<void>;
89
89
  toJSON(): RunCreate;
90
+ /**
91
+ * Add an event to the run tree.
92
+ * @param event - A single event or string to add
93
+ */
94
+ addEvent(event: RunEvent | string): void;
90
95
  static fromRunnableConfig(parentConfig: RunnableConfigLike, props: RunTreeConfig): RunTree;
91
96
  static fromDottedOrder(dottedOrder: string): RunTree | undefined;
92
97
  static fromHeaders(headers: Record<string, string | string[]> | HeadersLike, inheritArgs?: RunTreeConfig): RunTree | undefined;
@@ -96,5 +101,12 @@ export declare class RunTree implements BaseRun {
96
101
  };
97
102
  }
98
103
  export declare function isRunTree(x?: unknown): x is RunTree;
104
+ export interface RunEvent {
105
+ name?: string;
106
+ time?: string;
107
+ message?: string;
108
+ kwargs?: Record<string, unknown>;
109
+ [key: string]: unknown;
110
+ }
99
111
  export declare function isRunnableConfigLike(x?: unknown): x is RunnableConfigLike;
100
112
  export {};
package/dist/run_trees.js CHANGED
@@ -405,6 +405,28 @@ export class RunTree {
405
405
  toJSON() {
406
406
  return this._convertToCreate(this, undefined, false);
407
407
  }
408
+ /**
409
+ * Add an event to the run tree.
410
+ * @param event - A single event or string to add
411
+ */
412
+ addEvent(event) {
413
+ if (!this.events) {
414
+ this.events = [];
415
+ }
416
+ if (typeof event === "string") {
417
+ this.events.push({
418
+ name: "event",
419
+ time: new Date().toISOString(),
420
+ message: event,
421
+ });
422
+ }
423
+ else {
424
+ this.events.push({
425
+ ...event,
426
+ time: event.time ?? new Date().toISOString(),
427
+ });
428
+ }
429
+ }
408
430
  static fromRunnableConfig(parentConfig, props) {
409
431
  // We only handle the callback manager case for now
410
432
  const callbackManager = parentConfig?.callbacks;
@@ -364,6 +364,13 @@ function traceable(wrappedFunc, config) {
364
364
  break;
365
365
  }
366
366
  chunks.push(result.value);
367
+ // Add new_token event for streaming LLM runs
368
+ if (currentRunTree && currentRunTree.run_type === "llm") {
369
+ currentRunTree.addEvent({
370
+ name: "new_token",
371
+ kwargs: { token: result.value },
372
+ });
373
+ }
367
374
  controller.enqueue(result.value);
368
375
  }
369
376
  },
@@ -390,6 +397,13 @@ function traceable(wrappedFunc, config) {
390
397
  break;
391
398
  }
392
399
  chunks.push(value);
400
+ // Add new_token event for streaming LLM runs
401
+ if (currentRunTree && currentRunTree.run_type === "llm") {
402
+ currentRunTree.addEvent({
403
+ name: "new_token",
404
+ kwargs: { token: value },
405
+ });
406
+ }
393
407
  yield value;
394
408
  }
395
409
  }
package/dist/traceable.js CHANGED
@@ -361,6 +361,13 @@ export function traceable(wrappedFunc, config) {
361
361
  break;
362
362
  }
363
363
  chunks.push(result.value);
364
+ // Add new_token event for streaming LLM runs
365
+ if (currentRunTree && currentRunTree.run_type === "llm") {
366
+ currentRunTree.addEvent({
367
+ name: "new_token",
368
+ kwargs: { token: result.value },
369
+ });
370
+ }
364
371
  controller.enqueue(result.value);
365
372
  }
366
373
  },
@@ -387,6 +394,13 @@ export function traceable(wrappedFunc, config) {
387
394
  break;
388
395
  }
389
396
  chunks.push(value);
397
+ // Add new_token event for streaming LLM runs
398
+ if (currentRunTree && currentRunTree.run_type === "llm") {
399
+ currentRunTree.addEvent({
400
+ name: "new_token",
401
+ kwargs: { token: value },
402
+ });
403
+ }
390
404
  yield value;
391
405
  }
392
406
  }
@@ -234,18 +234,18 @@ function generateWrapperFromJestlikeMethods(methods, testRunnerName) {
234
234
  const langsmithEnvironment = experimentConfig?.metadata?.LANGSMITH_ENVIRONMENT ??
235
235
  (0, env_js_1.getEnvironmentVariable)("LANGSMITH_ENVIRONMENT");
236
236
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
237
- const metadata = {
237
+ const suiteMetadata = {
238
238
  ...experimentConfig?.metadata,
239
239
  __ls_runner: testRunnerName,
240
240
  };
241
241
  if (environment !== undefined) {
242
- metadata.ENVIRONMENT = environment;
242
+ suiteMetadata.ENVIRONMENT = environment;
243
243
  }
244
244
  if (nodeEnv !== undefined) {
245
- metadata.NODE_ENV = nodeEnv;
245
+ suiteMetadata.NODE_ENV = nodeEnv;
246
246
  }
247
247
  if (langsmithEnvironment !== undefined) {
248
- metadata.LANGSMITH_ENVIRONMENT = langsmithEnvironment;
248
+ suiteMetadata.LANGSMITH_ENVIRONMENT = langsmithEnvironment;
249
249
  }
250
250
  const context = {
251
251
  suiteUuid,
@@ -254,7 +254,7 @@ function generateWrapperFromJestlikeMethods(methods, testRunnerName) {
254
254
  createdAt: new Date().toISOString(),
255
255
  projectConfig: {
256
256
  ...experimentConfig,
257
- metadata,
257
+ metadata: suiteMetadata,
258
258
  },
259
259
  enableTestTracking: experimentConfig?.enableTestTracking,
260
260
  };
@@ -278,11 +278,13 @@ function generateWrapperFromJestlikeMethods(methods, testRunnerName) {
278
278
  const endTime = new Date();
279
279
  let branch;
280
280
  let commit;
281
+ let dirty;
281
282
  try {
282
283
  branch = (0, child_process_1.execSync)("git rev-parse --abbrev-ref HEAD")
283
284
  .toString()
284
285
  .trim();
285
286
  commit = (0, child_process_1.execSync)("git rev-parse HEAD").toString().trim();
287
+ dirty = (0, child_process_1.execSync)("git status --porcelain").toString().trim() !== "";
286
288
  }
287
289
  catch {
288
290
  return;
@@ -304,24 +306,22 @@ function generateWrapperFromJestlikeMethods(methods, testRunnerName) {
304
306
  finalModifiedAt = endTime.toISOString();
305
307
  }
306
308
  const datasetInfo = datasetSetupInfo.get(suiteUuid);
307
- const { as_of } = await client.readDatasetVersion({
309
+ await client.updateProject(datasetInfo.project.id, {
310
+ metadata: {
311
+ ...suiteMetadata,
312
+ commit,
313
+ branch,
314
+ dirty,
315
+ },
316
+ });
317
+ await client.updateDatasetTag({
308
318
  datasetId: datasetInfo.dataset.id,
309
319
  asOf: finalModifiedAt,
320
+ tag: `git:commit:${commit}`,
310
321
  });
311
- await Promise.all([
312
- client.updateDatasetTag({
313
- datasetId: datasetInfo.dataset.id,
314
- asOf: as_of,
315
- tag: `git:branch:${branch}`,
316
- }),
317
- client.updateDatasetTag({
318
- datasetId: datasetInfo.dataset.id,
319
- asOf: as_of,
320
- tag: `git:commit:${commit}`,
321
- }),
322
- ]);
323
322
  }
324
- catch {
323
+ catch (e) {
324
+ console.error(e);
325
325
  return;
326
326
  }
327
327
  });
@@ -202,18 +202,18 @@ export function generateWrapperFromJestlikeMethods(methods, testRunnerName) {
202
202
  const langsmithEnvironment = experimentConfig?.metadata?.LANGSMITH_ENVIRONMENT ??
203
203
  getEnvironmentVariable("LANGSMITH_ENVIRONMENT");
204
204
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
205
- const metadata = {
205
+ const suiteMetadata = {
206
206
  ...experimentConfig?.metadata,
207
207
  __ls_runner: testRunnerName,
208
208
  };
209
209
  if (environment !== undefined) {
210
- metadata.ENVIRONMENT = environment;
210
+ suiteMetadata.ENVIRONMENT = environment;
211
211
  }
212
212
  if (nodeEnv !== undefined) {
213
- metadata.NODE_ENV = nodeEnv;
213
+ suiteMetadata.NODE_ENV = nodeEnv;
214
214
  }
215
215
  if (langsmithEnvironment !== undefined) {
216
- metadata.LANGSMITH_ENVIRONMENT = langsmithEnvironment;
216
+ suiteMetadata.LANGSMITH_ENVIRONMENT = langsmithEnvironment;
217
217
  }
218
218
  const context = {
219
219
  suiteUuid,
@@ -222,7 +222,7 @@ export function generateWrapperFromJestlikeMethods(methods, testRunnerName) {
222
222
  createdAt: new Date().toISOString(),
223
223
  projectConfig: {
224
224
  ...experimentConfig,
225
- metadata,
225
+ metadata: suiteMetadata,
226
226
  },
227
227
  enableTestTracking: experimentConfig?.enableTestTracking,
228
228
  };
@@ -246,11 +246,13 @@ export function generateWrapperFromJestlikeMethods(methods, testRunnerName) {
246
246
  const endTime = new Date();
247
247
  let branch;
248
248
  let commit;
249
+ let dirty;
249
250
  try {
250
251
  branch = execSync("git rev-parse --abbrev-ref HEAD")
251
252
  .toString()
252
253
  .trim();
253
254
  commit = execSync("git rev-parse HEAD").toString().trim();
255
+ dirty = execSync("git status --porcelain").toString().trim() !== "";
254
256
  }
255
257
  catch {
256
258
  return;
@@ -272,24 +274,22 @@ export function generateWrapperFromJestlikeMethods(methods, testRunnerName) {
272
274
  finalModifiedAt = endTime.toISOString();
273
275
  }
274
276
  const datasetInfo = datasetSetupInfo.get(suiteUuid);
275
- const { as_of } = await client.readDatasetVersion({
277
+ await client.updateProject(datasetInfo.project.id, {
278
+ metadata: {
279
+ ...suiteMetadata,
280
+ commit,
281
+ branch,
282
+ dirty,
283
+ },
284
+ });
285
+ await client.updateDatasetTag({
276
286
  datasetId: datasetInfo.dataset.id,
277
287
  asOf: finalModifiedAt,
288
+ tag: `git:commit:${commit}`,
278
289
  });
279
- await Promise.all([
280
- client.updateDatasetTag({
281
- datasetId: datasetInfo.dataset.id,
282
- asOf: as_of,
283
- tag: `git:branch:${branch}`,
284
- }),
285
- client.updateDatasetTag({
286
- datasetId: datasetInfo.dataset.id,
287
- asOf: as_of,
288
- tag: `git:commit:${commit}`,
289
- }),
290
- ]);
291
290
  }
292
- catch {
291
+ catch (e) {
292
+ console.error(e);
293
293
  return;
294
294
  }
295
295
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "langsmith",
3
- "version": "0.3.6",
3
+ "version": "0.3.8",
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": [
@@ -162,7 +162,7 @@
162
162
  "typedoc": "^0.27.6",
163
163
  "typedoc-plugin-expand-object-like-types": "^0.1.2",
164
164
  "typescript": "^5.4.5",
165
- "vitest": "^2.1.8",
165
+ "vitest": "^3.0.5",
166
166
  "zod": "^3.23.8"
167
167
  },
168
168
  "peerDependencies": {