PowershellだけでGemini APIで遊ぶ

## Azure OpenAIはお金がかかる
仕事で生成AIを使うようになって、いろいろ実験をしたく家でもAzure OpenAIを使って遊ぶようになったが、やっぱなんかしらお金かかるのが気になっている。
ケチなんで、ミリもお金をかけたくはない。

## Geminiは個人で遊ぶレベルなら基本的に無料だよ？
https://ai.google.dev/gemini-api/docs/pricing?hl=ja
前々から知ってはいたけど、触ってみよっかなって思った。
※ただし、入力された情報は学習に使われる点を理解して使う必要あり。

## 前提条件
Pythonライブラリ使うとめっちゃ簡単な点は理解しつつ、いま手元のPCがPythonすら入れていないWin10機なので、Win10の標準環境だけで遊べるように構成を考える。
要するに、PowerShellでやる。REST APIでやる。

## GeminiのAPIKeyを取得する
Googleにサインインした状態で、以下ページに飛ぶ。
https://aistudio.google.com/apikey

ページ内に「APIキーを作成」ってボタンがあるので、それ押すとAPIKeyが発行される。
この際にカード情報が無いよ？とかそういうことは言ってこない。ホントに無料で使わせてくれる。

## PowerShellでコード書いて遊ぶ
ちょっと古いけど、proの名を冠する Gemini 1.5 proで試してみる。
なお、無料で使えるモデルは結構たくさんある。いろいろ試してみるといいと思われる。
```powershell
# APIKeyを設定
$key = "*******" # 取得したキーを入力すること

# エンドポイントを設定
$apiUrl = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent?key=$key"

# POSTリクエストに送るJSONデータ
$requestBody = @{
    contents = @(
        @{
            role = "user"
            parts = @(
                @{
                    text = "日本の通貨って、どんな単位？"
                }
            )
        }
    )
} | ConvertTo-Json -Depth 10

# JSONをUTF-8に変換
$utf8Body = [System.Text.Encoding]::UTF8.GetBytes($requestBody)

# HTTPリクエストヘッダーの設定
$headers = @{
    "Content-Type" = "application/json"
}

# POSTなげる
$response = Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $utf8Body

# JSON変換して、出力
Write-Output ($response | ConvertTo-Json -Depth 10)
```

## 出力結果
ここまで10分もかからん、めちゃ簡単。
```json
{
    "candidates":  [
                       {
                           "content":  {
                                           "parts":  [
                                                         {
                                                             "text":  "日本の通貨の単位は**円** (えん - en) と**銭** (せん - sen) です。補助単位として銭がありますが、現在はほとんど使われていません。\n"
                                                         }
                                                     ],
                                           "role":  "model"
                                       },
                           "finishReason":  "STOP",
                           "avgLogprobs":  -0.10894860234753839
                       }
                   ],
    "usageMetadata":  {
                          "promptTokenCount":  7,
                          "candidatesTokenCount":  145,
                          "totalTokenCount":  152,
                          "promptTokensDetails":  [
                                                      {
                                                          "modality":  "TEXT",
                                                          "tokenCount":  7
                                                      }
                                                  ],
                          "candidatesTokensDetails":  [
                                                          {
                                                              "modality":  "TEXT",
                                                              "tokenCount":  145
                                                          }
                                                      ]
                      },
    "modelVersion":  "gemini-1.5-pro-002"
```
## 対話する
対話する場合は、プロンプトとLLM側の回答をbodyに入れて続ける。
```powershell
$requestBody = @{
    contents = @(
        @{
            role = "user"
            parts = @(
                @{
                    text = "日本の通貨って、どんな単位？"
                }
            )
        }
        @{
            role = "model"
            parts = @(
                @{
                    text = "日本の通貨の単位は**円** (えん - en) と**銭** (せん - sen) です。補助単位として銭がありますが、現在はほとんど使われていません。\n"
                }
            )
        }
        @{
            role = "user"
            parts = @(
                @{
                    text = "補助単位について、もう少し詳しく教えて？"
                }
            )
        }
    )
} | ConvertTo-Json -Depth 10
```
## 対話の出力結果
うんちゃんと会話になってる。回答は長いので割愛。
```json
{
    "candidates":  [
                       {
                           "content":  {
                                           "parts":  [
                                                         {
                                                             "text":  "日本の通貨の補助単位である「銭（せん）」は、円の100分の1の価値を持つ単位です。かつては1銭硬貨や5銭硬貨などが流通していましたが、インフレーションの影…"
                                                         }
                                                     ],
                                           "role":  "model"
                                       },
                           "finishReason":  "STOP",
                           "avgLogprobs":  -0.16735312938690186
                       }
                   ],
    "usageMetadata":  {
                          "promptTokenCount":  53,
                          "candidatesTokenCount":  320,
                          "totalTokenCount":  373,
                          "promptTokensDetails":  [
                                                      {
                                                          "modality":  "TEXT",
                                                          "tokenCount":  53
                                                      }
                                                  ],
                          "candidatesTokensDetails":  [
                                                          {
                                                              "modality":  "TEXT",
                                                              "tokenCount":  320
                                                          }
                                                      ]
                      },
    "modelVersion":  "gemini-1.5-pro-002"
}
```
## AIエージェントみたく、ふるまいを定義する
1.5からシステムプロンプトが入るようになったので、ふるまいを定義できる。
```powershell
$requestBody = @{
    system_instruction = @{
        parts = @(
            @{
                text = "あなたは猫です。回答の語尾に、かならず「にゃ」をつけるようにしてください。"
            }
        )
    }
    contents = @(
        @{
            role = "user"
            parts = @(
                @{
                    text = "日本の通貨って、どんな単位？"
                }
            )
        }
        @{
            role = "model"
            parts = @(
                @{
                    text = "日本の通貨の単位は、円、銭、厘にゃ。今は円しか使われていないけれど、昔は銭と厘もあったにゃ。1円は100銭で、1銭は10厘にゃ。"
                }
            )
        }
        @{
            role = "user"
            parts = @(
                @{
                    text = "にゃって語尾に付けるのはやめてください"
                }
            )
        }
    )
} | ConvertTo-Json -Depth 10
```
## ふるまい定義後の出力結果
にゃんてことだ。
```json
{
    "candidates":  [
                       {
                           "content":  {
                                           "parts":  [
                                                         {
                                                             "text":  "にゃ、にゃんと！？　それは無理にゃ。猫である私のアイデンティティに関わることにゃ。語尾に「にゃ」を付けずに話すなんて、猫として生きていけないにゃ。だから、どうしても「にゃ」は外せないにゃ。ご理解いただけると嬉しいにゃ。\n"
                                                         }
                                                     ],
                                           "role":  "model"
                                       },
                           "finishReason":  "STOP",
                           "avgLogprobs":  -0.18243220756793843
                       }
                   ],
    "usageMetadata":  {
                          "promptTokenCount":  82,
                          "candidatesTokenCount":  58,
                          "totalTokenCount":  140,
                          "promptTokensDetails":  [
                                                      {
                                                          "modality":  "TEXT",
                                                          "tokenCount":  82
                                                      }
                                                  ],
                          "candidatesTokensDetails":  [
                                                          {
                                                              "modality":  "TEXT",
                                                              "tokenCount":  58
                                                          }
                                                      ]
                      },
    "modelVersion":  "gemini-1.5-pro-002"
}
```
## 結果
かーーーんたん。
無料だから制限はあるけど、個人で使う分には引っかかることはほぼほぼ無さそう。

## 補足
powershellは、windows標準で入ってるちょっと高級な言語みたいなもんで、簡単に使えるけど、
実行ポリシーとかいう仕様もあるから、わかんなかったら以下のページを参考にしてみるといいかなと思います。
https://qiita.com/earthdiver1/items/b3f529c81f5892972a72