Function calling, JSON-режим и стриминг: три приёма работы с LLM через OpenAI-совместимый API

· function-calling json streaming 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

Один ключ sk-… и base URL https://tokenmaster.ru/v1 — доступ к DeepSeek, GLM, Qwen и другим моделям. Зарегистрироваться →