integrate-sdk 0.7.36 → 0.7.39
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/README.md +2 -2
- package/dist/ai/anthropic.d.ts +67 -0
- package/dist/ai/anthropic.d.ts.map +1 -1
- package/dist/ai/anthropic.js +20 -0
- package/dist/ai/index.js +65 -7
- package/dist/ai/openai.d.ts +100 -6
- package/dist/ai/openai.d.ts.map +1 -1
- package/dist/ai/openai.js +45 -7
- package/dist/server.js +65 -7
- package/dist/src/ai/anthropic.d.ts +67 -0
- package/dist/src/ai/anthropic.d.ts.map +1 -1
- package/dist/src/ai/openai.d.ts +100 -6
- package/dist/src/ai/openai.d.ts.map +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -339,7 +339,7 @@ const result = await generateText({
|
|
|
339
339
|
});
|
|
340
340
|
```
|
|
341
341
|
|
|
342
|
-
[→ View Vercel AI SDK integration guide](https://integrate.dev/docs/
|
|
342
|
+
[→ View Vercel AI SDK integration guide](https://integrate.dev/docs/artificial-intelligence/vercel-ai-sdk)
|
|
343
343
|
|
|
344
344
|
## Documentation
|
|
345
345
|
|
|
@@ -348,7 +348,7 @@ For detailed guides, API reference, and examples, visit the [complete documentat
|
|
|
348
348
|
- **[Getting Started](https://integrate.dev/docs/getting-started/installation)** - Installation and quick start
|
|
349
349
|
- **[OAuth Flow](https://integrate.dev/docs/guides/oauth-flow)** - OAuth 2.0 authorization guide
|
|
350
350
|
- **[Integrations](https://integrate.dev/docs/integrations)** - Built-in integrations and configuration
|
|
351
|
-
- **[Vercel AI SDK](https://integrate.dev/docs/
|
|
351
|
+
- **[Vercel AI SDK](https://integrate.dev/docs/artificial-intelligence/vercel-ai-sdk)** - AI model integration
|
|
352
352
|
- **[Advanced Usage](https://integrate.dev/docs/guides/advanced-usage)** - Error handling, retries, and more
|
|
353
353
|
- **[API Reference](https://integrate.dev/docs/reference/api-reference)** - Complete API documentation
|
|
354
354
|
- **[Architecture](https://integrate.dev/docs/reference/architecture)** - How the SDK works
|
package/dist/ai/anthropic.d.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import type { MCPClient } from "../client.js";
|
|
7
7
|
import type { MCPTool } from "../protocol/messages.js";
|
|
8
8
|
import { type AIToolsOptions } from "./utils.js";
|
|
9
|
+
import type Anthropic from "@anthropic-ai/sdk";
|
|
9
10
|
/**
|
|
10
11
|
* Anthropic tool definition
|
|
11
12
|
* Compatible with Anthropic's Claude API
|
|
@@ -179,4 +180,70 @@ export declare function handleAnthropicToolCalls(client: MCPClient<any>, message
|
|
|
179
180
|
* ```
|
|
180
181
|
*/
|
|
181
182
|
export declare function getAnthropicTools(client: MCPClient<any>, options?: AnthropicToolsOptions): Promise<AnthropicTool[]>;
|
|
183
|
+
/**
|
|
184
|
+
* Handle an entire Anthropic Message object
|
|
185
|
+
*
|
|
186
|
+
* This is a convenience function that extracts tool calls from a Message
|
|
187
|
+
* object, executes them, and returns the results formatted as MessageParam
|
|
188
|
+
* ready to be passed directly to the next API call.
|
|
189
|
+
*
|
|
190
|
+
* **Auto-extraction**: Provider tokens are automatically extracted from request headers
|
|
191
|
+
* or environment variables if not provided in options.
|
|
192
|
+
*
|
|
193
|
+
* @param client - The MCP client instance
|
|
194
|
+
* @param message - The complete Message object from Anthropic
|
|
195
|
+
* @param options - Optional configuration including provider tokens
|
|
196
|
+
* @returns Array with a single user message containing tool results, or empty array if no tool calls
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* ```typescript
|
|
200
|
+
* import { serverClient } from '@/lib/integrate-server';
|
|
201
|
+
* import { getAnthropicTools, handleAnthropicMessage } from 'integrate-sdk/server';
|
|
202
|
+
* import Anthropic from '@anthropic-ai/sdk';
|
|
203
|
+
*
|
|
204
|
+
* const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
|
|
205
|
+
*
|
|
206
|
+
* export async function POST(req: Request) {
|
|
207
|
+
* const { messages } = await req.json();
|
|
208
|
+
*
|
|
209
|
+
* // Initial request with tools
|
|
210
|
+
* const message = await anthropic.messages.create({
|
|
211
|
+
* model: 'claude-3-5-sonnet-20241022',
|
|
212
|
+
* max_tokens: 1024,
|
|
213
|
+
* tools: await getAnthropicTools(serverClient),
|
|
214
|
+
* messages,
|
|
215
|
+
* });
|
|
216
|
+
*
|
|
217
|
+
* // If there are tool calls, handle them automatically
|
|
218
|
+
* if (message.stop_reason === 'tool_use') {
|
|
219
|
+
* const toolMessages = await handleAnthropicMessage(serverClient, message);
|
|
220
|
+
*
|
|
221
|
+
* // Continue conversation with tool results
|
|
222
|
+
* const finalMessage = await anthropic.messages.create({
|
|
223
|
+
* model: 'claude-3-5-sonnet-20241022',
|
|
224
|
+
* max_tokens: 1024,
|
|
225
|
+
* tools: await getAnthropicTools(serverClient),
|
|
226
|
+
* messages: [
|
|
227
|
+
* ...messages,
|
|
228
|
+
* { role: 'assistant', content: message.content },
|
|
229
|
+
* ...toolMessages,
|
|
230
|
+
* ],
|
|
231
|
+
* });
|
|
232
|
+
*
|
|
233
|
+
* return Response.json(finalMessage);
|
|
234
|
+
* }
|
|
235
|
+
*
|
|
236
|
+
* return Response.json(message);
|
|
237
|
+
* }
|
|
238
|
+
* ```
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* ```typescript
|
|
242
|
+
* // Manual token override
|
|
243
|
+
* const toolMessages = await handleAnthropicMessage(serverClient, message, {
|
|
244
|
+
* providerTokens: { github: 'ghp_...', gmail: 'ya29...' }
|
|
245
|
+
* });
|
|
246
|
+
* ```
|
|
247
|
+
*/
|
|
248
|
+
export declare function handleAnthropicMessage(client: MCPClient<any>, message: Anthropic.Messages.Message, options?: AnthropicToolsOptions): Promise<Anthropic.Messages.MessageParam[]>;
|
|
182
249
|
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/ai/anthropic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/ai/anthropic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AACjH,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,cAAc;CAAI;AAEjE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,EACvB,QAAQ,CAAC,EAAE,qBAAqB,GAC/B,aAAa,CAUf;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,EAAE,CAGjB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,EAAE,qBAAqB,EAC9B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,cAAc,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAA,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAAC,EAC1D,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAkCrC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,aAAa,EAAE,CAAC,CAe1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO,EACnC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CA4B5C"}
|
package/dist/ai/anthropic.js
CHANGED
|
@@ -4256,8 +4256,28 @@ async function getAnthropicTools(client, options) {
|
|
|
4256
4256
|
const finalOptions = providerTokens ? { ...options, providerTokens } : options;
|
|
4257
4257
|
return convertMCPToolsToAnthropic(client, finalOptions);
|
|
4258
4258
|
}
|
|
4259
|
+
async function handleAnthropicMessage(client, message, options) {
|
|
4260
|
+
let providerTokens = options?.providerTokens;
|
|
4261
|
+
if (!providerTokens) {
|
|
4262
|
+
try {
|
|
4263
|
+
providerTokens = await getProviderTokens();
|
|
4264
|
+
} catch {}
|
|
4265
|
+
}
|
|
4266
|
+
const finalOptions = providerTokens ? { ...options, providerTokens } : options;
|
|
4267
|
+
const toolResults = await handleAnthropicToolCalls(client, message.content, finalOptions);
|
|
4268
|
+
if (toolResults.length === 0) {
|
|
4269
|
+
return [];
|
|
4270
|
+
}
|
|
4271
|
+
return [
|
|
4272
|
+
{
|
|
4273
|
+
role: "user",
|
|
4274
|
+
content: toolResults
|
|
4275
|
+
}
|
|
4276
|
+
];
|
|
4277
|
+
}
|
|
4259
4278
|
export {
|
|
4260
4279
|
handleAnthropicToolCalls,
|
|
4280
|
+
handleAnthropicMessage,
|
|
4261
4281
|
getAnthropicTools,
|
|
4262
4282
|
executeAnthropicToolCall,
|
|
4263
4283
|
convertMCPToolsToAnthropic,
|
package/dist/ai/index.js
CHANGED
|
@@ -4256,6 +4256,25 @@ async function getAnthropicTools(client, options) {
|
|
|
4256
4256
|
const finalOptions = providerTokens ? { ...options, providerTokens } : options;
|
|
4257
4257
|
return convertMCPToolsToAnthropic(client, finalOptions);
|
|
4258
4258
|
}
|
|
4259
|
+
async function handleAnthropicMessage(client, message, options) {
|
|
4260
|
+
let providerTokens = options?.providerTokens;
|
|
4261
|
+
if (!providerTokens) {
|
|
4262
|
+
try {
|
|
4263
|
+
providerTokens = await getProviderTokens();
|
|
4264
|
+
} catch {}
|
|
4265
|
+
}
|
|
4266
|
+
const finalOptions = providerTokens ? { ...options, providerTokens } : options;
|
|
4267
|
+
const toolResults = await handleAnthropicToolCalls(client, message.content, finalOptions);
|
|
4268
|
+
if (toolResults.length === 0) {
|
|
4269
|
+
return [];
|
|
4270
|
+
}
|
|
4271
|
+
return [
|
|
4272
|
+
{
|
|
4273
|
+
role: "user",
|
|
4274
|
+
content: toolResults
|
|
4275
|
+
}
|
|
4276
|
+
];
|
|
4277
|
+
}
|
|
4259
4278
|
|
|
4260
4279
|
// cloudflare.ts
|
|
4261
4280
|
function convertMCPToolToCloudflare(mcpTool, _client, _options) {
|
|
@@ -4366,13 +4385,9 @@ function convertMCPToolToOpenAI(mcpTool, _client, options) {
|
|
|
4366
4385
|
return {
|
|
4367
4386
|
type: "function",
|
|
4368
4387
|
name: mcpTool.name,
|
|
4369
|
-
|
|
4370
|
-
|
|
4371
|
-
|
|
4372
|
-
properties: {},
|
|
4373
|
-
required: []
|
|
4374
|
-
},
|
|
4375
|
-
strict: options?.strict ?? false
|
|
4388
|
+
parameters: inputParams || null,
|
|
4389
|
+
strict: options?.strict ?? null,
|
|
4390
|
+
description: mcpTool.description || null
|
|
4376
4391
|
};
|
|
4377
4392
|
}
|
|
4378
4393
|
function convertMCPToolsToOpenAI(client, options) {
|
|
@@ -4395,6 +4410,46 @@ async function getOpenAITools(client, options) {
|
|
|
4395
4410
|
const finalOptions = providerTokens ? { ...options, providerTokens } : options;
|
|
4396
4411
|
return convertMCPToolsToOpenAI(client, finalOptions);
|
|
4397
4412
|
}
|
|
4413
|
+
async function handleOpenAIToolCalls(client, toolCalls, options) {
|
|
4414
|
+
const toolOutputs = [];
|
|
4415
|
+
for (const output of toolCalls) {
|
|
4416
|
+
if (output.type === "function_call") {
|
|
4417
|
+
const toolCall = {
|
|
4418
|
+
id: output.id ?? "",
|
|
4419
|
+
name: output.name,
|
|
4420
|
+
arguments: output.arguments
|
|
4421
|
+
};
|
|
4422
|
+
try {
|
|
4423
|
+
const result = await executeOpenAIToolCall(client, toolCall, options);
|
|
4424
|
+
toolOutputs.push({
|
|
4425
|
+
call_id: output.call_id ?? output.id ?? "",
|
|
4426
|
+
type: "function_call_output",
|
|
4427
|
+
output: result,
|
|
4428
|
+
status: "completed"
|
|
4429
|
+
});
|
|
4430
|
+
} catch (error) {
|
|
4431
|
+
toolOutputs.push({
|
|
4432
|
+
call_id: output.call_id ?? output.id ?? "",
|
|
4433
|
+
type: "function_call_output",
|
|
4434
|
+
output: error instanceof Error ? error.message : "Unknown error",
|
|
4435
|
+
status: "incomplete"
|
|
4436
|
+
});
|
|
4437
|
+
}
|
|
4438
|
+
}
|
|
4439
|
+
}
|
|
4440
|
+
return toolOutputs;
|
|
4441
|
+
}
|
|
4442
|
+
async function handleOpenAIResponse(client, response, options) {
|
|
4443
|
+
let providerTokens = options?.providerTokens;
|
|
4444
|
+
if (!providerTokens) {
|
|
4445
|
+
try {
|
|
4446
|
+
providerTokens = await getProviderTokens();
|
|
4447
|
+
} catch {}
|
|
4448
|
+
}
|
|
4449
|
+
const finalOptions = providerTokens ? { ...options, providerTokens } : options;
|
|
4450
|
+
const functionCalls = response.output.filter((output) => output.type === "function_call");
|
|
4451
|
+
return handleOpenAIToolCalls(client, functionCalls, finalOptions);
|
|
4452
|
+
}
|
|
4398
4453
|
|
|
4399
4454
|
// openai-agents.ts
|
|
4400
4455
|
function convertMCPToolToOpenAIAgents(mcpTool, client, options) {
|
|
@@ -4540,7 +4595,10 @@ export {
|
|
|
4540
4595
|
tryGetProviderTokens,
|
|
4541
4596
|
jsonSchemaToZod,
|
|
4542
4597
|
jsonSchemaPropertyToZod,
|
|
4598
|
+
handleOpenAIToolCalls,
|
|
4599
|
+
handleOpenAIResponse,
|
|
4543
4600
|
handleAnthropicToolCalls,
|
|
4601
|
+
handleAnthropicMessage,
|
|
4544
4602
|
getVercelAITools,
|
|
4545
4603
|
getProviderTokens,
|
|
4546
4604
|
getProviderForTool,
|
package/dist/ai/openai.d.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import type { MCPClient } from "../client.js";
|
|
7
7
|
import type { MCPTool } from "../protocol/messages.js";
|
|
8
8
|
import { type AIToolsOptions } from "./utils.js";
|
|
9
|
+
import type { OpenAI } from "openai";
|
|
9
10
|
/**
|
|
10
11
|
* OpenAI function tool definition
|
|
11
12
|
* Compatible with OpenAI's Responses API format
|
|
@@ -13,14 +14,11 @@ import { type AIToolsOptions } from "./utils.js";
|
|
|
13
14
|
export interface OpenAITool {
|
|
14
15
|
type: 'function';
|
|
15
16
|
name: string;
|
|
16
|
-
description?: string;
|
|
17
17
|
parameters: {
|
|
18
|
-
type: 'object';
|
|
19
|
-
properties?: Record<string, unknown>;
|
|
20
|
-
required?: string[];
|
|
21
18
|
[key: string]: unknown;
|
|
22
|
-
};
|
|
23
|
-
strict
|
|
19
|
+
} | null;
|
|
20
|
+
strict: boolean | null;
|
|
21
|
+
description?: string | null;
|
|
24
22
|
}
|
|
25
23
|
/**
|
|
26
24
|
* Options for converting MCP tools to OpenAI format
|
|
@@ -127,4 +125,100 @@ export declare function executeOpenAIToolCall(client: MCPClient<any>, toolCall:
|
|
|
127
125
|
* ```
|
|
128
126
|
*/
|
|
129
127
|
export declare function getOpenAITools(client: MCPClient<any>, options?: OpenAIToolsOptions): Promise<OpenAITool[]>;
|
|
128
|
+
/**
|
|
129
|
+
* Handle multiple tool calls from OpenAI's response output
|
|
130
|
+
*
|
|
131
|
+
* This function processes all function_call items from the response output,
|
|
132
|
+
* executes each tool call, and returns formatted results for the next request.
|
|
133
|
+
*
|
|
134
|
+
* @param client - The MCP client instance
|
|
135
|
+
* @param toolCalls - Array of output items from OpenAI response (filters for function_call type)
|
|
136
|
+
* @param options - Optional configuration including provider tokens
|
|
137
|
+
* @returns Array of function call outputs to send back to OpenAI
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```typescript
|
|
141
|
+
* // Handle tool calls from a response
|
|
142
|
+
* const response = await openai.responses.create({
|
|
143
|
+
* model: 'gpt-4o-2024-11-20',
|
|
144
|
+
* input: 'Create a GitHub issue',
|
|
145
|
+
* tools: await getOpenAITools(serverClient),
|
|
146
|
+
* });
|
|
147
|
+
*
|
|
148
|
+
* // Execute the tool calls and get outputs
|
|
149
|
+
* const toolOutputs = await handleOpenAIToolCalls(
|
|
150
|
+
* serverClient,
|
|
151
|
+
* response.output,
|
|
152
|
+
* { providerTokens }
|
|
153
|
+
* );
|
|
154
|
+
*
|
|
155
|
+
* // Continue the conversation with tool results
|
|
156
|
+
* const nextResponse = await openai.responses.create({
|
|
157
|
+
* model: 'gpt-4o-2024-11-20',
|
|
158
|
+
* input: toolOutputs,
|
|
159
|
+
* tools: await getOpenAITools(serverClient),
|
|
160
|
+
* });
|
|
161
|
+
* ```
|
|
162
|
+
*/
|
|
163
|
+
export declare function handleOpenAIToolCalls(client: MCPClient<any>, toolCalls: OpenAI.Responses.ResponseOutputItem[], options?: OpenAIToolsOptions): Promise<OpenAI.Responses.ResponseInputItem.FunctionCallOutput[]>;
|
|
164
|
+
/**
|
|
165
|
+
* Handle an entire OpenAI Response object
|
|
166
|
+
*
|
|
167
|
+
* This is a convenience function that extracts tool calls from a Response
|
|
168
|
+
* object and executes them. Use this when you want to process all tool
|
|
169
|
+
* calls from a response in one go.
|
|
170
|
+
*
|
|
171
|
+
* **Auto-extraction**: Provider tokens are automatically extracted from request headers
|
|
172
|
+
* or environment variables if not provided in options.
|
|
173
|
+
*
|
|
174
|
+
* @param client - The MCP client instance
|
|
175
|
+
* @param response - The complete Response object from OpenAI
|
|
176
|
+
* @param options - Optional configuration including provider tokens
|
|
177
|
+
* @returns Array of function call outputs to send back to OpenAI
|
|
178
|
+
*
|
|
179
|
+
* @example
|
|
180
|
+
* ```typescript
|
|
181
|
+
* import { serverClient } from '@/lib/integrate-server';
|
|
182
|
+
* import { getOpenAITools, handleOpenAIResponse } from 'integrate-sdk/server';
|
|
183
|
+
* import OpenAI from 'openai';
|
|
184
|
+
*
|
|
185
|
+
* const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
|
|
186
|
+
*
|
|
187
|
+
* export async function POST(req: Request) {
|
|
188
|
+
* const { messages } = await req.json();
|
|
189
|
+
*
|
|
190
|
+
* // Initial request with tools
|
|
191
|
+
* const response = await openai.responses.create({
|
|
192
|
+
* model: 'gpt-4o-2024-11-20',
|
|
193
|
+
* input: messages,
|
|
194
|
+
* tools: await getOpenAITools(serverClient),
|
|
195
|
+
* });
|
|
196
|
+
*
|
|
197
|
+
* // If there are tool calls, handle them automatically
|
|
198
|
+
* if (response.output.some(item => item.type === 'function_call')) {
|
|
199
|
+
* const toolOutputs = await handleOpenAIResponse(serverClient, response);
|
|
200
|
+
*
|
|
201
|
+
* // Continue conversation with tool results
|
|
202
|
+
* const finalResponse = await openai.responses.create({
|
|
203
|
+
* model: 'gpt-4o-2024-11-20',
|
|
204
|
+
* input: toolOutputs,
|
|
205
|
+
* tools: await getOpenAITools(serverClient),
|
|
206
|
+
* });
|
|
207
|
+
*
|
|
208
|
+
* return Response.json(finalResponse);
|
|
209
|
+
* }
|
|
210
|
+
*
|
|
211
|
+
* return Response.json(response);
|
|
212
|
+
* }
|
|
213
|
+
* ```
|
|
214
|
+
*
|
|
215
|
+
* @example
|
|
216
|
+
* ```typescript
|
|
217
|
+
* // Manual token override
|
|
218
|
+
* const toolOutputs = await handleOpenAIResponse(serverClient, response, {
|
|
219
|
+
* providerTokens: { github: 'ghp_...', gmail: 'ya29...' }
|
|
220
|
+
* });
|
|
221
|
+
* ```
|
|
222
|
+
*/
|
|
223
|
+
export declare function handleOpenAIResponse(client: MCPClient<any>, response: OpenAI.Responses.Response, options?: OpenAIToolsOptions): Promise<OpenAI.Responses.ResponseInputItem.FunctionCallOutput[]>;
|
|
130
224
|
//# sourceMappingURL=openai.d.ts.map
|
package/dist/ai/openai.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/ai/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/ai/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AACjH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE;QACV,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,GAAG,IAAI,CAAC;IACT,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,EACvB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,UAAU,CAUZ;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,UAAU,EAAE,CAGd;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE;IACR,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,UAAU,EAAE,CAAC,CAevB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,kBAAkB,EAAE,EAChD,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,CAAC,CA+BlE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACnC,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,CAAC,CAoBlE"}
|
package/dist/ai/openai.js
CHANGED
|
@@ -4208,13 +4208,9 @@ function convertMCPToolToOpenAI(mcpTool, _client, options) {
|
|
|
4208
4208
|
return {
|
|
4209
4209
|
type: "function",
|
|
4210
4210
|
name: mcpTool.name,
|
|
4211
|
-
|
|
4212
|
-
|
|
4213
|
-
|
|
4214
|
-
properties: {},
|
|
4215
|
-
required: []
|
|
4216
|
-
},
|
|
4217
|
-
strict: options?.strict ?? false
|
|
4211
|
+
parameters: inputParams || null,
|
|
4212
|
+
strict: options?.strict ?? null,
|
|
4213
|
+
description: mcpTool.description || null
|
|
4218
4214
|
};
|
|
4219
4215
|
}
|
|
4220
4216
|
function convertMCPToolsToOpenAI(client, options) {
|
|
@@ -4237,7 +4233,49 @@ async function getOpenAITools(client, options) {
|
|
|
4237
4233
|
const finalOptions = providerTokens ? { ...options, providerTokens } : options;
|
|
4238
4234
|
return convertMCPToolsToOpenAI(client, finalOptions);
|
|
4239
4235
|
}
|
|
4236
|
+
async function handleOpenAIToolCalls(client, toolCalls, options) {
|
|
4237
|
+
const toolOutputs = [];
|
|
4238
|
+
for (const output of toolCalls) {
|
|
4239
|
+
if (output.type === "function_call") {
|
|
4240
|
+
const toolCall = {
|
|
4241
|
+
id: output.id ?? "",
|
|
4242
|
+
name: output.name,
|
|
4243
|
+
arguments: output.arguments
|
|
4244
|
+
};
|
|
4245
|
+
try {
|
|
4246
|
+
const result = await executeOpenAIToolCall(client, toolCall, options);
|
|
4247
|
+
toolOutputs.push({
|
|
4248
|
+
call_id: output.call_id ?? output.id ?? "",
|
|
4249
|
+
type: "function_call_output",
|
|
4250
|
+
output: result,
|
|
4251
|
+
status: "completed"
|
|
4252
|
+
});
|
|
4253
|
+
} catch (error) {
|
|
4254
|
+
toolOutputs.push({
|
|
4255
|
+
call_id: output.call_id ?? output.id ?? "",
|
|
4256
|
+
type: "function_call_output",
|
|
4257
|
+
output: error instanceof Error ? error.message : "Unknown error",
|
|
4258
|
+
status: "incomplete"
|
|
4259
|
+
});
|
|
4260
|
+
}
|
|
4261
|
+
}
|
|
4262
|
+
}
|
|
4263
|
+
return toolOutputs;
|
|
4264
|
+
}
|
|
4265
|
+
async function handleOpenAIResponse(client, response, options) {
|
|
4266
|
+
let providerTokens = options?.providerTokens;
|
|
4267
|
+
if (!providerTokens) {
|
|
4268
|
+
try {
|
|
4269
|
+
providerTokens = await getProviderTokens();
|
|
4270
|
+
} catch {}
|
|
4271
|
+
}
|
|
4272
|
+
const finalOptions = providerTokens ? { ...options, providerTokens } : options;
|
|
4273
|
+
const functionCalls = response.output.filter((output) => output.type === "function_call");
|
|
4274
|
+
return handleOpenAIToolCalls(client, functionCalls, finalOptions);
|
|
4275
|
+
}
|
|
4240
4276
|
export {
|
|
4277
|
+
handleOpenAIToolCalls,
|
|
4278
|
+
handleOpenAIResponse,
|
|
4241
4279
|
getOpenAITools,
|
|
4242
4280
|
executeOpenAIToolCall,
|
|
4243
4281
|
convertMCPToolsToOpenAI,
|
package/dist/server.js
CHANGED
|
@@ -6507,13 +6507,9 @@ function convertMCPToolToOpenAI(mcpTool, _client, options) {
|
|
|
6507
6507
|
return {
|
|
6508
6508
|
type: "function",
|
|
6509
6509
|
name: mcpTool.name,
|
|
6510
|
-
|
|
6511
|
-
|
|
6512
|
-
|
|
6513
|
-
properties: {},
|
|
6514
|
-
required: []
|
|
6515
|
-
},
|
|
6516
|
-
strict: options?.strict ?? false
|
|
6510
|
+
parameters: inputParams || null,
|
|
6511
|
+
strict: options?.strict ?? null,
|
|
6512
|
+
description: mcpTool.description || null
|
|
6517
6513
|
};
|
|
6518
6514
|
}
|
|
6519
6515
|
function convertMCPToolsToOpenAI(client, options) {
|
|
@@ -6536,6 +6532,46 @@ async function getOpenAITools(client, options) {
|
|
|
6536
6532
|
const finalOptions = providerTokens ? { ...options, providerTokens } : options;
|
|
6537
6533
|
return convertMCPToolsToOpenAI(client, finalOptions);
|
|
6538
6534
|
}
|
|
6535
|
+
async function handleOpenAIToolCalls(client, toolCalls, options) {
|
|
6536
|
+
const toolOutputs = [];
|
|
6537
|
+
for (const output of toolCalls) {
|
|
6538
|
+
if (output.type === "function_call") {
|
|
6539
|
+
const toolCall = {
|
|
6540
|
+
id: output.id ?? "",
|
|
6541
|
+
name: output.name,
|
|
6542
|
+
arguments: output.arguments
|
|
6543
|
+
};
|
|
6544
|
+
try {
|
|
6545
|
+
const result = await executeOpenAIToolCall(client, toolCall, options);
|
|
6546
|
+
toolOutputs.push({
|
|
6547
|
+
call_id: output.call_id ?? output.id ?? "",
|
|
6548
|
+
type: "function_call_output",
|
|
6549
|
+
output: result,
|
|
6550
|
+
status: "completed"
|
|
6551
|
+
});
|
|
6552
|
+
} catch (error) {
|
|
6553
|
+
toolOutputs.push({
|
|
6554
|
+
call_id: output.call_id ?? output.id ?? "",
|
|
6555
|
+
type: "function_call_output",
|
|
6556
|
+
output: error instanceof Error ? error.message : "Unknown error",
|
|
6557
|
+
status: "incomplete"
|
|
6558
|
+
});
|
|
6559
|
+
}
|
|
6560
|
+
}
|
|
6561
|
+
}
|
|
6562
|
+
return toolOutputs;
|
|
6563
|
+
}
|
|
6564
|
+
async function handleOpenAIResponse(client, response, options) {
|
|
6565
|
+
let providerTokens = options?.providerTokens;
|
|
6566
|
+
if (!providerTokens) {
|
|
6567
|
+
try {
|
|
6568
|
+
providerTokens = await getProviderTokens();
|
|
6569
|
+
} catch {}
|
|
6570
|
+
}
|
|
6571
|
+
const finalOptions = providerTokens ? { ...options, providerTokens } : options;
|
|
6572
|
+
const functionCalls = response.output.filter((output) => output.type === "function_call");
|
|
6573
|
+
return handleOpenAIToolCalls(client, functionCalls, finalOptions);
|
|
6574
|
+
}
|
|
6539
6575
|
// src/ai/openai-agents.ts
|
|
6540
6576
|
function convertMCPToolToOpenAIAgents(mcpTool, client, options) {
|
|
6541
6577
|
return {
|
|
@@ -6616,6 +6652,25 @@ async function getAnthropicTools(client, options) {
|
|
|
6616
6652
|
const finalOptions = providerTokens ? { ...options, providerTokens } : options;
|
|
6617
6653
|
return convertMCPToolsToAnthropic(client, finalOptions);
|
|
6618
6654
|
}
|
|
6655
|
+
async function handleAnthropicMessage(client, message, options) {
|
|
6656
|
+
let providerTokens = options?.providerTokens;
|
|
6657
|
+
if (!providerTokens) {
|
|
6658
|
+
try {
|
|
6659
|
+
providerTokens = await getProviderTokens();
|
|
6660
|
+
} catch {}
|
|
6661
|
+
}
|
|
6662
|
+
const finalOptions = providerTokens ? { ...options, providerTokens } : options;
|
|
6663
|
+
const toolResults = await handleAnthropicToolCalls(client, message.content, finalOptions);
|
|
6664
|
+
if (toolResults.length === 0) {
|
|
6665
|
+
return [];
|
|
6666
|
+
}
|
|
6667
|
+
return [
|
|
6668
|
+
{
|
|
6669
|
+
role: "user",
|
|
6670
|
+
content: toolResults
|
|
6671
|
+
}
|
|
6672
|
+
];
|
|
6673
|
+
}
|
|
6619
6674
|
// src/ai/google.ts
|
|
6620
6675
|
function convertMCPToolToGoogle(mcpTool, _client, _options) {
|
|
6621
6676
|
return {
|
|
@@ -6967,7 +7022,10 @@ export {
|
|
|
6967
7022
|
svelteKitHandler,
|
|
6968
7023
|
jsonSchemaToZod,
|
|
6969
7024
|
jsonSchemaPropertyToZod,
|
|
7025
|
+
handleOpenAIToolCalls,
|
|
7026
|
+
handleOpenAIResponse,
|
|
6970
7027
|
handleAnthropicToolCalls,
|
|
7028
|
+
handleAnthropicMessage,
|
|
6971
7029
|
gmailIntegration,
|
|
6972
7030
|
githubIntegration,
|
|
6973
7031
|
getVercelAITools,
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import type { MCPClient } from "../client.js";
|
|
7
7
|
import type { MCPTool } from "../protocol/messages.js";
|
|
8
8
|
import { type AIToolsOptions } from "./utils.js";
|
|
9
|
+
import type Anthropic from "@anthropic-ai/sdk";
|
|
9
10
|
/**
|
|
10
11
|
* Anthropic tool definition
|
|
11
12
|
* Compatible with Anthropic's Claude API
|
|
@@ -179,4 +180,70 @@ export declare function handleAnthropicToolCalls(client: MCPClient<any>, message
|
|
|
179
180
|
* ```
|
|
180
181
|
*/
|
|
181
182
|
export declare function getAnthropicTools(client: MCPClient<any>, options?: AnthropicToolsOptions): Promise<AnthropicTool[]>;
|
|
183
|
+
/**
|
|
184
|
+
* Handle an entire Anthropic Message object
|
|
185
|
+
*
|
|
186
|
+
* This is a convenience function that extracts tool calls from a Message
|
|
187
|
+
* object, executes them, and returns the results formatted as MessageParam
|
|
188
|
+
* ready to be passed directly to the next API call.
|
|
189
|
+
*
|
|
190
|
+
* **Auto-extraction**: Provider tokens are automatically extracted from request headers
|
|
191
|
+
* or environment variables if not provided in options.
|
|
192
|
+
*
|
|
193
|
+
* @param client - The MCP client instance
|
|
194
|
+
* @param message - The complete Message object from Anthropic
|
|
195
|
+
* @param options - Optional configuration including provider tokens
|
|
196
|
+
* @returns Array with a single user message containing tool results, or empty array if no tool calls
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* ```typescript
|
|
200
|
+
* import { serverClient } from '@/lib/integrate-server';
|
|
201
|
+
* import { getAnthropicTools, handleAnthropicMessage } from 'integrate-sdk/server';
|
|
202
|
+
* import Anthropic from '@anthropic-ai/sdk';
|
|
203
|
+
*
|
|
204
|
+
* const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
|
|
205
|
+
*
|
|
206
|
+
* export async function POST(req: Request) {
|
|
207
|
+
* const { messages } = await req.json();
|
|
208
|
+
*
|
|
209
|
+
* // Initial request with tools
|
|
210
|
+
* const message = await anthropic.messages.create({
|
|
211
|
+
* model: 'claude-3-5-sonnet-20241022',
|
|
212
|
+
* max_tokens: 1024,
|
|
213
|
+
* tools: await getAnthropicTools(serverClient),
|
|
214
|
+
* messages,
|
|
215
|
+
* });
|
|
216
|
+
*
|
|
217
|
+
* // If there are tool calls, handle them automatically
|
|
218
|
+
* if (message.stop_reason === 'tool_use') {
|
|
219
|
+
* const toolMessages = await handleAnthropicMessage(serverClient, message);
|
|
220
|
+
*
|
|
221
|
+
* // Continue conversation with tool results
|
|
222
|
+
* const finalMessage = await anthropic.messages.create({
|
|
223
|
+
* model: 'claude-3-5-sonnet-20241022',
|
|
224
|
+
* max_tokens: 1024,
|
|
225
|
+
* tools: await getAnthropicTools(serverClient),
|
|
226
|
+
* messages: [
|
|
227
|
+
* ...messages,
|
|
228
|
+
* { role: 'assistant', content: message.content },
|
|
229
|
+
* ...toolMessages,
|
|
230
|
+
* ],
|
|
231
|
+
* });
|
|
232
|
+
*
|
|
233
|
+
* return Response.json(finalMessage);
|
|
234
|
+
* }
|
|
235
|
+
*
|
|
236
|
+
* return Response.json(message);
|
|
237
|
+
* }
|
|
238
|
+
* ```
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* ```typescript
|
|
242
|
+
* // Manual token override
|
|
243
|
+
* const toolMessages = await handleAnthropicMessage(serverClient, message, {
|
|
244
|
+
* providerTokens: { github: 'ghp_...', gmail: 'ya29...' }
|
|
245
|
+
* });
|
|
246
|
+
* ```
|
|
247
|
+
*/
|
|
248
|
+
export declare function handleAnthropicMessage(client: MCPClient<any>, message: Anthropic.Messages.Message, options?: AnthropicToolsOptions): Promise<Anthropic.Messages.MessageParam[]>;
|
|
182
249
|
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/ai/anthropic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/ai/anthropic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AACjH,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,cAAc;CAAI;AAEjE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,EACvB,QAAQ,CAAC,EAAE,qBAAqB,GAC/B,aAAa,CAUf;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,EAAE,CAGjB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,EAAE,qBAAqB,EAC9B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,cAAc,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAA,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAAC,EAC1D,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAkCrC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,aAAa,EAAE,CAAC,CAe1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO,EACnC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CA4B5C"}
|
package/dist/src/ai/openai.d.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import type { MCPClient } from "../client.js";
|
|
7
7
|
import type { MCPTool } from "../protocol/messages.js";
|
|
8
8
|
import { type AIToolsOptions } from "./utils.js";
|
|
9
|
+
import type { OpenAI } from "openai";
|
|
9
10
|
/**
|
|
10
11
|
* OpenAI function tool definition
|
|
11
12
|
* Compatible with OpenAI's Responses API format
|
|
@@ -13,14 +14,11 @@ import { type AIToolsOptions } from "./utils.js";
|
|
|
13
14
|
export interface OpenAITool {
|
|
14
15
|
type: 'function';
|
|
15
16
|
name: string;
|
|
16
|
-
description?: string;
|
|
17
17
|
parameters: {
|
|
18
|
-
type: 'object';
|
|
19
|
-
properties?: Record<string, unknown>;
|
|
20
|
-
required?: string[];
|
|
21
18
|
[key: string]: unknown;
|
|
22
|
-
};
|
|
23
|
-
strict
|
|
19
|
+
} | null;
|
|
20
|
+
strict: boolean | null;
|
|
21
|
+
description?: string | null;
|
|
24
22
|
}
|
|
25
23
|
/**
|
|
26
24
|
* Options for converting MCP tools to OpenAI format
|
|
@@ -127,4 +125,100 @@ export declare function executeOpenAIToolCall(client: MCPClient<any>, toolCall:
|
|
|
127
125
|
* ```
|
|
128
126
|
*/
|
|
129
127
|
export declare function getOpenAITools(client: MCPClient<any>, options?: OpenAIToolsOptions): Promise<OpenAITool[]>;
|
|
128
|
+
/**
|
|
129
|
+
* Handle multiple tool calls from OpenAI's response output
|
|
130
|
+
*
|
|
131
|
+
* This function processes all function_call items from the response output,
|
|
132
|
+
* executes each tool call, and returns formatted results for the next request.
|
|
133
|
+
*
|
|
134
|
+
* @param client - The MCP client instance
|
|
135
|
+
* @param toolCalls - Array of output items from OpenAI response (filters for function_call type)
|
|
136
|
+
* @param options - Optional configuration including provider tokens
|
|
137
|
+
* @returns Array of function call outputs to send back to OpenAI
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```typescript
|
|
141
|
+
* // Handle tool calls from a response
|
|
142
|
+
* const response = await openai.responses.create({
|
|
143
|
+
* model: 'gpt-4o-2024-11-20',
|
|
144
|
+
* input: 'Create a GitHub issue',
|
|
145
|
+
* tools: await getOpenAITools(serverClient),
|
|
146
|
+
* });
|
|
147
|
+
*
|
|
148
|
+
* // Execute the tool calls and get outputs
|
|
149
|
+
* const toolOutputs = await handleOpenAIToolCalls(
|
|
150
|
+
* serverClient,
|
|
151
|
+
* response.output,
|
|
152
|
+
* { providerTokens }
|
|
153
|
+
* );
|
|
154
|
+
*
|
|
155
|
+
* // Continue the conversation with tool results
|
|
156
|
+
* const nextResponse = await openai.responses.create({
|
|
157
|
+
* model: 'gpt-4o-2024-11-20',
|
|
158
|
+
* input: toolOutputs,
|
|
159
|
+
* tools: await getOpenAITools(serverClient),
|
|
160
|
+
* });
|
|
161
|
+
* ```
|
|
162
|
+
*/
|
|
163
|
+
export declare function handleOpenAIToolCalls(client: MCPClient<any>, toolCalls: OpenAI.Responses.ResponseOutputItem[], options?: OpenAIToolsOptions): Promise<OpenAI.Responses.ResponseInputItem.FunctionCallOutput[]>;
|
|
164
|
+
/**
|
|
165
|
+
* Handle an entire OpenAI Response object
|
|
166
|
+
*
|
|
167
|
+
* This is a convenience function that extracts tool calls from a Response
|
|
168
|
+
* object and executes them. Use this when you want to process all tool
|
|
169
|
+
* calls from a response in one go.
|
|
170
|
+
*
|
|
171
|
+
* **Auto-extraction**: Provider tokens are automatically extracted from request headers
|
|
172
|
+
* or environment variables if not provided in options.
|
|
173
|
+
*
|
|
174
|
+
* @param client - The MCP client instance
|
|
175
|
+
* @param response - The complete Response object from OpenAI
|
|
176
|
+
* @param options - Optional configuration including provider tokens
|
|
177
|
+
* @returns Array of function call outputs to send back to OpenAI
|
|
178
|
+
*
|
|
179
|
+
* @example
|
|
180
|
+
* ```typescript
|
|
181
|
+
* import { serverClient } from '@/lib/integrate-server';
|
|
182
|
+
* import { getOpenAITools, handleOpenAIResponse } from 'integrate-sdk/server';
|
|
183
|
+
* import OpenAI from 'openai';
|
|
184
|
+
*
|
|
185
|
+
* const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
|
|
186
|
+
*
|
|
187
|
+
* export async function POST(req: Request) {
|
|
188
|
+
* const { messages } = await req.json();
|
|
189
|
+
*
|
|
190
|
+
* // Initial request with tools
|
|
191
|
+
* const response = await openai.responses.create({
|
|
192
|
+
* model: 'gpt-4o-2024-11-20',
|
|
193
|
+
* input: messages,
|
|
194
|
+
* tools: await getOpenAITools(serverClient),
|
|
195
|
+
* });
|
|
196
|
+
*
|
|
197
|
+
* // If there are tool calls, handle them automatically
|
|
198
|
+
* if (response.output.some(item => item.type === 'function_call')) {
|
|
199
|
+
* const toolOutputs = await handleOpenAIResponse(serverClient, response);
|
|
200
|
+
*
|
|
201
|
+
* // Continue conversation with tool results
|
|
202
|
+
* const finalResponse = await openai.responses.create({
|
|
203
|
+
* model: 'gpt-4o-2024-11-20',
|
|
204
|
+
* input: toolOutputs,
|
|
205
|
+
* tools: await getOpenAITools(serverClient),
|
|
206
|
+
* });
|
|
207
|
+
*
|
|
208
|
+
* return Response.json(finalResponse);
|
|
209
|
+
* }
|
|
210
|
+
*
|
|
211
|
+
* return Response.json(response);
|
|
212
|
+
* }
|
|
213
|
+
* ```
|
|
214
|
+
*
|
|
215
|
+
* @example
|
|
216
|
+
* ```typescript
|
|
217
|
+
* // Manual token override
|
|
218
|
+
* const toolOutputs = await handleOpenAIResponse(serverClient, response, {
|
|
219
|
+
* providerTokens: { github: 'ghp_...', gmail: 'ya29...' }
|
|
220
|
+
* });
|
|
221
|
+
* ```
|
|
222
|
+
*/
|
|
223
|
+
export declare function handleOpenAIResponse(client: MCPClient<any>, response: OpenAI.Responses.Response, options?: OpenAIToolsOptions): Promise<OpenAI.Responses.ResponseInputItem.FunctionCallOutput[]>;
|
|
130
224
|
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/ai/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/ai/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AACjH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE;QACV,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,GAAG,IAAI,CAAC;IACT,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,EACvB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,UAAU,CAUZ;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,UAAU,EAAE,CAGd;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE;IACR,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,UAAU,EAAE,CAAC,CAevB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,kBAAkB,EAAE,EAChD,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,CAAC,CA+BlE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACnC,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,CAAC,CAoBlE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "integrate-sdk",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.39",
|
|
4
4
|
"description": "Type-safe 3rd party integration SDK for the Integrate MCP server",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -71,8 +71,10 @@
|
|
|
71
71
|
"zod": "^3.23.8"
|
|
72
72
|
},
|
|
73
73
|
"devDependencies": {
|
|
74
|
+
"@anthropic-ai/sdk": "^0.32.1",
|
|
74
75
|
"@types/bun": "latest",
|
|
75
76
|
"@types/react": "^18.3.0",
|
|
77
|
+
"openai": "^4.77.3",
|
|
76
78
|
"react": "^19.2.0",
|
|
77
79
|
"simple-git-hooks": "^2.13.1",
|
|
78
80
|
"typescript": "^5.3.3"
|