langsmith 0.2.1-rc.0 → 0.2.2-rc.0
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/client.cjs +17 -23
- package/dist/client.d.ts +2 -2
- package/dist/client.js +15 -21
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/vercel.cjs +23 -8
- package/dist/vercel.d.ts +4 -6
- package/dist/vercel.js +23 -8
- package/package.json +1 -1
package/dist/client.cjs
CHANGED
|
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.Client = exports.DEFAULT_BATCH_SIZE_LIMIT_BYTES = exports.
|
|
26
|
+
exports.Client = exports.DEFAULT_BATCH_SIZE_LIMIT_BYTES = exports.AutoBatchQueue = exports.mergeRuntimeEnvIntoRunCreate = void 0;
|
|
27
27
|
const uuid = __importStar(require("uuid"));
|
|
28
28
|
const async_caller_js_1 = require("./utils/async_caller.cjs");
|
|
29
29
|
const messages_js_1 = require("./utils/messages.cjs");
|
|
@@ -102,7 +102,7 @@ const handle429 = async (response) => {
|
|
|
102
102
|
// Fall back to existing status checks
|
|
103
103
|
return false;
|
|
104
104
|
};
|
|
105
|
-
class
|
|
105
|
+
class AutoBatchQueue {
|
|
106
106
|
constructor() {
|
|
107
107
|
Object.defineProperty(this, "items", {
|
|
108
108
|
enumerable: true,
|
|
@@ -169,7 +169,7 @@ class Queue {
|
|
|
169
169
|
];
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
|
-
exports.
|
|
172
|
+
exports.AutoBatchQueue = AutoBatchQueue;
|
|
173
173
|
// 20 MB
|
|
174
174
|
exports.DEFAULT_BATCH_SIZE_LIMIT_BYTES = 20_971_520;
|
|
175
175
|
const SERVER_INFO_REQUEST_TIMEOUT = 1000;
|
|
@@ -251,7 +251,7 @@ class Client {
|
|
|
251
251
|
enumerable: true,
|
|
252
252
|
configurable: true,
|
|
253
253
|
writable: true,
|
|
254
|
-
value: new
|
|
254
|
+
value: new AutoBatchQueue()
|
|
255
255
|
});
|
|
256
256
|
Object.defineProperty(this, "autoBatchTimeout", {
|
|
257
257
|
enumerable: true,
|
|
@@ -539,20 +539,17 @@ class Client {
|
|
|
539
539
|
serverInfo.batch_ingest_config?.size_limit_bytes ??
|
|
540
540
|
exports.DEFAULT_BATCH_SIZE_LIMIT_BYTES);
|
|
541
541
|
}
|
|
542
|
-
|
|
543
|
-
const batchSizeLimit = await this._getBatchSizeLimitBytes();
|
|
542
|
+
drainAutoBatchQueue(batchSizeLimit) {
|
|
544
543
|
while (this.autoBatchQueue.items.length > 0) {
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
break;
|
|
550
|
-
}
|
|
551
|
-
await this.processBatch(batch, done);
|
|
544
|
+
const [batch, done] = this.autoBatchQueue.pop(batchSizeLimit);
|
|
545
|
+
if (!batch.length) {
|
|
546
|
+
done();
|
|
547
|
+
break;
|
|
552
548
|
}
|
|
549
|
+
void this._processBatch(batch, done).catch(console.error);
|
|
553
550
|
}
|
|
554
551
|
}
|
|
555
|
-
async
|
|
552
|
+
async _processBatch(batch, done) {
|
|
556
553
|
if (!batch.length) {
|
|
557
554
|
done();
|
|
558
555
|
return;
|
|
@@ -578,7 +575,7 @@ class Client {
|
|
|
578
575
|
done();
|
|
579
576
|
}
|
|
580
577
|
}
|
|
581
|
-
async processRunOperation(item
|
|
578
|
+
async processRunOperation(item) {
|
|
582
579
|
const oldTimeout = this.autoBatchTimeout;
|
|
583
580
|
clearTimeout(this.autoBatchTimeout);
|
|
584
581
|
this.autoBatchTimeout = undefined;
|
|
@@ -587,16 +584,13 @@ class Client {
|
|
|
587
584
|
}
|
|
588
585
|
const itemPromise = this.autoBatchQueue.push(item);
|
|
589
586
|
const sizeLimitBytes = await this._getBatchSizeLimitBytes();
|
|
590
|
-
if (
|
|
591
|
-
this.
|
|
592
|
-
await this.drainAutoBatchQueue().catch(console.error);
|
|
587
|
+
if (this.autoBatchQueue.sizeBytes > sizeLimitBytes) {
|
|
588
|
+
this.drainAutoBatchQueue(sizeLimitBytes);
|
|
593
589
|
}
|
|
594
590
|
if (this.autoBatchQueue.items.length > 0) {
|
|
595
591
|
this.autoBatchTimeout = setTimeout(() => {
|
|
596
592
|
this.autoBatchTimeout = undefined;
|
|
597
|
-
|
|
598
|
-
// from the outside. So just log instead.
|
|
599
|
-
void this.drainAutoBatchQueue().catch(console.error);
|
|
593
|
+
this.drainAutoBatchQueue(sizeLimitBytes);
|
|
600
594
|
}, oldTimeout
|
|
601
595
|
? this.autoBatchAggregationDelayMs
|
|
602
596
|
: this.autoBatchInitialDelayMs);
|
|
@@ -921,9 +915,9 @@ class Client {
|
|
|
921
915
|
if (run.end_time !== undefined &&
|
|
922
916
|
data.parent_run_id === undefined &&
|
|
923
917
|
this.blockOnRootRunFinalization) {
|
|
924
|
-
// Trigger
|
|
918
|
+
// Trigger batches as soon as a root trace ends and wait to ensure trace finishes
|
|
925
919
|
// in serverless environments.
|
|
926
|
-
await this.processRunOperation({ action: "update", item: data }
|
|
920
|
+
await this.processRunOperation({ action: "update", item: data }).catch(console.error);
|
|
927
921
|
return;
|
|
928
922
|
}
|
|
929
923
|
else {
|
package/dist/client.d.ts
CHANGED
|
@@ -164,7 +164,7 @@ type AutoBatchQueueItem = {
|
|
|
164
164
|
item: RunCreate | RunUpdate;
|
|
165
165
|
};
|
|
166
166
|
export declare function mergeRuntimeEnvIntoRunCreate(run: RunCreate): RunCreate;
|
|
167
|
-
export declare class
|
|
167
|
+
export declare class AutoBatchQueue {
|
|
168
168
|
items: {
|
|
169
169
|
action: "create" | "update";
|
|
170
170
|
payload: RunCreate | RunUpdate;
|
|
@@ -228,7 +228,7 @@ export declare class Client {
|
|
|
228
228
|
private _filterForSampling;
|
|
229
229
|
private _getBatchSizeLimitBytes;
|
|
230
230
|
private drainAutoBatchQueue;
|
|
231
|
-
private
|
|
231
|
+
private _processBatch;
|
|
232
232
|
private processRunOperation;
|
|
233
233
|
protected _getServerInfo(): Promise<any>;
|
|
234
234
|
protected _ensureServerInfo(): Promise<Record<string, any>>;
|
package/dist/client.js
CHANGED
|
@@ -75,7 +75,7 @@ const handle429 = async (response) => {
|
|
|
75
75
|
// Fall back to existing status checks
|
|
76
76
|
return false;
|
|
77
77
|
};
|
|
78
|
-
export class
|
|
78
|
+
export class AutoBatchQueue {
|
|
79
79
|
constructor() {
|
|
80
80
|
Object.defineProperty(this, "items", {
|
|
81
81
|
enumerable: true,
|
|
@@ -223,7 +223,7 @@ export class Client {
|
|
|
223
223
|
enumerable: true,
|
|
224
224
|
configurable: true,
|
|
225
225
|
writable: true,
|
|
226
|
-
value: new
|
|
226
|
+
value: new AutoBatchQueue()
|
|
227
227
|
});
|
|
228
228
|
Object.defineProperty(this, "autoBatchTimeout", {
|
|
229
229
|
enumerable: true,
|
|
@@ -511,20 +511,17 @@ export class Client {
|
|
|
511
511
|
serverInfo.batch_ingest_config?.size_limit_bytes ??
|
|
512
512
|
DEFAULT_BATCH_SIZE_LIMIT_BYTES);
|
|
513
513
|
}
|
|
514
|
-
|
|
515
|
-
const batchSizeLimit = await this._getBatchSizeLimitBytes();
|
|
514
|
+
drainAutoBatchQueue(batchSizeLimit) {
|
|
516
515
|
while (this.autoBatchQueue.items.length > 0) {
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
break;
|
|
522
|
-
}
|
|
523
|
-
await this.processBatch(batch, done);
|
|
516
|
+
const [batch, done] = this.autoBatchQueue.pop(batchSizeLimit);
|
|
517
|
+
if (!batch.length) {
|
|
518
|
+
done();
|
|
519
|
+
break;
|
|
524
520
|
}
|
|
521
|
+
void this._processBatch(batch, done).catch(console.error);
|
|
525
522
|
}
|
|
526
523
|
}
|
|
527
|
-
async
|
|
524
|
+
async _processBatch(batch, done) {
|
|
528
525
|
if (!batch.length) {
|
|
529
526
|
done();
|
|
530
527
|
return;
|
|
@@ -550,7 +547,7 @@ export class Client {
|
|
|
550
547
|
done();
|
|
551
548
|
}
|
|
552
549
|
}
|
|
553
|
-
async processRunOperation(item
|
|
550
|
+
async processRunOperation(item) {
|
|
554
551
|
const oldTimeout = this.autoBatchTimeout;
|
|
555
552
|
clearTimeout(this.autoBatchTimeout);
|
|
556
553
|
this.autoBatchTimeout = undefined;
|
|
@@ -559,16 +556,13 @@ export class Client {
|
|
|
559
556
|
}
|
|
560
557
|
const itemPromise = this.autoBatchQueue.push(item);
|
|
561
558
|
const sizeLimitBytes = await this._getBatchSizeLimitBytes();
|
|
562
|
-
if (
|
|
563
|
-
this.
|
|
564
|
-
await this.drainAutoBatchQueue().catch(console.error);
|
|
559
|
+
if (this.autoBatchQueue.sizeBytes > sizeLimitBytes) {
|
|
560
|
+
this.drainAutoBatchQueue(sizeLimitBytes);
|
|
565
561
|
}
|
|
566
562
|
if (this.autoBatchQueue.items.length > 0) {
|
|
567
563
|
this.autoBatchTimeout = setTimeout(() => {
|
|
568
564
|
this.autoBatchTimeout = undefined;
|
|
569
|
-
|
|
570
|
-
// from the outside. So just log instead.
|
|
571
|
-
void this.drainAutoBatchQueue().catch(console.error);
|
|
565
|
+
this.drainAutoBatchQueue(sizeLimitBytes);
|
|
572
566
|
}, oldTimeout
|
|
573
567
|
? this.autoBatchAggregationDelayMs
|
|
574
568
|
: this.autoBatchInitialDelayMs);
|
|
@@ -893,9 +887,9 @@ export class Client {
|
|
|
893
887
|
if (run.end_time !== undefined &&
|
|
894
888
|
data.parent_run_id === undefined &&
|
|
895
889
|
this.blockOnRootRunFinalization) {
|
|
896
|
-
// Trigger
|
|
890
|
+
// Trigger batches as soon as a root trace ends and wait to ensure trace finishes
|
|
897
891
|
// in serverless environments.
|
|
898
|
-
await this.processRunOperation({ action: "update", item: data }
|
|
892
|
+
await this.processRunOperation({ action: "update", item: data }).catch(console.error);
|
|
899
893
|
return;
|
|
900
894
|
}
|
|
901
895
|
else {
|
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.
|
|
11
|
+
exports.__version__ = "0.2.2-rc.0";
|
package/dist/index.d.ts
CHANGED
|
@@ -2,4 +2,4 @@ export { Client, type ClientConfig } from "./client.js";
|
|
|
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.
|
|
5
|
+
export declare const __version__ = "0.2.2-rc.0";
|
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.
|
|
5
|
+
export const __version__ = "0.2.2-rc.0";
|
package/dist/vercel.cjs
CHANGED
|
@@ -156,7 +156,7 @@ const RESERVED_METADATA_KEYS = [
|
|
|
156
156
|
* import { AISDKExporter } from "langsmith/vercel";
|
|
157
157
|
* import { Client } from "langsmith";
|
|
158
158
|
*
|
|
159
|
-
* import {
|
|
159
|
+
* import { generateText } from "ai";
|
|
160
160
|
* import { openai } from "@ai-sdk/openai";
|
|
161
161
|
*
|
|
162
162
|
* import { NodeSDK } from "@opentelemetry/sdk-node";
|
|
@@ -181,10 +181,11 @@ const RESERVED_METADATA_KEYS = [
|
|
|
181
181
|
* ],
|
|
182
182
|
* experimental_telemetry: AISDKExporter.getSettings({
|
|
183
183
|
* runName: "langsmith_traced_call",
|
|
184
|
-
* functionId: "functionId",
|
|
185
184
|
* metadata: { userId: "123", language: "english" },
|
|
186
185
|
* }),
|
|
187
186
|
* });
|
|
187
|
+
*
|
|
188
|
+
* await sdk.shutdown();
|
|
188
189
|
* ```
|
|
189
190
|
*/
|
|
190
191
|
class AISDKExporter {
|
|
@@ -215,11 +216,8 @@ class AISDKExporter {
|
|
|
215
216
|
});
|
|
216
217
|
this.client = args?.client ?? new index_js_1.Client();
|
|
217
218
|
}
|
|
218
|
-
/**
|
|
219
|
-
* Helper method for initializing OTEL settings.
|
|
220
|
-
*/
|
|
221
219
|
static getSettings(settings) {
|
|
222
|
-
const { runId, runName, ...rest } = settings;
|
|
220
|
+
const { runId, runName, ...rest } = settings ?? {};
|
|
223
221
|
const metadata = { ...rest?.metadata };
|
|
224
222
|
if (runId != null)
|
|
225
223
|
metadata[RUN_ID_METADATA_KEY.input] = runId;
|
|
@@ -501,10 +499,23 @@ class AISDKExporter {
|
|
|
501
499
|
case "ai.embedMany":
|
|
502
500
|
case "ai.embedMany.doEmbed":
|
|
503
501
|
default:
|
|
504
|
-
console.warn(`Span "${span.name}" is currently unsupported.`);
|
|
505
502
|
return undefined;
|
|
506
503
|
}
|
|
507
504
|
}
|
|
505
|
+
/** @internal */
|
|
506
|
+
isRootRun(span) {
|
|
507
|
+
switch (span.name) {
|
|
508
|
+
case "ai.generateText":
|
|
509
|
+
case "ai.streamText":
|
|
510
|
+
case "ai.generateObject":
|
|
511
|
+
case "ai.streamObject":
|
|
512
|
+
case "ai.embed":
|
|
513
|
+
case "ai.embedMany":
|
|
514
|
+
return true;
|
|
515
|
+
default:
|
|
516
|
+
return false;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
508
519
|
export(spans, resultCallback) {
|
|
509
520
|
const typedSpans = spans
|
|
510
521
|
.slice()
|
|
@@ -518,9 +529,13 @@ class AISDKExporter {
|
|
|
518
529
|
relativeExecutionOrder: {},
|
|
519
530
|
};
|
|
520
531
|
const runId = (0, uuid_1.v5)(spanId, RUN_ID_NAMESPACE);
|
|
521
|
-
|
|
532
|
+
let parentRunId = parentId
|
|
522
533
|
? (0, uuid_1.v5)(parentId, RUN_ID_NAMESPACE)
|
|
523
534
|
: undefined;
|
|
535
|
+
// in LangSmith we currently only support certain spans
|
|
536
|
+
// which may be deeply nested within other traces
|
|
537
|
+
if (this.isRootRun(span))
|
|
538
|
+
parentRunId = undefined;
|
|
524
539
|
const traceMap = this.traceByMap[traceId];
|
|
525
540
|
const run = this.getRunCreate(span);
|
|
526
541
|
if (!run)
|
package/dist/vercel.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ export interface TelemetrySettings extends AITelemetrySettings {
|
|
|
15
15
|
* import { AISDKExporter } from "langsmith/vercel";
|
|
16
16
|
* import { Client } from "langsmith";
|
|
17
17
|
*
|
|
18
|
-
* import {
|
|
18
|
+
* import { generateText } from "ai";
|
|
19
19
|
* import { openai } from "@ai-sdk/openai";
|
|
20
20
|
*
|
|
21
21
|
* import { NodeSDK } from "@opentelemetry/sdk-node";
|
|
@@ -40,10 +40,11 @@ export interface TelemetrySettings extends AITelemetrySettings {
|
|
|
40
40
|
* ],
|
|
41
41
|
* experimental_telemetry: AISDKExporter.getSettings({
|
|
42
42
|
* runName: "langsmith_traced_call",
|
|
43
|
-
* functionId: "functionId",
|
|
44
43
|
* metadata: { userId: "123", language: "english" },
|
|
45
44
|
* }),
|
|
46
45
|
* });
|
|
46
|
+
*
|
|
47
|
+
* await sdk.shutdown();
|
|
47
48
|
* ```
|
|
48
49
|
*/
|
|
49
50
|
export declare class AISDKExporter {
|
|
@@ -52,10 +53,7 @@ export declare class AISDKExporter {
|
|
|
52
53
|
constructor(args?: {
|
|
53
54
|
client?: Client;
|
|
54
55
|
});
|
|
55
|
-
|
|
56
|
-
* Helper method for initializing OTEL settings.
|
|
57
|
-
*/
|
|
58
|
-
static getSettings(settings: TelemetrySettings): {
|
|
56
|
+
static getSettings(settings?: TelemetrySettings): {
|
|
59
57
|
isEnabled: boolean;
|
|
60
58
|
metadata: {
|
|
61
59
|
[x: string]: import("@opentelemetry/api").AttributeValue;
|
package/dist/vercel.js
CHANGED
|
@@ -153,7 +153,7 @@ const RESERVED_METADATA_KEYS = [
|
|
|
153
153
|
* import { AISDKExporter } from "langsmith/vercel";
|
|
154
154
|
* import { Client } from "langsmith";
|
|
155
155
|
*
|
|
156
|
-
* import {
|
|
156
|
+
* import { generateText } from "ai";
|
|
157
157
|
* import { openai } from "@ai-sdk/openai";
|
|
158
158
|
*
|
|
159
159
|
* import { NodeSDK } from "@opentelemetry/sdk-node";
|
|
@@ -178,10 +178,11 @@ const RESERVED_METADATA_KEYS = [
|
|
|
178
178
|
* ],
|
|
179
179
|
* experimental_telemetry: AISDKExporter.getSettings({
|
|
180
180
|
* runName: "langsmith_traced_call",
|
|
181
|
-
* functionId: "functionId",
|
|
182
181
|
* metadata: { userId: "123", language: "english" },
|
|
183
182
|
* }),
|
|
184
183
|
* });
|
|
184
|
+
*
|
|
185
|
+
* await sdk.shutdown();
|
|
185
186
|
* ```
|
|
186
187
|
*/
|
|
187
188
|
export class AISDKExporter {
|
|
@@ -212,11 +213,8 @@ export class AISDKExporter {
|
|
|
212
213
|
});
|
|
213
214
|
this.client = args?.client ?? new Client();
|
|
214
215
|
}
|
|
215
|
-
/**
|
|
216
|
-
* Helper method for initializing OTEL settings.
|
|
217
|
-
*/
|
|
218
216
|
static getSettings(settings) {
|
|
219
|
-
const { runId, runName, ...rest } = settings;
|
|
217
|
+
const { runId, runName, ...rest } = settings ?? {};
|
|
220
218
|
const metadata = { ...rest?.metadata };
|
|
221
219
|
if (runId != null)
|
|
222
220
|
metadata[RUN_ID_METADATA_KEY.input] = runId;
|
|
@@ -498,10 +496,23 @@ export class AISDKExporter {
|
|
|
498
496
|
case "ai.embedMany":
|
|
499
497
|
case "ai.embedMany.doEmbed":
|
|
500
498
|
default:
|
|
501
|
-
console.warn(`Span "${span.name}" is currently unsupported.`);
|
|
502
499
|
return undefined;
|
|
503
500
|
}
|
|
504
501
|
}
|
|
502
|
+
/** @internal */
|
|
503
|
+
isRootRun(span) {
|
|
504
|
+
switch (span.name) {
|
|
505
|
+
case "ai.generateText":
|
|
506
|
+
case "ai.streamText":
|
|
507
|
+
case "ai.generateObject":
|
|
508
|
+
case "ai.streamObject":
|
|
509
|
+
case "ai.embed":
|
|
510
|
+
case "ai.embedMany":
|
|
511
|
+
return true;
|
|
512
|
+
default:
|
|
513
|
+
return false;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
505
516
|
export(spans, resultCallback) {
|
|
506
517
|
const typedSpans = spans
|
|
507
518
|
.slice()
|
|
@@ -515,9 +526,13 @@ export class AISDKExporter {
|
|
|
515
526
|
relativeExecutionOrder: {},
|
|
516
527
|
};
|
|
517
528
|
const runId = uuid5(spanId, RUN_ID_NAMESPACE);
|
|
518
|
-
|
|
529
|
+
let parentRunId = parentId
|
|
519
530
|
? uuid5(parentId, RUN_ID_NAMESPACE)
|
|
520
531
|
: undefined;
|
|
532
|
+
// in LangSmith we currently only support certain spans
|
|
533
|
+
// which may be deeply nested within other traces
|
|
534
|
+
if (this.isRootRun(span))
|
|
535
|
+
parentRunId = undefined;
|
|
521
536
|
const traceMap = this.traceByMap[traceId];
|
|
522
537
|
const run = this.getRunCreate(span);
|
|
523
538
|
if (!run)
|