Интеграция C# с ChatGPT API: пошаговое руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Как подружить 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-решений стоит ограничивать глубину диалога.

Блоги

Рекомендаций по книгам