Severian's picture
Upload 7464 files
c211499
raw
history blame
7.41 kB
import * as uuid from "uuid";
import { getEnvironmentVariable, getRuntimeEnvironment } from "./utils/env.js";
import { Client } from "./client.js";
const warnedMessages = {};
function warnOnce(message) {
if (!warnedMessages[message]) {
console.warn(message);
warnedMessages[message] = true;
}
}
export class RunTree {
constructor(config) {
Object.defineProperty(this, "id", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "name", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "run_type", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "project_name", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "parent_run", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "child_runs", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "execution_order", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "child_execution_order", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "start_time", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "end_time", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "extra", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "error", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "serialized", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "inputs", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "outputs", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "reference_example_id", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "client", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "events", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
const defaultConfig = RunTree.getDefaultConfig();
Object.assign(this, { ...defaultConfig, ...config });
}
static getDefaultConfig() {
return {
id: uuid.v4(),
project_name: getEnvironmentVariable("LANGCHAIN_PROJECT") ??
getEnvironmentVariable("LANGCHAIN_SESSION") ?? // TODO: Deprecate
"default",
child_runs: [],
execution_order: 1,
child_execution_order: 1,
api_url: getEnvironmentVariable("LANGCHAIN_ENDPOINT") ?? "http://localhost:1984",
api_key: getEnvironmentVariable("LANGCHAIN_API_KEY"),
caller_options: {},
start_time: Date.now(),
serialized: {},
inputs: {},
extra: {},
client: new Client({}),
};
}
async createChild(config) {
const child = new RunTree({
...config,
parent_run: this,
project_name: this.project_name,
client: this.client,
execution_order: this.child_execution_order + 1,
child_execution_order: this.child_execution_order + 1,
});
this.child_runs.push(child);
return child;
}
async end(outputs, error, endTime = Date.now()) {
this.outputs = outputs;
this.error = error;
this.end_time = endTime;
if (this.parent_run) {
this.parent_run.child_execution_order = Math.max(this.parent_run.child_execution_order, this.child_execution_order);
}
}
async _convertToCreate(run, excludeChildRuns = true) {
const runExtra = run.extra ?? {};
if (!runExtra.runtime) {
runExtra.runtime = {};
}
const runtimeEnv = await getRuntimeEnvironment();
for (const [k, v] of Object.entries(runtimeEnv)) {
if (!runExtra.runtime[k]) {
runExtra.runtime[k] = v;
}
}
let child_runs;
let parent_run_id;
if (!excludeChildRuns) {
child_runs = await Promise.all(run.child_runs.map((child_run) => this._convertToCreate(child_run, excludeChildRuns)));
parent_run_id = undefined;
}
else {
parent_run_id = run.parent_run?.id;
child_runs = [];
}
const persistedRun = {
id: run.id,
name: run.name,
start_time: run.start_time,
end_time: run.end_time,
run_type: run.run_type,
reference_example_id: run.reference_example_id,
extra: runExtra,
execution_order: run.execution_order,
serialized: run.serialized,
error: run.error,
inputs: run.inputs,
outputs: run.outputs,
session_name: run.project_name,
child_runs: child_runs,
parent_run_id: parent_run_id,
};
return persistedRun;
}
async postRun(excludeChildRuns = true) {
const runCreate = await this._convertToCreate(this, true);
await this.client.createRun(runCreate);
if (!excludeChildRuns) {
warnOnce("Posting with excludeChildRuns=false is deprecated and will be removed in a future version.");
for (const childRun of this.child_runs) {
await childRun.postRun(false);
}
}
}
async patchRun() {
const runUpdate = {
end_time: this.end_time,
error: this.error,
outputs: this.outputs,
parent_run_id: this.parent_run?.id,
reference_example_id: this.reference_example_id,
extra: this.extra,
events: this.events,
};
await this.client.updateRun(this.id, runUpdate);
}
}