C#でAIと無料で会話できるようにしてみた

# 使う生成AI
**Gemini**
無料で使えるから。

# 前提
[このサイト](https://aistudio.google.com/prompts/new_chat)でGeminiのAPI Keyを発行してください。

# プログラム
## デザイン
![スクリーンショット 2024-10-20 160108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572788/78680387-74a4-6de8-eeb2-1b5182421846.png)
SplitContainerを配置して上下に分けるようにします。
![スクリーンショット 2024-10-20 160848.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572788/3906750e-9925-f7a3-d6c0-f6ccd2dede41.png)
RichTextBoxとTextBoxを配置します。（それぞれ名前はrichTextBox1とtextBox1)
## コード
"GeminiApiKey"という環境変数を作り、GeminiのAPIKeyを設定します。(安全性のため)
NuGetで"Google_GenerativeAI"というパッケージを追加します。
下のようなクラスChatBotを作ります。~~ほとんどChatGPTに作ってもらった~~
```C#:ChatBot.cs
using GenerativeAI.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GeminiChat
{
    public class ChatBot
    {
        private readonly GenerativeModel model;
        private List<string> conversationHistory;

        // コンストラクタでAPIキーを渡し、APIクライアントを初期化
        public ChatBot()
        {
            string apiKey = Environment.GetEnvironmentVariable("GeminiApiKey", EnvironmentVariableTarget.User);
            model = new GenerativeModel(apiKey);
            conversationHistory = new List<string>();
        }

        // チャットのメイン機能: ユーザーの入力に対してAPIの応答を取得
        public async Task<string> SendMessageAsync(string userMessage)
        {
            // 会話履歴にユーザーのメッセージを追加
            conversationHistory.Add($"User: {userMessage}");

            // コンテキスト付きのプロンプトを作成
            string promptWithContext = string.Join("\n", conversationHistory);

            try
            {
                // メッセージをGemini APIに送信し、応答を受け取る
                var response = await model.GenerateContentAsync(promptWithContext);

                // ボットの応答を履歴に追加
                conversationHistory.Add($"You: {response}");

                // ボットの応答を返す
                return response;
            }
            catch (Exception ex)
            {
                // エラーが発生した場合の処理
                return $"リクエストエラー: {ex.Message}";
            }
        }
    }
}
```

Form1.csは
```C#:Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using GeminiChat;

namespace Qiita
{
    public partial class Form1 : Form
    {
        private ChatBot chatBot;

        public Form1()
        {
            InitializeComponent();

            chatBot = new ChatBot();
        }

        private async void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                string text = textBox1.Text;
                string res = await chatBot.SendMessageAsync(text);

                int startPos = richTextBox1.Text.Length;
                string additionalText = $"You: {text}\n";
                int length = additionalText.Length;

                richTextBox1.Text += additionalText;
                richTextBox1.Select(startPos, length);
                richTextBox1.SelectionColor = Color.Gray;
                richTextBox1.Text += $"{res}\n";

                textBox1.Text = "";
            }
        }
    }
}
```

# 結果
![スクリーンショット 2024-10-20 161906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572788/3e0ec176-cdec-4f5d-0b0f-46c87e9c75d2.png)
このように会話ができます。