Function calling, JSON-режим и стриминг: три приёма работы с LLM через OpenAI-совместимый API
При работе с большими языковыми моделями три приёма решают большую часть практических задач: вызов функций (function calling) позволяет модели «звать» ваш код, строгий JSON-ответ отдаёт структурированные данные вместо свободного текста, а потоковая выдача ускоряет отображение ответа. Все они работают в OpenAI-совместимом API из коробки, поэтому один и тот же код подходит и для официального OpenAI, и для AI-шлюза TokenMaster. Ниже разберём каждый приём на Python.
Что понадобится
- API-ключ TokenMaster вида
sk-…— создаётся в разделе «Ключи» после регистрации на tokenmaster.ru. - Python 3.8+ и установленная библиотека
openai.
Библиотека ставится одной командой:
pip install openai
Function calling: модель вызывает ваш код
Обычный ответ модели — текст. Function calling расширяет это: вы описываете модели доступные функции в формате JSON Schema, а она решает, какую из них вызвать и с какими аргументами. Вызов не выполняется автоматически — модель возвращает имя функции и параметры, а запускаете её уже вы.
from openai import OpenAI
client = OpenAI(
base_url="https://tokenmaster.ru/v1",
api_key="sk-...", # ваш ключ TokenMaster
)
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Получить текущую погоду в городе",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "Название города"}
},
"required": ["city"],
},
},
}
]
response = client.chat.completions.create(
model="deepseek-flash",
messages=[{"role": "user", "content": "Какая погода в Москве?"}],
tools=tools,
tool_choice="auto",
)
tool_calls = response.choices[0].message.tool_calls
print(tool_calls)
В tool_calls придут имя функции get_weather и аргументы {"city": "Москва"}. Дальше вы выполняете функцию (например, обращаетесь к API погоды), а результат добавляете в переписку сообщением с ролью tool и снова отправляете запрос — модель сформулирует финальный ответ на естественном языке. Такой паттерн удобен для чат-ботов с действиями: поиск по базе, бронирование, отправка писем.
Строгий JSON: response_format
Когда ответ нужно сразу разбирать в коде, просите модель вернуть валидный JSON вместо текста. Для этого передайте параметр response_format:
import json
from openai import OpenAI
client = OpenAI(
base_url="https://tokenmaster.ru/v1",
api_key="sk-...",
)
response = client.chat.completions.create(
model="deepseek-flash",
messages=[
{"role": "system", "content": "Верни строго JSON без лишнего текста."},
{"role": "user", "content": "Опиши товар: название, цена, наличие."},
],
response_format={"type": "json_object"},
)
data = json.loads(response.choices[0].message.content)
print(json.dumps(data, ensure_ascii=False, indent=2))
Параметр response_format={"type": "json_object"} включает JSON-режим: модель гарантированно возвращает корректный JSON, который сразу разбирается через json.loads. Учтите, что слово «JSON» должно встречаться в промпте — иначе часть моделей может вернуть обычный текст. Поля описывайте прямо в системном промпте: для товара это «название, цена, наличие», для клиента — «имя, телефон, город».
Стриминг: stream=true
По умолчанию API возвращает ответ целиком, и для длинных текстов приходится ждать. С флагом stream=True ответ приходит частями (чанками), которые можно показывать пользователю по мере генерации — как печатает текст сам ChatGPT.
client = OpenAI(
base_url="https://tokenmaster.ru/v1",
api_key="sk-...",
)
stream = client.chat.completions.create(
model="deepseek-flash",
messages=[{"role": "user", "content": "Напиши короткий рассказ о зиме"}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta
if delta.content:
print(delta.content, end="", flush=True)
Каждый chunk — кусочек ответа в поле delta.content. Склеивая чанки, вы получаете полный текст, но уже «на лету»: интерфейс отрисовывает первые слова мгновенно, а не после ожидания всего ответа.
Подключение TokenMaster
TokenMaster — это AI-шлюз с OpenAI-совместимым API, поэтому весь код выше работает без изменений. Подключение сводится к двум параметрам:
- Base URL:
https://tokenmaster.ru/v1 - API Key: ваш ключ вида
sk-…
Один ключ и один баланс открывают доступ к нескольким семействам моделей: DeepSeek (deepseek-flash, deepseek-v4-pro), GLM / Zhipu (glm-4.5, glm-5) и Qwen. Актуальный каталог и цены — на tokenmaster.ru/pricing, документация по API — на tokenmaster.ru/docs. Оплата принимается из России, без привязки к зарубежной карте.
Проверка работы
Запустите любой из скриптов. Если в терминале появились данные (вызов функции, JSON или потоковый текст) — всё настроено верно. Если возникла ошибка:
- 401 / invalid api key — ключ неверный или скопирован не целиком; он должен начинаться с
sk-. - connection error — проверьте Base URL: ровно
https://tokenmaster.ru/v1, без лишнего/chat/completionsв конце. - insufficient quota — на балансе TokenMaster недостаточно средств; пополните его в личном кабинете.
Частые вопросы
Нужен ли отдельный SDK для function calling и стриминга?
Нет. Все три приёма — tools, response_format и stream — это стандартные параметры OpenAI-совместимого API, и библиотека openai поддерживает их из коробки.
Какая модель подойдёт для этих задач?
Для быстрых и недорогих сценариев берите deepseek-flash; для сложных рассуждений и длинных ответов — deepseek-v4-pro или модели GLM и Qwen. Переключаться между ними можно, меняя только поле model.
Можно ли совмещать приёмы в одном запросе?
Да. Например, stream=True работает и с response_format, и с tools: модель вернёт JSON или вызов функции тоже по частям.
Итог
Три приёма — вызов функций, строгий JSON и потоковая выдача — покрывают большинство сценариев интеграции LLM: от чат-ботов с действиями до разбора данных и живого вывода текста. Все они реализуются стандартной библиотекой openai с Base URL https://tokenmaster.ru/v1 и ключом sk-…, поэтому подключение к TokenMaster занимает минуты, а один баланс даёт доступ к моделям DeepSeek, GLM и Qwen с оплатой из России.
TokenMaster