Виконання завдань по роботі в ІТ галузі.
AI агенти - це автономні програмні системи, здатні сприймати своє середовище, приймати рішення та виконувати дії для досягнення певних цілей. Google Agent Development Kit (ADK) - це набір інструментів для створення інтелектуальних агентів на основі великих мовних моделей.
Для роботи з AI агентами нам потрібен ключ API від Google. Перейдіть на Google AI Studio та створіть новий API ключ. Використовуйте власний Google акаунт для цього (@gmail.com). Даний акаунт дозволить користуватись безкоштовними квотами для розробки та тестування агентів.
:star: Збережіть отриманий API ключ у безпечному місці. Він знадобиться для роботи з агентами.
:fire: ВАЖЛИВО: Ніколи не комітьте API ключі в Git репозиторій! Для їх зберігання використовуйте файл .env та додайте його до .gitignore.
У цьому проекті застосовується Poetry - сучасний інструмент для управління залежностями та пакетами Python. Poetry вже має бути встановлений у вашій системі після виконання роботи про віртуальні середовища.
python --version
poetry --version
cd notes/06_python_agents
poetry init
poetry add google-adk python-dotenv
google-adk додайте у pyproject.toml наступні рядки для сумісності з Python 3.13:
requires-python = ">=3.13,<4.0.0"
:star: Переконайтесь що створився файл poetry.lock. Поясніть у звіті для чого потрібен цей файл.
poetry run adk --version
:star: Вкажіть у звіті версію ADK яка встановлена.
poetry run adk --help
adk create для автоматичного створення структури проекту. Створимо наш перший проект агента:
poetry run adk create my_first_agent
[!WARNING] Не комітьте API ключі в Git репозиторій! Додайте файл
.envдо.gitignore.
ls -la my_first_agent/
Ви побачите наступну структуру:
my_first_agent/
agent.py # основний код агента
.env # API ключі
__init__.py # ініціалізація модуля
my_first_agent/agent.py та перегляньте згенерований код. За замовчуванням ADK створює базовий шаблон агента.my_first_agent/agent.py та замініть його вміст на наступний код:
from google.adk.agents.llm_agent import Agent
# Визначаємо функцію-інструмент
def get_current_time(city: str) -> dict:
"""
Повертає поточний час у вказаному місті.
Args:
city: назва міста
Returns:
dict: інформація про час у вказаному місті
"""
# Це mock-реалізація для демонстрації
import datetime
current_time = datetime.datetime.now().strftime("%H:%M:%S")
return {
"status": "success",
"city": city,
"time": current_time
}
# Створюємо агента
root_agent = Agent(
model='gemini-2.5-flash',
name='time_agent',
description="Повідомляє поточний час у вказаному місті.",
instruction="Ти корисний асистент, який повідомляє поточний час у містах. Використовуй функцію 'get_current_time' для цього. Відповідай українською мовою та використовуй подачу дати/часу у форматі HH:MM:SS.",
tools=[get_current_time],
)
Agent клас?tools?get_current_time?adk run:
poetry run adk run my_first_agent
Який зараз час у Львові?
:star: Зробіть скріншот або скопіюйте діалог з агентом у звіт. Агент повинен викликати функцію get_current_time та повернути результат.
:star: Поставте агенту ще 2-3 запитання про час у різних містах. Додайте результати у звіт.
Ctrl+C або ввівши exit.poetry run adk web --port 8000
:fire: ВАЖЛИВО: Команду adk web потрібно запускати з батьківської папки, яка містить папку вашого агента, тобто кореневої папки де міститься файл pyproject.toml.
:star: Відкрийте браузер та перейдіть на адресу http://localhost:8000.
:star: Виберіть агента my_first_agent у верхньому лівому кутку інтерфейсу.
:star: Протестуйте агента через веб-інтерфейс, поставивши йому кілька запитань. Зробіть скріншот веб-інтерфейсу та додайте до звіту.
poetry run adk create math_agent
echo 'GOOGLE_API_KEY="ваш_api_ключ_тут"' > math_agent/.env
math_agent/agent.py та замініть код на наступний:
from google.adk.agents.llm_agent import Agent
def calculate_rectangle_area(width: float, height: float) -> float:
"""
Обчислює площу прямокутника.
Args:
width: ширина прямокутника
height: висота прямокутника
Returns:
float: площа прямокутника
"""
return width * height
def calculate_circle_area(radius: float) -> float:
"""
Обчислює площу кола.
Args:
radius: радіус кола
Returns:
float: площа кола
"""
import math
return math.pi * radius ** 2
def calculate_cube_volume(side: float) -> float:
"""
Обчислює об'єм куба.
Args:
side: довжина ребра куба
Returns:
float: об'єм куба
"""
return side ** 3
# Створюємо математичного агента
root_agent = Agent(
model='gemini-2.5-flash',
name='math_agent',
description="Виконує математичні обчислення геометричних фігур.",
instruction="""
Ти експертний математичний асистент який допомагає з обчисленнями.
У тебе є інструменти для обчислення площі прямокутника, площі кола та об'єму куба.
Використовуй ці інструменти коли потрібно виконати розрахунки.
Відповідай українською мовою та поясни хід обчислень.
""",
tools=[calculate_rectangle_area, calculate_circle_area, calculate_cube_volume],
)
poetry run adk web --port 8000
poetry run adk create student_helper
echo 'GOOGLE_API_KEY="ваш_api_ключ_тут"' > student_helper/.env
student_helper/agent.py та створіть агента з кастомною інструкцією:
from google.adk.agents.llm_agent import Agent
def explain_concept(concept: str, level: str = "beginner") -> dict:
"""
Пояснює концепцію програмування.
Args:
concept: назва концепції для пояснення
level: рівень складності (beginner, intermediate, advanced)
Returns:
dict: пояснення та приклади
"""
explanations = {
"beginner": f"Базове пояснення концепції {concept}",
"intermediate": f"Поглиблене пояснення концепції {concept}",
"advanced": f"Експертне пояснення концепції {concept}"
}
return {
"status": "success",
"concept": concept,
"level": level,
"explanation": explanations.get(level, "Невідомий рівень")
}
def check_syntax(code: str, language: str = "python") -> dict:
"""
Перевіряє синтаксис коду (базова перевірка).
Args:
code: код для перевірки
language: мова програмування
Returns:
dict: результат перевірки
"""
# Проста перевірка для демонстрації
if not code.strip():
return {"status": "error", "message": "Код порожній"}
return {"status": "success", "message": "Синтаксис виглядає коректно", "language": language}
root_agent = Agent(
model='gemini-2.5-flash',
name='student_helper',
description="Помічник для студентів які вивчають програмування.",
instruction="""
Ти досвідчений викладач з ООП програмування який допомагає студентам.
Твої обов'язки:
- Пояснювати складні концепції простими словами
- Наводити приклади коду
- Перевіряти синтаксис коду
- Давати поради щодо best practices
- Бути терплячим та підтримуючим
- За замовчуванням використовувати Python для прикладів, якщо не вказано іншу мову
Завжди відповідай українською мовою.
Використовуй форамування Markdown для коду.
""",
tools=[explain_concept, check_syntax],
)
poetry run adk run student_helper
poetry run adk create creative_writer
echo 'GOOGLE_API_KEY="ваш_api_ключ_тут"' > creative_writer/.env
creative_writer/agent.py та створіть агента з налаштуваннями для креативного письма:
from google.adk.agents.llm_agent import Agent
from google.genai.types import GenerateContentConfig
def generate_story_prompt(theme: str, characters: int = 2) -> str:
"""
Генерує промпт для історії.
Args:
theme: тема історії
characters: кількість персонажів
Returns:
str: промпт для генерації історії
"""
return f"Створи цікаву історію на тему '{theme}' з {characters} персонажами."
root_agent = Agent(
model='gemini-2.5-flash',
name='creative_writer',
description="Креативний письменник історій.",
instruction="""
Ти талановитий письменник який створює захоплюючі історії.
Твої історії мають бути:
- Цікавими та захоплюючими
- З несподіваними поворотами сюжету
- З яскравими персонажами
- Написаними українською мовою
Використовуй багатий словниковий запас та літературні прийоми.
""",
tools=[generate_story_prompt],
# Налаштування для більш креативних відповідей
config=GenerateContentConfig(
temperature=1.5, # Висока температура для креативності
top_k=40,
top_p=0.95,
)
)
poetry run adk run creative_writer
Поставте їм однакове запитання та порівняйте відповіді. Додайте результати у звіт.
poetry run adk create conversation_agent
echo 'GOOGLE_API_KEY="ваш_api_ключ_тут"' > conversation_agent/.env
conversation_agent/agent.py:
from google.adk.agents.llm_agent import Agent
from google.adk.tools.tool_context import ToolContext
def save_user_preference(tool_context: ToolContext, preference_type: str, value: str) -> dict:
"""
Зберігає вподобання користувача.
Args:
preference_type: тип вподобання (улюблений_колір, хобі, тощо)
value: значення вподобання
Returns:
dict: підтвердження збереження
"""
existing_state = tool_context.state.get(preference_type, [])
tool_context.state[preference_type] = existing_state + [value]
print(f"[Added to {preference_type}] {value}")
return {
"status": "success",
"message": f"Збережено: {preference_type} = {value}"
}
def recall_preference(tool_context: ToolContext, preference_type: str) -> dict:
"""
Згадує вподобання користувача.
Args:
preference_type: тип вподобання для пошуку
Returns:
dict: збережене вподобання або повідомлення про відсутність
"""
# Примітка: історія зберігається автоматично в ADK
preferences = tool_context.state.get(preference_type, [])
if preferences:
return {
"status": "success",
"message": f"Згадано: {preference_type} = {', '.join(preferences)}"
}
else:
return {
"status": "error",
"message": f"Не знайдено вподобань типу: {preference_type}"
}
root_agent = Agent(
model='gemini-2.5-flash',
name='conversation_agent',
description="Розмовний агент який памʼятає користувача.",
instruction="""
Ти дружелюбний асистент який веде розмову з користувачем.
Важливо:
- Памʼятай що користувач розповідає про себе та зберігай цю інформацію як вподобання за допомогою інструменту save_user_preference
- Використовуй цю інформацію у подальшій розмові використовуючи інструмент recall_preference
- Стався уважно до деталей, які користувач розповідає про себе, це допоможе тобі краще його розуміти та підтримувати цікаву розмову
- Будь ввічливим та цікавим співрозмовником
- Звертайся до користувача по імені, якщо він його назве, та намагайся запамʼятати його інтереси та вподобання для подальшого використання у розмові
Відповідай українською мовою.
""",
tools=[save_user_preference, recall_preference],
)
poetry run adk web --port 8000
poetry run adk run my_first_agent --verbose
:star: Запустіть агента у verbose режимі та помітьте що додаткова інформація виводиться. Вкажіть у звіті яку додаткову інформацію ви побачили.
import logging
from google.adk.agents.llm_agent import Agent
# Налаштування логування
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def logging_tool(param: str) -> dict:
"""Приклад інструменту з логуванням"""
logger.info(f"Виклик інструменту logging_tool з параметром: {param}")
return {"result": "success", "processed_param": param}
root_agent = Agent(
model='gemini-2.5-flash',
name='logging_agent',
description="Агент з логуванням.",
instruction="Використовуй інструменти та логуй всі дії.",
tools=[logging_tool],
)
notes/06_python_agents/
├── my_first_agent/
│ ├── agent.py
│ ├── .env
│ └── __init__.py
├── math_agent/
│ ├── agent.py
│ ├── .env
│ └── __init__.py
├── student_helper/
│ ├── agent.py
│ ├── .env
│ └── __init__.py
├── tools/
│ ├── __init__.py
│ └── common_tools.py
├── pyproject.toml
├── poetry.lock
└── README.md
:star: Створіть мінімум 3 різних агенти у окремих папках. Додайте скріншот структури папок у звіт.
tools/:
mkdir tools
touch tools/__init__.py
touch tools/common_tools.py
tools/common_tools.py можна зберігати спільні інструменти:
"""Спільні інструменти для всіх агентів"""
def format_text(text: str, style: str = "uppercase") -> str:
"""
Форматує текст за вказаним стилем.
Args:
text: текст для форматування
style: стиль (uppercase, lowercase, title)
Returns:
str: відформатований текст
"""
if style == "uppercase":
return text.upper()
elif style == "lowercase":
return text.lower()
elif style == "title":
return text.title()
return text
def count_words(text: str) -> dict:
"""
Підраховує кількість слів у тексті.
Args:
text: текст для аналізу
Returns:
dict: статистика по тексту
"""
words = text.split()
return {
"total_words": len(words),
"total_chars": len(text),
"unique_words": len(set(words))
}
from tools.common_tools import format_text, count_words
def safe_divide(a: float, b: float) -> dict:
"""Ділить два числа з перевіркою на нуль."""
if b == 0:
return {"error": "Ділення на нуль неможливе", "result": None}
return {"result": a / b, "error": None}
poetry run adk create stateful_agent
echo 'GOOGLE_API_KEY="ваш_api_ключ_тут"' > stateful_agent/.env
stateful_agent/agent.py:
import json
from pathlib import Path
from google.adk.agents.llm_agent import Agent
STATE_FILE = Path("stateful_agent/user_state.json")
def load_state() -> dict:
"""Завантажує стан з файлу"""
if STATE_FILE.exists():
with open(STATE_FILE, 'r', encoding='utf-8') as f:
return json.load(f)
return {}
def save_state(data: dict) -> dict:
"""Зберігає стан у файл"""
with open(STATE_FILE, 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
return {"status": "saved", "data": data}
def remember_fact(key: str, value: str) -> dict:
"""Запамʼятовує факт про користувача"""
state = load_state()
state[key] = value
return save_state(state)
def recall_fact(key: str) -> dict:
"""Згадує факт про користувача"""
state = load_state()
value = state.get(key)
if value:
return {"key": key, "value": value, "found": True}
return {"key": key, "value": None, "found": False}
root_agent = Agent(
model='gemini-2.5-flash',
name='stateful_agent',
description="Агент який памʼятає користувача між сесіями.",
instruction="""
Ти персональний асистент який памʼятає інформацію про користувача.
Коли користувач розповідає щось про себе, використовуй remember_fact.
Коли потрібно згадати щось, використовуй recall_fact.
Будь уважним та корисним. Відповідай українською мовою.
""",
tools=[remember_fact, recall_fact],
)
Workflow агенти - це спеціалізовані компоненти ADK, призначені для оркестрації виконання підагентів. На відміну від LLM агентів, workflow агенти працюють за заздалегідь визначеною логікою (детерміністично) і керують тим, як і коли інші агенти виконуються.
SequentialAgent виконує підагенти один за одним у строгому порядку. Використовуйте його коли потрібно виконати завдання у фіксованій послідовності.
poetry run adk create code_pipeline
echo 'GOOGLE_API_KEY="ваш_api_ключ_тут"' > code_pipeline/.env
Скопіюйте код з code_pipeline/agent.py та створіть pipeline для розробки коду.
poetry run adk run code_pipeline
:star: Протестуйте з запитом: “Створи функцію для обчислення факторіалу числа”. Агент послідовно виконає всі три етапи. Додайте результат у звіт.
LoopAgent виконує підагенти у циклі до досягнення умови завершення. Використовуйте його для ітеративного покращення результату.
poetry run adk create story_improver
echo 'GOOGLE_API_KEY="ваш_api_ключ_тут"' > story_improver/.env
Скопіюйте код з story_improver/agent.py та створіть агента який покращує історію у циклі.
poetry run adk run story_improver
:star: При запуску введіть тему: “робот який навчився мріяти”. Агент буде ітеративно покращувати історію. Додайте результат у звіт.
exit_loop функцію.ParallelAgent виконує підагенти одночасно (паралельно). Використовуйте для незалежних завдань, які можна виконувати конкурентно.
poetry run adk create research_team
echo 'GOOGLE_API_KEY="ваш_api_ключ_тут"' > research_team/.env
Скопіюйте код з research_team/agent.py. Цей агент виконує три дослідження паралельно та обʼєднує результати.
poetry run adk run research_team
:star: Запитайте: “Які останні тренди у технологіях?”. Агент виконає три дослідження паралельно та обʼєднає результати. Додайте звіт у ваш звіт.
| Тип агента | Коли використовувати | Приклад |
|---|---|---|
| Sequential | Завдання потрібно виконати у строгому порядку | Pipeline: код → рев’ю → рефакторинг |
| Loop | Потрібне ітеративне покращення до певної умови | Покращення тексту до досягнення якості |
| Parallel | Незалежні завдання можна виконати одночасно | Дослідження різних тем паралельно |
Додайте код та результат у звіт.
notes/06_python_agents/;.env у кожній папці агента НЕ додані до репозиторію (мають бути у .gitignore);poetry.lock та pyproject.toml додані до репозиторію;agent.py файли мають коректний код з root_agent;