@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.
Files changed (110) hide show
  1. package/dist/esm/adapters/chat-completions-text.d.ts +76 -0
  2. package/dist/esm/adapters/chat-completions-text.js +411 -0
  3. package/dist/esm/adapters/chat-completions-text.js.map +1 -0
  4. package/dist/esm/adapters/chat-completions-tool-converter.d.ts +24 -0
  5. package/dist/esm/adapters/chat-completions-tool-converter.js +29 -0
  6. package/dist/esm/adapters/chat-completions-tool-converter.js.map +1 -0
  7. package/dist/esm/adapters/image.d.ts +32 -0
  8. package/dist/esm/adapters/image.js +69 -0
  9. package/dist/esm/adapters/image.js.map +1 -0
  10. package/dist/esm/adapters/responses-text.d.ts +115 -0
  11. package/dist/esm/adapters/responses-text.js +635 -0
  12. package/dist/esm/adapters/responses-text.js.map +1 -0
  13. package/dist/esm/adapters/responses-tool-converter.d.ts +35 -0
  14. package/dist/esm/adapters/responses-tool-converter.js +27 -0
  15. package/dist/esm/adapters/responses-tool-converter.js.map +1 -0
  16. package/dist/esm/adapters/summarize.d.ts +28 -0
  17. package/dist/esm/adapters/summarize.js +74 -0
  18. package/dist/esm/adapters/summarize.js.map +1 -0
  19. package/dist/esm/adapters/transcription.d.ts +39 -0
  20. package/dist/esm/adapters/transcription.js +139 -0
  21. package/dist/esm/adapters/transcription.js.map +1 -0
  22. package/dist/esm/adapters/tts.d.ts +26 -0
  23. package/dist/esm/adapters/tts.js +65 -0
  24. package/dist/esm/adapters/tts.js.map +1 -0
  25. package/dist/esm/adapters/video.d.ts +48 -0
  26. package/dist/esm/adapters/video.js +192 -0
  27. package/dist/esm/adapters/video.js.map +1 -0
  28. package/dist/esm/index.d.ts +15 -0
  29. package/dist/esm/index.js +65 -0
  30. package/dist/esm/index.js.map +1 -0
  31. package/dist/esm/tools/apply-patch-tool.d.ts +11 -0
  32. package/dist/esm/tools/apply-patch-tool.js +17 -0
  33. package/dist/esm/tools/apply-patch-tool.js.map +1 -0
  34. package/dist/esm/tools/code-interpreter-tool.d.ts +11 -0
  35. package/dist/esm/tools/code-interpreter-tool.js +22 -0
  36. package/dist/esm/tools/code-interpreter-tool.js.map +1 -0
  37. package/dist/esm/tools/computer-use-tool.d.ts +11 -0
  38. package/dist/esm/tools/computer-use-tool.js +23 -0
  39. package/dist/esm/tools/computer-use-tool.js.map +1 -0
  40. package/dist/esm/tools/custom-tool.d.ts +11 -0
  41. package/dist/esm/tools/custom-tool.js +23 -0
  42. package/dist/esm/tools/custom-tool.js.map +1 -0
  43. package/dist/esm/tools/file-search-tool.d.ts +11 -0
  44. package/dist/esm/tools/file-search-tool.js +30 -0
  45. package/dist/esm/tools/file-search-tool.js.map +1 -0
  46. package/dist/esm/tools/function-tool.d.ts +15 -0
  47. package/dist/esm/tools/function-tool.js +24 -0
  48. package/dist/esm/tools/function-tool.js.map +1 -0
  49. package/dist/esm/tools/image-generation-tool.d.ts +11 -0
  50. package/dist/esm/tools/image-generation-tool.js +27 -0
  51. package/dist/esm/tools/image-generation-tool.js.map +1 -0
  52. package/dist/esm/tools/index.d.ts +27 -0
  53. package/dist/esm/tools/local-shell-tool.d.ts +11 -0
  54. package/dist/esm/tools/local-shell-tool.js +17 -0
  55. package/dist/esm/tools/local-shell-tool.js.map +1 -0
  56. package/dist/esm/tools/mcp-tool.d.ts +12 -0
  57. package/dist/esm/tools/mcp-tool.js +31 -0
  58. package/dist/esm/tools/mcp-tool.js.map +1 -0
  59. package/dist/esm/tools/shell-tool.d.ts +11 -0
  60. package/dist/esm/tools/shell-tool.js +17 -0
  61. package/dist/esm/tools/shell-tool.js.map +1 -0
  62. package/dist/esm/tools/tool-choice.d.ts +17 -0
  63. package/dist/esm/tools/tool-converter.d.ts +6 -0
  64. package/dist/esm/tools/tool-converter.js +61 -0
  65. package/dist/esm/tools/tool-converter.js.map +1 -0
  66. package/dist/esm/tools/web-search-preview-tool.d.ts +11 -0
  67. package/dist/esm/tools/web-search-preview-tool.js +20 -0
  68. package/dist/esm/tools/web-search-preview-tool.js.map +1 -0
  69. package/dist/esm/tools/web-search-tool.d.ts +11 -0
  70. package/dist/esm/tools/web-search-tool.js +16 -0
  71. package/dist/esm/tools/web-search-tool.js.map +1 -0
  72. package/dist/esm/types/config.d.ts +4 -0
  73. package/dist/esm/types/message-metadata.d.ts +19 -0
  74. package/dist/esm/types/provider-options.d.ts +40 -0
  75. package/dist/esm/utils/client.d.ts +3 -0
  76. package/dist/esm/utils/client.js +8 -0
  77. package/dist/esm/utils/client.js.map +1 -0
  78. package/dist/esm/utils/schema-converter.d.ts +12 -0
  79. package/dist/esm/utils/schema-converter.js +65 -0
  80. package/dist/esm/utils/schema-converter.js.map +1 -0
  81. package/package.json +57 -0
  82. package/src/adapters/chat-completions-text.ts +817 -0
  83. package/src/adapters/chat-completions-tool-converter.ts +70 -0
  84. package/src/adapters/image.ts +158 -0
  85. package/src/adapters/responses-text.ts +1147 -0
  86. package/src/adapters/responses-tool-converter.ts +77 -0
  87. package/src/adapters/summarize.ts +174 -0
  88. package/src/adapters/transcription.ts +194 -0
  89. package/src/adapters/tts.ts +124 -0
  90. package/src/adapters/video.ts +385 -0
  91. package/src/index.ts +24 -0
  92. package/src/tools/apply-patch-tool.ts +32 -0
  93. package/src/tools/code-interpreter-tool.ts +39 -0
  94. package/src/tools/computer-use-tool.ts +38 -0
  95. package/src/tools/custom-tool.ts +33 -0
  96. package/src/tools/file-search-tool.ts +51 -0
  97. package/src/tools/function-tool.ts +44 -0
  98. package/src/tools/image-generation-tool.ts +51 -0
  99. package/src/tools/index.ts +41 -0
  100. package/src/tools/local-shell-tool.ts +32 -0
  101. package/src/tools/mcp-tool.ts +47 -0
  102. package/src/tools/shell-tool.ts +30 -0
  103. package/src/tools/tool-choice.ts +31 -0
  104. package/src/tools/tool-converter.ts +68 -0
  105. package/src/tools/web-search-preview-tool.ts +39 -0
  106. package/src/tools/web-search-tool.ts +38 -0
  107. package/src/types/config.ts +5 -0
  108. package/src/utils/client.ts +8 -0
  109. package/src/utils/request-options.ts +16 -0
  110. 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":"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"}
@@ -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;