Как подружить C# и ChatGPT: полный гайд по интеграции
Представьте: ваше приложение на C# вдруг начинает не просто выполнять команды, а вести осмысленный диалог, писать код, переводить тексты или генерировать идеи. Звучит как фантастика? А это уже реальность благодаря интеграции ChatGPT API на C#. Сегодня я покажу, как за 15 минут превратить обычную консольную программу в интеллектуального ассистента. Поехали!
OpenAI предоставляет мощный REST API, который отлично дружит с .NET. Вам не нужны никакие сторонние SDK — достаточно стандартного HttpClient и пары библиотек для работы с JSON. Весь процесс укладывается в четыре шага: получаем ключ, шлём запрос, парсим ответ, радуемся результату.
Что нам понадобится для старта
Перед тем как писать код, давайте подготовим окружение. Вам потребуется:
- Visual Studio 2022 или JetBrains Rider (но можно и обычный .NET SDK + блокнот)
- .NET 6.0 или выше (я использую .NET 8 — он шустрее)
- API-ключ OpenAI — регистрируемся на platform.openai.com, заходим в раздел API Keys и создаём новый секретный ключ. Внимание: первый раз дают $5 на тесты, но не забывайте про лимиты!
- Библиотека Newtonsoft.Json или System.Text.Json (встроена в .NET, но я предпочитаю Newtonsoft — она нагляднее)
Установить Newtonsoft.Json можно через NuGet: Install-Package Newtonsoft.Json или через менеджер пакетов в Visual Studio.
Создаём первый запрос к ChatGPT на C#
Начнём с простого: отправим сообщение модели и получим ответ. Вся магия происходит через POST-запрос к эндпоинту https://api.openai.com/v1/chat/completions.
Вот минимальный рабочий код, который я рекомендую сохранить как отправную точку:
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
class Program
{
private static readonly string apiKey = "ВАШ_КЛЮЧ_ЗДЕСЬ"; // Никому не показывайте!
private static readonly string endpoint = "https://api.openai.com/v1/chat/completions";
static async Task Main(string[] args)
{
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");
var requestBody = new
{
model = "gpt-3.5-turbo",
messages = new[]
{
new { role = "user", content = "Расскажи шутку про программистов" }
},
temperature = 0.7,
max_tokens = 150
};
var json = JsonConvert.SerializeObject(requestBody);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync(endpoint, content);
var responseString = await response.Content.ReadAsStringAsync();
var responseObject = JObject.Parse(responseString);
var reply = responseObject["choices"][0]["message"]["content"].ToString();
Console.WriteLine("ChatGPT говорит:");
Console.WriteLine(reply);
}
}
Запускаете — и консоль выдаёт что-то вроде: «Почему программисты путают Хэллоуин и Рождество? Потому что Oct 31 == Dec 25!». Смешно? Работает? Отлично!
Разбираем код по косточкам
Давайте посмотрим, что тут происходит. Мы создаём HttpClient, добавляем заголовок авторизации — это стандартная практика для работы с OpenAI API в C#. Тело запроса — это JSON-объект с параметрами:
- model: указываем модель.
gpt-3.5-turbo— золотая середина по цене/качеству. Для сложных задач беритеgpt-4, но готовьтесь платить больше. - messages: массив сообщений. Каждое сообщение имеет роль (
user,assistant,system). Рольsystemзадаёт поведение модели. - temperature: от 0 до 2. Чем выше, тем креативнее ответ. Для фактологии ставьте 0.2, для генерации идей — 0.8.
- max_tokens: ограничение длины ответа (1 токен ≈ 0.75 слова).
Ответ мы парсим через JObject — это удобно, когда структура ответа заранее известна. Если хотите строгую типизацию, создайте классы под модель ответа OpenAI.
Продвинутый сценарий: создаём диалогового ассистента
Одиночный запрос — это скучно. Давайте сделаем настоящий чат-бот, который помнит историю разговора. Для этого нужно хранить массив сообщений и добавлять туда как запросы пользователя, так и ответы модели.
Вот пример консольного чат-бота на C# с интеграцией ChatGPT API:
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
class ChatBot
{
private static readonly string apiKey = "ВАШ_КЛЮЧ";
private static readonly string endpoint = "https://api.openai.com/v1/chat/completions";
private static List<object> conversationHistory = new List<object>();
static async Task Main()
{
Console.WriteLine("ChatGPT-бот на C#. Напишите 'выход' для завершения.");
Console.WriteLine("Введите ваше сообщение:");
// Системное сообщение — задаём тон
conversationHistory.Add(new { role = "system", content = "Ты дружелюбный помощник, отвечаешь кратко и по делу." });
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");
while (true)
{
Console.Write("Вы: ");
var userInput = Console.ReadLine();
if (userInput?.ToLower() == "выход") break;
conversationHistory.Add(new { role = "user", content = userInput });
var requestBody = new
{
model = "gpt-3.5-turbo",
messages = conversationHistory,
temperature = 0.7
};
var json = JsonConvert.SerializeObject(requestBody);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync(endpoint, content);
var responseString = await response.Content.ReadAsStringAsync();
var responseObject = JObject.Parse(responseString);
var reply = responseObject["choices"][0]["message"]["content"].ToString();
Console.WriteLine($"Бот: {reply}");
conversationHistory.Add(new { role = "assistant", content = reply });
}
}
}
Теперь ваш бот помнит контекст! Спросите «Какая погода в Москве?», а потом «А во Владивостоке?» — он поймёт, что речь о погоде. Магия работы с контекстом в ChatGPT API реализуется именно через историю сообщений. Но помните: чем длиннее история, тем больше токенов вы тратите. Для production-решений стоит ограничивать глубину диалога.