8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

使う生成AI

Gemini
無料で使えるから。

前提

このサイトでGeminiのAPI Keyを発行してください。

プログラム

デザイン

スクリーンショット 2024-10-20 160108.png
SplitContainerを配置して上下に分けるようにします。
スクリーンショット 2024-10-20 160848.png
RichTextBoxとTextBoxを配置します。(それぞれ名前はrichTextBox1とtextBox1)

コード

"GeminiApiKey"という環境変数を作り、GeminiのAPIKeyを設定します。(安全性のため)
NuGetで"Google_GenerativeAI"というパッケージを追加します。
下のようなクラスChatBotを作ります。ほとんどChatGPTに作ってもらった

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は

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
このように会話ができます。

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?