@forestadmin/ai-proxy 1.5.2 → 1.6.1
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 +39 -12
- package/dist/errors.js +55 -20
- package/dist/provider-dispatcher.d.ts +0 -11
- package/dist/provider-dispatcher.js +23 -29
- package/package.json +4 -4
package/dist/errors.d.ts
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* All custom AI errors extend HTTP-status error
|
|
3
|
-
*
|
|
4
|
-
* to map them to their natural HTTP status codes automatically.
|
|
2
|
+
* All custom AI errors extend their matching HTTP-status error class from datasource-toolkit.
|
|
3
|
+
* This allows the agent's error middleware to map them to their natural HTTP status codes.
|
|
5
4
|
*/
|
|
6
|
-
import { BadRequestError, NotFoundError, UnprocessableError } from '@forestadmin/datasource-toolkit';
|
|
7
|
-
export declare class AIError extends UnprocessableError {
|
|
8
|
-
constructor(message: string);
|
|
9
|
-
}
|
|
5
|
+
import { BadRequestError, ForbiddenError, InternalServerError, NotFoundError, TooManyRequestsError, UnauthorizedError, UnprocessableError } from '@forestadmin/datasource-toolkit';
|
|
10
6
|
export declare class AIBadRequestError extends BadRequestError {
|
|
11
7
|
constructor(message: string);
|
|
12
8
|
}
|
|
@@ -16,22 +12,53 @@ export declare class AIModelNotSupportedError extends AIBadRequestError {
|
|
|
16
12
|
export declare class AINotFoundError extends NotFoundError {
|
|
17
13
|
constructor(message: string);
|
|
18
14
|
}
|
|
19
|
-
export declare class
|
|
15
|
+
export declare class AIProviderError extends UnprocessableError {
|
|
16
|
+
readonly provider: string;
|
|
17
|
+
readonly cause?: Error;
|
|
18
|
+
constructor(provider: string, options?: {
|
|
19
|
+
cause?: Error;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export declare class AIProviderUnavailableError extends InternalServerError {
|
|
23
|
+
readonly provider: string;
|
|
24
|
+
readonly providerStatusCode: number;
|
|
25
|
+
readonly cause?: Error;
|
|
26
|
+
constructor(provider: string, options: {
|
|
27
|
+
cause?: Error;
|
|
28
|
+
status: number;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
export declare class AITooManyRequestsError extends TooManyRequestsError {
|
|
32
|
+
readonly provider: string;
|
|
33
|
+
readonly cause?: Error;
|
|
34
|
+
constructor(provider: string, options?: {
|
|
35
|
+
cause?: Error;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
export declare class AIUnauthorizedError extends UnauthorizedError {
|
|
39
|
+
readonly provider: string;
|
|
40
|
+
readonly cause?: Error;
|
|
41
|
+
constructor(provider: string, options?: {
|
|
42
|
+
cause?: Error;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
export declare class AIForbiddenError extends ForbiddenError {
|
|
46
|
+
readonly provider: string;
|
|
20
47
|
readonly cause?: Error;
|
|
21
|
-
constructor(
|
|
48
|
+
constructor(provider: string, options?: {
|
|
22
49
|
cause?: Error;
|
|
23
50
|
});
|
|
24
51
|
}
|
|
25
|
-
export declare class AINotConfiguredError extends
|
|
52
|
+
export declare class AINotConfiguredError extends UnprocessableError {
|
|
26
53
|
constructor(message?: string);
|
|
27
54
|
}
|
|
28
|
-
export declare class AIToolUnprocessableError extends
|
|
55
|
+
export declare class AIToolUnprocessableError extends UnprocessableError {
|
|
29
56
|
constructor(message: string);
|
|
30
57
|
}
|
|
31
58
|
export declare class AIToolNotFoundError extends AINotFoundError {
|
|
32
59
|
constructor(message: string);
|
|
33
60
|
}
|
|
34
|
-
export declare class McpError extends
|
|
61
|
+
export declare class McpError extends UnprocessableError {
|
|
35
62
|
constructor(message: string);
|
|
36
63
|
}
|
|
37
64
|
export declare class McpConnectionError extends McpError {
|
package/dist/errors.js
CHANGED
|
@@ -1,20 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* All custom AI errors extend HTTP-status error
|
|
4
|
-
*
|
|
5
|
-
* to map them to their natural HTTP status codes automatically.
|
|
3
|
+
* All custom AI errors extend their matching HTTP-status error class from datasource-toolkit.
|
|
4
|
+
* This allows the agent's error middleware to map them to their natural HTTP status codes.
|
|
6
5
|
*/
|
|
7
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.McpConfigError = exports.McpConflictError = exports.McpConnectionError = exports.McpError = exports.AIToolNotFoundError = exports.AIToolUnprocessableError = exports.AINotConfiguredError = exports.
|
|
7
|
+
exports.McpConfigError = exports.McpConflictError = exports.McpConnectionError = exports.McpError = exports.AIToolNotFoundError = exports.AIToolUnprocessableError = exports.AINotConfiguredError = exports.AIForbiddenError = exports.AIUnauthorizedError = exports.AITooManyRequestsError = exports.AIProviderUnavailableError = exports.AIProviderError = exports.AINotFoundError = exports.AIModelNotSupportedError = exports.AIBadRequestError = void 0;
|
|
9
8
|
// eslint-disable-next-line max-classes-per-file
|
|
10
9
|
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
11
|
-
class AIError extends datasource_toolkit_1.UnprocessableError {
|
|
12
|
-
constructor(message) {
|
|
13
|
-
super(message);
|
|
14
|
-
this.name = 'AIError';
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
exports.AIError = AIError;
|
|
18
10
|
class AIBadRequestError extends datasource_toolkit_1.BadRequestError {
|
|
19
11
|
constructor(message) {
|
|
20
12
|
super(message);
|
|
@@ -36,23 +28,66 @@ class AINotFoundError extends datasource_toolkit_1.NotFoundError {
|
|
|
36
28
|
}
|
|
37
29
|
}
|
|
38
30
|
exports.AINotFoundError = AINotFoundError;
|
|
39
|
-
class
|
|
40
|
-
constructor(
|
|
41
|
-
super(message);
|
|
42
|
-
this.name = '
|
|
31
|
+
class AIProviderError extends datasource_toolkit_1.UnprocessableError {
|
|
32
|
+
constructor(provider, options) {
|
|
33
|
+
super(`Error while calling ${provider}: ${options?.cause?.message ?? 'unknown'}`);
|
|
34
|
+
this.name = 'AIProviderError';
|
|
35
|
+
this.provider = provider;
|
|
36
|
+
if (options?.cause)
|
|
37
|
+
this.cause = options.cause;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.AIProviderError = AIProviderError;
|
|
41
|
+
class AIProviderUnavailableError extends datasource_toolkit_1.InternalServerError {
|
|
42
|
+
constructor(provider, options) {
|
|
43
|
+
const causeMessage = options.cause?.message ?? 'unknown';
|
|
44
|
+
super(`${provider} server error (HTTP ${options.status}): ${causeMessage}`);
|
|
45
|
+
this.name = 'AIProviderUnavailableError';
|
|
46
|
+
this.provider = provider;
|
|
47
|
+
this.providerStatusCode = options.status;
|
|
48
|
+
if (options.cause)
|
|
49
|
+
this.cause = options.cause;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.AIProviderUnavailableError = AIProviderUnavailableError;
|
|
53
|
+
class AITooManyRequestsError extends datasource_toolkit_1.TooManyRequestsError {
|
|
54
|
+
constructor(provider, options) {
|
|
55
|
+
super(`${provider} rate limit exceeded: ${options?.cause?.message ?? 'unknown reason'}`);
|
|
56
|
+
this.name = 'AITooManyRequestsError';
|
|
57
|
+
this.provider = provider;
|
|
58
|
+
if (options?.cause)
|
|
59
|
+
this.cause = options.cause;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.AITooManyRequestsError = AITooManyRequestsError;
|
|
63
|
+
class AIUnauthorizedError extends datasource_toolkit_1.UnauthorizedError {
|
|
64
|
+
constructor(provider, options) {
|
|
65
|
+
super(`${provider} authentication failed: ${options?.cause?.message ?? 'check your API key configuration'}`);
|
|
66
|
+
this.name = 'AIUnauthorizedError';
|
|
67
|
+
this.provider = provider;
|
|
68
|
+
if (options?.cause)
|
|
69
|
+
this.cause = options.cause;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.AIUnauthorizedError = AIUnauthorizedError;
|
|
73
|
+
class AIForbiddenError extends datasource_toolkit_1.ForbiddenError {
|
|
74
|
+
constructor(provider, options) {
|
|
75
|
+
super(`${provider} access denied: ${options?.cause?.message ?? 'permission denied'}`);
|
|
76
|
+
this.name = 'AIForbiddenError';
|
|
77
|
+
this.provider = provider;
|
|
43
78
|
if (options?.cause)
|
|
44
79
|
this.cause = options.cause;
|
|
45
80
|
}
|
|
46
81
|
}
|
|
47
|
-
exports.
|
|
48
|
-
class AINotConfiguredError extends
|
|
82
|
+
exports.AIForbiddenError = AIForbiddenError;
|
|
83
|
+
class AINotConfiguredError extends datasource_toolkit_1.UnprocessableError {
|
|
49
84
|
constructor(message = 'AI is not configured') {
|
|
50
85
|
super(message);
|
|
51
86
|
this.name = 'AINotConfiguredError';
|
|
52
87
|
}
|
|
53
88
|
}
|
|
54
89
|
exports.AINotConfiguredError = AINotConfiguredError;
|
|
55
|
-
class AIToolUnprocessableError extends
|
|
90
|
+
class AIToolUnprocessableError extends datasource_toolkit_1.UnprocessableError {
|
|
56
91
|
constructor(message) {
|
|
57
92
|
super(message);
|
|
58
93
|
this.name = 'AIToolUnprocessableError';
|
|
@@ -66,7 +101,7 @@ class AIToolNotFoundError extends AINotFoundError {
|
|
|
66
101
|
}
|
|
67
102
|
}
|
|
68
103
|
exports.AIToolNotFoundError = AIToolNotFoundError;
|
|
69
|
-
class McpError extends
|
|
104
|
+
class McpError extends datasource_toolkit_1.UnprocessableError {
|
|
70
105
|
constructor(message) {
|
|
71
106
|
super(message);
|
|
72
107
|
this.name = 'McpError';
|
|
@@ -94,4 +129,4 @@ class McpConfigError extends McpError {
|
|
|
94
129
|
}
|
|
95
130
|
}
|
|
96
131
|
exports.McpConfigError = McpConfigError;
|
|
97
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
132
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7QUFFSCxnREFBZ0Q7QUFDaEQsd0VBUXlDO0FBRXpDLE1BQWEsaUJBQWtCLFNBQVEsb0NBQWU7SUFDcEQsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBTEQsOENBS0M7QUFFRCxNQUFhLHdCQUF5QixTQUFRLGlCQUFpQjtJQUM3RCxZQUFZLEtBQWE7UUFDdkIsS0FBSyxDQUNILFVBQVUsS0FBSyw4RUFBOEUsQ0FDOUYsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLEdBQUcsMEJBQTBCLENBQUM7SUFDekMsQ0FBQztDQUNGO0FBUEQsNERBT0M7QUFFRCxNQUFhLGVBQWdCLFNBQVEsa0NBQWE7SUFDaEQsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBTEQsMENBS0M7QUFFRCxNQUFhLGVBQWdCLFNBQVEsdUNBQWtCO0lBSXJELFlBQVksUUFBZ0IsRUFBRSxPQUEyQjtRQUN2RCxLQUFLLENBQUMsdUJBQXVCLFFBQVEsS0FBSyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxPQUFPLEVBQUUsS0FBSztZQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUNqRCxDQUFDO0NBQ0Y7QUFWRCwwQ0FVQztBQUVELE1BQWEsMEJBQTJC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
|
|
@@ -12,17 +12,6 @@ export default class ProviderDispatcher {
|
|
|
12
12
|
dispatch(body: DispatchBody): Promise<ChatCompletionResponse>;
|
|
13
13
|
private dispatchOpenAI;
|
|
14
14
|
private dispatchAnthropic;
|
|
15
|
-
/**
|
|
16
|
-
* Wraps provider errors into AI-specific error types.
|
|
17
|
-
*
|
|
18
|
-
* TODO: Currently all provider errors are wrapped as AIUnprocessableError,
|
|
19
|
-
* losing the original HTTP semantics (429 rate limit, 401 auth failure).
|
|
20
|
-
* To fix this properly we need to:
|
|
21
|
-
* 1. Add UnauthorizedError and TooManyRequestsError to datasource-toolkit
|
|
22
|
-
* 2. Add corresponding cases in the agent's error-handling middleware
|
|
23
|
-
* 3. Create AIProviderError, AIRateLimitError, AIAuthenticationError in ai-proxy
|
|
24
|
-
* with baseBusinessErrorName overrides for correct HTTP status mapping
|
|
25
|
-
*/
|
|
26
15
|
private static wrapProviderError;
|
|
27
16
|
private enrichToolDefinitions;
|
|
28
17
|
}
|
|
@@ -3,6 +3,7 @@ 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 datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
6
7
|
const anthropic_1 = require("@langchain/anthropic");
|
|
7
8
|
const function_calling_1 = require("@langchain/core/utils/function_calling");
|
|
8
9
|
const openai_1 = require("@langchain/openai");
|
|
@@ -64,7 +65,7 @@ class ProviderDispatcher {
|
|
|
64
65
|
// eslint-disable-next-line no-underscore-dangle
|
|
65
66
|
const rawResponse = response.additional_kwargs.__raw_response;
|
|
66
67
|
if (!rawResponse) {
|
|
67
|
-
throw new
|
|
68
|
+
throw new datasource_toolkit_1.UnprocessableError('OpenAI response missing raw response data. This may indicate an API change.');
|
|
68
69
|
}
|
|
69
70
|
return rawResponse;
|
|
70
71
|
}
|
|
@@ -88,39 +89,32 @@ class ProviderDispatcher {
|
|
|
88
89
|
}
|
|
89
90
|
return langchain_adapter_1.LangChainAdapter.convertResponse(response, this.modelName);
|
|
90
91
|
}
|
|
91
|
-
/**
|
|
92
|
-
* Wraps provider errors into AI-specific error types.
|
|
93
|
-
*
|
|
94
|
-
* TODO: Currently all provider errors are wrapped as AIUnprocessableError,
|
|
95
|
-
* losing the original HTTP semantics (429 rate limit, 401 auth failure).
|
|
96
|
-
* To fix this properly we need to:
|
|
97
|
-
* 1. Add UnauthorizedError and TooManyRequestsError to datasource-toolkit
|
|
98
|
-
* 2. Add corresponding cases in the agent's error-handling middleware
|
|
99
|
-
* 3. Create AIProviderError, AIRateLimitError, AIAuthenticationError in ai-proxy
|
|
100
|
-
* with baseBusinessErrorName overrides for correct HTTP status mapping
|
|
101
|
-
*/
|
|
102
92
|
static wrapProviderError(error, providerName) {
|
|
103
|
-
if (error instanceof
|
|
104
|
-
return error;
|
|
105
|
-
if (error instanceof errors_1.AIBadRequestError)
|
|
93
|
+
if (error instanceof datasource_toolkit_1.BusinessError)
|
|
106
94
|
return error;
|
|
107
95
|
if (!(error instanceof Error)) {
|
|
108
|
-
|
|
96
|
+
let message;
|
|
97
|
+
try {
|
|
98
|
+
message = JSON.stringify(error);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
message = String(error);
|
|
102
|
+
}
|
|
103
|
+
return new errors_1.AIProviderError(providerName, { cause: new Error(message) });
|
|
109
104
|
}
|
|
110
105
|
const { status } = error;
|
|
111
|
-
if (status ===
|
|
112
|
-
return new errors_1.
|
|
113
|
-
|
|
114
|
-
});
|
|
106
|
+
if (status === 400)
|
|
107
|
+
return new errors_1.AIBadRequestError(`${providerName}: ${error.message}`);
|
|
108
|
+
if (status === 401)
|
|
109
|
+
return new errors_1.AIUnauthorizedError(providerName, { cause: error });
|
|
110
|
+
if (status === 403)
|
|
111
|
+
return new errors_1.AIForbiddenError(providerName, { cause: error });
|
|
112
|
+
if (status === 429)
|
|
113
|
+
return new errors_1.AITooManyRequestsError(providerName, { cause: error });
|
|
114
|
+
if (status && status >= 500) {
|
|
115
|
+
return new errors_1.AIProviderUnavailableError(providerName, { cause: error, status });
|
|
115
116
|
}
|
|
116
|
-
|
|
117
|
-
return new errors_1.AIUnprocessableError(`${providerName} authentication failed: ${error.message}`, {
|
|
118
|
-
cause: error,
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
return new errors_1.AIUnprocessableError(`Error while calling ${providerName}: ${error.message}`, {
|
|
122
|
-
cause: error,
|
|
123
|
-
});
|
|
117
|
+
return new errors_1.AIProviderError(providerName, { cause: error });
|
|
124
118
|
}
|
|
125
119
|
enrichToolDefinitions(tools) {
|
|
126
120
|
if (!tools)
|
|
@@ -137,4 +131,4 @@ class ProviderDispatcher {
|
|
|
137
131
|
}
|
|
138
132
|
}
|
|
139
133
|
exports.default = ProviderDispatcher;
|
|
140
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItZGlzcGF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm92aWRlci1kaXNwYXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBTUEsd0VBQW9GO0FBQ3BGLG9EQUFxRDtBQUNyRCw2RUFBaUY7QUFDakYsOENBQStDO0FBRS9DLDRFQUFtRDtBQUNuRCxxQ0FRa0I7QUFDbEIsMkRBQXVEO0FBZ0J2RCxNQUFxQixrQkFBa0I7SUFTckMsWUFBWSxhQUFxQyxFQUFFLFdBQXdCO1FBUjFELGdCQUFXLEdBQXNCLElBQUksQ0FBQztRQUV0QyxtQkFBYyxHQUF5QixJQUFJLENBQUM7UUFFNUMsY0FBUyxHQUFrQixJQUFJLENBQUM7UUFLL0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFFL0IsSUFBSSxhQUFhLEVBQUUsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsaUJBQWlCLEVBQUUsR0FBRyxhQUFhLENBQUM7WUFDL0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLG1CQUFVLENBQUM7Z0JBQ2hDLFVBQVUsRUFBRSxDQUFDLEVBQUUsb0RBQW9EO2dCQUNuRSxHQUFHLGlCQUFpQjtnQkFDcEIsb0JBQW9CLEVBQUUsSUFBSTthQUMzQixDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxhQUFhLEVBQUUsUUFBUSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ25ELE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLGFBQWEsRUFBRSxHQUFHLGFBQWEsQ0FBQztZQUNsRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUkseUJBQWEsQ0FBQztnQkFDdEMsVUFBVSxFQUFFLENBQUMsRUFBRSxvREFBb0Q7Z0JBQ25FLEdBQUcsYUFBYTtnQkFDaEIsS0FBSzthQUNOLENBQUMsQ0FBQztZQUNILElBQUks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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/ai-proxy",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.1",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"license": "GPL-3.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -12,10 +12,10 @@
|
|
|
12
12
|
"directory": "packages/ai-proxy"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@forestadmin/agent-toolkit": "1.0
|
|
16
|
-
"@forestadmin/datasource-toolkit": "1.
|
|
15
|
+
"@forestadmin/agent-toolkit": "1.1.0",
|
|
16
|
+
"@forestadmin/datasource-toolkit": "1.52.0",
|
|
17
17
|
"@langchain/anthropic": "1.3.17",
|
|
18
|
-
"@langchain/community": "1.1.
|
|
18
|
+
"@langchain/community": "^1.1.19",
|
|
19
19
|
"@langchain/core": "1.1.15",
|
|
20
20
|
"@langchain/langgraph": "^1.1.0",
|
|
21
21
|
"@langchain/mcp-adapters": "1.1.1",
|