/
kochkareal
/
GigaChatLib
Обзор
Документация
Войти
/
kochkareal
/
GigaChatLib
Код
Запросы
0
Задачи
Вики
Пакеты
1
Релизы
0
CI/CD
Аналитика
Безопасность
master
ExampleConsoleApp/Program.cs
236 строк
10 KB
kochkareal
Финальная чистка перед публикацией пакета
20 июл 2026, 20:27
20 июл 2026, 20:27
3d169e2
Код
Авторство
О чём код?
using GigaChatLib.Clients; using GigaChatLib.Dtos.Chat; using GigaChatLib.Dtos.Chat.Messages; using GigaChatLib.Enums; using GigaChatLib.Extensions; using Microsoft.Extensions.DependencyInjection; using System.Text; using System.Text.Json; namespace Example; public static class Program { private static readonly JsonSerializerOptions IndentedJson = new() { WriteIndented = true }; public static async Task Main() { Console.OutputEncoding = Encoding.UTF8; Console.InputEncoding = Encoding.UTF8; // 1. Ввод Authorization Key Console.Write("Получите ключ: https://developers.sber.ru/studio/workspaces/ (ctrl клик)\n\n\n"); Console.Write("Authorization Key (Base64): "); var authKey = Console.ReadLine(); if (string.IsNullOrWhiteSpace(authKey)) { Console.WriteLine("Ключ не введён. Выход."); return; } // 2. Выбор Scope Console.WriteLine("\nВыберите тип доступа (scope), соответствующий вашему ключу:"); Console.WriteLine("1. GIGACHAT_API_PERS (физические лица)"); Console.WriteLine("2. GIGACHAT_API_B2B (юрлица, пакеты токенов)"); Console.WriteLine("3. GIGACHAT_API_CORP (юрлица, pay-as-you-go)"); ApiScope scope; while (true) { Console.Write("Введите номер (1-3): "); var scopeInput = Console.ReadLine(); if (scopeInput == "1") { scope = ApiScope.GIGACHAT_API_PERS; break; } if (scopeInput == "2") { scope = ApiScope.GIGACHAT_API_B2B; break; } if (scopeInput == "3") { scope = ApiScope.GIGACHAT_API_CORP; break; } Console.WriteLine("Некорректный ввод."); } Console.Write("\nИгнорировать ошибки TLS-сертификата? Нужно, только если в системе не\n" + "установлен «Российский доверенный корневой УЦ» Минцифры (см. README раздел TLS). [y/N]: "); var ignoreCertificateErrors = (Console.ReadLine() ?? string.Empty).Trim().Equals("y", StringComparison.OrdinalIgnoreCase); // 3. Подключение через AddGigaChat — тот способ, который будет использовать реальное // приложение. Ручная сборка HTTP-стека здесь намеренно не показывается. var services = new ServiceCollection(); services.AddGigaChat(options => { options.AuthorizationKey = authKey; options.Scope = scope; options.IgnoreCertificateErrors = ignoreCertificateErrors; }); await using var provider = services.BuildServiceProvider(); var giga = provider.GetRequiredService<IGigaChatClient>(); // 4. Баланс токенов Console.WriteLine("\nЗагрузка баланса..."); try { var balance = await giga.Monitoring.GetBalanceAsync(); var json = JsonSerializer.Serialize(balance, IndentedJson); Console.WriteLine("Баланс токенов:"); Console.WriteLine(json); } catch (Exception ex) { Console.WriteLine("Не удалось получить баланс: " + ex.Message); if (scope == ApiScope.GIGACHAT_API_CORP) { Console.WriteLine("(Для pay-as-you-go этот метод недоступен, это нормально)"); } } // 5. Выбор модели Console.WriteLine("\nЗагрузка списка моделей..."); string modelId; try { var modelsList = await giga.Models.GetModelsAsync(); // Фильтруем только модели для чата (исключаем embedder, aicheck) var availableModels = modelsList.Data .Where(m => !string.IsNullOrEmpty(m.Id) && m.Type == "chat") .ToList(); if (availableModels.Count == 0) { Console.WriteLine("Список моделей пуст. Используем модель по умолчанию: GigaChat"); modelId = "GigaChat"; } else { Console.WriteLine("\nДоступные модели:"); Console.WriteLine(new string('-', 60)); for (var i = 0; i < availableModels.Count; i++) { var m = availableModels[i]; Console.WriteLine($" [{i + 1,2}] {m.Id,-35} (владелец: {m.OwnedBy})"); } Console.WriteLine(new string('-', 60)); while (true) { Console.Write($"\nВыберите модель (1-{availableModels.Count}): "); var input = Console.ReadLine(); if (int.TryParse(input, out var choice) && choice >= 1 && choice <= availableModels.Count) { modelId = availableModels[choice - 1].Id; break; } Console.WriteLine("Некорректный ввод. Попробуйте снова."); } } } catch (Exception ex) { Console.WriteLine("Не удалось получить модели: " + ex.Message); modelId = "GigaChat"; Console.WriteLine($"Используется модель по умолчанию: {modelId}"); } Console.WriteLine($"\nИспользуется модель: {modelId}"); Console.Write("Отвечать в потоковом режиме (печатать ответ по мере генерации)? [Y/n]: "); var useStreaming = !(Console.ReadLine() ?? string.Empty).Trim().Equals("n", StringComparison.OrdinalIgnoreCase); Console.WriteLine("\nНачинаем диалог. Введите 'exit' для выхода.\n"); // 6. Диалог с накоплением истории и подсчётом токенов var history = new List<MessageBase>(); var totalPrompt = 0; var totalCompletion = 0; var totalTokens = 0; while (true) { Console.Write("Вы: "); var input = Console.ReadLine(); if (string.IsNullOrWhiteSpace(input)) continue; if (input.Trim().Equals("exit", StringComparison.OrdinalIgnoreCase)) break; history.Add(new UserMessage { Content = input }); var request = new ChatCompletionRequest { Model = modelId, Messages = history, Temperature = 0.7f }; try { if (useStreaming) { Console.Write("\nМодель: "); var reply = new StringBuilder(); int? promptTokens = null, completionTokens = null, total = null; await foreach (var chunk in giga.Chat.StreamCompletionAsync(request)) { var delta = chunk.Choices.FirstOrDefault()?.Delta; if (!string.IsNullOrEmpty(delta?.Content)) { Console.Write(delta.Content); reply.Append(delta.Content); } if (chunk.Usage is not null) { promptTokens = chunk.Usage.PromptTokens; completionTokens = chunk.Usage.CompletionTokens; total = chunk.Usage.TotalTokens; } } Console.WriteLine("\n"); history.Add(new AssistantMessage { Content = reply.ToString() }); if (total is not null) { totalPrompt += promptTokens ?? 0; totalCompletion += completionTokens ?? 0; totalTokens += total.Value; PrintUsage(promptTokens ?? 0, completionTokens ?? 0, total.Value, totalTokens, totalPrompt, totalCompletion); } } else { var response = await giga.Chat.CreateCompletionAsync(request); var choice = response.Choices.FirstOrDefault(); var replyText = choice?.Message.Content ?? "[пустой ответ]"; Console.WriteLine($"\nМодель: {replyText}\n"); if (choice?.Message is not null) { history.Add(new AssistantMessage { Content = choice.Message.Content, FunctionsStateId = choice.Message.FunctionsStateId }); } totalPrompt += response.Usage.PromptTokens; totalCompletion += response.Usage.CompletionTokens; totalTokens += response.Usage.TotalTokens; PrintUsage(response.Usage.PromptTokens, response.Usage.CompletionTokens, response.Usage.TotalTokens, totalTokens, totalPrompt, totalCompletion); } } catch (Exception ex) { Console.WriteLine("Ошибка запроса: " + ex.Message); history.RemoveAt(history.Count - 1); } } Console.WriteLine($"\nИтоговый расход токенов: {totalTokens}"); } private static void PrintUsage(int promptTokens, int completionTokens, int total, int totalTokens, int totalPrompt, int totalCompletion) { Console.WriteLine("--- Потрачено токенов ---"); Console.WriteLine($" В запросе : {promptTokens}"); Console.WriteLine($" В ответе : {completionTokens}"); Console.WriteLine($" Всего : {total}"); Console.WriteLine($" Накоплено : {totalTokens} (вход: {totalPrompt}, выход: {totalCompletion})"); Console.WriteLine(); } }