AI SDK 5.x → 6.0 마이그레이션
AI SDK 5.x → 6.0 마이그레이션
AI SDK 5.x에서 6.0으로 업그레이드할 때 필요한 변경 사항을 정리한 가이드예요. 이번 버전은 에이전트 클래스 변경(Experimental_Agent → ToolLoopAgent), CoreMessage 제거, generateObject/streamObject 지원 중단, 임베딩 메서드 이름 변경, OpenAI strict 모드 기본 활성화 등 수많은 변경이 있어요. codemod가 많으니 npx @ai-sdk/codemod v6부터 돌리고 가이드를 따라가면 좋아요.
출처: 문서
본문
권장 마이그레이션 프로세스 (Recommended Migration Process)
- 프로젝트를 백업하세요. 버전 관리 시스템을 사용한다면 모든 이전 버전이 커밋되었는지 확인하세요.
- AI SDK 6.0으로 업그레이드하세요.
- 아래의 호환성이 깨지는 변경 가이드를 따르세요.
- 프로젝트가 예상대로 동작하는지 검증하세요.
- 변경 사항을 커밋하세요.
AI SDK 6.0 패키지 버전 (AI SDK 6.0 Package Versions)
package.json 파일에서 다음 패키지들을 최신 버전으로 업데이트해야 합니다:
ai패키지:^6.0.0@ai-sdk/provider패키지:^3.0.0@ai-sdk/provider-utils패키지:^4.0.0@ai-sdk/*패키지:^3.0.0
예시 업그레이드 명령:
pnpm install ai@latest @ai-sdk/react@latest @ai-sdk/openai@latest
Codemods
AI SDK는 기능이 지원 중단되거나, 제거되거나, 변경될 때 코드베이스 업그레이드를 돕는 Codemod 변환을 제공합니다.
Codemod는 코드베이스에서 자동으로 실행되는 변환입니다. 모든 파일을 수동으로 살펴보지 않고도 많은 변경을 쉽게 적용할 수 있게 해줍니다.
프로젝트 루트에서 다음 명령을 실행하면 모든 v6 codemod(v5 → v6 마이그레이션)를 실행할 수 있습니다:
npx @ai-sdk/codemod v6
npx @ai-sdk/codemod upgrade명령도 있지만, 이 명령은 모든 버전(v4, v5, v6)의 모든 codemod를 실행합니다. v5에서 업그레이드할 때는v6을 사용하세요.
개별 codemod는 codemod 이름을 지정해 실행할 수 있습니다:
npx @ai-sdk/codemod <codemod-name> <path>
예를 들어, 특정 v6 codemod를 실행하려면:
npx @ai-sdk/codemod v6/rename-text-embedding-to-embedding src/
Codemod는 업그레이드 과정을 돕기 위한 도구로 의도되었습니다. 필요한 모든 변경을 다 다루지는 못할 수 있습니다. 추가 변경을 수동으로 해야 할 수도 있습니다.
Codemod 표 (Codemod Table)
| Codemod 이름 | 설명 |
|---|---|
rename-text-embedding-to-embedding |
프로바이더의 textEmbeddingModel을 embeddingModel로, textEmbedding을 embedding으로 이름 변경 |
rename-mock-v2-to-v3 |
ai/test의 V2 mock 클래스를 V3로 이름 변경 (예: MockLanguageModelV2 → MockLanguageModelV3) |
rename-tool-call-options-to-tool-execution-options |
ToolCallOptions 타입을 ToolExecutionOptions로 이름 변경 |
rename-core-message-to-model-message |
CoreMessage 타입을 ModelMessage로 이름 변경 |
rename-converttocoremessages-to-converttomodelmessages |
convertToCoreMessages 함수를 convertToModelMessages로 이름 변경 |
rename-vertex-provider-metadata-key |
Google Vertex 파일의 providerMetadata와 providerOptions에서 google을 vertex로 이름 변경 |
wrap-tomodeloutput-parameter |
toModelOutput 매개변수를 객체 구조분해로 감싼다 (output → { output }) |
add-await-converttomodelmessages |
convertToModelMessages 호출에 await 추가 (AI SDK 6에서 비동기화됨) |
AI SDK Core
Experimental_Agent가 ToolLoopAgent 클래스로 변경
Experimental_Agent 클래스가 ToolLoopAgent 클래스로 대체되었습니다. 두 가지 주요 변경:
system매개변수가instructions로 이름 변경- 기본
stopWhen이isStepCount(1)에서isStepCount(20)으로 변경
import { Experimental_Agent as Agent, isStepCount } from 'ai';
__PROVIDER_IMPORT__;
const agent = new Agent({
model: __MODEL__,
system: 'You are a helpful assistant.',
tools: {
// your tools here
},
stopWhen: isStepCount(20), // Required for multi-step agent loops
});
const result = await agent.generate({
prompt: 'What is the weather in San Francisco?',
});
import { ToolLoopAgent } from 'ai';
__PROVIDER_IMPORT__;
const agent = new ToolLoopAgent({
model: __MODEL__,
instructions: 'You are a helpful assistant.',
tools: {
// your tools here
},
// stopWhen defaults to isStepCount(20)
});
const result = await agent.generate({
prompt: 'What is the weather in San Francisco?',
});
에이전트 구축에 대해 자세히 알아보세요.
CoreMessage 제거 (CoreMessage Removal)
지원 중단된 CoreMessage 타입과 관련 함수가 제거되었습니다 (PR #10710). convertToCoreMessages를 convertToModelMessages로 바꾸세요.
import { convertToCoreMessages, type CoreMessage } from 'ai';
const coreMessages = convertToCoreMessages(messages); // CoreMessage[]
import { convertToModelMessages, type ModelMessage } from 'ai';
const modelMessages = await convertToModelMessages(messages); // ModelMessage[]
rename-core-message-to-model-message와rename-converttocoremessages-to-converttomodelmessagescodemod를 사용해 코드베이스를 자동으로 업데이트하세요.
generateObject와 streamObject 지원 중단
generateObject와 streamObject가 지원 중단되었습니다 (PR #10754).
향후 버전에서 제거될 예정입니다.
대신 output 설정과 함께 generateText와 streamText를 사용하세요.
import { generateObject } from 'ai';
__PROVIDER_IMPORT__;
import { z } from 'zod';
const { object } = await generateObject({
model: __MODEL__,
schema: z.object({
recipe: z.object({
name: z.string(),
ingredients: z.array(z.object({ name: z.string(), amount: z.string() })),
steps: z.array(z.string()),
}),
}),
prompt: 'Generate a lasagna recipe.',
});
import { generateText, Output } from 'ai';
__PROVIDER_IMPORT__;
import { z } from 'zod';
const { output } = await generateText({
model: __MODEL__,
output: Output.object({
schema: z.object({
recipe: z.object({
name: z.string(),
ingredients: z.array(
z.object({ name: z.string(), amount: z.string() }),
),
steps: z.array(z.string()),
}),
}),
}),
prompt: 'Generate a lasagna recipe.',
});
구조화된 데이터 스트리밍의 경우, streamObject를 streamText로 바꾸세요:
import { streamObject } from 'ai';
__PROVIDER_IMPORT__;
import { z } from 'zod';
const { partialObjectStream } = streamObject({
model: __MODEL__,
schema: z.object({
recipe: z.object({
name: z.string(),
ingredients: z.array(z.object({ name: z.string(), amount: z.string() })),
steps: z.array(z.string()),
}),
}),
prompt: 'Generate a lasagna recipe.',
});
for await (const partialObject of partialObjectStream) {
console.log(partialObject);
}
import { streamText, Output } from 'ai';
__PROVIDER_IMPORT__;
import { z } from 'zod';
const { partialOutputStream } = streamText({
model: __MODEL__,
output: Output.object({
schema: z.object({
recipe: z.object({
name: z.string(),
ingredients: z.array(
z.object({ name: z.string(), amount: z.string() }),
),
steps: z.array(z.string()),
}),
}),
}),
prompt: 'Generate a lasagna recipe.',
});
for await (const partialObject of partialOutputStream) {
console.log(partialObject);
}
구조화된 데이터 생성에 대해 자세히 알아보세요.
async convertToModelMessages
convertToModelMessages()는 async Tool.toModelOutput()를 지원하기 위해 AI SDK 6에서 비동기화되었습니다.
import { convertToModelMessages } from 'ai';
const modelMessages = convertToModelMessages(uiMessages);
import { convertToModelMessages } from 'ai';
const modelMessages = await convertToModelMessages(uiMessages);
add-await-converttomodelmessagescodemod를 사용해 코드베이스를 자동으로 업데이트하세요.
Tool.toModelOutput 변경
toModelOutput()은 AI SDK 6에서 output 속성을 가진 매개변수 객체를 받습니다.
AI SDK 5에서는 output이 인자였습니다.
import { tool } from 'ai';
const someTool = tool({
// ...
toModelOutput: output => {
// ...
},
});
import { tool } from 'ai';
const someTool = tool({
// ...
toModelOutput: ({ output }) => {
// ...
},
});
wrap-tomodeloutput-parametercodemod를 사용해 코드베이스를 자동으로 업데이트하세요.
함수 도구 정의에서 name 제거 (Remove name from Function Tool Definitions)
함수 도구 이름은 tools 객체의 키에서 가져옵니다. AI SDK 5에서는 name 속성이 Tool 타입의 프로바이더 정의 구성원의 일부였기 때문에 타입 검사를 통과할 수 있었지만, 함수 도구의 이름을 설정하지는 않았습니다. AI SDK 6 타입은 함수 도구 정의에서 이 속성을 더 이상 허용하지 않습니다.
tool()에서 name을 제거하고 tools 객체에서 의도한 이름을 키로 사용하세요:
import { tool } from 'ai';
import { z } from 'zod';
const tools = {
getWeather: tool({
name: 'getWeather',
inputSchema: z.object({}),
outputSchema: z.any(),
}),
};
import { tool } from 'ai';
import { z } from 'zod';
const tools = {
getWeather: tool({
inputSchema: z.object({}),
outputSchema: z.any(),
}),
};
LanguageModelUsage의 cachedInputTokens와 reasoningTokens 지원 중단
LanguageModelUsage의 cachedInputTokens와 reasoningTokens가 지원 중단되었습니다.
cachedInputTokens는 inputTokenDetails.cacheReadTokens로,
reasoningTokens는 outputTokenDetails.reasoningTokens로 바꿀 수 있습니다.
ToolCallOptions를 ToolExecutionOptions로 이름 변경
ToolCallOptions 타입이 ToolExecutionOptions로 이름이 변경되었고 이제 지원 중단되었습니다.
rename-tool-call-options-to-tool-execution-optionscodemod를 사용해 코드베이스를 자동으로 업데이트하세요.
도구별 스트릭트 모드 (Per-Tool Strict Mode)
도구의 스트릭트 모드는 이제 각 도구에 strict를 설정해 제어합니다 (PR #10817). 이것은 스트릭트 도구 호출에 대한 세밀한 제어를 가능하게 합니다. 스트릭트 모드는 특정 도구 입력 스키마에 의존하기 때문에 중요합니다.
__PROVIDER_IMPORT__;
import { streamText, tool } from 'ai';
import { z } from 'zod';
// Tool strict mode was controlled by strictJsonSchema
const result = streamText({
model: __MODEL__,
tools: {
calculator: tool({
description: 'A simple calculator',
inputSchema: z.object({
expression: z.string(),
}),
execute: async ({ expression }) => {
const result = eval(expression);
return { result };
},
}),
},
providerOptions: {
openai: {
strictJsonSchema: true, // Applied to all tools
},
},
});
__PROVIDER_IMPORT__;
import { streamText, tool } from 'ai';
import { z } from 'zod';
const result = streamText({
model: __MODEL__,
tools: {
calculator: tool({
description: 'A simple calculator',
inputSchema: z.object({
expression: z.string(),
}),
execute: async ({ expression }) => {
const result = eval(expression);
return { result };
},
strict: true, // Control strict mode per tool
}),
},
});
유연한 도구 콘텐츠 (Flexible Tool Content)
AI SDK 6은 더 유연한 도구 출력 및 결과 콘텐츠 지원을 도입합니다 (PR #9605). 이것은 더 풍부한 도구 상호작용과 복잡한 도구 실행 패턴에 대한 더 나은 지원을 가능하게 합니다.
ToolCallRepairFunction 시그니처
ToolCallRepairFunction 타입의 system 매개변수가 string 외에 SystemModelMessage도 받도록 변경되었습니다 (PR #10635). 이것은 캐싱 같은 프로바이더별 옵션을 포함한 더 유연한 시스템 메시지 구성을 허용합니다.
import type { ToolCallRepairFunction } from 'ai';
const repairToolCall: ToolCallRepairFunction<MyTools> = async ({
system, // type: string | undefined
messages,
toolCall,
tools,
inputSchema,
error,
}) => {
// ...
};
import type { ToolCallRepairFunction, SystemModelMessage } from 'ai';
const repairToolCall: ToolCallRepairFunction<MyTools> = async ({
system, // type: string | SystemModelMessage | undefined
messages,
toolCall,
tools,
inputSchema,
error,
}) => {
// Handle both string and SystemModelMessage
const systemText = typeof system === 'string' ? system : system?.content;
// ...
};
임베딩 모델 메서드 이름 변경 (Embedding Model Method Rename)
프로바이더의 textEmbeddingModel과 textEmbedding 메서드가 각각 embeddingModel과 embedding으로 이름이 변경되었습니다. 또한 EmbeddingModel, embed, embedMany에서 제네릭이 제거되었습니다 (PR #10592).
import { openai } from '@ai-sdk/openai';
import { embed } from 'ai';
// Using the full method name
const model = openai.textEmbeddingModel('text-embedding-3-small');
// Using the shorthand
const model = openai.textEmbedding('text-embedding-3-small');
const { embedding } = await embed({
model: openai.textEmbedding('text-embedding-3-small'),
value: 'sunny day at the beach',
});
import { openai } from '@ai-sdk/openai';
import { embed } from 'ai';
// Using the full method name
const model = openai.embeddingModel('text-embedding-3-small');
// Using the shorthand
const model = openai.embedding('text-embedding-3-small');
const { embedding } = await embed({
model: openai.embedding('text-embedding-3-small'),
value: 'sunny day at the beach',
});
rename-text-embedding-to-embeddingcodemod를 사용해 코드베이스를 자동으로 업데이트하세요.
경고 로거 (Warning Logger)
AI SDK 6은 지원 중단 경고와 모범 사례 권장사항을 출력하는 경고 로거를 도입합니다 (PR #8343).
경고 로깅을 비활성화하려면 AI_SDK_LOG_WARNINGS 환경 변수를 false로 설정하세요:
export AI_SDK_LOG_WARNINGS=false
경고 타입 통합 (Warning Type Unification)
각 생성 함수에 대한 별도의 경고 타입이 ai 패키지에서 내보내는 단일 Warning 타입으로 통합되었습니다 (PR #10631).
// Separate warning types for each generation function
import type {
CallWarning,
ImageModelCallWarning,
SpeechWarning,
TranscriptionWarning,
} from 'ai';
// Single Warning type for all generation functions
import type { Warning } from 'ai';
finish reason "unknown"이 "other"로 통합
unknown finish reason이 제거되었습니다. 이제 other로 반환됩니다.
AI SDK UI
도구 UI 파츠 승인 상태 (Tool UI Part Approval States)
AI SDK 6은 도구 UI 파츠 state union에 approval-requested, approval-responded, output-denied을 추가합니다. 완전한 switch 문과 다른 상태 처리를 세 개의 승인 상태를 다루도록 업데이트하세요.
switch (part.state) {
case 'input-streaming':
return 'Loading input';
case 'input-available':
return 'Input ready';
case 'approval-requested':
return 'Approval requested';
case 'approval-responded':
return 'Approval response received';
case 'output-available':
return 'Output ready';
case 'output-error':
return part.errorText;
case 'output-denied':
return 'Tool call denied';
}
채팅 UI에서 승인 요청과 응답을 처리하려면 도구 실행 승인을 참고하세요.
도구 UI 파츠 헬퍼 함수 이름 변경 (Tool UI Part Helper Functions Rename)
도구 UI 파츠 헬퍼 함수들이 그 목적을 더 잘 반영하고 정적/동적 도구 파츠를 모두 수용하도록 이름이 변경되었습니다 (PR #XXXX).
isToolUIPart → isStaticToolUIPart
isToolUIPart 함수가 정적 도구 파츠만 확인한다는 것을 명확히 하기 위해 isStaticToolUIPart로 이름이 변경되었습니다.
import { isToolUIPart } from 'ai';
// Check if a part is a tool UI part
if (isToolUIPart(part)) {
console.log(part.toolName);
}
import { isStaticToolUIPart } from 'ai';
// Check if a part is a static tool UI part
if (isStaticToolUIPart(part)) {
console.log(part.toolName);
}
isToolOrDynamicToolUIPart → isToolUIPart
isToolOrDynamicToolUIPart 함수가 isToolUIPart로 이름이 변경되었습니다. 이전 이름은 지원 중단되었지만 여전히 사용 가능합니다.
import { isToolOrDynamicToolUIPart } from 'ai';
// Check if a part is either a static or dynamic tool UI part
if (isToolOrDynamicToolUIPart(part)) {
console.log('Tool part found');
}
import { isToolUIPart } from 'ai';
// Check if a part is either a static or dynamic tool UI part
if (isToolUIPart(part)) {
console.log('Tool part found');
}
getToolName → getStaticToolName
getToolName 함수가 정적 도구 파츠에서만 도구 이름을 반환한다는 것을 명확히 하기 위해 getStaticToolName으로 이름이 변경되었습니다.
import { getToolName } from 'ai';
// Get the tool name from a tool part
const name = getToolName(toolPart);
import { getStaticToolName } from 'ai';
// Get the tool name from a static tool part
const name = getStaticToolName(toolPart);
getToolOrDynamicToolName → getToolName
getToolOrDynamicToolName 함수가 getToolName으로 이름이 변경되었습니다. 이전 이름은 지원 중단되었지만 여전히 사용 가능합니다.
import { getToolOrDynamicToolName } from 'ai';
// Get the tool name from either a static or dynamic tool part
const name = getToolOrDynamicToolName(toolPart);
import { getToolName } from 'ai';
// Get the tool name from either a static or dynamic tool part
const name = getToolName(toolPart);
프로바이더 (Providers)
OpenAI
strictJsonSchema 기본값이 True로 변경
JSON 출력과 도구 호출에 대한 strictJsonSchema 설정이 기본적으로 활성화됩니다 (PR #10752). 이것은 안정성을 향상시키고 스키마와 일치하는 유효한 JSON 출력을 보장합니다.
하지만 스트릭트 모드는 스키마 요구사항에 더 엄격합니다. 스키마 거부 오류가 발생하면 스키마를 조정하거나(예: undefined 대신 null 사용) 스트릭트 모드를 비활성화하세요.
import { openai } from '@ai-sdk/openai';
import { generateObject } from 'ai';
import { z } from 'zod';
// strictJsonSchema was false by default
const result = await generateObject({
model: openai('gpt-5.1'),
schema: z.object({
name: z.string(),
}),
prompt: 'Generate a person',
});
import { openai } from '@ai-sdk/openai';
import { generateObject } from 'ai';
import { z } from 'zod';
// strictJsonSchema is true by default
const result = await generateObject({
model: openai('gpt-5.1'),
schema: z.object({
name: z.string(),
}),
prompt: 'Generate a person',
});
// Disable strict mode if needed
const resultNoStrict = await generateObject({
model: openai('gpt-5.1'),
schema: z.object({
name: z.string(),
}),
prompt: 'Generate a person',
providerOptions: {
openai: {
strictJsonSchema: false,
} satisfies OpenAIResponsesProviderOptions,
},
});
채팅 모델에서 제거된 structuredOutputs 옵션
structuredOutputs 프로바이더 옵션이 채팅 모델에서 제거되었습니다 (PR #10752). strictJsonSchema를 대신 사용하세요.
Azure
기본 프로바이더가 Responses API 사용
@ai-sdk/azure 프로바이더가 azure()를 호출할 때 이제 기본적으로 Responses API를 사용합니다 (PR #9868). 이전 Chat Completions API 동작을 사용하려면 azure.chat()을 대신 사용하세요.
import { azure } from '@ai-sdk/azure';
// Used Chat Completions API
const model = azure('gpt-4o');
import { azure } from '@ai-sdk/azure';
// Now uses Responses API by default
const model = azure('gpt-4o');
// Use azure.chat() for Chat Completions API
const chatModel = azure.chat('gpt-4o');
// Use azure.responses() explicitly for Responses API
const responsesModel = azure.responses('gpt-4o');
Responses API와 Chat Completions API는 동작과 기본값이 다릅니다. Chat Completions API에 의존한다면 모델 인스턴스를
azure.chat()으로 전환하고 구성을 감사하세요.
Responses API providerMetadata와 providerOptions 키
Responses API의 경우 @ai-sdk/azure 프로바이더는 providerMetadata와 providerOptions에 openai 대신 azure를 키로 사용합니다. openai 키는 providerOptions 입력에 여전히 지원되지만, 결과 providerMetadata 출력은 이제 azure를 사용합니다.
import { azure } from '@ai-sdk/azure';
import { generateText } from 'ai';
const result = await generateText({
model: azure.responses('gpt-5-mini'), // use your own deployment
prompt: 'Hello',
providerOptions: {
openai: {
// AI SDK 5: use `openai` key for Responses API options
reasoningSummary: 'auto',
},
},
});
// Accessed metadata via 'openai' key
console.log(result.providerMetadata?.openai?.responseId);
import { azure } from '@ai-sdk/azure';
import { generateText } from 'ai';
const result = await generateText({
// azure() now uses the Responses API by default
model: azure('gpt-5-mini'), // use your own deployment
prompt: 'Hello',
providerOptions: {
azure: {
// AI SDK 6: use `azure` key for Responses API options
reasoningSummary: 'auto',
},
},
});
// Access metadata via 'azure' key
console.log(result.providerMetadata?.azure?.responseId);
Anthropic
구조화된 출력 모드 (Structured Outputs Mode)
Anthropic은 Claude Sonnet 4.5 이상 모델에 대한 기본 구조화된 출력을 도입했습니다 . @ai-sdk/anthropic 프로바이더는 이제 구조화된 출력이 생성되는 방식을 제어하는 structuredOutputMode 옵션을 포함합니다 (PR #10502).
사용 가능한 모드:
'outputFormat': Anthropic의 기본output_format매개변수 사용'jsonTool': 구조화된 출력 형식을 지정하는 특수 JSON 도구 사용'auto'(기본값): 모델이 지원하면'outputFormat'사용, 그렇지 않으면'jsonTool'로 폴백
import { anthropic } from '@ai-sdk/anthropic';
import { generateObject } from 'ai';
import { z } from 'zod';
const result = await generateObject({
model: anthropic('claude-sonnet-4-5-20250929'),
schema: z.object({
name: z.string(),
age: z.number(),
}),
prompt: 'Generate a person',
providerOptions: {
anthropic: {
// Explicitly set the structured output mode (optional)
structuredOutputMode: 'outputFormat',
} satisfies AnthropicProviderOptions,
},
});
Google Vertex
providerMetadata와 providerOptions 키
@ai-sdk/google-vertex 프로바이더가 providerMetadata와 providerOptions에 google 대신 vertex를 키로 사용합니다. google 키는 providerOptions 입력에 여전히 지원되지만, 결과 providerMetadata 출력은 이제 vertex를 사용합니다.
import { vertex } from '@ai-sdk/google-vertex';
import { generateText } from 'ai';
const result = await generateText({
model: vertex('gemini-2.5-flash'),
providerOptions: {
google: {
safetySettings: [
/* ... */
],
}, // Used 'google' key
},
prompt: 'Hello',
});
// Accessed metadata via 'google' key
console.log(result.providerMetadata?.google?.safetyRatings);
import { vertex } from '@ai-sdk/google-vertex';
import { generateText } from 'ai';
const result = await generateText({
model: vertex('gemini-2.5-flash'),
providerOptions: {
vertex: {
safetySettings: [
/* ... */
],
}, // Now uses 'vertex' key
},
prompt: 'Hello',
});
// Access metadata via 'vertex' key
console.log(result.providerMetadata?.vertex?.safetyRatings);
rename-vertex-provider-metadata-keycodemod를 사용해 코드베이스를 자동으로 업데이트하세요.
ai/test
Mock 클래스
V2 mock 클래스가 ai/test 모듈에서 제거되었습니다. 테스트에는 새 V3 mock 클래스를 사용하세요.
import {
MockEmbeddingModelV2,
MockImageModelV2,
MockLanguageModelV2,
MockProviderV2,
MockSpeechModelV2,
MockTranscriptionModelV2,
} from 'ai/test';
import {
MockEmbeddingModelV3,
MockImageModelV3,
MockLanguageModelV3,
MockProviderV3,
MockSpeechModelV3,
MockTranscriptionModelV3,
} from 'ai/test';
rename-mock-v2-to-v3codemod를 사용해 코드베이스를 자동으로 업데이트하세요.