Работа с API

    Обзор

    Копировать страницу

    Схемы запросов и ответов NeuroAPI очень похожи на OpenAI Chat API, с несколькими небольшими отличиями. На высоком уровне NeuroAPI нормализует схему между моделями и провайдерами, поэтому вам нужно изучить только одну.

    Запросы

    Параметры запроса Completions

    Это схема тела вашего POST запроса к эндпоинту /v1/chat/completions. Она представлена в виде TypeScript-типа с подробными комментариями к каждому полю.

    // Определения подтипов приведены ниже
    type Request = {
      // Идентификатор модели для использования. См. таблицу совместимости моделей для получения информации о том, какие модели доступны.
      model?: string;
    
      // Список сообщений, составляющих диалог.
      messages?: Message[];
    
      // Формат, в котором модель должна выводить ответ.
      // Установка 'json_object' включает режим JSON, который заставляет модель генерировать валидный JSON.
      response_format?: { type: 'text' | 'json_object' };
    
      // До четырех последовательностей, при которых API прекратит генерацию токенов.
      stop?: string | string[];
    
      // Если установлено, будет отправляться частичный прогресс сообщений.
      // Токены будут отправляться как server-sent events по мере их доступности.
      stream?: boolean;
    
      // Опции для управления потоковой передачей.
      stream_options?: {
        // Если true, в конце потока будет отправлено событие usage.
        include_usage: boolean;
      };
    
      // Максимальное количество токенов для генерации в чате.
      // для семейства gpt-5 параметр max_completion_tokens автоматически конвертируется в max_tokens
      max_tokens?: number;
    
      // Какую температуру сэмплинга использовать, от 0 до 2.
      // Более высокие значения (например, 0.8) делают вывод более случайным,
      // в то время как более низкие значения (например, 0.2) делают его более сфокусированным и детерминированным.
      // не работает для моделей семейства gpt-5
      temperature?: number;
    
      // Альтернатива сэмплингу с температурой, называемая nucleus sampling.
      // Модель рассматривает результаты токенов с вероятностной массой top_p.
      // Так, 0.1 означает, что рассматриваются только токены, составляющие верхние 10% вероятностной массы.
      // не работает для моделей семейства gpt-5
      top_p?: number;
    
      // Список инструментов, которые модель может вызывать.
      // В настоящее время поддерживаются только функции.
      tools?: Tool[];
    
      // Определяет, как модель будет использовать инструменты.
      // 'none' - не вызывать инструменты. 'auto' - модель решает. 'required' - вызвать хотя бы один инструмент.
      // Можно указать конкретную функцию для вызова.
      tool_choice?: 'none' | 'auto' | 'required' | { type: 'function'; function: { name: string; } };
    };
    
    // Подтипы:
    type Message = {
      // Роль автора этого сообщения.
      role: 'user' | 'assistant' | 'system' | 'tool';
    
      // Содержимое сообщения. Может быть строкой или массивом частей контента.
      content: string | ContentPart[];
    
      // Имя автора этого сообщения. Может содержать a-z, A-Z, 0-9 и знаки подчеркивания, с максимальной длиной 64 символа.
      name?: string;
      
      // Если роль 'tool', это ID вызова инструмента.
      tool_call_id?: string;
    };
    
    type ContentPart = {
      // Тип части контента.
      type: 'text' | 'image_url';
      
      // Текст сообщения.
      text?: string;
      
      // URL изображения для анализа моделью.
      image_url?: {
        // URL-адрес изображения или данные изображения в кодировке base64.
        url: string;
        // Определяет уровень детализации, который модель использует для анализа изображения.
        // 'low' - меньше затрат, 'high' - более детальный анализ.
        detail?: 'auto' | 'low' | 'high';
      };
    };
    
    type Tool = {
      // Тип инструмента. В настоящее время поддерживается только 'function'.
      type: 'function';
      
      function: {
        // Описание того, что делает функция.
        description?: string;
        // Имя функции, которую нужно вызвать.
        name: string;
        // Параметры, которые принимает функция, в формате JSON Schema.
        parameters: object;
      };
    };

    Потоковая передача (SSE): Для включения потоковой передачи (streaming) для всех моделей используется технология Server-Sent Events (SSE). Просто установите параметр stream: true в теле вашего запроса. Это позволяет получать ответ от модели по частям, по мере их генерации.

    Неподдерживаемые параметры: Если выбранная модель не поддерживает какой-либо из параметров запроса (например, top_k для моделей OpenAI), этот параметр будет автоматически проигнорирован.

    Ответы

    Схема ответа

    NeuroAPI нормализует схему между моделями и провайдерами для соответствия OpenAI Chat API. Ниже представлена схема ответа в формате TypeScript.

    // Определения подтипов приведены ниже
    type Response = {
      // Уникальный идентификатор чата.
      id: string;
    
      // В зависимости от того, установили ли вы "stream" в "true", вы
      // получите различную форму вывода.
      choices: (NonStreamingChoice | StreamingChoice)[];
    
      // Unix-метка времени (в секундах) создания чата.
      created: number;
    
      // Модель, использованная для генерации.
      model: string;
    
      // Тип объекта, всегда 'chat.completion' или 'chat.completion.chunk'.
      object: 'chat.completion' | 'chat.completion.chunk';
    
      // Уникальный идентификатор, представляющий внутреннюю конфигурацию бэкенда,
      // которая была использована для этого запроса.
      system_fingerprint?: string;
    
      // Данные об использовании токенов для запроса.
      // При потоковой передаче это поле отправляется в последнем сообщении.
      usage?: ResponseUsage;
    };
    
    type ResponseUsage = {
      // Количество токенов в промпте.
      prompt_tokens: number;
      
      // Количество токенов в сгенерированном ответе.
      completion_tokens: number;
    
      // Общее количество токенов в запросе и ответе.
      total_tokens: number;
    };
    
    // Подтипы для НЕ-потокового ответа:
    type NonStreamingChoice = {
      // Причина, по которой модель прекратила генерацию токенов.
      // 'stop' - естественная остановка, 'length' - достигнут лимит токенов,
      // 'tool_calls' - вызов инструмента, 'content_filter' - отфильтровано.
      finish_reason: string | null;
    
      // Сгенерированное сообщение.
      message: {
        // Содержимое сообщения.
        content: string | null;
        // Роль автора ('assistant').
        role: string;
        // Инструменты, вызванные моделью.
        tool_calls?: ToolCall[];
      };
    
      // Информация об ошибке, если она произошла.
      error?: ErrorResponse;
    };
    
    // Подтипы для ПОТОКОВОГО ответа:
    type StreamingChoice = {
      // Причина, по которой модель прекратила генерацию токенов.
      // Появляется только в последнем фрагменте потока.
      finish_reason: string | null;
    
      // Дельта-фрагмент сообщения.
      delta: {
        // Часть содержимого сообщения.
        content: string | null;
        // Роль автора (обычно только в первом фрагменте).
        role?: string;
        // Инструменты, вызванные моделью (появляются по частям).
        tool_calls?: ToolCall[];
      };
    
      // Информация об ошибке, если она произошла.
      error?: ErrorResponse;
    };
    
    // Информация об ошибке
    type ErrorResponse = {
      code: number;
      message: string;
      metadata?: Record<string, unknown>;
    };
    
    // Вызов инструмента
    type ToolCall = {
      // ID вызова инструмента.
      id: string;
      // Тип инструмента (всегда 'function').
      type: 'function';
      // Функция, которую вызвала модель.
      function: {
        // Имя функции.
        name: string;
        // Аргументы функции в виде JSON-строки.
        arguments: string;
      };
    };

    Пример ответа

    {
      "id": "chatcmpl-xxxxxxxxxxxxxx",
      "choices": [
        {
          "finish_reason": "stop", // Нормализованный finish_reason
          "message": {
            // будет "delta" если потоковая передача
            "role": "assistant",
            "content": "Привет!"
          }
        }
      ],
      "usage": {
        "prompt_tokens": 10,
        "completion_tokens": 2,
        "total_tokens": 12
      },
      "model": "gpt-4o" // Может также быть "claude-3-sonnet", и т.д., в зависимости от модели
    }

    Причина завершения

    NeuroAPI нормализует finish_reason каждой модели к одному из следующих значений: tool_calls, stop, length, content_filter, function_call.

    Некоторые модели и провайдеры могут иметь дополнительные причины завершения. Исходная строка finish_reason, возвращаемая моделью, доступна через свойство native_finish_reason.

    Подсчет токенов

    Система подсчитывает общее количество токенов перед обработкой запроса для оценки стоимости и проверки лимитов. Подсчет производится на основе содержимого сообщений и используемых инструментов.

    Текстовые данные

    Для текстового содержимого используется токенизатор, совместимый с моделями OpenAI. Общее количество токенов включает в себя токены из ролей (например, 'user', 'assistant') и содержимого каждого сообщения в диалоге, а также токены из описаний функций, если они переданы в параметре tools.

    Изображения

    Стоимость обработки изображений зависит от их размера и параметра detail в объекте image_url.

    • detail: 'low': Изображение обрабатывается с низким разрешением, что соответствует фиксированной и меньшей стоимости в токенах.
    • detail: 'high': Изображение обрабатывается в высоком разрешении. В этом режиме его сначала масштабируют, а затем "нарезают" на плитки размером 512x512 пикселей. Итоговая стоимость зависит от количества таких плиток.