GEMINI LABEN
LOGS — Interactions APIの開発者ログがGoogle AI Studioのダッシュボードで閲覧できるようになりました。対応する呼び出しのログをそのまま確認できますOMNI — Gemini Omni Flashが公開プレビューで登場。テキストや静止画から720pの3〜10秒動画を生成でき、会話形式での動画編集にも対応しますNANO — Nano Banana 2 Liteが登場。Geminiの画像モデルの中で最速・最も低コストと位置づけられ、大量生成やコスト重視の用途に向きますSSRF — Gemini Enterprise Agent PlatformのAgent Studioで、7月1日以前に作成されたアプリに影響するSSRF脆弱性が修正されましたSTUDIO — Google AI StudioからGemini Omni FlashをAPI経由で試せます。動的な動画ワークフローを自作できますVERTEX — Vertex AIのリリースノートが更新を続け、生成AI機能の追加が進んでいますLOGS — Interactions APIの開発者ログがGoogle AI Studioのダッシュボードで閲覧できるようになりました。対応する呼び出しのログをそのまま確認できますOMNI — Gemini Omni Flashが公開プレビューで登場。テキストや静止画から720pの3〜10秒動画を生成でき、会話形式での動画編集にも対応しますNANO — Nano Banana 2 Liteが登場。Geminiの画像モデルの中で最速・最も低コストと位置づけられ、大量生成やコスト重視の用途に向きますSSRF — Gemini Enterprise Agent PlatformのAgent Studioで、7月1日以前に作成されたアプリに影響するSSRF脆弱性が修正されましたSTUDIO — Google AI StudioからGemini Omni FlashをAPI経由で試せます。動的な動画ワークフローを自作できますVERTEX — Vertex AIのリリースノートが更新を続け、生成AI機能の追加が進んでいます
記事一覧/開発ツール
開発ツール/2026-06-02上級

Bun と Hono で Gemini API の軽量バックエンドを組む — 個人開発の小さなツールを自分の手に取り戻す実装メモ

Node と Express で書いた Gemini バックエンドが、依存関係とビルド時間で重くなっていませんか。Bun と Hono に載せ替えて、ストリーミング・レート制限・コスト上限・セルフホストまでを一つの軽い実行環境にまとめた実装と判断軸を、現場で踏んだ落とし穴とあわせて整理します。

gemini-api280bunhonoバックエンド2ストリーミング11個人開発92本番運用48cloudflare-workers7

プレミアム記事

深夜に Gemini を呼ぶだけの小さな社内ツールを直そうとして、node_modules が 300MB を超えているのを見たとき、正直にいうと少し気が滅入りました。やっていることは「アプリのレビューを 1 件受け取って要約を返す」だけです。それなのに Express とその周辺、TypeScript のビルド、ホットリロードのためのプロセスマネージャまで抱えていて、ちょっと直すたびに環境ごと立ち上げ直す時間が積み重なっていました。

2014 年から個人で iOS / Android アプリを作り続け、いまは壁紙や癒し系を中心に複数本を並行運用しています。累計のダウンロードは 5,000 万を超え、収益は AdMob が中心です。アプリ本体は Swift や Kotlin で書きますが、その裏で動く「小さな道具」— レビュー分析、メタデータ生成、画像のタグ付け — は、長いあいだ Node と Express の使い回しで済ませてきました。今回その一つを Bun と Hono に載せ替えてみて、想像以上に身軽になったので、判断の過程ごと残しておきます。

なぜ「もう一つのバックエンド」を足す決心がついたのか

最初に正直なところを書いておきます。私の本番バックエンドの大半は、いまも Cloudflare Workers で動いています。月数百円のコストで世界中のエッジに展開でき、アプリの数だけ Worker を増やしても運用が破綻しない、という事情があるからです。ですから「すべてを Bun に移す」話ではありません。

きっかけは、ローカルでの開発体験でした。Workers は本番では快適ですが、ローカルで Gemini の長いストリーミングを試し、レート制限のロジックを少しずつ調整する、という反復作業のときに、エミュレータの再起動やビルドの待ちが地味に効いてきます。手元で動かす小さなツールについては、「インストールも実行もテストも一つのバイナリで完結する」環境のほうが、個人開発の手数には合っているのではないか、と感じ始めていました。

Bun は実行環境であると同時にパッケージマネージャでありテストランナーでもあります。Hono はその上で動く、Web 標準(Request / Response)に素直なルーティングフレームワークで、しかも Cloudflare Workers でもそのまま動きます。つまり「ローカルは Bun で軽く回し、本番は同じコードを Workers に載せる」が成立する。これが、もう一つ環境を増やすだけの価値がある、と判断した理由です。

Node + Express から何が変わるか — 最小の Before / After

まず、いちばん地味で、いちばん効く違いから示します。Gemini を一回呼ぶだけのエンドポイントを、Express と Hono で並べてみます。

これまで書いていた Express 版は、こうでした。

// server.express.ts — これまでの書き方
import express from "express";
import { GoogleGenerativeAI } from "@google/generative-ai";
 
const app = express();
app.use(express.json());
 
const genai = new GoogleGenerativeAI(process.env.GEMINI_API_KEY!);
 
app.post("/summarize", async (req, res) => {
  try {
    const model = genai.getGenerativeModel({ model: "gemini-2.5-flash" });
    const result = await model.generateContent(req.body.text);
    res.json({ summary: result.response.text() });
  } catch (e) {
    res.status(500).json({ error: "failed" });
  }
});
 
app.listen(3000, () => console.log("listening on 3000"));

同じものを Hono で書くと、こうなります。

// server.ts — Bun + Hono 版
import { Hono } from "hono";
import { GoogleGenerativeAI } from "@google/generative-ai";
 
const app = new Hono();
const genai = new GoogleGenerativeAI(Bun.env.GEMINI_API_KEY!);
 
app.post("/summarize", async (c) => {
  const { text } = await c.req.json();
  const model = genai.getGenerativeModel({ model: "gemini-2.5-flash" });
  const result = await model.generateContent(text);
  return c.json({ summary: result.response.text() });
});
 
export default app; // Bun も Workers もこのまま受け取れる

行数の差はわずかですが、本質的な違いは末尾の export default app にあります。Express の app.listen はサーバを「起動する」コードで、その環境に縛られます。Hono は Request を受けて Response を返す関数を「公開する」だけなので、誰が起動するか(Bun のサーバ、Workers のランタイム、テスト内の app.request())を呼び出し側に委ねられます。この一点が、後で「同じコードを二つの場所で動かす」を可能にします。

実行は bun run server.ts だけです。ts-nodenodemon も要りません。bun --hot server.ts にすればホットリロードも標準で付いてきます。私の手元では、node_modules が Express 構成の約 300MB から 40MB 台まで落ち、bun install は 1 秒未満で終わるようになりました。数字そのものより、「直す→試す」の往復が体感で軽くなったことのほうが、毎日触る道具としては効きました。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
Node + Express で肥大化した Gemini バックエンドを Bun + Hono に載せ替え、依存関係とコールドスタートを実測で削れる構成に切り替えられる
ストリーミング・レート制限・コスト上限・観測を 1 ファイルずつの小さなミドルウェアに分け、個人開発の複数アプリで使い回せる設計を持ち帰れる
同じコードを Cloudflare Workers と Bun セルフホストの両方で動かし、どちらに寄せるべきかを自分のコスト構造で判断できるようになる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

高度な活用2026-07-07
構造化出力のストリーミングで、完成したフィールドから順に画面へ出す — 不完全なJSONを安全に読む部分パース
responseSchema でストリーミングすると、JSONが閉じるまで画面は真っ白なまま待たされます。不完全なJSONを安全に補完して読む部分パースと、一度出した値を後退させない逆流防止を組み、最初のフィールドまでの体感を実測とともに縮める設計を残します。
開発ツール2026-05-28
Gemini API のローカル開発を msw と HTTP フィクスチャで再生する — 6 サイト並行で API クォータを圧縮した記録/再生パターン
Gemini API を呼ぶ UI を毎回本物の API で確認していると、1 日に数百回の重複呼び出しが発生します。msw でフィクスチャを再生する仕組みを 6 サイトに導入したら、月の Gemini API 課金が想像以上に静かになりました。記録/再生の実装と運用ポリシーをまとめています。
高度な活用2026-07-07
モデルの提供終了通知が届くたびに慌てないために — Gemini 依存を一枚の層に閉じ込める個人アプリ設計
画像生成モデルの停止通知が届いた朝、依存が散らばっていると差し替えは半日仕事になります。Gemini 依存を一枚のポート層に閉じ込め、フォールバックと廃止期限のCI監視まで含めた個人アプリ設計を、動くコードとともに残します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →