@ai-sdk/xai 1.1.17 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/dist/index.d.mts +29 -12
- package/dist/index.d.ts +29 -12
- package/dist/index.js +96 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +101 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @ai-sdk/xai
|
|
2
2
|
|
|
3
|
+
## 1.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 5bc638d: AI SDK 4.2
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [5bc638d]
|
|
12
|
+
- @ai-sdk/openai-compatible@0.2.0
|
|
13
|
+
- @ai-sdk/provider@1.1.0
|
|
14
|
+
- @ai-sdk/provider-utils@2.2.0
|
|
15
|
+
|
|
16
|
+
## 1.1.18
|
|
17
|
+
|
|
18
|
+
### Patch Changes
|
|
19
|
+
|
|
20
|
+
- 6f0e741: feat (providers/xai): add xai image model support
|
|
21
|
+
|
|
3
22
|
## 1.1.17
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ProviderV1, LanguageModelV1 } from '@ai-sdk/provider';
|
|
1
|
+
import { ProviderV1, LanguageModelV1, ImageModelV1 } from '@ai-sdk/provider';
|
|
2
2
|
import { FetchFunction } from '@ai-sdk/provider-utils';
|
|
3
3
|
import { OpenAICompatibleChatSettings } from '@ai-sdk/openai-compatible';
|
|
4
4
|
import { z } from 'zod';
|
|
@@ -7,17 +7,14 @@ type XaiChatModelId = 'grok-2-1212' | 'grok-2-vision-1212' | 'grok-beta' | 'grok
|
|
|
7
7
|
interface XaiChatSettings extends OpenAICompatibleChatSettings {
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
error: string;
|
|
19
|
-
}>;
|
|
20
|
-
type XaiErrorData = z.infer<typeof xaiErrorSchema>;
|
|
10
|
+
type XaiImageModelId = 'grok-2-image' | (string & {});
|
|
11
|
+
interface XaiImageSettings {
|
|
12
|
+
/**
|
|
13
|
+
Override the maximum number of images per call. Default is 10.
|
|
14
|
+
*/
|
|
15
|
+
maxImagesPerCall?: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
21
18
|
interface XaiProvider extends ProviderV1 {
|
|
22
19
|
/**
|
|
23
20
|
Creates an Xai chat model for text generation.
|
|
@@ -31,6 +28,14 @@ interface XaiProvider extends ProviderV1 {
|
|
|
31
28
|
Creates an Xai chat model for text generation.
|
|
32
29
|
*/
|
|
33
30
|
chat: (modelId: XaiChatModelId, settings?: XaiChatSettings) => LanguageModelV1;
|
|
31
|
+
/**
|
|
32
|
+
Creates an Xai image model for image generation.
|
|
33
|
+
*/
|
|
34
|
+
image(modelId: XaiImageModelId, settings?: XaiImageSettings): ImageModelV1;
|
|
35
|
+
/**
|
|
36
|
+
Creates an Xai image model for image generation.
|
|
37
|
+
*/
|
|
38
|
+
imageModel(modelId: XaiImageModelId, settings?: XaiImageSettings): ImageModelV1;
|
|
34
39
|
}
|
|
35
40
|
interface XaiProviderSettings {
|
|
36
41
|
/**
|
|
@@ -54,4 +59,16 @@ interface XaiProviderSettings {
|
|
|
54
59
|
declare function createXai(options?: XaiProviderSettings): XaiProvider;
|
|
55
60
|
declare const xai: XaiProvider;
|
|
56
61
|
|
|
62
|
+
declare const xaiErrorSchema: z.ZodObject<{
|
|
63
|
+
code: z.ZodString;
|
|
64
|
+
error: z.ZodString;
|
|
65
|
+
}, "strip", z.ZodTypeAny, {
|
|
66
|
+
code: string;
|
|
67
|
+
error: string;
|
|
68
|
+
}, {
|
|
69
|
+
code: string;
|
|
70
|
+
error: string;
|
|
71
|
+
}>;
|
|
72
|
+
type XaiErrorData = z.infer<typeof xaiErrorSchema>;
|
|
73
|
+
|
|
57
74
|
export { type XaiErrorData, type XaiProvider, type XaiProviderSettings, createXai, xai };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ProviderV1, LanguageModelV1 } from '@ai-sdk/provider';
|
|
1
|
+
import { ProviderV1, LanguageModelV1, ImageModelV1 } from '@ai-sdk/provider';
|
|
2
2
|
import { FetchFunction } from '@ai-sdk/provider-utils';
|
|
3
3
|
import { OpenAICompatibleChatSettings } from '@ai-sdk/openai-compatible';
|
|
4
4
|
import { z } from 'zod';
|
|
@@ -7,17 +7,14 @@ type XaiChatModelId = 'grok-2-1212' | 'grok-2-vision-1212' | 'grok-beta' | 'grok
|
|
|
7
7
|
interface XaiChatSettings extends OpenAICompatibleChatSettings {
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
error: string;
|
|
19
|
-
}>;
|
|
20
|
-
type XaiErrorData = z.infer<typeof xaiErrorSchema>;
|
|
10
|
+
type XaiImageModelId = 'grok-2-image' | (string & {});
|
|
11
|
+
interface XaiImageSettings {
|
|
12
|
+
/**
|
|
13
|
+
Override the maximum number of images per call. Default is 10.
|
|
14
|
+
*/
|
|
15
|
+
maxImagesPerCall?: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
21
18
|
interface XaiProvider extends ProviderV1 {
|
|
22
19
|
/**
|
|
23
20
|
Creates an Xai chat model for text generation.
|
|
@@ -31,6 +28,14 @@ interface XaiProvider extends ProviderV1 {
|
|
|
31
28
|
Creates an Xai chat model for text generation.
|
|
32
29
|
*/
|
|
33
30
|
chat: (modelId: XaiChatModelId, settings?: XaiChatSettings) => LanguageModelV1;
|
|
31
|
+
/**
|
|
32
|
+
Creates an Xai image model for image generation.
|
|
33
|
+
*/
|
|
34
|
+
image(modelId: XaiImageModelId, settings?: XaiImageSettings): ImageModelV1;
|
|
35
|
+
/**
|
|
36
|
+
Creates an Xai image model for image generation.
|
|
37
|
+
*/
|
|
38
|
+
imageModel(modelId: XaiImageModelId, settings?: XaiImageSettings): ImageModelV1;
|
|
34
39
|
}
|
|
35
40
|
interface XaiProviderSettings {
|
|
36
41
|
/**
|
|
@@ -54,4 +59,16 @@ interface XaiProviderSettings {
|
|
|
54
59
|
declare function createXai(options?: XaiProviderSettings): XaiProvider;
|
|
55
60
|
declare const xai: XaiProvider;
|
|
56
61
|
|
|
62
|
+
declare const xaiErrorSchema: z.ZodObject<{
|
|
63
|
+
code: z.ZodString;
|
|
64
|
+
error: z.ZodString;
|
|
65
|
+
}, "strip", z.ZodTypeAny, {
|
|
66
|
+
code: string;
|
|
67
|
+
error: string;
|
|
68
|
+
}, {
|
|
69
|
+
code: string;
|
|
70
|
+
error: string;
|
|
71
|
+
}>;
|
|
72
|
+
type XaiErrorData = z.infer<typeof xaiErrorSchema>;
|
|
73
|
+
|
|
57
74
|
export { type XaiErrorData, type XaiProvider, type XaiProviderSettings, createXai, xai };
|
package/dist/index.js
CHANGED
|
@@ -28,30 +28,112 @@ module.exports = __toCommonJS(src_exports);
|
|
|
28
28
|
// src/xai-provider.ts
|
|
29
29
|
var import_provider = require("@ai-sdk/provider");
|
|
30
30
|
var import_openai_compatible = require("@ai-sdk/openai-compatible");
|
|
31
|
-
var
|
|
31
|
+
var import_provider_utils2 = require("@ai-sdk/provider-utils");
|
|
32
32
|
|
|
33
33
|
// src/xai-chat-settings.ts
|
|
34
34
|
function supportsStructuredOutputs(modelId) {
|
|
35
35
|
return ["grok-2-1212", "grok-2-vision-1212"].includes(modelId);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
// src/xai-
|
|
38
|
+
// src/xai-error.ts
|
|
39
39
|
var import_zod = require("zod");
|
|
40
40
|
var xaiErrorSchema = import_zod.z.object({
|
|
41
41
|
code: import_zod.z.string(),
|
|
42
42
|
error: import_zod.z.string()
|
|
43
43
|
});
|
|
44
|
+
|
|
45
|
+
// src/xai-image-model.ts
|
|
46
|
+
var import_provider_utils = require("@ai-sdk/provider-utils");
|
|
47
|
+
var import_zod2 = require("zod");
|
|
48
|
+
var XaiImageModel = class {
|
|
49
|
+
constructor(modelId, settings, config) {
|
|
50
|
+
this.modelId = modelId;
|
|
51
|
+
this.settings = settings;
|
|
52
|
+
this.config = config;
|
|
53
|
+
this.specificationVersion = "v1";
|
|
54
|
+
}
|
|
55
|
+
get maxImagesPerCall() {
|
|
56
|
+
var _a;
|
|
57
|
+
return (_a = this.settings.maxImagesPerCall) != null ? _a : 10;
|
|
58
|
+
}
|
|
59
|
+
get provider() {
|
|
60
|
+
return this.config.provider;
|
|
61
|
+
}
|
|
62
|
+
async doGenerate({
|
|
63
|
+
prompt,
|
|
64
|
+
n,
|
|
65
|
+
size,
|
|
66
|
+
aspectRatio,
|
|
67
|
+
seed,
|
|
68
|
+
providerOptions,
|
|
69
|
+
headers,
|
|
70
|
+
abortSignal
|
|
71
|
+
}) {
|
|
72
|
+
var _a, _b, _c, _d;
|
|
73
|
+
const warnings = [];
|
|
74
|
+
if (aspectRatio != null) {
|
|
75
|
+
warnings.push({
|
|
76
|
+
type: "unsupported-setting",
|
|
77
|
+
setting: "aspectRatio",
|
|
78
|
+
details: "This model does not support aspect ratio. Use `size` instead."
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
if (seed != null) {
|
|
82
|
+
warnings.push({ type: "unsupported-setting", setting: "seed" });
|
|
83
|
+
}
|
|
84
|
+
const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
|
|
85
|
+
const { value: response, responseHeaders } = await (0, import_provider_utils.postJsonToApi)({
|
|
86
|
+
url: this.config.url({
|
|
87
|
+
path: "/images/generations",
|
|
88
|
+
modelId: this.modelId
|
|
89
|
+
}),
|
|
90
|
+
headers: (0, import_provider_utils.combineHeaders)(this.config.headers(), headers),
|
|
91
|
+
body: {
|
|
92
|
+
model: this.modelId,
|
|
93
|
+
prompt,
|
|
94
|
+
n,
|
|
95
|
+
size,
|
|
96
|
+
...(_d = providerOptions.openai) != null ? _d : {},
|
|
97
|
+
response_format: "b64_json"
|
|
98
|
+
},
|
|
99
|
+
failedResponseHandler: (0, import_provider_utils.createJsonErrorResponseHandler)({
|
|
100
|
+
errorSchema: xaiErrorSchema,
|
|
101
|
+
errorToMessage: (data) => data.error
|
|
102
|
+
}),
|
|
103
|
+
successfulResponseHandler: (0, import_provider_utils.createJsonResponseHandler)(
|
|
104
|
+
openaiCompatibleImageResponseSchema
|
|
105
|
+
),
|
|
106
|
+
abortSignal,
|
|
107
|
+
fetch: this.config.fetch
|
|
108
|
+
});
|
|
109
|
+
return {
|
|
110
|
+
// xAI image generation returns a data URI scheme prefix we must strip.
|
|
111
|
+
images: response.data.map((item) => item.b64_json.split(",")[1]),
|
|
112
|
+
warnings,
|
|
113
|
+
response: {
|
|
114
|
+
timestamp: currentDate,
|
|
115
|
+
modelId: this.modelId,
|
|
116
|
+
headers: responseHeaders
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
var openaiCompatibleImageResponseSchema = import_zod2.z.object({
|
|
122
|
+
data: import_zod2.z.array(import_zod2.z.object({ b64_json: import_zod2.z.string() }))
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// src/xai-provider.ts
|
|
44
126
|
var xaiErrorStructure = {
|
|
45
127
|
errorSchema: xaiErrorSchema,
|
|
46
128
|
errorToMessage: (data) => data.error
|
|
47
129
|
};
|
|
48
130
|
function createXai(options = {}) {
|
|
49
131
|
var _a;
|
|
50
|
-
const baseURL = (0,
|
|
132
|
+
const baseURL = (0, import_provider_utils2.withoutTrailingSlash)(
|
|
51
133
|
(_a = options.baseURL) != null ? _a : "https://api.x.ai/v1"
|
|
52
134
|
);
|
|
53
135
|
const getHeaders = () => ({
|
|
54
|
-
Authorization: `Bearer ${(0,
|
|
136
|
+
Authorization: `Bearer ${(0, import_provider_utils2.loadApiKey)({
|
|
55
137
|
apiKey: options.apiKey,
|
|
56
138
|
environmentVariableName: "XAI_API_KEY",
|
|
57
139
|
description: "xAI API key"
|
|
@@ -70,12 +152,22 @@ function createXai(options = {}) {
|
|
|
70
152
|
supportsStructuredOutputs: structuredOutputs
|
|
71
153
|
});
|
|
72
154
|
};
|
|
155
|
+
const createImageModel = (modelId, settings = {}) => {
|
|
156
|
+
return new XaiImageModel(modelId, settings, {
|
|
157
|
+
provider: "xai.image",
|
|
158
|
+
url: ({ path }) => `${baseURL}${path}`,
|
|
159
|
+
headers: getHeaders,
|
|
160
|
+
fetch: options.fetch
|
|
161
|
+
});
|
|
162
|
+
};
|
|
73
163
|
const provider = (modelId, settings) => createLanguageModel(modelId, settings);
|
|
74
164
|
provider.languageModel = createLanguageModel;
|
|
75
165
|
provider.chat = createLanguageModel;
|
|
76
166
|
provider.textEmbeddingModel = (modelId) => {
|
|
77
167
|
throw new import_provider.NoSuchModelError({ modelId, modelType: "textEmbeddingModel" });
|
|
78
168
|
};
|
|
169
|
+
provider.imageModel = createImageModel;
|
|
170
|
+
provider.image = createImageModel;
|
|
79
171
|
return provider;
|
|
80
172
|
}
|
|
81
173
|
var xai = createXai();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/xai-provider.ts","../src/xai-chat-settings.ts"],"sourcesContent":["export { createXai, xai } from './xai-provider';\nexport type {\n XaiErrorData,\n XaiProvider,\n XaiProviderSettings,\n} from './xai-provider';\n","import {\n LanguageModelV1,\n NoSuchModelError,\n ProviderV1,\n} from '@ai-sdk/provider';\nimport { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport {\n XaiChatModelId,\n XaiChatSettings,\n supportsStructuredOutputs,\n} from './xai-chat-settings';\nimport { z } from 'zod';\nimport { ProviderErrorStructure } from '@ai-sdk/openai-compatible';\n\n// Add error schema and structure\nconst xaiErrorSchema = z.object({\n code: z.string(),\n error: z.string(),\n});\n\nexport type XaiErrorData = z.infer<typeof xaiErrorSchema>;\n\nconst xaiErrorStructure: ProviderErrorStructure<XaiErrorData> = {\n errorSchema: xaiErrorSchema,\n errorToMessage: data => data.error,\n};\n\nexport interface XaiProvider extends ProviderV1 {\n /**\nCreates an Xai chat model for text generation.\n */\n (modelId: XaiChatModelId, settings?: XaiChatSettings): LanguageModelV1;\n\n /**\nCreates an Xai language model for text generation.\n */\n languageModel(\n modelId: XaiChatModelId,\n settings?: XaiChatSettings,\n ): LanguageModelV1;\n\n /**\nCreates an Xai chat model for text generation.\n */\n chat: (\n modelId: XaiChatModelId,\n settings?: XaiChatSettings,\n ) => LanguageModelV1;\n}\n\nexport interface XaiProviderSettings {\n /**\nBase URL for the xAI API calls.\n */\n baseURL?: string;\n\n /**\nAPI key for authenticating requests.\n */\n apiKey?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport function createXai(options: XaiProviderSettings = {}): XaiProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.x.ai/v1',\n );\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'XAI_API_KEY',\n description: 'xAI API key',\n })}`,\n ...options.headers,\n });\n\n const createLanguageModel = (\n modelId: XaiChatModelId,\n settings: XaiChatSettings = {},\n ) => {\n const structuredOutputs = supportsStructuredOutputs(modelId);\n return new OpenAICompatibleChatLanguageModel(modelId, settings, {\n provider: 'xai.chat',\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n defaultObjectGenerationMode: structuredOutputs ? 'json' : 'tool',\n errorStructure: xaiErrorStructure,\n supportsStructuredOutputs: structuredOutputs,\n });\n };\n\n const provider = (modelId: XaiChatModelId, settings?: XaiChatSettings) =>\n createLanguageModel(modelId, settings);\n\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider;\n}\n\nexport const xai = createXai();\n","import { OpenAICompatibleChatSettings } from '@ai-sdk/openai-compatible';\n\n// https://console.x.ai and see \"View models\"\nexport type XaiChatModelId =\n | 'grok-2-1212'\n | 'grok-2-vision-1212'\n | 'grok-beta'\n | 'grok-vision-beta'\n | (string & {});\n\nexport interface XaiChatSettings extends OpenAICompatibleChatSettings {}\n\nexport function supportsStructuredOutputs(modelId: XaiChatModelId) {\n return ['grok-2-1212', 'grok-2-vision-1212'].includes(modelId);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,sBAIO;AACP,+BAAkD;AAClD,4BAIO;;;ACEA,SAAS,0BAA0B,SAAyB;AACjE,SAAO,CAAC,eAAe,oBAAoB,EAAE,SAAS,OAAO;AAC/D;;;ADEA,iBAAkB;AAIlB,IAAM,iBAAiB,aAAE,OAAO;AAAA,EAC9B,MAAM,aAAE,OAAO;AAAA,EACf,OAAO,aAAE,OAAO;AAClB,CAAC;AAID,IAAM,oBAA0D;AAAA,EAC9D,aAAa;AAAA,EACb,gBAAgB,UAAQ,KAAK;AAC/B;AAgDO,SAAS,UAAU,UAA+B,CAAC,GAAgB;AA9E1E;AA+EE,QAAM,cAAU;AAAA,KACd,aAAQ,YAAR,YAAmB;AAAA,EACrB;AACA,QAAM,aAAa,OAAO;AAAA,IACxB,eAAe,cAAU,kCAAW;AAAA,MAClC,QAAQ,QAAQ;AAAA,MAChB,yBAAyB;AAAA,MACzB,aAAa;AAAA,IACf,CAAC,CAAC;AAAA,IACF,GAAG,QAAQ;AAAA,EACb;AAEA,QAAM,sBAAsB,CAC1B,SACA,WAA4B,CAAC,MAC1B;AACH,UAAM,oBAAoB,0BAA0B,OAAO;AAC3D,WAAO,IAAI,2DAAkC,SAAS,UAAU;AAAA,MAC9D,UAAU;AAAA,MACV,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,GAAG,IAAI;AAAA,MACpC,SAAS;AAAA,MACT,OAAO,QAAQ;AAAA,MACf,6BAA6B,oBAAoB,SAAS;AAAA,MAC1D,gBAAgB;AAAA,MAChB,2BAA2B;AAAA,IAC7B,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,CAAC,SAAyB,aACzC,oBAAoB,SAAS,QAAQ;AAEvC,WAAS,gBAAgB;AACzB,WAAS,OAAO;AAChB,WAAS,qBAAqB,CAAC,YAAoB;AACjD,UAAM,IAAI,iCAAiB,EAAE,SAAS,WAAW,qBAAqB,CAAC;AAAA,EACzE;AAEA,SAAO;AACT;AAEO,IAAM,MAAM,UAAU;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/xai-provider.ts","../src/xai-chat-settings.ts","../src/xai-error.ts","../src/xai-image-model.ts"],"sourcesContent":["export { createXai, xai } from './xai-provider';\nexport type { XaiProvider, XaiProviderSettings } from './xai-provider';\nexport type { XaiErrorData } from './xai-error';\n","import {\n ImageModelV1,\n LanguageModelV1,\n NoSuchModelError,\n ProviderV1,\n} from '@ai-sdk/provider';\nimport {\n OpenAICompatibleChatLanguageModel,\n ProviderErrorStructure,\n} from '@ai-sdk/openai-compatible';\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport {\n XaiChatModelId,\n XaiChatSettings,\n supportsStructuredOutputs,\n} from './xai-chat-settings';\nimport { XaiImageSettings } from './xai-image-settings';\nimport { XaiImageModelId } from './xai-image-settings';\nimport { XaiErrorData, xaiErrorSchema } from './xai-error';\nimport { XaiImageModel } from './xai-image-model';\n\nconst xaiErrorStructure: ProviderErrorStructure<XaiErrorData> = {\n errorSchema: xaiErrorSchema,\n errorToMessage: data => data.error,\n};\n\nexport interface XaiProvider extends ProviderV1 {\n /**\nCreates an Xai chat model for text generation.\n */\n (modelId: XaiChatModelId, settings?: XaiChatSettings): LanguageModelV1;\n\n /**\nCreates an Xai language model for text generation.\n */\n languageModel(\n modelId: XaiChatModelId,\n settings?: XaiChatSettings,\n ): LanguageModelV1;\n\n /**\nCreates an Xai chat model for text generation.\n */\n chat: (\n modelId: XaiChatModelId,\n settings?: XaiChatSettings,\n ) => LanguageModelV1;\n\n /**\nCreates an Xai image model for image generation.\n */\n image(modelId: XaiImageModelId, settings?: XaiImageSettings): ImageModelV1;\n\n /**\nCreates an Xai image model for image generation.\n */\n imageModel(\n modelId: XaiImageModelId,\n settings?: XaiImageSettings,\n ): ImageModelV1;\n}\n\nexport interface XaiProviderSettings {\n /**\nBase URL for the xAI API calls.\n */\n baseURL?: string;\n\n /**\nAPI key for authenticating requests.\n */\n apiKey?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport function createXai(options: XaiProviderSettings = {}): XaiProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.x.ai/v1',\n );\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'XAI_API_KEY',\n description: 'xAI API key',\n })}`,\n ...options.headers,\n });\n\n const createLanguageModel = (\n modelId: XaiChatModelId,\n settings: XaiChatSettings = {},\n ) => {\n const structuredOutputs = supportsStructuredOutputs(modelId);\n return new OpenAICompatibleChatLanguageModel(modelId, settings, {\n provider: 'xai.chat',\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n defaultObjectGenerationMode: structuredOutputs ? 'json' : 'tool',\n errorStructure: xaiErrorStructure,\n supportsStructuredOutputs: structuredOutputs,\n });\n };\n\n const createImageModel = (\n modelId: XaiImageModelId,\n settings: XaiImageSettings = {},\n ) => {\n return new XaiImageModel(modelId, settings, {\n provider: 'xai.image',\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n };\n\n const provider = (modelId: XaiChatModelId, settings?: XaiChatSettings) =>\n createLanguageModel(modelId, settings);\n\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n provider.imageModel = createImageModel;\n provider.image = createImageModel;\n\n return provider;\n}\n\nexport const xai = createXai();\n","import { OpenAICompatibleChatSettings } from '@ai-sdk/openai-compatible';\n\n// https://console.x.ai and see \"View models\"\nexport type XaiChatModelId =\n | 'grok-2-1212'\n | 'grok-2-vision-1212'\n | 'grok-beta'\n | 'grok-vision-beta'\n | (string & {});\n\nexport interface XaiChatSettings extends OpenAICompatibleChatSettings {}\n\nexport function supportsStructuredOutputs(modelId: XaiChatModelId) {\n return ['grok-2-1212', 'grok-2-vision-1212'].includes(modelId);\n}\n","import { z } from 'zod';\n\n// Add error schema and structure\nexport const xaiErrorSchema = z.object({\n code: z.string(),\n error: z.string(),\n});\n\nexport type XaiErrorData = z.infer<typeof xaiErrorSchema>;\n","import { ImageModelV1, ImageModelV1CallWarning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n FetchFunction,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\nimport { XaiImageModelId } from './xai-image-settings';\nimport { XaiImageSettings } from './xai-image-settings';\nimport { xaiErrorSchema } from './xai-error';\n\nexport type XaiImageModelConfig = {\n provider: string;\n headers: () => Record<string, string | undefined>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n};\n\nexport class XaiImageModel implements ImageModelV1 {\n readonly specificationVersion = 'v1';\n\n get maxImagesPerCall(): number {\n return this.settings.maxImagesPerCall ?? 10;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: XaiImageModelId,\n private readonly settings: XaiImageSettings,\n private readonly config: XaiImageModelConfig,\n ) {}\n\n async doGenerate({\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n }: Parameters<ImageModelV1['doGenerate']>[0]): Promise<\n Awaited<ReturnType<ImageModelV1['doGenerate']>>\n > {\n const warnings: Array<ImageModelV1CallWarning> = [];\n\n if (aspectRatio != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'aspectRatio',\n details:\n 'This model does not support aspect ratio. Use `size` instead.',\n });\n }\n\n if (seed != null) {\n warnings.push({ type: 'unsupported-setting', setting: 'seed' });\n }\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { value: response, responseHeaders } = await postJsonToApi({\n url: this.config.url({\n path: '/images/generations',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), headers),\n body: {\n model: this.modelId,\n prompt,\n n,\n size,\n ...(providerOptions.openai ?? {}),\n response_format: 'b64_json',\n },\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: xaiErrorSchema,\n errorToMessage: data => data.error,\n }),\n successfulResponseHandler: createJsonResponseHandler(\n openaiCompatibleImageResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n // xAI image generation returns a data URI scheme prefix we must strip.\n images: response.data.map(item => item.b64_json.split(',')[1]),\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n}\n\n// minimal version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst openaiCompatibleImageResponseSchema = z.object({\n data: z.array(z.object({ b64_json: z.string() })),\n});\n"],"mappings":"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","names":["import_provider_utils","import_zod"]}
|
package/dist/index.mjs
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
import {
|
|
3
3
|
NoSuchModelError
|
|
4
4
|
} from "@ai-sdk/provider";
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
OpenAICompatibleChatLanguageModel
|
|
7
|
+
} from "@ai-sdk/openai-compatible";
|
|
6
8
|
import {
|
|
7
9
|
loadApiKey,
|
|
8
10
|
withoutTrailingSlash
|
|
@@ -13,12 +15,99 @@ function supportsStructuredOutputs(modelId) {
|
|
|
13
15
|
return ["grok-2-1212", "grok-2-vision-1212"].includes(modelId);
|
|
14
16
|
}
|
|
15
17
|
|
|
16
|
-
// src/xai-
|
|
18
|
+
// src/xai-error.ts
|
|
17
19
|
import { z } from "zod";
|
|
18
20
|
var xaiErrorSchema = z.object({
|
|
19
21
|
code: z.string(),
|
|
20
22
|
error: z.string()
|
|
21
23
|
});
|
|
24
|
+
|
|
25
|
+
// src/xai-image-model.ts
|
|
26
|
+
import {
|
|
27
|
+
combineHeaders,
|
|
28
|
+
createJsonErrorResponseHandler,
|
|
29
|
+
createJsonResponseHandler,
|
|
30
|
+
postJsonToApi
|
|
31
|
+
} from "@ai-sdk/provider-utils";
|
|
32
|
+
import { z as z2 } from "zod";
|
|
33
|
+
var XaiImageModel = class {
|
|
34
|
+
constructor(modelId, settings, config) {
|
|
35
|
+
this.modelId = modelId;
|
|
36
|
+
this.settings = settings;
|
|
37
|
+
this.config = config;
|
|
38
|
+
this.specificationVersion = "v1";
|
|
39
|
+
}
|
|
40
|
+
get maxImagesPerCall() {
|
|
41
|
+
var _a;
|
|
42
|
+
return (_a = this.settings.maxImagesPerCall) != null ? _a : 10;
|
|
43
|
+
}
|
|
44
|
+
get provider() {
|
|
45
|
+
return this.config.provider;
|
|
46
|
+
}
|
|
47
|
+
async doGenerate({
|
|
48
|
+
prompt,
|
|
49
|
+
n,
|
|
50
|
+
size,
|
|
51
|
+
aspectRatio,
|
|
52
|
+
seed,
|
|
53
|
+
providerOptions,
|
|
54
|
+
headers,
|
|
55
|
+
abortSignal
|
|
56
|
+
}) {
|
|
57
|
+
var _a, _b, _c, _d;
|
|
58
|
+
const warnings = [];
|
|
59
|
+
if (aspectRatio != null) {
|
|
60
|
+
warnings.push({
|
|
61
|
+
type: "unsupported-setting",
|
|
62
|
+
setting: "aspectRatio",
|
|
63
|
+
details: "This model does not support aspect ratio. Use `size` instead."
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (seed != null) {
|
|
67
|
+
warnings.push({ type: "unsupported-setting", setting: "seed" });
|
|
68
|
+
}
|
|
69
|
+
const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
|
|
70
|
+
const { value: response, responseHeaders } = await postJsonToApi({
|
|
71
|
+
url: this.config.url({
|
|
72
|
+
path: "/images/generations",
|
|
73
|
+
modelId: this.modelId
|
|
74
|
+
}),
|
|
75
|
+
headers: combineHeaders(this.config.headers(), headers),
|
|
76
|
+
body: {
|
|
77
|
+
model: this.modelId,
|
|
78
|
+
prompt,
|
|
79
|
+
n,
|
|
80
|
+
size,
|
|
81
|
+
...(_d = providerOptions.openai) != null ? _d : {},
|
|
82
|
+
response_format: "b64_json"
|
|
83
|
+
},
|
|
84
|
+
failedResponseHandler: createJsonErrorResponseHandler({
|
|
85
|
+
errorSchema: xaiErrorSchema,
|
|
86
|
+
errorToMessage: (data) => data.error
|
|
87
|
+
}),
|
|
88
|
+
successfulResponseHandler: createJsonResponseHandler(
|
|
89
|
+
openaiCompatibleImageResponseSchema
|
|
90
|
+
),
|
|
91
|
+
abortSignal,
|
|
92
|
+
fetch: this.config.fetch
|
|
93
|
+
});
|
|
94
|
+
return {
|
|
95
|
+
// xAI image generation returns a data URI scheme prefix we must strip.
|
|
96
|
+
images: response.data.map((item) => item.b64_json.split(",")[1]),
|
|
97
|
+
warnings,
|
|
98
|
+
response: {
|
|
99
|
+
timestamp: currentDate,
|
|
100
|
+
modelId: this.modelId,
|
|
101
|
+
headers: responseHeaders
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
var openaiCompatibleImageResponseSchema = z2.object({
|
|
107
|
+
data: z2.array(z2.object({ b64_json: z2.string() }))
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// src/xai-provider.ts
|
|
22
111
|
var xaiErrorStructure = {
|
|
23
112
|
errorSchema: xaiErrorSchema,
|
|
24
113
|
errorToMessage: (data) => data.error
|
|
@@ -48,12 +137,22 @@ function createXai(options = {}) {
|
|
|
48
137
|
supportsStructuredOutputs: structuredOutputs
|
|
49
138
|
});
|
|
50
139
|
};
|
|
140
|
+
const createImageModel = (modelId, settings = {}) => {
|
|
141
|
+
return new XaiImageModel(modelId, settings, {
|
|
142
|
+
provider: "xai.image",
|
|
143
|
+
url: ({ path }) => `${baseURL}${path}`,
|
|
144
|
+
headers: getHeaders,
|
|
145
|
+
fetch: options.fetch
|
|
146
|
+
});
|
|
147
|
+
};
|
|
51
148
|
const provider = (modelId, settings) => createLanguageModel(modelId, settings);
|
|
52
149
|
provider.languageModel = createLanguageModel;
|
|
53
150
|
provider.chat = createLanguageModel;
|
|
54
151
|
provider.textEmbeddingModel = (modelId) => {
|
|
55
152
|
throw new NoSuchModelError({ modelId, modelType: "textEmbeddingModel" });
|
|
56
153
|
};
|
|
154
|
+
provider.imageModel = createImageModel;
|
|
155
|
+
provider.image = createImageModel;
|
|
57
156
|
return provider;
|
|
58
157
|
}
|
|
59
158
|
var xai = createXai();
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/xai-provider.ts","../src/xai-chat-settings.ts"],"sourcesContent":["import {\n LanguageModelV1,\n NoSuchModelError,\n ProviderV1,\n} from '@ai-sdk/provider';\nimport { OpenAICompatibleChatLanguageModel } from '@ai-sdk/openai-compatible';\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport {\n XaiChatModelId,\n XaiChatSettings,\n supportsStructuredOutputs,\n} from './xai-chat-settings';\nimport { z } from 'zod';\nimport { ProviderErrorStructure } from '@ai-sdk/openai-compatible';\n\n// Add error schema and structure\nconst xaiErrorSchema = z.object({\n code: z.string(),\n error: z.string(),\n});\n\nexport type XaiErrorData = z.infer<typeof xaiErrorSchema>;\n\nconst xaiErrorStructure: ProviderErrorStructure<XaiErrorData> = {\n errorSchema: xaiErrorSchema,\n errorToMessage: data => data.error,\n};\n\nexport interface XaiProvider extends ProviderV1 {\n /**\nCreates an Xai chat model for text generation.\n */\n (modelId: XaiChatModelId, settings?: XaiChatSettings): LanguageModelV1;\n\n /**\nCreates an Xai language model for text generation.\n */\n languageModel(\n modelId: XaiChatModelId,\n settings?: XaiChatSettings,\n ): LanguageModelV1;\n\n /**\nCreates an Xai chat model for text generation.\n */\n chat: (\n modelId: XaiChatModelId,\n settings?: XaiChatSettings,\n ) => LanguageModelV1;\n}\n\nexport interface XaiProviderSettings {\n /**\nBase URL for the xAI API calls.\n */\n baseURL?: string;\n\n /**\nAPI key for authenticating requests.\n */\n apiKey?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport function createXai(options: XaiProviderSettings = {}): XaiProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.x.ai/v1',\n );\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'XAI_API_KEY',\n description: 'xAI API key',\n })}`,\n ...options.headers,\n });\n\n const createLanguageModel = (\n modelId: XaiChatModelId,\n settings: XaiChatSettings = {},\n ) => {\n const structuredOutputs = supportsStructuredOutputs(modelId);\n return new OpenAICompatibleChatLanguageModel(modelId, settings, {\n provider: 'xai.chat',\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n defaultObjectGenerationMode: structuredOutputs ? 'json' : 'tool',\n errorStructure: xaiErrorStructure,\n supportsStructuredOutputs: structuredOutputs,\n });\n };\n\n const provider = (modelId: XaiChatModelId, settings?: XaiChatSettings) =>\n createLanguageModel(modelId, settings);\n\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n\n return provider;\n}\n\nexport const xai = createXai();\n","import { OpenAICompatibleChatSettings } from '@ai-sdk/openai-compatible';\n\n// https://console.x.ai and see \"View models\"\nexport type XaiChatModelId =\n | 'grok-2-1212'\n | 'grok-2-vision-1212'\n | 'grok-beta'\n | 'grok-vision-beta'\n | (string & {});\n\nexport interface XaiChatSettings extends OpenAICompatibleChatSettings {}\n\nexport function supportsStructuredOutputs(modelId: XaiChatModelId) {\n return ['grok-2-1212', 'grok-2-vision-1212'].includes(modelId);\n}\n"],"mappings":";AAAA;AAAA,EAEE;AAAA,OAEK;AACP,SAAS,yCAAyC;AAClD;AAAA,EAEE;AAAA,EACA;AAAA,OACK;;;ACEA,SAAS,0BAA0B,SAAyB;AACjE,SAAO,CAAC,eAAe,oBAAoB,EAAE,SAAS,OAAO;AAC/D;;;ADEA,SAAS,SAAS;AAIlB,IAAM,iBAAiB,EAAE,OAAO;AAAA,EAC9B,MAAM,EAAE,OAAO;AAAA,EACf,OAAO,EAAE,OAAO;AAClB,CAAC;AAID,IAAM,oBAA0D;AAAA,EAC9D,aAAa;AAAA,EACb,gBAAgB,UAAQ,KAAK;AAC/B;AAgDO,SAAS,UAAU,UAA+B,CAAC,GAAgB;AA9E1E;AA+EE,QAAM,UAAU;AAAA,KACd,aAAQ,YAAR,YAAmB;AAAA,EACrB;AACA,QAAM,aAAa,OAAO;AAAA,IACxB,eAAe,UAAU,WAAW;AAAA,MAClC,QAAQ,QAAQ;AAAA,MAChB,yBAAyB;AAAA,MACzB,aAAa;AAAA,IACf,CAAC,CAAC;AAAA,IACF,GAAG,QAAQ;AAAA,EACb;AAEA,QAAM,sBAAsB,CAC1B,SACA,WAA4B,CAAC,MAC1B;AACH,UAAM,oBAAoB,0BAA0B,OAAO;AAC3D,WAAO,IAAI,kCAAkC,SAAS,UAAU;AAAA,MAC9D,UAAU;AAAA,MACV,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,GAAG,IAAI;AAAA,MACpC,SAAS;AAAA,MACT,OAAO,QAAQ;AAAA,MACf,6BAA6B,oBAAoB,SAAS;AAAA,MAC1D,gBAAgB;AAAA,MAChB,2BAA2B;AAAA,IAC7B,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,CAAC,SAAyB,aACzC,oBAAoB,SAAS,QAAQ;AAEvC,WAAS,gBAAgB;AACzB,WAAS,OAAO;AAChB,WAAS,qBAAqB,CAAC,YAAoB;AACjD,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,qBAAqB,CAAC;AAAA,EACzE;AAEA,SAAO;AACT;AAEO,IAAM,MAAM,UAAU;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/xai-provider.ts","../src/xai-chat-settings.ts","../src/xai-error.ts","../src/xai-image-model.ts"],"sourcesContent":["import {\n ImageModelV1,\n LanguageModelV1,\n NoSuchModelError,\n ProviderV1,\n} from '@ai-sdk/provider';\nimport {\n OpenAICompatibleChatLanguageModel,\n ProviderErrorStructure,\n} from '@ai-sdk/openai-compatible';\nimport {\n FetchFunction,\n loadApiKey,\n withoutTrailingSlash,\n} from '@ai-sdk/provider-utils';\nimport {\n XaiChatModelId,\n XaiChatSettings,\n supportsStructuredOutputs,\n} from './xai-chat-settings';\nimport { XaiImageSettings } from './xai-image-settings';\nimport { XaiImageModelId } from './xai-image-settings';\nimport { XaiErrorData, xaiErrorSchema } from './xai-error';\nimport { XaiImageModel } from './xai-image-model';\n\nconst xaiErrorStructure: ProviderErrorStructure<XaiErrorData> = {\n errorSchema: xaiErrorSchema,\n errorToMessage: data => data.error,\n};\n\nexport interface XaiProvider extends ProviderV1 {\n /**\nCreates an Xai chat model for text generation.\n */\n (modelId: XaiChatModelId, settings?: XaiChatSettings): LanguageModelV1;\n\n /**\nCreates an Xai language model for text generation.\n */\n languageModel(\n modelId: XaiChatModelId,\n settings?: XaiChatSettings,\n ): LanguageModelV1;\n\n /**\nCreates an Xai chat model for text generation.\n */\n chat: (\n modelId: XaiChatModelId,\n settings?: XaiChatSettings,\n ) => LanguageModelV1;\n\n /**\nCreates an Xai image model for image generation.\n */\n image(modelId: XaiImageModelId, settings?: XaiImageSettings): ImageModelV1;\n\n /**\nCreates an Xai image model for image generation.\n */\n imageModel(\n modelId: XaiImageModelId,\n settings?: XaiImageSettings,\n ): ImageModelV1;\n}\n\nexport interface XaiProviderSettings {\n /**\nBase URL for the xAI API calls.\n */\n baseURL?: string;\n\n /**\nAPI key for authenticating requests.\n */\n apiKey?: string;\n\n /**\nCustom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport function createXai(options: XaiProviderSettings = {}): XaiProvider {\n const baseURL = withoutTrailingSlash(\n options.baseURL ?? 'https://api.x.ai/v1',\n );\n const getHeaders = () => ({\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'XAI_API_KEY',\n description: 'xAI API key',\n })}`,\n ...options.headers,\n });\n\n const createLanguageModel = (\n modelId: XaiChatModelId,\n settings: XaiChatSettings = {},\n ) => {\n const structuredOutputs = supportsStructuredOutputs(modelId);\n return new OpenAICompatibleChatLanguageModel(modelId, settings, {\n provider: 'xai.chat',\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n defaultObjectGenerationMode: structuredOutputs ? 'json' : 'tool',\n errorStructure: xaiErrorStructure,\n supportsStructuredOutputs: structuredOutputs,\n });\n };\n\n const createImageModel = (\n modelId: XaiImageModelId,\n settings: XaiImageSettings = {},\n ) => {\n return new XaiImageModel(modelId, settings, {\n provider: 'xai.image',\n url: ({ path }) => `${baseURL}${path}`,\n headers: getHeaders,\n fetch: options.fetch,\n });\n };\n\n const provider = (modelId: XaiChatModelId, settings?: XaiChatSettings) =>\n createLanguageModel(modelId, settings);\n\n provider.languageModel = createLanguageModel;\n provider.chat = createLanguageModel;\n provider.textEmbeddingModel = (modelId: string) => {\n throw new NoSuchModelError({ modelId, modelType: 'textEmbeddingModel' });\n };\n provider.imageModel = createImageModel;\n provider.image = createImageModel;\n\n return provider;\n}\n\nexport const xai = createXai();\n","import { OpenAICompatibleChatSettings } from '@ai-sdk/openai-compatible';\n\n// https://console.x.ai and see \"View models\"\nexport type XaiChatModelId =\n | 'grok-2-1212'\n | 'grok-2-vision-1212'\n | 'grok-beta'\n | 'grok-vision-beta'\n | (string & {});\n\nexport interface XaiChatSettings extends OpenAICompatibleChatSettings {}\n\nexport function supportsStructuredOutputs(modelId: XaiChatModelId) {\n return ['grok-2-1212', 'grok-2-vision-1212'].includes(modelId);\n}\n","import { z } from 'zod';\n\n// Add error schema and structure\nexport const xaiErrorSchema = z.object({\n code: z.string(),\n error: z.string(),\n});\n\nexport type XaiErrorData = z.infer<typeof xaiErrorSchema>;\n","import { ImageModelV1, ImageModelV1CallWarning } from '@ai-sdk/provider';\nimport {\n combineHeaders,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n FetchFunction,\n postJsonToApi,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod';\nimport { XaiImageModelId } from './xai-image-settings';\nimport { XaiImageSettings } from './xai-image-settings';\nimport { xaiErrorSchema } from './xai-error';\n\nexport type XaiImageModelConfig = {\n provider: string;\n headers: () => Record<string, string | undefined>;\n url: (options: { modelId: string; path: string }) => string;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n};\n\nexport class XaiImageModel implements ImageModelV1 {\n readonly specificationVersion = 'v1';\n\n get maxImagesPerCall(): number {\n return this.settings.maxImagesPerCall ?? 10;\n }\n\n get provider(): string {\n return this.config.provider;\n }\n\n constructor(\n readonly modelId: XaiImageModelId,\n private readonly settings: XaiImageSettings,\n private readonly config: XaiImageModelConfig,\n ) {}\n\n async doGenerate({\n prompt,\n n,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n }: Parameters<ImageModelV1['doGenerate']>[0]): Promise<\n Awaited<ReturnType<ImageModelV1['doGenerate']>>\n > {\n const warnings: Array<ImageModelV1CallWarning> = [];\n\n if (aspectRatio != null) {\n warnings.push({\n type: 'unsupported-setting',\n setting: 'aspectRatio',\n details:\n 'This model does not support aspect ratio. Use `size` instead.',\n });\n }\n\n if (seed != null) {\n warnings.push({ type: 'unsupported-setting', setting: 'seed' });\n }\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const { value: response, responseHeaders } = await postJsonToApi({\n url: this.config.url({\n path: '/images/generations',\n modelId: this.modelId,\n }),\n headers: combineHeaders(this.config.headers(), headers),\n body: {\n model: this.modelId,\n prompt,\n n,\n size,\n ...(providerOptions.openai ?? {}),\n response_format: 'b64_json',\n },\n failedResponseHandler: createJsonErrorResponseHandler({\n errorSchema: xaiErrorSchema,\n errorToMessage: data => data.error,\n }),\n successfulResponseHandler: createJsonResponseHandler(\n openaiCompatibleImageResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n return {\n // xAI image generation returns a data URI scheme prefix we must strip.\n images: response.data.map(item => item.b64_json.split(',')[1]),\n warnings,\n response: {\n timestamp: currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n };\n }\n}\n\n// minimal version of the schema, focussed on what is needed for the implementation\n// this approach limits breakages when the API changes and increases efficiency\nconst openaiCompatibleImageResponseSchema = z.object({\n data: z.array(z.object({ b64_json: z.string() })),\n});\n"],"mappings":";AAAA;AAAA,EAGE;AAAA,OAEK;AACP;AAAA,EACE;AAAA,OAEK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,OACK;;;ACFA,SAAS,0BAA0B,SAAyB;AACjE,SAAO,CAAC,eAAe,oBAAoB,EAAE,SAAS,OAAO;AAC/D;;;ACdA,SAAS,SAAS;AAGX,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,MAAM,EAAE,OAAO;AAAA,EACf,OAAO,EAAE,OAAO;AAClB,CAAC;;;ACLD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AACP,SAAS,KAAAA,UAAS;AAeX,IAAM,gBAAN,MAA4C;AAAA,EAWjD,YACW,SACQ,UACA,QACjB;AAHS;AACQ;AACA;AAbnB,SAAS,uBAAuB;AAAA,EAc7B;AAAA,EAZH,IAAI,mBAA2B;AA1BjC;AA2BI,YAAO,UAAK,SAAS,qBAAd,YAAkC;AAAA,EAC3C;AAAA,EAEA,IAAI,WAAmB;AACrB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAQA,MAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAEE;AAnDJ;AAoDI,UAAM,WAA2C,CAAC;AAElD,QAAI,eAAe,MAAM;AACvB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,QAAI,QAAQ,MAAM;AAChB,eAAS,KAAK,EAAE,MAAM,uBAAuB,SAAS,OAAO,CAAC;AAAA,IAChE;AAEA,UAAM,eAAc,sBAAK,OAAO,cAAZ,mBAAuB,gBAAvB,4CAA0C,oBAAI,KAAK;AACvE,UAAM,EAAE,OAAO,UAAU,gBAAgB,IAAI,MAAM,cAAc;AAAA,MAC/D,KAAK,KAAK,OAAO,IAAI;AAAA,QACnB,MAAM;AAAA,QACN,SAAS,KAAK;AAAA,MAChB,CAAC;AAAA,MACD,SAAS,eAAe,KAAK,OAAO,QAAQ,GAAG,OAAO;AAAA,MACtD,MAAM;AAAA,QACJ,OAAO,KAAK;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,qBAAgB,WAAhB,YAA0B,CAAC;AAAA,QAC/B,iBAAiB;AAAA,MACnB;AAAA,MACA,uBAAuB,+BAA+B;AAAA,QACpD,aAAa;AAAA,QACb,gBAAgB,UAAQ,KAAK;AAAA,MAC/B,CAAC;AAAA,MACD,2BAA2B;AAAA,QACzB;AAAA,MACF;AAAA,MACA;AAAA,MACA,OAAO,KAAK,OAAO;AAAA,IACrB,CAAC;AAED,WAAO;AAAA;AAAA,MAEL,QAAQ,SAAS,KAAK,IAAI,UAAQ,KAAK,SAAS,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,MAC7D;AAAA,MACA,UAAU;AAAA,QACR,WAAW;AAAA,QACX,SAAS,KAAK;AAAA,QACd,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;AAIA,IAAM,sCAAsCC,GAAE,OAAO;AAAA,EACnD,MAAMA,GAAE,MAAMA,GAAE,OAAO,EAAE,UAAUA,GAAE,OAAO,EAAE,CAAC,CAAC;AAClD,CAAC;;;AHrFD,IAAM,oBAA0D;AAAA,EAC9D,aAAa;AAAA,EACb,gBAAgB,UAAQ,KAAK;AAC/B;AA6DO,SAAS,UAAU,UAA+B,CAAC,GAAgB;AAzF1E;AA0FE,QAAM,UAAU;AAAA,KACd,aAAQ,YAAR,YAAmB;AAAA,EACrB;AACA,QAAM,aAAa,OAAO;AAAA,IACxB,eAAe,UAAU,WAAW;AAAA,MAClC,QAAQ,QAAQ;AAAA,MAChB,yBAAyB;AAAA,MACzB,aAAa;AAAA,IACf,CAAC,CAAC;AAAA,IACF,GAAG,QAAQ;AAAA,EACb;AAEA,QAAM,sBAAsB,CAC1B,SACA,WAA4B,CAAC,MAC1B;AACH,UAAM,oBAAoB,0BAA0B,OAAO;AAC3D,WAAO,IAAI,kCAAkC,SAAS,UAAU;AAAA,MAC9D,UAAU;AAAA,MACV,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,GAAG,IAAI;AAAA,MACpC,SAAS;AAAA,MACT,OAAO,QAAQ;AAAA,MACf,6BAA6B,oBAAoB,SAAS;AAAA,MAC1D,gBAAgB;AAAA,MAChB,2BAA2B;AAAA,IAC7B,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmB,CACvB,SACA,WAA6B,CAAC,MAC3B;AACH,WAAO,IAAI,cAAc,SAAS,UAAU;AAAA,MAC1C,UAAU;AAAA,MACV,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,OAAO,GAAG,IAAI;AAAA,MACpC,SAAS;AAAA,MACT,OAAO,QAAQ;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,CAAC,SAAyB,aACzC,oBAAoB,SAAS,QAAQ;AAEvC,WAAS,gBAAgB;AACzB,WAAS,OAAO;AAChB,WAAS,qBAAqB,CAAC,YAAoB;AACjD,UAAM,IAAI,iBAAiB,EAAE,SAAS,WAAW,qBAAqB,CAAC;AAAA,EACzE;AACA,WAAS,aAAa;AACtB,WAAS,QAAQ;AAEjB,SAAO;AACT;AAEO,IAAM,MAAM,UAAU;","names":["z","z"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/xai",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -19,12 +19,12 @@
|
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@ai-sdk/openai-compatible": "0.
|
|
23
|
-
"@ai-sdk/provider": "1.0
|
|
24
|
-
"@ai-sdk/provider-utils": "2.
|
|
22
|
+
"@ai-sdk/openai-compatible": "0.2.0",
|
|
23
|
+
"@ai-sdk/provider": "1.1.0",
|
|
24
|
+
"@ai-sdk/provider-utils": "2.2.0"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@types/node": "
|
|
27
|
+
"@types/node": "20.17.24",
|
|
28
28
|
"tsup": "^8",
|
|
29
29
|
"typescript": "5.6.3",
|
|
30
30
|
"zod": "3.23.8",
|