@ai-sdk/quiverai 2.0.41 → 2.0.43

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 CHANGED
@@ -1,5 +1,30 @@
1
1
  # @ai-sdk/quiverai
2
2
 
3
+ ## 2.0.43
4
+
5
+ ### Patch Changes
6
+
7
+ - 89febde: Add Arrow 2 and Arrow 2 Telos model IDs, reasoning effort and SVG viewBox options, and fixed-credit billing metadata. Respect Arrow 2 output-token limits, stop applying legacy reference limits to newer models, and omit the unsupported vectorization output count with guidance for splitting multiple vectorizations into separate calls.
8
+ - Updated dependencies [215b25e]
9
+ - Updated dependencies [d4d96bf]
10
+ - Updated dependencies [a7dd893]
11
+ - Updated dependencies [3456e2c]
12
+ - Updated dependencies [c4e76de]
13
+ - @ai-sdk/provider-utils@5.0.43
14
+ - @ai-sdk/provider@4.0.17
15
+
16
+ ## 2.0.42
17
+
18
+ ### Patch Changes
19
+
20
+ - Updated dependencies [91c2128]
21
+ - Updated dependencies [2cd80b3]
22
+ - Updated dependencies [d06bb2a]
23
+ - Updated dependencies [123d71f]
24
+ - Updated dependencies [2fa5e0e]
25
+ - @ai-sdk/provider-utils@5.0.42
26
+ - @ai-sdk/provider@4.0.16
27
+
3
28
  ## 2.0.41
4
29
 
5
30
  ### Patch Changes
package/README.md CHANGED
@@ -36,7 +36,7 @@ import { generateImage } from 'ai';
36
36
  import fs from 'fs';
37
37
 
38
38
  const { image } = await generateImage({
39
- model: quiverai.image('arrow-1.1'),
39
+ model: quiverai.image('arrow-2'),
40
40
  prompt: 'A logo for the next AI Design startup',
41
41
  });
42
42
 
package/dist/index.d.ts CHANGED
@@ -7,7 +7,7 @@ import { FetchFunction, InferSchema } from '@ai-sdk/provider-utils';
7
7
  *
8
8
  * @see https://quiver.ai/
9
9
  */
10
- type QuiverAIImageModelId = 'arrow-1' | 'arrow-1.1' | 'arrow-1.1-max' | (string & {});
10
+ type QuiverAIImageModelId = 'arrow-1' | 'arrow-1.1' | 'arrow-1.1-max' | 'arrow-2' | 'arrow-2-telos' | (string & {});
11
11
 
12
12
  interface QuiverAIProviderSettings {
13
13
  /**
@@ -55,6 +55,15 @@ declare const quiverai: QuiverAIProvider;
55
55
  declare const quiveraiImageModelOptionsSchema: _ai_sdk_provider_utils.LazySchema<{
56
56
  operation?: "generate" | "vectorize" | undefined;
57
57
  instructions?: string | undefined;
58
+ reasoningEffort?: "low" | "medium" | "high" | "xhigh" | undefined;
59
+ attributes?: {
60
+ viewBox?: {
61
+ minX: number;
62
+ minY: number;
63
+ width: number;
64
+ height: number;
65
+ } | undefined;
66
+ } | undefined;
58
67
  temperature?: number | undefined;
59
68
  topP?: number | undefined;
60
69
  presencePenalty?: number | null | undefined;
package/dist/index.js CHANGED
@@ -47,6 +47,21 @@ var quiveraiImageModelOptionsSchema = lazySchema(
47
47
  * Extra style guidance for prompt-based generation.
48
48
  */
49
49
  instructions: z.string().min(1).optional(),
50
+ /**
51
+ * Reasoning effort applied to generation or vectorization.
52
+ */
53
+ reasoningEffort: z.enum(["low", "medium", "high", "xhigh"]).optional(),
54
+ /**
55
+ * SVG root attributes requested for generation or vectorization.
56
+ */
57
+ attributes: z.object({
58
+ viewBox: z.object({
59
+ minX: z.number(),
60
+ minY: z.number(),
61
+ width: z.number().positive(),
62
+ height: z.number().positive()
63
+ }).optional()
64
+ }).optional(),
50
65
  /**
51
66
  * Sampling temperature (0-2).
52
67
  */
@@ -60,7 +75,8 @@ var quiveraiImageModelOptionsSchema = lazySchema(
60
75
  */
61
76
  presencePenalty: z.number().min(-2).max(2).nullable().optional(),
62
77
  /**
63
- * Maximum number of output tokens (1 - 131072).
78
+ * Maximum number of output tokens (1 - 65536 for Arrow 2 models).
79
+ * The legacy upper bound of 131072 is retained for other model IDs.
64
80
  */
65
81
  maxOutputTokens: z.number().int().min(1).max(131072).optional(),
66
82
  /**
@@ -145,6 +161,7 @@ var QuiverAIImageModel = class _QuiverAIImageModel {
145
161
  warnings,
146
162
  providerMetadata: {
147
163
  quiverai: {
164
+ ...response.credits != null && { credits: response.credits },
148
165
  images: response.data.map((image, index) => ({
149
166
  index,
150
167
  mimeType: image.mime_type
@@ -170,7 +187,7 @@ function getOperationPath(operation) {
170
187
  return operation === "generate" ? "/svgs/generations" : "/svgs/vectorizations";
171
188
  }
172
189
  function getGenerateReferenceLimit(modelId) {
173
- return modelId === "arrow-1.1-max" ? 16 : 4;
190
+ return ["arrow-1", "arrow-1.0", "arrow-1.1"].includes(modelId) ? 4 : 16;
174
191
  }
175
192
  function toQuiverAIImageReference(image) {
176
193
  if (image.type === "url") {
@@ -188,11 +205,19 @@ function buildRequestBody({
188
205
  operation,
189
206
  options
190
207
  }) {
208
+ if ((modelId === "arrow-2" || modelId === "arrow-2-telos") && options.maxOutputTokens != null && options.maxOutputTokens > 65536) {
209
+ throw new InvalidArgumentError({
210
+ argument: "maxOutputTokens",
211
+ message: `QuiverAI model "${modelId}" supports at most 65536 output tokens.`
212
+ });
213
+ }
191
214
  const sharedOptions = {
192
215
  temperature: options.temperature,
193
216
  top_p: options.topP,
194
217
  presence_penalty: options.presencePenalty,
195
218
  max_output_tokens: options.maxOutputTokens,
219
+ reasoning_effort: options.reasoningEffort,
220
+ attributes: options.attributes,
196
221
  stream: false
197
222
  };
198
223
  if (operation === "generate") {
@@ -231,9 +256,14 @@ function buildRequestBody({
231
256
  message: "QuiverAI vectorize accepts a single input image."
232
257
  });
233
258
  }
259
+ if (n !== 1) {
260
+ throw new InvalidArgumentError({
261
+ argument: "n",
262
+ message: "QuiverAI vectorize returns one SVG per request. Set maxImagesPerCall to 1 in generateImage to vectorize multiple times."
263
+ });
264
+ }
234
265
  return {
235
266
  model: modelId,
236
- n,
237
267
  image: toQuiverAIImageReference(files[0]),
238
268
  ...sharedOptions,
239
269
  auto_crop: options.autoCrop,
@@ -290,7 +320,8 @@ var svgGenerationResponseSchema = z2.object({
290
320
  id: z2.string().min(1),
291
321
  created: z2.number().int().nonnegative(),
292
322
  data: z2.array(svgDocumentSchema).min(1),
293
- usage: svgUsageSchema.nullish()
323
+ usage: svgUsageSchema.nullish(),
324
+ credits: z2.number().int().nonnegative().nullish()
294
325
  });
295
326
  var quiveraiErrorSchema = z2.object({
296
327
  status: z2.number().int(),
@@ -305,7 +336,7 @@ var quiveraiFailedResponseHandler = createJsonErrorResponseHandler({
305
336
  });
306
337
 
307
338
  // src/version.ts
308
- var VERSION = true ? "2.0.41" : "0.0.0-test";
339
+ var VERSION = true ? "2.0.43" : "0.0.0-test";
309
340
 
310
341
  // src/quiverai-provider.ts
311
342
  var defaultBaseURL = "https://api.quiver.ai/v1";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/quiverai-provider.ts","../src/quiverai-image-model.ts","../src/quiverai-image-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type ImageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n loadOptionalSetting,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { QuiverAIImageModel } from './quiverai-image-model';\nimport type { QuiverAIImageModelId } from './quiverai-image-settings';\nimport { VERSION } from './version';\n\nexport interface QuiverAIProviderSettings {\n /**\n * QuiverAI API key. Default value is taken from the `QUIVERAI_API_KEY`\n * environment variable.\n */\n apiKey?: string;\n\n /**\n * Base URL for the API calls. Defaults to `https://api.quiver.ai/v1` and\n * falls back to the `QUIVERAI_BASE_URL` environment variable.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept\n * requests, or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface QuiverAIProvider extends ProviderV4 {\n /**\n * Creates a model for image generation.\n */\n image(modelId: QuiverAIImageModelId): ImageModelV4;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: QuiverAIImageModelId): ImageModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nconst defaultBaseURL = 'https://api.quiver.ai/v1';\n\nexport function createQuiverAI(\n options: QuiverAIProviderSettings = {},\n): QuiverAIProvider {\n const baseURL =\n withoutTrailingSlash(\n loadOptionalSetting({\n settingValue: options.baseURL,\n environmentVariableName: 'QUIVERAI_BASE_URL',\n }),\n ) ?? defaultBaseURL;\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'QUIVERAI_API_KEY',\n description: 'QuiverAI',\n })}`,\n ...options.headers,\n },\n `ai-sdk/quiverai/${VERSION}`,\n );\n\n const createImageModel = (modelId: QuiverAIImageModelId) =>\n new QuiverAIImageModel(modelId, {\n provider: 'quiverai.image',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n });\n };\n\n return {\n specificationVersion: 'v4',\n image: createImageModel,\n imageModel: createImageModel,\n languageModel: (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'languageModel',\n });\n },\n embeddingModel,\n textEmbeddingModel: embeddingModel,\n };\n}\n\nexport const quiverai = createQuiverAI();\n","import {\n InvalidArgumentError,\n type ImageModelV4,\n type ImageModelV4CallOptions,\n type ImageModelV4File,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertUint8ArrayToBase64,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_DESERIALIZE,\n WORKFLOW_SERIALIZE,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n quiveraiImageModelOptionsSchema,\n type QuiverAIImageModelOptions,\n} from './quiverai-image-model-options';\nimport type {\n QuiverAIImageModelId,\n QuiverAIOperation,\n} from './quiverai-image-settings';\n\ninterface QuiverAIImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: () => Record<string, string>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class QuiverAIImageModel implements ImageModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxImagesPerCall = 16;\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: QuiverAIImageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: QuiverAIImageModelId;\n config: QuiverAIImageModelConfig;\n }) {\n return new QuiverAIImageModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: QuiverAIImageModelId,\n private readonly config: QuiverAIImageModelConfig,\n ) {}\n\n async doGenerate({\n prompt,\n n,\n files,\n mask,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n }: ImageModelV4CallOptions): Promise<\n Awaited<ReturnType<ImageModelV4['doGenerate']>>\n > {\n const quiveraiOptions = await parseProviderOptions({\n provider: 'quiverai',\n providerOptions,\n schema: quiveraiImageModelOptionsSchema,\n });\n\n const operation: QuiverAIOperation =\n quiveraiOptions?.operation ?? 'generate';\n\n const warnings = collectWarnings({ size, aspectRatio, seed, mask });\n\n const body = buildRequestBody({\n modelId: this.modelId,\n n,\n prompt,\n files,\n operation,\n options: quiveraiOptions ?? {},\n });\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const combinedHeaders = combineHeaders(this.config.headers?.(), headers);\n\n const { value: response, responseHeaders } = await postJsonToApi({\n url: `${this.config.baseURL}${getOperationPath(operation)}`,\n headers: combinedHeaders,\n body,\n failedResponseHandler: quiveraiFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n svgGenerationResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n const encoder = new TextEncoder();\n const images = response.data.map(image => encoder.encode(image.svg));\n\n return {\n images,\n warnings,\n providerMetadata: {\n quiverai: {\n images: response.data.map((image, index) => ({\n index,\n mimeType: image.mime_type,\n })),\n },\n },\n response: {\n timestamp: response.created\n ? new Date(response.created * 1000)\n : currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n ...(response.usage && {\n usage: {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n totalTokens: response.usage.total_tokens,\n },\n }),\n };\n }\n}\n\nfunction getOperationPath(operation: QuiverAIOperation) {\n return operation === 'generate'\n ? '/svgs/generations'\n : '/svgs/vectorizations';\n}\n\nfunction getGenerateReferenceLimit(modelId: string) {\n return modelId === 'arrow-1.1-max' ? 16 : 4;\n}\n\nfunction toQuiverAIImageReference(image: ImageModelV4File) {\n if (image.type === 'url') {\n return { url: image.url };\n }\n return {\n base64:\n typeof image.data === 'string'\n ? image.data\n : convertUint8ArrayToBase64(image.data),\n };\n}\n\nfunction buildRequestBody({\n modelId,\n n,\n prompt,\n files,\n operation,\n options,\n}: {\n modelId: string;\n n: number;\n prompt: string | undefined;\n files: ImageModelV4File[] | undefined;\n operation: QuiverAIOperation;\n options: QuiverAIImageModelOptions;\n}) {\n const sharedOptions = {\n temperature: options.temperature,\n top_p: options.topP,\n presence_penalty: options.presencePenalty,\n max_output_tokens: options.maxOutputTokens,\n stream: false as const,\n };\n\n if (operation === 'generate') {\n if (prompt == null || prompt.trim().length === 0) {\n throw new InvalidArgumentError({\n argument: 'prompt',\n message:\n 'QuiverAI image generation requires a non-empty prompt for generateImage.',\n });\n }\n\n const references = files?.map(toQuiverAIImageReference);\n const maxReferences = getGenerateReferenceLimit(modelId);\n\n if (references != null && references.length > maxReferences) {\n throw new InvalidArgumentError({\n argument: 'files',\n message: `QuiverAI generate supports up to ${maxReferences} reference images for model \"${modelId}\".`,\n });\n }\n\n return {\n model: modelId,\n n,\n prompt,\n ...sharedOptions,\n instructions: options.instructions,\n references,\n };\n }\n\n if (files == null || files.length === 0) {\n throw new InvalidArgumentError({\n argument: 'files',\n message:\n 'QuiverAI vectorize requires an input image. Pass an image in the generateImage prompt and set providerOptions.quiverai.operation to \"vectorize\".',\n });\n }\n\n if (files.length > 1) {\n throw new InvalidArgumentError({\n argument: 'files',\n message: 'QuiverAI vectorize accepts a single input image.',\n });\n }\n\n return {\n model: modelId,\n n,\n image: toQuiverAIImageReference(files[0]),\n ...sharedOptions,\n auto_crop: options.autoCrop,\n target_size: options.targetSize,\n };\n}\n\nfunction collectWarnings({\n size,\n aspectRatio,\n seed,\n mask,\n}: {\n size: `${number}x${number}` | undefined;\n aspectRatio: `${number}:${number}` | undefined;\n seed: number | undefined;\n mask: ImageModelV4File | undefined;\n}): SharedV4Warning[] {\n const warnings: SharedV4Warning[] = [];\n\n if (size != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'size',\n details:\n 'QuiverAI SVG generation does not support the `size` option. The setting was ignored.',\n });\n }\n\n if (aspectRatio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'QuiverAI SVG generation does not support the `aspectRatio` option. The setting was ignored.',\n });\n }\n\n if (seed != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details:\n 'QuiverAI SVG generation does not support the `seed` option. The setting was ignored.',\n });\n }\n\n if (mask != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'mask',\n details:\n 'QuiverAI SVG generation does not support masks. The mask was ignored.',\n });\n }\n\n return warnings;\n}\n\n// Limited schemas focused on what is needed for the implementation.\n// This approach limits breakages when the API changes and keeps the\n// response handler efficient.\nconst svgUsageSchema = z.object({\n total_tokens: z.number().int().nonnegative(),\n input_tokens: z.number().int().nonnegative(),\n output_tokens: z.number().int().nonnegative(),\n});\n\nconst svgDocumentSchema = z.object({\n svg: z.string().min(1),\n mime_type: z.literal('image/svg+xml'),\n});\n\nconst svgGenerationResponseSchema = z.object({\n id: z.string().min(1),\n created: z.number().int().nonnegative(),\n data: z.array(svgDocumentSchema).min(1),\n usage: svgUsageSchema.nullish(),\n});\n\nconst quiveraiErrorSchema = z.object({\n status: z.number().int(),\n code: z.string().min(1),\n message: z.string().min(1),\n request_id: z.string().min(1),\n});\n\nexport const quiveraiFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: quiveraiErrorSchema,\n errorToMessage: error => error.message,\n isRetryable: response => response.status === 429 || response.status >= 500,\n});\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * Provider options schema for QuiverAI image generation.\n *\n * @see https://quiver.ai/\n */\nexport const quiveraiImageModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.object({\n /**\n * The operation to perform. Defaults to `generate`.\n *\n * - `generate`: Text-to-SVG generation. Requires `prompt`.\n * - `vectorize`: Convert an input raster image into an SVG. Requires a\n * single image in `prompt.images` / `files`.\n */\n operation: z.enum(['generate', 'vectorize']).optional(),\n\n /**\n * Extra style guidance for prompt-based generation.\n */\n instructions: z.string().min(1).optional(),\n\n /**\n * Sampling temperature (0-2).\n */\n temperature: z.number().min(0).max(2).optional(),\n\n /**\n * Nucleus sampling top-p (0-1).\n */\n topP: z.number().min(0).max(1).optional(),\n\n /**\n * Presence penalty (-2 to 2).\n */\n presencePenalty: z.number().min(-2).max(2).nullable().optional(),\n\n /**\n * Maximum number of output tokens (1 - 131072).\n */\n maxOutputTokens: z.number().int().min(1).max(131072).optional(),\n\n /**\n * Whether to auto-crop the input image before vectorization.\n * Only used when `operation` is `vectorize`.\n */\n autoCrop: z.boolean().optional(),\n\n /**\n * Target canvas size in pixels for vectorization (128 - 4096).\n * Only used when `operation` is `vectorize`.\n */\n targetSize: z.number().int().min(128).max(4096).optional(),\n }),\n ),\n);\n\nexport type QuiverAIImageModelOptions = InferSchema<\n typeof quiveraiImageModelOptionsSchema\n>;\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","z"]}
1
+ {"version":3,"sources":["../src/quiverai-provider.ts","../src/quiverai-image-model.ts","../src/quiverai-image-model-options.ts","../src/version.ts"],"sourcesContent":["import {\n NoSuchModelError,\n type ImageModelV4,\n type ProviderV4,\n} from '@ai-sdk/provider';\nimport {\n loadApiKey,\n loadOptionalSetting,\n withoutTrailingSlash,\n withUserAgentSuffix,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { QuiverAIImageModel } from './quiverai-image-model';\nimport type { QuiverAIImageModelId } from './quiverai-image-settings';\nimport { VERSION } from './version';\n\nexport interface QuiverAIProviderSettings {\n /**\n * QuiverAI API key. Default value is taken from the `QUIVERAI_API_KEY`\n * environment variable.\n */\n apiKey?: string;\n\n /**\n * Base URL for the API calls. Defaults to `https://api.quiver.ai/v1` and\n * falls back to the `QUIVERAI_BASE_URL` environment variable.\n */\n baseURL?: string;\n\n /**\n * Custom headers to include in the requests.\n */\n headers?: Record<string, string>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept\n * requests, or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\nexport interface QuiverAIProvider extends ProviderV4 {\n /**\n * Creates a model for image generation.\n */\n image(modelId: QuiverAIImageModelId): ImageModelV4;\n\n /**\n * Creates a model for image generation.\n */\n imageModel(modelId: QuiverAIImageModelId): ImageModelV4;\n\n /**\n * @deprecated Use `embeddingModel` instead.\n */\n textEmbeddingModel(modelId: string): never;\n}\n\nconst defaultBaseURL = 'https://api.quiver.ai/v1';\n\nexport function createQuiverAI(\n options: QuiverAIProviderSettings = {},\n): QuiverAIProvider {\n const baseURL =\n withoutTrailingSlash(\n loadOptionalSetting({\n settingValue: options.baseURL,\n environmentVariableName: 'QUIVERAI_BASE_URL',\n }),\n ) ?? defaultBaseURL;\n\n const getHeaders = () =>\n withUserAgentSuffix(\n {\n Authorization: `Bearer ${loadApiKey({\n apiKey: options.apiKey,\n environmentVariableName: 'QUIVERAI_API_KEY',\n description: 'QuiverAI',\n })}`,\n ...options.headers,\n },\n `ai-sdk/quiverai/${VERSION}`,\n );\n\n const createImageModel = (modelId: QuiverAIImageModelId) =>\n new QuiverAIImageModel(modelId, {\n provider: 'quiverai.image',\n baseURL,\n headers: getHeaders,\n fetch: options.fetch,\n });\n\n const embeddingModel = (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n });\n };\n\n return {\n specificationVersion: 'v4',\n image: createImageModel,\n imageModel: createImageModel,\n languageModel: (modelId: string) => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'languageModel',\n });\n },\n embeddingModel,\n textEmbeddingModel: embeddingModel,\n };\n}\n\nexport const quiverai = createQuiverAI();\n","import {\n InvalidArgumentError,\n type ImageModelV4,\n type ImageModelV4CallOptions,\n type ImageModelV4File,\n type SharedV4Warning,\n} from '@ai-sdk/provider';\nimport {\n combineHeaders,\n convertUint8ArrayToBase64,\n createJsonErrorResponseHandler,\n createJsonResponseHandler,\n parseProviderOptions,\n postJsonToApi,\n serializeModelOptions,\n WORKFLOW_DESERIALIZE,\n WORKFLOW_SERIALIZE,\n type FetchFunction,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\nimport {\n quiveraiImageModelOptionsSchema,\n type QuiverAIImageModelOptions,\n} from './quiverai-image-model-options';\nimport type {\n QuiverAIImageModelId,\n QuiverAIOperation,\n} from './quiverai-image-settings';\n\ninterface QuiverAIImageModelConfig {\n provider: string;\n baseURL: string;\n headers?: () => Record<string, string>;\n fetch?: FetchFunction;\n _internal?: {\n currentDate?: () => Date;\n };\n}\n\nexport class QuiverAIImageModel implements ImageModelV4 {\n readonly specificationVersion = 'v4';\n readonly maxImagesPerCall = 16;\n\n get provider(): string {\n return this.config.provider;\n }\n\n static [WORKFLOW_SERIALIZE](model: QuiverAIImageModel) {\n return serializeModelOptions({\n modelId: model.modelId,\n config: model.config,\n });\n }\n\n static [WORKFLOW_DESERIALIZE](options: {\n modelId: QuiverAIImageModelId;\n config: QuiverAIImageModelConfig;\n }) {\n return new QuiverAIImageModel(options.modelId, options.config);\n }\n\n constructor(\n readonly modelId: QuiverAIImageModelId,\n private readonly config: QuiverAIImageModelConfig,\n ) {}\n\n async doGenerate({\n prompt,\n n,\n files,\n mask,\n size,\n aspectRatio,\n seed,\n providerOptions,\n headers,\n abortSignal,\n }: ImageModelV4CallOptions): Promise<\n Awaited<ReturnType<ImageModelV4['doGenerate']>>\n > {\n const quiveraiOptions = await parseProviderOptions({\n provider: 'quiverai',\n providerOptions,\n schema: quiveraiImageModelOptionsSchema,\n });\n\n const operation: QuiverAIOperation =\n quiveraiOptions?.operation ?? 'generate';\n\n const warnings = collectWarnings({ size, aspectRatio, seed, mask });\n\n const body = buildRequestBody({\n modelId: this.modelId,\n n,\n prompt,\n files,\n operation,\n options: quiveraiOptions ?? {},\n });\n\n const currentDate = this.config._internal?.currentDate?.() ?? new Date();\n const combinedHeaders = combineHeaders(this.config.headers?.(), headers);\n\n const { value: response, responseHeaders } = await postJsonToApi({\n url: `${this.config.baseURL}${getOperationPath(operation)}`,\n headers: combinedHeaders,\n body,\n failedResponseHandler: quiveraiFailedResponseHandler,\n successfulResponseHandler: createJsonResponseHandler(\n svgGenerationResponseSchema,\n ),\n abortSignal,\n fetch: this.config.fetch,\n });\n\n const encoder = new TextEncoder();\n const images = response.data.map(image => encoder.encode(image.svg));\n\n return {\n images,\n warnings,\n providerMetadata: {\n quiverai: {\n ...(response.credits != null && { credits: response.credits }),\n images: response.data.map((image, index) => ({\n index,\n mimeType: image.mime_type,\n })),\n },\n },\n response: {\n timestamp: response.created\n ? new Date(response.created * 1000)\n : currentDate,\n modelId: this.modelId,\n headers: responseHeaders,\n },\n ...(response.usage && {\n usage: {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n totalTokens: response.usage.total_tokens,\n },\n }),\n };\n }\n}\n\nfunction getOperationPath(operation: QuiverAIOperation) {\n return operation === 'generate'\n ? '/svgs/generations'\n : '/svgs/vectorizations';\n}\n\nfunction getGenerateReferenceLimit(modelId: string) {\n // Only apply the lower limit to documented Arrow 1.x models. The API\n // enforces model-specific limits within its 16-reference request limit.\n return ['arrow-1', 'arrow-1.0', 'arrow-1.1'].includes(modelId) ? 4 : 16;\n}\n\nfunction toQuiverAIImageReference(image: ImageModelV4File) {\n if (image.type === 'url') {\n return { url: image.url };\n }\n return {\n base64:\n typeof image.data === 'string'\n ? image.data\n : convertUint8ArrayToBase64(image.data),\n };\n}\n\nfunction buildRequestBody({\n modelId,\n n,\n prompt,\n files,\n operation,\n options,\n}: {\n modelId: string;\n n: number;\n prompt: string | undefined;\n files: ImageModelV4File[] | undefined;\n operation: QuiverAIOperation;\n options: QuiverAIImageModelOptions;\n}) {\n if (\n (modelId === 'arrow-2' || modelId === 'arrow-2-telos') &&\n options.maxOutputTokens != null &&\n options.maxOutputTokens > 65536\n ) {\n throw new InvalidArgumentError({\n argument: 'maxOutputTokens',\n message: `QuiverAI model \"${modelId}\" supports at most 65536 output tokens.`,\n });\n }\n\n const sharedOptions = {\n temperature: options.temperature,\n top_p: options.topP,\n presence_penalty: options.presencePenalty,\n max_output_tokens: options.maxOutputTokens,\n reasoning_effort: options.reasoningEffort,\n attributes: options.attributes,\n stream: false as const,\n };\n\n if (operation === 'generate') {\n if (prompt == null || prompt.trim().length === 0) {\n throw new InvalidArgumentError({\n argument: 'prompt',\n message:\n 'QuiverAI image generation requires a non-empty prompt for generateImage.',\n });\n }\n\n const references = files?.map(toQuiverAIImageReference);\n const maxReferences = getGenerateReferenceLimit(modelId);\n\n if (references != null && references.length > maxReferences) {\n throw new InvalidArgumentError({\n argument: 'files',\n message: `QuiverAI generate supports up to ${maxReferences} reference images for model \"${modelId}\".`,\n });\n }\n\n return {\n model: modelId,\n n,\n prompt,\n ...sharedOptions,\n instructions: options.instructions,\n references,\n };\n }\n\n if (files == null || files.length === 0) {\n throw new InvalidArgumentError({\n argument: 'files',\n message:\n 'QuiverAI vectorize requires an input image. Pass an image in the generateImage prompt and set providerOptions.quiverai.operation to \"vectorize\".',\n });\n }\n\n if (files.length > 1) {\n throw new InvalidArgumentError({\n argument: 'files',\n message: 'QuiverAI vectorize accepts a single input image.',\n });\n }\n\n if (n !== 1) {\n throw new InvalidArgumentError({\n argument: 'n',\n message:\n 'QuiverAI vectorize returns one SVG per request. Set maxImagesPerCall to 1 in generateImage to vectorize multiple times.',\n });\n }\n\n return {\n model: modelId,\n image: toQuiverAIImageReference(files[0]),\n ...sharedOptions,\n auto_crop: options.autoCrop,\n target_size: options.targetSize,\n };\n}\n\nfunction collectWarnings({\n size,\n aspectRatio,\n seed,\n mask,\n}: {\n size: `${number}x${number}` | undefined;\n aspectRatio: `${number}:${number}` | undefined;\n seed: number | undefined;\n mask: ImageModelV4File | undefined;\n}): SharedV4Warning[] {\n const warnings: SharedV4Warning[] = [];\n\n if (size != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'size',\n details:\n 'QuiverAI SVG generation does not support the `size` option. The setting was ignored.',\n });\n }\n\n if (aspectRatio != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'aspectRatio',\n details:\n 'QuiverAI SVG generation does not support the `aspectRatio` option. The setting was ignored.',\n });\n }\n\n if (seed != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'seed',\n details:\n 'QuiverAI SVG generation does not support the `seed` option. The setting was ignored.',\n });\n }\n\n if (mask != null) {\n warnings.push({\n type: 'unsupported',\n feature: 'mask',\n details:\n 'QuiverAI SVG generation does not support masks. The mask was ignored.',\n });\n }\n\n return warnings;\n}\n\n// Limited schemas focused on what is needed for the implementation.\n// This approach limits breakages when the API changes and keeps the\n// response handler efficient.\nconst svgUsageSchema = z.object({\n total_tokens: z.number().int().nonnegative(),\n input_tokens: z.number().int().nonnegative(),\n output_tokens: z.number().int().nonnegative(),\n});\n\nconst svgDocumentSchema = z.object({\n svg: z.string().min(1),\n mime_type: z.literal('image/svg+xml'),\n});\n\nconst svgGenerationResponseSchema = z.object({\n id: z.string().min(1),\n created: z.number().int().nonnegative(),\n data: z.array(svgDocumentSchema).min(1),\n usage: svgUsageSchema.nullish(),\n credits: z.number().int().nonnegative().nullish(),\n});\n\nconst quiveraiErrorSchema = z.object({\n status: z.number().int(),\n code: z.string().min(1),\n message: z.string().min(1),\n request_id: z.string().min(1),\n});\n\nexport const quiveraiFailedResponseHandler = createJsonErrorResponseHandler({\n errorSchema: quiveraiErrorSchema,\n errorToMessage: error => error.message,\n isRetryable: response => response.status === 429 || response.status >= 500,\n});\n","import {\n lazySchema,\n zodSchema,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { z } from 'zod/v4';\n\n/**\n * Provider options schema for QuiverAI image generation.\n *\n * @see https://quiver.ai/\n */\nexport const quiveraiImageModelOptionsSchema = lazySchema(() =>\n zodSchema(\n z.object({\n /**\n * The operation to perform. Defaults to `generate`.\n *\n * - `generate`: Text-to-SVG generation. Requires `prompt`.\n * - `vectorize`: Convert an input raster image into an SVG. Requires a\n * single image in `prompt.images` / `files`.\n */\n operation: z.enum(['generate', 'vectorize']).optional(),\n\n /**\n * Extra style guidance for prompt-based generation.\n */\n instructions: z.string().min(1).optional(),\n\n /**\n * Reasoning effort applied to generation or vectorization.\n */\n reasoningEffort: z.enum(['low', 'medium', 'high', 'xhigh']).optional(),\n\n /**\n * SVG root attributes requested for generation or vectorization.\n */\n attributes: z\n .object({\n viewBox: z\n .object({\n minX: z.number(),\n minY: z.number(),\n width: z.number().positive(),\n height: z.number().positive(),\n })\n .optional(),\n })\n .optional(),\n\n /**\n * Sampling temperature (0-2).\n */\n temperature: z.number().min(0).max(2).optional(),\n\n /**\n * Nucleus sampling top-p (0-1).\n */\n topP: z.number().min(0).max(1).optional(),\n\n /**\n * Presence penalty (-2 to 2).\n */\n presencePenalty: z.number().min(-2).max(2).nullable().optional(),\n\n /**\n * Maximum number of output tokens (1 - 65536 for Arrow 2 models).\n * The legacy upper bound of 131072 is retained for other model IDs.\n */\n maxOutputTokens: z.number().int().min(1).max(131072).optional(),\n\n /**\n * Whether to auto-crop the input image before vectorization.\n * Only used when `operation` is `vectorize`.\n */\n autoCrop: z.boolean().optional(),\n\n /**\n * Target canvas size in pixels for vectorization (128 - 4096).\n * Only used when `operation` is `vectorize`.\n */\n targetSize: z.number().int().min(128).max(4096).optional(),\n }),\n ),\n);\n\nexport type QuiverAIImageModelOptions = InferSchema<\n typeof quiveraiImageModelOptionsSchema\n>;\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n"],"mappings":"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","names":["z","z"]}
@@ -70,7 +70,7 @@ import { generateImage } from 'ai';
70
70
  import fs from 'fs';
71
71
 
72
72
  const { image } = await generateImage({
73
- model: quiverai.image('arrow-1.1'),
73
+ model: quiverai.image('arrow-2'),
74
74
  prompt: 'A logo for the next AI Design startup',
75
75
  });
76
76
 
@@ -83,10 +83,12 @@ QuiverAI returns SVG documents. The generated SVG bytes are available through `r
83
83
 
84
84
  ### Model Capabilities
85
85
 
86
- QuiverAI exposes three Arrow models:
86
+ QuiverAI supports the following Arrow models:
87
87
 
88
88
  | Model | Description |
89
89
  | --------------- | -------------------------------------------------------------------------------- |
90
+ | `arrow-2` | Arrow 2 balances SVG generation quality and speed. Uses token-based billing. |
91
+ | `arrow-2-telos` | Higher-fidelity Arrow 2 variant for complex designs. Uses token-based billing. |
90
92
  | `arrow-1` | Base text-to-SVG model. Accepts up to 4 reference images. |
91
93
  | `arrow-1.1` | Improved text-to-SVG model. Accepts up to 4 reference images. |
92
94
  | `arrow-1.1-max` | Higher quality variant with extended context. Accepts up to 16 reference images. |
@@ -100,13 +102,15 @@ import { quiverai, type QuiverAIImageModelOptions } from '@ai-sdk/quiverai';
100
102
  import { generateImage } from 'ai';
101
103
 
102
104
  await generateImage({
103
- model: quiverai.image('arrow-1.1'),
105
+ model: quiverai.image('arrow-2'),
104
106
  prompt: 'A geometric unicorn icon',
105
107
  providerOptions: {
106
108
  quiverai: {
107
109
  instructions: 'Use a flat monochrome style with clean geometry.',
108
- temperature: 0.4,
109
- topP: 0.95,
110
+ reasoningEffort: 'high',
111
+ attributes: {
112
+ viewBox: { minX: 0, minY: 0, width: 100, height: 100 },
113
+ },
110
114
  maxOutputTokens: 4096,
111
115
  } satisfies QuiverAIImageModelOptions,
112
116
  },
@@ -123,6 +127,14 @@ Supported options:
123
127
 
124
128
  Extra style guidance for prompt-based generation.
125
129
 
130
+ - **reasoningEffort** _'low' | 'medium' | 'high' | 'xhigh'_
131
+
132
+ Reasoning effort for generation or vectorization. When omitted, QuiverAI uses its default.
133
+
134
+ - **attributes** _object_
135
+
136
+ Requested SVG root attributes. Supports `viewBox` with numeric `minX`, `minY`, and positive `width` and `height`. This is separate from the unsupported `size` and `aspectRatio` options.
137
+
126
138
  - **temperature** _number_ (0-2)
127
139
 
128
140
  Sampling temperature.
@@ -135,9 +147,9 @@ Supported options:
135
147
 
136
148
  Presence penalty.
137
149
 
138
- - **maxOutputTokens** _number_ (1-131072)
150
+ - **maxOutputTokens** _number_
139
151
 
140
- Maximum number of output tokens.
152
+ Maximum number of output tokens. Arrow 2 and Arrow 2 Telos accept 1-65536. The provider retains its legacy validation bound of 131072 for other model IDs; the API may enforce a lower model-specific limit.
141
153
 
142
154
  - **autoCrop** _boolean_
143
155
 
@@ -153,7 +165,7 @@ Pass reference images through `prompt.images`:
153
165
 
154
166
  ```ts
155
167
  await generateImage({
156
- model: quiverai.image('arrow-1.1'),
168
+ model: quiverai.image('arrow-2'),
157
169
  prompt: {
158
170
  text: 'A geometric unicorn icon',
159
171
  images: ['https://example.com/reference-1.png'],
@@ -161,7 +173,7 @@ await generateImage({
161
173
  });
162
174
  ```
163
175
 
164
- `arrow-1` and `arrow-1.1` accept up to 4 reference images. `arrow-1.1-max` accepts up to 16.
176
+ `arrow-1` and `arrow-1.1` accept up to 4 reference images. `arrow-1.1-max` accepts up to 16. For Arrow 2 and other model IDs, the provider allows the endpoint maximum of 16 references and lets the API enforce any lower model-specific limit.
165
177
 
166
178
  ### Vectorizing a Raster Image
167
179
 
@@ -173,7 +185,7 @@ import { generateImage } from 'ai';
173
185
  import fs from 'fs';
174
186
 
175
187
  const { image } = await generateImage({
176
- model: quiverai.image('arrow-1.1'),
188
+ model: quiverai.image('arrow-2'),
177
189
  prompt: {
178
190
  images: [fs.readFileSync('./logo.png')],
179
191
  },
@@ -188,3 +200,11 @@ const { image } = await generateImage({
188
200
 
189
201
  fs.writeFileSync('logo.svg', image.uint8Array);
190
202
  ```
203
+
204
+ Vectorization returns one SVG per API request. To request multiple vectorizations with `n`, also set `maxImagesPerCall: 1` so `generateImage` splits them into separate calls.
205
+
206
+ ### Billing and Usage
207
+
208
+ Arrow 2 models return measured token counts in `result.usage`. Fixed-credit models may return compatibility token counts of zero; their credit charge is available in `result.providerMetadata?.quiverai?.credits` when supplied by the API.
209
+
210
+ Model availability and supported operations depend on your organization and API key permissions. Consult QuiverAI's [model catalog](https://docs.quiver.ai/developers/models) for current capabilities and billing. Editing, animation, and the Responses API are not yet exposed by this provider.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/quiverai",
3
- "version": "2.0.41",
3
+ "version": "2.0.43",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
6
  "sideEffects": false,
@@ -29,8 +29,8 @@
29
29
  }
30
30
  },
31
31
  "dependencies": {
32
- "@ai-sdk/provider": "4.0.15",
33
- "@ai-sdk/provider-utils": "5.0.41"
32
+ "@ai-sdk/provider": "4.0.17",
33
+ "@ai-sdk/provider-utils": "5.0.43"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@ai-sdk/test-server": "2.0.1",
@@ -27,6 +27,27 @@ export const quiveraiImageModelOptionsSchema = lazySchema(() =>
27
27
  */
28
28
  instructions: z.string().min(1).optional(),
29
29
 
30
+ /**
31
+ * Reasoning effort applied to generation or vectorization.
32
+ */
33
+ reasoningEffort: z.enum(['low', 'medium', 'high', 'xhigh']).optional(),
34
+
35
+ /**
36
+ * SVG root attributes requested for generation or vectorization.
37
+ */
38
+ attributes: z
39
+ .object({
40
+ viewBox: z
41
+ .object({
42
+ minX: z.number(),
43
+ minY: z.number(),
44
+ width: z.number().positive(),
45
+ height: z.number().positive(),
46
+ })
47
+ .optional(),
48
+ })
49
+ .optional(),
50
+
30
51
  /**
31
52
  * Sampling temperature (0-2).
32
53
  */
@@ -43,7 +64,8 @@ export const quiveraiImageModelOptionsSchema = lazySchema(() =>
43
64
  presencePenalty: z.number().min(-2).max(2).nullable().optional(),
44
65
 
45
66
  /**
46
- * Maximum number of output tokens (1 - 131072).
67
+ * Maximum number of output tokens (1 - 65536 for Arrow 2 models).
68
+ * The legacy upper bound of 131072 is retained for other model IDs.
47
69
  */
48
70
  maxOutputTokens: z.number().int().min(1).max(131072).optional(),
49
71
 
@@ -121,6 +121,7 @@ export class QuiverAIImageModel implements ImageModelV4 {
121
121
  warnings,
122
122
  providerMetadata: {
123
123
  quiverai: {
124
+ ...(response.credits != null && { credits: response.credits }),
124
125
  images: response.data.map((image, index) => ({
125
126
  index,
126
127
  mimeType: image.mime_type,
@@ -152,7 +153,9 @@ function getOperationPath(operation: QuiverAIOperation) {
152
153
  }
153
154
 
154
155
  function getGenerateReferenceLimit(modelId: string) {
155
- return modelId === 'arrow-1.1-max' ? 16 : 4;
156
+ // Only apply the lower limit to documented Arrow 1.x models. The API
157
+ // enforces model-specific limits within its 16-reference request limit.
158
+ return ['arrow-1', 'arrow-1.0', 'arrow-1.1'].includes(modelId) ? 4 : 16;
156
159
  }
157
160
 
158
161
  function toQuiverAIImageReference(image: ImageModelV4File) {
@@ -182,11 +185,24 @@ function buildRequestBody({
182
185
  operation: QuiverAIOperation;
183
186
  options: QuiverAIImageModelOptions;
184
187
  }) {
188
+ if (
189
+ (modelId === 'arrow-2' || modelId === 'arrow-2-telos') &&
190
+ options.maxOutputTokens != null &&
191
+ options.maxOutputTokens > 65536
192
+ ) {
193
+ throw new InvalidArgumentError({
194
+ argument: 'maxOutputTokens',
195
+ message: `QuiverAI model "${modelId}" supports at most 65536 output tokens.`,
196
+ });
197
+ }
198
+
185
199
  const sharedOptions = {
186
200
  temperature: options.temperature,
187
201
  top_p: options.topP,
188
202
  presence_penalty: options.presencePenalty,
189
203
  max_output_tokens: options.maxOutputTokens,
204
+ reasoning_effort: options.reasoningEffort,
205
+ attributes: options.attributes,
190
206
  stream: false as const,
191
207
  };
192
208
 
@@ -234,9 +250,16 @@ function buildRequestBody({
234
250
  });
235
251
  }
236
252
 
253
+ if (n !== 1) {
254
+ throw new InvalidArgumentError({
255
+ argument: 'n',
256
+ message:
257
+ 'QuiverAI vectorize returns one SVG per request. Set maxImagesPerCall to 1 in generateImage to vectorize multiple times.',
258
+ });
259
+ }
260
+
237
261
  return {
238
262
  model: modelId,
239
- n,
240
263
  image: toQuiverAIImageReference(files[0]),
241
264
  ...sharedOptions,
242
265
  auto_crop: options.autoCrop,
@@ -315,6 +338,7 @@ const svgGenerationResponseSchema = z.object({
315
338
  created: z.number().int().nonnegative(),
316
339
  data: z.array(svgDocumentSchema).min(1),
317
340
  usage: svgUsageSchema.nullish(),
341
+ credits: z.number().int().nonnegative().nullish(),
318
342
  });
319
343
 
320
344
  const quiveraiErrorSchema = z.object({
@@ -7,6 +7,8 @@ export type QuiverAIImageModelId =
7
7
  | 'arrow-1'
8
8
  | 'arrow-1.1'
9
9
  | 'arrow-1.1-max'
10
+ | 'arrow-2'
11
+ | 'arrow-2-telos'
10
12
  | (string & {});
11
13
 
12
14
  /**