agsamantha/node_modules/@langchain/community/dist/tools/connery.cjs
2024-10-02 15:15:21 -05:00

221 lines
8.6 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConneryService = exports.ConneryAction = void 0;
const async_caller_1 = require("@langchain/core/utils/async_caller");
const env_1 = require("@langchain/core/utils/env");
const tools_1 = require("@langchain/core/tools");
const zod_1 = require("zod");
/**
* A LangChain Tool object wrapping a Connery action.
* ConneryAction is a structured tool that can be used only in the agents supporting structured tools.
* @extends StructuredTool
*/
class ConneryAction extends tools_1.StructuredTool {
/**
* Creates a ConneryAction instance based on the provided Connery Action.
* @param _action The Connery Action.
* @param _service The ConneryService instance.
* @returns A ConneryAction instance.
*/
constructor(_action, _service) {
super();
Object.defineProperty(this, "_action", {
enumerable: true,
configurable: true,
writable: true,
value: _action
});
Object.defineProperty(this, "_service", {
enumerable: true,
configurable: true,
writable: true,
value: _service
});
Object.defineProperty(this, "name", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "description", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "schema", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.name = this._action.id;
this.description =
this._action.title +
(this._action.description ? `: ${this._action.description}` : "");
this.schema = this.createInputSchema();
}
/**
* Runs the Connery Action with the provided input.
* @param arg The input object expected by the action.
* @returns A promise that resolves to a JSON string containing the output of the action.
*/
_call(arg) {
return this._service.runAction(this._action.id, arg);
}
/**
* Creates a Zod schema for the input object expected by the Connery action.
* @returns A Zod schema for the input object expected by the Connery action.
*/
createInputSchema() {
const dynamicInputFields = {};
this._action.inputParameters.forEach((param) => {
const isRequired = param.validation?.required ?? false;
let fieldSchema = zod_1.z.string();
fieldSchema = isRequired ? fieldSchema : fieldSchema.optional();
const fieldDescription = param.title + (param.description ? `: ${param.description}` : "");
fieldSchema = fieldSchema.describe(fieldDescription);
dynamicInputFields[param.key] = fieldSchema;
});
return zod_1.z.object(dynamicInputFields);
}
}
exports.ConneryAction = ConneryAction;
/**
* A service for working with Connery Actions.
*/
class ConneryService {
/**
* Creates a ConneryService instance.
* @param params A ConneryServiceParams object.
* If not provided, the values are retrieved from the CONNERY_RUNNER_URL
* and CONNERY_RUNNER_API_KEY environment variables.
* @returns A ConneryService instance.
*/
constructor(params) {
Object.defineProperty(this, "runnerUrl", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "apiKey", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "asyncCaller", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
const runnerUrl = params?.runnerUrl ?? (0, env_1.getEnvironmentVariable)("CONNERY_RUNNER_URL");
const apiKey = params?.apiKey ?? (0, env_1.getEnvironmentVariable)("CONNERY_RUNNER_API_KEY");
if (!runnerUrl || !apiKey) {
throw new Error("CONNERY_RUNNER_URL and CONNERY_RUNNER_API_KEY environment variables must be set.");
}
this.runnerUrl = runnerUrl;
this.apiKey = apiKey;
this.asyncCaller = new async_caller_1.AsyncCaller(params ?? {});
}
/**
* Returns the list of Connery Actions wrapped as a LangChain StructuredTool objects.
* @returns A promise that resolves to an array of ConneryAction objects.
*/
async listActions() {
const actions = await this._listActions();
return actions.map((action) => new ConneryAction(action, this));
}
/**
* Returns the specified Connery action wrapped as a LangChain StructuredTool object.
* @param actionId The ID of the action to return.
* @returns A promise that resolves to a ConneryAction object.
*/
async getAction(actionId) {
const action = await this._getAction(actionId);
return new ConneryAction(action, this);
}
/**
* Runs the specified Connery action with the provided input.
* @param actionId The ID of the action to run.
* @param input The input object expected by the action.
* @returns A promise that resolves to a JSON string containing the output of the action.
*/
async runAction(actionId, input = {}) {
const result = await this._runAction(actionId, input);
return JSON.stringify(result);
}
/**
* Returns the list of actions available in the Connery runner.
* @returns A promise that resolves to an array of Action objects.
*/
async _listActions() {
const response = await this.asyncCaller.call(fetch, `${this.runnerUrl}/v1/actions`, {
method: "GET",
headers: this._getHeaders(),
});
await this._handleError(response, "Failed to list actions");
const apiResponse = await response.json();
return apiResponse.data;
}
/**
* Returns the specified action available in the Connery runner.
* @param actionId The ID of the action to return.
* @returns A promise that resolves to an Action object.
* @throws An error if the action with the specified ID is not found.
*/
async _getAction(actionId) {
const actions = await this._listActions();
const action = actions.find((a) => a.id === actionId);
if (!action) {
throw new Error(`The action with ID "${actionId}" was not found in the list of available actions in the Connery runner.`);
}
return action;
}
/**
* Runs the specified Connery action with the provided input.
* @param actionId The ID of the action to run.
* @param input The input object expected by the action.
* @returns A promise that resolves to a RunActionResult object.
*/
async _runAction(actionId, input = {}) {
const response = await this.asyncCaller.call(fetch, `${this.runnerUrl}/v1/actions/${actionId}/run`, {
method: "POST",
headers: this._getHeaders(),
body: JSON.stringify({
input,
}),
});
await this._handleError(response, "Failed to run action");
const apiResponse = await response.json();
return apiResponse.data.output;
}
/**
* Returns a standard set of HTTP headers to be used in API calls to the Connery runner.
* @returns An object containing the standard set of HTTP headers.
*/
_getHeaders() {
return {
"Content-Type": "application/json",
"x-api-key": this.apiKey,
};
}
/**
* Shared error handler for API calls to the Connery runner.
* If the response is not ok, an error is thrown containing the error message returned by the Connery runner.
* Otherwise, the promise resolves to void.
* @param response The response object returned by the Connery runner.
* @param errorMessage The error message to be used in the error thrown if the response is not ok.
* @returns A promise that resolves to void.
* @throws An error containing the error message returned by the Connery runner.
*/
async _handleError(response, errorMessage) {
if (response.ok)
return;
const apiErrorResponse = await response.json();
throw new Error(`${errorMessage}. Status code: ${response.status}. Error message: ${apiErrorResponse.error.message}`);
}
}
exports.ConneryService = ConneryService;