使う生成AI
Gemini
無料で使えるから。
前提
このサイトでGeminiのAPI Keyを発行してください。
プログラム
デザイン
SplitContainerを配置して上下に分けるようにします。
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 = "";
}
}
}
}