222 lines
8.6 KiB
JavaScript
222 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;
|