Українська
Завдання
Відповідно до номера свого варіанта виконайте завдання обраного рівня складності.
Якщо в завданні не вказано інше, використовуйте локальну модель Ollama через IChatClient; дані для функцій-інструментів (каталоги, розклади, замовлення) зберігайте у файлах або в пам’яті.
Варіанти
Варіант 1. Помічник кулінара
1. Початковий рівень. Створити консольну програму, яка запитує в користувача перелік наявних продуктів і за допомогою IChatClient із системною інструкцією «кухар-порадник» виводить один простий рецепт українською.
2. Базовий рівень. Створити консольну програму, яка запитує перелік наявних продуктів і отримує від моделі через IChatClient рецепт як record Recipe (назва, час приготування у хвилинах, інгредієнти з кількістю, кроки) методом GetResponseAsync<T>, перевіряє, що час від 1 до 600 хв і список кроків не порожній, та виводить рецепт таблицею і список покупок: інгредієнти, яких немає серед введених продуктів.
3. Високий рівень. Створити консольну програму «Кулінар» з опціями --products файл, --portions N, --diet vegetarian|none і --help, яка за переліком наявних продуктів з файлу генерує через IChatClient три рецепти, перераховує кількість інгредієнтів на задану кількість порцій, зберігає рецепти та загальний список покупок у JSON, виводить помилки в потік помилок з кодами завершення 1–3; логіка списку покупок перевіряється модульними тестами з фейковим IChatClient.
Варіант 2. Звернення мешканців
1. Початковий рівень. Створити консольну програму, яка приймає текст звернення мешканця до ОСББ і просить модель визначити категорію (вода, опалення, ліфт, прибирання, інше) з набору, вказаного в системній інструкції.
2. Базовий рівень. Створити консольну програму, яка приймає текст звернення мешканця до ОСББ і через IChatClient класифікує його в record з переліченнями Category (вода, опалення, ліфт, прибирання, інше) і Urgency (низька, середня, висока) та коротким резюме, повторює запит до двох разів, якщо TryGetResult повертає false, і виводить результат таблицею.
3. Високий рівень. Створити консольну програму «Звернення», яка обробляє текстовий файл звернень мешканців до ОСББ (одне в рядку; аргумент командного рядка, --help), класифікує кожне через IChatClient за категорією й терміновістю, формує JSON-звіт і таблицю кількості звернень за категоріями й терміновістю, а персональні дані (телефони, email) вилучає регулярними виразами ще до надсилання тексту моделі.
Варіант 3. Репетитор з математики
1. Початковий рівень. Створити консольну програму-чат, у якій модель із системною інструкцією «репетитор для 7 класу» пояснює розв’язання задач крок за кроком і зберігає історію діалогу.
2. Базовий рівень. Створити консольну програму-чат «репетитор з математики» на IChatClient, у якій модель для обчислень викликає функцію C# Calculate(string expression) (додавання, віднімання, множення, ділення, дужки), а функція перевіряє вираз і повертає повідомлення про помилку для ділення на нуль чи недопустимих символів.
3. Високий рівень. Створити застосунок WPF «Репетитор» з математики – чат з моделлю через IChatClient з потоковою відповіддю, кнопкою скасування, функціями Calculate (арифметичний вираз) і SolveQuadratic (коефіцієнти квадратного рівняння), журналом викликів функцій у вікні та модульними тестами функцій і ViewModel з фейковим IChatClient.
Варіант 4. Описи товарів
1. Початковий рівень. Створити консольну програму, яка за назвою товару й трьома характеристиками, введеними користувачем, генерує рекламний опис до 300 символів (MaxOutputTokens, Temperature).
2. Базовий рівень. Створити консольну програму, яка за назвою товару й характеристиками, введеними користувачем, отримує від моделі через IChatClient record ProductText (заголовок до 60 символів, опис до 300 символів, 3–5 ключових слів), перевіряє обмеження довжини й кількості та повторює запит, якщо обмеження порушено, не більше трьох разів.
3. Високий рівень. Створити консольну програму «Описи» з аргументами --input товари.csv (назва; характеристики), --output описи.json, --temperature T і --help, яка пакетно генерує через IChatClient рекламні описи товарів, пропускає некоректні рядки CSV з повідомленням у потік помилок, кешує однакові запити (UseDistributedCache) і виводить підсумкову таблицю часу та токенів.
Варіант 5. Помічник турагента
1. Початковий рівень. Створити консольну програму, у якій модель відповідає на питання про тури, викликаючи функцію FindTours(string country), що шукає тури в списку, заданому в програмі.
2. Базовий рівень. Створити консольну програму-чат помічника турагента, у якій модель через IChatClient викликає функції FindTours(country, maxPrice) і GetTourDetails(id) над списком турів у пам’яті (країна, дати, ціна) з описами [Description], перевіркою аргументів (ціна додатна, id існує) та журналом викликів UseLogging на рівні Debug.
3. Високий рівень. Створити консольну програму «Турагент», яка читає тури з JSON-файлу (аргумент командного рядка), дає моделі функції пошуку й бронювання, запитує підтвердження користувача перед бронюванням, записує бронювання у файл і обмежує кількість кроків циклу функцій (MaximumIterationsPerRequest).
Варіант 6. Резюме лекцій
1. Початковий рівень. Створити консольну програму, яка читає текстовий файл конспекту і виводить стислий зміст до 5 речень, отриманий від моделі.
2. Базовий рівень. Створити консольну програму, яка для файлу конспекту отримує record LectureSummary (тема, 3–5 тез, 5 питань для самоперевірки), перевіряє кількість елементів і розмір файлу (не більше 20 000 символів) та зберігає результат у Markdown-файл.
3. Високий рівень. Створити консольну програму «Конспекти», яка обробляє всі файли .txt папки, розбиває довгі тексти на частини за абзацами, підсумовує частини окремо й поєднує результати, виводить таблицю файлів із кількістю токенів і має опції --folder, --out та --help.
Варіант 7. Семантичний пошук фільмів
1. Початковий рівень. Створити консольну програму, яка створює векторні подання описів п’яти фільмів і для введеного запиту виводить фільм із найбільшою косинусною подібністю.
2. Базовий рівень. Створити консольну програму, яка створює векторні подання описів фільмів, заданих у програмі, і для обраного фільму виводить три найсхожіші за косинусною подібністю зі значенням подібності, а для запиту користувача – найближчий фільм або повідомлення «не знайдено», якщо подібність менша за поріг.
3. Високий рівень. Створити консольну програму «Фільми», яка читає фільми з CSV-файлу (назва, жанр, рік, опис), зберігає векторні подання описів у векторному сховищі в пам’яті, шукає фільми за текстовим запитом із фільтром за жанром і роком, має опції --top N і --help, а обчислення подібності перевіряє модульними тестами на фіксованих векторах.
Варіант 8. Перевірка есе
1. Початковий рівень. Створити консольну програму, яка надсилає моделі текст есе з файлу і виводить загальну оцінку від 1 до 10 з поясненням.
2. Базовий рівень. Створити консольну програму, яка надсилає моделі через IChatClient текст есе з файлу, отримує оцінку за критеріями (зміст, структура, мова, аргументація) у record EssayReview з балами 0–5 та зауваженнями, перевіряє діапазони балів і виводить таблицю з сумою.
3. Високий рівень. Створити застосунок WPF «Перевірка есе», який відкриває кілька текстових файлів есе, оцінює їх через IChatClient за критеріями (зміст, структура, мова, аргументація) послідовно з індикатором перебігу й скасуванням, показує результати в DataGrid, зберігає звіт у JSON та попереджає, що оцінка моделі є лише допоміжною.
Варіант 9. Чат-бот служби доставки
1. Початковий рівень. Створити консольну програму-чат служби доставки, у якій модель викликає функцію GetOrderStatus(string orderNumber) зі списком замовлень у пам’яті.
2. Базовий рівень. Створити консольну програму-чат служби доставки, у якій модель через IChatClient викликає функцію GetOrderStatus(orderNumber) над замовленнями в пам’яті; функція перевіряє формат номера регулярним виразом (наприклад, DL-123456), програма зберігає історію діалогу з обрізанням до 12 повідомлень і виводить кількість токенів кожної відповіді.
3. Високий рівень. Створити консольну програму «Доставка» з функціями статусу замовлення та зміни адреси (лише після підтвердження користувача), замовленнями у JSON-файлі, власним проміжним клієнтом, що обмежує кількість токенів за сеанс, і тестами функцій.
Варіант 10. Відгуки готелю
1. Початковий рівень. Створити консольну програму, яка визначає тональність відгуку про готель (позитивна, нейтральна, негативна) через GetResponseAsync<T> з переліченням.
2. Базовий рівень. Створити консольну програму, яка для введеного відгуку про готель через IChatClient визначає тональність окремих аспектів (номер, персонал, харчування, розташування) у record і виводить таблицю, у якій аспекти, не згадані у відгуку, позначено «–».
3. Високий рівень. Створити консольну програму «Готель», яка обробляє CSV-файл відгуків (аргумент, --help), визначає через IChatClient тональність аспектів (номер, персонал, харчування, розташування), будує зведену таблицю частки позитивних відгуків за аспектами, зберігає JSON-звіт і пропускає відповіді моделі з некоректними даними, записуючи їх у журнал.
Варіант 11. Помічник з розкладу
1. Початковий рівень. Створити консольну програму, у якій модель відповідає на питання про розклад занять групи, викликаючи функцію GetSchedule(string day) з даними в пам’яті.
2. Базовий рівень. Створити консольну програму-чат, яка читає розклад групи з CSV-файлу (день, пара, предмет, аудиторія), надає моделі функції GetSchedule(day) і FindSubject(name) з перевіркою назви дня та відповідає «у розкладі немає» на питання про відсутні предмети.
3. Високий рівень. Створити застосунок WPF «Розклад», який показує розклад групи з CSV-файлу в DataGrid, має чат з моделлю через IChatClient з потоковою відповіддю та функціями пошуку в розкладі, підсвічує в таблиці заняття, про які запитав користувач, і зберігає історію діалогу у файл.
Варіант 12. Дані з рахунків
1. Початковий рівень. Створити консольну програму, яка надсилає мультимодальній моделі зображення рахунку (DataContent) і виводить розпізнаний текст.
2. Базовий рівень. Створити консольну програму, яка отримує з фотографії рахунку record Invoice (постачальник, дата, позиції з кількістю та ціною, сума), перевіряє, що сума позицій збігається із загальною сумою з точністю до 0,01 грн, і повідомляє про розбіжність.
3. Високий рівень. Створити консольну програму «Рахунки», яка обробляє всі зображення .jpg і .png папки (аргумент, --help), перевіряє формат і розмір файлів (до 5 МБ), зберігає розпізнані рахунки в CSV, а сумнівні (сума не збігається) виводить окремим списком.
Варіант 13. Тренажер співбесіди
1. Початковий рівень. Створити консольну програму, яка за назвою вакансії, введеною користувачем, отримує від моделі п’ять питань для співбесіди.
2. Базовий рівень. Створити консольну програму-співбесіду, яка за назвою вакансії отримує від моделі через IChatClient питання, по черзі ставить їх, приймає відповіді користувача, отримує оцінку кожної відповіді 0–10 з коментарем (record AnswerReview) і виводить підсумкову таблицю.
3. Високий рівень. Створити застосунок WPF «Співбесіда» з вибором вакансії та рівня (junior, middle), таймером на відповідь, потоковими коментарями моделі, збереженням результатів у JSON і графіком оцінок за питаннями.
Варіант 14. Правила гри
1. Початковий рівень. Створити консольну програму, яка передає моделі текст правил настільної гри з файлу разом із питанням користувача і виводить відповідь.
2. Базовий рівень. Створити консольну програму, яка розбиває текст правил настільної гри з файлу на пункти, для питання користувача знаходить три найближчі пункти за векторними поданнями і просить модель через IChatClient відповідати лише за ними з посиланнями на номери пунктів.
3. Високий рівень. Створити консольну програму «Правила» з RAG за кількома файлами правил (аргумент папки), векторним сховищем у пам’яті, порогом подібності, списком джерел у відповіді та відмовою відповідати на питання, яких немає в правилах.
Варіант 15. Генератор вікторин
1. Початковий рівень. Створити консольну програму, яка за введеною темою отримує від моделі п’ять питань вікторини з чотирма варіантами відповіді.
2. Базовий рівень. Створити консольну програму, яка генерує вікторину за текстом з файлу як record Quiz (питання, варіанти, номер правильного), перевіряє, що варіантів рівно чотири, а номер правильного від 1 до 4, проводить вікторину і рахує бали.
3. Високий рівень. Створити застосунок WPF «Вікторина», який генерує питання з обраного файлу, показує їх по одному з перемикачами, зберігає вікторини в JSON для повторного проходження без моделі та виводить таблицю результатів гравців.
Варіант 16. Помічник садівника
1. Початковий рівень. Створити консольну програму, у якій модель дає поради щодо поливу рослини, викликаючи функцію-заглушку GetWeather(string city), що повертає температуру й опади.
2. Базовий рівень. Створити консольну програму-чат помічника садівника, у якій модель через IChatClient дає поради щодо поливу, викликаючи функції GetWeather(city, days) (заглушка з температурою й опадами, дні від 1 до 7) і GetPlantInfo(name) з довідника рослин у пам’яті, з перевіркою аргументів та відповіддю «рослину не знайдено» для відсутніх назв.
3. Високий рівень. Створити консольну програму «Сад», яка читає список рослин користувача з JSON, формує план поливу на тиждень як record WateringPlan, перевіряє план кодом (не більше двох поливів на день) і зберігає його в CSV; функції покрито тестами.
Варіант 17. Модерація коментарів
1. Початковий рівень. Створити консольну програму, яка визначає, чи містить коментар образи або спам, і виводить рішення «дозволити» чи «відхилити».
2. Базовий рівень. Створити консольну програму, яка для введеного коментаря через IChatClient отримує record ModerationResult (рішення «дозволити» чи «відхилити», категорія порушення, пояснення), відхиляє коментарі довші за 1000 символів без звернення до моделі та записує кожне рішення в журнал з часом.
3. Високий рівень. Створити консольну програму «Модерація», яка обробляє файл коментарів, стійка до спроб ін’єкції промпту (текст коментаря передається як дані, а не інструкції), формує зведену таблицю рішень і зберігає JSON-журнал; перевірку на наборі «підступних» коментарів оформити тестами з фейковим IChatClient.
Варіант 18. Перекладач термінів
1. Початковий рівень. Створити консольну програму, яка перекладає введене речення з англійської українською з системною інструкцією «технічний перекладач».
2. Базовий рівень. Створити консольну програму, яка перекладає введений текст з англійської українською через IChatClient, передає моделі глосарій термінів з CSV-файлу (англійський термін; переклад) у системній інструкції та після перекладу перевіряє кодом, що кожен термін глосарія, присутній в оригіналі, перекладено саме так, як у глосарії.
3. Високий рівень. Створити консольну програму «Глосарій» з опціями --glossary (CSV: термін; переклад), --input, --output і --help, яка перекладає текстовий файл з англійської українською по абзацах через IChatClient, виводить таблицю порушень глосарія, повторює переклад абзаців з порушеннями й записує результат у файл.
Варіант 19. Документація проєкту
1. Початковий рівень. Створити консольну програму, яка передає моделі вміст файлу README.md і відповідає на питання користувача лише за цим файлом.
2. Базовий рівень. Створити консольну програму, яка розбиває Markdown-файли папки на розділи за заголовками, для питання користувача знаходить найближчі розділи за косинусною подібністю векторних подань і виводить відповідь моделі (IChatClient) за цими розділами з назвами файлів-джерел.
3. Високий рівень. Створити консольну програму «Документація» з RAG за Markdown-файлами у векторному сховищі в пам’яті, опціями --folder, --top N, --threshold T і --help, цитуванням джерел номерами та тестами розбиття файлів на фрагменти.
Варіант 20. Помічник фінансів
1. Початковий рівень. Створити консольну програму, яка визначає категорію витрати (їжа, транспорт, комунальні, розваги, інше) за описом транзакції, введеним користувачем.
2. Базовий рівень. Створити консольну програму, яка читає транзакції з CSV-файлу (дата, опис, сума), категоризує описи (їжа, транспорт, комунальні, розваги, інше) через GetResponseAsync<T>, перевіряє суми кодом (модель не змінює суми) і виводить таблицю витрат за категоріями з підсумком.
3. Високий рівень. Створити застосунок WPF «Фінанси», який імпортує CSV-файл банківської виписки, вилучає номери карток перед надсиланням моделі, категоризує транзакції з можливістю ручного виправлення в DataGrid і будує діаграму витрат за категоріями.
Варіант 21. Журнали помилок
1. Початковий рівень. Створити консольну програму, яка передає моделі фрагмент журналу помилок з файлу і виводить імовірну причину та пораду.
2. Базовий рівень. Створити консольну програму, яка читає журнал помилок з файлу, групує рядки за типом винятку кодом, а для кожної групи отримує від моделі через IChatClient record Diagnosis (причина, рекомендація, важливість) і виводить таблицю груп з кількістю повторень.
3. Високий рівень. Створити консольну програму «Журнали» з аргументами --log файл, --since дата і --help, яка фільтрує записи за датою, обмежує обсяг тексту для моделі (не більше заданої кількості токенів), кешує діагнози однакових помилок і формує Markdown-звіт.
Варіант 22. Планувальник тренувань
1. Початковий рівень. Створити консольну програму, яка за метою користувача (схуднення, витривалість, сила) отримує від моделі план тренувань на тиждень.
2. Базовий рівень. Створити консольну програму, яка за метою користувача (схуднення, витривалість, сила) отримує від моделі через IChatClient план тренувань як record WeekPlan (дні, вправи, тривалість у хвилинах), перевіряє кодом, що загальне навантаження не перевищує введеного користувачем ліміту хвилин на тиждень, і виводить план таблицею.
3. Високий рівень. Створити застосунок WPF «Тренування», який генерує план за параметрами користувача, перевіряє навантаження й дні відпочинку, дає змогу позначати виконані тренування, зберігає план і прогрес у JSON та показує відсоток виконання.
Варіант 23. Опис фотографій
1. Початковий рівень. Створити консольну програму, яка надсилає мультимодальній моделі фотографію (DataContent) і виводить її опис українською.
2. Базовий рівень. Створити консольну програму, яка надсилає мультимодальній моделі фотографію з файлу (DataContent) і отримує record ImageAlt (альтернативний текст до 125 символів, 3–5 тегів), перевіряє тип файлу за розширенням і обмеження довжини та повторює запит, якщо їх порушено.
3. Високий рівень. Створити консольну програму «Alt-текст», яка обробляє всі зображення папки, записує альтернативні тексти в CSV, пропускає файли понад 5 МБ з повідомленням у потік помилок, має опції --folder, --lang і --help та виводить підсумкову таблицю.
Варіант 24. Помічник бібліотекаря
1. Початковий рівень. Створити консольну програму, у якій модель відповідає на питання про книги, викликаючи функцію SearchBooks(string query) зі списком книг у пам’яті.
2. Базовий рівень. Створити консольну програму-чат помічника бібліотекаря, у якій модель через IChatClient викликає функції пошуку, перевірки наявності та бронювання книги над списком книг у пам’яті; бронювання виконується лише після підтвердження користувача, а функції перевіряють аргументи та повертають зрозумілі повідомлення про помилки.
3. Високий рівень. Створити консольну програму «Бібліотекар», яка зберігає книги в базі даних SQLite через EF Core, дає моделі функції пошуку, бронювання та повернення книг, журналює виклики функцій і покриває функції модульними тестами.
Варіант 25. Пошук вакансій
1. Початковий рівень. Створити консольну програму, яка створює векторні подання описів п’яти вакансій і для введеного опису навичок виводить найбільш відповідну вакансію.
2. Базовий рівень. Створити консольну програму, яка ранжує вакансії з CSV-файлу за косинусною подібністю до тексту резюме з файлу, виводить топ-5 зі значенням подібності та відкидає вакансії з подібністю нижче порогу.
3. Високий рівень. Створити консольну програму «Вакансії», яка ранжує вакансії з CSV-файлу (назва, місто, зарплата, опис) за косинусною подібністю векторних подань до резюме з файлу, поєднує семантичний пошук із фільтрами (місто, мінімальна зарплата), просить модель пояснити відповідність трьох найкращих вакансій, має опції --resume, --city, --top і --help та зберігає звіт у JSON.
Варіант 26. Генератор SQL-запитів
1. Початковий рівень. Створити консольну програму, яка передає моделі опис схеми таблиці Students і питання користувача та виводить згенерований SQL-запит (без виконання).
2. Базовий рівень. Створити консольну програму, яка передає моделі опис схеми таблиці Students бази SQLite і питання користувача, отримує SQL-запит у record SqlAnswer, перевіряє кодом, що запит починається з SELECT і не містить INSERT, UPDATE, DELETE, DROP, ;, і лише тоді виконує його та виводить результат.
3. Високий рівень. Створити консольну програму «SQL-помічник», яка перетворює питання користувача на SQL-запит через IChatClient, читає схему бази SQLite автоматично, виконує лише перевірені запити SELECT з обмеженням LIMIT 100 через підключення лише для читання, виводить результати таблицею та тестує перевірку запитів на наборі небезпечних прикладів.
Варіант 27. Порівняння моделей
1. Початковий рівень. Створити консольну програму, яка надсилає однаковий запит двом локальним моделям (ChatOptions.ModelId) і виводить обидві відповіді.
2. Базовий рівень. Створити консольну програму, яка для списку запитів з файлу вимірює для кожної з двох моделей час відповіді (Stopwatch) і кількість токенів (Usage) та виводить порівняльну таблицю із середніми значеннями.
3. Високий рівень. Створити консольну програму «Бенчмарк» з опціями --models m1,m2, --prompts файл, --repeat N і --help, яка отримує клієнтів через DI за конфігурацією (Ollama або OpenAI з ключем у секретах користувача), вимірює мінімальний, середній і максимальний час та зберігає результати в CSV.
Варіант 28. Приймальна комісія
1. Початковий рівень. Створити консольну програму-чат, у якій модель відповідає на питання вступників за правилами прийому, переданими в системній інструкції з текстового файлу.
2. Базовий рівень. Створити консольну програму-чат приймальної комісії, яка відповідає лише на питання про вступ за правилами прийому з текстового файлу: спочатку модель класифікує питання (record TopicCheck), а для питань поза темою програма виводить ввічливу відмову без генерації відповіді.
3. Високий рівень. Створити застосунок WPF «Приймальна комісія» з RAG за документами правил прийому, посиланнями на пункти правил, відмовою відповідати на питання поза темою, потоковою відповіддю і журналом питань без персональних даних.
Варіант 29. Чат-бот музею
1. Початковий рівень. Створити консольну програму-чат, у якій модель розповідає про експонати музею з описами, переданими в системній інструкції.
2. Базовий рівень. Створити консольну програму-чат музею, яка знаходить опис експоната (описи задано в програмі або у файлі) за векторною подібністю до питання відвідувача, передає моделі лише знайдений опис і зберігає історію діалогу, щоб уточнювальні питання («а коли його створено?») стосувалися того самого експоната.
3. Високий рівень. Створити застосунок WPF «Музей» з RAG за описами експонатів з JSON-файлу, списком джерел під відповіддю, зображенням обраного експоната, потоковою відповіддю та скасуванням генерації.
Варіант 30. Кешування відповідей FAQ
1. Початковий рівень. Створити консольну програму, яка відповідає на питання FAQ через IChatClient з проміжним клієнтом UseDistributedCache і показує час кожної відповіді.
2. Базовий рівень. Створити консольну програму, яка відповідає на питання FAQ через IChatClient з кешуванням відповідей і власним проміжним клієнтом DelegatingChatClient, який рахує влучання й промахи кешу, та виводить статистику після серії повторюваних питань з файлу.
3. Високий рівень. Створити консольну програму «FAQ-кеш», яка реєструє конвеєр UseLogging, UseDistributedCache і власний клієнт статистики через DI, нормалізує питання (регістр, пробіли) перед кешуванням, має опції --questions, --no-cache, --help і перевіряє кешування модульними тестами з фейковим IChatClient.
Порядок виконання та захисту роботи
- Опрацювати теоретичні відомості та приклади розв’язання завдань; встановити Ollama і завантажити моделі, перевірити їх командою
ollama run. - Створити проєкт для свого варіанта, додати пакети
Microsoft.Extensions.AIіOllamaSharp; код, що працює з моделлю, писати лише черезIChatClientтаIEmbeddingGenerator. - Сформулювати системну інструкцію та, де потрібно, типи для структурованого виводу або методи з атрибутами
[Description]для виклику функцій; перевіряти кожну відповідь моделі кодом. - Обробити недоступність моделі, некоректні відповіді та скасування; обмежити довжину відповіді й історії діалогу.
- Перевірити програму на кількох запитах, зокрема на запитах поза темою та спробах змінити інструкцію; логіку без моделі перевірити з фейковим
IChatClient. - Переконатися, що ключі API та персональні дані не потрапили в код і репозиторій.
- Продемонструвати роботу програми викладачеві, пояснити програмний код і відповісти на контрольні питання.