165 lines
5.8 KiB
JavaScript
165 lines
5.8 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.JsonGetValueTool = exports.JsonListKeysTool = exports.JsonSpec = void 0;
|
|
const jsonpointer_1 = __importDefault(require("jsonpointer"));
|
|
const serializable_1 = require("@langchain/core/load/serializable");
|
|
const tools_1 = require("@langchain/core/tools");
|
|
/**
|
|
* Represents a JSON object in the LangChain framework. Provides methods
|
|
* to get keys and values from the JSON object.
|
|
*/
|
|
class JsonSpec extends serializable_1.Serializable {
|
|
constructor(obj, max_value_length = 4000) {
|
|
super(...arguments);
|
|
Object.defineProperty(this, "lc_namespace", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: ["langchain", "tools", "json"]
|
|
});
|
|
Object.defineProperty(this, "obj", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: void 0
|
|
});
|
|
Object.defineProperty(this, "maxValueLength", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: 4000
|
|
});
|
|
this.obj = obj;
|
|
this.maxValueLength = max_value_length;
|
|
}
|
|
/**
|
|
* Retrieves all keys at a given path in the JSON object.
|
|
* @param input The path to the keys in the JSON object, provided as a string in JSON pointer syntax.
|
|
* @returns A string containing all keys at the given path, separated by commas.
|
|
*/
|
|
getKeys(input) {
|
|
const pointer = jsonpointer_1.default.compile(input);
|
|
const res = pointer.get(this.obj);
|
|
if (typeof res === "object" && !Array.isArray(res) && res !== null) {
|
|
return Object.keys(res)
|
|
.map((i) => i.replaceAll("~", "~0").replaceAll("/", "~1"))
|
|
.join(", ");
|
|
}
|
|
throw new Error(`Value at ${input} is not a dictionary, get the value directly instead.`);
|
|
}
|
|
/**
|
|
* Retrieves the value at a given path in the JSON object.
|
|
* @param input The path to the value in the JSON object, provided as a string in JSON pointer syntax.
|
|
* @returns The value at the given path in the JSON object, as a string. If the value is a large dictionary or exceeds the maximum length, a message is returned instead.
|
|
*/
|
|
getValue(input) {
|
|
const pointer = jsonpointer_1.default.compile(input);
|
|
const res = pointer.get(this.obj);
|
|
if (res === null || res === undefined) {
|
|
throw new Error(`Value at ${input} is null or undefined.`);
|
|
}
|
|
const str = typeof res === "object" ? JSON.stringify(res) : res.toString();
|
|
if (typeof res === "object" &&
|
|
!Array.isArray(res) &&
|
|
str.length > this.maxValueLength) {
|
|
return `Value is a large dictionary, should explore its keys directly.`;
|
|
}
|
|
if (str.length > this.maxValueLength) {
|
|
return `${str.slice(0, this.maxValueLength)}...`;
|
|
}
|
|
return str;
|
|
}
|
|
}
|
|
exports.JsonSpec = JsonSpec;
|
|
/**
|
|
* A tool in the LangChain framework that lists all keys at a given path
|
|
* in a JSON object.
|
|
*/
|
|
class JsonListKeysTool extends tools_1.Tool {
|
|
static lc_name() {
|
|
return "JsonListKeysTool";
|
|
}
|
|
constructor(fields) {
|
|
if (!("jsonSpec" in fields)) {
|
|
// eslint-disable-next-line no-param-reassign
|
|
fields = { jsonSpec: fields };
|
|
}
|
|
super(fields);
|
|
Object.defineProperty(this, "name", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: "json_list_keys"
|
|
});
|
|
Object.defineProperty(this, "jsonSpec", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: void 0
|
|
});
|
|
Object.defineProperty(this, "description", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: `Can be used to list all keys at a given path.
|
|
Before calling this you should be SURE that the path to this exists.
|
|
The input is a text representation of the path to the json as json pointer syntax (e.g. /key1/0/key2).`
|
|
});
|
|
this.jsonSpec = fields.jsonSpec;
|
|
}
|
|
/** @ignore */
|
|
async _call(input) {
|
|
try {
|
|
return this.jsonSpec.getKeys(input);
|
|
}
|
|
catch (error) {
|
|
return `${error}`;
|
|
}
|
|
}
|
|
}
|
|
exports.JsonListKeysTool = JsonListKeysTool;
|
|
/**
|
|
* A tool in the LangChain framework that retrieves the value at a given
|
|
* path in a JSON object.
|
|
*/
|
|
class JsonGetValueTool extends tools_1.Tool {
|
|
static lc_name() {
|
|
return "JsonGetValueTool";
|
|
}
|
|
constructor(jsonSpec) {
|
|
super();
|
|
Object.defineProperty(this, "jsonSpec", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: jsonSpec
|
|
});
|
|
Object.defineProperty(this, "name", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: "json_get_value"
|
|
});
|
|
Object.defineProperty(this, "description", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: `Can be used to see value in string format at a given path.
|
|
Before calling this you should be SURE that the path to this exists.
|
|
The input is a text representation of the path to the json as json pointer syntax (e.g. /key1/0/key2).`
|
|
});
|
|
}
|
|
/** @ignore */
|
|
async _call(input) {
|
|
try {
|
|
return this.jsonSpec.getValue(input);
|
|
}
|
|
catch (error) {
|
|
return `${error}`;
|
|
}
|
|
}
|
|
}
|
|
exports.JsonGetValueTool = JsonGetValueTool;
|