praisonai 1.3.6 → 1.5.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/agent/audio.d.ts +190 -0
- package/dist/agent/audio.js +302 -0
- package/dist/agent/index.d.ts +2 -0
- package/dist/agent/index.js +5 -1
- package/dist/ai/agent-loop.d.ts +177 -0
- package/dist/ai/agent-loop.js +313 -0
- package/dist/ai/devtools.d.ts +74 -0
- package/dist/ai/devtools.js +216 -0
- package/dist/ai/embed.d.ts +71 -0
- package/dist/ai/embed.js +154 -0
- package/dist/ai/generate-image.d.ts +66 -0
- package/dist/ai/generate-image.js +138 -0
- package/dist/ai/generate-object.d.ts +132 -0
- package/dist/ai/generate-object.js +206 -0
- package/dist/ai/generate-text.d.ts +201 -0
- package/dist/ai/generate-text.js +253 -0
- package/dist/ai/index.d.ts +27 -0
- package/dist/ai/index.js +140 -0
- package/dist/ai/mcp.d.ts +181 -0
- package/dist/ai/mcp.js +234 -0
- package/dist/ai/middleware.d.ts +110 -0
- package/dist/ai/middleware.js +186 -0
- package/dist/ai/models.d.ts +67 -0
- package/dist/ai/models.js +249 -0
- package/dist/ai/multimodal.d.ts +125 -0
- package/dist/ai/multimodal.js +270 -0
- package/dist/ai/nextjs.d.ts +122 -0
- package/dist/ai/nextjs.js +218 -0
- package/dist/ai/server.d.ts +126 -0
- package/dist/ai/server.js +336 -0
- package/dist/ai/speech.d.ts +135 -0
- package/dist/ai/speech.js +296 -0
- package/dist/ai/telemetry.d.ts +162 -0
- package/dist/ai/telemetry.js +311 -0
- package/dist/ai/tool-approval.d.ts +225 -0
- package/dist/ai/tool-approval.js +407 -0
- package/dist/ai/tools.d.ts +93 -0
- package/dist/ai/tools.js +89 -0
- package/dist/ai/types.d.ts +47 -0
- package/dist/ai/types.js +5 -0
- package/dist/ai/ui-message.d.ts +218 -0
- package/dist/ai/ui-message.js +291 -0
- package/dist/cli/commands/approval.d.ts +10 -0
- package/dist/cli/commands/approval.js +274 -0
- package/dist/cli/commands/observability.d.ts +7 -0
- package/dist/cli/commands/observability.js +202 -12
- package/dist/cli/commands/providers.d.ts +5 -2
- package/dist/cli/commands/providers.js +204 -5
- package/dist/cli/commands/tools.d.ts +11 -1
- package/dist/cli/commands/tools.js +450 -64
- package/dist/cli/output/errors.d.ts +1 -0
- package/dist/cli/output/errors.js +1 -0
- package/dist/cli/spec/cli-spec.js +17 -0
- package/dist/index.d.ts +21 -4
- package/dist/index.js +275 -19
- package/dist/integrations/computer-use.d.ts +182 -0
- package/dist/integrations/computer-use.js +356 -0
- package/dist/integrations/postgres.d.ts +162 -0
- package/dist/integrations/postgres.js +396 -0
- package/dist/integrations/slack.d.ts +145 -0
- package/dist/integrations/slack.js +270 -0
- package/dist/knowledge/chonkie-adapter.d.ts +99 -0
- package/dist/knowledge/chonkie-adapter.js +268 -0
- package/dist/knowledge/index.d.ts +5 -0
- package/dist/knowledge/index.js +29 -1
- package/dist/knowledge/query-engine.d.ts +136 -0
- package/dist/knowledge/query-engine.js +214 -0
- package/dist/knowledge/rag-pipeline.d.ts +192 -0
- package/dist/knowledge/rag-pipeline.js +283 -0
- package/dist/knowledge/readers.d.ts +129 -0
- package/dist/knowledge/readers.js +393 -0
- package/dist/llm/providers/ai-sdk/types.d.ts +49 -3
- package/dist/llm/providers/ai-sdk/types.js +169 -15
- package/dist/mcp/index.d.ts +188 -0
- package/dist/mcp/index.js +373 -0
- package/dist/mcp/server.d.ts +211 -0
- package/dist/mcp/server.js +412 -0
- package/dist/memory/docs-manager.d.ts +165 -0
- package/dist/memory/docs-manager.js +294 -0
- package/dist/memory/hooks.d.ts +154 -0
- package/dist/memory/hooks.js +228 -0
- package/dist/memory/rules-manager.d.ts +182 -0
- package/dist/memory/rules-manager.js +244 -0
- package/dist/observability/adapters/console.d.ts +33 -0
- package/dist/observability/adapters/console.js +71 -0
- package/dist/observability/adapters/external/arize.d.ts +20 -0
- package/dist/observability/adapters/external/arize.js +22 -0
- package/dist/observability/adapters/external/axiom.d.ts +20 -0
- package/dist/observability/adapters/external/axiom.js +22 -0
- package/dist/observability/adapters/external/braintrust.d.ts +20 -0
- package/dist/observability/adapters/external/braintrust.js +22 -0
- package/dist/observability/adapters/external/helicone.d.ts +20 -0
- package/dist/observability/adapters/external/helicone.js +22 -0
- package/dist/observability/adapters/external/laminar.d.ts +20 -0
- package/dist/observability/adapters/external/laminar.js +22 -0
- package/dist/observability/adapters/external/langfuse.d.ts +28 -0
- package/dist/observability/adapters/external/langfuse.js +186 -0
- package/dist/observability/adapters/external/langsmith.d.ts +21 -0
- package/dist/observability/adapters/external/langsmith.js +83 -0
- package/dist/observability/adapters/external/langwatch.d.ts +20 -0
- package/dist/observability/adapters/external/langwatch.js +22 -0
- package/dist/observability/adapters/external/maxim.d.ts +20 -0
- package/dist/observability/adapters/external/maxim.js +22 -0
- package/dist/observability/adapters/external/patronus.d.ts +20 -0
- package/dist/observability/adapters/external/patronus.js +22 -0
- package/dist/observability/adapters/external/scorecard.d.ts +20 -0
- package/dist/observability/adapters/external/scorecard.js +22 -0
- package/dist/observability/adapters/external/signoz.d.ts +20 -0
- package/dist/observability/adapters/external/signoz.js +22 -0
- package/dist/observability/adapters/external/traceloop.d.ts +20 -0
- package/dist/observability/adapters/external/traceloop.js +22 -0
- package/dist/observability/adapters/external/weave.d.ts +20 -0
- package/dist/observability/adapters/external/weave.js +22 -0
- package/dist/observability/adapters/index.d.ts +19 -0
- package/dist/observability/adapters/index.js +289 -0
- package/dist/observability/adapters/memory.d.ts +41 -0
- package/dist/observability/adapters/memory.js +190 -0
- package/dist/observability/adapters/noop.d.ts +25 -0
- package/dist/observability/adapters/noop.js +64 -0
- package/dist/observability/index.d.ts +39 -78
- package/dist/observability/index.js +99 -150
- package/dist/observability/types.d.ts +165 -0
- package/dist/observability/types.js +165 -0
- package/dist/tools/builtins/airweave.d.ts +32 -0
- package/dist/tools/builtins/airweave.js +119 -0
- package/dist/tools/builtins/bedrock-agentcore.d.ts +62 -0
- package/dist/tools/builtins/bedrock-agentcore.js +233 -0
- package/dist/tools/builtins/code-execution.d.ts +36 -0
- package/dist/tools/builtins/code-execution.js +136 -0
- package/dist/tools/builtins/code-mode.d.ts +54 -0
- package/dist/tools/builtins/code-mode.js +167 -0
- package/dist/tools/builtins/custom.d.ts +42 -0
- package/dist/tools/builtins/custom.js +195 -0
- package/dist/tools/builtins/exa.d.ts +53 -0
- package/dist/tools/builtins/exa.js +112 -0
- package/dist/tools/builtins/firecrawl.d.ts +56 -0
- package/dist/tools/builtins/firecrawl.js +158 -0
- package/dist/tools/builtins/index.d.ts +45 -0
- package/dist/tools/builtins/index.js +180 -0
- package/dist/tools/builtins/parallel.d.ts +30 -0
- package/dist/tools/builtins/parallel.js +113 -0
- package/dist/tools/builtins/perplexity.d.ts +32 -0
- package/dist/tools/builtins/perplexity.js +113 -0
- package/dist/tools/builtins/superagent.d.ts +66 -0
- package/dist/tools/builtins/superagent.js +187 -0
- package/dist/tools/builtins/tavily.d.ts +99 -0
- package/dist/tools/builtins/tavily.js +285 -0
- package/dist/tools/builtins/valyu.d.ts +65 -0
- package/dist/tools/builtins/valyu.js +193 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.js +16 -2
- package/dist/tools/registry/index.d.ts +9 -0
- package/dist/tools/registry/index.js +28 -0
- package/dist/tools/registry/middleware.d.ts +43 -0
- package/dist/tools/registry/middleware.js +220 -0
- package/dist/tools/registry/registry.d.ts +92 -0
- package/dist/tools/registry/registry.js +280 -0
- package/dist/tools/registry/types.d.ts +217 -0
- package/dist/tools/registry/types.js +49 -0
- package/dist/tools/subagent.d.ts +131 -0
- package/dist/tools/subagent.js +185 -0
- package/dist/tools/tools.d.ts +74 -0
- package/dist/tools/tools.js +133 -0
- package/dist/workflows/index.d.ts +76 -1
- package/dist/workflows/index.js +125 -6
- package/dist/workflows/loop.d.ts +111 -0
- package/dist/workflows/loop.js +274 -0
- package/dist/workflows/repeat.d.ts +115 -0
- package/dist/workflows/repeat.js +144 -0
- package/package.json +4 -1
package/dist/ai/mcp.d.ts
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP (Model Context Protocol) - AI SDK Wrapper
|
|
3
|
+
*
|
|
4
|
+
* Provides MCP client utilities for connecting to MCP servers and using their tools.
|
|
5
|
+
*/
|
|
6
|
+
export interface MCPConfig {
|
|
7
|
+
/** Transport configuration */
|
|
8
|
+
transport: MCPTransportConfig;
|
|
9
|
+
/** Client name */
|
|
10
|
+
name?: string;
|
|
11
|
+
/** Client version */
|
|
12
|
+
version?: string;
|
|
13
|
+
/** Callback for uncaught errors */
|
|
14
|
+
onUncaughtError?: (error: unknown) => void;
|
|
15
|
+
}
|
|
16
|
+
export type MCPTransportConfig = {
|
|
17
|
+
type: 'stdio';
|
|
18
|
+
command: string;
|
|
19
|
+
args?: string[];
|
|
20
|
+
env?: Record<string, string>;
|
|
21
|
+
} | {
|
|
22
|
+
type: 'sse';
|
|
23
|
+
url: string;
|
|
24
|
+
headers?: Record<string, string>;
|
|
25
|
+
authProvider?: OAuthClientProvider;
|
|
26
|
+
} | {
|
|
27
|
+
type: 'http';
|
|
28
|
+
url: string;
|
|
29
|
+
headers?: Record<string, string>;
|
|
30
|
+
authProvider?: OAuthClientProvider;
|
|
31
|
+
} | {
|
|
32
|
+
type: 'websocket';
|
|
33
|
+
url: string;
|
|
34
|
+
headers?: Record<string, string>;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* OAuth client provider for MCP authentication.
|
|
38
|
+
*/
|
|
39
|
+
export interface OAuthClientProvider {
|
|
40
|
+
/** Get the current access token */
|
|
41
|
+
getAccessToken(): Promise<string | null>;
|
|
42
|
+
/** Refresh the access token */
|
|
43
|
+
refreshToken?(): Promise<string | null>;
|
|
44
|
+
/** Handle OAuth redirect */
|
|
45
|
+
handleRedirect?(url: string): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
export interface MCPClient {
|
|
48
|
+
/** Get tools from the MCP server */
|
|
49
|
+
tools(): Promise<Record<string, MCPTool>>;
|
|
50
|
+
/** List available resources */
|
|
51
|
+
listResources(): Promise<MCPResource[]>;
|
|
52
|
+
/** Read a resource */
|
|
53
|
+
readResource(uri: string): Promise<MCPResourceContent>;
|
|
54
|
+
/** List available prompts */
|
|
55
|
+
listPrompts(): Promise<MCPPrompt[]>;
|
|
56
|
+
/** Get a prompt */
|
|
57
|
+
getPrompt(name: string, args?: Record<string, string>): Promise<MCPPromptResult>;
|
|
58
|
+
/** Close the connection */
|
|
59
|
+
close(): Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
export interface MCPTool {
|
|
62
|
+
/** Tool name */
|
|
63
|
+
name: string;
|
|
64
|
+
/** Tool description */
|
|
65
|
+
description?: string;
|
|
66
|
+
/** Input schema */
|
|
67
|
+
inputSchema: any;
|
|
68
|
+
/** Execute the tool */
|
|
69
|
+
execute: (args: any) => Promise<any>;
|
|
70
|
+
}
|
|
71
|
+
export interface MCPResource {
|
|
72
|
+
/** Resource URI */
|
|
73
|
+
uri: string;
|
|
74
|
+
/** Resource name */
|
|
75
|
+
name: string;
|
|
76
|
+
/** Resource description */
|
|
77
|
+
description?: string;
|
|
78
|
+
/** MIME type */
|
|
79
|
+
mimeType?: string;
|
|
80
|
+
}
|
|
81
|
+
export interface MCPResourceContent {
|
|
82
|
+
/** Content URI */
|
|
83
|
+
uri: string;
|
|
84
|
+
/** Content MIME type */
|
|
85
|
+
mimeType?: string;
|
|
86
|
+
/** Text content */
|
|
87
|
+
text?: string;
|
|
88
|
+
/** Binary content (base64) */
|
|
89
|
+
blob?: string;
|
|
90
|
+
}
|
|
91
|
+
export interface MCPPrompt {
|
|
92
|
+
/** Prompt name */
|
|
93
|
+
name: string;
|
|
94
|
+
/** Prompt description */
|
|
95
|
+
description?: string;
|
|
96
|
+
/** Arguments */
|
|
97
|
+
arguments?: Array<{
|
|
98
|
+
name: string;
|
|
99
|
+
description?: string;
|
|
100
|
+
required?: boolean;
|
|
101
|
+
}>;
|
|
102
|
+
}
|
|
103
|
+
export interface MCPPromptResult {
|
|
104
|
+
/** Prompt description */
|
|
105
|
+
description?: string;
|
|
106
|
+
/** Messages */
|
|
107
|
+
messages: Array<{
|
|
108
|
+
role: 'user' | 'assistant';
|
|
109
|
+
content: {
|
|
110
|
+
type: 'text';
|
|
111
|
+
text: string;
|
|
112
|
+
} | {
|
|
113
|
+
type: 'image';
|
|
114
|
+
data: string;
|
|
115
|
+
mimeType: string;
|
|
116
|
+
};
|
|
117
|
+
}>;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Create an MCP client.
|
|
121
|
+
*
|
|
122
|
+
* @example Stdio transport (local server)
|
|
123
|
+
* ```typescript
|
|
124
|
+
* const client = await createMCP({
|
|
125
|
+
* transport: {
|
|
126
|
+
* type: 'stdio',
|
|
127
|
+
* command: 'npx',
|
|
128
|
+
* args: ['-y', '@modelcontextprotocol/server-filesystem', '/path/to/dir']
|
|
129
|
+
* }
|
|
130
|
+
* });
|
|
131
|
+
*
|
|
132
|
+
* const tools = await client.tools();
|
|
133
|
+
* ```
|
|
134
|
+
*
|
|
135
|
+
* @example SSE transport (remote server)
|
|
136
|
+
* ```typescript
|
|
137
|
+
* const client = await createMCP({
|
|
138
|
+
* transport: {
|
|
139
|
+
* type: 'sse',
|
|
140
|
+
* url: 'https://mcp-server.example.com/sse'
|
|
141
|
+
* }
|
|
142
|
+
* });
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
export declare function createMCP(config: MCPConfig): Promise<MCPClient>;
|
|
146
|
+
/**
|
|
147
|
+
* Get or create a pooled MCP client.
|
|
148
|
+
*
|
|
149
|
+
* @example
|
|
150
|
+
* ```typescript
|
|
151
|
+
* const client = await getMCPClient('filesystem', {
|
|
152
|
+
* transport: { type: 'stdio', command: 'npx', args: ['-y', '@mcp/server-fs'] }
|
|
153
|
+
* });
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
export declare function getMCPClient(key: string, config: MCPConfig): Promise<MCPClient>;
|
|
157
|
+
/**
|
|
158
|
+
* Close and remove a pooled MCP client.
|
|
159
|
+
*/
|
|
160
|
+
export declare function closeMCPClient(key: string): Promise<void>;
|
|
161
|
+
/**
|
|
162
|
+
* Close all pooled MCP clients.
|
|
163
|
+
*/
|
|
164
|
+
export declare function closeAllMCPClients(): Promise<void>;
|
|
165
|
+
/**
|
|
166
|
+
* Convert MCP tools to AI SDK tool format.
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* ```typescript
|
|
170
|
+
* const client = await createMCP({ ... });
|
|
171
|
+
* const mcpTools = await client.tools();
|
|
172
|
+
* const aiTools = mcpToolsToAITools(mcpTools);
|
|
173
|
+
*
|
|
174
|
+
* const result = await generateText({
|
|
175
|
+
* model: 'gpt-4o',
|
|
176
|
+
* prompt: 'List files in the current directory',
|
|
177
|
+
* tools: aiTools
|
|
178
|
+
* });
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
181
|
+
export declare function mcpToolsToAITools(mcpTools: Record<string, MCPTool>): Record<string, any>;
|
package/dist/ai/mcp.js
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP (Model Context Protocol) - AI SDK Wrapper
|
|
4
|
+
*
|
|
5
|
+
* Provides MCP client utilities for connecting to MCP servers and using their tools.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.createMCP = createMCP;
|
|
42
|
+
exports.getMCPClient = getMCPClient;
|
|
43
|
+
exports.closeMCPClient = closeMCPClient;
|
|
44
|
+
exports.closeAllMCPClients = closeAllMCPClients;
|
|
45
|
+
exports.mcpToolsToAITools = mcpToolsToAITools;
|
|
46
|
+
// Connection pool for MCP clients
|
|
47
|
+
const clientPool = new Map();
|
|
48
|
+
/**
|
|
49
|
+
* Create an MCP client.
|
|
50
|
+
*
|
|
51
|
+
* @example Stdio transport (local server)
|
|
52
|
+
* ```typescript
|
|
53
|
+
* const client = await createMCP({
|
|
54
|
+
* transport: {
|
|
55
|
+
* type: 'stdio',
|
|
56
|
+
* command: 'npx',
|
|
57
|
+
* args: ['-y', '@modelcontextprotocol/server-filesystem', '/path/to/dir']
|
|
58
|
+
* }
|
|
59
|
+
* });
|
|
60
|
+
*
|
|
61
|
+
* const tools = await client.tools();
|
|
62
|
+
* ```
|
|
63
|
+
*
|
|
64
|
+
* @example SSE transport (remote server)
|
|
65
|
+
* ```typescript
|
|
66
|
+
* const client = await createMCP({
|
|
67
|
+
* transport: {
|
|
68
|
+
* type: 'sse',
|
|
69
|
+
* url: 'https://mcp-server.example.com/sse'
|
|
70
|
+
* }
|
|
71
|
+
* });
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
async function createMCP(config) {
|
|
75
|
+
// Try to use AI SDK MCP client (optional dependency)
|
|
76
|
+
try {
|
|
77
|
+
// @ts-ignore - Optional dependency
|
|
78
|
+
const mcpModule = await Promise.resolve().then(() => __importStar(require('@ai-sdk/mcp')));
|
|
79
|
+
const transport = createTransport(config.transport);
|
|
80
|
+
const client = await mcpModule.createMCPClient({
|
|
81
|
+
transport,
|
|
82
|
+
name: config.name,
|
|
83
|
+
version: config.version,
|
|
84
|
+
onUncaughtError: config.onUncaughtError,
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
tools: async () => {
|
|
88
|
+
const toolSet = await client.tools();
|
|
89
|
+
return toolSet;
|
|
90
|
+
},
|
|
91
|
+
listResources: async () => {
|
|
92
|
+
const result = await client.listResources();
|
|
93
|
+
return result.resources || [];
|
|
94
|
+
},
|
|
95
|
+
readResource: async (uri) => {
|
|
96
|
+
const result = await client.readResource({ uri });
|
|
97
|
+
return result.contents?.[0] || { uri };
|
|
98
|
+
},
|
|
99
|
+
listPrompts: async () => {
|
|
100
|
+
const result = await client.listPrompts();
|
|
101
|
+
return result.prompts || [];
|
|
102
|
+
},
|
|
103
|
+
getPrompt: async (name, args) => {
|
|
104
|
+
const result = await client.getPrompt({ name, arguments: args });
|
|
105
|
+
return result;
|
|
106
|
+
},
|
|
107
|
+
close: async () => {
|
|
108
|
+
await client.close();
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
// Fall back to native implementation
|
|
114
|
+
return createNativeMCPClient(config);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Create transport configuration for AI SDK MCP.
|
|
119
|
+
*/
|
|
120
|
+
function createTransport(config) {
|
|
121
|
+
switch (config.type) {
|
|
122
|
+
case 'stdio':
|
|
123
|
+
return {
|
|
124
|
+
type: 'stdio',
|
|
125
|
+
command: config.command,
|
|
126
|
+
args: config.args,
|
|
127
|
+
env: config.env,
|
|
128
|
+
};
|
|
129
|
+
case 'sse':
|
|
130
|
+
return {
|
|
131
|
+
type: 'sse',
|
|
132
|
+
url: config.url,
|
|
133
|
+
headers: config.headers,
|
|
134
|
+
authProvider: config.authProvider,
|
|
135
|
+
};
|
|
136
|
+
case 'http':
|
|
137
|
+
return {
|
|
138
|
+
type: 'http',
|
|
139
|
+
url: config.url,
|
|
140
|
+
headers: config.headers,
|
|
141
|
+
authProvider: config.authProvider,
|
|
142
|
+
};
|
|
143
|
+
case 'websocket':
|
|
144
|
+
return {
|
|
145
|
+
type: 'websocket',
|
|
146
|
+
url: config.url,
|
|
147
|
+
headers: config.headers,
|
|
148
|
+
};
|
|
149
|
+
default:
|
|
150
|
+
throw new Error(`Unknown transport type: ${config.type}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Native MCP client implementation (fallback).
|
|
155
|
+
*/
|
|
156
|
+
async function createNativeMCPClient(config) {
|
|
157
|
+
// This is a simplified native implementation
|
|
158
|
+
// In production, this would use the @modelcontextprotocol/sdk directly
|
|
159
|
+
const tools = {};
|
|
160
|
+
const resources = [];
|
|
161
|
+
const prompts = [];
|
|
162
|
+
return {
|
|
163
|
+
tools: async () => tools,
|
|
164
|
+
listResources: async () => resources,
|
|
165
|
+
readResource: async (uri) => ({ uri }),
|
|
166
|
+
listPrompts: async () => prompts,
|
|
167
|
+
getPrompt: async (name) => ({ messages: [] }),
|
|
168
|
+
close: async () => { },
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get or create a pooled MCP client.
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```typescript
|
|
176
|
+
* const client = await getMCPClient('filesystem', {
|
|
177
|
+
* transport: { type: 'stdio', command: 'npx', args: ['-y', '@mcp/server-fs'] }
|
|
178
|
+
* });
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
181
|
+
async function getMCPClient(key, config) {
|
|
182
|
+
if (clientPool.has(key)) {
|
|
183
|
+
return clientPool.get(key);
|
|
184
|
+
}
|
|
185
|
+
const client = await createMCP(config);
|
|
186
|
+
clientPool.set(key, client);
|
|
187
|
+
return client;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Close and remove a pooled MCP client.
|
|
191
|
+
*/
|
|
192
|
+
async function closeMCPClient(key) {
|
|
193
|
+
const client = clientPool.get(key);
|
|
194
|
+
if (client) {
|
|
195
|
+
await client.close();
|
|
196
|
+
clientPool.delete(key);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Close all pooled MCP clients.
|
|
201
|
+
*/
|
|
202
|
+
async function closeAllMCPClients() {
|
|
203
|
+
for (const [key, client] of clientPool) {
|
|
204
|
+
await client.close();
|
|
205
|
+
clientPool.delete(key);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Convert MCP tools to AI SDK tool format.
|
|
210
|
+
*
|
|
211
|
+
* @example
|
|
212
|
+
* ```typescript
|
|
213
|
+
* const client = await createMCP({ ... });
|
|
214
|
+
* const mcpTools = await client.tools();
|
|
215
|
+
* const aiTools = mcpToolsToAITools(mcpTools);
|
|
216
|
+
*
|
|
217
|
+
* const result = await generateText({
|
|
218
|
+
* model: 'gpt-4o',
|
|
219
|
+
* prompt: 'List files in the current directory',
|
|
220
|
+
* tools: aiTools
|
|
221
|
+
* });
|
|
222
|
+
* ```
|
|
223
|
+
*/
|
|
224
|
+
function mcpToolsToAITools(mcpTools) {
|
|
225
|
+
const aiTools = {};
|
|
226
|
+
for (const [name, tool] of Object.entries(mcpTools)) {
|
|
227
|
+
aiTools[name] = {
|
|
228
|
+
description: tool.description || `MCP tool: ${name}`,
|
|
229
|
+
parameters: tool.inputSchema,
|
|
230
|
+
execute: tool.execute,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
return aiTools;
|
|
234
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Middleware - AI SDK Wrapper
|
|
3
|
+
*
|
|
4
|
+
* Provides middleware utilities for caching, logging, and model wrapping.
|
|
5
|
+
*/
|
|
6
|
+
export interface Middleware {
|
|
7
|
+
/** Middleware name */
|
|
8
|
+
name: string;
|
|
9
|
+
/** Transform request before sending */
|
|
10
|
+
transformRequest?: (request: MiddlewareRequest) => Promise<MiddlewareRequest> | MiddlewareRequest;
|
|
11
|
+
/** Transform response after receiving */
|
|
12
|
+
transformResponse?: (response: MiddlewareResponse) => Promise<MiddlewareResponse> | MiddlewareResponse;
|
|
13
|
+
/** Handle errors */
|
|
14
|
+
onError?: (error: Error) => Promise<void> | void;
|
|
15
|
+
}
|
|
16
|
+
export interface MiddlewareRequest {
|
|
17
|
+
model: string;
|
|
18
|
+
prompt?: string;
|
|
19
|
+
messages?: any[];
|
|
20
|
+
system?: string;
|
|
21
|
+
tools?: Record<string, any>;
|
|
22
|
+
[key: string]: any;
|
|
23
|
+
}
|
|
24
|
+
export interface MiddlewareResponse {
|
|
25
|
+
text?: string;
|
|
26
|
+
object?: any;
|
|
27
|
+
toolCalls?: any[];
|
|
28
|
+
usage?: {
|
|
29
|
+
promptTokens: number;
|
|
30
|
+
completionTokens: number;
|
|
31
|
+
totalTokens: number;
|
|
32
|
+
};
|
|
33
|
+
[key: string]: any;
|
|
34
|
+
}
|
|
35
|
+
export interface MiddlewareConfig {
|
|
36
|
+
/** Enable caching */
|
|
37
|
+
cache?: boolean;
|
|
38
|
+
/** Cache TTL in seconds */
|
|
39
|
+
cacheTTL?: number;
|
|
40
|
+
/** Enable logging */
|
|
41
|
+
logging?: boolean;
|
|
42
|
+
/** Log level */
|
|
43
|
+
logLevel?: 'debug' | 'info' | 'warn' | 'error';
|
|
44
|
+
/** Custom middlewares */
|
|
45
|
+
middlewares?: Middleware[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create a caching middleware.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* const cachingMiddleware = createCachingMiddleware({
|
|
53
|
+
* ttl: 3600, // 1 hour
|
|
54
|
+
* keyGenerator: (request) => `${request.model}:${request.prompt}`
|
|
55
|
+
* });
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function createCachingMiddleware(options?: {
|
|
59
|
+
ttl?: number;
|
|
60
|
+
keyGenerator?: (request: MiddlewareRequest) => string;
|
|
61
|
+
storage?: {
|
|
62
|
+
get: (key: string) => Promise<any>;
|
|
63
|
+
set: (key: string, value: any, ttl?: number) => Promise<void>;
|
|
64
|
+
};
|
|
65
|
+
}): Middleware;
|
|
66
|
+
/**
|
|
67
|
+
* Create a logging middleware.
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* const loggingMiddleware = createLoggingMiddleware({
|
|
72
|
+
* level: 'debug',
|
|
73
|
+
* onRequest: (request) => console.log('Request:', request),
|
|
74
|
+
* onResponse: (response) => console.log('Response:', response)
|
|
75
|
+
* });
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare function createLoggingMiddleware(options?: {
|
|
79
|
+
level?: 'debug' | 'info' | 'warn' | 'error';
|
|
80
|
+
onRequest?: (request: MiddlewareRequest) => void;
|
|
81
|
+
onResponse?: (response: MiddlewareResponse) => void;
|
|
82
|
+
onError?: (error: Error) => void;
|
|
83
|
+
}): Middleware;
|
|
84
|
+
/**
|
|
85
|
+
* Wrap a model with middleware.
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* const wrappedModel = wrapModel(model, [
|
|
90
|
+
* createCachingMiddleware(),
|
|
91
|
+
* createLoggingMiddleware()
|
|
92
|
+
* ]);
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export declare function wrapModel(model: any, middlewares: Middleware[]): any;
|
|
96
|
+
/**
|
|
97
|
+
* Apply middleware to a request/response cycle.
|
|
98
|
+
*/
|
|
99
|
+
export declare function applyMiddleware(middlewares: Middleware[], request: MiddlewareRequest, execute: (req: MiddlewareRequest) => Promise<MiddlewareResponse>): Promise<MiddlewareResponse>;
|
|
100
|
+
/**
|
|
101
|
+
* Clear the response cache.
|
|
102
|
+
*/
|
|
103
|
+
export declare function clearCache(): void;
|
|
104
|
+
/**
|
|
105
|
+
* Get cache statistics.
|
|
106
|
+
*/
|
|
107
|
+
export declare function getCacheStats(): {
|
|
108
|
+
size: number;
|
|
109
|
+
keys: string[];
|
|
110
|
+
};
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Middleware - AI SDK Wrapper
|
|
4
|
+
*
|
|
5
|
+
* Provides middleware utilities for caching, logging, and model wrapping.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.createCachingMiddleware = createCachingMiddleware;
|
|
9
|
+
exports.createLoggingMiddleware = createLoggingMiddleware;
|
|
10
|
+
exports.wrapModel = wrapModel;
|
|
11
|
+
exports.applyMiddleware = applyMiddleware;
|
|
12
|
+
exports.clearCache = clearCache;
|
|
13
|
+
exports.getCacheStats = getCacheStats;
|
|
14
|
+
// In-memory cache for middleware
|
|
15
|
+
const responseCache = new Map();
|
|
16
|
+
/**
|
|
17
|
+
* Create a caching middleware.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const cachingMiddleware = createCachingMiddleware({
|
|
22
|
+
* ttl: 3600, // 1 hour
|
|
23
|
+
* keyGenerator: (request) => `${request.model}:${request.prompt}`
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
function createCachingMiddleware(options) {
|
|
28
|
+
const ttl = options?.ttl ?? 3600;
|
|
29
|
+
const keyGenerator = options?.keyGenerator ?? defaultKeyGenerator;
|
|
30
|
+
const storage = options?.storage;
|
|
31
|
+
return {
|
|
32
|
+
name: 'caching',
|
|
33
|
+
transformRequest: async (request) => {
|
|
34
|
+
const key = keyGenerator(request);
|
|
35
|
+
if (storage) {
|
|
36
|
+
const cached = await storage.get(key);
|
|
37
|
+
if (cached) {
|
|
38
|
+
request.__cached = cached;
|
|
39
|
+
request.__cacheHit = true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const cached = responseCache.get(key);
|
|
44
|
+
if (cached && Date.now() - cached.timestamp < ttl * 1000) {
|
|
45
|
+
request.__cached = cached.response;
|
|
46
|
+
request.__cacheHit = true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
request.__cacheKey = key;
|
|
50
|
+
return request;
|
|
51
|
+
},
|
|
52
|
+
transformResponse: async (response) => {
|
|
53
|
+
const key = response.__cacheKey;
|
|
54
|
+
if (key && !response.__cacheHit) {
|
|
55
|
+
if (storage) {
|
|
56
|
+
await storage.set(key, response, ttl);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
responseCache.set(key, { response, timestamp: Date.now() });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return response;
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Create a logging middleware.
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* const loggingMiddleware = createLoggingMiddleware({
|
|
72
|
+
* level: 'debug',
|
|
73
|
+
* onRequest: (request) => console.log('Request:', request),
|
|
74
|
+
* onResponse: (response) => console.log('Response:', response)
|
|
75
|
+
* });
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
function createLoggingMiddleware(options) {
|
|
79
|
+
const level = options?.level ?? 'info';
|
|
80
|
+
const log = (msg, data) => {
|
|
81
|
+
const timestamp = new Date().toISOString();
|
|
82
|
+
console[level](`[${timestamp}] ${msg}`, data ?? '');
|
|
83
|
+
};
|
|
84
|
+
return {
|
|
85
|
+
name: 'logging',
|
|
86
|
+
transformRequest: async (request) => {
|
|
87
|
+
log('AI Request', { model: request.model, hasPrompt: !!request.prompt, hasMessages: !!request.messages });
|
|
88
|
+
options?.onRequest?.(request);
|
|
89
|
+
return request;
|
|
90
|
+
},
|
|
91
|
+
transformResponse: async (response) => {
|
|
92
|
+
log('AI Response', { hasText: !!response.text, hasObject: !!response.object, usage: response.usage });
|
|
93
|
+
options?.onResponse?.(response);
|
|
94
|
+
return response;
|
|
95
|
+
},
|
|
96
|
+
onError: async (error) => {
|
|
97
|
+
log('AI Error', { message: error.message });
|
|
98
|
+
options?.onError?.(error);
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Wrap a model with middleware.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```typescript
|
|
107
|
+
* const wrappedModel = wrapModel(model, [
|
|
108
|
+
* createCachingMiddleware(),
|
|
109
|
+
* createLoggingMiddleware()
|
|
110
|
+
* ]);
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
function wrapModel(model, middlewares) {
|
|
114
|
+
// This is a placeholder - actual implementation would wrap the model's
|
|
115
|
+
// doGenerate and doStream methods with middleware transformations
|
|
116
|
+
return {
|
|
117
|
+
...model,
|
|
118
|
+
__middlewares: middlewares,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Apply middleware to a request/response cycle.
|
|
123
|
+
*/
|
|
124
|
+
async function applyMiddleware(middlewares, request, execute) {
|
|
125
|
+
// Transform request through all middlewares
|
|
126
|
+
let transformedRequest = request;
|
|
127
|
+
for (const middleware of middlewares) {
|
|
128
|
+
if (middleware.transformRequest) {
|
|
129
|
+
transformedRequest = await middleware.transformRequest(transformedRequest);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Check for cache hit
|
|
133
|
+
if (transformedRequest.__cacheHit) {
|
|
134
|
+
return transformedRequest.__cached;
|
|
135
|
+
}
|
|
136
|
+
// Execute the actual request
|
|
137
|
+
let response;
|
|
138
|
+
try {
|
|
139
|
+
response = await execute(transformedRequest);
|
|
140
|
+
response.__cacheKey = transformedRequest.__cacheKey;
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
// Handle errors through middlewares
|
|
144
|
+
for (const middleware of middlewares) {
|
|
145
|
+
if (middleware.onError) {
|
|
146
|
+
await middleware.onError(error);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
// Transform response through all middlewares (in reverse order)
|
|
152
|
+
let transformedResponse = response;
|
|
153
|
+
for (const middleware of [...middlewares].reverse()) {
|
|
154
|
+
if (middleware.transformResponse) {
|
|
155
|
+
transformedResponse = await middleware.transformResponse(transformedResponse);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return transformedResponse;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Default cache key generator.
|
|
162
|
+
*/
|
|
163
|
+
function defaultKeyGenerator(request) {
|
|
164
|
+
const parts = [
|
|
165
|
+
request.model,
|
|
166
|
+
request.prompt || '',
|
|
167
|
+
JSON.stringify(request.messages || []),
|
|
168
|
+
request.system || '',
|
|
169
|
+
];
|
|
170
|
+
return parts.join(':').slice(0, 256);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Clear the response cache.
|
|
174
|
+
*/
|
|
175
|
+
function clearCache() {
|
|
176
|
+
responseCache.clear();
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get cache statistics.
|
|
180
|
+
*/
|
|
181
|
+
function getCacheStats() {
|
|
182
|
+
return {
|
|
183
|
+
size: responseCache.size,
|
|
184
|
+
keys: Array.from(responseCache.keys()),
|
|
185
|
+
};
|
|
186
|
+
}
|