【Chrome Writer API】ブラウザで動くAI文章生成。ストリーミング対応でリアルタイムにテキストを作成

| 6 min read

📝 記事について: 本記事は、50近辺のくたびれた貧乏なおっさんの筆者が「ほしいな~~」「かいたいな~~」と思った製品・サービスについて、公開情報を調べてまとめたものです。実際に製品やサービスを使用・体験したわけではありません。内容の正確性については、必ず公式情報やデータソースをご確認ください。

Writer APIは、Chromeに組み込まれたAIを使って文章を生成するためのWeb APIです。特徴は「作れる」だけじゃなく、実装者が迷いがちなストリーミング表示、コンテキストの渡し方、権限(iframe)、中断・破棄まで“型”として用意されていること。この記事では、公式の範囲だけで「簡単に読めるけど、内容はしっかり」を目指してまとめます。公式ドキュメント

このAPIのすごいところ

  • ストリーミング生成: writeStreaming()で文章が“逐次”届くので、チャットUIやエディタUIにそのまま流し込めます。公式
  • コンテキスト設計が現実的: タスクごとのcontextと、複数タスクで共有するsharedContextがあり、UI設計に落とし込みやすいです。公式
  • 権限制御が明確: デフォルトはトップレベル/同一オリジンiframe。クロスオリジンiframeはallow="writer"で委任できます。公式
  • 実験段階を明記: Writer APIは議論中で、今後変更される可能性が明記されています。公式

Writer APIで「何ができる」か

Writer APIは、指定したライティングタスクに沿って新しい文章を生成します。公式では、レビュー/ブログ/メールなど“書く作業”の支援が想定されています。公式

ここからは、公式に載っているサンプルを元に「実装するときの型」をまとめます。

実装の型1:ストリーミングで“書けていくUI”を作る

writeStreaming()は、文章が少しずつ到着するストリームを返します。公式サンプルでは、その断片を順にUIへ追記しています。公式

// Streaming (公式サンプルを要約)
const writer = await Writer.create({
  expectedInputLanguages: ["en"],
  expectedContextLanguages: ["en"],
  outputLanguage: "en",
});

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);
}

ポイント: 完成を待つのではなく“生成中”を見せられるので、停止・修正・再生成がしやすいUIになります。

実装の型2:sharedContextで“同じ前提”を複数タスクに使い回す

公式には、複数のタスクに共通の背景情報をsharedContextで渡す例があります。媒体・ルール・口調などを固定したい時に便利です。公式

// Shared context and per-task context (公式サンプルを要約)
const writer = await Writer.create({
  expectedInputLanguages: ["en"],
  expectedContextLanguages: ["en"],
  outputLanguage: "en",
  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 ...",
  { context: "The request comes from someone working at a startup ..." },
);

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

ポイント: sharedContextは“固定”、contextは“可変”として分離すると、UIがシンプルなまま運用できます。

実装の型3:writerの再利用(同じトーンで大量処理)

同じwriterは再利用できます。公式は、複数レビューをまとめて処理する例を示しています。公式

// 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)
  ),
);

実装の型4:中断(abort)と破棄(destroy)で、UIを安全に

生成を止めたいときはAbortControllerで中断し、不要になったwriterはdestroy()で破棄します。停止ボタンを置ける設計が公式にあります。公式

// Aborting / Destroying (公式サンプルを要約)
const controller = new AbortController();
stopButton.onclick = () => controller.abort();

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

writer.destroy();

制限と権限:iframe / Permission Policy / Web Worker

Writer APIはトップレベルウィンドウと同一オリジンiframeで利用できます。クロスオリジンiframeに委任する場合は、ホスト側でallow="writer"を設定します。公式

<iframe src="https://cross-origin.example.com/" allow="writer"></iframe>

また、Writer APIはWeb Workerでは利用できないと明記されています。公式

重要:仕様は変わる可能性がある(実験段階)

Writer APIは活発に議論されている段階で、今後変更される可能性があります。導入時は、公式ドキュメントの更新とステータス確認、フィードバック導線を前提に設計しておくのが安全です。公式

すぐ使える「導入チェックリスト」

  • UI: ストリーミング追記+停止ボタン(abort)
  • 入力: sharedContext(固定)+context(可変)で分離
  • 埋め込み: iframeならallow="writer"(必要な時だけ)
  • 運用: 実験段階なので、公式リンクを必ず残す

Artist's Perspective

「文章は“最終成果物”だけでなく、思考の足場でもあります。Writer APIの面白さは、生成結果よりも“生成のプロセス”をUIに載せられる点。ストリーミングで文字が立ち上がる瞬間を、作品の一部として見せられるのは、ブラウザ上の表現としてかなり強いです。」

データソース・参考リンク

本記事は以下の情報源を参考にしています。内容の正確性については、必ず元のデータソースをご確認ください。