@tanstack/openai-base 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/adapters/chat-completions-text.d.ts +76 -0
- package/dist/esm/adapters/chat-completions-text.js +411 -0
- package/dist/esm/adapters/chat-completions-text.js.map +1 -0
- package/dist/esm/adapters/chat-completions-tool-converter.d.ts +24 -0
- package/dist/esm/adapters/chat-completions-tool-converter.js +29 -0
- package/dist/esm/adapters/chat-completions-tool-converter.js.map +1 -0
- package/dist/esm/adapters/image.d.ts +32 -0
- package/dist/esm/adapters/image.js +69 -0
- package/dist/esm/adapters/image.js.map +1 -0
- package/dist/esm/adapters/responses-text.d.ts +115 -0
- package/dist/esm/adapters/responses-text.js +635 -0
- package/dist/esm/adapters/responses-text.js.map +1 -0
- package/dist/esm/adapters/responses-tool-converter.d.ts +35 -0
- package/dist/esm/adapters/responses-tool-converter.js +27 -0
- package/dist/esm/adapters/responses-tool-converter.js.map +1 -0
- package/dist/esm/adapters/summarize.d.ts +28 -0
- package/dist/esm/adapters/summarize.js +74 -0
- package/dist/esm/adapters/summarize.js.map +1 -0
- package/dist/esm/adapters/transcription.d.ts +39 -0
- package/dist/esm/adapters/transcription.js +139 -0
- package/dist/esm/adapters/transcription.js.map +1 -0
- package/dist/esm/adapters/tts.d.ts +26 -0
- package/dist/esm/adapters/tts.js +65 -0
- package/dist/esm/adapters/tts.js.map +1 -0
- package/dist/esm/adapters/video.d.ts +48 -0
- package/dist/esm/adapters/video.js +192 -0
- package/dist/esm/adapters/video.js.map +1 -0
- package/dist/esm/index.d.ts +15 -0
- package/dist/esm/index.js +65 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/tools/apply-patch-tool.d.ts +11 -0
- package/dist/esm/tools/apply-patch-tool.js +17 -0
- package/dist/esm/tools/apply-patch-tool.js.map +1 -0
- package/dist/esm/tools/code-interpreter-tool.d.ts +11 -0
- package/dist/esm/tools/code-interpreter-tool.js +22 -0
- package/dist/esm/tools/code-interpreter-tool.js.map +1 -0
- package/dist/esm/tools/computer-use-tool.d.ts +11 -0
- package/dist/esm/tools/computer-use-tool.js +23 -0
- package/dist/esm/tools/computer-use-tool.js.map +1 -0
- package/dist/esm/tools/custom-tool.d.ts +11 -0
- package/dist/esm/tools/custom-tool.js +23 -0
- package/dist/esm/tools/custom-tool.js.map +1 -0
- package/dist/esm/tools/file-search-tool.d.ts +11 -0
- package/dist/esm/tools/file-search-tool.js +30 -0
- package/dist/esm/tools/file-search-tool.js.map +1 -0
- package/dist/esm/tools/function-tool.d.ts +15 -0
- package/dist/esm/tools/function-tool.js +24 -0
- package/dist/esm/tools/function-tool.js.map +1 -0
- package/dist/esm/tools/image-generation-tool.d.ts +11 -0
- package/dist/esm/tools/image-generation-tool.js +27 -0
- package/dist/esm/tools/image-generation-tool.js.map +1 -0
- package/dist/esm/tools/index.d.ts +27 -0
- package/dist/esm/tools/local-shell-tool.d.ts +11 -0
- package/dist/esm/tools/local-shell-tool.js +17 -0
- package/dist/esm/tools/local-shell-tool.js.map +1 -0
- package/dist/esm/tools/mcp-tool.d.ts +12 -0
- package/dist/esm/tools/mcp-tool.js +31 -0
- package/dist/esm/tools/mcp-tool.js.map +1 -0
- package/dist/esm/tools/shell-tool.d.ts +11 -0
- package/dist/esm/tools/shell-tool.js +17 -0
- package/dist/esm/tools/shell-tool.js.map +1 -0
- package/dist/esm/tools/tool-choice.d.ts +17 -0
- package/dist/esm/tools/tool-converter.d.ts +6 -0
- package/dist/esm/tools/tool-converter.js +61 -0
- package/dist/esm/tools/tool-converter.js.map +1 -0
- package/dist/esm/tools/web-search-preview-tool.d.ts +11 -0
- package/dist/esm/tools/web-search-preview-tool.js +20 -0
- package/dist/esm/tools/web-search-preview-tool.js.map +1 -0
- package/dist/esm/tools/web-search-tool.d.ts +11 -0
- package/dist/esm/tools/web-search-tool.js +16 -0
- package/dist/esm/tools/web-search-tool.js.map +1 -0
- package/dist/esm/types/config.d.ts +4 -0
- package/dist/esm/types/message-metadata.d.ts +19 -0
- package/dist/esm/types/provider-options.d.ts +40 -0
- package/dist/esm/utils/client.d.ts +3 -0
- package/dist/esm/utils/client.js +8 -0
- package/dist/esm/utils/client.js.map +1 -0
- package/dist/esm/utils/schema-converter.d.ts +12 -0
- package/dist/esm/utils/schema-converter.js +65 -0
- package/dist/esm/utils/schema-converter.js.map +1 -0
- package/package.json +57 -0
- package/src/adapters/chat-completions-text.ts +817 -0
- package/src/adapters/chat-completions-tool-converter.ts +70 -0
- package/src/adapters/image.ts +158 -0
- package/src/adapters/responses-text.ts +1147 -0
- package/src/adapters/responses-tool-converter.ts +77 -0
- package/src/adapters/summarize.ts +174 -0
- package/src/adapters/transcription.ts +194 -0
- package/src/adapters/tts.ts +124 -0
- package/src/adapters/video.ts +385 -0
- package/src/index.ts +24 -0
- package/src/tools/apply-patch-tool.ts +32 -0
- package/src/tools/code-interpreter-tool.ts +39 -0
- package/src/tools/computer-use-tool.ts +38 -0
- package/src/tools/custom-tool.ts +33 -0
- package/src/tools/file-search-tool.ts +51 -0
- package/src/tools/function-tool.ts +44 -0
- package/src/tools/image-generation-tool.ts +51 -0
- package/src/tools/index.ts +41 -0
- package/src/tools/local-shell-tool.ts +32 -0
- package/src/tools/mcp-tool.ts +47 -0
- package/src/tools/shell-tool.ts +30 -0
- package/src/tools/tool-choice.ts +31 -0
- package/src/tools/tool-converter.ts +68 -0
- package/src/tools/web-search-preview-tool.ts +39 -0
- package/src/tools/web-search-tool.ts +38 -0
- package/src/types/config.ts +5 -0
- package/src/utils/client.ts +8 -0
- package/src/utils/request-options.ts +16 -0
- package/src/utils/schema-converter.ts +89 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { BaseVideoAdapter } from '@tanstack/ai/adapters';
|
|
2
|
+
import { VideoGenerationOptions, VideoJobResult, VideoStatusResult, VideoUrlResult } from '@tanstack/ai';
|
|
3
|
+
import { default as OpenAI_SDK } from 'openai';
|
|
4
|
+
import { OpenAICompatibleClientConfig } from '../types/config.js';
|
|
5
|
+
/**
|
|
6
|
+
* OpenAI-Compatible Video Generation Adapter
|
|
7
|
+
*
|
|
8
|
+
* A generalized base class for providers that implement OpenAI-compatible video
|
|
9
|
+
* generation APIs. Uses a job/polling architecture for async video generation.
|
|
10
|
+
*
|
|
11
|
+
* Providers can extend this class and only need to:
|
|
12
|
+
* - Set `baseURL` in the config
|
|
13
|
+
* - Lock the generic type parameters to provider-specific types
|
|
14
|
+
* - Override validation or request building methods as needed
|
|
15
|
+
*
|
|
16
|
+
* All methods that validate inputs, build requests, or map responses are `protected`
|
|
17
|
+
* so subclasses can override them.
|
|
18
|
+
*
|
|
19
|
+
* @experimental Video generation is an experimental feature and may change.
|
|
20
|
+
*/
|
|
21
|
+
export declare class OpenAICompatibleVideoAdapter<TModel extends string, TProviderOptions extends object = Record<string, any>, TModelProviderOptionsByName extends Record<string, any> = Record<string, any>, TModelSizeByName extends Record<string, string> = Record<string, string>> extends BaseVideoAdapter<TModel, TProviderOptions, TModelProviderOptionsByName, TModelSizeByName> {
|
|
22
|
+
readonly name: string;
|
|
23
|
+
protected client: OpenAI_SDK;
|
|
24
|
+
protected clientConfig: OpenAICompatibleClientConfig;
|
|
25
|
+
constructor(config: OpenAICompatibleClientConfig, model: TModel, name?: string);
|
|
26
|
+
/**
|
|
27
|
+
* Create a new video generation job.
|
|
28
|
+
*
|
|
29
|
+
* @experimental Video generation is an experimental feature and may change.
|
|
30
|
+
*/
|
|
31
|
+
createVideoJob(options: VideoGenerationOptions<TProviderOptions>): Promise<VideoJobResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Get the current status of a video generation job.
|
|
34
|
+
*
|
|
35
|
+
* @experimental Video generation is an experimental feature and may change.
|
|
36
|
+
*/
|
|
37
|
+
getVideoStatus(jobId: string): Promise<VideoStatusResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Get the URL to download/view the generated video.
|
|
40
|
+
*
|
|
41
|
+
* @experimental Video generation is an experimental feature and may change.
|
|
42
|
+
*/
|
|
43
|
+
getVideoUrl(jobId: string): Promise<VideoUrlResult>;
|
|
44
|
+
protected buildRequest(options: VideoGenerationOptions<TProviderOptions>): Record<string, any>;
|
|
45
|
+
protected validateVideoSize(_model: string, _size?: string): void;
|
|
46
|
+
protected validateVideoSeconds(_model: string, _seconds?: number | string): void;
|
|
47
|
+
protected mapStatus(apiStatus: string): 'pending' | 'processing' | 'completed' | 'failed';
|
|
48
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { BaseVideoAdapter } from "@tanstack/ai/adapters";
|
|
2
|
+
import { createOpenAICompatibleClient } from "../utils/client.js";
|
|
3
|
+
class OpenAICompatibleVideoAdapter extends BaseVideoAdapter {
|
|
4
|
+
constructor(config, model, name = "openai-compatible") {
|
|
5
|
+
super(config, model);
|
|
6
|
+
this.name = name;
|
|
7
|
+
this.clientConfig = config;
|
|
8
|
+
this.client = createOpenAICompatibleClient(config);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Create a new video generation job.
|
|
12
|
+
*
|
|
13
|
+
* @experimental Video generation is an experimental feature and may change.
|
|
14
|
+
*/
|
|
15
|
+
async createVideoJob(options) {
|
|
16
|
+
const { model, size, duration, modelOptions } = options;
|
|
17
|
+
this.validateVideoSize(model, size);
|
|
18
|
+
const seconds = duration ?? modelOptions?.seconds;
|
|
19
|
+
this.validateVideoSeconds(model, seconds);
|
|
20
|
+
const request = this.buildRequest(options);
|
|
21
|
+
try {
|
|
22
|
+
const client = this.client;
|
|
23
|
+
const response = await client.videos.create(request);
|
|
24
|
+
return {
|
|
25
|
+
jobId: response.id,
|
|
26
|
+
model
|
|
27
|
+
};
|
|
28
|
+
} catch (error) {
|
|
29
|
+
if (error?.message?.includes("videos") || error?.code === "invalid_api") {
|
|
30
|
+
throw new Error(
|
|
31
|
+
`Video generation API is not available. The API may require special access. Original error: ${error.message}`
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get the current status of a video generation job.
|
|
39
|
+
*
|
|
40
|
+
* @experimental Video generation is an experimental feature and may change.
|
|
41
|
+
*/
|
|
42
|
+
async getVideoStatus(jobId) {
|
|
43
|
+
try {
|
|
44
|
+
const client = this.client;
|
|
45
|
+
const response = await client.videos.retrieve(jobId);
|
|
46
|
+
return {
|
|
47
|
+
jobId,
|
|
48
|
+
status: this.mapStatus(response.status),
|
|
49
|
+
progress: response.progress,
|
|
50
|
+
error: response.error?.message
|
|
51
|
+
};
|
|
52
|
+
} catch (error) {
|
|
53
|
+
if (error.status === 404) {
|
|
54
|
+
return {
|
|
55
|
+
jobId,
|
|
56
|
+
status: "failed",
|
|
57
|
+
error: "Job not found"
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get the URL to download/view the generated video.
|
|
65
|
+
*
|
|
66
|
+
* @experimental Video generation is an experimental feature and may change.
|
|
67
|
+
*/
|
|
68
|
+
async getVideoUrl(jobId) {
|
|
69
|
+
try {
|
|
70
|
+
const client = this.client;
|
|
71
|
+
let response;
|
|
72
|
+
if (typeof client.videos?.downloadContent === "function") {
|
|
73
|
+
const contentResponse = await client.videos.downloadContent(jobId);
|
|
74
|
+
const videoBlob = await contentResponse.blob();
|
|
75
|
+
const buffer = await videoBlob.arrayBuffer();
|
|
76
|
+
const base64 = Buffer.from(buffer).toString("base64");
|
|
77
|
+
const mimeType = contentResponse.headers.get("content-type") || "video/mp4";
|
|
78
|
+
return {
|
|
79
|
+
jobId,
|
|
80
|
+
url: `data:${mimeType};base64,${base64}`,
|
|
81
|
+
expiresAt: void 0
|
|
82
|
+
};
|
|
83
|
+
} else if (typeof client.videos?.content === "function") {
|
|
84
|
+
response = await client.videos.content(jobId);
|
|
85
|
+
} else if (typeof client.videos?.getContent === "function") {
|
|
86
|
+
response = await client.videos.getContent(jobId);
|
|
87
|
+
} else if (typeof client.videos?.download === "function") {
|
|
88
|
+
response = await client.videos.download(jobId);
|
|
89
|
+
} else {
|
|
90
|
+
const videoInfo = await client.videos.retrieve(jobId);
|
|
91
|
+
if (videoInfo.url) {
|
|
92
|
+
return {
|
|
93
|
+
jobId,
|
|
94
|
+
url: videoInfo.url,
|
|
95
|
+
expiresAt: videoInfo.expires_at ? new Date(videoInfo.expires_at * 1e3) : void 0
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
const baseUrl = this.clientConfig.baseURL || "https://api.openai.com/v1";
|
|
99
|
+
const apiKey = this.clientConfig.apiKey;
|
|
100
|
+
const contentResponse = await fetch(
|
|
101
|
+
`${baseUrl}/videos/${jobId}/content`,
|
|
102
|
+
{
|
|
103
|
+
method: "GET",
|
|
104
|
+
headers: {
|
|
105
|
+
Authorization: `Bearer ${apiKey}`
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
);
|
|
109
|
+
if (!contentResponse.ok) {
|
|
110
|
+
const contentType = contentResponse.headers.get("content-type");
|
|
111
|
+
if (contentType?.includes("application/json")) {
|
|
112
|
+
const errorData = await contentResponse.json().catch(() => ({}));
|
|
113
|
+
throw new Error(
|
|
114
|
+
errorData.error?.message || `Failed to get video content: ${contentResponse.status}`
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
throw new Error(
|
|
118
|
+
`Failed to get video content: ${contentResponse.status}`
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
const videoBlob = await contentResponse.blob();
|
|
122
|
+
const buffer = await videoBlob.arrayBuffer();
|
|
123
|
+
const base64 = Buffer.from(buffer).toString("base64");
|
|
124
|
+
const mimeType = contentResponse.headers.get("content-type") || "video/mp4";
|
|
125
|
+
return {
|
|
126
|
+
jobId,
|
|
127
|
+
url: `data:${mimeType};base64,${base64}`,
|
|
128
|
+
expiresAt: void 0
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
jobId,
|
|
133
|
+
url: response.url,
|
|
134
|
+
expiresAt: response.expires_at ? new Date(response.expires_at * 1e3) : void 0
|
|
135
|
+
};
|
|
136
|
+
} catch (error) {
|
|
137
|
+
if (error.status === 404) {
|
|
138
|
+
throw new Error(`Video job not found: ${jobId}`);
|
|
139
|
+
}
|
|
140
|
+
if (error.status === 400) {
|
|
141
|
+
throw new Error(
|
|
142
|
+
`Video is not ready for download. Check status first. Job ID: ${jobId}`
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
throw error;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
buildRequest(options) {
|
|
149
|
+
const { model, prompt, size, duration, modelOptions } = options;
|
|
150
|
+
const request = {
|
|
151
|
+
model,
|
|
152
|
+
prompt
|
|
153
|
+
};
|
|
154
|
+
if (size) {
|
|
155
|
+
request["size"] = size;
|
|
156
|
+
} else if (modelOptions?.size) {
|
|
157
|
+
request["size"] = modelOptions.size;
|
|
158
|
+
}
|
|
159
|
+
const seconds = duration ?? modelOptions?.seconds;
|
|
160
|
+
if (seconds !== void 0) {
|
|
161
|
+
request["seconds"] = String(seconds);
|
|
162
|
+
}
|
|
163
|
+
return request;
|
|
164
|
+
}
|
|
165
|
+
validateVideoSize(_model, _size) {
|
|
166
|
+
}
|
|
167
|
+
validateVideoSeconds(_model, _seconds) {
|
|
168
|
+
}
|
|
169
|
+
mapStatus(apiStatus) {
|
|
170
|
+
switch (apiStatus) {
|
|
171
|
+
case "queued":
|
|
172
|
+
case "pending":
|
|
173
|
+
return "pending";
|
|
174
|
+
case "processing":
|
|
175
|
+
case "in_progress":
|
|
176
|
+
return "processing";
|
|
177
|
+
case "completed":
|
|
178
|
+
case "succeeded":
|
|
179
|
+
return "completed";
|
|
180
|
+
case "failed":
|
|
181
|
+
case "error":
|
|
182
|
+
case "cancelled":
|
|
183
|
+
return "failed";
|
|
184
|
+
default:
|
|
185
|
+
return "processing";
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
export {
|
|
190
|
+
OpenAICompatibleVideoAdapter
|
|
191
|
+
};
|
|
192
|
+
//# sourceMappingURL=video.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video.js","sources":["../../../src/adapters/video.ts"],"sourcesContent":["import { BaseVideoAdapter } from '@tanstack/ai/adapters'\nimport { createOpenAICompatibleClient } from '../utils/client'\nimport type {\n VideoGenerationOptions,\n VideoJobResult,\n VideoStatusResult,\n VideoUrlResult,\n} from '@tanstack/ai'\nimport type OpenAI_SDK from 'openai'\nimport type { OpenAICompatibleClientConfig } from '../types/config'\n\n/**\n * OpenAI-Compatible Video Generation Adapter\n *\n * A generalized base class for providers that implement OpenAI-compatible video\n * generation APIs. Uses a job/polling architecture for async video generation.\n *\n * Providers can extend this class and only need to:\n * - Set `baseURL` in the config\n * - Lock the generic type parameters to provider-specific types\n * - Override validation or request building methods as needed\n *\n * All methods that validate inputs, build requests, or map responses are `protected`\n * so subclasses can override them.\n *\n * @experimental Video generation is an experimental feature and may change.\n */\nexport class OpenAICompatibleVideoAdapter<\n TModel extends string,\n TProviderOptions extends object = Record<string, any>,\n TModelProviderOptionsByName extends Record<string, any> = Record<string, any>,\n TModelSizeByName extends Record<string, string> = Record<string, string>,\n> extends BaseVideoAdapter<\n TModel,\n TProviderOptions,\n TModelProviderOptionsByName,\n TModelSizeByName\n> {\n readonly name: string\n\n protected client: OpenAI_SDK\n protected clientConfig: OpenAICompatibleClientConfig\n\n constructor(\n config: OpenAICompatibleClientConfig,\n model: TModel,\n name: string = 'openai-compatible',\n ) {\n super(config, model)\n this.name = name\n this.clientConfig = config\n this.client = createOpenAICompatibleClient(config)\n }\n\n /**\n * Create a new video generation job.\n *\n * @experimental Video generation is an experimental feature and may change.\n */\n async createVideoJob(\n options: VideoGenerationOptions<TProviderOptions>,\n ): Promise<VideoJobResult> {\n const { model, size, duration, modelOptions } = options\n\n // Validate inputs\n this.validateVideoSize(model, size)\n const seconds = duration ?? (modelOptions as any)?.seconds\n this.validateVideoSeconds(model, seconds)\n\n // Build request\n const request = this.buildRequest(options)\n\n try {\n const client = this.client as any\n const response = await client.videos.create(request)\n\n return {\n jobId: response.id,\n model,\n }\n } catch (error: any) {\n if (error?.message?.includes('videos') || error?.code === 'invalid_api') {\n throw new Error(\n `Video generation API is not available. The API may require special access. ` +\n `Original error: ${error.message}`,\n )\n }\n throw error\n }\n }\n\n /**\n * Get the current status of a video generation job.\n *\n * @experimental Video generation is an experimental feature and may change.\n */\n async getVideoStatus(jobId: string): Promise<VideoStatusResult> {\n try {\n const client = this.client as any\n const response = await client.videos.retrieve(jobId)\n\n return {\n jobId,\n status: this.mapStatus(response.status),\n progress: response.progress,\n error: response.error?.message,\n }\n } catch (error: any) {\n if (error.status === 404) {\n return {\n jobId,\n status: 'failed',\n error: 'Job not found',\n }\n }\n throw error\n }\n }\n\n /**\n * Get the URL to download/view the generated video.\n *\n * @experimental Video generation is an experimental feature and may change.\n */\n async getVideoUrl(jobId: string): Promise<VideoUrlResult> {\n try {\n const client = this.client as any\n\n let response: any\n\n if (typeof client.videos?.downloadContent === 'function') {\n // OpenAI SDK's downloadContent returns raw video bytes as a Response\n const contentResponse = await client.videos.downloadContent(jobId)\n const videoBlob = await contentResponse.blob()\n const buffer = await videoBlob.arrayBuffer()\n const base64 = Buffer.from(buffer).toString('base64')\n const mimeType =\n contentResponse.headers.get('content-type') || 'video/mp4'\n return {\n jobId,\n url: `data:${mimeType};base64,${base64}`,\n expiresAt: undefined,\n }\n } else if (typeof client.videos?.content === 'function') {\n response = await client.videos.content(jobId)\n } else if (typeof client.videos?.getContent === 'function') {\n response = await client.videos.getContent(jobId)\n } else if (typeof client.videos?.download === 'function') {\n response = await client.videos.download(jobId)\n } else {\n // Fallback: check if retrieve returns the URL directly\n const videoInfo = await client.videos.retrieve(jobId)\n if (videoInfo.url) {\n return {\n jobId,\n url: videoInfo.url,\n expiresAt: videoInfo.expires_at\n ? new Date(videoInfo.expires_at * 1000)\n : undefined,\n }\n }\n\n // Fetch and return a data URL\n const baseUrl = this.clientConfig.baseURL || 'https://api.openai.com/v1'\n const apiKey = this.clientConfig.apiKey\n\n const contentResponse = await fetch(\n `${baseUrl}/videos/${jobId}/content`,\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n },\n )\n\n if (!contentResponse.ok) {\n const contentType = contentResponse.headers.get('content-type')\n if (contentType?.includes('application/json')) {\n const errorData = await contentResponse.json().catch(() => ({}))\n throw new Error(\n errorData.error?.message ||\n `Failed to get video content: ${contentResponse.status}`,\n )\n }\n throw new Error(\n `Failed to get video content: ${contentResponse.status}`,\n )\n }\n\n const videoBlob = await contentResponse.blob()\n const buffer = await videoBlob.arrayBuffer()\n const base64 = Buffer.from(buffer).toString('base64')\n const mimeType =\n contentResponse.headers.get('content-type') || 'video/mp4'\n\n return {\n jobId,\n url: `data:${mimeType};base64,${base64}`,\n expiresAt: undefined,\n }\n }\n\n return {\n jobId,\n url: response.url,\n expiresAt: response.expires_at\n ? new Date(response.expires_at * 1000)\n : undefined,\n }\n } catch (error: any) {\n if (error.status === 404) {\n throw new Error(`Video job not found: ${jobId}`)\n }\n if (error.status === 400) {\n throw new Error(\n `Video is not ready for download. Check status first. Job ID: ${jobId}`,\n )\n }\n throw error\n }\n }\n\n protected buildRequest(\n options: VideoGenerationOptions<TProviderOptions>,\n ): Record<string, any> {\n const { model, prompt, size, duration, modelOptions } = options\n\n const request: Record<string, any> = {\n model,\n prompt,\n }\n\n if (size) {\n request['size'] = size\n } else if ((modelOptions as any)?.size) {\n request['size'] = (modelOptions as any).size\n }\n\n const seconds = duration ?? (modelOptions as any)?.seconds\n if (seconds !== undefined) {\n request['seconds'] = String(seconds)\n }\n\n return request\n }\n\n protected validateVideoSize(_model: string, _size?: string): void {\n // Default: no size validation — subclasses can override\n }\n\n protected validateVideoSeconds(\n _model: string,\n _seconds?: number | string,\n ): void {\n // Default: no duration validation — subclasses can override\n }\n\n protected mapStatus(\n apiStatus: string,\n ): 'pending' | 'processing' | 'completed' | 'failed' {\n switch (apiStatus) {\n case 'queued':\n case 'pending':\n return 'pending'\n case 'processing':\n case 'in_progress':\n return 'processing'\n case 'completed':\n case 'succeeded':\n return 'completed'\n case 'failed':\n case 'error':\n case 'cancelled':\n return 'failed'\n default:\n return 'processing'\n }\n }\n}\n"],"names":[],"mappings":";;AA2BO,MAAM,qCAKH,iBAKR;AAAA,EAMA,YACE,QACA,OACA,OAAe,qBACf;AACA,UAAM,QAAQ,KAAK;AACnB,SAAK,OAAO;AACZ,SAAK,eAAe;AACpB,SAAK,SAAS,6BAA6B,MAAM;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eACJ,SACyB;AACzB,UAAM,EAAE,OAAO,MAAM,UAAU,iBAAiB;AAGhD,SAAK,kBAAkB,OAAO,IAAI;AAClC,UAAM,UAAU,YAAa,cAAsB;AACnD,SAAK,qBAAqB,OAAO,OAAO;AAGxC,UAAM,UAAU,KAAK,aAAa,OAAO;AAEzC,QAAI;AACF,YAAM,SAAS,KAAK;AACpB,YAAM,WAAW,MAAM,OAAO,OAAO,OAAO,OAAO;AAEnD,aAAO;AAAA,QACL,OAAO,SAAS;AAAA,QAChB;AAAA,MAAA;AAAA,IAEJ,SAAS,OAAY;AACnB,UAAI,OAAO,SAAS,SAAS,QAAQ,KAAK,OAAO,SAAS,eAAe;AACvE,cAAM,IAAI;AAAA,UACR,8FACqB,MAAM,OAAO;AAAA,QAAA;AAAA,MAEtC;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAe,OAA2C;AAC9D,QAAI;AACF,YAAM,SAAS,KAAK;AACpB,YAAM,WAAW,MAAM,OAAO,OAAO,SAAS,KAAK;AAEnD,aAAO;AAAA,QACL;AAAA,QACA,QAAQ,KAAK,UAAU,SAAS,MAAM;AAAA,QACtC,UAAU,SAAS;AAAA,QACnB,OAAO,SAAS,OAAO;AAAA,MAAA;AAAA,IAE3B,SAAS,OAAY;AACnB,UAAI,MAAM,WAAW,KAAK;AACxB,eAAO;AAAA,UACL;AAAA,UACA,QAAQ;AAAA,UACR,OAAO;AAAA,QAAA;AAAA,MAEX;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY,OAAwC;AACxD,QAAI;AACF,YAAM,SAAS,KAAK;AAEpB,UAAI;AAEJ,UAAI,OAAO,OAAO,QAAQ,oBAAoB,YAAY;AAExD,cAAM,kBAAkB,MAAM,OAAO,OAAO,gBAAgB,KAAK;AACjE,cAAM,YAAY,MAAM,gBAAgB,KAAA;AACxC,cAAM,SAAS,MAAM,UAAU,YAAA;AAC/B,cAAM,SAAS,OAAO,KAAK,MAAM,EAAE,SAAS,QAAQ;AACpD,cAAM,WACJ,gBAAgB,QAAQ,IAAI,cAAc,KAAK;AACjD,eAAO;AAAA,UACL;AAAA,UACA,KAAK,QAAQ,QAAQ,WAAW,MAAM;AAAA,UACtC,WAAW;AAAA,QAAA;AAAA,MAEf,WAAW,OAAO,OAAO,QAAQ,YAAY,YAAY;AACvD,mBAAW,MAAM,OAAO,OAAO,QAAQ,KAAK;AAAA,MAC9C,WAAW,OAAO,OAAO,QAAQ,eAAe,YAAY;AAC1D,mBAAW,MAAM,OAAO,OAAO,WAAW,KAAK;AAAA,MACjD,WAAW,OAAO,OAAO,QAAQ,aAAa,YAAY;AACxD,mBAAW,MAAM,OAAO,OAAO,SAAS,KAAK;AAAA,MAC/C,OAAO;AAEL,cAAM,YAAY,MAAM,OAAO,OAAO,SAAS,KAAK;AACpD,YAAI,UAAU,KAAK;AACjB,iBAAO;AAAA,YACL;AAAA,YACA,KAAK,UAAU;AAAA,YACf,WAAW,UAAU,aACjB,IAAI,KAAK,UAAU,aAAa,GAAI,IACpC;AAAA,UAAA;AAAA,QAER;AAGA,cAAM,UAAU,KAAK,aAAa,WAAW;AAC7C,cAAM,SAAS,KAAK,aAAa;AAEjC,cAAM,kBAAkB,MAAM;AAAA,UAC5B,GAAG,OAAO,WAAW,KAAK;AAAA,UAC1B;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,eAAe,UAAU,MAAM;AAAA,YAAA;AAAA,UACjC;AAAA,QACF;AAGF,YAAI,CAAC,gBAAgB,IAAI;AACvB,gBAAM,cAAc,gBAAgB,QAAQ,IAAI,cAAc;AAC9D,cAAI,aAAa,SAAS,kBAAkB,GAAG;AAC7C,kBAAM,YAAY,MAAM,gBAAgB,KAAA,EAAO,MAAM,OAAO,CAAA,EAAG;AAC/D,kBAAM,IAAI;AAAA,cACR,UAAU,OAAO,WACf,gCAAgC,gBAAgB,MAAM;AAAA,YAAA;AAAA,UAE5D;AACA,gBAAM,IAAI;AAAA,YACR,gCAAgC,gBAAgB,MAAM;AAAA,UAAA;AAAA,QAE1D;AAEA,cAAM,YAAY,MAAM,gBAAgB,KAAA;AACxC,cAAM,SAAS,MAAM,UAAU,YAAA;AAC/B,cAAM,SAAS,OAAO,KAAK,MAAM,EAAE,SAAS,QAAQ;AACpD,cAAM,WACJ,gBAAgB,QAAQ,IAAI,cAAc,KAAK;AAEjD,eAAO;AAAA,UACL;AAAA,UACA,KAAK,QAAQ,QAAQ,WAAW,MAAM;AAAA,UACtC,WAAW;AAAA,QAAA;AAAA,MAEf;AAEA,aAAO;AAAA,QACL;AAAA,QACA,KAAK,SAAS;AAAA,QACd,WAAW,SAAS,aAChB,IAAI,KAAK,SAAS,aAAa,GAAI,IACnC;AAAA,MAAA;AAAA,IAER,SAAS,OAAY;AACnB,UAAI,MAAM,WAAW,KAAK;AACxB,cAAM,IAAI,MAAM,wBAAwB,KAAK,EAAE;AAAA,MACjD;AACA,UAAI,MAAM,WAAW,KAAK;AACxB,cAAM,IAAI;AAAA,UACR,gEAAgE,KAAK;AAAA,QAAA;AAAA,MAEzE;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEU,aACR,SACqB;AACrB,UAAM,EAAE,OAAO,QAAQ,MAAM,UAAU,iBAAiB;AAExD,UAAM,UAA+B;AAAA,MACnC;AAAA,MACA;AAAA,IAAA;AAGF,QAAI,MAAM;AACR,cAAQ,MAAM,IAAI;AAAA,IACpB,WAAY,cAAsB,MAAM;AACtC,cAAQ,MAAM,IAAK,aAAqB;AAAA,IAC1C;AAEA,UAAM,UAAU,YAAa,cAAsB;AACnD,QAAI,YAAY,QAAW;AACzB,cAAQ,SAAS,IAAI,OAAO,OAAO;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AAAA,EAEU,kBAAkB,QAAgB,OAAsB;AAAA,EAElE;AAAA,EAEU,qBACR,QACA,UACM;AAAA,EAER;AAAA,EAEU,UACR,WACmD;AACnD,YAAQ,WAAA;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AACF;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { makeStructuredOutputCompatible } from './utils/schema-converter.js';
|
|
2
|
+
export { createOpenAICompatibleClient } from './utils/client.js';
|
|
3
|
+
export type { OpenAICompatibleClientConfig } from './types/config.js';
|
|
4
|
+
export * from './tools/index.js';
|
|
5
|
+
export * from './types/message-metadata.js';
|
|
6
|
+
export * from './types/provider-options.js';
|
|
7
|
+
export { OpenAICompatibleChatCompletionsTextAdapter } from './adapters/chat-completions-text.js';
|
|
8
|
+
export { convertFunctionToolToChatCompletionsFormat, convertToolsToChatCompletionsFormat, type ChatCompletionFunctionTool, } from './adapters/chat-completions-tool-converter.js';
|
|
9
|
+
export { OpenAICompatibleResponsesTextAdapter } from './adapters/responses-text.js';
|
|
10
|
+
export { convertFunctionToolToResponsesFormat, convertToolsToResponsesFormat, type ResponsesFunctionTool, } from './adapters/responses-tool-converter.js';
|
|
11
|
+
export { OpenAICompatibleImageAdapter } from './adapters/image.js';
|
|
12
|
+
export { OpenAICompatibleSummarizeAdapter, type ChatStreamCapable, } from './adapters/summarize.js';
|
|
13
|
+
export { OpenAICompatibleTranscriptionAdapter } from './adapters/transcription.js';
|
|
14
|
+
export { OpenAICompatibleTTSAdapter } from './adapters/tts.js';
|
|
15
|
+
export { OpenAICompatibleVideoAdapter } from './adapters/video.js';
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { makeStructuredOutputCompatible } from "./utils/schema-converter.js";
|
|
2
|
+
import { createOpenAICompatibleClient } from "./utils/client.js";
|
|
3
|
+
import { applyPatchTool, convertApplyPatchToolToAdapterFormat } from "./tools/apply-patch-tool.js";
|
|
4
|
+
import { codeInterpreterTool, convertCodeInterpreterToolToAdapterFormat } from "./tools/code-interpreter-tool.js";
|
|
5
|
+
import { computerUseTool, convertComputerUseToolToAdapterFormat } from "./tools/computer-use-tool.js";
|
|
6
|
+
import { convertCustomToolToAdapterFormat, customTool } from "./tools/custom-tool.js";
|
|
7
|
+
import { convertFileSearchToolToAdapterFormat, fileSearchTool } from "./tools/file-search-tool.js";
|
|
8
|
+
import { convertFunctionToolToAdapterFormat } from "./tools/function-tool.js";
|
|
9
|
+
import { convertImageGenerationToolToAdapterFormat, imageGenerationTool } from "./tools/image-generation-tool.js";
|
|
10
|
+
import { convertLocalShellToolToAdapterFormat, localShellTool } from "./tools/local-shell-tool.js";
|
|
11
|
+
import { convertMCPToolToAdapterFormat, mcpTool, validateMCPtool } from "./tools/mcp-tool.js";
|
|
12
|
+
import { convertShellToolToAdapterFormat, shellTool } from "./tools/shell-tool.js";
|
|
13
|
+
import { convertToolsToProviderFormat } from "./tools/tool-converter.js";
|
|
14
|
+
import { convertWebSearchPreviewToolToAdapterFormat, webSearchPreviewTool } from "./tools/web-search-preview-tool.js";
|
|
15
|
+
import { convertWebSearchToolToAdapterFormat, webSearchTool } from "./tools/web-search-tool.js";
|
|
16
|
+
import { OpenAICompatibleChatCompletionsTextAdapter } from "./adapters/chat-completions-text.js";
|
|
17
|
+
import { convertFunctionToolToChatCompletionsFormat, convertToolsToChatCompletionsFormat } from "./adapters/chat-completions-tool-converter.js";
|
|
18
|
+
import { OpenAICompatibleResponsesTextAdapter } from "./adapters/responses-text.js";
|
|
19
|
+
import { convertFunctionToolToResponsesFormat, convertToolsToResponsesFormat } from "./adapters/responses-tool-converter.js";
|
|
20
|
+
import { OpenAICompatibleImageAdapter } from "./adapters/image.js";
|
|
21
|
+
import { OpenAICompatibleSummarizeAdapter } from "./adapters/summarize.js";
|
|
22
|
+
import { OpenAICompatibleTranscriptionAdapter } from "./adapters/transcription.js";
|
|
23
|
+
import { OpenAICompatibleTTSAdapter } from "./adapters/tts.js";
|
|
24
|
+
import { OpenAICompatibleVideoAdapter } from "./adapters/video.js";
|
|
25
|
+
export {
|
|
26
|
+
OpenAICompatibleChatCompletionsTextAdapter,
|
|
27
|
+
OpenAICompatibleImageAdapter,
|
|
28
|
+
OpenAICompatibleResponsesTextAdapter,
|
|
29
|
+
OpenAICompatibleSummarizeAdapter,
|
|
30
|
+
OpenAICompatibleTTSAdapter,
|
|
31
|
+
OpenAICompatibleTranscriptionAdapter,
|
|
32
|
+
OpenAICompatibleVideoAdapter,
|
|
33
|
+
applyPatchTool,
|
|
34
|
+
codeInterpreterTool,
|
|
35
|
+
computerUseTool,
|
|
36
|
+
convertApplyPatchToolToAdapterFormat,
|
|
37
|
+
convertCodeInterpreterToolToAdapterFormat,
|
|
38
|
+
convertComputerUseToolToAdapterFormat,
|
|
39
|
+
convertCustomToolToAdapterFormat,
|
|
40
|
+
convertFileSearchToolToAdapterFormat,
|
|
41
|
+
convertFunctionToolToAdapterFormat,
|
|
42
|
+
convertFunctionToolToChatCompletionsFormat,
|
|
43
|
+
convertFunctionToolToResponsesFormat,
|
|
44
|
+
convertImageGenerationToolToAdapterFormat,
|
|
45
|
+
convertLocalShellToolToAdapterFormat,
|
|
46
|
+
convertMCPToolToAdapterFormat,
|
|
47
|
+
convertShellToolToAdapterFormat,
|
|
48
|
+
convertToolsToChatCompletionsFormat,
|
|
49
|
+
convertToolsToProviderFormat,
|
|
50
|
+
convertToolsToResponsesFormat,
|
|
51
|
+
convertWebSearchPreviewToolToAdapterFormat,
|
|
52
|
+
convertWebSearchToolToAdapterFormat,
|
|
53
|
+
createOpenAICompatibleClient,
|
|
54
|
+
customTool,
|
|
55
|
+
fileSearchTool,
|
|
56
|
+
imageGenerationTool,
|
|
57
|
+
localShellTool,
|
|
58
|
+
makeStructuredOutputCompatible,
|
|
59
|
+
mcpTool,
|
|
60
|
+
shellTool,
|
|
61
|
+
validateMCPtool,
|
|
62
|
+
webSearchPreviewTool,
|
|
63
|
+
webSearchTool
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { default as OpenAI } from 'openai';
|
|
2
|
+
import { Tool } from '@tanstack/ai';
|
|
3
|
+
export type ApplyPatchTool = OpenAI.Responses.ApplyPatchTool;
|
|
4
|
+
/**
|
|
5
|
+
* Converts a standard Tool to OpenAI ApplyPatchTool format
|
|
6
|
+
*/
|
|
7
|
+
export declare function convertApplyPatchToolToAdapterFormat(_tool: Tool): ApplyPatchTool;
|
|
8
|
+
/**
|
|
9
|
+
* Creates a standard Tool from ApplyPatchTool parameters
|
|
10
|
+
*/
|
|
11
|
+
export declare function applyPatchTool(): Tool;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
function convertApplyPatchToolToAdapterFormat(_tool) {
|
|
2
|
+
return {
|
|
3
|
+
type: "apply_patch"
|
|
4
|
+
};
|
|
5
|
+
}
|
|
6
|
+
function applyPatchTool() {
|
|
7
|
+
return {
|
|
8
|
+
name: "apply_patch",
|
|
9
|
+
description: "Apply a patch to modify files",
|
|
10
|
+
metadata: {}
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
applyPatchTool,
|
|
15
|
+
convertApplyPatchToolToAdapterFormat
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=apply-patch-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-patch-tool.js","sources":["../../../src/tools/apply-patch-tool.ts"],"sourcesContent":["import type OpenAI from 'openai'\nimport type { Tool } from '@tanstack/ai'\n\nexport type ApplyPatchTool = OpenAI.Responses.ApplyPatchTool\n\n/**\n * Converts a standard Tool to OpenAI ApplyPatchTool format\n */\nexport function convertApplyPatchToolToAdapterFormat(\n _tool: Tool,\n): ApplyPatchTool {\n return {\n type: 'apply_patch',\n }\n}\n\n/**\n * Creates a standard Tool from ApplyPatchTool parameters\n */\nexport function applyPatchTool(): Tool {\n return {\n name: 'apply_patch',\n description: 'Apply a patch to modify files',\n metadata: {},\n }\n}\n"],"names":[],"mappings":"AAQO,SAAS,qCACd,OACgB;AAChB,SAAO;AAAA,IACL,MAAM;AAAA,EAAA;AAEV;AAKO,SAAS,iBAAuB;AACrC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU,CAAA;AAAA,EAAC;AAEf;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Tool } from '@tanstack/ai';
|
|
2
|
+
import { default as OpenAI } from 'openai';
|
|
3
|
+
export type CodeInterpreterTool = OpenAI.Responses.Tool.CodeInterpreter;
|
|
4
|
+
/**
|
|
5
|
+
* Converts a standard Tool to OpenAI CodeInterpreterTool format
|
|
6
|
+
*/
|
|
7
|
+
export declare function convertCodeInterpreterToolToAdapterFormat(tool: Tool): CodeInterpreterTool;
|
|
8
|
+
/**
|
|
9
|
+
* Creates a standard Tool from CodeInterpreterTool parameters
|
|
10
|
+
*/
|
|
11
|
+
export declare function codeInterpreterTool(container: CodeInterpreterTool): Tool;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
function convertCodeInterpreterToolToAdapterFormat(tool) {
|
|
2
|
+
const metadata = tool.metadata;
|
|
3
|
+
return {
|
|
4
|
+
type: "code_interpreter",
|
|
5
|
+
container: metadata.container
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
function codeInterpreterTool(container) {
|
|
9
|
+
return {
|
|
10
|
+
name: "code_interpreter",
|
|
11
|
+
description: "Execute code in a sandboxed environment",
|
|
12
|
+
metadata: {
|
|
13
|
+
type: "code_interpreter",
|
|
14
|
+
container
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
codeInterpreterTool,
|
|
20
|
+
convertCodeInterpreterToolToAdapterFormat
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=code-interpreter-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-interpreter-tool.js","sources":["../../../src/tools/code-interpreter-tool.ts"],"sourcesContent":["import type { Tool } from '@tanstack/ai'\nimport type OpenAI from 'openai'\n\nexport type CodeInterpreterTool = OpenAI.Responses.Tool.CodeInterpreter\n\n/**\n * Converts a standard Tool to OpenAI CodeInterpreterTool format\n */\nexport function convertCodeInterpreterToolToAdapterFormat(\n tool: Tool,\n): CodeInterpreterTool {\n const metadata = tool.metadata as CodeInterpreterTool\n return {\n type: 'code_interpreter',\n container: metadata.container,\n }\n}\n\n/**\n * Creates a standard Tool from CodeInterpreterTool parameters\n */\nexport function codeInterpreterTool(container: CodeInterpreterTool): Tool {\n return {\n name: 'code_interpreter',\n description: 'Execute code in a sandboxed environment',\n metadata: {\n type: 'code_interpreter',\n container,\n },\n }\n}\n"],"names":[],"mappings":"AAQO,SAAS,0CACd,MACqB;AACrB,QAAM,WAAW,KAAK;AACtB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,WAAW,SAAS;AAAA,EAAA;AAExB;AAKO,SAAS,oBAAoB,WAAsC;AACxE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACR,MAAM;AAAA,MACN;AAAA,IAAA;AAAA,EACF;AAEJ;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { default as OpenAI } from 'openai';
|
|
2
|
+
import { Tool } from '@tanstack/ai';
|
|
3
|
+
export type ComputerUseTool = OpenAI.Responses.ComputerTool;
|
|
4
|
+
/**
|
|
5
|
+
* Converts a standard Tool to OpenAI ComputerUseTool format
|
|
6
|
+
*/
|
|
7
|
+
export declare function convertComputerUseToolToAdapterFormat(tool: Tool): ComputerUseTool;
|
|
8
|
+
/**
|
|
9
|
+
* Creates a standard Tool from ComputerUseTool parameters
|
|
10
|
+
*/
|
|
11
|
+
export declare function computerUseTool(toolData: ComputerUseTool): Tool;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
function convertComputerUseToolToAdapterFormat(tool) {
|
|
2
|
+
const metadata = tool.metadata;
|
|
3
|
+
return {
|
|
4
|
+
type: "computer_use_preview",
|
|
5
|
+
display_height: metadata.display_height,
|
|
6
|
+
display_width: metadata.display_width,
|
|
7
|
+
environment: metadata.environment
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function computerUseTool(toolData) {
|
|
11
|
+
return {
|
|
12
|
+
name: "computer_use_preview",
|
|
13
|
+
description: "Control a virtual computer",
|
|
14
|
+
metadata: {
|
|
15
|
+
...toolData
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export {
|
|
20
|
+
computerUseTool,
|
|
21
|
+
convertComputerUseToolToAdapterFormat
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=computer-use-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computer-use-tool.js","sources":["../../../src/tools/computer-use-tool.ts"],"sourcesContent":["import type OpenAI from 'openai'\nimport type { Tool } from '@tanstack/ai'\n\nexport type ComputerUseTool = OpenAI.Responses.ComputerTool\n/**\n * Converts a standard Tool to OpenAI ComputerUseTool format\n */\nexport function convertComputerUseToolToAdapterFormat(\n tool: Tool,\n): ComputerUseTool {\n const metadata = tool.metadata as ComputerUseTool\n return {\n type: 'computer_use_preview',\n display_height: metadata.display_height,\n display_width: metadata.display_width,\n environment: metadata.environment,\n }\n}\n\n/**\n * Creates a standard Tool from ComputerUseTool parameters\n */\nexport function computerUseTool(toolData: ComputerUseTool): Tool {\n return {\n name: 'computer_use_preview',\n description: 'Control a virtual computer',\n metadata: {\n ...toolData,\n },\n }\n}\n"],"names":[],"mappings":"AAOO,SAAS,sCACd,MACiB;AACjB,QAAM,WAAW,KAAK;AACtB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,gBAAgB,SAAS;AAAA,IACzB,eAAe,SAAS;AAAA,IACxB,aAAa,SAAS;AAAA,EAAA;AAE1B;AAKO,SAAS,gBAAgB,UAAiC;AAC/D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACR,GAAG;AAAA,IAAA;AAAA,EACL;AAEJ;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { default as OpenAI } from 'openai';
|
|
2
|
+
import { Tool } from '@tanstack/ai';
|
|
3
|
+
export type CustomTool = OpenAI.Responses.CustomTool;
|
|
4
|
+
/**
|
|
5
|
+
* Converts a standard Tool to OpenAI CustomTool format
|
|
6
|
+
*/
|
|
7
|
+
export declare function convertCustomToolToAdapterFormat(tool: Tool): CustomTool;
|
|
8
|
+
/**
|
|
9
|
+
* Creates a standard Tool from CustomTool parameters
|
|
10
|
+
*/
|
|
11
|
+
export declare function customTool(toolData: CustomTool): Tool;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
function convertCustomToolToAdapterFormat(tool) {
|
|
2
|
+
const metadata = tool.metadata;
|
|
3
|
+
return {
|
|
4
|
+
type: "custom",
|
|
5
|
+
name: metadata.name,
|
|
6
|
+
description: metadata.description,
|
|
7
|
+
format: metadata.format
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function customTool(toolData) {
|
|
11
|
+
return {
|
|
12
|
+
name: "custom",
|
|
13
|
+
description: toolData.description || "A custom tool",
|
|
14
|
+
metadata: {
|
|
15
|
+
...toolData
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export {
|
|
20
|
+
convertCustomToolToAdapterFormat,
|
|
21
|
+
customTool
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=custom-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-tool.js","sources":["../../../src/tools/custom-tool.ts"],"sourcesContent":["import type OpenAI from 'openai'\nimport type { Tool } from '@tanstack/ai'\n\nexport type CustomTool = OpenAI.Responses.CustomTool\n\n/**\n * Converts a standard Tool to OpenAI CustomTool format\n */\nexport function convertCustomToolToAdapterFormat(tool: Tool): CustomTool {\n const metadata = tool.metadata as CustomTool\n return {\n type: 'custom',\n name: metadata.name,\n description: metadata.description,\n format: metadata.format,\n }\n}\n\n/**\n * Creates a standard Tool from CustomTool parameters\n */\nexport function customTool(toolData: CustomTool): Tool {\n return {\n name: 'custom',\n description: toolData.description || 'A custom tool',\n metadata: {\n ...toolData,\n },\n }\n}\n"],"names":[],"mappings":"AAQO,SAAS,iCAAiC,MAAwB;AACvE,QAAM,WAAW,KAAK;AACtB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,SAAS;AAAA,IACf,aAAa,SAAS;AAAA,IACtB,QAAQ,SAAS;AAAA,EAAA;AAErB;AAKO,SAAS,WAAW,UAA4B;AACrD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa,SAAS,eAAe;AAAA,IACrC,UAAU;AAAA,MACR,GAAG;AAAA,IAAA;AAAA,EACL;AAEJ;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { default as OpenAI } from 'openai';
|
|
2
|
+
import { Tool } from '@tanstack/ai';
|
|
3
|
+
export type FileSearchTool = OpenAI.Responses.FileSearchTool;
|
|
4
|
+
/**
|
|
5
|
+
* Converts a standard Tool to OpenAI FileSearchTool format
|
|
6
|
+
*/
|
|
7
|
+
export declare function convertFileSearchToolToAdapterFormat(tool: Tool): OpenAI.Responses.FileSearchTool;
|
|
8
|
+
/**
|
|
9
|
+
* Creates a standard Tool from FileSearchTool parameters
|
|
10
|
+
*/
|
|
11
|
+
export declare function fileSearchTool(toolData: OpenAI.Responses.FileSearchTool): Tool;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const validateMaxNumResults = (maxNumResults) => {
|
|
2
|
+
if (maxNumResults && (maxNumResults < 1 || maxNumResults > 50)) {
|
|
3
|
+
throw new Error("max_num_results must be between 1 and 50.");
|
|
4
|
+
}
|
|
5
|
+
};
|
|
6
|
+
function convertFileSearchToolToAdapterFormat(tool) {
|
|
7
|
+
const metadata = tool.metadata;
|
|
8
|
+
return {
|
|
9
|
+
type: "file_search",
|
|
10
|
+
vector_store_ids: metadata.vector_store_ids,
|
|
11
|
+
max_num_results: metadata.max_num_results,
|
|
12
|
+
ranking_options: metadata.ranking_options,
|
|
13
|
+
filters: metadata.filters
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function fileSearchTool(toolData) {
|
|
17
|
+
validateMaxNumResults(toolData.max_num_results);
|
|
18
|
+
return {
|
|
19
|
+
name: "file_search",
|
|
20
|
+
description: "Search files in vector stores",
|
|
21
|
+
metadata: {
|
|
22
|
+
...toolData
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
convertFileSearchToolToAdapterFormat,
|
|
28
|
+
fileSearchTool
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=file-search-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-search-tool.js","sources":["../../../src/tools/file-search-tool.ts"],"sourcesContent":["import type OpenAI from 'openai'\nimport type { Tool } from '@tanstack/ai'\n\nconst validateMaxNumResults = (maxNumResults: number | undefined) => {\n if (maxNumResults && (maxNumResults < 1 || maxNumResults > 50)) {\n throw new Error('max_num_results must be between 1 and 50.')\n }\n}\n\nexport type FileSearchTool = OpenAI.Responses.FileSearchTool\n\n/**\n * Converts a standard Tool to OpenAI FileSearchTool format\n */\nexport function convertFileSearchToolToAdapterFormat(\n tool: Tool,\n): OpenAI.Responses.FileSearchTool {\n const metadata = tool.metadata as OpenAI.Responses.FileSearchTool\n return {\n type: 'file_search',\n vector_store_ids: metadata.vector_store_ids,\n max_num_results: metadata.max_num_results,\n ranking_options: metadata.ranking_options,\n filters: metadata.filters,\n }\n}\n\n/**\n * Creates a standard Tool from FileSearchTool parameters\n */\nexport function fileSearchTool(\n toolData: OpenAI.Responses.FileSearchTool,\n): Tool {\n validateMaxNumResults(toolData.max_num_results)\n return {\n name: 'file_search',\n description: 'Search files in vector stores',\n metadata: {\n ...toolData,\n },\n }\n}\n"],"names":[],"mappings":"AAGA,MAAM,wBAAwB,CAAC,kBAAsC;AACnE,MAAI,kBAAkB,gBAAgB,KAAK,gBAAgB,KAAK;AAC9D,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACF;AAOO,SAAS,qCACd,MACiC;AACjC,QAAM,WAAW,KAAK;AACtB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,kBAAkB,SAAS;AAAA,IAC3B,iBAAiB,SAAS;AAAA,IAC1B,iBAAiB,SAAS;AAAA,IAC1B,SAAS,SAAS;AAAA,EAAA;AAEtB;AAKO,SAAS,eACd,UACM;AACN,wBAAsB,SAAS,eAAe;AAC9C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,MACR,GAAG;AAAA,IAAA;AAAA,EACL;AAEJ;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Tool } from '@tanstack/ai';
|
|
2
|
+
import { default as OpenAI } from 'openai';
|
|
3
|
+
export type FunctionTool = OpenAI.Responses.FunctionTool;
|
|
4
|
+
/**
|
|
5
|
+
* Converts a standard Tool to OpenAI FunctionTool format.
|
|
6
|
+
*
|
|
7
|
+
* Tool schemas are already converted to JSON Schema in the ai layer.
|
|
8
|
+
* We apply OpenAI-specific transformations for strict mode:
|
|
9
|
+
* - All properties in required array
|
|
10
|
+
* - Optional fields made nullable
|
|
11
|
+
* - additionalProperties: false
|
|
12
|
+
*
|
|
13
|
+
* This enables strict mode for all tools automatically.
|
|
14
|
+
*/
|
|
15
|
+
export declare function convertFunctionToolToAdapterFormat(tool: Tool): FunctionTool;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { makeStructuredOutputCompatible } from "../utils/schema-converter.js";
|
|
2
|
+
function convertFunctionToolToAdapterFormat(tool) {
|
|
3
|
+
const inputSchema = tool.inputSchema ?? {
|
|
4
|
+
type: "object",
|
|
5
|
+
properties: {},
|
|
6
|
+
required: []
|
|
7
|
+
};
|
|
8
|
+
const jsonSchema = makeStructuredOutputCompatible(
|
|
9
|
+
inputSchema,
|
|
10
|
+
inputSchema.required || []
|
|
11
|
+
);
|
|
12
|
+
jsonSchema.additionalProperties = false;
|
|
13
|
+
return {
|
|
14
|
+
type: "function",
|
|
15
|
+
name: tool.name,
|
|
16
|
+
description: tool.description,
|
|
17
|
+
parameters: jsonSchema,
|
|
18
|
+
strict: true
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export {
|
|
22
|
+
convertFunctionToolToAdapterFormat
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=function-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function-tool.js","sources":["../../../src/tools/function-tool.ts"],"sourcesContent":["import { makeStructuredOutputCompatible } from '../utils/schema-converter'\nimport type { JSONSchema, Tool } from '@tanstack/ai'\nimport type OpenAI from 'openai'\n\nexport type FunctionTool = OpenAI.Responses.FunctionTool\n\n/**\n * Converts a standard Tool to OpenAI FunctionTool format.\n *\n * Tool schemas are already converted to JSON Schema in the ai layer.\n * We apply OpenAI-specific transformations for strict mode:\n * - All properties in required array\n * - Optional fields made nullable\n * - additionalProperties: false\n *\n * This enables strict mode for all tools automatically.\n */\nexport function convertFunctionToolToAdapterFormat(tool: Tool): FunctionTool {\n const inputSchema = (tool.inputSchema ?? {\n type: 'object',\n properties: {},\n required: [],\n }) as JSONSchema\n\n const jsonSchema = makeStructuredOutputCompatible(\n inputSchema,\n inputSchema.required || [],\n )\n\n jsonSchema.additionalProperties = false\n\n return {\n type: 'function',\n name: tool.name,\n description: tool.description,\n parameters: jsonSchema,\n strict: true,\n } satisfies FunctionTool\n}\n"],"names":[],"mappings":";AAiBO,SAAS,mCAAmC,MAA0B;AAC3E,QAAM,cAAe,KAAK,eAAe;AAAA,IACvC,MAAM;AAAA,IACN,YAAY,CAAA;AAAA,IACZ,UAAU,CAAA;AAAA,EAAC;AAGb,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,YAAY,YAAY,CAAA;AAAA,EAAC;AAG3B,aAAW,uBAAuB;AAElC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,KAAK;AAAA,IACX,aAAa,KAAK;AAAA,IAClB,YAAY;AAAA,IACZ,QAAQ;AAAA,EAAA;AAEZ;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { default as OpenAI } from 'openai';
|
|
2
|
+
import { Tool } from '@tanstack/ai';
|
|
3
|
+
export type ImageGenerationTool = OpenAI.Responses.Tool.ImageGeneration;
|
|
4
|
+
/**
|
|
5
|
+
* Converts a standard Tool to OpenAI ImageGenerationTool format
|
|
6
|
+
*/
|
|
7
|
+
export declare function convertImageGenerationToolToAdapterFormat(tool: Tool): ImageGenerationTool;
|
|
8
|
+
/**
|
|
9
|
+
* Creates a standard Tool from ImageGenerationTool parameters
|
|
10
|
+
*/
|
|
11
|
+
export declare function imageGenerationTool(toolData: Omit<ImageGenerationTool, 'type'>): Tool;
|