Gemini Pro APIをBunで使ってみた

今日のテクノロジーの世界では、開発者が求めるのは速度と効率性です。このニーズに応えるために開発されたのが「Bun」、新時代の高速JavaScriptランタイムです。
最近注目を集めるこのプロジェクト、gemini-demoの作成に焦点を当てて、Bunの魅力と可能性を探ります。

先程公開されたGemini ProのAPIを使ってみます。詳細はサンプルプロジェクトは下記を参照してください。

https://github.com/gaomar/gemini-demo

## Bunとは？
[Bun](https://bun.sh)は、高速なオールインワンのJavaScriptランタイムで、Node.jsに代わる有望な代替品として注目されています。このランタイムは、パフォーマンスの向上に特化しており、多くのJavaScriptプロジェクトでその速度を実感できます。

各OSの環境に応じてbunをインストールしてください。

## gemini-demoプロジェクトの開始
gemini-demoは、`bun`コマンドを使用して簡単に始めることができます。この初期設定は、Bunの簡潔さと効率性を示しています。プロジェクトのセットアップは数秒で完了し、開発者はすぐにコーディングに取り掛かることができます。

### API KEYの設定
プロジェクトを使用する場合、[Google AI Studio](https://makersuite.google.com/app/apikey)からAPI KEYを取得する必要があります。
取得後は`.env.local`ファイルを新規作成し、プロジェクト内で簡単に使用できます。

```text:.env.local
API_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
```
### インストールと実行
Bunを使用すると、依存関係のインストールが非常に迅速になります。`bun install`コマンドは、従来のnpmやyarnに比べて圧倒的に速いです。

```bash
$ bun install
```

### チャット応答
テキスト応答の確認ができます。

```typescript: chat.ts
import { GoogleGenerativeAI } from '@google/generative-ai'

const genAI = new GoogleGenerativeAI(process.env.API_KEY as string)

async function run() {
  const model = genAI.getGenerativeModel({ model: 'gemini-pro' })
  const prompt = `
  # 目的
  あなたは優秀なタイトルデザイナーです。
  ブログ記事のための魅力的でSEO最適化されたタイトルを3つ提案してください。
  
  # ブログタイトル
  生成AIについて
  `

  const result = await model.generateContent(prompt)
  const response = await result.response
  const text = response.text()
  console.log(text)
}

run()
```

#### 実行コマンド

```
$ bun run chat.ts
```

#### 実行結果

```
1. 生成AI: ゲームチェンジャーとしての可能性を解き明かす
2. 人工知能の未来: 生成AIがもたらすもの
3. 自動化の未来: 生成AIがもたらすビジネスへの影響
```

:::note warn
2023年12月14日現在ですが、「ChatGPT」のキーワードが含まれていると、エラーが返ってきました。
:::

### 画像解析
画像解析の機能を簡単にテストすることができます。

`cat.png`の画像は下記を使用しました。

<img src="https://raw.githubusercontent.com/gaomar/gemini-demo/main/cat.png" width=200px>

```typescript:vision.ts
import { GoogleGenerativeAI, Part } from '@google/generative-ai'
import * as fs from 'fs'

const genAI = new GoogleGenerativeAI(process.env.API_KEY as string)

// URLからbase64エンコードされた文字列を取得します。
async function urlToGenerativePart(url: string, mimeType: string): Promise<Part> {
  const response = await fetch(url)
  const arrayBuffer = await response.arrayBuffer()
  return {
    inlineData: {
      data: Buffer.from(arrayBuffer).toString('base64'),
      mimeType,
    },
  }
}

// ローカルファイル情報を GoogleGenerativeAI.Part オブジェクトに変換します。
function fileToGenerativePart(path: string, mimeType: string): Part {
  return {
    inlineData: {
      data: Buffer.from(fs.readFileSync(path)).toString('base64'),
      mimeType,
    },
  }
}

async function run() {
  // テキストと画像の入力（マルチモーダル）には、gemini-pro-vision モデルを使用します
  const model = genAI.getGenerativeModel({ model: 'gemini-pro-vision' })

  const prompt = '何が写っている？'

  const imageParts: Part[] = [
    fileToGenerativePart('cat.png', 'image/png'),
    await urlToGenerativePart(
      'https://1.bp.blogspot.com/-tVeC6En4e_E/X96mhDTzJNI/AAAAAAABdBo/jlD_jvZvMuk3qUcNjA_XORrA4w3lhPkdQCNcBGAsYHQ/s1048/onepiece01_luffy.png',
      'image/png'
    ),
  ]

  const result = await model.generateContent([prompt, ...imageParts])
  const response = await result.response
  const text = response.text()
  console.log(text)
}

run()

```

#### 実行コマンド

```
$ bun run vision.ts
```

#### 実行結果

```
これは猫とルフィのイラストです。
```

# まとめ
gemini-demoプロジェクトは、Bunの強力な機能を活用しています。
このプロジェクトを通じて、開発の速度と効率が大幅に向上し、JavaScriptの未来がさらに明るくなることは間違いありません。Bunは、現代のJavaScript開発において、重要な役割を果たすことが期待されています。

Gemini ProのAPIを使ったサンプルアプリはかなり簡単に作成できました。
料金も安いので、セキュリティ問題がクリアされれば、Geminiも使いやすいと感じます。

システム化のご検討やご相談は弊社までお問い合わせください。

https://www.i-enter.co.jp