@forestadmin/ai-proxy 1.0.1 → 1.2.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/index.js CHANGED
@@ -18,13 +18,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
20
  exports.validMcpConfigurationOrThrow = validMcpConfigurationOrThrow;
21
- const mcp_config_checker_1 = __importDefault(require("./mcp-config-checker"));
21
+ const mcp_config_checker_1 = __importDefault(require("./types/mcp-config-checker"));
22
22
  __exportStar(require("./provider-dispatcher"), exports);
23
23
  __exportStar(require("./remote-tools"), exports);
24
24
  __exportStar(require("./router"), exports);
25
25
  __exportStar(require("./mcp-client"), exports);
26
- __exportStar(require("./errors"), exports);
26
+ __exportStar(require("./types/errors"), exports);
27
27
  function validMcpConfigurationOrThrow(mcpConfig) {
28
28
  return mcp_config_checker_1.default.check(mcpConfig);
29
29
  }
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVdBLG9FQUVDO0FBWEQsOEVBQW9EO0FBRXBELHdEQUFzQztBQUN0QyxpREFBK0I7QUFDL0IsMkNBQXlCO0FBQ3pCLCtDQUE2QjtBQUU3QiwyQ0FBeUI7QUFFekIsU0FBZ0IsNEJBQTRCLENBQUMsU0FBMkI7SUFDdEUsT0FBTyw0QkFBZ0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDM0MsQ0FBQyJ9
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVdBLG9FQUVDO0FBWEQsb0ZBQTBEO0FBRTFELHdEQUFzQztBQUN0QyxpREFBK0I7QUFDL0IsMkNBQXlCO0FBQ3pCLCtDQUE2QjtBQUU3QixpREFBK0I7QUFFL0IsU0FBZ0IsNEJBQTRCLENBQUMsU0FBMkI7SUFDdEUsT0FBTyw0QkFBZ0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDM0MsQ0FBQyJ9
@@ -1,15 +1,15 @@
1
1
  import type { Logger } from '@forestadmin/datasource-toolkit';
2
2
  import { MultiServerMCPClient } from '@langchain/mcp-adapters';
3
- import RemoteTool from './remote-tool';
3
+ import McpServerRemoteTool from './types/mcp-server-remote-tool';
4
4
  export type McpConfiguration = {
5
5
  configs: MultiServerMCPClient['config']['mcpServers'];
6
6
  } & Omit<MultiServerMCPClient['config'], 'mcpServers'>;
7
7
  export default class McpClient {
8
8
  private readonly mcpClients;
9
9
  private readonly logger?;
10
- readonly tools: RemoteTool[];
10
+ readonly tools: McpServerRemoteTool[];
11
11
  constructor(config: McpConfiguration, logger?: Logger);
12
- loadTools(): Promise<RemoteTool[]>;
12
+ loadTools(): Promise<McpServerRemoteTool[]>;
13
13
  testConnections(): Promise<true>;
14
14
  closeConnections(): Promise<void>;
15
15
  }
@@ -4,8 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const mcp_adapters_1 = require("@langchain/mcp-adapters");
7
- const errors_1 = require("./errors");
8
- const remote_tool_1 = __importDefault(require("./remote-tool"));
7
+ const errors_1 = require("./types/errors");
8
+ const mcp_server_remote_tool_1 = __importDefault(require("./types/mcp-server-remote-tool"));
9
9
  class McpClient {
10
10
  constructor(config, logger) {
11
11
  this.mcpClients = {};
@@ -25,11 +25,7 @@ class McpClient {
25
25
  await Promise.all(Object.entries(this.mcpClients).map(async ([name, client]) => {
26
26
  try {
27
27
  const tools = (await client.getTools()) ?? [];
28
- const extendedTools = tools.map(tool => new remote_tool_1.default({
29
- tool,
30
- sourceId: name,
31
- sourceType: 'mcp-server',
32
- }));
28
+ const extendedTools = tools.map(tool => new mcp_server_remote_tool_1.default({ tool, sourceId: name }));
33
29
  this.tools.push(...extendedTools);
34
30
  }
35
31
  catch (error) {
@@ -80,4 +76,4 @@ class McpClient {
80
76
  }
81
77
  }
82
78
  exports.default = McpClient;
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNwLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tY3AtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsMERBQStEO0FBRS9ELHFDQUE4QztBQUM5QyxnRUFBdUM7QUFNdkMsTUFBcUIsU0FBUztJQU01QixZQUFZLE1BQXdCLEVBQUUsTUFBZTtRQUxwQyxlQUFVLEdBQXlDLEVBQUUsQ0FBQztRQUc5RCxVQUFLLEdBQWlCLEVBQUUsQ0FBQztRQUdoQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQiw2REFBNkQ7UUFDN0Qsc0RBQXNEO1FBQ3RELE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUU7WUFDOUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLG1DQUFvQixDQUFDO2dCQUMvQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLFlBQVksRUFBRTtnQkFDcEMsR0FBRyxNQUFNO2FBQ1YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVM7UUFDYixNQUFNLE1BQU0sR0FBNEMsRUFBRSxDQUFDO1FBRTNELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7WUFDM0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzlDLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQzdCLElB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
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNwLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tY3AtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsMERBQStEO0FBRS9ELDJDQUFvRDtBQUNwRCw0RkFBaUU7QUFNakUsTUFBcUIsU0FBUztJQU01QixZQUFZLE1BQXdCLEVBQUUsTUFBZTtRQUxwQyxlQUFVLEdBQXlDLEVBQUUsQ0FBQztRQUc5RCxVQUFLLEdBQTBCLEVBQUUsQ0FBQztRQUd6QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQiw2REFBNkQ7UUFDN0Qsc0RBQXNEO1FBQ3RELE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUU7WUFDOUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLG1DQUFvQixDQUFDO2dCQUMvQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLFlBQVksRUFBRTtnQkFDcEMsR0FBRyxNQUFNO2FBQ1YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFNBQVM7UUFDYixNQUFNLE1BQU0sR0FBNEMsRUFBRSxDQUFDO1FBRTNELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7WUFDM0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzlDLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQzdCLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxnQ0FBbUIsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FDMUQsQ0FBQztnQkFDRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsMkJBQTJCLElBQUksRUFBRSxFQUFFLEtBQWMsQ0FBQyxDQUFDO2dCQUMxRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBYyxFQUFFLENBQUMsQ0FBQztZQUN2RCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLHNEQUFzRDtRQUN0RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25GLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FDWCxPQUFPLEVBQ1AsNkJBQTZCLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxHQUFHO2dCQUNsRixrQkFBa0IsWUFBWSxFQUFFLENBQ25DLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZTtRQUNuQixJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FDN0UsQ0FBQztZQUVGLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksMkJBQWtCLENBQUUsS0FBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pELENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2hDLENBQUM7WUFBQyxPQUFPLFlBQVksRUFBRSxDQUFDO2dCQUN0Qiw0RUFBNEU7Z0JBQzVFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsc0NBQXNDLEVBQUUsWUFBcUIsQ0FBQyxDQUFDO1lBQ3hGLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0I7UUFDcEIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFdEYscUVBQXFFO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLE9BQU87YUFDckIsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUM3RCxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDO1FBRXhELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUNYLE9BQU8sRUFDUCxzQ0FBc0MsSUFBSSxFQUFFLEVBQzNDLE1BQWdDLENBQUMsTUFBTSxDQUN6QyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQ1gsT0FBTyxFQUNQLG1CQUFtQixRQUFRLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLG9CQUFvQjtnQkFDdEUsb0NBQW9DLENBQ3ZDLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBNUZELDRCQTRGQyJ9
@@ -1,19 +1,41 @@
1
1
  import type { RemoteTools } from './remote-tools';
2
- import type { ClientOptions } from 'openai';
3
- import type { ChatCompletionCreateParamsNonStreaming } from 'openai/resources/chat/completions';
4
- export type OpenAiConfiguration = ClientOptions & {
2
+ import type { ChatOpenAIFields, OpenAIChatModelId } from '@langchain/openai';
3
+ import type OpenAI from 'openai';
4
+ export declare function isModelSupportingTools(model: string): boolean;
5
+ /**
6
+ * Base configuration common to all AI providers.
7
+ */
8
+ export type BaseAiConfiguration = {
9
+ name: string;
10
+ provider: AiProvider;
11
+ model: string;
12
+ apiKey?: string;
13
+ };
14
+ /**
15
+ * OpenAI-specific configuration.
16
+ * Extends base with all ChatOpenAI options (temperature, maxTokens, configuration, etc.)
17
+ */
18
+ export type OpenAiConfiguration = BaseAiConfiguration & Omit<ChatOpenAIFields, 'model' | 'apiKey'> & {
5
19
  provider: 'openai';
6
- model: ChatCompletionCreateParamsNonStreaming['model'];
20
+ model: OpenAIChatModelId | (string & NonNullable<unknown>);
7
21
  };
22
+ export type AiProvider = 'openai';
8
23
  export type AiConfiguration = OpenAiConfiguration;
9
- export type AiProvider = AiConfiguration['provider'];
10
- export type OpenAIBody = Pick<ChatCompletionCreateParamsNonStreaming, 'tools' | 'messages' | 'tool_choice'>;
11
- export type DispatchBody = OpenAIBody;
24
+ export type ChatCompletionResponse = OpenAI.Chat.Completions.ChatCompletion;
25
+ export type ChatCompletionMessage = OpenAI.Chat.Completions.ChatCompletionMessageParam;
26
+ export type ChatCompletionTool = OpenAI.Chat.Completions.ChatCompletionTool;
27
+ export type ChatCompletionToolChoice = OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;
28
+ export type DispatchBody = {
29
+ messages: ChatCompletionMessage[];
30
+ tools?: ChatCompletionTool[];
31
+ tool_choice?: ChatCompletionToolChoice;
32
+ parallel_tool_calls?: boolean;
33
+ };
12
34
  export declare class ProviderDispatcher {
13
- private readonly aiClient;
35
+ private readonly chatModel;
14
36
  private readonly remoteTools;
15
37
  constructor(configuration: AiConfiguration | null, remoteTools: RemoteTools);
16
- dispatch(body: DispatchBody): Promise<unknown>;
17
- private enhanceOpenAIRemoteTools;
38
+ dispatch(body: DispatchBody): Promise<ChatCompletionResponse>;
39
+ private enrichToolDefinitions;
18
40
  }
19
41
  //# sourceMappingURL=provider-dispatcher.d.ts.map
@@ -1,56 +1,96 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.ProviderDispatcher = void 0;
4
+ exports.isModelSupportingTools = isModelSupportingTools;
7
5
  const function_calling_1 = require("@langchain/core/utils/function_calling");
8
- const openai_1 = __importDefault(require("openai"));
9
- const errors_1 = require("./errors");
6
+ const openai_1 = require("@langchain/openai");
7
+ const errors_1 = require("./types/errors");
8
+ /**
9
+ * OpenAI model prefixes that do NOT support function calling (tools).
10
+ * Unknown models are allowed.
11
+ * @see https://platform.openai.com/docs/guides/function-calling
12
+ */
13
+ const OPENAI_MODELS_WITHOUT_TOOLS_SUPPORT = [
14
+ 'gpt-4',
15
+ 'gpt-3.5-turbo',
16
+ 'gpt-3.5',
17
+ 'text-davinci',
18
+ 'davinci',
19
+ 'curie',
20
+ 'babbage',
21
+ 'ada',
22
+ ];
23
+ /**
24
+ * Exceptions to the unsupported list - these models DO support tools
25
+ * even though they start with an unsupported prefix.
26
+ */
27
+ const OPENAI_MODELS_EXCEPTIONS = ['gpt-4-turbo', 'gpt-4o', 'gpt-4.1'];
28
+ function isModelSupportingTools(model) {
29
+ const isException = OPENAI_MODELS_EXCEPTIONS.some(exception => model === exception || model.startsWith(`${exception}-`));
30
+ if (isException)
31
+ return true;
32
+ const isKnownUnsupported = OPENAI_MODELS_WITHOUT_TOOLS_SUPPORT.some(unsupported => model === unsupported || model.startsWith(`${unsupported}-`));
33
+ return !isKnownUnsupported;
34
+ }
10
35
  class ProviderDispatcher {
11
36
  constructor(configuration, remoteTools) {
12
- this.aiClient = null;
37
+ this.chatModel = null;
13
38
  this.remoteTools = remoteTools;
14
- if (configuration?.provider === 'openai' && configuration.apiKey) {
15
- const { provider, model, ...clientOptions } = configuration;
16
- this.aiClient = {
17
- client: new openai_1.default(clientOptions),
18
- model,
19
- };
39
+ if (configuration?.provider === 'openai') {
40
+ const { provider, name, ...chatOpenAIOptions } = configuration;
41
+ this.chatModel = new openai_1.ChatOpenAI({
42
+ ...chatOpenAIOptions,
43
+ __includeRawResponse: true,
44
+ });
20
45
  }
21
46
  }
22
47
  async dispatch(body) {
23
- if (!this.aiClient) {
48
+ if (!this.chatModel) {
24
49
  throw new errors_1.AINotConfiguredError();
25
50
  }
26
- // tools, messages and tool_choice must be extracted from the body and passed as options
27
- // because we don't want to let users to pass any other option
28
- const { tools, messages, tool_choice: toolChoice } = body;
29
- const options = {
30
- model: this.aiClient.model,
31
- // Add the remote tools to the tools to be used by the AI
32
- tools: this.enhanceOpenAIRemoteTools(tools),
33
- messages,
34
- tool_choice: toolChoice,
35
- };
51
+ const { tools, messages, tool_choice: toolChoice, parallel_tool_calls: parallelToolCalls, } = body;
52
+ const enrichedTools = this.enrichToolDefinitions(tools);
53
+ const model = enrichedTools?.length
54
+ ? this.chatModel.bindTools(enrichedTools, {
55
+ tool_choice: toolChoice,
56
+ parallel_tool_calls: parallelToolCalls,
57
+ })
58
+ : this.chatModel;
36
59
  try {
37
- return await this.aiClient.client.chat.completions.create(options);
60
+ const response = await model.invoke(messages);
61
+ // eslint-disable-next-line no-underscore-dangle
62
+ const rawResponse = response.additional_kwargs.__raw_response;
63
+ if (!rawResponse) {
64
+ throw new errors_1.OpenAIUnprocessableError('OpenAI response missing raw response data. This may indicate an API change.');
65
+ }
66
+ return rawResponse;
38
67
  }
39
68
  catch (error) {
40
- throw new errors_1.OpenAIUnprocessableError(`Error while calling OpenAI: ${error.message}`);
69
+ if (error instanceof errors_1.OpenAIUnprocessableError)
70
+ throw error;
71
+ const err = error;
72
+ if (err.status === 429) {
73
+ throw new errors_1.OpenAIUnprocessableError(`Rate limit exceeded: ${err.message}`);
74
+ }
75
+ if (err.status === 401) {
76
+ throw new errors_1.OpenAIUnprocessableError(`Authentication failed: ${err.message}`);
77
+ }
78
+ throw new errors_1.OpenAIUnprocessableError(`Error while calling OpenAI: ${err.message}`);
41
79
  }
42
80
  }
43
- enhanceOpenAIRemoteTools(tools) {
81
+ enrichToolDefinitions(tools) {
44
82
  if (!tools || !Array.isArray(tools))
45
83
  return tools;
46
- const remoteToolFunctions = this.remoteTools.tools.map(extendedTools => (0, function_calling_1.convertToOpenAIFunction)(extendedTools.base));
84
+ const remoteToolSchemas = this.remoteTools.tools.map(remoteTool => (0, function_calling_1.convertToOpenAIFunction)(remoteTool.base));
47
85
  return tools.map(tool => {
48
- const remoteFunction = remoteToolFunctions.find(functionDefinition => functionDefinition.name === tool.function.name);
49
- if (remoteFunction)
50
- return { ...tool, function: remoteFunction };
86
+ if (tool.type !== 'function')
87
+ return tool;
88
+ const remoteSchema = remoteToolSchemas.find(schema => schema.name === tool.function.name);
89
+ if (remoteSchema)
90
+ return { ...tool, function: remoteSchema };
51
91
  return tool;
52
92
  });
53
93
  }
54
94
  }
55
95
  exports.ProviderDispatcher = ProviderDispatcher;
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItZGlzcGF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm92aWRlci1kaXNwYXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUlBLDZFQUFpRjtBQUNqRixvREFBNEI7QUFFNUIscUNBQTBFO0FBb0IxRSxNQUFhLGtCQUFrQjtJQUs3QixZQUFZLGFBQXFDLEVBQUUsV0FBd0I7UUFKMUQsYUFBUSxHQUF3QixJQUFJLENBQUM7UUFLcEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFFL0IsSUFBSSxhQUFhLEVBQUUsUUFBUSxLQUFLLFFBQVEsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxhQUFhLEVBQUUsR0FBRyxhQUFhLENBQUM7WUFDNUQsSUFBSSxDQUFDLFFBQVEsR0FBRztnQkFDZCxNQUFNLEVBQUUsSUFBSSxnQkFBTSxDQUFDLGFBQWEsQ0FBQztnQkFDakMsS0FBSzthQUNOLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBa0I7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixNQUFNLElBQUksNkJBQW9CLEVBQUUsQ0FBQztRQUNuQyxDQUFDO1FBRUQsd0ZBQXdGO1FBQ3hGLDhEQUE4RDtRQUM5RCxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBRTFELE1BQU0sT0FBTyxHQUFHO1lBQ2QsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSztZQUMxQix5REFBeUQ7WUFDekQsS0FBSyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUM7WUFDM0MsUUFBUTtZQUNSLFdBQVcsRUFBRSxVQUFVO1NBQ2tCLENBQUM7UUFFNUMsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLGlDQUF3QixDQUFDLCtCQUFnQyxLQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNoRyxDQUFDO0lBQ0gsQ0FBQztJQUVPLHdCQUF3QixDQUFDLEtBQXVEO1FBQ3RGLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRWxELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQ3JFLElBQUEsMENBQXVCLEVBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUM1QyxDQUFDO1FBRUYsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RCLE1BQU0sY0FBYyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FDN0Msa0JBQWtCLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FDckUsQ0FBQztZQUNGLElBQUksY0FBYztnQkFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxDQUFDO1lBRWpFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF6REQsZ0RBeURDIn0=
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItZGlzcGF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm92aWRlci1kaXNwYXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWdDQSx3REFXQztBQXRDRCw2RUFBaUY7QUFDakYsOENBQStDO0FBRS9DLDJDQUFnRjtBQUVoRjs7OztHQUlHO0FBQ0gsTUFBTSxtQ0FBbUMsR0FBRztJQUMxQyxPQUFPO0lBQ1AsZUFBZTtJQUNmLFNBQVM7SUFDVCxjQUFjO0lBQ2QsU0FBUztJQUNULE9BQU87SUFDUCxTQUFTO0lBQ1QsS0FBSztDQUNOLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLHdCQUF3QixHQUFHLENBQUMsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUV0RSxTQUFnQixzQkFBc0IsQ0FBQyxLQUFhO0lBQ2xELE1BQU0sV0FBVyxHQUFHLHdCQUF3QixDQUFDLElBQUksQ0FDL0MsU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUN0RSxDQUFDO0lBQ0YsSUFBSSxXQUFXO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFN0IsTUFBTSxrQkFBa0IsR0FBRyxtQ0FBbUMsQ0FBQyxJQUFJLENBQ2pFLFdBQVcsQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLFdBQVcsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FDNUUsQ0FBQztJQUVGLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztBQUM3QixDQUFDO0FBdUNELE1BQWEsa0JBQWtCO0lBSzdCLFlBQVksYUFBcUMsRUFBRSxXQUF3QjtRQUoxRCxjQUFTLEdBQXNCLElBQUksQ0FBQztRQUtuRCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUUvQixJQUFJLGFBQWEsRUFBRSxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDekMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxpQkFBaUIsRUFBRSxHQUFHLGFBQWEsQ0FBQztZQUMvRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksbUJBQVUsQ0FBQztnQkFDOUIsR0FBRyxpQkFBaUI7Z0JBQ3BCLG9CQUFvQixFQUFFLElBQUk7YUFDM0IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUSxDQUFDLElBQWtCO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLDZCQUFvQixFQUFFLENBQUM7UUFDbkMsQ0FBQztRQUVELE1BQU0sRUFDSixLQUFLLEVBQ0wsUUFBUSxFQUNSLFdBQVcsRUFBRSxVQUFVLEVBQ3ZCLG1CQUFtQixFQUFFLGlCQUFpQixHQUN2QyxHQUFHLElBQUksQ0FBQztRQUVULE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RCxNQUFNLEtBQUssR0FBRyxhQUFhLEVBQUUsTUFBTTtZQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFO2dCQUN0QyxXQUFXLEVBQUUsVUFBVTtnQkFDdkIsbUJBQW1CLEVBQUUsaUJBQWlCO2FBQ3ZDLENBQUM7WUFDSixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUVuQixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBNkIsQ0FBQyxDQUFDO1lBRW5FLGdEQUFnRDtZQUNoRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsY0FBd0MsQ0FBQztZQUV4RixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSxpQ0FBd0IsQ0FDaEMsNkVBQTZFLENBQzlFLENBQUM7WUFDSixDQUFDO1lBRUQsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLEtBQUssWUFBWSxpQ0FBd0I7Z0JBQUUsTUFBTSxLQUFLLENBQUM7WUFFM0QsTUFBTSxHQUFHLEdBQUcsS0FBb0MsQ0FBQztZQUVqRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sSUFBSSxpQ0FBd0IsQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDNUUsQ0FBQztZQUVELElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxJQUFJLGlDQUF3QixDQUFDLDBCQUEwQixHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUM5RSxDQUFDO1lBRUQsTUFBTSxJQUFJLGlDQUF3QixDQUFDLCtCQUErQixHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNuRixDQUFDO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQixDQUFDLEtBQTRCO1FBQ3hELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRWxELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQ2hFLElBQUEsMENBQXVCLEVBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUN6QyxDQUFDO1FBRUYsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBRTFDLE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRixJQUFJLFlBQVk7Z0JBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsQ0FBQztZQUU3RCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBbkZELGdEQW1GQyJ9
@@ -1,6 +1,6 @@
1
+ import type RemoteTool from './types/remote-tool';
1
2
  import type { ResponseFormat } from '@langchain/core/tools';
2
3
  import type { ChatCompletionCreateParamsNonStreaming } from 'openai/resources/chat/completions';
3
- import RemoteTool from './remote-tool';
4
4
  export type Messages = ChatCompletionCreateParamsNonStreaming['messages'];
5
5
  export type RemoteToolsApiKeys = {
6
6
  ['AI_REMOTE_TOOL_BRAVE_SEARCH_API_KEY']: string;
@@ -15,7 +15,7 @@ export declare class RemoteTools {
15
15
  responseFormat: ResponseFormat;
16
16
  schema: import("@langchain/core/utils/json_schema").JSONSchema;
17
17
  sourceId: string;
18
- sourceType: import("./remote-tool").SourceType;
18
+ sourceType: string;
19
19
  }[];
20
20
  invokeTool(toolName: string, messages: ChatCompletionCreateParamsNonStreaming['messages']): Promise<unknown>;
21
21
  }
@@ -6,17 +6,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.RemoteTools = void 0;
7
7
  const brave_search_1 = require("@langchain/community/tools/brave_search");
8
8
  const json_schema_1 = require("@langchain/core/utils/json_schema");
9
- const errors_1 = require("./errors");
10
- const remote_tool_1 = __importDefault(require("./remote-tool"));
9
+ const errors_1 = require("./types/errors");
10
+ const server_remote_tool_1 = __importDefault(require("./types/server-remote-tool"));
11
11
  class RemoteTools {
12
12
  constructor(apiKeys, tools) {
13
13
  this.tools = [];
14
14
  this.apiKeys = apiKeys;
15
15
  this.tools.push(...(tools ?? []));
16
16
  if (this.apiKeys?.AI_REMOTE_TOOL_BRAVE_SEARCH_API_KEY) {
17
- this.tools.push(new remote_tool_1.default({
17
+ this.tools.push(new server_remote_tool_1.default({
18
18
  sourceId: 'brave_search',
19
- sourceType: 'server',
20
19
  tool: new brave_search_1.BraveSearch({ apiKey: this.apiKeys.AI_REMOTE_TOOL_BRAVE_SEARCH_API_KEY }),
21
20
  }));
22
21
  }
@@ -46,4 +45,4 @@ class RemoteTools {
46
45
  }
47
46
  }
48
47
  exports.RemoteTools = RemoteTools;
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLXRvb2xzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlbW90ZS10b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSwwRUFBc0U7QUFDdEUsbUVBQWlFO0FBRWpFLHFDQUF5RTtBQUN6RSxnRUFBdUM7QUFRdkMsTUFBYSxXQUFXO0lBSXRCLFlBQVksT0FBMkIsRUFBRSxLQUFvQjtRQUZwRCxVQUFLLEdBQWlCLEVBQUUsQ0FBQztRQUdoQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbEMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQ2IsSUFBSSxxQkFBVSxDQUFDO2dCQUNiLFFBQVEsRUFBRSxjQUFjO2dCQUN4QixVQUFVLEVBQUUsUUFBUTtnQkFDcEIsSUFBSSxFQUFFLElBQUksMEJBQVcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLG1DQUFtQyxFQUFFLENBQUM7YUFDcEYsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksMEJBQTBCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDbkMsT0FBTztnQkFDTCxJQUFJLEVBQUUsWUFBWSxDQUFDLGFBQWE7Z0JBQ2hDLFdBQVcsRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVc7Z0JBQzFDLGNBQWMsRUFBRSxTQUEyQjtnQkFDM0MsTUFBTSxFQUFFLElBQUEsMEJBQVksRUFBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDOUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxRQUFRO2dCQUMvQixVQUFVLEVBQUUsWUFBWSxDQUFDLFVBQVU7YUFDcEMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBZ0IsRUFBRSxRQUE0RDtRQUM3RixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEtBQUssUUFBUSxDQUFDLENBQUM7UUFFbEYsSUFBSSxDQUFDLFlBQVk7WUFBRSxNQUFNLElBQUksNEJBQW1CLENBQUMsUUFBUSxRQUFRLFlBQVksQ0FBQyxDQUFDO1FBRS9FLElBQUksQ0FBQztZQUNILE9BQU8sQ0FBQyxNQUFNLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFZLENBQUM7UUFDL0QsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksaUNBQXdCLENBQ2hDLDRCQUE0QixRQUFRLEtBQU0sS0FBZSxDQUFDLE9BQU8sRUFBRSxDQUNwRSxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQTdDRCxrQ0E2Q0MifQ==
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLXRvb2xzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JlbW90ZS10b29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFJQSwwRUFBc0U7QUFDdEUsbUVBQWlFO0FBRWpFLDJDQUErRTtBQUMvRSxvRkFBMEQ7QUFRMUQsTUFBYSxXQUFXO0lBSXRCLFlBQVksT0FBMkIsRUFBRSxLQUFvQjtRQUZwRCxVQUFLLEdBQWlCLEVBQUUsQ0FBQztRQUdoQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbEMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQ2IsSUFBSSw0QkFBZ0IsQ0FBQztnQkFDbkIsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLElBQUksRUFBRSxJQUFJLDBCQUFXLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQ0FBbUMsRUFBRSxDQUFDO2FBQ3BGLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLDBCQUEwQjtRQUM1QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ25DLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLFlBQVksQ0FBQyxhQUFhO2dCQUNoQyxXQUFXLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXO2dCQUMxQyxjQUFjLEVBQUUsU0FBMkI7Z0JBQzNDLE1BQU0sRUFBRSxJQUFBLDBCQUFZLEVBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQzlDLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUTtnQkFDL0IsVUFBVSxFQUFFLFlBQVksQ0FBQyxVQUFVO2FBQ3BDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQWdCLEVBQUUsUUFBNEQ7UUFDN0YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxLQUFLLFFBQVEsQ0FBQyxDQUFDO1FBRWxGLElBQUksQ0FBQyxZQUFZO1lBQUUsTUFBTSxJQUFJLDRCQUFtQixDQUFDLFFBQVEsUUFBUSxZQUFZLENBQUMsQ0FBQztRQUUvRSxJQUFJLENBQUM7WUFDSCxPQUFPLENBQUMsTUFBTSxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBWSxDQUFDO1FBQy9ELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLGlDQUF3QixDQUNoQyw0QkFBNEIsUUFBUSxLQUFNLEtBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FDcEUsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUE1Q0Qsa0NBNENDIn0=
package/dist/router.d.ts CHANGED
@@ -9,29 +9,26 @@ export type Body = DispatchBody | InvokeRemoteToolBody | undefined;
9
9
  export type Route = 'ai-query' | 'remote-tools' | 'invoke-remote-tool';
10
10
  export type Query = {
11
11
  'tool-name'?: string;
12
+ 'ai-name'?: string;
12
13
  };
13
14
  export type ApiKeys = RemoteToolsApiKeys;
14
15
  export declare class Router {
15
16
  private readonly localToolsApiKeys?;
16
- private readonly aiConfiguration;
17
+ private readonly aiConfigurations;
17
18
  private readonly logger?;
18
19
  constructor(params?: {
19
- aiConfiguration?: AiConfiguration;
20
+ aiConfigurations?: AiConfiguration[];
20
21
  localToolsApiKeys?: ApiKeys;
21
22
  logger?: Logger;
22
23
  });
24
+ private getAiConfiguration;
23
25
  /**
24
26
  * Route the request to the appropriate handler
25
27
  *
26
- * List of routes:
27
- * // dispatch the query to the AI
28
- * - /ai-query
29
- *
30
- * // invoke a remote tool by name
31
- * - /invoke-remote-tool?tool-name=:toolName
32
- *
33
- * // get the list of available remote tools
34
- * - /remote-tools
28
+ * Routes:
29
+ * - ai-query: Dispatch messages to the configured AI provider and return the response
30
+ * - invoke-remote-tool: Execute a remote tool by name with the provided inputs
31
+ * - remote-tools: Return the list of available remote tools definitions
35
32
  */
36
33
  route(args: {
37
34
  body?: Body;
package/dist/router.js CHANGED
@@ -9,22 +9,31 @@ const mcp_client_1 = __importDefault(require("./mcp-client"));
9
9
  const remote_tools_1 = require("./remote-tools");
10
10
  class Router {
11
11
  constructor(params) {
12
- this.aiConfiguration = params?.aiConfiguration ?? null;
12
+ this.aiConfigurations = params?.aiConfigurations ?? [];
13
13
  this.localToolsApiKeys = params?.localToolsApiKeys;
14
14
  this.logger = params?.logger;
15
15
  }
16
+ getAiConfiguration(aiName) {
17
+ if (this.aiConfigurations.length === 0)
18
+ return null;
19
+ if (aiName) {
20
+ const config = this.aiConfigurations.find(c => c.name === aiName);
21
+ if (!config) {
22
+ const fallback = this.aiConfigurations[0];
23
+ this.logger?.('Warn', `AI configuration '${aiName}' not found. Falling back to '${fallback.name}'.`);
24
+ return fallback;
25
+ }
26
+ return config;
27
+ }
28
+ return this.aiConfigurations[0];
29
+ }
16
30
  /**
17
31
  * Route the request to the appropriate handler
18
32
  *
19
- * List of routes:
20
- * // dispatch the query to the AI
21
- * - /ai-query
22
- *
23
- * // invoke a remote tool by name
24
- * - /invoke-remote-tool?tool-name=:toolName
25
- *
26
- * // get the list of available remote tools
27
- * - /remote-tools
33
+ * Routes:
34
+ * - ai-query: Dispatch messages to the configured AI provider and return the response
35
+ * - invoke-remote-tool: Execute a remote tool by name with the provided inputs
36
+ * - remote-tools: Return the list of available remote tools definitions
28
37
  */
29
38
  async route(args) {
30
39
  let mcpClient;
@@ -32,12 +41,21 @@ class Router {
32
41
  if (args.mcpConfigs) {
33
42
  mcpClient = new mcp_client_1.default(args.mcpConfigs, this.logger);
34
43
  }
35
- const remoteTools = new remote_tools_1.RemoteTools(this.localToolsApiKeys, await mcpClient?.loadTools());
44
+ const remoteTools = new remote_tools_1.RemoteTools(this.localToolsApiKeys ?? {}, await mcpClient?.loadTools());
36
45
  if (args.route === 'ai-query') {
37
- return await new index_1.ProviderDispatcher(this.aiConfiguration, remoteTools).dispatch(args.body);
46
+ const aiConfiguration = this.getAiConfiguration(args.query?.['ai-name']);
47
+ return await new index_1.ProviderDispatcher(aiConfiguration, remoteTools).dispatch(args.body);
38
48
  }
39
49
  if (args.route === 'invoke-remote-tool') {
40
- return await remoteTools.invokeTool(args.query['tool-name'], args.body.inputs);
50
+ const toolName = args.query?.['tool-name'];
51
+ if (!toolName) {
52
+ throw new index_1.AIBadRequestError('Missing required query parameter: tool-name');
53
+ }
54
+ const body = args.body;
55
+ if (!body?.inputs) {
56
+ throw new index_1.AIBadRequestError('Missing required body parameter: inputs');
57
+ }
58
+ return await remoteTools.invokeTool(toolName, body.inputs);
41
59
  }
42
60
  if (args.route === 'remote-tools') {
43
61
  return remoteTools.toolDefinitionsForFrontend;
@@ -55,11 +73,12 @@ class Router {
55
73
  await mcpClient.closeConnections();
56
74
  }
57
75
  catch (cleanupError) {
58
- this.logger?.('Error', 'Error during MCP connection cleanup', cleanupError);
76
+ const error = cleanupError instanceof Error ? cleanupError : new Error(String(cleanupError));
77
+ this.logger?.('Error', 'Error during MCP connection cleanup', error);
59
78
  }
60
79
  }
61
80
  }
62
81
  }
63
82
  }
64
83
  exports.Router = Router;
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFLQSxtQ0FBbUU7QUFDbkUsOERBQXFDO0FBQ3JDLGlEQUE2QztBQVU3QyxNQUFhLE1BQU07SUFLakIsWUFBWSxNQUlYO1FBQ0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLEVBQUUsZUFBZSxJQUFJLElBQUksQ0FBQztRQUN2RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxFQUFFLGlCQUFpQixDQUFDO1FBQ25ELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFpRjtRQUMzRixJQUFJLFNBQWdDLENBQUM7UUFFckMsSUFBSSxDQUFDO1lBQ0gsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3BCLFNBQVMsR0FBRyxJQUFJLG9CQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUQsQ0FBQztZQUVELE1BQU0sV0FBVyxHQUFHLElBQUksMEJBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxTQUFTLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUUxRixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sTUFBTSxJQUFJLDBCQUFrQixDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUM3RSxJQUFJLENBQUMsSUFBb0IsQ0FDMUIsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztnQkFDeEMsT0FBTyxNQUFNLFdBQVcsQ0FBQyxVQUFVLENBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQ3RCLElBQUksQ0FBQyxJQUE2QixDQUFDLE1BQU0sQ0FDM0MsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssY0FBYyxFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sV0FBVyxDQUFDLDBCQUEwQixDQUFDO1lBQ2hELENBQUM7WUFFRCxxRkFBcUY7WUFDckYsTUFBTSxJQUFJLDRCQUFvQixDQUM1Qix5QkFBeUIsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDdEMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2FBQ2xCLENBQUMsRUFBRSxDQUNMLENBQUM7UUFDSixDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLElBQUksQ0FBQztvQkFDSCxNQUFNLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNyQyxDQUFDO2dCQUFDLE9BQU8sWUFBWSxFQUFFLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUscUNBQXFDLEVBQUUsWUFBcUIsQ0FBQyxDQUFDO2dCQUN2RixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF6RUQsd0JBeUVDIn0=
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFLQSxtQ0FBc0Y7QUFDdEYsOERBQXFDO0FBQ3JDLGlEQUE2QztBQVc3QyxNQUFhLE1BQU07SUFLakIsWUFBWSxNQUlYO1FBQ0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sRUFBRSxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQztRQUNuRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDL0IsQ0FBQztJQUVPLGtCQUFrQixDQUFDLE1BQWU7UUFDeEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVwRCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUM7WUFFbEUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUNYLE1BQU0sRUFDTixxQkFBcUIsTUFBTSxpQ0FBaUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUM5RSxDQUFDO2dCQUVGLE9BQU8sUUFBUSxDQUFDO1lBQ2xCLENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsS0FBSyxDQUFDLElBQWlGO1FBQzNGLElBQUksU0FBZ0MsQ0FBQztRQUVyQyxJQUFJLENBQUM7WUFDSCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDcEIsU0FBUyxHQUFHLElBQUksb0JBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxRCxDQUFDO1lBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSwwQkFBVyxDQUNqQyxJQUFJLENBQUMsaUJBQWlCLElBQUksRUFBRSxFQUM1QixNQUFNLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FDN0IsQ0FBQztZQUVGLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUV6RSxPQUFPLE1BQU0sSUFBSSwwQkFBa0IsQ0FBQyxlQUFlLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUN4RSxJQUFJLENBQUMsSUFBb0IsQ0FDMUIsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztnQkFDeEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUUzQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2QsTUFBTSxJQUFJLHlCQUFpQixDQUFDLDZDQUE2QyxDQUFDLENBQUM7Z0JBQzdFLENBQUM7Z0JBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQXdDLENBQUM7Z0JBRTNELElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7b0JBQ2xCLE1BQU0sSUFBSSx5QkFBaUIsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO2dCQUN6RSxDQUFDO2dCQUVELE9BQU8sTUFBTSxXQUFXLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0QsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxjQUFjLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxXQUFXLENBQUMsMEJBQTBCLENBQUM7WUFDaEQsQ0FBQztZQUVELHFGQUFxRjtZQUNyRixNQUFNLElBQUksNEJBQW9CLENBQzVCLHlCQUF5QixJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUN0QyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7YUFDbEIsQ0FBQyxFQUFFLENBQ0wsQ0FBQztRQUNKLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxDQUFDO29CQUNILE1BQU0sU0FBUyxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3JDLENBQUM7Z0JBQUMsT0FBTyxZQUFZLEVBQUUsQ0FBQztvQkFDdEIsTUFBTSxLQUFLLEdBQ1QsWUFBWSxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztvQkFDakYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDdkUsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBMUdELHdCQTBHQyJ9
@@ -10,6 +10,13 @@
10
10
  * -------------------------------------
11
11
  */
12
12
  export declare class AIError extends Error {
13
+ readonly status: number;
14
+ constructor(message: string, status?: number);
15
+ }
16
+ export declare class AIBadRequestError extends AIError {
17
+ constructor(message: string);
18
+ }
19
+ export declare class AINotFoundError extends AIError {
13
20
  constructor(message: string);
14
21
  }
15
22
  export declare class AIUnprocessableError extends AIError {
@@ -24,7 +31,7 @@ export declare class OpenAIUnprocessableError extends AIUnprocessableError {
24
31
  export declare class AIToolUnprocessableError extends AIUnprocessableError {
25
32
  constructor(message: string);
26
33
  }
27
- export declare class AIToolNotFoundError extends AIError {
34
+ export declare class AIToolNotFoundError extends AINotFoundError {
28
35
  constructor(message: string);
29
36
  }
30
37
  export declare class McpError extends AIError {
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ /**
3
+ * -------------------------------------
4
+ * -------------------------------------
5
+ * -------------------------------------
6
+ * All custom errors must extend the AIError class.
7
+ * This inheritance is crucial for proper error translation
8
+ * and consistent handling throughout the system.
9
+ * -------------------------------------
10
+ * -------------------------------------
11
+ * -------------------------------------
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.McpConfigError = exports.McpConflictError = exports.McpConnectionError = exports.McpError = exports.AIToolNotFoundError = exports.AIToolUnprocessableError = exports.OpenAIUnprocessableError = exports.AINotConfiguredError = exports.AIUnprocessableError = exports.AINotFoundError = exports.AIBadRequestError = exports.AIError = void 0;
15
+ // eslint-disable-next-line max-classes-per-file
16
+ class AIError extends Error {
17
+ constructor(message, status = 422) {
18
+ if (status < 100 || status > 599) {
19
+ throw new RangeError(`Invalid HTTP status code: ${status}`);
20
+ }
21
+ super(message);
22
+ this.name = 'AIError';
23
+ this.status = status;
24
+ }
25
+ }
26
+ exports.AIError = AIError;
27
+ class AIBadRequestError extends AIError {
28
+ constructor(message) {
29
+ super(message, 400);
30
+ this.name = 'AIBadRequestError';
31
+ }
32
+ }
33
+ exports.AIBadRequestError = AIBadRequestError;
34
+ class AINotFoundError extends AIError {
35
+ constructor(message) {
36
+ super(message, 404);
37
+ this.name = 'AINotFoundError';
38
+ }
39
+ }
40
+ exports.AINotFoundError = AINotFoundError;
41
+ class AIUnprocessableError extends AIError {
42
+ constructor(message) {
43
+ super(message, 422);
44
+ this.name = 'AIUnprocessableError';
45
+ }
46
+ }
47
+ exports.AIUnprocessableError = AIUnprocessableError;
48
+ class AINotConfiguredError extends AIError {
49
+ constructor() {
50
+ super('AI is not configured. Please call addAI() on your agent.', 422);
51
+ this.name = 'AINotConfiguredError';
52
+ }
53
+ }
54
+ exports.AINotConfiguredError = AINotConfiguredError;
55
+ class OpenAIUnprocessableError extends AIUnprocessableError {
56
+ constructor(message) {
57
+ super(message);
58
+ this.name = 'OpenAIError';
59
+ }
60
+ }
61
+ exports.OpenAIUnprocessableError = OpenAIUnprocessableError;
62
+ class AIToolUnprocessableError extends AIUnprocessableError {
63
+ constructor(message) {
64
+ super(message);
65
+ this.name = 'AIToolError';
66
+ }
67
+ }
68
+ exports.AIToolUnprocessableError = AIToolUnprocessableError;
69
+ class AIToolNotFoundError extends AINotFoundError {
70
+ constructor(message) {
71
+ super(message);
72
+ this.name = 'AIToolNotFoundError';
73
+ }
74
+ }
75
+ exports.AIToolNotFoundError = AIToolNotFoundError;
76
+ class McpError extends AIError {
77
+ constructor(message) {
78
+ super(message);
79
+ this.name = 'McpError';
80
+ }
81
+ }
82
+ exports.McpError = McpError;
83
+ class McpConnectionError extends McpError {
84
+ constructor(message) {
85
+ super(message);
86
+ this.name = 'McpConnectionError';
87
+ }
88
+ }
89
+ exports.McpConnectionError = McpConnectionError;
90
+ class McpConflictError extends McpError {
91
+ constructor(entityName) {
92
+ super(`"${entityName}" already exists for your project`);
93
+ this.name = 'McpConflictError';
94
+ }
95
+ }
96
+ exports.McpConflictError = McpConflictError;
97
+ class McpConfigError extends McpError {
98
+ constructor(message) {
99
+ super(message);
100
+ this.name = 'McpConfigError';
101
+ }
102
+ }
103
+ exports.McpConfigError = McpConfigError;
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7R0FVRzs7O0FBRUgsZ0RBQWdEO0FBQ2hELE1BQWEsT0FBUSxTQUFRLEtBQUs7SUFHaEMsWUFBWSxPQUFlLEVBQUUsTUFBTSxHQUFHLEdBQUc7UUFDdkMsSUFBSSxNQUFNLEdBQUcsR0FBRyxJQUFJLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksVUFBVSxDQUFDLDZCQUE2QixNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0NBQ0Y7QUFaRCwwQkFZQztBQUVELE1BQWEsaUJBQWtCLFNBQVEsT0FBTztJQUM1QyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7Q0FDRjtBQUxELDhDQUtDO0FBRUQsTUFBYSxlQUFnQixTQUFRLE9BQU87SUFDMUMsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFMRCwwQ0FLQztBQUVELE1BQWEsb0JBQXFCLFNBQVEsT0FBTztJQUMvQyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLHNCQUFzQixDQUFDO0lBQ3JDLENBQUM7Q0FDRjtBQUxELG9EQUtDO0FBRUQsTUFBYSxvQkFBcUIsU0FBUSxPQUFPO0lBQy9DO1FBQ0UsS0FBSyxDQUFDLDBEQUEwRCxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxJQUFJLEdBQUcsc0JBQXNCLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBTEQsb0RBS0M7QUFFRCxNQUFhLHdCQUF5QixTQUFRLG9CQUFvQjtJQUNoRSxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBTEQsNERBS0M7QUFFRCxNQUFhLHdCQUF5QixTQUFRLG9CQUFvQjtJQUNoRSxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBTEQsNERBS0M7QUFFRCxNQUFhLG1CQUFvQixTQUFRLGVBQWU7SUFDdEQsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcscUJBQXFCLENBQUM7SUFDcEMsQ0FBQztDQUNGO0FBTEQsa0RBS0M7QUFFRCxNQUFhLFFBQVMsU0FBUSxPQUFPO0lBQ25DLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUFMRCw0QkFLQztBQUVELE1BQWEsa0JBQW1CLFNBQVEsUUFBUTtJQUM5QyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFMRCxnREFLQztBQUVELE1BQWEsZ0JBQWlCLFNBQVEsUUFBUTtJQUM1QyxZQUFZLFVBQWtCO1FBQzVCLEtBQUssQ0FBQyxJQUFJLFVBQVUsbUNBQW1DLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDO0lBQ2pDLENBQUM7Q0FDRjtBQUxELDRDQUtDO0FBRUQsTUFBYSxjQUFlLFNBQVEsUUFBUTtJQUMxQyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0NBQ0Y7QUFMRCx3Q0FLQyJ9
@@ -1,4 +1,4 @@
1
- import type { McpConfiguration } from './mcp-client';
1
+ import type { McpConfiguration } from '../mcp-client';
2
2
  export default class McpConfigChecker {
3
3
  static check(mcpConfig: McpConfiguration): Promise<true>;
4
4
  }
@@ -3,11 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const mcp_client_1 = __importDefault(require("./mcp-client"));
6
+ const mcp_client_1 = __importDefault(require("../mcp-client"));
7
7
  class McpConfigChecker {
8
8
  static check(mcpConfig) {
9
9
  return new mcp_client_1.default(mcpConfig).testConnections();
10
10
  }
11
11
  }
12
12
  exports.default = McpConfigChecker;
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNwLWNvbmZpZy1jaGVja2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21jcC1jb25maWctY2hlY2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLDhEQUFxQztBQUVyQyxNQUFxQixnQkFBZ0I7SUFDbkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUEyQjtRQUN0QyxPQUFPLElBQUksb0JBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0NBQ0Y7QUFKRCxtQ0FJQyJ9
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNwLWNvbmZpZy1jaGVja2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL21jcC1jb25maWctY2hlY2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLCtEQUFzQztBQUV0QyxNQUFxQixnQkFBZ0I7SUFDbkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUEyQjtRQUN0QyxPQUFPLElBQUksb0JBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0NBQ0Y7QUFKRCxtQ0FJQyJ9
@@ -0,0 +1,9 @@
1
+ import type { StructuredToolInterface } from '@langchain/core/tools';
2
+ import RemoteTool from './remote-tool';
3
+ export default class McpServerRemoteTool<ToolType = unknown> extends RemoteTool {
4
+ constructor(options: {
5
+ tool: StructuredToolInterface<ToolType>;
6
+ sourceId?: string;
7
+ });
8
+ }
9
+ //# sourceMappingURL=mcp-server-remote-tool.d.ts.map