@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.
Files changed (145) hide show
  1. package/dist/__tests__/claude-handler.test.d.ts +7 -0
  2. package/dist/__tests__/claude-handler.test.d.ts.map +1 -0
  3. package/dist/__tests__/claude-handler.test.js +455 -0
  4. package/dist/__tests__/claude-handler.test.js.map +1 -0
  5. package/dist/__tests__/config.test.d.ts +7 -0
  6. package/dist/__tests__/config.test.d.ts.map +1 -0
  7. package/dist/__tests__/config.test.js +156 -0
  8. package/dist/__tests__/config.test.js.map +1 -0
  9. package/dist/__tests__/errors.test.d.ts +7 -0
  10. package/dist/__tests__/errors.test.d.ts.map +1 -0
  11. package/dist/__tests__/errors.test.js +170 -0
  12. package/dist/__tests__/errors.test.js.map +1 -0
  13. package/dist/__tests__/generic-handler.test.d.ts +7 -0
  14. package/dist/__tests__/generic-handler.test.d.ts.map +1 -0
  15. package/dist/__tests__/generic-handler.test.js +243 -0
  16. package/dist/__tests__/generic-handler.test.js.map +1 -0
  17. package/dist/__tests__/llm-provider.test.d.ts +7 -0
  18. package/dist/__tests__/llm-provider.test.d.ts.map +1 -0
  19. package/dist/__tests__/llm-provider.test.js +217 -0
  20. package/dist/__tests__/llm-provider.test.js.map +1 -0
  21. package/dist/__tests__/openai-handler.test.d.ts +7 -0
  22. package/dist/__tests__/openai-handler.test.d.ts.map +1 -0
  23. package/dist/__tests__/openai-handler.test.js +359 -0
  24. package/dist/__tests__/openai-handler.test.js.map +1 -0
  25. package/dist/__tests__/provider-handler-registry.test.d.ts +9 -0
  26. package/dist/__tests__/provider-handler-registry.test.d.ts.map +1 -0
  27. package/dist/__tests__/provider-handler-registry.test.js +187 -0
  28. package/dist/__tests__/provider-handler-registry.test.js.map +1 -0
  29. package/dist/__tests__/response-parser.test.d.ts +7 -0
  30. package/dist/__tests__/response-parser.test.d.ts.map +1 -0
  31. package/dist/__tests__/response-parser.test.js +360 -0
  32. package/dist/__tests__/response-parser.test.js.map +1 -0
  33. package/dist/__tests__/route.test.d.ts +7 -0
  34. package/dist/__tests__/route.test.d.ts.map +1 -0
  35. package/dist/__tests__/route.test.js +281 -0
  36. package/dist/__tests__/route.test.js.map +1 -0
  37. package/dist/__tests__/sse.test.d.ts +7 -0
  38. package/dist/__tests__/sse.test.d.ts.map +1 -0
  39. package/dist/__tests__/sse.test.js +172 -0
  40. package/dist/__tests__/sse.test.js.map +1 -0
  41. package/dist/__tests__/template.test.d.ts +7 -0
  42. package/dist/__tests__/template.test.d.ts.map +1 -0
  43. package/dist/__tests__/template.test.js +176 -0
  44. package/dist/__tests__/template.test.js.map +1 -0
  45. package/dist/__tests__/tracing.test.d.ts +7 -0
  46. package/dist/__tests__/tracing.test.d.ts.map +1 -0
  47. package/dist/__tests__/tracing.test.js +264 -0
  48. package/dist/__tests__/tracing.test.js.map +1 -0
  49. package/dist/agent.d.ts +165 -0
  50. package/dist/agent.d.ts.map +1 -0
  51. package/dist/agent.js +626 -0
  52. package/dist/agent.js.map +1 -0
  53. package/dist/api-runtime.d.ts +166 -0
  54. package/dist/api-runtime.d.ts.map +1 -0
  55. package/dist/api-runtime.js +459 -0
  56. package/dist/api-runtime.js.map +1 -0
  57. package/dist/config.d.ts +31 -0
  58. package/dist/config.d.ts.map +1 -0
  59. package/dist/config.js +60 -0
  60. package/dist/config.js.map +1 -0
  61. package/dist/debug.d.ts +47 -0
  62. package/dist/debug.d.ts.map +1 -0
  63. package/dist/debug.js +86 -0
  64. package/dist/debug.js.map +1 -0
  65. package/dist/errors.d.ts +99 -0
  66. package/dist/errors.d.ts.map +1 -0
  67. package/dist/errors.js +110 -0
  68. package/dist/errors.js.map +1 -0
  69. package/dist/express.d.ts +146 -0
  70. package/dist/express.d.ts.map +1 -0
  71. package/dist/express.js +371 -0
  72. package/dist/express.js.map +1 -0
  73. package/dist/index.d.ts +96 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +107 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/llm-agent.d.ts +193 -0
  78. package/dist/llm-agent.d.ts.map +1 -0
  79. package/dist/llm-agent.js +634 -0
  80. package/dist/llm-agent.js.map +1 -0
  81. package/dist/llm-provider.d.ts +323 -0
  82. package/dist/llm-provider.d.ts.map +1 -0
  83. package/dist/llm-provider.js +446 -0
  84. package/dist/llm-provider.js.map +1 -0
  85. package/dist/llm.d.ts +194 -0
  86. package/dist/llm.d.ts.map +1 -0
  87. package/dist/llm.js +304 -0
  88. package/dist/llm.js.map +1 -0
  89. package/dist/provider-handlers/claude-handler.d.ts +98 -0
  90. package/dist/provider-handlers/claude-handler.d.ts.map +1 -0
  91. package/dist/provider-handlers/claude-handler.js +268 -0
  92. package/dist/provider-handlers/claude-handler.js.map +1 -0
  93. package/dist/provider-handlers/gemini-handler.d.ts +82 -0
  94. package/dist/provider-handlers/gemini-handler.d.ts.map +1 -0
  95. package/dist/provider-handlers/gemini-handler.js +152 -0
  96. package/dist/provider-handlers/gemini-handler.js.map +1 -0
  97. package/dist/provider-handlers/generic-handler.d.ts +78 -0
  98. package/dist/provider-handlers/generic-handler.d.ts.map +1 -0
  99. package/dist/provider-handlers/generic-handler.js +152 -0
  100. package/dist/provider-handlers/generic-handler.js.map +1 -0
  101. package/dist/provider-handlers/index.d.ts +29 -0
  102. package/dist/provider-handlers/index.d.ts.map +1 -0
  103. package/dist/provider-handlers/index.js +32 -0
  104. package/dist/provider-handlers/index.js.map +1 -0
  105. package/dist/provider-handlers/openai-handler.d.ts +86 -0
  106. package/dist/provider-handlers/openai-handler.d.ts.map +1 -0
  107. package/dist/provider-handlers/openai-handler.js +160 -0
  108. package/dist/provider-handlers/openai-handler.js.map +1 -0
  109. package/dist/provider-handlers/provider-handler-registry.d.ts +124 -0
  110. package/dist/provider-handlers/provider-handler-registry.d.ts.map +1 -0
  111. package/dist/provider-handlers/provider-handler-registry.js +180 -0
  112. package/dist/provider-handlers/provider-handler-registry.js.map +1 -0
  113. package/dist/provider-handlers/provider-handler.d.ts +245 -0
  114. package/dist/provider-handlers/provider-handler.d.ts.map +1 -0
  115. package/dist/provider-handlers/provider-handler.js +238 -0
  116. package/dist/provider-handlers/provider-handler.js.map +1 -0
  117. package/dist/proxy.d.ts +44 -0
  118. package/dist/proxy.d.ts.map +1 -0
  119. package/dist/proxy.js +324 -0
  120. package/dist/proxy.js.map +1 -0
  121. package/dist/response-parser.d.ts +103 -0
  122. package/dist/response-parser.d.ts.map +1 -0
  123. package/dist/response-parser.js +232 -0
  124. package/dist/response-parser.js.map +1 -0
  125. package/dist/route.d.ts +185 -0
  126. package/dist/route.d.ts.map +1 -0
  127. package/dist/route.js +310 -0
  128. package/dist/route.js.map +1 -0
  129. package/dist/sse.d.ts +45 -0
  130. package/dist/sse.d.ts.map +1 -0
  131. package/dist/sse.js +77 -0
  132. package/dist/sse.js.map +1 -0
  133. package/dist/template.d.ts +86 -0
  134. package/dist/template.d.ts.map +1 -0
  135. package/dist/template.js +206 -0
  136. package/dist/template.js.map +1 -0
  137. package/dist/tracing.d.ts +88 -0
  138. package/dist/tracing.d.ts.map +1 -0
  139. package/dist/tracing.js +193 -0
  140. package/dist/tracing.js.map +1 -0
  141. package/dist/types.d.ts +618 -0
  142. package/dist/types.d.ts.map +1 -0
  143. package/dist/types.js +5 -0
  144. package/dist/types.js.map +1 -0
  145. 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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"}