@tanstack/ai-vercel-gateway 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +37 -0
  3. package/dist/esm/adapters/embedding.d.ts +21 -0
  4. package/dist/esm/adapters/embedding.js +73 -0
  5. package/dist/esm/adapters/embedding.js.map +1 -0
  6. package/dist/esm/adapters/factory.d.ts +16 -0
  7. package/dist/esm/adapters/factory.js +28 -0
  8. package/dist/esm/adapters/factory.js.map +1 -0
  9. package/dist/esm/adapters/image.d.ts +22 -0
  10. package/dist/esm/adapters/image.js +87 -0
  11. package/dist/esm/adapters/image.js.map +1 -0
  12. package/dist/esm/adapters/responses-text.d.ts +26 -0
  13. package/dist/esm/adapters/responses-text.js +38 -0
  14. package/dist/esm/adapters/responses-text.js.map +1 -0
  15. package/dist/esm/adapters/summarize.d.ts +9 -0
  16. package/dist/esm/adapters/summarize.js +17 -0
  17. package/dist/esm/adapters/summarize.js.map +1 -0
  18. package/dist/esm/adapters/text.d.ts +60 -0
  19. package/dist/esm/adapters/text.js +29 -0
  20. package/dist/esm/adapters/text.js.map +1 -0
  21. package/dist/esm/embedding/embedding-provider-options.d.ts +5 -0
  22. package/dist/esm/image/image-provider-options.d.ts +7 -0
  23. package/dist/esm/index.d.ts +17 -0
  24. package/dist/esm/index.js +9 -0
  25. package/dist/esm/message-types.d.ts +44 -0
  26. package/dist/esm/model-meta.d.ts +493 -0
  27. package/dist/esm/model-meta.js +351 -0
  28. package/dist/esm/model-meta.js.map +1 -0
  29. package/dist/esm/text/responses-provider-options.d.ts +3 -0
  30. package/dist/esm/text/text-provider-options.d.ts +40 -0
  31. package/dist/esm/tools/function-tool.d.ts +16 -0
  32. package/dist/esm/tools/function-tool.js +30 -0
  33. package/dist/esm/tools/function-tool.js.map +1 -0
  34. package/dist/esm/tools/index.d.ts +2 -0
  35. package/dist/esm/tools/index.js +3 -0
  36. package/dist/esm/tools/tool-converter.d.ts +7 -0
  37. package/dist/esm/tools/tool-converter.js +15 -0
  38. package/dist/esm/tools/tool-converter.js.map +1 -0
  39. package/dist/esm/utils/client.d.ts +8 -0
  40. package/dist/esm/utils/client.js +29 -0
  41. package/dist/esm/utils/client.js.map +1 -0
  42. package/dist/esm/utils/map-gateway-options.d.ts +4 -0
  43. package/dist/esm/utils/map-gateway-options.js +14 -0
  44. package/dist/esm/utils/map-gateway-options.js.map +1 -0
  45. package/package.json +73 -0
  46. package/src/adapters/embedding.ts +122 -0
  47. package/src/adapters/factory.ts +81 -0
  48. package/src/adapters/image.ts +156 -0
  49. package/src/adapters/responses-text.ts +99 -0
  50. package/src/adapters/summarize.ts +44 -0
  51. package/src/adapters/text.ts +68 -0
  52. package/src/embedding/embedding-provider-options.ts +6 -0
  53. package/src/image/image-provider-options.ts +13 -0
  54. package/src/index.ts +78 -0
  55. package/src/message-types.ts +45 -0
  56. package/src/model-meta.ts +2512 -0
  57. package/src/text/responses-provider-options.ts +10 -0
  58. package/src/text/text-provider-options.ts +47 -0
  59. package/src/tools/function-tool.ts +46 -0
  60. package/src/tools/index.ts +5 -0
  61. package/src/tools/tool-converter.ts +15 -0
  62. package/src/utils/client.ts +40 -0
  63. package/src/utils/map-gateway-options.ts +15 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Tanner Linsley
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # @tanstack/ai-vercel-gateway
2
+
3
+ Vercel AI Gateway adapter for TanStack AI.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @tanstack/ai-vercel-gateway
9
+ ```
10
+
11
+ ## Auth
12
+
13
+ Set `AI_GATEWAY_API_KEY`. If that key is not set, the adapter uses `VERCEL_OIDC_TOKEN`.
14
+
15
+ ```bash
16
+ export AI_GATEWAY_API_KEY="..."
17
+ ```
18
+
19
+ You can also pass the key to a `create*` factory.
20
+
21
+ ## Usage
22
+
23
+ ```typescript
24
+ import { chat } from '@tanstack/ai'
25
+ import { vercelGatewayText } from '@tanstack/ai-vercel-gateway'
26
+
27
+ const adapter = vercelGatewayText('anthropic/claude-opus-5')
28
+
29
+ const stream = chat({
30
+ adapter,
31
+ messages: [{ role: 'user', content: 'Hello' }],
32
+ })
33
+ ```
34
+
35
+ The default text adapter uses the Responses API. Pass `{ api: 'chat' }` for Chat Completions.
36
+
37
+ See [docs/adapters/vercel-gateway.md](../../docs/adapters/vercel-gateway.md) for chat, summarize, embeddings, image generation, and gateway routing.
@@ -0,0 +1,21 @@
1
+ import { default as OpenAI } from 'openai';
2
+ import { BaseEmbeddingAdapter } from '@tanstack/ai/adapters';
3
+ import { EmbeddingOptions, EmbeddingResult } from '@tanstack/ai';
4
+ import { VercelGatewayEmbeddingModel, VercelGatewayEmbeddingModelInputModalitiesByName, VercelGatewayEmbeddingModelProviderOptionsByName } from '../model-meta.js';
5
+ import { VercelGatewayEmbeddingProviderOptions } from '../embedding/embedding-provider-options.js';
6
+ import { VercelGatewayClientConfig } from '../utils/client.js';
7
+ export interface VercelGatewayEmbeddingConfig extends VercelGatewayClientConfig {
8
+ }
9
+ /**
10
+ * Vercel AI Gateway embedding adapter.
11
+ *
12
+ * Talks to `POST /v1/embeddings` on the public OpenAI-compatible Gateway API.
13
+ */
14
+ export declare class VercelGatewayEmbeddingAdapter<TModel extends VercelGatewayEmbeddingModel> extends BaseEmbeddingAdapter<TModel, VercelGatewayEmbeddingProviderOptions, VercelGatewayEmbeddingModelProviderOptionsByName, VercelGatewayEmbeddingModelInputModalitiesByName> {
15
+ readonly name: "vercel-gateway";
16
+ protected client: OpenAI;
17
+ constructor(config: VercelGatewayEmbeddingConfig, model: TModel);
18
+ createEmbeddings(options: EmbeddingOptions<VercelGatewayEmbeddingProviderOptions>): Promise<EmbeddingResult>;
19
+ }
20
+ export declare function createVercelGatewayEmbedding<TModel extends VercelGatewayEmbeddingModel>(model: TModel, apiKey: string, config?: Omit<VercelGatewayEmbeddingConfig, 'apiKey'>): VercelGatewayEmbeddingAdapter<TModel>;
21
+ export declare function vercelGatewayEmbedding<TModel extends VercelGatewayEmbeddingModel>(model: TModel, config?: Omit<VercelGatewayEmbeddingConfig, 'apiKey'>): VercelGatewayEmbeddingAdapter<TModel>;
@@ -0,0 +1,73 @@
1
+ import { getVercelGatewayApiKeyFromEnv, withVercelGatewayDefaults } from "../utils/client.js";
2
+ import { mapGatewayModelOptions } from "../utils/map-gateway-options.js";
3
+ import OpenAI from "openai";
4
+ import { generateId } from "@tanstack/ai-utils";
5
+ import { BaseEmbeddingAdapter } from "@tanstack/ai/adapters";
6
+ import { toRunErrorPayload } from "@tanstack/ai/adapter-internals";
7
+ import { requireTextOnlyEmbeddingInput } from "@tanstack/ai";
8
+ //#region src/adapters/embedding.ts
9
+ /**
10
+ * Vercel AI Gateway embedding adapter.
11
+ *
12
+ * Talks to `POST /v1/embeddings` on the public OpenAI-compatible Gateway API.
13
+ */
14
+ var VercelGatewayEmbeddingAdapter = class extends BaseEmbeddingAdapter {
15
+ name = "vercel-gateway";
16
+ client;
17
+ constructor(config, model) {
18
+ super(model, {});
19
+ this.client = new OpenAI(withVercelGatewayDefaults(config));
20
+ }
21
+ async createEmbeddings(options) {
22
+ const { model, logger } = options;
23
+ const texts = requireTextOnlyEmbeddingInput(options.input, this.name, model);
24
+ const mapped = mapGatewayModelOptions(options.modelOptions);
25
+ try {
26
+ const request = {
27
+ ...mapped,
28
+ model,
29
+ input: texts,
30
+ encoding_format: "float"
31
+ };
32
+ if (options.dimensions !== void 0) request.dimensions = options.dimensions;
33
+ logger.request(`activity=embed provider=${this.name} model=${model} inputs=${texts.length}`, {
34
+ provider: this.name,
35
+ model
36
+ });
37
+ const response = await this.client.embeddings.create(request);
38
+ const usage = {
39
+ promptTokens: response.usage.prompt_tokens,
40
+ completionTokens: 0,
41
+ totalTokens: response.usage.total_tokens
42
+ };
43
+ return {
44
+ id: generateId(this.name),
45
+ model,
46
+ embeddings: response.data.map((item) => ({
47
+ vector: item.embedding,
48
+ index: item.index
49
+ })),
50
+ usage
51
+ };
52
+ } catch (error) {
53
+ logger.errors(`${this.name}.createEmbeddings fatal`, {
54
+ error: toRunErrorPayload(error, `${this.name}.createEmbeddings failed`),
55
+ source: `${this.name}.createEmbeddings`
56
+ });
57
+ throw error;
58
+ }
59
+ }
60
+ };
61
+ function createVercelGatewayEmbedding(model, apiKey, config) {
62
+ return new VercelGatewayEmbeddingAdapter({
63
+ apiKey,
64
+ ...config
65
+ }, model);
66
+ }
67
+ function vercelGatewayEmbedding(model, config) {
68
+ return createVercelGatewayEmbedding(model, getVercelGatewayApiKeyFromEnv(), config);
69
+ }
70
+ //#endregion
71
+ export { VercelGatewayEmbeddingAdapter, createVercelGatewayEmbedding, vercelGatewayEmbedding };
72
+
73
+ //# sourceMappingURL=embedding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.js","names":[],"sources":["../../../src/adapters/embedding.ts"],"sourcesContent":["import OpenAI from 'openai'\nimport { BaseEmbeddingAdapter } from '@tanstack/ai/adapters'\nimport { toRunErrorPayload } from '@tanstack/ai/adapter-internals'\nimport { generateId } from '@tanstack/ai-utils'\nimport { requireTextOnlyEmbeddingInput } from '@tanstack/ai'\nimport {\n getVercelGatewayApiKeyFromEnv,\n withVercelGatewayDefaults,\n} from '../utils/client'\nimport { mapGatewayModelOptions } from '../utils/map-gateway-options'\nimport type {\n EmbeddingOptions,\n EmbeddingResult,\n TokenUsage,\n} from '@tanstack/ai'\nimport type OpenAI_SDK from 'openai'\nimport type {\n VercelGatewayEmbeddingModel,\n VercelGatewayEmbeddingModelInputModalitiesByName,\n VercelGatewayEmbeddingModelProviderOptionsByName,\n} from '../model-meta'\nimport type { VercelGatewayEmbeddingProviderOptions } from '../embedding/embedding-provider-options'\nimport type { VercelGatewayClientConfig } from '../utils/client'\n\nexport interface VercelGatewayEmbeddingConfig extends VercelGatewayClientConfig {}\n\n/**\n * Vercel AI Gateway embedding adapter.\n *\n * Talks to `POST /v1/embeddings` on the public OpenAI-compatible Gateway API.\n */\nexport class VercelGatewayEmbeddingAdapter<\n TModel extends VercelGatewayEmbeddingModel,\n> extends BaseEmbeddingAdapter<\n TModel,\n VercelGatewayEmbeddingProviderOptions,\n VercelGatewayEmbeddingModelProviderOptionsByName,\n VercelGatewayEmbeddingModelInputModalitiesByName\n> {\n readonly name = 'vercel-gateway' as const\n\n protected client: OpenAI\n\n constructor(config: VercelGatewayEmbeddingConfig, model: TModel) {\n super(model, {})\n this.client = new OpenAI(withVercelGatewayDefaults(config))\n }\n\n async createEmbeddings(\n options: EmbeddingOptions<VercelGatewayEmbeddingProviderOptions>,\n ): Promise<EmbeddingResult> {\n const { model, logger } = options\n const texts = requireTextOnlyEmbeddingInput(options.input, this.name, model)\n const mapped = mapGatewayModelOptions(\n options.modelOptions as Record<string, unknown> | undefined,\n )\n\n try {\n const request: OpenAI_SDK.EmbeddingCreateParams = {\n ...mapped,\n model,\n input: texts,\n encoding_format: 'float',\n }\n if (options.dimensions !== undefined) {\n request.dimensions = options.dimensions\n }\n\n logger.request(\n `activity=embed provider=${this.name} model=${model} inputs=${texts.length}`,\n { provider: this.name, model },\n )\n\n const response = await this.client.embeddings.create(request)\n\n const usage: TokenUsage = {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: 0,\n totalTokens: response.usage.total_tokens,\n }\n\n return {\n id: generateId(this.name),\n model,\n embeddings: response.data.map((item) => ({\n vector: item.embedding,\n index: item.index,\n })),\n usage,\n }\n } catch (error: unknown) {\n logger.errors(`${this.name}.createEmbeddings fatal`, {\n error: toRunErrorPayload(error, `${this.name}.createEmbeddings failed`),\n source: `${this.name}.createEmbeddings`,\n })\n throw error\n }\n }\n}\n\nexport function createVercelGatewayEmbedding<\n TModel extends VercelGatewayEmbeddingModel,\n>(\n model: TModel,\n apiKey: string,\n config?: Omit<VercelGatewayEmbeddingConfig, 'apiKey'>,\n): VercelGatewayEmbeddingAdapter<TModel> {\n return new VercelGatewayEmbeddingAdapter({ apiKey, ...config }, model)\n}\n\nexport function vercelGatewayEmbedding<\n TModel extends VercelGatewayEmbeddingModel,\n>(\n model: TModel,\n config?: Omit<VercelGatewayEmbeddingConfig, 'apiKey'>,\n): VercelGatewayEmbeddingAdapter<TModel> {\n return createVercelGatewayEmbedding(\n model,\n getVercelGatewayApiKeyFromEnv(),\n config,\n )\n}\n"],"mappings":";;;;;;;;;;;;;AA+BA,IAAa,gCAAb,cAEU,qBAKR;CACA,OAAgB;CAEhB;CAEA,YAAY,QAAsC,OAAe;EAC/D,MAAM,OAAO,CAAC,CAAC;EACf,KAAK,SAAS,IAAI,OAAO,0BAA0B,MAAM,CAAC;CAC5D;CAEA,MAAM,iBACJ,SAC0B;EAC1B,MAAM,EAAE,OAAO,WAAW;EAC1B,MAAM,QAAQ,8BAA8B,QAAQ,OAAO,KAAK,MAAM,KAAK;EAC3E,MAAM,SAAS,uBACb,QAAQ,YACV;EAEA,IAAI;GACF,MAAM,UAA4C;IAChD,GAAG;IACH;IACA,OAAO;IACP,iBAAiB;GACnB;GACA,IAAI,QAAQ,eAAe,KAAA,GACzB,QAAQ,aAAa,QAAQ;GAG/B,OAAO,QACL,2BAA2B,KAAK,KAAK,SAAS,MAAM,UAAU,MAAM,UACpE;IAAE,UAAU,KAAK;IAAM;GAAM,CAC/B;GAEA,MAAM,WAAW,MAAM,KAAK,OAAO,WAAW,OAAO,OAAO;GAE5D,MAAM,QAAoB;IACxB,cAAc,SAAS,MAAM;IAC7B,kBAAkB;IAClB,aAAa,SAAS,MAAM;GAC9B;GAEA,OAAO;IACL,IAAI,WAAW,KAAK,IAAI;IACxB;IACA,YAAY,SAAS,KAAK,KAAK,UAAU;KACvC,QAAQ,KAAK;KACb,OAAO,KAAK;IACd,EAAE;IACF;GACF;EACF,SAAS,OAAgB;GACvB,OAAO,OAAO,GAAG,KAAK,KAAK,0BAA0B;IACnD,OAAO,kBAAkB,OAAO,GAAG,KAAK,KAAK,yBAAyB;IACtE,QAAQ,GAAG,KAAK,KAAK;GACvB,CAAC;GACD,MAAM;EACR;CACF;AACF;AAEA,SAAgB,6BAGd,OACA,QACA,QACuC;CACvC,OAAO,IAAI,8BAA8B;EAAE;EAAQ,GAAG;CAAO,GAAG,KAAK;AACvE;AAEA,SAAgB,uBAGd,OACA,QACuC;CACvC,OAAO,6BACL,OACA,8BAA8B,GAC9B,MACF;AACF"}
@@ -0,0 +1,16 @@
1
+ import { VercelGatewayTextAdapter, VercelGatewayTextConfig } from './text.js';
2
+ import { VercelGatewayResponsesTextAdapter, VercelGatewayResponsesTextConfig } from './responses-text.js';
3
+ import { VercelGatewayChatModel } from '../model-meta.js';
4
+ export type VercelGatewayTextApi = 'responses' | 'chat' | 'chat-completions';
5
+ /** Config for the branching factory's Responses mode (default, or api: 'responses'). */
6
+ export type VercelGatewayResponsesApiConfig = Omit<VercelGatewayResponsesTextConfig, 'apiKey'> & {
7
+ api?: 'responses';
8
+ };
9
+ /** Config for the branching factory's Chat Completions mode (api required). */
10
+ export type VercelGatewayChatApiConfig = Omit<VercelGatewayTextConfig, 'apiKey'> & {
11
+ api: 'chat' | 'chat-completions';
12
+ };
13
+ export declare function createVercelGatewayText<TModel extends VercelGatewayChatModel>(model: TModel, apiKey: string, config?: VercelGatewayResponsesApiConfig): VercelGatewayResponsesTextAdapter<TModel>;
14
+ export declare function createVercelGatewayText<TModel extends VercelGatewayChatModel>(model: TModel, apiKey: string, config: VercelGatewayChatApiConfig): VercelGatewayTextAdapter<TModel>;
15
+ export declare function vercelGatewayText<TModel extends VercelGatewayChatModel>(model: TModel, config?: VercelGatewayResponsesApiConfig): VercelGatewayResponsesTextAdapter<TModel>;
16
+ export declare function vercelGatewayText<TModel extends VercelGatewayChatModel>(model: TModel, config: VercelGatewayChatApiConfig): VercelGatewayTextAdapter<TModel>;
@@ -0,0 +1,28 @@
1
+ import { getVercelGatewayApiKeyFromEnv } from "../utils/client.js";
2
+ import { VercelGatewayTextAdapter } from "./text.js";
3
+ import { VercelGatewayResponsesTextAdapter } from "./responses-text.js";
4
+ //#region src/adapters/factory.ts
5
+ function stripApi(config) {
6
+ const { api, ...rest } = config;
7
+ return rest;
8
+ }
9
+ function build(model, config) {
10
+ if (config.api === "chat" || config.api === "chat-completions") return new VercelGatewayTextAdapter(stripApi(config), model);
11
+ return new VercelGatewayResponsesTextAdapter(stripApi(config), model);
12
+ }
13
+ function createVercelGatewayText(model, apiKey, config) {
14
+ return build(model, {
15
+ ...config,
16
+ apiKey
17
+ });
18
+ }
19
+ function vercelGatewayText(model, config) {
20
+ return build(model, {
21
+ ...config,
22
+ apiKey: getVercelGatewayApiKeyFromEnv()
23
+ });
24
+ }
25
+ //#endregion
26
+ export { createVercelGatewayText, vercelGatewayText };
27
+
28
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","names":[],"sources":["../../../src/adapters/factory.ts"],"sourcesContent":["import { getVercelGatewayApiKeyFromEnv } from '../utils/client'\nimport { VercelGatewayTextAdapter } from './text'\nimport { VercelGatewayResponsesTextAdapter } from './responses-text'\nimport type { VercelGatewayClientConfig } from '../utils/client'\nimport type { VercelGatewayTextConfig } from './text'\nimport type { VercelGatewayResponsesTextConfig } from './responses-text'\nimport type { VercelGatewayChatModel } from '../model-meta'\n\nexport type VercelGatewayTextApi = 'responses' | 'chat' | 'chat-completions'\n\n/** Config for the branching factory's Responses mode (default, or api: 'responses'). */\nexport type VercelGatewayResponsesApiConfig = Omit<\n VercelGatewayResponsesTextConfig,\n 'apiKey'\n> & {\n api?: 'responses'\n}\n\n/** Config for the branching factory's Chat Completions mode (api required). */\nexport type VercelGatewayChatApiConfig = Omit<\n VercelGatewayTextConfig,\n 'apiKey'\n> & {\n api: 'chat' | 'chat-completions'\n}\n\ntype AnyVercelGatewayTextAdapter<TModel extends VercelGatewayChatModel> =\n | VercelGatewayResponsesTextAdapter<TModel>\n | VercelGatewayTextAdapter<TModel>\n\nfunction stripApi<T extends { api?: unknown }>(config: T): Omit<T, 'api'> {\n const { api, ...rest } = config\n void api\n return rest\n}\n\nfunction build<TModel extends VercelGatewayChatModel>(\n model: TModel,\n config: VercelGatewayClientConfig & { api?: VercelGatewayTextApi },\n): AnyVercelGatewayTextAdapter<TModel> {\n if (config.api === 'chat' || config.api === 'chat-completions') {\n return new VercelGatewayTextAdapter(stripApi(config), model)\n }\n return new VercelGatewayResponsesTextAdapter(stripApi(config), model)\n}\n\nexport function createVercelGatewayText<TModel extends VercelGatewayChatModel>(\n model: TModel,\n apiKey: string,\n config?: VercelGatewayResponsesApiConfig,\n): VercelGatewayResponsesTextAdapter<TModel>\nexport function createVercelGatewayText<TModel extends VercelGatewayChatModel>(\n model: TModel,\n apiKey: string,\n config: VercelGatewayChatApiConfig,\n): VercelGatewayTextAdapter<TModel>\nexport function createVercelGatewayText<TModel extends VercelGatewayChatModel>(\n model: TModel,\n apiKey: string,\n config?: VercelGatewayResponsesApiConfig | VercelGatewayChatApiConfig,\n): AnyVercelGatewayTextAdapter<TModel> {\n return build(model, { ...config, apiKey })\n}\n\nexport function vercelGatewayText<TModel extends VercelGatewayChatModel>(\n model: TModel,\n config?: VercelGatewayResponsesApiConfig,\n): VercelGatewayResponsesTextAdapter<TModel>\nexport function vercelGatewayText<TModel extends VercelGatewayChatModel>(\n model: TModel,\n config: VercelGatewayChatApiConfig,\n): VercelGatewayTextAdapter<TModel>\nexport function vercelGatewayText<TModel extends VercelGatewayChatModel>(\n model: TModel,\n config?: VercelGatewayResponsesApiConfig | VercelGatewayChatApiConfig,\n): AnyVercelGatewayTextAdapter<TModel> {\n return build(model, {\n ...config,\n apiKey: getVercelGatewayApiKeyFromEnv(),\n })\n}\n"],"mappings":";;;;AA8BA,SAAS,SAAsC,QAA2B;CACxE,MAAM,EAAE,KAAK,GAAG,SAAS;CAEzB,OAAO;AACT;AAEA,SAAS,MACP,OACA,QACqC;CACrC,IAAI,OAAO,QAAQ,UAAU,OAAO,QAAQ,oBAC1C,OAAO,IAAI,yBAAyB,SAAS,MAAM,GAAG,KAAK;CAE7D,OAAO,IAAI,kCAAkC,SAAS,MAAM,GAAG,KAAK;AACtE;AAYA,SAAgB,wBACd,OACA,QACA,QACqC;CACrC,OAAO,MAAM,OAAO;EAAE,GAAG;EAAQ;CAAO,CAAC;AAC3C;AAUA,SAAgB,kBACd,OACA,QACqC;CACrC,OAAO,MAAM,OAAO;EAClB,GAAG;EACH,QAAQ,8BAA8B;CACxC,CAAC;AACH"}
@@ -0,0 +1,22 @@
1
+ import { default as OpenAI } from 'openai';
2
+ import { BaseImageAdapter } from '@tanstack/ai/adapters';
3
+ import { ImageGenerationOptions, ImageGenerationResult } from '@tanstack/ai';
4
+ import { VercelGatewayImageModel, VercelGatewayImageModelInputModalitiesByName, VercelGatewayImageModelProviderOptionsByName, VercelGatewayImageModelSizeByName } from '../model-meta.js';
5
+ import { VercelGatewayImageProviderOptions } from '../image/image-provider-options.js';
6
+ import { VercelGatewayClientConfig } from '../utils/client.js';
7
+ export interface VercelGatewayImageConfig extends VercelGatewayClientConfig {
8
+ }
9
+ /**
10
+ * Vercel AI Gateway image adapter.
11
+ *
12
+ * Text-to-image only via `POST /v1/images/generations`.
13
+ */
14
+ export declare class VercelGatewayImageAdapter<TModel extends VercelGatewayImageModel> extends BaseImageAdapter<TModel, VercelGatewayImageProviderOptions, VercelGatewayImageModelProviderOptionsByName, VercelGatewayImageModelSizeByName, VercelGatewayImageModelInputModalitiesByName> {
15
+ readonly kind: "image";
16
+ readonly name: "vercel-gateway";
17
+ protected client: OpenAI;
18
+ constructor(config: VercelGatewayImageConfig, model: TModel);
19
+ generateImages(options: ImageGenerationOptions<VercelGatewayImageProviderOptions>): Promise<ImageGenerationResult>;
20
+ }
21
+ export declare function createVercelGatewayImage<TModel extends VercelGatewayImageModel>(model: TModel, apiKey: string, config?: Omit<VercelGatewayImageConfig, 'apiKey'>): VercelGatewayImageAdapter<TModel>;
22
+ export declare function vercelGatewayImage<TModel extends VercelGatewayImageModel>(model: TModel, config?: Omit<VercelGatewayImageConfig, 'apiKey'>): VercelGatewayImageAdapter<TModel>;
@@ -0,0 +1,87 @@
1
+ import { getVercelGatewayApiKeyFromEnv, withVercelGatewayDefaults } from "../utils/client.js";
2
+ import { mapGatewayModelOptions } from "../utils/map-gateway-options.js";
3
+ import OpenAI from "openai";
4
+ import { buildImagesUsage } from "@tanstack/openai-base";
5
+ import { generateId } from "@tanstack/ai-utils";
6
+ import { BaseImageAdapter } from "@tanstack/ai/adapters";
7
+ import { toRunErrorPayload } from "@tanstack/ai/adapter-internals";
8
+ import { resolveMediaPrompt } from "@tanstack/ai";
9
+ //#region src/adapters/image.ts
10
+ /**
11
+ * Vercel AI Gateway image adapter.
12
+ *
13
+ * Text-to-image only via `POST /v1/images/generations`.
14
+ */
15
+ var VercelGatewayImageAdapter = class extends BaseImageAdapter {
16
+ kind = "image";
17
+ name = "vercel-gateway";
18
+ client;
19
+ constructor(config, model) {
20
+ super(model, {});
21
+ this.client = new OpenAI(withVercelGatewayDefaults(config));
22
+ }
23
+ async generateImages(options) {
24
+ const { model, numberOfImages, size, logger } = options;
25
+ const resolved = resolveMediaPrompt(options.prompt);
26
+ const prompt = resolved.text;
27
+ if (resolved.videos.length > 0) throw new Error(`${this.name}.generateImages does not support video prompt parts (model: ${model}).`);
28
+ if (resolved.audios.length > 0) throw new Error(`${this.name}.generateImages does not support audio prompt parts (model: ${model}).`);
29
+ if (resolved.images.length > 0) throw new Error(`${this.name}.generateImages does not support image edits in v1 (model: ${model}).`);
30
+ const request = {
31
+ ...mapGatewayModelOptions(options.modelOptions),
32
+ model,
33
+ prompt,
34
+ n: numberOfImages ?? 1
35
+ };
36
+ if (size !== void 0) request.size = size;
37
+ try {
38
+ logger.request(`activity=image provider=${this.name} model=${model} n=${request.n ?? 1} size=${request.size ?? "default"}`, {
39
+ provider: this.name,
40
+ model
41
+ });
42
+ const response = await this.client.images.generate({
43
+ ...request,
44
+ stream: false
45
+ });
46
+ const images = (response.data ?? []).flatMap((item) => {
47
+ const revisedPromptField = item.revised_prompt !== void 0 ? { revisedPrompt: item.revised_prompt } : {};
48
+ if (item.b64_json) return [{
49
+ b64Json: item.b64_json,
50
+ ...revisedPromptField
51
+ }];
52
+ if (item.url) return [{
53
+ url: item.url,
54
+ ...revisedPromptField
55
+ }];
56
+ return [];
57
+ });
58
+ if (images.length === 0) throw new Error(`${this.name}: image response contained no images`);
59
+ const usage = buildImagesUsage(response.usage);
60
+ return {
61
+ id: generateId(this.name),
62
+ model,
63
+ images,
64
+ ...usage ? { usage } : {}
65
+ };
66
+ } catch (error) {
67
+ logger.errors(`${this.name}.generateImages fatal`, {
68
+ error: toRunErrorPayload(error, `${this.name}.generateImages failed`),
69
+ source: `${this.name}.generateImages`
70
+ });
71
+ throw error;
72
+ }
73
+ }
74
+ };
75
+ function createVercelGatewayImage(model, apiKey, config) {
76
+ return new VercelGatewayImageAdapter({
77
+ apiKey,
78
+ ...config
79
+ }, model);
80
+ }
81
+ function vercelGatewayImage(model, config) {
82
+ return createVercelGatewayImage(model, getVercelGatewayApiKeyFromEnv(), config);
83
+ }
84
+ //#endregion
85
+ export { VercelGatewayImageAdapter, createVercelGatewayImage, vercelGatewayImage };
86
+
87
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","names":[],"sources":["../../../src/adapters/image.ts"],"sourcesContent":["import OpenAI from 'openai'\nimport { resolveMediaPrompt } from '@tanstack/ai'\nimport { BaseImageAdapter } from '@tanstack/ai/adapters'\nimport { toRunErrorPayload } from '@tanstack/ai/adapter-internals'\nimport { buildImagesUsage } from '@tanstack/openai-base'\nimport { generateId } from '@tanstack/ai-utils'\nimport {\n getVercelGatewayApiKeyFromEnv,\n withVercelGatewayDefaults,\n} from '../utils/client'\nimport { mapGatewayModelOptions } from '../utils/map-gateway-options'\nimport type {\n GeneratedImage,\n ImageGenerationOptions,\n ImageGenerationResult,\n} from '@tanstack/ai'\nimport type OpenAI_SDK from 'openai'\nimport type {\n VercelGatewayImageModel,\n VercelGatewayImageModelInputModalitiesByName,\n VercelGatewayImageModelProviderOptionsByName,\n VercelGatewayImageModelSizeByName,\n} from '../model-meta'\nimport type { VercelGatewayImageProviderOptions } from '../image/image-provider-options'\nimport type { VercelGatewayClientConfig } from '../utils/client'\n\nexport interface VercelGatewayImageConfig extends VercelGatewayClientConfig {}\n\n/**\n * Vercel AI Gateway image adapter.\n *\n * Text-to-image only via `POST /v1/images/generations`.\n */\nexport class VercelGatewayImageAdapter<\n TModel extends VercelGatewayImageModel,\n> extends BaseImageAdapter<\n TModel,\n VercelGatewayImageProviderOptions,\n VercelGatewayImageModelProviderOptionsByName,\n VercelGatewayImageModelSizeByName,\n VercelGatewayImageModelInputModalitiesByName\n> {\n override readonly kind = 'image' as const\n readonly name = 'vercel-gateway' as const\n\n protected client: OpenAI\n\n constructor(config: VercelGatewayImageConfig, model: TModel) {\n super(model, {})\n this.client = new OpenAI(withVercelGatewayDefaults(config))\n }\n\n async generateImages(\n options: ImageGenerationOptions<VercelGatewayImageProviderOptions>,\n ): Promise<ImageGenerationResult> {\n const { model, numberOfImages, size, logger } = options\n const resolved = resolveMediaPrompt(options.prompt)\n const prompt = resolved.text\n\n if (resolved.videos.length > 0) {\n throw new Error(\n `${this.name}.generateImages does not support video prompt parts (model: ${model}).`,\n )\n }\n if (resolved.audios.length > 0) {\n throw new Error(\n `${this.name}.generateImages does not support audio prompt parts (model: ${model}).`,\n )\n }\n if (resolved.images.length > 0) {\n throw new Error(\n `${this.name}.generateImages does not support image edits in v1 (model: ${model}).`,\n )\n }\n\n const mapped = mapGatewayModelOptions(\n options.modelOptions as Record<string, unknown> | undefined,\n )\n const request: OpenAI_SDK.Images.ImageGenerateParams = {\n ...mapped,\n model,\n prompt,\n n: numberOfImages ?? 1,\n }\n if (size !== undefined) {\n request.size = size\n }\n\n try {\n logger.request(\n `activity=image provider=${this.name} model=${model} n=${request.n ?? 1} size=${request.size ?? 'default'}`,\n { provider: this.name, model },\n )\n const response = await this.client.images.generate({\n ...request,\n stream: false,\n })\n\n const images: Array<GeneratedImage> = (response.data ?? []).flatMap(\n (item): Array<GeneratedImage> => {\n const revisedPromptField =\n item.revised_prompt !== undefined\n ? { revisedPrompt: item.revised_prompt }\n : {}\n if (item.b64_json) {\n return [{ b64Json: item.b64_json, ...revisedPromptField }]\n }\n if (item.url) {\n return [{ url: item.url, ...revisedPromptField }]\n }\n return []\n },\n )\n\n if (images.length === 0) {\n throw new Error(`${this.name}: image response contained no images`)\n }\n\n const usage = buildImagesUsage(response.usage)\n\n return {\n id: generateId(this.name),\n model,\n images,\n ...(usage ? { usage } : {}),\n }\n } catch (error: unknown) {\n logger.errors(`${this.name}.generateImages fatal`, {\n error: toRunErrorPayload(error, `${this.name}.generateImages failed`),\n source: `${this.name}.generateImages`,\n })\n throw error\n }\n }\n}\n\nexport function createVercelGatewayImage<\n TModel extends VercelGatewayImageModel,\n>(\n model: TModel,\n apiKey: string,\n config?: Omit<VercelGatewayImageConfig, 'apiKey'>,\n): VercelGatewayImageAdapter<TModel> {\n return new VercelGatewayImageAdapter({ apiKey, ...config }, model)\n}\n\nexport function vercelGatewayImage<TModel extends VercelGatewayImageModel>(\n model: TModel,\n config?: Omit<VercelGatewayImageConfig, 'apiKey'>,\n): VercelGatewayImageAdapter<TModel> {\n return createVercelGatewayImage(\n model,\n getVercelGatewayApiKeyFromEnv(),\n config,\n )\n}\n"],"mappings":";;;;;;;;;;;;;;AAiCA,IAAa,4BAAb,cAEU,iBAMR;CACA,OAAyB;CACzB,OAAgB;CAEhB;CAEA,YAAY,QAAkC,OAAe;EAC3D,MAAM,OAAO,CAAC,CAAC;EACf,KAAK,SAAS,IAAI,OAAO,0BAA0B,MAAM,CAAC;CAC5D;CAEA,MAAM,eACJ,SACgC;EAChC,MAAM,EAAE,OAAO,gBAAgB,MAAM,WAAW;EAChD,MAAM,WAAW,mBAAmB,QAAQ,MAAM;EAClD,MAAM,SAAS,SAAS;EAExB,IAAI,SAAS,OAAO,SAAS,GAC3B,MAAM,IAAI,MACR,GAAG,KAAK,KAAK,8DAA8D,MAAM,GACnF;EAEF,IAAI,SAAS,OAAO,SAAS,GAC3B,MAAM,IAAI,MACR,GAAG,KAAK,KAAK,8DAA8D,MAAM,GACnF;EAEF,IAAI,SAAS,OAAO,SAAS,GAC3B,MAAM,IAAI,MACR,GAAG,KAAK,KAAK,6DAA6D,MAAM,GAClF;EAMF,MAAM,UAAiD;GACrD,GAJa,uBACb,QAAQ,YAGL;GACH;GACA;GACA,GAAG,kBAAkB;EACvB;EACA,IAAI,SAAS,KAAA,GACX,QAAQ,OAAO;EAGjB,IAAI;GACF,OAAO,QACL,2BAA2B,KAAK,KAAK,SAAS,MAAM,KAAK,QAAQ,KAAK,EAAE,QAAQ,QAAQ,QAAQ,aAChG;IAAE,UAAU,KAAK;IAAM;GAAM,CAC/B;GACA,MAAM,WAAW,MAAM,KAAK,OAAO,OAAO,SAAS;IACjD,GAAG;IACH,QAAQ;GACV,CAAC;GAED,MAAM,UAAiC,SAAS,QAAQ,CAAC,EAAA,CAAG,SACzD,SAAgC;IAC/B,MAAM,qBACJ,KAAK,mBAAmB,KAAA,IACpB,EAAE,eAAe,KAAK,eAAe,IACrC,CAAC;IACP,IAAI,KAAK,UACP,OAAO,CAAC;KAAE,SAAS,KAAK;KAAU,GAAG;IAAmB,CAAC;IAE3D,IAAI,KAAK,KACP,OAAO,CAAC;KAAE,KAAK,KAAK;KAAK,GAAG;IAAmB,CAAC;IAElD,OAAO,CAAC;GACV,CACF;GAEA,IAAI,OAAO,WAAW,GACpB,MAAM,IAAI,MAAM,GAAG,KAAK,KAAK,qCAAqC;GAGpE,MAAM,QAAQ,iBAAiB,SAAS,KAAK;GAE7C,OAAO;IACL,IAAI,WAAW,KAAK,IAAI;IACxB;IACA;IACA,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;GAC3B;EACF,SAAS,OAAgB;GACvB,OAAO,OAAO,GAAG,KAAK,KAAK,wBAAwB;IACjD,OAAO,kBAAkB,OAAO,GAAG,KAAK,KAAK,uBAAuB;IACpE,QAAQ,GAAG,KAAK,KAAK;GACvB,CAAC;GACD,MAAM;EACR;CACF;AACF;AAEA,SAAgB,yBAGd,OACA,QACA,QACmC;CACnC,OAAO,IAAI,0BAA0B;EAAE;EAAQ,GAAG;CAAO,GAAG,KAAK;AACnE;AAEA,SAAgB,mBACd,OACA,QACmC;CACnC,OAAO,yBACL,OACA,8BAA8B,GAC9B,MACF;AACF"}
@@ -0,0 +1,26 @@
1
+ import { OpenAIBaseResponsesTextAdapter } from '@tanstack/openai-base';
2
+ import { Modality, TextOptions } from '@tanstack/ai';
3
+ import { ResponseCreateParams } from 'openai/resources/responses/responses';
4
+ import { VERCEL_GATEWAY_CHAT_MODELS, VercelGatewayChatModelToolCapabilitiesByName, ResolveInputModalities, ResolveProviderOptions } from '../model-meta.js';
5
+ import { VercelGatewayMessageMetadataByModality } from '../message-types.js';
6
+ import { ExternalResponsesProviderOptions } from '../text/responses-provider-options.js';
7
+ import { VercelGatewayClientConfig } from '../utils/client.js';
8
+ export interface VercelGatewayResponsesTextConfig extends VercelGatewayClientConfig {
9
+ }
10
+ export type VercelGatewayResponsesTextProviderOptions = ExternalResponsesProviderOptions;
11
+ type ResolveToolCapabilities<TModel extends string> = TModel extends keyof VercelGatewayChatModelToolCapabilitiesByName ? NonNullable<VercelGatewayChatModelToolCapabilitiesByName[TModel]> : readonly [];
12
+ /**
13
+ * Vercel AI Gateway Responses text adapter.
14
+ *
15
+ * Talks to the public OpenAI-compatible Responses API at
16
+ * `https://ai-gateway.vercel.sh/v1`.
17
+ */
18
+ export declare class VercelGatewayResponsesTextAdapter<TModel extends (typeof VERCEL_GATEWAY_CHAT_MODELS)[number], TProviderOptions extends Record<string, any> = ResolveProviderOptions<TModel>, TInputModalities extends ReadonlyArray<Modality> = ResolveInputModalities<TModel>, TToolCapabilities extends ReadonlyArray<string> = ResolveToolCapabilities<TModel>> extends OpenAIBaseResponsesTextAdapter<TModel, TProviderOptions, TInputModalities, VercelGatewayMessageMetadataByModality, TToolCapabilities> {
19
+ readonly kind: "text";
20
+ readonly name: "vercel-gateway";
21
+ constructor(config: VercelGatewayResponsesTextConfig, model: TModel);
22
+ protected mapOptionsToRequest(options: TextOptions<TProviderOptions>): Omit<ResponseCreateParams, 'stream'>;
23
+ }
24
+ export declare function createVercelGatewayResponsesText<TModel extends (typeof VERCEL_GATEWAY_CHAT_MODELS)[number]>(model: TModel, apiKey: string, config?: Omit<VercelGatewayResponsesTextConfig, 'apiKey'>): VercelGatewayResponsesTextAdapter<TModel>;
25
+ export declare function vercelGatewayResponsesText<TModel extends (typeof VERCEL_GATEWAY_CHAT_MODELS)[number]>(model: TModel, config?: Omit<VercelGatewayResponsesTextConfig, 'apiKey'>): VercelGatewayResponsesTextAdapter<TModel>;
26
+ export {};
@@ -0,0 +1,38 @@
1
+ import { getVercelGatewayApiKeyFromEnv, withVercelGatewayDefaults } from "../utils/client.js";
2
+ import { mapGatewayModelOptions } from "../utils/map-gateway-options.js";
3
+ import OpenAI from "openai";
4
+ import { OpenAIBaseResponsesTextAdapter } from "@tanstack/openai-base";
5
+ //#region src/adapters/responses-text.ts
6
+ /**
7
+ * Vercel AI Gateway Responses text adapter.
8
+ *
9
+ * Talks to the public OpenAI-compatible Responses API at
10
+ * `https://ai-gateway.vercel.sh/v1`.
11
+ */
12
+ var VercelGatewayResponsesTextAdapter = class extends OpenAIBaseResponsesTextAdapter {
13
+ kind = "text";
14
+ name = "vercel-gateway";
15
+ constructor(config, model) {
16
+ super(model, "vercel-gateway", new OpenAI(withVercelGatewayDefaults(config)));
17
+ }
18
+ mapOptionsToRequest(options) {
19
+ const { gateway: _gateway, ...rest } = super.mapOptionsToRequest({
20
+ ...options,
21
+ modelOptions: mapGatewayModelOptions(options.modelOptions)
22
+ });
23
+ return rest;
24
+ }
25
+ };
26
+ function createVercelGatewayResponsesText(model, apiKey, config) {
27
+ return new VercelGatewayResponsesTextAdapter({
28
+ apiKey,
29
+ ...config
30
+ }, model);
31
+ }
32
+ function vercelGatewayResponsesText(model, config) {
33
+ return createVercelGatewayResponsesText(model, getVercelGatewayApiKeyFromEnv(), config);
34
+ }
35
+ //#endregion
36
+ export { VercelGatewayResponsesTextAdapter, createVercelGatewayResponsesText, vercelGatewayResponsesText };
37
+
38
+ //# sourceMappingURL=responses-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responses-text.js","names":[],"sources":["../../../src/adapters/responses-text.ts"],"sourcesContent":["import OpenAI from 'openai'\nimport { OpenAIBaseResponsesTextAdapter } from '@tanstack/openai-base'\nimport {\n getVercelGatewayApiKeyFromEnv,\n withVercelGatewayDefaults,\n} from '../utils/client'\nimport { mapGatewayModelOptions } from '../utils/map-gateway-options'\nimport type { Modality, TextOptions } from '@tanstack/ai'\nimport type { ResponseCreateParams } from 'openai/resources/responses/responses'\nimport type {\n VERCEL_GATEWAY_CHAT_MODELS,\n VercelGatewayChatModelToolCapabilitiesByName,\n ResolveInputModalities,\n ResolveProviderOptions,\n} from '../model-meta'\nimport type { VercelGatewayMessageMetadataByModality } from '../message-types'\nimport type { ExternalResponsesProviderOptions } from '../text/responses-provider-options'\nimport type { VercelGatewayClientConfig } from '../utils/client'\n\nexport interface VercelGatewayResponsesTextConfig extends VercelGatewayClientConfig {}\n\nexport type VercelGatewayResponsesTextProviderOptions =\n ExternalResponsesProviderOptions\n\ntype ResolveToolCapabilities<TModel extends string> =\n TModel extends keyof VercelGatewayChatModelToolCapabilitiesByName\n ? NonNullable<VercelGatewayChatModelToolCapabilitiesByName[TModel]>\n : readonly []\n\n/**\n * Vercel AI Gateway Responses text adapter.\n *\n * Talks to the public OpenAI-compatible Responses API at\n * `https://ai-gateway.vercel.sh/v1`.\n */\nexport class VercelGatewayResponsesTextAdapter<\n TModel extends (typeof VERCEL_GATEWAY_CHAT_MODELS)[number],\n TProviderOptions extends Record<string, any> = ResolveProviderOptions<TModel>,\n TInputModalities extends ReadonlyArray<Modality> =\n ResolveInputModalities<TModel>,\n TToolCapabilities extends ReadonlyArray<string> =\n ResolveToolCapabilities<TModel>,\n> extends OpenAIBaseResponsesTextAdapter<\n TModel,\n TProviderOptions,\n TInputModalities,\n VercelGatewayMessageMetadataByModality,\n TToolCapabilities\n> {\n override readonly kind = 'text' as const\n override readonly name = 'vercel-gateway' as const\n\n constructor(config: VercelGatewayResponsesTextConfig, model: TModel) {\n super(\n model,\n 'vercel-gateway',\n new OpenAI(withVercelGatewayDefaults(config)),\n )\n }\n\n protected override mapOptionsToRequest(\n options: TextOptions<TProviderOptions>,\n ): Omit<ResponseCreateParams, 'stream'> {\n const request = super.mapOptionsToRequest({\n ...options,\n modelOptions: mapGatewayModelOptions(\n options.modelOptions as Record<string, unknown> | undefined,\n ) as TProviderOptions,\n })\n const { gateway: _gateway, ...rest } = request as typeof request & {\n gateway?: unknown\n }\n void _gateway\n return rest\n }\n}\n\nexport function createVercelGatewayResponsesText<\n TModel extends (typeof VERCEL_GATEWAY_CHAT_MODELS)[number],\n>(\n model: TModel,\n apiKey: string,\n config?: Omit<VercelGatewayResponsesTextConfig, 'apiKey'>,\n): VercelGatewayResponsesTextAdapter<TModel> {\n return new VercelGatewayResponsesTextAdapter({ apiKey, ...config }, model)\n}\n\nexport function vercelGatewayResponsesText<\n TModel extends (typeof VERCEL_GATEWAY_CHAT_MODELS)[number],\n>(\n model: TModel,\n config?: Omit<VercelGatewayResponsesTextConfig, 'apiKey'>,\n): VercelGatewayResponsesTextAdapter<TModel> {\n return createVercelGatewayResponsesText(\n model,\n getVercelGatewayApiKeyFromEnv(),\n config,\n )\n}\n"],"mappings":";;;;;;;;;;;AAmCA,IAAa,oCAAb,cAOU,+BAMR;CACA,OAAyB;CACzB,OAAyB;CAEzB,YAAY,QAA0C,OAAe;EACnE,MACE,OACA,kBACA,IAAI,OAAO,0BAA0B,MAAM,CAAC,CAC9C;CACF;CAEA,oBACE,SACsC;EAOtC,MAAM,EAAE,SAAS,UAAU,GAAG,SANd,MAAM,oBAAoB;GACxC,GAAG;GACH,cAAc,uBACZ,QAAQ,YACV;EACF,CACuC;EAIvC,OAAO;CACT;AACF;AAEA,SAAgB,iCAGd,OACA,QACA,QAC2C;CAC3C,OAAO,IAAI,kCAAkC;EAAE;EAAQ,GAAG;CAAO,GAAG,KAAK;AAC3E;AAEA,SAAgB,2BAGd,OACA,QAC2C;CAC3C,OAAO,iCACL,OACA,8BAA8B,GAC9B,MACF;AACF"}
@@ -0,0 +1,9 @@
1
+ import { ChatStreamSummarizeAdapter, InferTextProviderOptions } from '@tanstack/ai/adapters';
2
+ import { VercelGatewayTextAdapter } from './text.js';
3
+ import { VERCEL_GATEWAY_CHAT_MODELS } from '../model-meta.js';
4
+ import { VercelGatewayClientConfig } from '../utils/client.js';
5
+ export interface VercelGatewaySummarizeConfig extends VercelGatewayClientConfig {
6
+ }
7
+ export type VercelGatewaySummarizeModel = (typeof VERCEL_GATEWAY_CHAT_MODELS)[number];
8
+ export declare function createVercelGatewaySummarize<TModel extends VercelGatewaySummarizeModel>(model: TModel, apiKey: string, config?: Omit<VercelGatewaySummarizeConfig, 'apiKey'>): ChatStreamSummarizeAdapter<TModel, InferTextProviderOptions<VercelGatewayTextAdapter<TModel>>>;
9
+ export declare function vercelGatewaySummarize<TModel extends VercelGatewaySummarizeModel>(model: TModel, config?: Omit<VercelGatewaySummarizeConfig, 'apiKey'>): ChatStreamSummarizeAdapter<TModel, InferTextProviderOptions<VercelGatewayTextAdapter<TModel>>>;
@@ -0,0 +1,17 @@
1
+ import { getVercelGatewayApiKeyFromEnv } from "../utils/client.js";
2
+ import { VercelGatewayTextAdapter } from "./text.js";
3
+ import { ChatStreamSummarizeAdapter } from "@tanstack/ai/adapters";
4
+ //#region src/adapters/summarize.ts
5
+ function createVercelGatewaySummarize(model, apiKey, config) {
6
+ return new ChatStreamSummarizeAdapter(new VercelGatewayTextAdapter({
7
+ apiKey,
8
+ ...config
9
+ }, model), model, "vercel-gateway");
10
+ }
11
+ function vercelGatewaySummarize(model, config) {
12
+ return createVercelGatewaySummarize(model, getVercelGatewayApiKeyFromEnv(), config);
13
+ }
14
+ //#endregion
15
+ export { createVercelGatewaySummarize, vercelGatewaySummarize };
16
+
17
+ //# sourceMappingURL=summarize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarize.js","names":[],"sources":["../../../src/adapters/summarize.ts"],"sourcesContent":["import { ChatStreamSummarizeAdapter } from '@tanstack/ai/adapters'\nimport { getVercelGatewayApiKeyFromEnv } from '../utils/client'\nimport { VercelGatewayTextAdapter } from './text'\nimport type { InferTextProviderOptions } from '@tanstack/ai/adapters'\nimport type { VERCEL_GATEWAY_CHAT_MODELS } from '../model-meta'\nimport type { VercelGatewayClientConfig } from '../utils/client'\n\nexport interface VercelGatewaySummarizeConfig extends VercelGatewayClientConfig {}\n\nexport type VercelGatewaySummarizeModel =\n (typeof VERCEL_GATEWAY_CHAT_MODELS)[number]\n\nexport function createVercelGatewaySummarize<\n TModel extends VercelGatewaySummarizeModel,\n>(\n model: TModel,\n apiKey: string,\n config?: Omit<VercelGatewaySummarizeConfig, 'apiKey'>,\n): ChatStreamSummarizeAdapter<\n TModel,\n InferTextProviderOptions<VercelGatewayTextAdapter<TModel>>\n> {\n return new ChatStreamSummarizeAdapter(\n new VercelGatewayTextAdapter({ apiKey, ...config }, model),\n model,\n 'vercel-gateway',\n )\n}\n\nexport function vercelGatewaySummarize<\n TModel extends VercelGatewaySummarizeModel,\n>(\n model: TModel,\n config?: Omit<VercelGatewaySummarizeConfig, 'apiKey'>,\n): ChatStreamSummarizeAdapter<\n TModel,\n InferTextProviderOptions<VercelGatewayTextAdapter<TModel>>\n> {\n return createVercelGatewaySummarize(\n model,\n getVercelGatewayApiKeyFromEnv(),\n config,\n )\n}\n"],"mappings":";;;;AAYA,SAAgB,6BAGd,OACA,QACA,QAIA;CACA,OAAO,IAAI,2BACT,IAAI,yBAAyB;EAAE;EAAQ,GAAG;CAAO,GAAG,KAAK,GACzD,OACA,gBACF;AACF;AAEA,SAAgB,uBAGd,OACA,QAIA;CACA,OAAO,6BACL,OACA,8BAA8B,GAC9B,MACF;AACF"}
@@ -0,0 +1,60 @@
1
+ import { default as OpenAI } from 'openai';
2
+ import { OpenAIBaseChatCompletionsTextAdapter } from '@tanstack/openai-base';
3
+ import { Modality, TextOptions } from '@tanstack/ai';
4
+ import { VERCEL_GATEWAY_CHAT_MODELS, VercelGatewayChatModelToolCapabilitiesByName, ResolveInputModalities, ResolveProviderOptions } from '../model-meta.js';
5
+ import { VercelGatewayMessageMetadataByModality } from '../message-types.js';
6
+ import { VercelGatewayClientConfig } from '../utils/client.js';
7
+ type ResolveToolCapabilities<TModel extends string> = TModel extends keyof VercelGatewayChatModelToolCapabilitiesByName ? NonNullable<VercelGatewayChatModelToolCapabilitiesByName[TModel]> : readonly [];
8
+ export interface VercelGatewayTextConfig extends VercelGatewayClientConfig {
9
+ }
10
+ export type { ExternalTextProviderOptions as VercelGatewayTextProviderOptions } from '../text/text-provider-options.js';
11
+ /**
12
+ * Vercel AI Gateway text adapter.
13
+ *
14
+ * Talks to the public OpenAI-compatible Chat Completions API at
15
+ * `https://ai-gateway.vercel.sh/v1`.
16
+ */
17
+ export declare class VercelGatewayTextAdapter<TModel extends (typeof VERCEL_GATEWAY_CHAT_MODELS)[number], TProviderOptions extends Record<string, any> = ResolveProviderOptions<TModel>, TInputModalities extends ReadonlyArray<Modality> = ResolveInputModalities<TModel>, TToolCapabilities extends ReadonlyArray<string> = ResolveToolCapabilities<TModel>> extends OpenAIBaseChatCompletionsTextAdapter<TModel, TProviderOptions, TInputModalities, VercelGatewayMessageMetadataByModality, TToolCapabilities> {
18
+ readonly kind: "text";
19
+ readonly name: "vercel-gateway";
20
+ constructor(config: VercelGatewayTextConfig, model: TModel);
21
+ protected mapOptionsToRequest(options: TextOptions): {
22
+ stream: true;
23
+ messages: Array<OpenAI.Chat.Completions.ChatCompletionMessageParam>;
24
+ model: (string & {}) | import('openai/resources/shared.mjs').ChatModel;
25
+ audio?: OpenAI.Chat.Completions.ChatCompletionAudioParam | null;
26
+ frequency_penalty?: number | null;
27
+ function_call?: "none" | "auto" | OpenAI.Chat.Completions.ChatCompletionFunctionCallOption;
28
+ functions?: Array<OpenAI.Chat.Completions.ChatCompletionCreateParams.Function>;
29
+ logit_bias?: {
30
+ [key: string]: number;
31
+ } | null;
32
+ logprobs?: boolean | null;
33
+ max_completion_tokens?: number | null;
34
+ max_tokens?: number | null;
35
+ metadata?: import('openai/resources/shared.mjs').Metadata | null;
36
+ modalities?: Array<"text" | "audio"> | null;
37
+ n?: number | null;
38
+ parallel_tool_calls?: boolean;
39
+ prediction?: OpenAI.Chat.Completions.ChatCompletionPredictionContent | null;
40
+ presence_penalty?: number | null;
41
+ prompt_cache_key?: string;
42
+ prompt_cache_retention?: "in_memory" | "24h" | null;
43
+ reasoning_effort?: import('openai/resources/shared.mjs').ReasoningEffort | null;
44
+ response_format?: import('openai/resources/shared.mjs').ResponseFormatText | import('openai/resources/shared.mjs').ResponseFormatJSONSchema | import('openai/resources/shared.mjs').ResponseFormatJSONObject;
45
+ safety_identifier?: string;
46
+ seed?: number | null;
47
+ service_tier?: "auto" | "default" | "flex" | "scale" | "priority" | null;
48
+ stop?: string | null | Array<string>;
49
+ store?: boolean | null;
50
+ stream_options?: OpenAI.Chat.Completions.ChatCompletionStreamOptions | null;
51
+ temperature?: number | null;
52
+ tool_choice?: OpenAI.Chat.Completions.ChatCompletionToolChoiceOption;
53
+ tools?: Array<OpenAI.Chat.Completions.ChatCompletionTool>;
54
+ top_logprobs?: number | null;
55
+ top_p?: number | null;
56
+ user?: string;
57
+ verbosity?: "low" | "medium" | "high" | null;
58
+ web_search_options?: OpenAI.Chat.Completions.ChatCompletionCreateParams.WebSearchOptions;
59
+ };
60
+ }
@@ -0,0 +1,29 @@
1
+ import { withVercelGatewayDefaults } from "../utils/client.js";
2
+ import { mapGatewayModelOptions } from "../utils/map-gateway-options.js";
3
+ import OpenAI from "openai";
4
+ import { OpenAIBaseChatCompletionsTextAdapter } from "@tanstack/openai-base";
5
+ //#region src/adapters/text.ts
6
+ /**
7
+ * Vercel AI Gateway text adapter.
8
+ *
9
+ * Talks to the public OpenAI-compatible Chat Completions API at
10
+ * `https://ai-gateway.vercel.sh/v1`.
11
+ */
12
+ var VercelGatewayTextAdapter = class extends OpenAIBaseChatCompletionsTextAdapter {
13
+ kind = "text";
14
+ name = "vercel-gateway";
15
+ constructor(config, model) {
16
+ super(model, "vercel-gateway", new OpenAI(withVercelGatewayDefaults(config)));
17
+ }
18
+ mapOptionsToRequest(options) {
19
+ const { gateway: _gateway, ...rest } = super.mapOptionsToRequest({
20
+ ...options,
21
+ modelOptions: mapGatewayModelOptions(options.modelOptions)
22
+ });
23
+ return rest;
24
+ }
25
+ };
26
+ //#endregion
27
+ export { VercelGatewayTextAdapter };
28
+
29
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","names":[],"sources":["../../../src/adapters/text.ts"],"sourcesContent":["import OpenAI from 'openai'\nimport { OpenAIBaseChatCompletionsTextAdapter } from '@tanstack/openai-base'\nimport { withVercelGatewayDefaults } from '../utils/client'\nimport { mapGatewayModelOptions } from '../utils/map-gateway-options'\nimport type { Modality, TextOptions } from '@tanstack/ai'\nimport type {\n VERCEL_GATEWAY_CHAT_MODELS,\n VercelGatewayChatModelToolCapabilitiesByName,\n ResolveInputModalities,\n ResolveProviderOptions,\n} from '../model-meta'\nimport type { VercelGatewayMessageMetadataByModality } from '../message-types'\nimport type { VercelGatewayClientConfig } from '../utils/client'\n\ntype ResolveToolCapabilities<TModel extends string> =\n TModel extends keyof VercelGatewayChatModelToolCapabilitiesByName\n ? NonNullable<VercelGatewayChatModelToolCapabilitiesByName[TModel]>\n : readonly []\n\nexport interface VercelGatewayTextConfig extends VercelGatewayClientConfig {}\n\nexport type { ExternalTextProviderOptions as VercelGatewayTextProviderOptions } from '../text/text-provider-options'\n\n/**\n * Vercel AI Gateway text adapter.\n *\n * Talks to the public OpenAI-compatible Chat Completions API at\n * `https://ai-gateway.vercel.sh/v1`.\n */\nexport class VercelGatewayTextAdapter<\n TModel extends (typeof VERCEL_GATEWAY_CHAT_MODELS)[number],\n TProviderOptions extends Record<string, any> = ResolveProviderOptions<TModel>,\n TInputModalities extends ReadonlyArray<Modality> =\n ResolveInputModalities<TModel>,\n TToolCapabilities extends ReadonlyArray<string> =\n ResolveToolCapabilities<TModel>,\n> extends OpenAIBaseChatCompletionsTextAdapter<\n TModel,\n TProviderOptions,\n TInputModalities,\n VercelGatewayMessageMetadataByModality,\n TToolCapabilities\n> {\n override readonly kind = 'text' as const\n override readonly name = 'vercel-gateway' as const\n\n constructor(config: VercelGatewayTextConfig, model: TModel) {\n super(\n model,\n 'vercel-gateway',\n new OpenAI(withVercelGatewayDefaults(config)),\n )\n }\n\n protected override mapOptionsToRequest(options: TextOptions) {\n const request = super.mapOptionsToRequest({\n ...options,\n modelOptions: mapGatewayModelOptions(\n options.modelOptions as Record<string, unknown> | undefined,\n ) as TextOptions['modelOptions'],\n })\n const { gateway: _gateway, ...rest } = request as typeof request & {\n gateway?: unknown\n }\n void _gateway\n return rest\n }\n}\n"],"mappings":";;;;;;;;;;;AA6BA,IAAa,2BAAb,cAOU,qCAMR;CACA,OAAyB;CACzB,OAAyB;CAEzB,YAAY,QAAiC,OAAe;EAC1D,MACE,OACA,kBACA,IAAI,OAAO,0BAA0B,MAAM,CAAC,CAC9C;CACF;CAEA,oBAAuC,SAAsB;EAO3D,MAAM,EAAE,SAAS,UAAU,GAAG,SANd,MAAM,oBAAoB;GACxC,GAAG;GACH,cAAc,uBACZ,QAAQ,YACV;EACF,CACuC;EAIvC,OAAO;CACT;AACF"}
@@ -0,0 +1,5 @@
1
+ import { VercelGatewayRoutingOptions } from '../text/text-provider-options.js';
2
+ export interface VercelGatewayEmbeddingProviderOptions {
3
+ user?: string;
4
+ gateway?: VercelGatewayRoutingOptions;
5
+ }
@@ -0,0 +1,7 @@
1
+ import { VercelGatewayRoutingOptions } from '../text/text-provider-options.js';
2
+ export interface VercelGatewayImageProviderOptions {
3
+ quality?: 'standard' | 'hd';
4
+ style?: 'vivid' | 'natural';
5
+ gateway?: VercelGatewayRoutingOptions;
6
+ }
7
+ export type VercelGatewayImageSize = '1024x1024' | '1536x1024' | '1024x1536' | 'auto';
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @module @tanstack/ai-vercel-gateway
3
+ *
4
+ * Vercel AI Gateway adapter for TanStack AI.
5
+ */
6
+ export { VercelGatewayTextAdapter, type VercelGatewayTextConfig, type VercelGatewayTextProviderOptions, } from './adapters/text.js';
7
+ export { createVercelGatewayText, vercelGatewayText, type VercelGatewayTextApi, type VercelGatewayResponsesApiConfig, type VercelGatewayChatApiConfig, } from './adapters/factory.js';
8
+ export { VercelGatewayResponsesTextAdapter, createVercelGatewayResponsesText, vercelGatewayResponsesText, type VercelGatewayResponsesTextConfig, type VercelGatewayResponsesTextProviderOptions, } from './adapters/responses-text.js';
9
+ export { createVercelGatewaySummarize, vercelGatewaySummarize, type VercelGatewaySummarizeConfig, type VercelGatewaySummarizeModel, } from './adapters/summarize.js';
10
+ export { VercelGatewayEmbeddingAdapter, createVercelGatewayEmbedding, vercelGatewayEmbedding, type VercelGatewayEmbeddingConfig, } from './adapters/embedding.js';
11
+ export { VercelGatewayImageAdapter, createVercelGatewayImage, vercelGatewayImage, type VercelGatewayImageConfig, } from './adapters/image.js';
12
+ export type { VercelGatewayEmbeddingProviderOptions } from './embedding/embedding-provider-options.js';
13
+ export type { VercelGatewayImageProviderOptions } from './image/image-provider-options.js';
14
+ export type { VercelGatewayBaseOptions, VercelGatewayCommonOptions, VercelGatewayRoutingOptions, } from './text/text-provider-options.js';
15
+ export { VERCEL_GATEWAY_CHAT_MODELS, VERCEL_GATEWAY_EMBEDDING_MODELS, VERCEL_GATEWAY_IMAGE_MODELS, VERCEL_GATEWAY_MODEL_TAGS, VERCEL_GATEWAY_PROVIDERS, } from './model-meta.js';
16
+ export type { VercelGatewayChatModel, VercelGatewayChatModelProviderOptionsByName, VercelGatewayEmbeddingModel, VercelGatewayImageModel, VercelGatewayModelInputModalitiesByName, VercelGatewayModelTag, VercelGatewayProvider, } from './model-meta.js';
17
+ export { getVercelGatewayApiKeyFromEnv, type VercelGatewayClientConfig, } from './utils/client.js';
@@ -0,0 +1,9 @@
1
+ import { getVercelGatewayApiKeyFromEnv } from "./utils/client.js";
2
+ import { VercelGatewayTextAdapter } from "./adapters/text.js";
3
+ import { VercelGatewayResponsesTextAdapter, createVercelGatewayResponsesText, vercelGatewayResponsesText } from "./adapters/responses-text.js";
4
+ import { createVercelGatewayText, vercelGatewayText } from "./adapters/factory.js";
5
+ import { createVercelGatewaySummarize, vercelGatewaySummarize } from "./adapters/summarize.js";
6
+ import { VercelGatewayEmbeddingAdapter, createVercelGatewayEmbedding, vercelGatewayEmbedding } from "./adapters/embedding.js";
7
+ import { VercelGatewayImageAdapter, createVercelGatewayImage, vercelGatewayImage } from "./adapters/image.js";
8
+ import { VERCEL_GATEWAY_CHAT_MODELS, VERCEL_GATEWAY_EMBEDDING_MODELS, VERCEL_GATEWAY_IMAGE_MODELS, VERCEL_GATEWAY_MODEL_TAGS, VERCEL_GATEWAY_PROVIDERS } from "./model-meta.js";
9
+ export { VERCEL_GATEWAY_CHAT_MODELS, VERCEL_GATEWAY_EMBEDDING_MODELS, VERCEL_GATEWAY_IMAGE_MODELS, VERCEL_GATEWAY_MODEL_TAGS, VERCEL_GATEWAY_PROVIDERS, VercelGatewayEmbeddingAdapter, VercelGatewayImageAdapter, VercelGatewayResponsesTextAdapter, VercelGatewayTextAdapter, createVercelGatewayEmbedding, createVercelGatewayImage, createVercelGatewayResponsesText, createVercelGatewaySummarize, createVercelGatewayText, getVercelGatewayApiKeyFromEnv, vercelGatewayEmbedding, vercelGatewayImage, vercelGatewayResponsesText, vercelGatewaySummarize, vercelGatewayText };