Зачем этот tool-calling и почему все вдруг помешались
До марта 2026 года text-generation-webui был просто красивой оберткой для запуска моделей. Можно было болтать с локальной LLM, менять температуру и максимум токенов. Скучно. Релиз версии 4.1 всё перевернул — теперь вы можете заставить модель не просто генерировать текст, а реально что-то делать: искать файлы, отправлять запросы, парсить сайты. И всё это через интерфейс, который напоминает детский конструктор.
Tool-calling — это когда модель не отвечает "я не могу", а вместо этого говорит: "подожди, я сейчас вызову функцию поиска в Google". В теории звучит как магия. На практике в других средах это часто ломается. Но в text-generation-webui 4.1 реализовали так, что даже если вы никогда не слышали про API OpenAI, у вас получится.
Как это работает? Волшебство через чекбоксы
Весь механизм построен вокруг двух вещей: простых Python-файлов и галочек в интерфейсе. Вы создаете файл my_tools.py, пишете обычную функцию с описанием, кидаете его в папку extensions/tools — и через 30 секунд эта функция появляется в веб-интерфейсе как активный инструмент. Модель видит список доступных функций и их описания, а когда решает, что нужно что-то сделать — отправляет запрос на выполнение.
Первая функция за 5 минут: заставляем модель искать файлы
Забудьте про сложные настройки. Вот как это делается на самом деле.
1 Создаем файл в правильном месте
Зайдите в папку с установленным text-generation-webui. Найдите директорию extensions/tools. Если её нет — создайте. Внутри создайте файл с любым именем, например file_tools.py. Именно так — один файл может содержать десятки функций, и все они появятся в интерфейсе.
2 Пишем функцию с умным описанием
Вот пример функции, которая ищет файлы по расширению. Обратите внимание на docstring — модель будет читать именно его, чтобы понять, когда вызывать эту функцию.
import os
def find_files_by_extension(directory: str, extension: str) -> str:
"""
Search for files with specific extension in given directory.
Args:
directory: Path to directory to search in
extension: File extension to look for (without dot, e.g., 'txt', 'py')
Returns:
String with list of found files or error message
"""
try:
if not os.path.exists(directory):
return f"Directory {directory} does not exist"
files = []
for root, dirs, filenames in os.walk(directory):
for filename in filenames:
if filename.endswith(f'.{extension}'):
files.append(os.path.join(root, filename))
if not files:
return f"No .{extension} files found in {directory}"
return "\n".join(files[:10]) # Limit output
except Exception as e:
return f"Error: {str(e)}"
Сохраните файл. Перезапускать веб-интерфейс не нужно — инструменты загружаются автоматически при каждом запросе.
3 Включаем инструмент в интерфейсе
Откройте вкладку "Tools" в text-generation-webui. Вы увидите список всех функций из всех .py файлов в папке extensions/tools. Просто поставьте галочку рядом с find_files_by_extension. Вот и всё — теперь модель может использовать эту функцию.
Важно: модель должна поддерживать tool-calling. На март 2026 года лучше всего работают Qwen3.5 32B, DeepSeek Coder 33B и свежие версии Llama 4. Мелкие модели в 7B параметров часто путаются. Если ваша модель игнорирует инструменты — попробуйте другую или посмотрите гайд по исправлению tool-calling.
Реальный пример: агент, который ищет логи и отправляет отчет
Давайте создадим что-то полезное. Добавим в тот же file_tools.py ещё две функции: для чтения файла и отправки email (условно).
def read_file_contents(filepath: str) -> str:
"""
Read and return contents of a text file.
Args:
filepath: Full path to the file
Returns:
File contents as string or error message
"""
try:
with open(filepath, 'r', encoding='utf-8') as f:
return f.read(5000) # Limit to 5000 chars
except Exception as e:
return f"Error reading file: {str(e)}"
def send_email_report(subject: str, body: str, recipient: str = "admin@example.com") -> str:
"""
Send an email with report. This is a simulation for demonstration.
In real implementation, you would connect to SMTP server.
Args:
subject: Email subject
body: Email body content
recipient: Email address to send to
Returns:
Status message about email sending
"""
# In real tool, you would implement actual email sending
# For demo, just save to file
import datetime
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"email_{timestamp}.txt"
with open(filename, 'w') as f:
f.write(f"To: {recipient}\nSubject: {subject}\n\n{body}")
return f"Email saved to {filename} (simulation mode)"
Теперь в чате можно написать модели: "Найди все лог-файлы в папке /var/log, прочитай последний и пришли мне отчет". Если модель адекватная, она последовательно вызовет find_files_by_extension, потом read_file_contents, и наконец send_email_report. Вы будете наблюдать, как в интерфейсе появляются вызовы функций и их результаты.
text-generation-webui vs. Open WebUI и Ollama: где tool-calling не сломается?
У каждого подхода свои костыли. В Open WebUI tool-calling встроен более глубоко, но требует больше настроек. В Ollama иногда проще, но модели галлюцинируют вызовы.
| Платформа | Сложность настройки | Гибкость | Стабильность |
|---|---|---|---|
| text-generation-webui 4.1 | Низкая (чекбоксы + .py файлы) | Высокая (любой Python-код) | Средняя (зависит от модели) |
| Open WebUI | Средняя (нужно править конфиги) | Очень высокая (Docker, плагины) | Высокая |
| Ollama + LangChain | Высокая (программирование) | Максимальная | Низкая (часто ломается) |
Главное преимущество text-generation-webui — мгновенная обратная связь. Не понравилась функция? Открыли файл, поправили, сохранили — через 2 секунды изменения в интерфейсе. Не нужно перезагружать сервер, не нужно редактировать JSON. Это идеально для быстрого прототипирования.
Кому подойдет эта фича? (А кому лучше не лезть)
Если вы уже месяц ковыряете fine-tuning моделей под вызов функций — этот гайд покажется вам детским садом. Но именно в этом и сила.
- Скриптовикам на Python: Вы уже пишете скрипты для автоматизации. Теперь можете дать их модели, чтобы она решала, когда запускать.
- Сисопам: Мониторинг логов, проверка диска, перезапуск служб — всё через чат с локальной моделью.
- Исследователям: Быстро тестируете, как разные модели справляются с вызовом инструментов.
Не подойдет тем, кто ждет production-решения из коробки. Это инструмент для экспериментов. Функции выполняются в том же окружении, что и сам text-generation-webui, без песочницы. Если модель вызовет os.system('rm -rf /') — будут проблемы. (Хотя вы можете сами добавить проверки в код функций).
Неочевидный совет: используйте эту систему для создания прототипов агентов, а затем переносите логику в отдельный фреймворк вроде LangChain или собственный код на Python. Text-generation-webui — идеальная песочница, но не готовый продукт.
К марту 2026 года многие уже забыли, что такое писать промпты вручную. Автоматизация через prompt-инженерию становится стандартом. Tool-calling в text-generation-webui 4.1 — это следующий шаг: когда модель сама решает, какие инструменты использовать, без ваших подсказок. Попробуйте. Худшее, что может случиться — вы найдете все свои старые лог-файлы.