@forestadmin/ai-proxy 1.3.1 → 1.4.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/errors.d.ts CHANGED
@@ -23,7 +23,7 @@ export declare class AIUnprocessableError extends AIError {
23
23
  constructor(message: string);
24
24
  }
25
25
  export declare class AINotConfiguredError extends AIError {
26
- constructor();
26
+ constructor(message?: string);
27
27
  }
28
28
  export declare class OpenAIUnprocessableError extends AIUnprocessableError {
29
29
  constructor(message: string);
package/dist/errors.js CHANGED
@@ -46,8 +46,8 @@ class AIUnprocessableError extends AIError {
46
46
  }
47
47
  exports.AIUnprocessableError = AIUnprocessableError;
48
48
  class AINotConfiguredError extends AIError {
49
- constructor() {
50
- super('AI is not configured. Please call addAI() on your agent.', 422);
49
+ constructor(message = 'AI is not configured') {
50
+ super(message, 422);
51
51
  this.name = 'AINotConfiguredError';
52
52
  }
53
53
  }
@@ -101,4 +101,4 @@ class McpConfigError extends McpError {
101
101
  }
102
102
  }
103
103
  exports.McpConfigError = McpConfigError;
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7R0FVRzs7O0FBRUgsZ0RBQWdEO0FBQ2hELE1BQWEsT0FBUSxTQUFRLEtBQUs7SUFHaEMsWUFBWSxPQUFlLEVBQUUsTUFBTSxHQUFHLEdBQUc7UUFDdkMsSUFBSSxNQUFNLEdBQUcsR0FBRyxJQUFJLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksVUFBVSxDQUFDLDZCQUE2QixNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0NBQ0Y7QUFaRCwwQkFZQztBQUVELE1BQWEsaUJBQWtCLFNBQVEsT0FBTztJQUM1QyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7Q0FDRjtBQUxELDhDQUtDO0FBRUQsTUFBYSxlQUFnQixTQUFRLE9BQU87SUFDMUMsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFMRCwwQ0FLQztBQUVELE1BQWEsb0JBQXFCLFNBQVEsT0FBTztJQUMvQyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLHNCQUFzQixDQUFDO0lBQ3JDLENBQUM7Q0FDRjtBQUxELG9EQUtDO0FBRUQsTUFBYSxvQkFBcUIsU0FBUSxPQUFPO0lBQy9DO1FBQ0UsS0FBSyxDQUFDLDBEQUEwRCxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxJQUFJLEdBQUcsc0JBQXNCLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBTEQsb0RBS0M7QUFFRCxNQUFhLHdCQUF5QixTQUFRLG9CQUFvQjtJQUNoRSxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBTEQsNERBS0M7QUFFRCxNQUFhLHdCQUF5QixTQUFRLG9CQUFvQjtJQUNoRSxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBTEQsNERBS0M7QUFFRCxNQUFhLG1CQUFvQixTQUFRLGVBQWU7SUFDdEQsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcscUJBQXFCLENBQUM7SUFDcEMsQ0FBQztDQUNGO0FBTEQsa0RBS0M7QUFFRCxNQUFhLFFBQVMsU0FBUSxPQUFPO0lBQ25DLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUFMRCw0QkFLQztBQUVELE1BQWEsa0JBQW1CLFNBQVEsUUFBUTtJQUM5QyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFMRCxnREFLQztBQUVELE1BQWEsZ0JBQWlCLFNBQVEsUUFBUTtJQUM1QyxZQUFZLFVBQWtCO1FBQzVCLEtBQUssQ0FBQyxJQUFJLFVBQVUsbUNBQW1DLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDO0lBQ2pDLENBQUM7Q0FDRjtBQUxELDRDQUtDO0FBRUQsTUFBYSxjQUFlLFNBQVEsUUFBUTtJQUMxQyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0NBQ0Y7QUFMRCx3Q0FLQyJ9
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7R0FVRzs7O0FBRUgsZ0RBQWdEO0FBQ2hELE1BQWEsT0FBUSxTQUFRLEtBQUs7SUFHaEMsWUFBWSxPQUFlLEVBQUUsTUFBTSxHQUFHLEdBQUc7UUFDdkMsSUFBSSxNQUFNLEdBQUcsR0FBRyxJQUFJLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksVUFBVSxDQUFDLDZCQUE2QixNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0NBQ0Y7QUFaRCwwQkFZQztBQUVELE1BQWEsaUJBQWtCLFNBQVEsT0FBTztJQUM1QyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7Q0FDRjtBQUxELDhDQUtDO0FBRUQsTUFBYSxlQUFnQixTQUFRLE9BQU87SUFDMUMsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFMRCwwQ0FLQztBQUVELE1BQWEsb0JBQXFCLFNBQVEsT0FBTztJQUMvQyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLHNCQUFzQixDQUFDO0lBQ3JDLENBQUM7Q0FDRjtBQUxELG9EQUtDO0FBRUQsTUFBYSxvQkFBcUIsU0FBUSxPQUFPO0lBQy9DLFlBQVksT0FBTyxHQUFHLHNCQUFzQjtRQUMxQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsc0JBQXNCLENBQUM7SUFDckMsQ0FBQztDQUNGO0FBTEQsb0RBS0M7QUFFRCxNQUFhLHdCQUF5QixTQUFRLG9CQUFvQjtJQUNoRSxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBTEQsNERBS0M7QUFFRCxNQUFhLHdCQUF5QixTQUFRLG9CQUFvQjtJQUNoRSxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBTEQsNERBS0M7QUFFRCxNQUFhLG1CQUFvQixTQUFRLGVBQWU7SUFDdEQsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcscUJBQXFCLENBQUM7SUFDcEMsQ0FBQztDQUNGO0FBTEQsa0RBS0M7QUFFRCxNQUFhLFFBQVMsU0FBUSxPQUFPO0lBQ25DLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUFMRCw0QkFLQztBQUVELE1BQWEsa0JBQW1CLFNBQVEsUUFBUTtJQUM5QyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFMRCxnREFLQztBQUVELE1BQWEsZ0JBQWlCLFNBQVEsUUFBUTtJQUM1QyxZQUFZLFVBQWtCO1FBQzVCLEtBQUssQ0FBQyxJQUFJLFVBQVUsbUNBQW1DLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDO0lBQ2pDLENBQUM7Q0FDRjtBQUxELDRDQUtDO0FBRUQsTUFBYSxjQUFlLFNBQVEsUUFBUTtJQUMxQyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0NBQ0Y7QUFMRCx3Q0FLQyJ9
@@ -1,36 +1,9 @@
1
+ import type { AiConfiguration, ChatCompletionResponse } from './provider';
1
2
  import type { RemoteTools } from './remote-tools';
2
- import type { ChatOpenAIFields, OpenAIChatModelId } from '@langchain/openai';
3
- import type OpenAI from 'openai';
3
+ import type { DispatchBody } from './schemas/route';
4
+ export type { AiConfiguration, AiProvider, BaseAiConfiguration, ChatCompletionMessage, ChatCompletionResponse, ChatCompletionTool, ChatCompletionToolChoice, OpenAiConfiguration, } from './provider';
5
+ export type { DispatchBody } from './schemas/route';
4
6
  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 = Omit<BaseAiConfiguration, 'model'> & Omit<ChatOpenAIFields, 'model' | 'apiKey'> & {
19
- provider: 'openai';
20
- model: OpenAIChatModelId | (string & NonNullable<unknown>);
21
- };
22
- export type AiProvider = 'openai';
23
- export type AiConfiguration = OpenAiConfiguration;
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
- };
34
7
  export declare class ProviderDispatcher {
35
8
  private readonly chatModel;
36
9
  private readonly remoteTools;
@@ -39,6 +39,7 @@ class ProviderDispatcher {
39
39
  if (configuration?.provider === 'openai') {
40
40
  const { provider, name, ...chatOpenAIOptions } = configuration;
41
41
  this.chatModel = new openai_1.ChatOpenAI({
42
+ maxRetries: 0, // No retries by default - this lib is a passthrough
42
43
  ...chatOpenAIOptions,
43
44
  __includeRawResponse: true,
44
45
  });
@@ -93,4 +94,4 @@ class ProviderDispatcher {
93
94
  }
94
95
  }
95
96
  exports.ProviderDispatcher = ProviderDispatcher;
96
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItZGlzcGF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm92aWRlci1kaXNwYXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWdDQSx3REFXQztBQXRDRCw2RUFBaUY7QUFDakYsOENBQStDO0FBRS9DLHFDQUEwRTtBQUUxRTs7OztHQUlHO0FBQ0gsTUFBTSxtQ0FBbUMsR0FBRztJQUMxQyxPQUFPO0lBQ1AsZUFBZTtJQUNmLFNBQVM7SUFDVCxjQUFjO0lBQ2QsU0FBUztJQUNULE9BQU87SUFDUCxTQUFTO0lBQ1QsS0FBSztDQUNOLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLHdCQUF3QixHQUFHLENBQUMsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUV0RSxTQUFnQixzQkFBc0IsQ0FBQyxLQUFhO0lBQ2xELE1BQU0sV0FBVyxHQUFHLHdCQUF3QixDQUFDLElBQUksQ0FDL0MsU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUN0RSxDQUFDO0lBQ0YsSUFBSSxXQUFXO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFN0IsTUFBTSxrQkFBa0IsR0FBRyxtQ0FBbUMsQ0FBQyxJQUFJLENBQ2pFLFdBQVcsQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLFdBQVcsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FDNUUsQ0FBQztJQUVGLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztBQUM3QixDQUFDO0FBdUNELE1BQWEsa0JBQWtCO0lBSzdCLFlBQVksYUFBcUMsRUFBRSxXQUF3QjtRQUoxRCxjQUFTLEdBQXNCLElBQUksQ0FBQztRQUtuRCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUUvQixJQUFJLGFBQWEsRUFBRSxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDekMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxpQkFBaUIsRUFBRSxHQUFHLGFBQWEsQ0FBQztZQUMvRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksbUJBQVUsQ0FBQztnQkFDOUIsR0FBRyxpQkFBaUI7Z0JBQ3BCLG9CQUFvQixFQUFFLElBQUk7YUFDM0IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUSxDQUFDLElBQWtCO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLDZCQUFvQixFQUFFLENBQUM7UUFDbkMsQ0FBQztRQUVELE1BQU0sRUFDSixLQUFLLEVBQ0wsUUFBUSxFQUNSLFdBQVcsRUFBRSxVQUFVLEVBQ3ZCLG1CQUFtQixFQUFFLGlCQUFpQixHQUN2QyxHQUFHLElBQUksQ0FBQztRQUVULE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RCxNQUFNLEtBQUssR0FBRyxhQUFhLEVBQUUsTUFBTTtZQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFO2dCQUN0QyxXQUFXLEVBQUUsVUFBVTtnQkFDdkIsbUJBQW1CLEVBQUUsaUJBQWlCO2FBQ3ZDLENBQUM7WUFDSixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUVuQixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBNkIsQ0FBQyxDQUFDO1lBRW5FLGdEQUFnRDtZQUNoRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsY0FBd0MsQ0FBQztZQUV4RixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSxpQ0FBd0IsQ0FDaEMsNkVBQTZFLENBQzlFLENBQUM7WUFDSixDQUFDO1lBRUQsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLEtBQUssWUFBWSxpQ0FBd0I7Z0JBQUUsTUFBTSxLQUFLLENBQUM7WUFFM0QsTUFBTSxHQUFHLEdBQUcsS0FBb0MsQ0FBQztZQUVqRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sSUFBSSxpQ0FBd0IsQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDNUUsQ0FBQztZQUVELElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxJQUFJLGlDQUF3QixDQUFDLDBCQUEwQixHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUM5RSxDQUFDO1lBRUQsTUFBTSxJQUFJLGlDQUF3QixDQUFDLCtCQUErQixHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNuRixDQUFDO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQixDQUFDLEtBQTRCO1FBQ3hELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRWxELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQ2hFLElBQUEsMENBQXVCLEVBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUN6QyxDQUFDO1FBRUYsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBRTFDLE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRixJQUFJLFlBQVk7Z0JBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsQ0FBQztZQUU3RCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBbkZELGdEQW1GQyJ9
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItZGlzcGF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm92aWRlci1kaXNwYXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTZDQSx3REFXQztBQW5ERCw2RUFBaUY7QUFDakYsOENBQStDO0FBRS9DLHFDQUEwRTtBQWUxRTs7OztHQUlHO0FBQ0gsTUFBTSxtQ0FBbUMsR0FBRztJQUMxQyxPQUFPO0lBQ1AsZUFBZTtJQUNmLFNBQVM7SUFDVCxjQUFjO0lBQ2QsU0FBUztJQUNULE9BQU87SUFDUCxTQUFTO0lBQ1QsS0FBSztDQUNOLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLHdCQUF3QixHQUFHLENBQUMsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUV0RSxTQUFnQixzQkFBc0IsQ0FBQyxLQUFhO0lBQ2xELE1BQU0sV0FBVyxHQUFHLHdCQUF3QixDQUFDLElBQUksQ0FDL0MsU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUN0RSxDQUFDO0lBQ0YsSUFBSSxXQUFXO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFN0IsTUFBTSxrQkFBa0IsR0FBRyxtQ0FBbUMsQ0FBQyxJQUFJLENBQ2pFLFdBQVcsQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLFdBQVcsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FDNUUsQ0FBQztJQUVGLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztBQUM3QixDQUFDO0FBRUQsTUFBYSxrQkFBa0I7SUFLN0IsWUFBWSxhQUFxQyxFQUFFLFdBQXdCO1FBSjFELGNBQVMsR0FBc0IsSUFBSSxDQUFDO1FBS25ELElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBRS9CLElBQUksYUFBYSxFQUFFLFFBQVEsS0FBSyxRQUFR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
@@ -0,0 +1,26 @@
1
+ import type { ChatOpenAIFields, OpenAIChatModelId } from '@langchain/openai';
2
+ import type OpenAI from 'openai';
3
+ export type ChatCompletionResponse = OpenAI.Chat.Completions.ChatCompletion;
4
+ export type ChatCompletionMessage = OpenAI.Chat.Completions.ChatCompletionMessageParam;
5
+ export type ChatCompletionTool = OpenAI.Chat.Completions.ChatCompletionTool;
6
+ export type ChatCompletionToolChoice = OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;
7
+ export type AiProvider = 'openai';
8
+ /**
9
+ * Base configuration common to all AI providers.
10
+ */
11
+ export type BaseAiConfiguration = {
12
+ name: string;
13
+ provider: AiProvider;
14
+ model: string;
15
+ apiKey?: string;
16
+ };
17
+ /**
18
+ * OpenAI-specific configuration.
19
+ * Extends base with all ChatOpenAI options (temperature, maxTokens, configuration, etc.)
20
+ */
21
+ export type OpenAiConfiguration = BaseAiConfiguration & Omit<ChatOpenAIFields, 'model' | 'apiKey'> & {
22
+ provider: 'openai';
23
+ model: OpenAIChatModelId | (string & NonNullable<unknown>);
24
+ };
25
+ export type AiConfiguration = OpenAiConfiguration;
26
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
package/dist/router.d.ts CHANGED
@@ -1,16 +1,10 @@
1
1
  import type { McpConfiguration } from './mcp-client';
2
- import type { AiConfiguration, DispatchBody } from './provider-dispatcher';
3
- import type { Messages, RemoteToolsApiKeys } from './remote-tools';
2
+ import type { AiConfiguration } from './provider';
3
+ import type { RemoteToolsApiKeys } from './remote-tools';
4
+ import type { RouteArgs } from './schemas/route';
4
5
  import type { Logger } from '@forestadmin/datasource-toolkit';
5
- export type InvokeRemoteToolBody = {
6
- inputs: Messages;
7
- };
8
- export type Body = DispatchBody | InvokeRemoteToolBody | undefined;
9
- export type Route = 'ai-query' | 'remote-tools' | 'invoke-remote-tool';
10
- export type Query = {
11
- 'tool-name'?: string;
12
- 'ai-name'?: string;
13
- };
6
+ export type { AiQueryArgs, Body, InvokeRemoteToolArgs, InvokeRemoteToolBody, Query, RemoteToolsArgs, RouteArgs, } from './schemas/route';
7
+ export type Route = RouteArgs['route'];
14
8
  export type ApiKeys = RemoteToolsApiKeys;
15
9
  export declare class Router {
16
10
  private readonly localToolsApiKeys?;
@@ -21,7 +15,6 @@ export declare class Router {
21
15
  localToolsApiKeys?: ApiKeys;
22
16
  logger?: Logger;
23
17
  });
24
- private getAiConfiguration;
25
18
  /**
26
19
  * Route the request to the appropriate handler
27
20
  *
@@ -30,11 +23,10 @@ export declare class Router {
30
23
  * - invoke-remote-tool: Execute a remote tool by name with the provided inputs
31
24
  * - remote-tools: Return the list of available remote tools definitions
32
25
  */
33
- route(args: {
34
- body?: Body;
35
- route: Route;
36
- query?: Query;
26
+ route(args: RouteArgs & {
37
27
  mcpConfigs?: McpConfiguration;
38
28
  }): Promise<unknown>;
29
+ private static formatZodError;
30
+ private getAiConfiguration;
39
31
  }
40
32
  //# sourceMappingURL=router.d.ts.map
package/dist/router.js CHANGED
@@ -7,26 +7,13 @@ exports.Router = void 0;
7
7
  const index_1 = require("./index");
8
8
  const mcp_client_1 = __importDefault(require("./mcp-client"));
9
9
  const remote_tools_1 = require("./remote-tools");
10
+ const route_1 = require("./schemas/route");
10
11
  class Router {
11
12
  constructor(params) {
12
13
  this.aiConfigurations = params?.aiConfigurations ?? [];
13
14
  this.localToolsApiKeys = params?.localToolsApiKeys;
14
15
  this.logger = params?.logger;
15
16
  }
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
- }
30
17
  /**
31
18
  * Route the request to the appropriate handler
32
19
  *
@@ -36,36 +23,38 @@ class Router {
36
23
  * - remote-tools: Return the list of available remote tools definitions
37
24
  */
38
25
  async route(args) {
26
+ // Validate input with Zod schema
27
+ const result = route_1.routeArgsSchema.safeParse(args);
28
+ if (!result.success) {
29
+ throw new index_1.AIBadRequestError(Router.formatZodError(result.error));
30
+ }
31
+ const validatedArgs = result.data;
39
32
  let mcpClient;
40
33
  try {
41
34
  if (args.mcpConfigs) {
42
35
  mcpClient = new mcp_client_1.default(args.mcpConfigs, this.logger);
43
36
  }
44
37
  const remoteTools = new remote_tools_1.RemoteTools(this.localToolsApiKeys ?? {}, await mcpClient?.loadTools());
45
- if (args.route === 'ai-query') {
46
- const aiConfiguration = this.getAiConfiguration(args.query?.['ai-name']);
47
- return await new index_1.ProviderDispatcher(aiConfiguration, remoteTools).dispatch(args.body);
48
- }
49
- if (args.route === 'invoke-remote-tool') {
50
- const toolName = args.query?.['tool-name'];
51
- if (!toolName) {
52
- throw new index_1.AIBadRequestError('Missing required query parameter: tool-name');
38
+ switch (validatedArgs.route) {
39
+ case 'ai-query': {
40
+ const aiConfiguration = this.getAiConfiguration(validatedArgs.query?.['ai-name']);
41
+ return await new index_1.ProviderDispatcher(aiConfiguration, remoteTools).dispatch(validatedArgs.body);
53
42
  }
54
- const body = args.body;
55
- if (!body?.inputs) {
56
- throw new index_1.AIBadRequestError('Missing required body parameter: inputs');
43
+ case 'invoke-remote-tool':
44
+ return await remoteTools.invokeTool(validatedArgs.query['tool-name'], validatedArgs.body.inputs);
45
+ case 'remote-tools':
46
+ return remoteTools.toolDefinitionsForFrontend;
47
+ /* istanbul ignore next */
48
+ default: {
49
+ // Exhaustive type check - this code never runs at runtime because Zod validation
50
+ // catches unknown routes earlier. However, it provides compile-time safety:
51
+ // if a new route is added to routeArgsSchema, TypeScript will error here with
52
+ // "Type 'NewRouteArgs' is not assignable to type 'never'", forcing the developer
53
+ // to add a corresponding case handler.
54
+ const exhaustiveCheck = validatedArgs;
55
+ return exhaustiveCheck;
57
56
  }
58
- return await remoteTools.invokeTool(toolName, body.inputs);
59
- }
60
- if (args.route === 'remote-tools') {
61
- return remoteTools.toolDefinitionsForFrontend;
62
57
  }
63
- // don't add mcpConfigs to the error message, as it may contain sensitive information
64
- throw new index_1.AIUnprocessableError(`No action to perform: ${JSON.stringify({
65
- body: args.body,
66
- route: args.route,
67
- query: args.query,
68
- })}`);
69
58
  }
70
59
  finally {
71
60
  if (mcpClient) {
@@ -79,6 +68,35 @@ class Router {
79
68
  }
80
69
  }
81
70
  }
71
+ static formatZodError(error) {
72
+ return error.issues
73
+ .map(issue => {
74
+ // Handle discriminatedUnion errors with helpful message
75
+ // Zod 4 uses 'invalid_union' code with a 'discriminator' property for these errors
76
+ if (issue.code === 'invalid_union' && issue.discriminator) {
77
+ const validRoutes = route_1.routeArgsSchema.options.map(opt => `'${opt.shape.route.value}'`);
78
+ return `Invalid route. Expected: ${validRoutes.join(', ')}`;
79
+ }
80
+ // Include path for context when available
81
+ const path = issue.path.length > 0 ? `${issue.path.join('.')}: ` : '';
82
+ return `${path}${issue.message}`;
83
+ })
84
+ .join('; ');
85
+ }
86
+ getAiConfiguration(aiName) {
87
+ if (this.aiConfigurations.length === 0)
88
+ return null;
89
+ if (aiName) {
90
+ const config = this.aiConfigurations.find(c => c.name === aiName);
91
+ if (!config) {
92
+ const fallback = this.aiConfigurations[0];
93
+ this.logger?.('Warn', `AI configuration '${aiName}' not found. Falling back to '${fallback.name}'.`);
94
+ return fallback;
95
+ }
96
+ return config;
97
+ }
98
+ return this.aiConfigurations[0];
99
+ }
82
100
  }
83
101
  exports.Router = Router;
84
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFLQSxtQ0FBc0Y7QUFDdEYsOERBQXFDO0FBQ3JDLGlEQUE2QztBQVc3QyxNQUFhLE1BQU07SUFLakIsWUFBWSxNQUlYO1FBQ0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sRUFBRSxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQztRQUNuRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDL0IsQ0FBQztJQUVPLGtCQUFrQixDQUFDLE1BQWU7UUFDeEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVwRCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUM7WUFFbEUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUNYLE1BQU0sRUFDTixxQkFBcUIsTUFBTSxpQ0FBaUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUM5RSxDQUFDO2dCQUVGLE9BQU8sUUFBUSxDQUFDO1lBQ2xCLENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMs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
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFPQSxtQ0FBZ0U7QUFDaEUsOERBQXFDO0FBQ3JDLGlEQUE2QztBQUM3QywyQ0FBa0Q7QUFnQmxELE1BQWEsTUFBTTtJQUtqQixZQUFZLE1BSVg7UUFDQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxFQUFFLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxFQUFFLGlCQUFpQixDQUFDO1FBQ25ELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBbUQ7UUFDN0QsaUNBQWlDO1FBQ2pDLE1BQU0sTUFBTSxHQUFHLHVCQUFlLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRS9DLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLHlCQUFpQixDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDbEMsSUFBSSxTQUFnQyxDQUFDO1FBRXJDLElBQUksQ0FBQztZQUNILElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNwQixTQUFTLEdBQUcsSUFBSSxvQkFBUyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFELENBQUM7WUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLDBCQUFXLENBQ2pDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLEVBQzVCLE1BQU0sU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUM3QixDQUFDO1lBRUYsUUFBUSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzVCLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQztvQkFDaEIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUVsRixPQUFPLE1BQU0sSUFBSSwwQkFBa0IsQ0FBQyxlQUFlLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUN4RSxhQUFhLENBQUMsSUFBSSxDQUNuQixDQUFDO2dCQUNKLENBQUM7Z0JBRUQsS0FBSyxvQkFBb0I7b0JBQ3ZCLE9BQU8sTUFBTSxXQUFXLENBQUMsVUFBVSxDQUNqQyxhQUFhLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUNoQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDMUIsQ0FBQztnQkFFSixLQUFLLGNBQWM7b0JBQ2pCLE9BQU8sV0FBVyxDQUFDLDBCQUEwQixDQUFDO2dCQUVoRCwwQkFBMEI7Z0JBQzFCLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ1IsaUZBQWlGO29CQUNqRiw0RUFBNEU7b0JBQzVFLDhFQUE4RTtvQkFDOUUsaUZBQWlGO29CQUNqRix1Q0FBdUM7b0JBQ3ZDLE1BQU0sZUFBZSxHQUFVLGFBQWEsQ0FBQztvQkFFN0MsT0FBTyxlQUFlLENBQUM7Z0JBQ3pCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxJQUFJLENBQUM7b0JBQ0gsTUFBTSxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDckMsQ0FBQztnQkFBQyxPQUFPLFlBQVksRUFBRSxDQUFDO29CQUN0QixNQUFNLEtBQUssR0FDVCxZQUFZLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO29CQUNqRixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN2RSxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUF1QjtRQUNuRCxPQUFPLEtBQUssQ0FBQyxNQUFNO2FBQ2hCLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNYLHdEQUF3RDtZQUN4RCxtRkFBbUY7WUFDbkYsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLGVBQWUsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzFELE1BQU0sV0FBVyxHQUFHLHVCQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFFckYsT0FBTyw0QkFBNEIsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzlELENBQUM7WUFFRCwwQ0FBMEM7WUFDMUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUV0RSxPQUFPLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQyxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVPLGtCQUFrQixDQUFDLE1BQWU7UUFDeEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVwRCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUM7WUFFbEUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUNYLE1BQU0sRUFDTixxQkFBcUIsTUFBTSxpQ0FBaUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUM5RSxDQUFDO2dCQUVGLE9BQU8sUUFBUSxDQUFDO1lBQ2xCLENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBL0hELHdCQStIQyJ9
@@ -0,0 +1,81 @@
1
+ import { z } from 'zod';
2
+ declare const baseQuerySchema: z.ZodObject<{
3
+ 'ai-name': z.ZodOptional<z.ZodString>;
4
+ 'tool-name': z.ZodOptional<z.ZodString>;
5
+ }, z.core.$strip>;
6
+ declare const aiQuerySchema: z.ZodObject<{
7
+ route: z.ZodLiteral<"ai-query">;
8
+ query: z.ZodOptional<z.ZodObject<{
9
+ 'ai-name': z.ZodOptional<z.ZodString>;
10
+ 'tool-name': z.ZodOptional<z.ZodString>;
11
+ }, z.core.$strip>>;
12
+ body: z.ZodObject<{
13
+ messages: z.ZodArray<z.ZodAny>;
14
+ tools: z.ZodOptional<z.ZodArray<z.ZodAny>>;
15
+ tool_choice: z.ZodOptional<z.ZodAny>;
16
+ parallel_tool_calls: z.ZodOptional<z.ZodBoolean>;
17
+ }, z.core.$strip>;
18
+ }, z.core.$strip>;
19
+ /**
20
+ * Route: invoke-remote-tool
21
+ *
22
+ * Note: inputs uses z.any() because it can be either:
23
+ * - An array of messages (for regular remote tools)
24
+ * - An object of arguments (for MCP tools)
25
+ * Validation happens downstream in the tool implementation.
26
+ */
27
+ declare const invokeRemoteToolSchema: z.ZodObject<{
28
+ route: z.ZodLiteral<"invoke-remote-tool">;
29
+ query: z.ZodObject<{
30
+ 'ai-name': z.ZodOptional<z.ZodString>;
31
+ 'tool-name': z.ZodString;
32
+ }, z.core.$strip>;
33
+ body: z.ZodObject<{
34
+ inputs: z.ZodAny;
35
+ }, z.core.$strip>;
36
+ }, z.core.$strip>;
37
+ declare const remoteToolsSchema: z.ZodObject<{
38
+ route: z.ZodLiteral<"remote-tools">;
39
+ query: z.ZodOptional<z.ZodObject<{
40
+ 'ai-name': z.ZodOptional<z.ZodString>;
41
+ 'tool-name': z.ZodOptional<z.ZodString>;
42
+ }, z.core.$strip>>;
43
+ }, z.core.$strip>;
44
+ export declare const routeArgsSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
45
+ route: z.ZodLiteral<"ai-query">;
46
+ query: z.ZodOptional<z.ZodObject<{
47
+ 'ai-name': z.ZodOptional<z.ZodString>;
48
+ 'tool-name': z.ZodOptional<z.ZodString>;
49
+ }, z.core.$strip>>;
50
+ body: z.ZodObject<{
51
+ messages: z.ZodArray<z.ZodAny>;
52
+ tools: z.ZodOptional<z.ZodArray<z.ZodAny>>;
53
+ tool_choice: z.ZodOptional<z.ZodAny>;
54
+ parallel_tool_calls: z.ZodOptional<z.ZodBoolean>;
55
+ }, z.core.$strip>;
56
+ }, z.core.$strip>, z.ZodObject<{
57
+ route: z.ZodLiteral<"invoke-remote-tool">;
58
+ query: z.ZodObject<{
59
+ 'ai-name': z.ZodOptional<z.ZodString>;
60
+ 'tool-name': z.ZodString;
61
+ }, z.core.$strip>;
62
+ body: z.ZodObject<{
63
+ inputs: z.ZodAny;
64
+ }, z.core.$strip>;
65
+ }, z.core.$strip>, z.ZodObject<{
66
+ route: z.ZodLiteral<"remote-tools">;
67
+ query: z.ZodOptional<z.ZodObject<{
68
+ 'ai-name': z.ZodOptional<z.ZodString>;
69
+ 'tool-name': z.ZodOptional<z.ZodString>;
70
+ }, z.core.$strip>>;
71
+ }, z.core.$strip>], "route">;
72
+ export type RouteArgs = z.infer<typeof routeArgsSchema>;
73
+ export type AiQueryArgs = z.infer<typeof aiQuerySchema>;
74
+ export type InvokeRemoteToolArgs = z.infer<typeof invokeRemoteToolSchema>;
75
+ export type RemoteToolsArgs = z.infer<typeof remoteToolsSchema>;
76
+ export type DispatchBody = AiQueryArgs['body'];
77
+ export type InvokeRemoteToolBody = InvokeRemoteToolArgs['body'];
78
+ export type Body = DispatchBody | InvokeRemoteToolBody | undefined;
79
+ export type Query = z.infer<typeof baseQuerySchema>;
80
+ export {};
81
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.routeArgsSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ // Base query schema with common optional parameters
6
+ const baseQuerySchema = zod_1.z.object({
7
+ 'ai-name': zod_1.z.string().optional(),
8
+ 'tool-name': zod_1.z.string().optional(),
9
+ });
10
+ /**
11
+ * Route: ai-query
12
+ *
13
+ * Note: messages, tools, and tool_choice use z.any() because OpenAI types are complex
14
+ * and frequently evolve. Runtime validation happens downstream in the OpenAI SDK.
15
+ * The type casts ensure TypeScript type safety while allowing flexibility.
16
+ */
17
+ const aiQueryBodySchema = zod_1.z.object({
18
+ messages: zod_1.z.array(zod_1.z.any(), {
19
+ message: 'Missing required body parameter: messages',
20
+ }),
21
+ tools: zod_1.z.array(zod_1.z.any()).optional(),
22
+ tool_choice: zod_1.z.any().optional(),
23
+ parallel_tool_calls: zod_1.z.boolean().optional(),
24
+ }, { message: 'Missing required parameter: body' });
25
+ const aiQuerySchema = zod_1.z.object({
26
+ route: zod_1.z.literal('ai-query'),
27
+ query: baseQuerySchema.optional(),
28
+ body: aiQueryBodySchema,
29
+ });
30
+ // Query schema for invoke-remote-tool (tool-name is required)
31
+ const invokeRemoteToolQuerySchema = zod_1.z.object({
32
+ 'ai-name': zod_1.z.string().optional(),
33
+ 'tool-name': zod_1.z.string({ message: 'Missing required query parameter: tool-name' }),
34
+ }, { message: 'Missing required parameter: query' });
35
+ /**
36
+ * Route: invoke-remote-tool
37
+ *
38
+ * Note: inputs uses z.any() because it can be either:
39
+ * - An array of messages (for regular remote tools)
40
+ * - An object of arguments (for MCP tools)
41
+ * Validation happens downstream in the tool implementation.
42
+ */
43
+ const invokeRemoteToolSchema = zod_1.z.object({
44
+ route: zod_1.z.literal('invoke-remote-tool'),
45
+ query: invokeRemoteToolQuerySchema,
46
+ body: zod_1.z.object({
47
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
+ inputs: zod_1.z.any().refine((val) => val !== undefined && val !== null, {
49
+ message: 'Missing required body parameter: inputs',
50
+ }),
51
+ }, { message: 'Missing required parameter: body' }),
52
+ });
53
+ // Route: remote-tools (no body required)
54
+ const remoteToolsSchema = zod_1.z.object({
55
+ route: zod_1.z.literal('remote-tools'),
56
+ query: baseQuerySchema.optional(),
57
+ });
58
+ // Discriminated union on 'route'
59
+ exports.routeArgsSchema = zod_1.z.discriminatedUnion('route', [
60
+ aiQuerySchema,
61
+ invokeRemoteToolSchema,
62
+ remoteToolsSchema,
63
+ ]);
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NoZW1hcy9yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBd0I7QUFFeEIsb0RBQW9EO0FBQ3BELE1BQU0sZUFBZSxHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDL0IsU0FBUyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDaEMsV0FBVyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDbkMsQ0FBQyxDQUFDO0FBRUg7Ozs7OztHQU1HO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUNoQztJQUNFLFFBQVEsRUFBRSxPQUFDLENBQUMsS0FBSyxDQUFDLE9BQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUN6QixPQUFPLEVBQUUsMkNBQTJDO0tBQ3JELENBQUM7SUFDRixLQUFLLEVBQUUsT0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDbEMsV0FBVyxFQUFFLE9BQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDL0IsbUJBQW1CLEVBQUUsT0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUM1QyxFQUNELEVBQUUsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLENBQ2hELENBQUM7QUFFRixNQUFNLGFBQWEsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQzdCLEtBQUssRUFBRSxPQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztJQUM1QixLQUFLLEVBQUUsZUFBZSxDQUFDLFFBQVEsRUFBRTtJQUNqQyxJQUFJLEVBQUUsaUJBQWlCO0NBQ3hCLENBQUMsQ0FBQztBQUVILDhEQUE4RDtBQUM5RCxNQUFNLDJCQUEyQixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQzFDO0lBQ0UsU0FBUyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDaEMsV0FBVyxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsNkNBQTZDLEVBQUUsQ0FBQztDQUNsRixFQUNELEVBQUUsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLENBQ2pELENBQUM7QUFFRjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3RDLEtBQUssRUFBRSxPQUFDLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDO0lBQ3RDLEtBQUssRUFBRSwyQkFBMkI7SUFDbEMsSUFBSSxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQ1o7UUFDRSw4REFBOEQ7UUFDOUQsTUFBTSxFQUFFLE9BQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtZQUN0RSxPQUFPLEVBQUUseUNBQXlDO1NBQ25ELENBQUM7S0FDSCxFQUNELEVBQUUsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLENBQ2hEO0NBQ0YsQ0FBQyxDQUFDO0FBRUgseUNBQXlDO0FBQ3pDLE1BQU0saUJBQWlCLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNqQyxLQUFLLEVBQUUsT0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7SUFDaEMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUU7Q0FDbEMsQ0FBQyxDQUFDO0FBRUgsaUNBQWlDO0FBQ3BCLFFBQUEsZUFBZSxHQUFHLE9BQUMsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUU7SUFDM0QsYUFBYTtJQUNiLHNCQUFzQjtJQUN0QixpQkFBaUI7Q0FDbEIsQ0FBQyxDQUFDIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forestadmin/ai-proxy",
3
- "version": "1.3.1",
3
+ "version": "1.4.0",
4
4
  "main": "dist/index.js",
5
5
  "license": "GPL-3.0",
6
6
  "publishConfig": {