설정(Settings): 생성 옵션과 요청 옵션
설정(Settings): 생성 옵션과 요청 옵션
많은 LLM이 출력을 다듬기 위한 설정을 제공해요. AI SDK 함수는 여기에 더해 모델 생성 동작을 조절하는 옵션과 전송·재시도·타임아웃을 조절하는 옵션을 구분해서 지원해요. 이 둘을 구분하면 "모델이 뭘 생성할지"와 "SDK가 프로바이더와 어떻게 통신할지"를 각각 제어할 수 있어요.
출처: 공식문서
본문
모든 AI SDK 함수는 모델·프롬프트·프로바이더별 설정 외에 다음 공통 설정을 지원해요.
const result = await generateText({
model: "xai/grok-4.6",
maxOutputTokens: 512,
temperature: 0.3,
maxRetries: 5,
timeout: 10000,
prompt: 'Invent a new holiday and describe its traditions.',
});
일부 프로바이더는 공통 설정 전체를 지원하지 않아요. 지원하지 않는 설정을 쓰면 경고가 생성되고, 결과 객체의 warnings 프로퍼티로 확인할 수 있어요.
언어 모델 호출 옵션 (LanguageModelCallOptions)
이런 옵션은 모델이 응답을 어떻게 생성할지(토큰 제한, 샘플링, 페널티, 정지 시퀀스, 시드, 리저닝)를 정하며, 내부 모델로 그대로 전달돼요.
maxOutputTokens— 생성할 최대 토큰 수temperature— 온도 설정. 0에 가까울수록 거의 결정적이고, 값이 클수록 무작위성이 커져요. 대부분의 프로바이더에서 그런 범위예요.temperature와topP는 둘 다 정하지 말고 하나만 정하는 걸 권장해요. AI SDK 5.0부터는temperature가 기본 0이 아니에요.topP— 핵 샘플링. 0과 1 사이 값으로, 예컨대 0.1이면 상위 10% 확률 질량의 토큰만 고려해요. 역시temperature와 하나만 쓰는 걸 권장해요.topK— 다음 토큰마다 상위 K개 옵션에서만 샘플링해요. "긴 꼬리" 저확률 응답을 제거하는 데 쓰되, 보통은temperature만으로 충분하니 고급 사용 사례에 한해 쓰는 게 좋아요.presencePenalty— 프롬프트에 이미 있는 정보를 모델이 반복할 가능성에 영향을 줘요. 프로바이더에 그대로 전달되고, 대부분 0이면 페널티 없음이에요.frequencyPenalty— 모델이 같은 단어·구를 반복해서 쓸 가능성에 영향을 줘요. 마찬가지로 프로바이더에 전달되고 0이면 페널티 없음이에요.stopSequences— 텍스트 생성을 멈추는 정지 시퀀스. 정지 시퀀스 중 하나가 생성되면 모델이 생성을 멈춰요. 프로바이더마다 개수 제한이 있을 수 있어요.seed— 무작위 샘플링에 쓸 시드(정수). 설정되고 모델이 지원하면 결정적 결과가 나와요.reasoning— 응답 전에 모델이 얼마나 리저닝할지 제어해요.'provider-default'(기본),'none','minimal','low','medium','high','xhigh'값을 써요.providerOptions에 리저닝 관련 옵션을 함께 주면(예:openai.reasoningEffort,anthropic.thinking) 프로바이더별 옵션이 우선하고 최상위reasoning은 무시돼요.
요청 옵션 (RequestOptions)
이런 옵션은 전송·재시도·취소·타임아웃에 영향을 주는 것으로, 모델 생성 동작을 바꾸지 않아요. SDK가 프로바이더 API와 어떻게 통신할지 제어하죠.
maxRetries— 최대 재시도 횟수. 0으로 설정하면 재시도를 끄고, 기본값은 2예요.abortSignal— 호출을 취소하는 데 쓰는 abort 신호. UI에서 전달해 호출을 취소하거나AbortSignal.timeout(5000)으로 타임아웃을 정할 수 있어요.timeout— 밀리초 단위 타임아웃. 지정한 시간보다 오래 걸리면 호출이 중단돼요. 내부적으로 abort 신호를 만드는 편의 파라미터이며abortSignal과 함께 쓸 수 있어요. 숫자(밀리초) 또는 객체로 지정할 수 있어요.
타임아웃 객체의 프로퍼티는 다음과 같아요.
totalMs— 모든 스텝을 포함한 전체 호출의 총 타임아웃stepMs— 개별 스텝(LLM 호출)의 타임아웃. 멀티 스텝 생성에서 각 스텝 시간을 따로 제한하고 싶을 때 유용해요.firstChunkMs— 각 스텝의 첫 콘텐츠 출력까지의 타임아웃(스트리밍 전용). 텍스트 델타·리저닝 델타·도구 입력 델타·생성 파일·도구 호출이 이 조건을 충족해요. 응답 메타데이터나 스트림 시작, 빈 델타, 원시 청크, 전송 활동은 충족시키지도, 초기화하지도 않아요.chunkMs— 출력이 시작된 뒤 콘텐츠 청크 사이의 타임아웃(스트리밍 전용). 콘텐츠가 아닌 청크는 초기화하지 않아요. 생성이 시작된 뒤 스트림이 멈추는 것을 감지하는 데 유용해요.toolMs— 모든 도구 실행의 기본 타임아웃. 도구가 오래 걸리면 중단되고tool-error를 반환해 모델이 응답하거나 재시도할 수 있게 해요.tools—{toolName}Ms키(예:weatherMs,slowApiMs)로 도구별 타임아웃 오버라이드.toolMs보다 우선하고, 도구 이름은 자동완성을 위해 타입 검사돼요.
// 5초 전체 타임아웃 (객체 형식)
const result = await generateText({
model: "xai/grok-4.6",
prompt: 'Invent a new holiday and describe its traditions.',
timeout: { totalMs: 5000 },
});
// 스텝별 10초 타임아웃
const result = await generateText({
model: "xai/grok-4.6",
prompt: 'Invent a new holiday and describe its traditions.',
timeout: { stepMs: 10000 },
});
// 스트리밍 전용: 콘텐츠가 5초 멈추면 중단
const result = streamText({
model: "xai/grok-4.6",
prompt: 'Invent a new holiday and describe its traditions.',
timeout: { chunkMs: 5000 },
});
// 도구 실행 타임아웃: 기본 5초, weather는 3초, slowApi는 10초
const result = await generateText({
model: "xai/grok-4.6",
tools: { weather: weatherTool, slowApi: slowApiTool },
timeout: {
toolMs: 5000,
tools: {
weatherMs: 3000,
slowApiMs: 10000,
},
},
prompt: 'What is the weather in San Francisco?',
});
headers— 요청과 함께 보낼 추가 HTTP 헤더. HTTP 기반 프로바이더에만 적용돼요. 예컨대 일부 관찰성 프로바이더는Prompt-Id같은 헤더를 지원해요.headers는 요청별 헤더이고, 프로바이더 설정에도 헤더를 둘 수 있는데 그건 해당 프로바이더가 만드는 모든 요청에 보내져요.
더 알아보기
- 에러 처리 —
maxRetries와 스트림 재시도의 관계 - 텍스트 생성과 스트리밍 — 설정이 적용되는
generateText/streamText - 리저닝 —
reasoning매개변수의 프로바이더별 매핑