콘텐츠로 이동

AI SDK 연동

Agents SDK는 기본적으로 Responses API 또는 Chat Completions API를 통해 OpenAI 모델과 연동됩니다. 그러나 다른 모델을 사용하려는 경우 Vercel AI SDK가 지원하는 다양한 모델을 이 어댑터를 통해 Agents SDK로 가져올 수 있습니다.

  1. 확장 패키지를 설치하여 AI SDK 어댑터를 설치합니다.

    터미널 창
    npm install @openai/agents-extensions
  2. Vercel AI SDK에서 원하는 모델 패키지를 선택하여 설치합니다.

    터미널 창
    npm install @ai-sdk/openai
  3. 에이전트에 연결할 어댑터와 모델을 가져옵니다.

    어댑터 가져오기
    import { openai } from '@ai-sdk/openai';
    import { aisdk } from '@openai/agents-extensions/ai-sdk';
  4. 에이전트가 사용할 모델 인스턴스를 초기화합니다.

    모델 생성
    import { openai } from '@ai-sdk/openai';
    import { aisdk } from '@openai/agents-extensions/ai-sdk';
    const model = aisdk(openai('gpt-5.4'));
AI SDK 설정
import { Agent, run } from '@openai/agents';
// Import the model package you installed
import { openai } from '@ai-sdk/openai';
// Import the adapter
import { aisdk } from '@openai/agents-extensions/ai-sdk';
// Create a model instance to be used by the agent
const model = aisdk(openai('gpt-5.4'));
// Create an agent with the model
const agent = new Agent({
name: 'My Agent',
instructions: 'You are a helpful assistant.',
model,
});
// Run the agent with the new model
run(agent, 'What is the capital of Germany?');

메시지와 함께 프로바이더별 옵션을 보내야 하는 경우 providerMetadata를 통해 전달합니다. 값은 기본 AI SDK 모델로 직접 전달됩니다. 예를 들어 Agents SDK의 다음 providerData는

Agents SDK providerData
const providerData = {
anthropic: {
cacheControl: {
type: 'ephemeral',
},
},
};

AI SDK 연동을 사용할 때 다음과 같이 변환됩니다.

AI SDK providerMetadata
const providerMetadata = {
anthropic: {
cacheControl: {
type: 'ephemeral',
},
},
};

프로바이더가 openai.responses인 AI SDK 모델의 경우, 모델이 AI SDK 사양 버전 v3 또는 v4를 사용하면 어댑터가 스트리밍 및 비스트리밍 요청에서 modelSettings.promptCacheRetention을 전달합니다. Agents SDK 값 'in-memory'는 AI SDK 프로바이더 값 'in_memory'로 매핑하며, '24h'와 null은 변경 없이 전달합니다.

AI SDK v2 모델은 이 옵션을 지원하지 않으므로, 이 옵션이 설정되어 있으면 어댑터는 모델 요청을 수행하기 전에 UserError를 발생시킵니다. 명시적인 modelSettings.providerData.providerOptions.openai.promptCacheRetention 값이 modelSettings.promptCacheRetention보다 우선하며, 어댑터는 이 설정을 다른 AI SDK 프로바이더로 전달하지 않습니다.

이 설정은 레거시 최대 유지 정책을 제어하며 특정 모델에서만 지원됩니다. 현재 모델 호환성과 최신 캐시 수명 제어 기능은 프롬프트 캐시 유지를 참고하세요.

AI SDK 어댑터는 Agents SDK의 input_file 콘텐츠를 AI SDK v2, v3, v4 모델에서 요구하는 파일 파트 형식으로 변환합니다. PDF는 다음과 같은 형식으로 제공할 수 있습니다.

  • data:application/pdf;base64,...와 같은 base64 데이터 URL
  • .pdf 파일 이름 또는 providerData.mediaType이 지정된 비어 있지 않은 원문 base64
  • .pdf 경로 또는 providerData.mediaType이 지정된 공개 HTTP(S) URL

파일 이름 또는 URL 경로가 .pdf로 끝나면 어댑터가 application/pdf를 추론합니다. 그렇지 않으면 providerData: { mediaType: 'application/pdf' }를 명시적으로 설정합니다. 어댑터는 공개 URL을 다운로드하지 않고 AI SDK 모델로 직접 전달하므로, 선택한 프로바이더와 모델이 URL 기반 PDF 파일 파트를 지원해야 합니다. 지원하지 않는 경우에는 base64 표현을 사용합니다. AI SDK 어댑터에서는 OpenAI 파일 ID가 지원되지 않습니다. 파일 데이터 또는 공개 URL을 전달하거나 OpenAI Responses 모델을 직접 사용하세요.

일부 프로바이더는 JSON 코드 펜스와 같은 추가 래핑이 포함된 일반 텍스트로 구조화된 출력을 반환합니다. Agents 런타임이 최종 출력을 검증하기 전에 프로바이더별 정리가 필요하다면 어댑터를 생성할 때 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는 비스트리밍 응답의 최종 어시스턴트 텍스트와 스트리밍 응답의 최종 response_done 이벤트에서 실행됩니다. 증분 output_text_delta 이벤트는 수정하지 않습니다.

modelSettings.retry는 기본 OpenAI 프로바이더에서만 구현되는 것이 아니라 Agents 런타임에서 구현되므로 AI SDK 기반 모델에서도 작동합니다.

따라서 다른 곳에서 사용하는 것과 동일한 재시도 설정을 적용할 수 있습니다.

  • Agent, Runner 또는 둘 다에 modelSettings.retry 설정
  • networkError(), httpStatus([...]), providerSuggested()와 같은 retryPolicies 조합
  • 래핑된 AI SDK 모델이 어댑터를 통해 재시도 권고를 노출할 수 있는 경우에만 providerSuggested()가 유용하다는 점에 유의

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를 반환할 수 있도록 합니다.
  • @openai/agents-extensions/ai-sdk 어댑터는 아직 베타 버전이므로, 선택한 프로바이더에서 신중하게 테스트하는 것이 좋습니다. 특히 규모가 작은 프로바이더의 경우 더욱 그렇습니다.
  • OpenAI 모델을 사용하는 경우 이 어댑터 대신 기본 OpenAI 모델 프로바이더를 사용하는 것이 좋습니다.
  • 지원되는 AI SDK 프로바이더는 specificationVersion v2, v3 또는 v4를 노출해야 합니다. 레거시 v1 프로바이더 예제는 더 이상 제공되지 않습니다. 지원되는 프로바이더 인터페이스를 사용하는 예제는 examples/ai-sdk를 참고하세요.
  • 이 어댑터를 통해 컴퓨터 도구를 사용하려면 디스플레이 메타데이터가 필요합니다. 도구에 environment와 dimensions 메타데이터가 모두 포함되어 있는지 확인하세요.
  • 여기서는 지연된 Responses 도구 로딩 흐름을 지원하지 않습니다. 여기에는 toolNamespace(), deferLoading: true가 지정된 함수 도구, toolSearchTool()이 포함됩니다. 도구 검색이 필요하다면 OpenAI Responses 모델을 직접 사용하세요. 도구와 모델을 참고하세요.
  • AI SDK 모델 어댑터는 Programmatic Tool Calling을 지원하지 않습니다. programmaticToolCallingTool(), allowedCallers에 'programmatic'이 포함된 도구, Programmatic Tool Calling 기록 항목, Responses outputSchema를 거부합니다. 이러한 기능에는 OpenAI Responses 모델을 직접 사용하세요.

어댑터는 원격 URL, base64 데이터, OpenAI 파일 ID를 포함하여 함수 도구가 반환한 ToolOutputImage 값을 유지합니다. AI SDK v2 모델은 media 파트를 받습니다. AI SDK v3 모델은 image-url, image-data 또는 image-file-id 파트를 받습니다. AI SDK v4 모델은 데이터가 URL, 인라인 데이터 또는 파일 ID의 프로바이더 참조로 표현된 file 파트를 받습니다. 따라서 지원되는 각 모델 버전에서 원래 이미지 표현을 사용할 수 있습니다.

전체 예제는 examples/ai-sdk/image-tool-output.ts를 참고하세요.

@openai/agents-extensions/ai-sdk-ui는 Agents SDK 스트림을 AI SDK UI 라우트에 연결하기 위한 응답 헬퍼를 제공합니다.

  • 일반 텍스트 스트리밍 응답을 위한 createAiSdkTextStreamResponse(source, options?)
  • 저수준 ReadableStream<UIMessageChunk>을 위한 createAiSdkUiMessageStream(source)
  • UIMessageChunk 스트리밍 응답을 위한 createAiSdkUiMessageStreamResponse(source, options?)

이러한 헬퍼는 StreamedRunResult, 스트림과 유사한 소스 또는 호환되는 래퍼 객체를 받을 수 있습니다. 응답 헬퍼는 스트리밍에 적합한 헤더가 포함된 Response를 반환합니다.

라우트에서 AI SDK 응답을 직접 반환해야 하는 경우 createAiSdkUiMessageStreamResponse(...)를 사용합니다. 유지 관리되는 Agents SDK와 AI SDK 간 UIMessageChunk 변환을 계속 사용하면서 응답 또는 렌더링 계층을 직접 제어하려면 createAiSdkUiMessageStream(...)을 사용합니다. 일반 텍스트만 필요한 경우 createAiSdkTextStreamResponse(...)를 사용합니다.

AI SDK 모델 어댑터가 Programmatic Tool Calling 흐름을 시작할 수는 없지만, UI 스트림 헬퍼는 Programmatic Tool Calling을 사용하는 스트리밍된 OpenAI Responses 실행을 래핑할 수 있습니다. 프로그램 항목은 programmatic_tool_calling 도구 입력으로 내보내고, 일치하는 프로그램 결과는 program_output 도구 출력으로 내보냅니다.

응답 헬퍼는 options를 통해 선택적 응답 설정도 받을 수 있습니다.

  • headers: 스트리밍 응답에 병합할 추가 응답 헤더
  • status: 반환되는 Response의 HTTP 상태 코드
  • statusText: 반환되는 Response의 HTTP 상태 텍스트

저수준 UI 메시지 스트림 예제:

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 라우트 예제:

UI 메시지 스트림 응답
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 앱을 참고하세요.