Skip to content

Базовое использование

Начало работы с Responses API

Responses API поддерживает как простой строковый ввод, так и структурированные массивы сообщений, что упрощает начало работы с базовой генерацией текста.

Простой строковый ввод

Самый простой способ использования API - с строковым вводом:

typescript
const response = await fetch('https://api.aitunnel.ru/v1/responses', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer sk-aitunnel-xxx',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: 'gpt-4o',
    input: 'В чем смысл жизни?',
    max_output_tokens: 9000,
  }),
});

const result = await response.json();
console.log(result);
python
import requests

response = requests.post(
    'https://api.aitunnel.ru/v1/responses',
    headers={
        'Authorization': 'Bearer sk-aitunnel-xxx',
        'Content-Type': 'application/json',
    },
    json={
        'model': 'gpt-4o',
        'input': 'В чем смысл жизни?',
        'max_output_tokens': 9000,
    }
)

result = response.json()
print(result)
bash
curl -X POST https://api.aitunnel.ru/v1/responses \
  -H "Authorization: Bearer sk-aitunnel-xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "input": "В чем смысл жизни?",
    "max_output_tokens": 9000
  }'

Структурированный ввод сообщений

Для более сложных разговоров используйте формат массива сообщений:

typescript
const response = await fetch('https://api.aitunnel.ru/v1/responses', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer sk-aitunnel-xxx',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: 'gpt-4o',
    input: [
      {
        type: 'message',
        role: 'user',
        content: [
          {
            type: 'input_text',
            text: 'Расскажи шутку про программирование',
          },
        ],
      },
    ],
    max_output_tokens: 9000,
  }),
});

const result = await response.json();
console.log(result);
python
response = requests.post(
    'https://api.aitunnel.ru/v1/responses',
    headers={
        'Authorization': 'Bearer sk-aitunnel-xxx',
        'Content-Type': 'application/json',
    },
    json={
        'model': 'gpt-4o',
        'input': [
            {
                'type': 'message',
                'role': 'user',
                'content': [
                    {
                        'type': 'input_text',
                        'text': 'Расскажи шутку про программирование',
                    },
                ],
            },
        ],
        'max_output_tokens': 9000,
    }
)

result = response.json()
print(result)

Формат ответа

API возвращает структурированный ответ с сгенерированным контентом:

json
{
  "id": "resp_1234567890",
  "object": "response",
  "created_at": 1234567890,
  "model": "gpt-4o",
  "output": [
    {
      "type": "message",
      "id": "msg_abc123",
      "status": "completed",
      "role": "assistant",
      "content": [
        {
          "type": "output_text",
          "text": "Смысл жизни - это философский вопрос, который веками занимает умы человечества...",
          "annotations": []
        }
      ]
    }
  ],
  "usage": {
    "input_tokens": 12,
    "output_tokens": 45,
    "total_tokens": 57
  },
  "status": "completed"
}

Структура ответа

  • id: Уникальный идентификатор ответа
  • object: Тип объекта (всегда "response")
  • created_at: Unix timestamp создания
  • model: Использованная модель
  • output: Массив выходных элементов
  • usage: Информация об использовании токенов
  • status: Статус ответа ("completed", "in_progress", etc.)

Стриминговые ответы

Включите стриминг для генерации ответов в реальном времени:

typescript
const response = await fetch('https://api.aitunnel.ru/v1/responses', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer sk-aitunnel-xxx',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: 'gpt-4o',
    input: 'Напиши короткий рассказ об ИИ',
    stream: true,
    max_output_tokens: 9000,
  }),
});

const reader = response.body?.getReader();
const decoder = new TextDecoder();

while (true) {
  const { done, value } = await reader!.read();
  if (done) break;

  const chunk = decoder.decode(value);
  const lines = chunk.split('\n');

  for (const line of lines) {
    if (line.startsWith('data: ')) {
      const data = line.slice(6);
      if (data === '[DONE]') return;

      try {
        const parsed = JSON.parse(data);
        console.log(parsed);
      } catch (e) {
        // Пропускаем невалидный JSON
      }
    }
  }
}
python
import requests
import json

response = requests.post(
    'https://api.aitunnel.ru/v1/responses',
    headers={
        'Authorization': 'Bearer sk-aitunnel-xxx',
        'Content-Type': 'application/json',
    },
    json={
        'model': 'gpt-4o',
        'input': 'Напиши короткий рассказ об ИИ',
        'stream': True,
        'max_output_tokens': 9000,
    },
    stream=True
)

for line in response.iter_lines():
    if line:
        line = line.decode('utf-8')
        if line.startswith('data: '):
            data = line[6:]
            if data == '[DONE]':
                break
            
            try:
                parsed = json.loads(data)
                print(parsed)
            except json.JSONDecodeError:
                continue

Пример стримингового вывода

Стриминговый ответ возвращает Server-Sent Events (SSE) чанки:

data: {"type":"response.created","response":{"id":"resp_1234567890","object":"response","status":"in_progress"}}

data: {"type":"response.output_item.added","response_id":"resp_1234567890","output_index":0,"item":{"type":"message","id":"msg_abc123","role":"assistant","status":"in_progress","content":[]}}

data: {"type":"response.content_part.added","response_id":"resp_1234567890","output_index":0,"content_index":0,"part":{"type":"output_text","text":""}}

data: {"type":"response.content_part.delta","response_id":"resp_1234567890","output_index":0,"content_index":0,"delta":"Однажды"}

data: {"type":"response.content_part.delta","response_id":"resp_1234567890","output_index":0,"content_index":0,"delta":" в"}

data: {"type":"response.content_part.delta","response_id":"resp_1234567890","output_index":0,"content_index":0,"delta":" мире"}

data: {"type":"response.output_item.done","response_id":"resp_1234567890","output_index":0,"item":{"type":"message","id":"msg_abc123","role":"assistant","status":"completed","content":[{"type":"output_text","text":"Однажды в мире, где искусственный интеллект стал таким же обычным, как смартфоны..."}]}}

data: {"type":"response.done","response":{"id":"resp_1234567890","object":"response","status":"completed","usage":{"input_tokens":12,"output_tokens":45,"total_tokens":57}}}

data: [DONE]

События стриминга

  • response.created: Ответ создан
  • response.output_item.added: Добавлен новый элемент вывода
  • response.content_part.added: Добавлена новая часть контента
  • response.content_part.delta: Дельта (новый текст) части контента
  • response.output_item.done: Элемент вывода завершен
  • response.done: Ответ полностью завершен

Общие параметры

ПараметрТипОписание
modelstringОбязательно. Модель для использования (например, gpt-4o)
inputstring или arrayОбязательно. Текст или массив сообщений
streambooleanВключить стриминговые ответы (по умолчанию: false)
max_output_tokensintegerМаксимальное количество токенов для генерации
temperaturenumberТемпература сэмплирования (0-2)
top_pnumberПараметр nucleus sampling (0-1)

Обработка ошибок

Обрабатывайте распространенные ошибки корректно:

typescript
try {
  const response = await fetch('https://api.aitunnel.ru/v1/responses', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer sk-aitunnel-xxx',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      model: 'gpt-4o',
      input: 'Привет, мир!',
    }),
  });

  if (!response.ok) {
    const error = await response.json();
    console.error('Ошибка API:', error.error.message);
    return;
  }

  const result = await response.json();
  console.log(result);
} catch (error) {
  console.error('Ошибка сети:', error);
}
python
import requests

try:
    response = requests.post(
        'https://api.aitunnel.ru/v1/responses',
        headers={
            'Authorization': 'Bearer sk-aitunnel-xxx',
            'Content-Type': 'application/json',
        },
        json={
            'model': 'gpt-4o',
            'input': 'Привет, мир!',
        }
    )
    
    if response.status_code != 200:
        error_data = response.json()
        print(f"Ошибка API: {error_data['error']['message']}")
        return
    
    result = response.json()
    print(result)
    
except requests.exceptions.RequestException as e:
    print(f"Ошибка сети: {e}")

Многоходовые разговоры

Поскольку Responses API не сохраняет состояние, вы должны включать полную историю разговора в каждый запрос для поддержания контекста:

typescript
// Первый запрос
const firstResponse = await fetch('https://api.aitunnel.ru/v1/responses', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer sk-aitunnel-xxx',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: 'gpt-4o',
    input: [
      {
        type: 'message',
        role: 'user',
        content: [
          {
            type: 'input_text',
            text: 'Какая столица Франции?',
          },
        ],
      },
    ],
    max_output_tokens: 9000,
  }),
});

const firstResult = await firstResponse.json();

// Второй запрос - включаем предыдущий разговор
const secondResponse = await fetch('https://api.aitunnel.ru/v1/responses', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer sk-aitunnel-xxx',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: 'gpt-4o',
    input: [
      {
        type: 'message',
        role: 'user',
        content: [
          {
            type: 'input_text',
            text: 'Какая столица Франции?',
          },
        ],
      },
      {
        type: 'message',
        role: 'assistant',
        id: 'msg_abc123',
        status: 'completed',
        content: [
          {
            type: 'output_text',
            text: 'Столица Франции - Париж.',
            annotations: []
          }
        ]
      },
      {
        type: 'message',
        role: 'user',
        content: [
          {
            type: 'input_text',
            text: 'Какое население этого города?',
          },
        ],
      },
    ],
    max_output_tokens: 9000,
  }),
});

const secondResult = await secondResponse.json();
python
# Первый запрос
first_response = requests.post(
    'https://api.aitunnel.ru/v1/responses',
    headers={
        'Authorization': 'Bearer sk-aitunnel-xxx',
        'Content-Type': 'application/json',
    },
    json={
        'model': 'gpt-4o',
        'input': [
            {
                'type': 'message',
                'role': 'user',
                'content': [
                    {
                        'type': 'input_text',
                        'text': 'Какая столица Франции?',
                    },
                ],
            },
        ],
        'max_output_tokens': 9000,
    }
)

first_result = first_response.json()

# Второй запрос - включаем предыдущий разговор
second_response = requests.post(
    'https://api.aitunnel.ru/v1/responses',
    headers={
        'Authorization': 'Bearer sk-aitunnel-xxx',
        'Content-Type': 'application/json',
    },
    json={
        'model': 'gpt-4o',
        'input': [
            {
                'type': 'message',
                'role': 'user',
                'content': [
                    {
                        'type': 'input_text',
                        'text': 'Какая столица Франции?',
                    },
                ],
            },
            {
                'type': 'message',
                'role': 'assistant',
                'id': 'msg_abc123',
                'status': 'completed',
                'content': [
                    {
                        'type': 'output_text',
                        'text': 'Столица Франции - Париж.',
                        'annotations': []
                    }
                ]
            },
            {
                'type': 'message',
                'role': 'user',
                'content': [
                    {
                        'type': 'input_text',
                        'text': 'Какое население этого города?',
                    },
                ],
            },
        ],
        'max_output_tokens': 9000,
    }
)

second_result = second_response.json()

Обязательные поля

Поля id и status обязательны для любых сообщений с ролью assistant, включенных в историю разговора.

История разговора

Всегда включайте полную историю разговора в каждый запрос. API не хранит предыдущие сообщения, поэтому контекст должен поддерживаться на стороне клиента.

Лучшие практики

  1. Используйте правильный формат: Строки для простых запросов, массивы для сложных разговоров
  2. Обрабатывайте ошибки: Всегда проверяйте статус ответа
  3. Управляйте токенами: Используйте max_output_tokens для контроля длины ответа
  4. Поддерживайте контекст: Включайте полную историю для многоходовых разговоров
  5. Используйте стриминг: Для длинных ответов стриминг улучшает пользовательский опыт

Следующие шаги

AITUNNEL