QuiverAI 프로바이더
QuiverAI 프로바이더
QuiverAI 는 SVG 문서를 추론하고 만들 수 있는 Arrow 언어 모델과, 네이티브 SVG 생성, 벡터화, 편집, 애니메이션 엔드포인트를 제공해요. AI SDK 프로바이더는 generateText 와 streamText 를 통해 Arrow 2를 노출하고, generateImage 를 통해 이미지 작업을 노출해요.
출처: 문서
본문
설정 (Setup)
QuiverAI 프로바이더는 @ai-sdk/quiverai 모듈을 통해 사용할 수 있어요. 다음과 같이 설치하면 돼요:
프로바이더 인스턴스
@ai-sdk/quiverai 에서 기본 프로바이더 인스턴스 quiverai 를 import 할 수 있어요:
import { quiverai } from '@ai-sdk/quiverai';
커스터마이징된 설정이 필요하다면 createQuiverAI 를 import 해서 원하는 설정으로 프로바이더 인스턴스를 만들 수 있어요:
import { createQuiverAI } from '@ai-sdk/quiverai';
const quiverai = createQuiverAI({
apiKey: *** // optional, defaults to QUIVERAI_API_KEY environment variable
baseURL: 'custom-url', // optional, defaults to QUIVERAI_BASE_URL or https://api.quiver.ai/v1
headers: {
/* custom headers */
}, // optional
});
QuiverAI 프로바이더 인스턴스를 커스터마이징하기 위해 다음 선택적 설정을 사용할 수 있어요:
-
baseURL string
프록시 서버를 쓰는 등 API 호출에 다른 URL 접두어를 사용해요. 기본 접두어는
https://api.quiver.ai/v1이에요. 환경 변수QUIVERAI_BASE_URL도 읽어요. -
apiKey string
Authorization헤더에Bearer토큰으로 보내지는 API 키예요. 기본값은QUIVERAI_API_KEY환경 변수예요. -
headers Record<string,string>
요청에 포함할 커스텀 헤더예요.
-
fetch (input: RequestInfo, init?: RequestInit) => Promise<Response>
커스텀 fetch 구현이에요. 요청을 가로채는 미들웨어로 쓰거나, 테스트 같은 경우에 커스텀 fetch 구현을 제공하는 데 쓸 수 있어요.
언어 모델 (Language Models)
프로바이더를 호출하거나 .languageModel() 을 사용해 Arrow 언어 모델을 만들 수 있어요:
import { quiverai } from '@ai-sdk/quiverai';
import { generateText } from 'ai';
const { text } = await generateText({
model: quiverai('arrow-2'),
prompt: 'Design a simple compass icon and explain the visual choices.',
});
console.log(text);
언어 모델 팩토리는 QuiverAI의 상태 비저장(stateless) POST /v1/responses 엔드포인트를 통해 arrow-2 와 arrow-2-telos 를 지원해요.
추론 옵션 (Reasoning Options)
providerOptions.quiverai 를 통해 QuiverAI 추론을 설정할 수 있어요:
import { quiverai, type QuiverAILanguageModelOptions } from '@ai-sdk/quiverai';
import { generateText } from 'ai';
await generateText({
model: quiverai('arrow-2-telos'),
prompt: 'Create a precise technical SVG diagram.',
providerOptions: {
quiverai: {
reasoningEffort: 'xhigh',
reasoningSummary: 'auto',
} satisfies QuiverAILanguageModelOptions,
},
});
- reasoningEffort 'low' | 'medium' | 'high' | 'xhigh'
- reasoningSummary 'auto'
프로바이더는 암호화된 추론을 요청하지 않아요. tool 루프 중에는 tool 호출과 결과를 매칭하면서 전체 대화를 재생하고, 비공개 추론 텍스트나 암호화된 추론 상태를 다시 보내지 않고 불투명한 추론 항목 ID를 순서대로 재생해요.
호출자가 실행하는 Tool (Caller-Executed Tools)
표준 AI SDK tools는 Responses API function tools로 보내지며 여러분의 애플리케이션에서 실행돼요. 각 단계마다 또 다른 모델 요청이 수행되므로 제한된(bounded) 루프를 사용하세요:
import { quiverai } from '@ai-sdk/quiverai';
import { generateText, isStepCount, tool } from 'ai';
import { z } from 'zod';
const result = await generateText({
model: quiverai('arrow-2'),
prompt: 'Create an SVG compass and stage it as compass.svg.',
tools: {
write_file: tool({
description: 'Stage an SVG file in the calling application.',
inputSchema: z.object({
path: z.string(),
content: z.string(),
}),
execute: async ({ path, content }) => {
// Validate and restrict paths before writing model-generated content.
return { path, staged: content.startsWith('<svg') };
},
}),
},
stopWhen: isStepCount(4),
});
QuiverAI 커스텀 tools는 원시 문자열을 반환하며 호출자도 실행해요:
const result = await generateText({
model: quiverai('arrow-2'),
prompt: 'Return a minimal SVG document.',
tools: {
write_svg: quiverai.tools.customTool({
description: 'Return SVG source.',
format: { type: 'text' },
execute: async svg => ({ accepted: svg.startsWith('<svg') }),
}),
},
stopWhen: isStepCount(3),
});
레거시 quiver:* tools를 포함한 호스팅 tools는 지원되지 않아요.
Responses API 제한 사항
- 요청은 상태 비저장(stateless)이에요. 프로바이더는 응답 저장이나 response-ID 연속을 활성화하지 않아요.
- QuiverAI는 현재 이 엔드포인트에 대해 텍스트 응답 형식을 문서화하고 있어요.
구조화된 출력 설정은 생략되고
warnings에 보고돼요. - 스트리밍 tool 호출은 애플리케이션 실행 전에 완전히 조립돼요.
- 중단 신호(abort signals), 커스텀 헤더, 커스텀
fetch구현은 Responses 요청으로 전달돼요.
언어 모델 사용량 (Language Model Usage)
result.usage 와 스트리밍 완료 이벤트는 QuiverAI가 반환할 때 입력, cache-read, cache-write, text-output, 추론 토큰 수를 포함해요.
이미지 모델 (Image Models)
.image() 팩토리 메서드를 사용해 QuiverAI 이미지 모델을 만들 수 있어요. AI SDK로 이미지 생성에 대해 더 알아보려면 generateImage() 를 보세요.
기본 사용법
import { quiverai } from '@ai-sdk/quiverai';
import { generateImage } from 'ai';
import fs from 'fs';
const { image } = await generateImage({
model: quiverai.image('arrow-2'),
prompt: 'A logo for the next AI Design startup',
});
const filename = `image-${Date.now()}.svg`;
fs.writeFileSync(filename, image.uint8Array);
console.log(`Saved SVG to ${filename}`);
QuiverAI는 SVG 문서를 반환해요. 생성된 SVG 바이트는 result.image.uint8Array (여러 개 생성 시 result.images) 로 사용할 수 있어요.
모델 기능
QuiverAI는 다음 Arrow 모델들을 지원해요:
| Model | Description |
|---|---|
arrow-2 |
Arrow 2는 SVG 생성 품질과 속도의 균형을 맞춰요. API 키에 대해 활성화되면 SVG 편집을 지원해요. 토큰 기반 청구를 사용해요. |
arrow-2-telos |
복잡한 디자인을 위한 더 높은 충실도의 Arrow 2 변형. API 키에 대해 활성화되면 SVG 편집을 지원해요. 토큰 기반 청구를 사용해요. |
arrow-1 |
기본 text-to-SVG 모델. 참조 이미지를 최대 4장까지 받아요. |
arrow-1.1 |
개선된 text-to-SVG 모델. 참조 이미지를 최대 4장까지 받아요. |
arrow-1.1-max |
확장된 컨텍스트를 가진 더 높은 품질 변형. 참조 이미지를 최대 16장까지 받아요. |
프로바이더 옵션 (Provider Options)
providerOptions.quiverai 를 사용해 요청을 세밀하게 조정할 수 있어요:
import { quiverai, type QuiverAIImageModelOptions } from '@ai-sdk/quiverai';
import { generateImage } from 'ai';
await generateImage({
model: quiverai.image('arrow-2'),
prompt: 'A geometric unicorn icon',
providerOptions: {
quiverai: {
instructions: 'Use a flat monochrome style with clean geometry.',
reasoningEffort: 'high',
attributes: {
viewBox: { minX: 0, minY: 0, width: 100, height: 100 },
},
maxOutputTokens: 4096,
} satisfies QuiverAIImageModelOptions,
},
});
지원되는 옵션:
-
operation 'generate' | 'vectorize' | 'edit' | 'animate'
text-to-SVG 생성(
generate, 기본값), image-to-SVG 벡터화(vectorize), SVG 편집(edit), SVG 애니메이션(animate) 중에서 선택해요. -
instructions string
프롬프트 기반 생성을 위한 추가 스타일 안내예요. 이 옵션은 SVG 편집 지시로 사용되지 않아요. 편집에는
prompt.text를 사용하세요. -
reasoningEffort 'low' | 'medium' | 'high' | 'xhigh'
생성, 벡터화, 편집을 위한 추론 노력(reasoning effort)이에요. 생략하면 QuiverAI가 기본값을 사용해요.
-
attributes object
요청된 SVG 루트 속성이에요. 숫자
minX,minY, 양수width와height를 가진viewBox를 지원해요. 지원되지 않는size와aspectRatio옵션과는 별개예요. -
temperature number (0-2)
샘플링 온도예요.
-
topP number (0-1)
Nucleus sampling top-p 값이에요.
-
presencePenalty number (-2 to 2)
존재 패널티(중복 방지)예요.
-
maxOutputTokens number
최대 출력 토큰 수예요. Arrow 2와 Arrow 2 Telos는 1-65536을 허용해요. 프로바이더는 다른 모델 ID에 대해 레거시 검증 상한인 131072를 유지하며, API가 더 낮은 모델별 한도를 강제할 수 있어요.
-
referenceImages
Array<{ url: string } | { base64: string }>SVG 편집을 위한 선택적 참조 이미지 최대 4장이에요. URL 참조는 HTTP 또는 HTTPS를 사용해야 해요. Base64 참조는 PNG, JPEG, WebP, GIF 또는 SVG 데이터로 디코딩되어야 해요.
prepareQuiverAIImageReference를 사용해 이진, data URL, 또는 URL 입력을 이 JSON-safe 프로바이더 옵션 형태로 변환하세요. -
maxReviewSteps number (0-5)
초기 편집 후 편집 검토/redo 단계의 최대 수예요.
-
orchestratorMaxOutputTokens number (1-65536)
SVG 편집을 위한 선택적 프로바이더 orchestrator 토큰 예산이에요.
-
shallowMaxOutputTokens number (1-65536)
SVG 편집을 위한 선택적 프로바이더 셸로우 편집 토큰 예산이에요.
-
autoCrop boolean
벡터화할 때 입력 이미지를 자동으로 크롭해요.
operation: 'vectorize'일 때만 사용돼요. -
targetSize number (128-4096)
벡터화할 때 픽셀 단위 대상 캔버스 크기예요.
operation: 'vectorize'일 때만 사용돼요.
참조 이미지 (Reference Images)
prompt.images 를 통해 참조 이미지를 전달하세요:
await generateImage({
model: quiverai.image('arrow-2'),
prompt: {
text: 'A geometric unicorn icon',
images: ['https://example.com/reference-1.png'],
},
});
arrow-1 과 arrow-1.1 은 참조 이미지를 최대 4장까지 받아요. arrow-1.1-max 는 최대 16장까지 받아요. Arrow 2와 다른 모델 ID의 경우 프로바이더는 엔드포인트 최대치인 16개 참조를 허용하고 API가 더 낮은 모델별 한도를 강제하게 해요.
래스터 이미지 벡터화 (Vectorizing a Raster Image)
operation 을 vectorize 로 설정하고 prompt.images 에 단일 이미지를 전달하세요:
import { quiverai, type QuiverAIImageModelOptions } from '@ai-sdk/quiverai';
import { generateImage } from 'ai';
import fs from 'fs';
const { image } = await generateImage({
model: quiverai.image('arrow-2'),
prompt: {
images: [fs.readFileSync('./logo.png')],
},
providerOptions: {
quiverai: {
operation: 'vectorize',
autoCrop: true,
targetSize: 1024,
} satisfies QuiverAIImageModelOptions,
},
});
fs.writeFileSync('logo.svg', image.uint8Array);
벡터화는 API 요청당 하나의 SVG를 반환해요. n 으로 여러 벡터화를 요청하려면 maxImagesPerCall: 1 도 설정해서 generateImage 가 별도 호출로 나누게 하세요.
SVG 편집 (Editing an SVG)
operation 을 edit 로 설정하고 prompt.images 에 정확히 하나의 소스 SVG를 넣고, prompt.text 에 편집 지시를 제공하세요:
import {
prepareQuiverAIImageReference,
quiverai,
type QuiverAIImageModelOptions,
} from '@ai-sdk/quiverai';
import { generateImage } from 'ai';
import fs from 'node:fs/promises';
const { image } = await generateImage({
model: quiverai.image('arrow-2'),
prompt: {
text: 'Make the logo blue and simplify the star points.',
images: [await fs.readFile('./logo.svg')],
},
providerOptions: {
quiverai: {
operation: 'edit',
referenceImages: [
prepareQuiverAIImageReference(
await fs.readFile('./blue-reference.png'),
),
{ url: 'https://example.com/second-reference.png' },
],
maxReviewSteps: 2,
reasoningEffort: 'medium',
maxOutputTokens: 4096,
orchestratorMaxOutputTokens: 4096,
shallowMaxOutputTokens: 2048,
temperature: 0.4,
} satisfies QuiverAIImageModelOptions,
},
});
await fs.writeFile('./edited-logo.svg', image.uint8Array);
소스 SVG는 HTTP/HTTPS URL, Buffer 나 Uint8Array 같은 이진 데이터, base64 문자열, 또는 SVG data URL일 수 있어요. 이진 및 base64 소스는 완전한 UTF-8 SVG 문서로 검증되고 base64 SVG 소스로 QuiverAI에 보내져요. 원격 소스 URL은 QuiverAI가 가져오며 SVG로 해석되어야 해요.
편집 참조 이미지는 소스 SVG와 별개예요. prompt.images 가 아니라 providerOptions.quiverai.referenceImages 에 넣으세요. 직접 프로바이더 옵션 값은 { url } 또는 { base64 } 를 사용해요. prepareQuiverAIImageReference 는 HTTP/HTTPS URL, URL, Uint8Array, ArrayBuffer, base64 문자열, 또는 지원되는 이미지 data URL을 그 JSON-safe 형태로 변환해요.
SVG 편집에는 다음 검증 제약이 있어요:
- 모델은
arrow-2또는arrow-2-telos여야 하고, API 키의 라이브 모델 카탈로그에svg_edit작업이 포함되어야 해요. prompt.images는 정확히 하나의 소스 SVG를 포함해야 해요.prompt.text는 필수이며 비어 있으면 안 되고 최대 4000자여야 해요.- 이진 소스 SVG는 200000바이트 이하의 완전한 UTF-8 SVG 문서여야 해요.
- 참조 이미지는 최대 4장까지 허용돼요. 인라인 참조는 디코딩된 바이트 최대 12582912개를 포함할 수 있어요.
- 편집은 API 요청당 정확히 하나의 SVG를 반환해요.
n으로 여러 편집을 요청하려면maxImagesPerCall: 1을 설정해generateImage가 별도 호출로 나누게 하세요. - 마스크와 생성/벡터화 전용 프로바이더 옵션은 편집에서 거부돼요.
- 편집 전용 프로바이더 옵션은 생성, 벡터화, 애니메이션에서 거부돼요.
편집된 SVG는 result.image.uint8Array 에 바이트로 반환돼요.
SVG 애니메이션 (Animating an SVG)
Arrow 2와 Arrow 2 Telos는 기존 SVG를 애니메이션할 수 있어요. operation 을 animate 로 설정하고 prompt.images 에 정확히 하나의 소스 SVG를 전달하세요. 텍스트 지시는 선택사항이에요. text 를 생략하면 QuiverAI가 애니메이션을 선택해요.
import { quiverai, type QuiverAIImageModelOptions } from '@ai-sdk/quiverai';
import { generateImage } from 'ai';
import fs from 'fs';
const { image, providerMetadata } = await generateImage({
model: quiverai.image('arrow-2'),
prompt: {
images: [fs.readFileSync('./logo.svg')],
text: 'Make the logo pulse gently.',
},
providerOptions: {
quiverai: {
operation: 'animate',
reasoningEffort: 'medium',
maxOutputTokens: 4096,
} satisfies QuiverAIImageModelOptions,
},
});
fs.writeFileSync('animated-logo.svg', image.uint8Array);
const timing = providerMetadata.quiverai?.images?.[0];
console.log(timing?.loopPeriodMs, timing?.openingAnimationMs);
애니메이션 소스는 HTTP 또는 HTTPS URL, SVG 바이트, 원시 base64, 또는 image/svg+xml base64 data URL일 수 있어요. 로컬 파일 입력은 요청 전에 검사되어 SVG 데이터를 포함하지 않으면 거부돼요. 원격 URL은 스킴이 검증되고 QuiverAI가 가져와 검증해요.
애니메이션은 image.uint8Array 에 바이트로 애니메이션 SVG를 반환해요. QuiverAI가 타이밍 정보를 반환하면 이미지별 메타데이터에 loopPeriodMs 와 openingAnimationMs 가 포함되며, 두 타이밍 값 모두 null 일 수 있어요.
애니메이션 요청은 arrow-2 또는 arrow-2-telos 를 사용해야 하고, 정확히 하나의 소스 SVG를 포함해야 하며, 마스크를 생략해야 하고, 프로바이더 요청당 하나의 결과를 만들어야 해요. n 으로 여러 애니메이션을 요청하려면 maxImagesPerCall: 1 을 설정해 generateImage 가 별도 호출로 나누게 하세요. 애니메이션은 temperature, reasoningEffort, maxOutputTokens 를 지원하며, 생성 전용 및 벡터화 전용 프로바이더 옵션은 거부돼요.
소스 SVG, 텍스트 지시, 원격 소스 URL은 QuiverAI로 보내져요. 애니메이션 SVG는 활성 문서 콘텐츠예요. 신뢰할 수 없는 소스의 출력을 페이지에 인라인으로 임베드하기 전에 이를 정화(sanitize)하거나 격리된 컨텍스트에서 렌더링하세요.
청구 및 사용량 (Billing and Usage)
Arrow 2 모델은 result.usage 에 측정된 토큰 수를 반환해요. 고정 크레딧(fixed-credit) 모델은 0의 호환 토큰 수를 반환할 수 있어요. 크레딧 요금은 API가 제공할 때 result.providerMetadata?.quiverai?.credits 에서 확인할 수 있어요.
모델 가용성과 지원되는 작업은 조직 및 API 키 권한에 따라 달라져요. 현재 기능과 청구에 대해서는 QuiverAI의 모델 카탈로그 를 확인하세요.
더 알아보기 (Learn more)
- AI Gateway
- xAI Grok
- OpenAI
- Azure OpenAI
- Anthropic
- Open Responses
- Claude Platform on AWS
- Amazon Bedrock
- Groq
- Fal
- AssemblyAI
- GMI Cloud
- TypeSafe
- DeepInfra
- Deepgram
- Black Forest Labs
- Gladia
- Hume
- Google Vertex AI
- Rev.ai
- Baseten
- Hugging Face
- QuiverAI
- Fish Audio
- Mistral AI
- Z.AI
- Together.ai
- Cohere
- Fireworks
- Voyage AI
- DeepSeek
- Moonshot AI
- Alibaba
- MiniMax
- Cerebras
- Replicate
- Prodia
- Perplexity
- Luma
- ByteDance
- Kling AI
- ElevenLabs
- Cartesia