AI SDK 연동
기본적으로 Agents SDK는 Responses API 또는 Chat Completions API를 통해 OpenAI 모델과 함께 동작합니다. 하지만 다른 모델을 사용하려는 경우, Vercel AI SDK는 이 어댑터를 통해 Agents SDK에 연결할 수 있는 다양한 지원 모델을 제공합니다.
-
extensions 패키지를 설치하여 AI SDK 어댑터를 설치합니다
Terminal window npm install @openai/agents-extensions -
Vercel의 AI SDK에서 원하는 모델 패키지를 선택해 설치합니다
Terminal window npm install @ai-sdk/openai -
어댑터와 모델을 import하여 에이전트에 연결합니다
어댑터 import import { openai } from '@ai-sdk/openai';import { aisdk } from '@openai/agents-extensions/ai-sdk'; -
에이전트에서 사용할 모델 인스턴스를 초기화합니다
모델 생성 import { openai } from '@ai-sdk/openai';import { aisdk } from '@openai/agents-extensions/ai-sdk';const model = aisdk(openai('gpt-5.4'));
코드 예제
섹션 제목: “코드 예제”import { Agent, run } from '@openai/agents';
// Import the model package you installedimport { openai } from '@ai-sdk/openai';
// Import the adapterimport { aisdk } from '@openai/agents-extensions/ai-sdk';
// Create a model instance to be used by the agentconst model = aisdk(openai('gpt-5.4'));
// Create an agent with the modelconst agent = new Agent({ name: 'My Agent', instructions: 'You are a helpful assistant.', model,});
// Run the agent with the new modelrun(agent, 'What is the capital of Germany?');provider 메타데이터 전달
섹션 제목: “provider 메타데이터 전달”메시지와 함께 provider별 옵션을 보내야 한다면 providerMetadata를 통해 전달하세요. 값은 하위 AI SDK 모델로 직접 전달됩니다. 예를 들어, Agents SDK의 다음 providerData는
const providerData = { anthropic: { cacheControl: { type: 'ephemeral', }, },};AI SDK 연동을 사용할 때 다음과 같이 변환됩니다
const providerMetadata = { anthropic: { cacheControl: { type: 'ephemeral', }, },};최종 출력 텍스트 정규화
섹션 제목: “최종 출력 텍스트 정규화”일부 provider는 JSON 코드 펜스처럼 추가 래핑이 포함된 일반 텍스트로 structured outputs를 반환합니다. Agents 런타임이 최종 출력을 검증하기 전에 provider별 정리가 필요하다면, 어댑터를 생성할 때 transformOutputText를 전달하세요.
import { openai } from '@ai-sdk/openai';import { aisdk } from '@openai/agents-extensions/ai-sdk';
const model = aisdk(openai('gpt-5.4'), { transformOutputText(text) { return text.match(/```(?:json)?\s*([\s\S]*?)\s*```/)?.[1]?.trim() ?? text; },});transformOutputText는 비스트리밍 응답에서는 최종 assistant 텍스트에 대해, 스트리밍 응답에서는 최종 response_done 이벤트에 대해 실행됩니다. 점진적인 output_text_delta 이벤트는 수정하지 않습니다.
재시도
섹션 제목: “재시도”modelSettings.retry는 AI SDK 기반 모델에서도 동작합니다. 재시도는 기본 OpenAI provider에만 있는 것이 아니라 Agents 런타임에서 구현되기 때문입니다.
즉, 다른 곳에서 사용하는 것과 동일한 재시도 구성을 연결할 수 있습니다.
Agent,Runner, 또는 둘 다에modelSettings.retry를 설정합니다networkError(),httpStatus([...]),providerSuggested()같은retryPolicies를 조합합니다providerSuggested()는 래핑된 AI SDK 모델이 어댑터를 통해 재시도 관련 조언을 노출할 수 있을 때만 도움이 된다는 점에 유의하세요
aisdk(openai(...))를 사용하는 전체 예제는 examples/ai-sdk/retry.ts를 참고하세요. 스트리밍과 상태를 가지는 후속 요청의 안전 경계를 포함한 재시도 API 자체는 모델 가이드를 참고하세요.
적절한 연동 선택
섹션 제목: “적절한 연동 선택”@openai/agents-extensions에는 서로 관련된 두 가지 연동이 있습니다.
@openai/agents-extensions/ai-sdk는 AI SDK 모델을 어댑트하여Agent가 그 위에서 실행될 수 있게 합니다@openai/agents-extensions/ai-sdk-ui는 스트리밍되는 Agents SDK 실행을 어댑트하여 AI SDK UI 라우트가 표준 스트리밍Response를 반환할 수 있게 합니다
AI SDK 모델 관련 참고 사항
섹션 제목: “AI SDK 모델 관련 참고 사항”@openai/agents-extensions/ai-sdk어댑터는 아직 beta이므로, 특히 규모가 작은 provider를 사용할 때는 신중하게 테스트하는 것이 좋습니다- OpenAI 모델을 사용하는 경우, 이 어댑터 대신 기본 OpenAI 모델 provider를 우선 사용하는 것이 좋습니다
- 지원되는 AI SDK provider는
specificationVersionv2또는v3를 노출해야 합니다. 이전 v1 provider 스타일이 필요하다면 examples/ai-sdk-v1의 모듈을 프로젝트로 복사하세요 - 컴퓨터 도구는 이 어댑터를 통해 사용할 때 디스플레이 메타데이터가 필요합니다. 도구에
environment와dimensions메타데이터가 모두 포함되어 있는지 확인하세요 - Deferred Responses 도구 로딩 플로우는 여기서 지원되지 않습니다. 여기에는
toolNamespace(),deferLoading: true가 설정된 함수 도구,toolSearchTool()이 포함됩니다. 도구 검색이 필요하다면 OpenAI Responses 모델을 직접 사용하세요. 도구 가이드와 모델 가이드를 참고하세요
AI SDK UI 스트림 헬퍼
섹션 제목: “AI SDK UI 스트림 헬퍼”@openai/agents-extensions/ai-sdk-ui는 Agents SDK 스트림을 AI SDK UI 라우트에 연결하기 위한 응답 헬퍼를 제공합니다.
- 일반 텍스트 스트리밍 응답용
createAiSdkTextStreamResponse(source, options?) - 더 낮은 수준의
ReadableStream<UIMessageChunk>용createAiSdkUiMessageStream(source) UIMessageChunk스트리밍 응답용createAiSdkUiMessageStreamResponse(source, options?)
이 헬퍼들은 StreamedRunResult, 스트림과 유사한 source, 또는 호환되는 래퍼 객체를 받을 수 있습니다. 응답 헬퍼는 스트리밍에 적합한 헤더가 포함된 Response를 반환합니다.
라우트가 AI SDK 응답을 직접 반환해야 한다면 createAiSdkUiMessageStreamResponse(...)를 사용하세요. 응답 또는 렌더링 계층을 직접 제어하면서도 유지관리되는 Agents SDK에서 AI SDK UIMessageChunk로의 변환을 사용하려면 createAiSdkUiMessageStream(...)를 사용하세요. 일반 텍스트만 원한다면 createAiSdkTextStreamResponse(...)를 사용하세요.
응답 헬퍼는 options를 통해 선택적 응답 설정도 받을 수 있습니다.
headers: 스트리밍 응답에 병합할 추가 응답 헤더status: 반환되는Response의 HTTP 상태 코드statusText: 반환되는Response의 HTTP 상태 텍스트
하위 수준 UI 메시지 스트림 예제:
import { Agent, run } from '@openai/agents';import { createAiSdkUiMessageStream } from '@openai/agents-extensions/ai-sdk-ui';
const agent = new Agent({ name: 'Assistant', instructions: 'Reply with a short answer.',});
export async function createStream() { const stream = await run(agent, 'Hello there.', { stream: true }); return createAiSdkUiMessageStream(stream);}UI 메시지 스트리밍용 Next.js 라우트 예제:
import { Agent, run } from '@openai/agents';import { createAiSdkUiMessageStreamResponse } from '@openai/agents-extensions/ai-sdk-ui';
const agent = new Agent({ name: 'Assistant', instructions: 'Reply with a short answer.',});
export async function POST() { const stream = await run(agent, 'Hello there.', { stream: true }); return createAiSdkUiMessageStreamResponse(stream);}텍스트 전용 스트리밍용 Next.js 라우트 예제:
import { Agent, run } from '@openai/agents';import { createAiSdkTextStreamResponse } from '@openai/agents-extensions/ai-sdk-ui';
const agent = new Agent({ name: 'Assistant', instructions: 'Reply with a short answer.',});
export async function POST() { const stream = await run(agent, 'Hello there.', { stream: true }); return createAiSdkTextStreamResponse(stream);}엔드 투 엔드 사용법은 이 저장소의 examples/ai-sdk-ui 앱을 참고하세요.