Разберём, как создать ИИ-агента без фреймворков на Python. Напишем агента для ревью кода в 80 строках. Попробуйте сами!
Фреймворки вроде LangChain или CrewAI кажутся магией, но на деле они просто упрощают память, вызов инструментов и повторные попытки. Как только вы поймёте механизм, вы сможете решать, когда фреймворк действительно нужен. А ещё — вы сможете написать своего агента примерно за 80 строк кода на Python. Давайте сделаем это!
Агент — это просто цикл, который общается с LLM и выполняет инструменты. Вместо бесконечного while мы используем for с лимитом итераций, чтобы не потратить все токены. В основе лежит простая идея: отправляем модели сообщение и список доступных инструментов, получаем ответ, если модель просит вызвать инструмент — вызываем и отправляем результат обратно. Повторяем, пока модель не вернёт финальный текст.
Стив — сеньор-разработчик с 15-летним стажем. Он саркастичен, но точен. Он просматривает локальный git diff и даёт советы. Мы написали его на Python, используя Gemini API (дешёвые токены).
Вот основной цикл:
import google.generativeai as genai
# Настройка модели
genai.configure(api_key='YOUR_API_KEY')
model = genai.GenerativeModel('gemini-2.5-flash')
# Инструменты, которые может вызывать агент
tools = [
{
'name': 'get_diff',
'description': 'Получить git diff текущего репозитория',
'parameters': {}
},
{
'name': 'get_file',
'description': 'Прочитать файл из репозитория',
'parameters': {'path': {'type': 'string'}}
},
{
'name': 'list_files',
'description': 'Список файлов в директории',
'parameters': {'path': {'type': 'string'}}
}
]
def agent_loop(user_message):
max_iterations = 10
history = [{'role': 'user', 'parts': [{'text': user_message}]}]
for _ in range(max_iterations):
# Отправляем историю и инструменты модели
response = model.generate_content(
contents=history,
tools=tools
)
# Проверяем, есть ли запрос на вызов инструмента
if response.candidates[0].content.parts[0].function_call:
func_call = response.candidates[0].content.parts[0].function_call
tool_name = func_call.name
args = func_call.args
# Выполняем инструмент локально
if tool_name == 'get_diff':
result = get_git_diff()
elif tool_name == 'get_file':
result = read_file(args['path'])
elif tool_name == 'list_files':
result = list_directory(args['path'])
else:
result = 'Неизвестный инструмент'
# Добавляем ответ инструмента в историю
history.append({
'role': 'user',
'parts': [{
'function_response': {
'name': tool_name,
'response': {'result': result}
}
}]
})
else:
# Если нет вызова инструмента — это финальный ответ
return response.text
return 'Превышено количество итераций'
Вот и всё! Осталось реализовать функции get_git_diff, read_file и list_directory — они тривиальны. Добавим системный промпт для Стива:
system_instruction = """Ты — Стив, сеньор-разработчик с 15-летним опытом. Твоя задача — ревьюить код. Будь саркастичным, но конструктивным."""
Теперь объединим всё в одном файле agent.py:
import subprocess
import os
def get_git_diff():
result = subprocess.run(['git', 'diff'], capture_output=True, text=True)
return result.stdout
def read_file(path):
with open(path, 'r') as f:
return f.read()
def list_directory(path):
return os.listdir(path)
# Основной запуск
if __name__ == '__main__':
user_msg = 'Проверь текущий git diff'
review = agent_loop(user_msg)
print(review)
Готово! Агент Стив готов к работе.
Теперь вы знаете, как устроен ИИ-агент изнутри. Вы можете расширить его: добавить инструменты для работы с MCP, заменить облачную модель на локальную (например, Llama), или улучшить обработку ошибок. Попробуйте запустить этого агента у себя и поэкспериментируйте с промптом.
Не бойтесь писать своих агентов с нуля. Фреймворки удобны, но понимание основ даёт вам контроль и гибкость. Начните с малого — напишите агента для своей задачи прямо сейчас.
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →