GigaChat Function Calling можно освоить на одном небольшом проекте, если сразу видеть вход, действие и результат. Function Calling позволяет модели выбрать описанный инструмент и подготовить структурированные аргументы вместо выдуманного результата. Ниже вы соберёте работающий пример и проверите обычный и граничный сценарии.
Модель не выполняет вашу функцию сама, а её аргументы остаются недоверенным вводом, который нельзя сразу передавать в базу, shell или внешний API. Поэтому отделим настройку, входные данные, основное действие и проверку. В этой статье вы соберёте ассистента заметок с инструментами add_note и list_notes, белым списком функций и проверкой аргументов. Проверка: фраза запомни купить молоко приводит к вызову add_note, аргумент проходит схему, а неизвестная функция отклоняется.
описать имя, назначение и JSON-параметры функции. Не расширяйте проект до первого успешного запуска.
ответ содержит текст или function_call. Проверяйте значение, а не отсутствие ошибки.
После успеха добавьте второй read-only инструмент и журнал вызовов. Так копирование станет практикой.
Как устроен учебный проект GigaChat Function Calling
GigaChat получает описание tools, возвращает function_call, dispatcher проверяет имя и аргументы, вызывает локальную функцию и добавляет результат в историю. Держите ввод, логику и отображение раздельно: тогда каждый этап можно проверить отдельно.
| Этап | Действие | Проверяемый результат |
|---|---|---|
| Схема | описать имя, назначение и JSON-параметры функции | модель видит допустимый инструмент |
| Запрос | отправить сообщение с tools и auto mode | ответ содержит текст или function_call |
| Проверка | сопоставить имя с белым списком и проверить аргументы | неизвестный вызов отклонён |
| Результат | выполнить функцию и вернуть данные модели | финальная реплика опирается на реальный результат |
Контрольные точки: схема, запрос, проверка и результат. Следующий шаг начинается после совпадения с ожидаемым результатом.

От входных данных до видимого результата. Сначала проверяется вход, затем действие и только потом интерфейс.
Собираем рабочий пример шаг за шагом
Материал сверялся с Python SDK GigaChat и контрактом Function Calling, обновлённым в сентябре 2026 года. Установите актуальный пакет gigachat, задайте GIGACHAT_CREDENTIALS и настройте доверенный сертификат НУЦ Минцифры. Проверьте текущую папку через pwd или Get-Location. Вставьте пример целиком, выполните один раз, затем разбирайте по частям.
from pathlib import Path
from typing import Any
NOTES = Path("notes.txt")
def add_note(text: str) -> dict[str, Any]:
clean = text.strip()
if not 1 <= len(clean) <= 200:
raise ValueError("Длина заметки должна быть от 1 до 200 символов")
with NOTES.open("a", encoding="utf-8") as file:
file.write(clean + "\n")
return {"saved": True, "text": clean}
TOOLS = {"add_note": add_note}
def dispatch(name: str, arguments: dict[str, Any]) -> dict[str, Any]:
function = TOOLS.get(name)
if function is None:
raise ValueError("Неизвестный инструмент")
if name == "add_note" and set(arguments) != {"text"}:
raise ValueError("Неверные аргументы")
return function(**arguments)
# function_call = extract_function_call(response.messages[0])
# result = dispatch(function_call.name, function_call.arguments)- Ручной вызов dispatch сохраняет одну строку и возвращает структурированный словарь.
- Неизвестное имя и лишний аргумент завершаются контролируемой ошибкой до выполнения функции.
- Повторный запуск даёт тот же предсказуемый результат.
- Пустой ввод получает понятное сообщение вместо падения.
Главная функция принимает явный вход и возвращает результат, который можно проверить отдельно от интерфейса. Найдите в примере вход, проверку и место формирования результата.

Что отличает устойчивый проект от случайного запуска. Явные границы делают ошибку локальной и понятной.
Что происходит внутри и почему это работает
Модель выбирает функцию и предлагает JSON-аргументы, но исполнение остаётся в вашем приложении. Белый список связывает внешнее имя с конкретным безопасным callable. Логику держите отдельно от вывода: функция получает аргумент и возвращает значение, а интерфейс показывает его. Не добавляйте универсальный execute_command или eval. Чем уже инструмент и права, тем легче проверить последствия и журналировать действие.
| Часть | За что отвечает | Что проверить |
|---|---|---|
| Tool schema | объясняет модели доступное действие | required и типы заданы явно |
| Dispatcher | проверяет имя и аргументы | доступен только белый список |
| Function result | возвращает фактические данные | история отличает вызов от ответа |
Function Calling не отменяет обычную безопасность. Авторизацию пользователя, лимиты, идемпотентность и подтверждение опасного действия проверяет приложение, а не модель. Не прячьте поток в одном обработчике: сохраните вход, проверьте его, вызовите операцию и только затем обновите интерфейс.
Проверяем проект и добавляем свою функцию
Добавьте list_notes без аргументов и запрос подтверждения перед будущей delete_note. Запишите каждый вызов в журнал без секретов. До правки запишите ожидаемое поведение одним предложением. После граничного теста повторите обычный сценарий.
- Сохраните ожидаемый результат: фраза запомни купить молоко приводит к вызову add_note, аргумент проходит схему, а неизвестная функция отклоняется.
- Измените правило: добавьте второй read-only инструмент и журнал вызовов. Сначала предскажите итог.
- Передайте граничное значение и убедитесь, что приложение не падает.
- Верните корректные данные и объясните роли трёх основных частей.
- модель видит допустимый инструмент
- ответ содержит текст или function_call
- неизвестный вызов отклонён
- финальная реплика опирается на реальный результат
После изменения повторите основной и ошибочный сценарии, чтобы новое поведение не сломало исходный результат. Полезная правка проходит от нового ввода до видимого результата.

Четыре проверки перед следующим шагом. Каждый следующий этап начинается после наблюдаемого результата.
Что запомнить и куда двигаться дальше
Следующий шаг состоит не в десятке инструментов, а в одном безопасном цикле: выбор, проверка, выполнение, результат и наблюдаемый журнал. Для закрепления откройте в первом AI-агенте, в базовом чате GigaChat и в первом MCP-сервере.
Как изучить тему в Кодике
Сначала разберите формат входных данных и одну функцию, затем подключайте внешний сервис или интерфейс. Сначала восстановите главную функцию и проверьте её на трёх значениях.
| Шаг | Что разобрать | Мини-проверка |
|---|---|---|
| 1. Основа | Функции, словари, typing и исключения Python | Объясните вход и выход функции. |
| 2. Инструмент | JSON Schema, tools и function_call GigaChat | Повторите команду по памяти. |
| 3. Проект | Безопасный dispatcher и проверку аргументов | Проверьте два сценария. |
| 4. Рефакторинг | Подтверждение действий, идемпотентность и журнал | Разделите ввод, логику и вывод. |
Закрепите проект, восстановив ключевую функцию по памяти и добавив собственный граничный случай. Базовый синтаксис закрепите через курс Python.
Она только предлагает имя и аргументы. Код вызывает функцию отдельно.
Недоверенный текст превращается в произвольное выполнение. Используйте словарь TOOLS.
Модель может вернуть лишние или неверные поля. Проверяйте схему.
Удаление или платёж требуют отдельного решения пользователя.
Что получится в итоге

Финальный экран показывает результат, состояние операции и понятное сообщение об ошибке без раскрытия секретов.
Кто фактически выполняет Python-функцию?
Ваше приложение после проверки имени, аргументов и прав.
Почему нужен белый список TOOLS?
Он не позволяет модели вызвать произвольный объект или системную команду.
Что проверять первым, если GigaChat Function Calling не запускается?
Версию среды, текущую папку, команду запуска и первую строку ошибки.
Как понять, что проект GigaChat Function Calling работает?
Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай.
Можно ли начать с готового кода?
Да. Добейтесь результата, измените одно правило и восстановите ключевую функцию без копирования.
Выберите одно улучшение и проведите его от ввода до результата.
Если не хватает основы, перейдите курс Python, затем восстановите ключевую функцию без подсказки.