`extractJsonMiddleware()`

extractJsonMiddleware()

extractJsonMiddleware는 markdown 코드 펜스(fence)와 기타 포맷팅을 제거하여 텍스트 내용에서 JSON을 추출하는 미들웨어 함수입니다. JSON 응답을 markdown 코드 블록(예: ```json ... ```)으로 감싸는 모델과 함께 Output.object()를 사용할 때 유용합니다.

출처: 문서

본문

import { extractJsonMiddleware } from 'ai';

const middleware = extractJsonMiddleware();

Import

import { extractJsonMiddleware } from "ai"

API Signature

Parameters (파라미터)

  • transform: (text: string) => string (선택) — 텍스트 내용에 적용할 커스텀 변환 함수입니다. 원시 텍스트를 받아 변환된 텍스트를 반환해야 합니다. 제공되지 않으면 기본 변환이 markdown 코드 펜스를 제거합니다.

Returns (반환값)

다음과 같은 동작을 하는 미들웨어 객체를 반환합니다.

  • 스트리밍과 비스트리밍 응답 모두 처리
  • 텍스트 내용에서 markdown 코드 펜스(```json, ```) 제거
  • transform 함수가 제공될 때 커스텀 변환 적용
  • 효율적인 버퍼링으로 적절한 스트리밍 동작 유지

Usage Examples (사용 예제)

기본 사용법

구조화된 출력을 사용할 때 모델 응답에서 markdown 코드 펜스를 제거합니다.

import {
  generateText,
  wrapLanguageModel,
  extractJsonMiddleware,
  Output,
} from 'ai';
import { z } from 'zod';

const result = await generateText({
  model: wrapLanguageModel({
    model: yourModel,
    middleware: extractJsonMiddleware(),
  }),
  output: Output.object({
    schema: z.object({
      recipe: z.object({
        name: z.string(),
        steps: z.array(z.string()),
      }),
    }),
  }),
  prompt: 'Generate a lasagna recipe.',
});

console.log(result.output);

스트리밍과 함께

미들웨어는 스트리밍 응답에서도 동작합니다.

import {
  streamText,
  wrapLanguageModel,
  extractJsonMiddleware,
  Output,
} from 'ai';
import { z } from 'zod';

const { partialOutputStream } = streamText({
  model: wrapLanguageModel({
    model: yourModel,
    middleware: extractJsonMiddleware(),
  }),
  output: Output.object({
    schema: z.object({
      recipe: z.object({
        ingredients: z.array(z.string()),
        steps: z.array(z.string()),
      }),
    }),
  }),
  prompt: 'Generate a detailed recipe.',
});

for await (const partialObject of partialOutputStream) {
  console.log(partialObject);
}

커스텀 변환 함수

다른 포맷팅을 사용하는 모델의 경우 커스텀 변환을 제공할 수 있습니다.

import { extractJsonMiddleware } from 'ai';

const middleware = extractJsonMiddleware({
  transform: text =>
    text
      .replace(/^PREFIX/, '')
      .replace(/SUFFIX$/, '')
      .trim(),
});

How It Works (동작 방식)

미들웨어는 텍스트 내용을 두 가지 방식으로 처리합니다.

비스트리밍 (generateText)

  1. 모델에서 완전한 응답을 받습니다.
  2. 변환 함수를 적용하여 markdown 펜스(또는 커스텀 포맷팅)를 제거합니다.
  3. 정리된 텍스트 내용을 반환합니다.

스트리밍 (streamText)

  1. 초기 내용을 버퍼링하여 markdown 펜스 접두사(```json\n)를 감지합니다.
  2. 펜스가 감지되면 접두사를 제거하고 스트리밍 모드로 전환합니다.
  3. 닫는 펜스(\n```)를 처리하기 위해 작은 접미사 버퍼를 유지합니다.
  4. 스트림이 끝나면 버퍼에서 끝부분 펜스를 제거합니다.
  5. 커스텀 변환의 경우 모든 내용을 버퍼링하고 마지막에 변환을 적용합니다.

이 방식은 여러 청크에 걸쳐 분할될 수 있는 코드 펜스를 올바르게 처리하면서 효율적인 스트리밍을 보장합니다.

더 알아보기 (Learn more)