@mcpmesh/sdk 0.8.0-beta.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/__tests__/claude-handler.test.d.ts +7 -0
- package/dist/__tests__/claude-handler.test.d.ts.map +1 -0
- package/dist/__tests__/claude-handler.test.js +455 -0
- package/dist/__tests__/claude-handler.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +7 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +156 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/errors.test.d.ts +7 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +170 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/generic-handler.test.d.ts +7 -0
- package/dist/__tests__/generic-handler.test.d.ts.map +1 -0
- package/dist/__tests__/generic-handler.test.js +243 -0
- package/dist/__tests__/generic-handler.test.js.map +1 -0
- package/dist/__tests__/llm-provider.test.d.ts +7 -0
- package/dist/__tests__/llm-provider.test.d.ts.map +1 -0
- package/dist/__tests__/llm-provider.test.js +217 -0
- package/dist/__tests__/llm-provider.test.js.map +1 -0
- package/dist/__tests__/openai-handler.test.d.ts +7 -0
- package/dist/__tests__/openai-handler.test.d.ts.map +1 -0
- package/dist/__tests__/openai-handler.test.js +359 -0
- package/dist/__tests__/openai-handler.test.js.map +1 -0
- package/dist/__tests__/provider-handler-registry.test.d.ts +9 -0
- package/dist/__tests__/provider-handler-registry.test.d.ts.map +1 -0
- package/dist/__tests__/provider-handler-registry.test.js +187 -0
- package/dist/__tests__/provider-handler-registry.test.js.map +1 -0
- package/dist/__tests__/response-parser.test.d.ts +7 -0
- package/dist/__tests__/response-parser.test.d.ts.map +1 -0
- package/dist/__tests__/response-parser.test.js +360 -0
- package/dist/__tests__/response-parser.test.js.map +1 -0
- package/dist/__tests__/route.test.d.ts +7 -0
- package/dist/__tests__/route.test.d.ts.map +1 -0
- package/dist/__tests__/route.test.js +281 -0
- package/dist/__tests__/route.test.js.map +1 -0
- package/dist/__tests__/sse.test.d.ts +7 -0
- package/dist/__tests__/sse.test.d.ts.map +1 -0
- package/dist/__tests__/sse.test.js +172 -0
- package/dist/__tests__/sse.test.js.map +1 -0
- package/dist/__tests__/template.test.d.ts +7 -0
- package/dist/__tests__/template.test.d.ts.map +1 -0
- package/dist/__tests__/template.test.js +176 -0
- package/dist/__tests__/template.test.js.map +1 -0
- package/dist/__tests__/tracing.test.d.ts +7 -0
- package/dist/__tests__/tracing.test.d.ts.map +1 -0
- package/dist/__tests__/tracing.test.js +264 -0
- package/dist/__tests__/tracing.test.js.map +1 -0
- package/dist/agent.d.ts +165 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +626 -0
- package/dist/agent.js.map +1 -0
- package/dist/api-runtime.d.ts +166 -0
- package/dist/api-runtime.d.ts.map +1 -0
- package/dist/api-runtime.js +459 -0
- package/dist/api-runtime.js.map +1 -0
- package/dist/config.d.ts +31 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +60 -0
- package/dist/config.js.map +1 -0
- package/dist/debug.d.ts +47 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +86 -0
- package/dist/debug.js.map +1 -0
- package/dist/errors.d.ts +99 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +110 -0
- package/dist/errors.js.map +1 -0
- package/dist/express.d.ts +146 -0
- package/dist/express.d.ts.map +1 -0
- package/dist/express.js +371 -0
- package/dist/express.js.map +1 -0
- package/dist/index.d.ts +96 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/dist/llm-agent.d.ts +193 -0
- package/dist/llm-agent.d.ts.map +1 -0
- package/dist/llm-agent.js +634 -0
- package/dist/llm-agent.js.map +1 -0
- package/dist/llm-provider.d.ts +323 -0
- package/dist/llm-provider.d.ts.map +1 -0
- package/dist/llm-provider.js +446 -0
- package/dist/llm-provider.js.map +1 -0
- package/dist/llm.d.ts +194 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +304 -0
- package/dist/llm.js.map +1 -0
- package/dist/provider-handlers/claude-handler.d.ts +98 -0
- package/dist/provider-handlers/claude-handler.d.ts.map +1 -0
- package/dist/provider-handlers/claude-handler.js +268 -0
- package/dist/provider-handlers/claude-handler.js.map +1 -0
- package/dist/provider-handlers/gemini-handler.d.ts +82 -0
- package/dist/provider-handlers/gemini-handler.d.ts.map +1 -0
- package/dist/provider-handlers/gemini-handler.js +152 -0
- package/dist/provider-handlers/gemini-handler.js.map +1 -0
- package/dist/provider-handlers/generic-handler.d.ts +78 -0
- package/dist/provider-handlers/generic-handler.d.ts.map +1 -0
- package/dist/provider-handlers/generic-handler.js +152 -0
- package/dist/provider-handlers/generic-handler.js.map +1 -0
- package/dist/provider-handlers/index.d.ts +29 -0
- package/dist/provider-handlers/index.d.ts.map +1 -0
- package/dist/provider-handlers/index.js +32 -0
- package/dist/provider-handlers/index.js.map +1 -0
- package/dist/provider-handlers/openai-handler.d.ts +86 -0
- package/dist/provider-handlers/openai-handler.d.ts.map +1 -0
- package/dist/provider-handlers/openai-handler.js +160 -0
- package/dist/provider-handlers/openai-handler.js.map +1 -0
- package/dist/provider-handlers/provider-handler-registry.d.ts +124 -0
- package/dist/provider-handlers/provider-handler-registry.d.ts.map +1 -0
- package/dist/provider-handlers/provider-handler-registry.js +180 -0
- package/dist/provider-handlers/provider-handler-registry.js.map +1 -0
- package/dist/provider-handlers/provider-handler.d.ts +245 -0
- package/dist/provider-handlers/provider-handler.d.ts.map +1 -0
- package/dist/provider-handlers/provider-handler.js +238 -0
- package/dist/provider-handlers/provider-handler.js.map +1 -0
- package/dist/proxy.d.ts +44 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +324 -0
- package/dist/proxy.js.map +1 -0
- package/dist/response-parser.d.ts +103 -0
- package/dist/response-parser.d.ts.map +1 -0
- package/dist/response-parser.js +232 -0
- package/dist/response-parser.js.map +1 -0
- package/dist/route.d.ts +185 -0
- package/dist/route.d.ts.map +1 -0
- package/dist/route.js +310 -0
- package/dist/route.js.map +1 -0
- package/dist/sse.d.ts +45 -0
- package/dist/sse.d.ts.map +1 -0
- package/dist/sse.js +77 -0
- package/dist/sse.js.map +1 -0
- package/dist/template.d.ts +86 -0
- package/dist/template.d.ts.map +1 -0
- package/dist/template.js +206 -0
- package/dist/template.js.map +1 -0
- package/dist/tracing.d.ts +88 -0
- package/dist/tracing.d.ts.map +1 -0
- package/dist/tracing.js +193 -0
- package/dist/tracing.js.map +1 -0
- package/dist/types.d.ts +618 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Provider implementation for @mcpmesh/sdk.
|
|
3
|
+
*
|
|
4
|
+
* Provides mesh.llmProvider() for zero-code LLM providers using Vercel AI SDK.
|
|
5
|
+
* This is the TypeScript equivalent of Python's @mesh.llm_provider decorator.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { FastMCP } from "fastmcp";
|
|
10
|
+
* import { mesh } from "@mcpmesh/sdk";
|
|
11
|
+
*
|
|
12
|
+
* const server = new FastMCP({ name: "Claude Provider", version: "1.0.0" });
|
|
13
|
+
*
|
|
14
|
+
* // Zero-code LLM provider
|
|
15
|
+
* server.addTool(mesh.llmProvider({
|
|
16
|
+
* model: "anthropic/claude-sonnet-4-5",
|
|
17
|
+
* capability: "llm",
|
|
18
|
+
* tags: ["llm", "claude", "anthropic", "provider"],
|
|
19
|
+
* }));
|
|
20
|
+
*
|
|
21
|
+
* const agent = mesh(server, { name: "claude-provider", port: 9011 });
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
import { z } from "zod";
|
|
25
|
+
import { createDebug } from "./debug.js";
|
|
26
|
+
import { ProviderHandlerRegistry } from "./provider-handlers/index.js";
|
|
27
|
+
const debug = createDebug("llm-provider");
|
|
28
|
+
// ============================================================================
|
|
29
|
+
// Vendor Extraction
|
|
30
|
+
// ============================================================================
|
|
31
|
+
/**
|
|
32
|
+
* Known vendors and their Vercel AI SDK provider import paths.
|
|
33
|
+
*/
|
|
34
|
+
const VENDOR_PROVIDERS = {
|
|
35
|
+
anthropic: "@ai-sdk/anthropic",
|
|
36
|
+
openai: "@ai-sdk/openai",
|
|
37
|
+
google: "@ai-sdk/google",
|
|
38
|
+
gemini: "@ai-sdk/google", // gemini/ model prefix uses Google AI SDK
|
|
39
|
+
// Can extend with more providers as needed
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Mapping from vendor name to the export name in the provider module.
|
|
43
|
+
* Most providers export a function with the same name as the vendor,
|
|
44
|
+
* but some (like gemini) use a different name (google).
|
|
45
|
+
*/
|
|
46
|
+
const VENDOR_EXPORTS = {
|
|
47
|
+
gemini: "google", // @ai-sdk/google exports 'google', not 'gemini'
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Normalize environment variables for cross-SDK compatibility.
|
|
51
|
+
*
|
|
52
|
+
* Different SDKs use different env var names:
|
|
53
|
+
* - Python/LiteLLM: GOOGLE_API_KEY
|
|
54
|
+
* - Vercel AI SDK: GOOGLE_GENERATIVE_AI_API_KEY
|
|
55
|
+
*
|
|
56
|
+
* This function ensures either env var works for both SDKs.
|
|
57
|
+
*/
|
|
58
|
+
function normalizeEnvVars(vendor) {
|
|
59
|
+
if (vendor === "gemini" || vendor === "google") {
|
|
60
|
+
// Vercel AI SDK expects GOOGLE_GENERATIVE_AI_API_KEY
|
|
61
|
+
// LiteLLM expects GOOGLE_API_KEY
|
|
62
|
+
// Support both by copying if one is set but not the other
|
|
63
|
+
const vercelKey = process.env.GOOGLE_GENERATIVE_AI_API_KEY;
|
|
64
|
+
const litellmKey = process.env.GOOGLE_API_KEY;
|
|
65
|
+
if (!vercelKey && litellmKey) {
|
|
66
|
+
process.env.GOOGLE_GENERATIVE_AI_API_KEY = litellmKey;
|
|
67
|
+
debug("Set GOOGLE_GENERATIVE_AI_API_KEY from GOOGLE_API_KEY");
|
|
68
|
+
}
|
|
69
|
+
else if (vercelKey && !litellmKey) {
|
|
70
|
+
process.env.GOOGLE_API_KEY = vercelKey;
|
|
71
|
+
debug("Set GOOGLE_API_KEY from GOOGLE_GENERATIVE_AI_API_KEY");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Extract vendor name from model string.
|
|
77
|
+
*
|
|
78
|
+
* Uses vendor/model format (e.g., "anthropic/claude-sonnet-4-5" → "anthropic").
|
|
79
|
+
*
|
|
80
|
+
* @param model - Model string (e.g., "anthropic/claude-sonnet-4-5")
|
|
81
|
+
* @returns Vendor name or null if not extractable
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* extractVendorFromModel("anthropic/claude-sonnet-4-5") // "anthropic"
|
|
86
|
+
* extractVendorFromModel("openai/gpt-4o") // "openai"
|
|
87
|
+
* extractVendorFromModel("gpt-4") // null
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
export function extractVendorFromModel(model) {
|
|
91
|
+
if (!model) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
if (model.includes("/")) {
|
|
95
|
+
const vendor = model.split("/")[0].toLowerCase().trim();
|
|
96
|
+
return vendor || null;
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Extract model name without vendor prefix.
|
|
102
|
+
*
|
|
103
|
+
* @param model - Model string (e.g., "anthropic/claude-sonnet-4-5")
|
|
104
|
+
* @returns Model name without vendor prefix
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```typescript
|
|
108
|
+
* extractModelName("anthropic/claude-sonnet-4-5") // "claude-sonnet-4-5"
|
|
109
|
+
* extractModelName("gpt-4") // "gpt-4"
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export function extractModelName(model) {
|
|
113
|
+
if (model.includes("/")) {
|
|
114
|
+
return model.split("/").slice(1).join("/");
|
|
115
|
+
}
|
|
116
|
+
return model;
|
|
117
|
+
}
|
|
118
|
+
// ============================================================================
|
|
119
|
+
// Vercel AI SDK Integration
|
|
120
|
+
// ============================================================================
|
|
121
|
+
/**
|
|
122
|
+
* Dynamically load a Vercel AI SDK provider.
|
|
123
|
+
*
|
|
124
|
+
* @param vendor - Vendor name (e.g., "anthropic", "openai")
|
|
125
|
+
* @returns Provider create function or null if not available
|
|
126
|
+
*/
|
|
127
|
+
async function loadProvider(vendor) {
|
|
128
|
+
// Normalize environment variables for cross-SDK compatibility
|
|
129
|
+
normalizeEnvVars(vendor);
|
|
130
|
+
const providerPath = VENDOR_PROVIDERS[vendor];
|
|
131
|
+
if (!providerPath) {
|
|
132
|
+
debug(`Unknown vendor: ${vendor}`);
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
// Dynamic import of the provider module
|
|
137
|
+
const providerModule = (await import(providerPath));
|
|
138
|
+
// Get the export name (may differ from vendor name, e.g., gemini -> google)
|
|
139
|
+
const exportName = VENDOR_EXPORTS[vendor] ?? vendor;
|
|
140
|
+
// Each provider exports a function with the vendor name (e.g., anthropic, openai)
|
|
141
|
+
const createModel = providerModule[exportName];
|
|
142
|
+
if (typeof createModel !== "function") {
|
|
143
|
+
debug(`Provider ${vendor} does not export a model creator function (looked for '${exportName}')`);
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
return createModel;
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
debug(`Failed to load provider ${vendor}: ${err}`);
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Convert LlmMessage array to base format for Vercel AI SDK.
|
|
155
|
+
*
|
|
156
|
+
* NOTE: This is a simple pass-through conversion. Vendor-specific message
|
|
157
|
+
* transformations (e.g., Anthropic's tool-call content blocks) are handled
|
|
158
|
+
* by the provider handlers in their prepareRequest() method.
|
|
159
|
+
*/
|
|
160
|
+
function convertToVercelMessages(messages) {
|
|
161
|
+
// Pass through - the handler.prepareRequest() has already transformed messages
|
|
162
|
+
// for the specific vendor format
|
|
163
|
+
return messages;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Convert Vercel AI SDK v6 tool calls to standard format.
|
|
167
|
+
*/
|
|
168
|
+
function convertToolCalls(toolCalls) {
|
|
169
|
+
return toolCalls.map((tc) => ({
|
|
170
|
+
id: tc.toolCallId,
|
|
171
|
+
type: "function",
|
|
172
|
+
function: {
|
|
173
|
+
name: tc.toolName,
|
|
174
|
+
arguments: JSON.stringify(tc.args ?? {}),
|
|
175
|
+
},
|
|
176
|
+
}));
|
|
177
|
+
}
|
|
178
|
+
// ============================================================================
|
|
179
|
+
// LLM Provider Implementation
|
|
180
|
+
// ============================================================================
|
|
181
|
+
/**
|
|
182
|
+
* Zod schema for MeshLlmRequest input.
|
|
183
|
+
*/
|
|
184
|
+
const MeshLlmRequestSchema = z.object({
|
|
185
|
+
request: z.object({
|
|
186
|
+
messages: z.array(z.object({
|
|
187
|
+
role: z.enum(["system", "user", "assistant", "tool"]),
|
|
188
|
+
content: z.string().nullable(),
|
|
189
|
+
tool_calls: z
|
|
190
|
+
.array(z.object({
|
|
191
|
+
id: z.string(),
|
|
192
|
+
type: z.literal("function"),
|
|
193
|
+
function: z.object({
|
|
194
|
+
name: z.string(),
|
|
195
|
+
arguments: z.string(),
|
|
196
|
+
}),
|
|
197
|
+
}))
|
|
198
|
+
.optional(),
|
|
199
|
+
tool_call_id: z.string().optional(),
|
|
200
|
+
name: z.string().optional(),
|
|
201
|
+
})),
|
|
202
|
+
tools: z
|
|
203
|
+
.array(z.object({
|
|
204
|
+
type: z.literal("function"),
|
|
205
|
+
function: z.object({
|
|
206
|
+
name: z.string(),
|
|
207
|
+
description: z.string().optional(),
|
|
208
|
+
parameters: z.record(z.unknown()).optional(),
|
|
209
|
+
}),
|
|
210
|
+
}))
|
|
211
|
+
.nullish(),
|
|
212
|
+
model_params: z.record(z.unknown()).nullish(),
|
|
213
|
+
context: z.record(z.unknown()).nullish(),
|
|
214
|
+
request_id: z.string().nullish(),
|
|
215
|
+
caller_agent: z.string().nullish(),
|
|
216
|
+
}),
|
|
217
|
+
});
|
|
218
|
+
/**
|
|
219
|
+
* Create a zero-code LLM provider tool definition.
|
|
220
|
+
*
|
|
221
|
+
* This is the TypeScript equivalent of Python's @mesh.llm_provider decorator.
|
|
222
|
+
* It generates a process_chat function that handles MeshLlmRequest and returns
|
|
223
|
+
* MeshLlmResponse with tool_calls and usage metadata.
|
|
224
|
+
*
|
|
225
|
+
* @param config - LLM provider configuration
|
|
226
|
+
* @returns fastmcp tool definition
|
|
227
|
+
*
|
|
228
|
+
* @example
|
|
229
|
+
* ```typescript
|
|
230
|
+
* import { FastMCP } from "fastmcp";
|
|
231
|
+
* import { mesh } from "@mcpmesh/sdk";
|
|
232
|
+
*
|
|
233
|
+
* const server = new FastMCP({ name: "Claude Provider", version: "1.0.0" });
|
|
234
|
+
*
|
|
235
|
+
* server.addTool(mesh.llmProvider({
|
|
236
|
+
* model: "anthropic/claude-sonnet-4-5",
|
|
237
|
+
* capability: "llm",
|
|
238
|
+
* tags: ["llm", "claude", "anthropic", "provider"],
|
|
239
|
+
* maxOutputTokens: 4096,
|
|
240
|
+
* temperature: 0.7,
|
|
241
|
+
* }));
|
|
242
|
+
*
|
|
243
|
+
* const agent = mesh(server, { name: "claude-provider", port: 9011 });
|
|
244
|
+
* ```
|
|
245
|
+
*/
|
|
246
|
+
export function llmProvider(config) {
|
|
247
|
+
const { model, capability = "llm", tags = [], version = "1.0.0", maxOutputTokens: maxTokens, temperature, topP, name = "process_chat", description = `LLM provider using ${model}`, } = config;
|
|
248
|
+
// Extract vendor from model
|
|
249
|
+
const vendor = extractVendorFromModel(model) ?? "unknown";
|
|
250
|
+
debug(`Creating LLM provider: model=${model}, vendor=${vendor}, capability=${capability}`);
|
|
251
|
+
// Cache the loaded provider
|
|
252
|
+
let cachedProvider = null;
|
|
253
|
+
let providerLoadAttempted = false;
|
|
254
|
+
/**
|
|
255
|
+
* Process a chat request using Vercel AI SDK.
|
|
256
|
+
*/
|
|
257
|
+
const execute = async (args) => {
|
|
258
|
+
try {
|
|
259
|
+
const { request } = args;
|
|
260
|
+
const startTime = Date.now();
|
|
261
|
+
debug(`Processing chat request: messages=${request.messages.length}, tools=${request.tools?.length ?? 0}`);
|
|
262
|
+
// Determine effective model (check for consumer override)
|
|
263
|
+
let effectiveModel = model;
|
|
264
|
+
const modelParams = { ...(request.model_params ?? {}) };
|
|
265
|
+
if (modelParams.model && typeof modelParams.model === "string") {
|
|
266
|
+
const overrideModel = modelParams.model;
|
|
267
|
+
delete modelParams.model; // Remove to avoid duplication
|
|
268
|
+
// Validate vendor compatibility
|
|
269
|
+
const overrideVendor = extractVendorFromModel(overrideModel);
|
|
270
|
+
if (overrideVendor && overrideVendor !== vendor) {
|
|
271
|
+
// Vendor mismatch - log warning and fall back to provider's model
|
|
272
|
+
debug(`Model override '${overrideModel}' ignored - vendor mismatch ` +
|
|
273
|
+
`(override vendor: '${overrideVendor}', provider vendor: '${vendor}'). ` +
|
|
274
|
+
`Using provider's default model: '${model}'`);
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
// Vendor matches or can't be determined - use override
|
|
278
|
+
effectiveModel = overrideModel;
|
|
279
|
+
debug(`Using model override '${effectiveModel}' (requested by consumer)`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
const effectiveModelName = extractModelName(effectiveModel);
|
|
283
|
+
// Load provider if not cached
|
|
284
|
+
if (!providerLoadAttempted) {
|
|
285
|
+
providerLoadAttempted = true;
|
|
286
|
+
cachedProvider = await loadProvider(vendor);
|
|
287
|
+
}
|
|
288
|
+
if (!cachedProvider) {
|
|
289
|
+
throw new Error(`Vercel AI SDK provider for '${vendor}' not available. ` +
|
|
290
|
+
`Install: npm install ${VENDOR_PROVIDERS[vendor] ?? `@ai-sdk/${vendor}`}`);
|
|
291
|
+
}
|
|
292
|
+
// Create the model instance
|
|
293
|
+
const aiModel = cachedProvider(effectiveModelName);
|
|
294
|
+
// Get vendor-specific handler for optimizations
|
|
295
|
+
const handler = ProviderHandlerRegistry.getHandler(vendor);
|
|
296
|
+
debug(`Using provider handler: ${handler.constructor.name} for vendor: ${vendor}`);
|
|
297
|
+
// Import generateText from ai package
|
|
298
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
299
|
+
const aiModule = await import("ai");
|
|
300
|
+
const generateText = aiModule.generateText;
|
|
301
|
+
// Convert tools to Vercel AI SDK format
|
|
302
|
+
// Note: Vercel AI SDK expects Zod schemas for parameters, but we receive JSON Schema
|
|
303
|
+
// from MCP tools. We use jsonSchema() from the AI SDK to wrap JSON Schema properly.
|
|
304
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
305
|
+
let vercelTools;
|
|
306
|
+
if (request.tools && request.tools.length > 0) {
|
|
307
|
+
// Import jsonSchema helper from ai package
|
|
308
|
+
const { jsonSchema } = aiModule;
|
|
309
|
+
vercelTools = {};
|
|
310
|
+
for (const tool of request.tools) {
|
|
311
|
+
// Get the raw schema parameters
|
|
312
|
+
const rawSchema = tool.function.parameters ?? { type: "object", properties: {} };
|
|
313
|
+
// Clean up schema for AI SDK compatibility:
|
|
314
|
+
// - Remove $schema field (not needed for API calls)
|
|
315
|
+
// - Ensure type: "object" is present (required by Anthropic API)
|
|
316
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
317
|
+
const { $schema, ...schemaWithoutMeta } = rawSchema;
|
|
318
|
+
const cleanSchema = {
|
|
319
|
+
type: "object", // Ensure type is always present
|
|
320
|
+
...schemaWithoutMeta,
|
|
321
|
+
};
|
|
322
|
+
debug(`Tool '${tool.function.name}' schema: ${JSON.stringify(cleanSchema)}`);
|
|
323
|
+
vercelTools[tool.function.name] = {
|
|
324
|
+
description: tool.function.description ?? "",
|
|
325
|
+
inputSchema: jsonSchema(cleanSchema),
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
// Apply vendor-specific request preparation (e.g., Claude prompt caching)
|
|
330
|
+
// The handler may transform messages or add vendor-specific options
|
|
331
|
+
const preparedRequest = handler.prepareRequest(request.messages, null, // tools handled separately for Vercel AI SDK
|
|
332
|
+
null, // no output schema for provider passthrough
|
|
333
|
+
{
|
|
334
|
+
temperature: temperature ?? modelParams.temperature,
|
|
335
|
+
maxOutputTokens: maxTokens ?? modelParams.max_tokens,
|
|
336
|
+
topP: topP ?? modelParams.top_p,
|
|
337
|
+
});
|
|
338
|
+
// Build request options - use explicit object construction to avoid spread type issues
|
|
339
|
+
const convertedMessages = convertToVercelMessages(preparedRequest.messages);
|
|
340
|
+
debug(`Messages to AI SDK: ${JSON.stringify(convertedMessages, null, 2)}`);
|
|
341
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
342
|
+
const requestOptions = {
|
|
343
|
+
model: aiModel,
|
|
344
|
+
messages: convertedMessages,
|
|
345
|
+
};
|
|
346
|
+
// Add tools if present
|
|
347
|
+
if (vercelTools && Object.keys(vercelTools).length > 0) {
|
|
348
|
+
requestOptions.tools = vercelTools;
|
|
349
|
+
}
|
|
350
|
+
// Apply default config values
|
|
351
|
+
if (maxTokens) {
|
|
352
|
+
requestOptions.maxOutputTokens = maxTokens;
|
|
353
|
+
}
|
|
354
|
+
if (temperature !== undefined) {
|
|
355
|
+
requestOptions.temperature = temperature;
|
|
356
|
+
}
|
|
357
|
+
if (topP !== undefined) {
|
|
358
|
+
requestOptions.topP = topP;
|
|
359
|
+
}
|
|
360
|
+
// Apply model_params overrides (take precedence)
|
|
361
|
+
if (modelParams.max_tokens) {
|
|
362
|
+
requestOptions.maxOutputTokens = modelParams.max_tokens;
|
|
363
|
+
}
|
|
364
|
+
if (modelParams.temperature !== undefined) {
|
|
365
|
+
requestOptions.temperature = modelParams.temperature;
|
|
366
|
+
}
|
|
367
|
+
if (modelParams.top_p !== undefined) {
|
|
368
|
+
requestOptions.topP = modelParams.top_p;
|
|
369
|
+
}
|
|
370
|
+
debug(`Calling Vercel AI SDK: model=${effectiveModelName}`);
|
|
371
|
+
// Call the model
|
|
372
|
+
const result = await generateText(requestOptions);
|
|
373
|
+
const latencyMs = Date.now() - startTime;
|
|
374
|
+
debug(`LLM response received: ` +
|
|
375
|
+
`finishReason=${result.finishReason}, ` +
|
|
376
|
+
`toolCalls=${result.toolCalls?.length ?? 0}, ` +
|
|
377
|
+
`latency=${latencyMs}ms`);
|
|
378
|
+
// Build response
|
|
379
|
+
const response = {
|
|
380
|
+
role: "assistant",
|
|
381
|
+
content: result.text ?? "",
|
|
382
|
+
};
|
|
383
|
+
// Include tool_calls if present (critical for agentic loop!)
|
|
384
|
+
if (result.toolCalls && result.toolCalls.length > 0) {
|
|
385
|
+
response.tool_calls = convertToolCalls(result.toolCalls);
|
|
386
|
+
}
|
|
387
|
+
// Include usage metadata for cost tracking
|
|
388
|
+
if (result.usage) {
|
|
389
|
+
const usage = {
|
|
390
|
+
prompt_tokens: result.usage.inputTokens ?? 0,
|
|
391
|
+
completion_tokens: result.usage.outputTokens ?? 0,
|
|
392
|
+
model: effectiveModel,
|
|
393
|
+
};
|
|
394
|
+
response._mesh_usage = usage;
|
|
395
|
+
}
|
|
396
|
+
debug(`LLM provider processed request ` +
|
|
397
|
+
`(model=${effectiveModel}, messages=${request.messages.length}, ` +
|
|
398
|
+
`tool_calls=${response.tool_calls?.length ?? 0})`);
|
|
399
|
+
// Return JSON-stringified response
|
|
400
|
+
// The consumer (MeshDelegatedProvider.complete) expects content.text to be
|
|
401
|
+
// a JSON string that it can parse to get the MeshLlmResponse object.
|
|
402
|
+
// FastMCP wraps this in { content: [{ type: "text", text: <return_value> }] }
|
|
403
|
+
return JSON.stringify(response);
|
|
404
|
+
}
|
|
405
|
+
catch (err) {
|
|
406
|
+
console.error("[llm-provider] execute error:", err);
|
|
407
|
+
if (err instanceof Error) {
|
|
408
|
+
console.error("[llm-provider] stack:", err.stack);
|
|
409
|
+
}
|
|
410
|
+
throw err;
|
|
411
|
+
}
|
|
412
|
+
};
|
|
413
|
+
// Build the tool definition
|
|
414
|
+
const toolDef = {
|
|
415
|
+
name,
|
|
416
|
+
description,
|
|
417
|
+
parameters: MeshLlmRequestSchema,
|
|
418
|
+
execute,
|
|
419
|
+
// Attach mesh metadata for registration
|
|
420
|
+
_meshMeta: {
|
|
421
|
+
capability,
|
|
422
|
+
tags,
|
|
423
|
+
version,
|
|
424
|
+
vendor,
|
|
425
|
+
},
|
|
426
|
+
};
|
|
427
|
+
debug(`Created LLM provider '${name}' ` +
|
|
428
|
+
`(model=${model}, capability=${capability}, tags=${JSON.stringify(tags)}, vendor=${vendor})`);
|
|
429
|
+
return toolDef;
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Check if a tool definition is an LLM provider.
|
|
433
|
+
*/
|
|
434
|
+
export function isLlmProviderTool(tool) {
|
|
435
|
+
return (typeof tool === "object" &&
|
|
436
|
+
tool !== null &&
|
|
437
|
+
"_meshMeta" in tool &&
|
|
438
|
+
typeof tool._meshMeta === "object");
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Get LLM provider metadata from a tool definition.
|
|
442
|
+
*/
|
|
443
|
+
export function getLlmProviderMeta(tool) {
|
|
444
|
+
return tool._meshMeta ?? null;
|
|
445
|
+
}
|
|
446
|
+
//# sourceMappingURL=llm-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-provider.js","sourceRoot":"","sources":["../src/llm-provider.ts"],"names":[],"mappings":"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"}
|
package/dist/llm.d.ts
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mesh.llm() - LLM-powered tool wrapper for MCP Mesh.
|
|
3
|
+
*
|
|
4
|
+
* Creates a tool that uses an LLM with agentic capabilities,
|
|
5
|
+
* including access to other mesh tools and structured output.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { FastMCP } from "fastmcp";
|
|
10
|
+
* import { mesh } from "@mcpmesh/sdk";
|
|
11
|
+
* import { z } from "zod";
|
|
12
|
+
*
|
|
13
|
+
* const server = new FastMCP({ name: "Smart Assistant", version: "1.0.0" });
|
|
14
|
+
*
|
|
15
|
+
* const AssistResponse = z.object({
|
|
16
|
+
* answer: z.string(),
|
|
17
|
+
* confidence: z.number(),
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* server.addTool(mesh.llm({
|
|
21
|
+
* name: "assist",
|
|
22
|
+
* capability: "smart_assistant",
|
|
23
|
+
* provider: "claude",
|
|
24
|
+
* systemPrompt: "file://prompts/assistant.hbs",
|
|
25
|
+
* filter: [{ capability: "calculator" }],
|
|
26
|
+
* returns: AssistResponse,
|
|
27
|
+
* parameters: z.object({ message: z.string() }),
|
|
28
|
+
* execute: async ({ message }, { llm }) => llm(message),
|
|
29
|
+
* }));
|
|
30
|
+
*
|
|
31
|
+
* const agent = mesh(server, { name: "smart-assistant", port: 9003 });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
import type { ZodType } from "zod";
|
|
35
|
+
import type { MeshLlmConfig, LlmProviderSpec, LlmFilterSpec, LlmFilterMode, LlmAgent, LlmToolProxy, LlmOutputMode } from "./types.js";
|
|
36
|
+
/**
|
|
37
|
+
* Registry for LLM tools - stores configuration and resolved dependencies.
|
|
38
|
+
*/
|
|
39
|
+
export declare class LlmToolRegistry {
|
|
40
|
+
private static instance;
|
|
41
|
+
/** LLM tool configurations by function ID */
|
|
42
|
+
private configs;
|
|
43
|
+
/** Resolved tools for each LLM function (from llm_tools_updated events) */
|
|
44
|
+
private resolvedTools;
|
|
45
|
+
/** Resolved providers for each LLM function (from llm_provider_available events) */
|
|
46
|
+
private resolvedProviders;
|
|
47
|
+
private constructor();
|
|
48
|
+
static getInstance(): LlmToolRegistry;
|
|
49
|
+
/**
|
|
50
|
+
* Reset the registry (for testing).
|
|
51
|
+
*/
|
|
52
|
+
static reset(): void;
|
|
53
|
+
/**
|
|
54
|
+
* Register an LLM tool configuration.
|
|
55
|
+
*/
|
|
56
|
+
register(functionId: string, config: LlmToolConfig): void;
|
|
57
|
+
/**
|
|
58
|
+
* Get an LLM tool configuration.
|
|
59
|
+
*/
|
|
60
|
+
getConfig(functionId: string): LlmToolConfig | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* Get all registered LLM tool configurations.
|
|
63
|
+
*/
|
|
64
|
+
getAllConfigs(): Map<string, LlmToolConfig>;
|
|
65
|
+
/**
|
|
66
|
+
* Update resolved tools for an LLM function.
|
|
67
|
+
*/
|
|
68
|
+
setResolvedTools(functionId: string, tools: LlmToolProxy[]): void;
|
|
69
|
+
/**
|
|
70
|
+
* Get resolved tools for an LLM function.
|
|
71
|
+
*/
|
|
72
|
+
getResolvedTools(functionId: string): LlmToolProxy[];
|
|
73
|
+
/**
|
|
74
|
+
* Update resolved provider for an LLM function.
|
|
75
|
+
*/
|
|
76
|
+
setResolvedProvider(functionId: string, provider: ResolvedProvider): void;
|
|
77
|
+
/**
|
|
78
|
+
* Remove resolved provider for an LLM function.
|
|
79
|
+
*/
|
|
80
|
+
removeResolvedProvider(functionId: string): void;
|
|
81
|
+
/**
|
|
82
|
+
* Get resolved provider for an LLM function.
|
|
83
|
+
*/
|
|
84
|
+
getResolvedProvider(functionId: string): ResolvedProvider | undefined;
|
|
85
|
+
/**
|
|
86
|
+
* Clear all resolved dependencies.
|
|
87
|
+
*/
|
|
88
|
+
clearAllResolved(): void;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Internal LLM tool configuration.
|
|
92
|
+
*/
|
|
93
|
+
export interface LlmToolConfig {
|
|
94
|
+
functionId: string;
|
|
95
|
+
name: string;
|
|
96
|
+
capability: string;
|
|
97
|
+
description: string;
|
|
98
|
+
version: string;
|
|
99
|
+
tags: string[];
|
|
100
|
+
provider: LlmProviderSpec;
|
|
101
|
+
model?: string;
|
|
102
|
+
maxIterations: number;
|
|
103
|
+
systemPrompt?: string;
|
|
104
|
+
contextParam?: string;
|
|
105
|
+
filter?: LlmFilterSpec[];
|
|
106
|
+
filterMode: LlmFilterMode;
|
|
107
|
+
maxOutputTokens?: number;
|
|
108
|
+
temperature?: number;
|
|
109
|
+
topP?: number;
|
|
110
|
+
stop?: string[];
|
|
111
|
+
inputSchema: string;
|
|
112
|
+
returnSchema?: ZodType;
|
|
113
|
+
outputMode?: LlmOutputMode;
|
|
114
|
+
execute: (args: any, context: {
|
|
115
|
+
llm: LlmAgent<any>;
|
|
116
|
+
}) => Promise<any>;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Resolved mesh provider info.
|
|
120
|
+
*/
|
|
121
|
+
export interface ResolvedProvider {
|
|
122
|
+
endpoint: string;
|
|
123
|
+
functionName: string;
|
|
124
|
+
model?: string;
|
|
125
|
+
agentId: string;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Tool definition returned by mesh.llm() for fastmcp.
|
|
129
|
+
*/
|
|
130
|
+
export interface FastMcpToolDef {
|
|
131
|
+
name: string;
|
|
132
|
+
description?: string;
|
|
133
|
+
parameters: ZodType;
|
|
134
|
+
execute: (args: any) => Promise<string>;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Create an LLM-powered tool definition.
|
|
138
|
+
*
|
|
139
|
+
* This function returns a fastmcp-compatible tool definition that can be
|
|
140
|
+
* passed to server.addTool(). The tool will use an LLM with agentic capabilities.
|
|
141
|
+
*
|
|
142
|
+
* @param config - LLM tool configuration
|
|
143
|
+
* @returns fastmcp tool definition
|
|
144
|
+
*/
|
|
145
|
+
export declare function llm<TParams extends ZodType, TReturns extends ZodType | undefined = undefined>(config: MeshLlmConfig<TParams, TReturns>): FastMcpToolDef & {
|
|
146
|
+
_meshLlmConfig: LlmToolConfig;
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* Build JsLlmAgentSpec for Rust core from LLM tool configs.
|
|
150
|
+
*/
|
|
151
|
+
export declare function buildLlmAgentSpecs(): Array<{
|
|
152
|
+
functionId: string;
|
|
153
|
+
provider: string;
|
|
154
|
+
filter?: string;
|
|
155
|
+
filterMode: string;
|
|
156
|
+
maxIterations: number;
|
|
157
|
+
}>;
|
|
158
|
+
/**
|
|
159
|
+
* Handle llm_tools_updated event from Rust core.
|
|
160
|
+
*/
|
|
161
|
+
export declare function handleLlmToolsUpdated(functionId: string, tools: Array<{
|
|
162
|
+
functionName: string;
|
|
163
|
+
capability: string;
|
|
164
|
+
endpoint: string;
|
|
165
|
+
agentId: string;
|
|
166
|
+
inputSchema?: string;
|
|
167
|
+
}>): void;
|
|
168
|
+
/**
|
|
169
|
+
* Handle llm_provider_available event from Rust core.
|
|
170
|
+
*/
|
|
171
|
+
export declare function handleLlmProviderAvailable(functionId: string, providerInfo: {
|
|
172
|
+
agentId: string;
|
|
173
|
+
endpoint: string;
|
|
174
|
+
functionName: string;
|
|
175
|
+
model?: string;
|
|
176
|
+
}): void;
|
|
177
|
+
/**
|
|
178
|
+
* Handle llm_provider_unavailable event from Rust core.
|
|
179
|
+
*/
|
|
180
|
+
export declare function handleLlmProviderUnavailable(functionId: string): void;
|
|
181
|
+
/**
|
|
182
|
+
* Get LLM tool metadata for JsToolSpec.
|
|
183
|
+
*/
|
|
184
|
+
export declare function getLlmToolMetadata(toolName: string): {
|
|
185
|
+
llmFilter?: string;
|
|
186
|
+
llmProvider?: string;
|
|
187
|
+
} | null;
|
|
188
|
+
/**
|
|
189
|
+
* Check if a tool is an LLM tool.
|
|
190
|
+
*/
|
|
191
|
+
export declare function isLlmTool(toolDef: unknown): toolDef is FastMcpToolDef & {
|
|
192
|
+
_meshLlmConfig: LlmToolConfig;
|
|
193
|
+
};
|
|
194
|
+
//# sourceMappingURL=llm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"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"}
|