Writer API

게시일: 2025년 5월 20일

설명 확장 프로그램 Chrome 상태 인텐트
GitHub 오리진 트라이얼 오리진 트라이얼 오리진 트라이얼 오리진 트라이얼 View 실험 의도

Writer API를 사용하면 지정된 쓰기 작업에 부합하는 새 콘텐츠를 만들 수 있습니다. Writer API와 Rewriter APIWriting Assistance API 제안의 일부입니다.

이러한 파트너 API는 사용자가 만든 콘텐츠를 개선하는 데 도움이 됩니다.

사용 사례

초기 아이디어와 선택적 컨텍스트를 기반으로 새 콘텐츠를 작성합니다. 이 정보는 다음 용도로 사용될 수 있습니다.

  • 사용자가 리뷰, 블로그 게시물, 이메일 등 모든 종류의 콘텐츠를 작성하도록 지원합니다.
  • 사용자가 더 나은 지원 요청을 작성할 수 있도록 지원합니다.
  • 특정 기술을 더 잘 포착하기 위해 일련의 작업 샘플에 대한 소개를 작성합니다.

사용 사례가 누락되었나요? 사전 체험 프로그램에 참여하여 의견을 공유하세요.

시작하기

Chrome 137~142에서 실행되는 Writer API 오리진 트라이얼에 참여하세요.

하드웨어 요구사항 검토

Chrome에서 이러한 API를 사용하여 기능을 작동하는 개발자와 사용자에게는 다음 요구사항이 적용됩니다. 다른 브라우저에는 다른 운영 요구사항이 있을 수 있습니다.

Language Detector API와 Translator API는 데스크톱의 Chrome에서 작동합니다. 이러한 API는 모바일 기기에서 작동하지 않습니다. 다음 조건을 충족하는 경우 Chrome에서 Prompt API, Summarizer API, Writer API, Rewriter API가 작동합니다.

  • 운영체제: Windows 10 또는 11, macOS 13 이상 (Ventura 이상), Linux Android, iOS, ChromeOS용 Chrome은 아직 Gemini Nano를 사용하는 API에서 지원되지 않습니다.
  • 저장용량: Chrome 프로필이 포함된 볼륨에 22GB 이상
  • GPU: VRAM이 4GB보다 커야 합니다.
  • 네트워크: 무제한 데이터 또는 무제한 연결

Gemini Nano의 정확한 크기는 약간 다를 수 있습니다. 현재 크기를 확인하려면 chrome://on-device-internals로 이동하여 모델 상태를 확인하세요. 나열된 파일 경로를 열어 모델 크기를 확인합니다.

오리진 트라이얼 신청

Writer API는 Rewriter API와 함께 공동 오리진 트라이얼에서 사용할 수 있습니다. 이러한 API를 사용하려면 다음 단계를 따르세요.

  1. Google 생성형 AI에 관한 금지된 사용 정책을 확인합니다.
  2. Writer API 오리진 트라이얼로 이동합니다.
  3. 등록을 클릭하고 양식을 작성합니다. 웹 출처 필드에 출처 또는 확장 프로그램 ID(chrome-extension://YOUR_EXTENSION_ID)를 입력합니다.
  4. 제출하려면 등록을 클릭합니다.
  5. 제공된 토큰을 복사하여 원본의 모든 참여 웹페이지에 추가하거나 확장 프로그램 매니페스트에 포함합니다.
  6. Writer 및 Rewriter API를 사용하기 시작합니다.

오리진 트라이얼을 시작하는 방법을 자세히 알아보세요.

localhost 지원 추가

오리진 트라이얼 중에 localhost에서 Writer 및 Rewriter API에 액세스하려면 Chrome을 최신 버전으로 업데이트해야 합니다. 그런 다음 아래 단계를 따르세요.

  1. chrome://flags/#writer-api-for-gemini-nano 페이지로 이동합니다.
  2. 사용 설정됨을 선택합니다.
  3. 다시 시작을 클릭하거나 Chrome을 다시 시작합니다.

Writer API 사용

먼저 기능 감지를 실행하여 브라우저가 이러한 API를 지원하는지 확인합니다.

if ('Writer' in self) {
  // The Writer API is supported.
}

Writer API와 기타 모든 내장 AI API는 브라우저에 통합되어 있습니다. Gemini Nano는 웹사이트에서 기본 제공 AI API를 처음 사용할 때 별도로 다운로드됩니다. 실제로 사용자가 이미 기본 제공 API와 상호작용한 경우 모델을 브라우저에 다운로드한 것입니다.

모델을 사용할 준비가 되었는지 확인하려면 비동기 Writer.availability() 함수를 호출합니다. 다음 네 가지 값을 사용할 수 있는 문자열을 반환합니다.

  • unavailable: 브라우저가 Writer API를 지원하지만 현재는 사용할 수 없습니다. 모델을 다운로드할 수 있는 사용 가능한 디스크 공간이 부족한 등 여러 가지 이유가 있을 수 있습니다.
  • available: 브라우저가 Writer API를 지원하며 바로 사용할 수 있습니다.
  • downloadable: 브라우저가 Writer API를 지원하지만 먼저 모델을 다운로드해야 합니다.
  • downloading: 브라우저가 Writer API를 지원하며 현재 모델을 다운로드하고 있습니다.

모델 다운로드를 트리거하고 작성기를 시작하려면 Writer.create() 함수를 호출하세요. availability()에 대한 대답이 downloadable인 경우 다운로드 진행률을 수신 대기하고 사용자에게 알립니다. 다운로드에 시간이 걸릴 수 있기 때문입니다.

const writer = await Writer.create({
  monitor(m) {
    m.addEventListener("downloadprogress", e => {
      console.log(`Downloaded ${e.loaded * 100}%`);
    });
  }
});

API 함수

create() 함수를 사용하면 새 작성기 객체를 구성할 수 있습니다. 다음 매개변수가 있는 선택적 options 객체를 사용합니다.

  • tone: 글의 어조는 콘텐츠의 스타일, 캐릭터 또는 태도를 나타낼 수 있습니다. 값은 formal, neutral (기본값) 또는 casual로 설정할 수 있습니다.
  • format: 출력 형식입니다. 허용되는 값은 markdown(기본값) 및 plain-text입니다.
  • length: 출력의 길이입니다. 허용되는 값은 short, medium (기본값), long입니다.
  • sharedContext: 여러 출력을 작성할 때 공유 컨텍스트를 사용하면 모델이 사용자의 기대에 더 부합하는 콘텐츠를 만들 수 있습니다.

다음 예에서는 writer 객체를 시작하는 방법을 보여줍니다.

const options = {
  sharedContext: 'This is an email to acquaintances about an upcoming event.',
  tone: 'casual',
  format: 'plain-text',
  length: 'medium',
};

const available = await Writer.availability();
let writer;
if (available === 'unavailable') {
  // The Writer API isn't usable.
  return;
}
if (available === 'available') {
  // The Writer API can be used immediately .
  writer = await Writer.create(options);
} else {
  // The Writer can be used after the model is downloaded.
  const writer = await Writer.create({
    ...options,
    monitor(m) {
      m.addEventListener("downloadprogress", e => {
        console.log(`Downloaded ${e.loaded * 100}%`);
      });
    }
  });
}

글 작성

모델에서 글을 출력하는 방법에는 스트리밍과 비스트리밍 두 가지가 있습니다.

비스트리밍 출력

비스트리밍 쓰기를 사용하면 모델이 입력을 전체적으로 처리한 다음 출력을 생성합니다.

스트리밍되지 않는 출력을 가져오려면 비동기 write() 함수를 호출하세요. 작성하려는 콘텐츠에 대한 프롬프트를 포함해야 합니다. 선택사항인 context를 추가하여 모델에 배경 정보를 제공할 수 있습니다. 이렇게 하면 모델이 출력에 대한 기대치를 더 잘 충족할 수 있습니다.

// Non-streaming
const writer = await Writer.create();
const result = await writer.write(
  "An inquiry to my bank about how to enable wire transfers on my account.", {
    context: "I'm a longstanding customer",
  },
);

스트림 쓰기 출력

스트리밍은 결과를 실시간으로 제공합니다. 입력이 추가되고 조정되면 출력이 지속적으로 업데이트됩니다.

스트리밍 작성기를 가져오려면 writeStreaming() 함수를 호출하고 스트림에서 사용 가능한 텍스트 세그먼트를 반복합니다. 선택사항인 context를 추가하여 모델에 배경 정보를 제공할 수 있습니다. 이렇게 하면 모델이 출력에 대한 기대치를 더 잘 충족할 수 있습니다.

// Streaming
const writer = await Writer.create();
const stream = writer.writeStreaming(
  "An inquiry to my bank about how to enable wire transfers on my account.", {
    context: "I'm a longstanding customer",
  },
);
for await (const chunk of stream) {
  composeTextbox.append(chunk);
}

여러 작업의 컨텍스트 공유

writer를 사용하여 여러 콘텐츠를 생성할 수 있습니다. 이 경우 sharedContext를 추가하는 것이 유용합니다. 예를 들어 검토자가 댓글에서 더 나은 의견을 제공할 수 있도록 지원할 수 있습니다.

// Shared context and per writing task context
const writer = await Writer.create({
sharedContext: "This is for publishing on [popular website name], a business and employment-focused social media platform."
});

const stream = writer.writeStreaming(
  "Write a blog post about how I love all this work on gen AI at Google!" +
  "Mention that there's so much to learn and so many new things I can do!",
  { context: " The request comes from someone working at a startup providing an e-commerce CMS solution."}
);

for await (const chunk of stream) {
  composeTextbox.append(chunk);
}

작성자 재사용

동일한 작성자를 사용하여 여러 콘텐츠를 만들 수 있습니다.

// Reuse a writer
const writer = await Writer.create({ tone: "formal" });

const reviews = await Promise.all(
  Array.from(
    document.querySelectorAll("#reviews > .review"),
    (reviewEl) => writer.write(reviewEl.textContent)
  ),
);

작성자 중지

쓰기 프로세스를 종료하려면 컨트롤러를 중단하고 작성기를 삭제합니다.

// Aborting a writer
const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const writer = await Writer.create({ signal: controller.signal });
await writer.write(reviewEl.textContent, { signal: controller.signal });

// Destroying a writer
writer.destroy();

데모

참여 및 의견 공유

Writer 및 Rewriter API는 현재 활발히 논의되고 있으며 향후 변경될 수 있습니다. 이 API를 사용해 보고 의견이 있으면 알려주세요.

브라우저에서 Gemini Nano 및 기타 전문가 모델을 비롯한 모델을 사용하는 모든 기본 제공 AI API를 살펴봅니다.