Heli + Go: официальный openai-go с WithBaseURL

openai-go — официальная Go-библиотека OpenAI с типизированными запросами, стримингом, ретраями и middleware. Базовый адрес клиента задаётся опцией, поэтому библиотека работает с любым OpenAI-совместимым API. Для Heli достаточно указать https://getheli.ru/v1 и ключ sk-heli-…: в Go-сервисе становятся доступны модели Claude, GPT, Gemini, DeepSeek и Qwen с оплатой в рублях.

Подготовка

  • Зарегистрируйтесь на getheli.ru (подтверждение почты или вход через Google / Яндекс ID) и создайте ключ на вкладке «Ключи» кабинета.
  • Подключите модуль: go get github.com/openai/openai-go/v3. Свежие версии SDK требуют актуальный Go — проверьте требования в README.
  • Передайте ключ через переменную окружения HELI_API_KEY и не храните его в репозитории.
  • Создайте клиент с option.WithBaseURL и option.WithAPIKey. Без WithBaseURL SDK возьмёт OPENAI_BASE_URL из окружения, а если нет и её — отправит запрос в OpenAI.
  • Используйте Chat Completions: это самый совместимый путь для моделей разных вендоров.

Пример

SDK по умолчанию повторяет запрос при сетевых ошибках, 408, 409, 429 и ответах 5xx — дважды, с экспоненциальной паузой. Общий таймаут задаётся через context, а время одной попытки — опцией option.WithRequestTimeout. Для стриминга есть client.Chat.Completions.NewStreaming.

При конкурентной обработке ограничьте число одновременных запросов: буферизованным каналом-семафором или errgroup с SetLimit. Это сглаживает всплески, которые дают 429, и упрощает контроль расхода — каждый воркер работает со своим контекстом и таймаутом.

code
package main

import (
	"context"
	"errors"
	"fmt"
	"os"
	"time"

	"github.com/openai/openai-go/v3"
	"github.com/openai/openai-go/v3/option"
)

func main() {
	client := openai.NewClient(
		option.WithBaseURL("https://getheli.ru/v1"),
		option.WithAPIKey(os.Getenv("HELI_API_KEY")),
		option.WithMaxRetries(2),
	)

	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
	defer cancel()

	resp, err := client.Chat.Completions.New(ctx, openai.ChatCompletionNewParams{
		Model: "deepseek/deepseek-v4-flash",
		Messages: []openai.ChatCompletionMessageParamUnion{
			openai.SystemMessage("Отвечай кратко."),
			openai.UserMessage("Чем отличается буферизованный канал от небуферизованного?"),
		},
	})
	if err != nil {
		var apiErr *openai.Error
		if errors.As(err, &apiErr) {
			fmt.Println("Heli API status:", apiErr.StatusCode) // 401, 402, 429…
		}
		os.Exit(1)
	}
	fmt.Println(resp.Choices[0].Message.Content)
}

Какие модели выбрать

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

DeepSeek V4 Flash — массовая обработка текста.

GPT-5.4 mini — structured output и tool calling.

Claude Sonnet 5 — сложные рассуждения и код.

Частые ошибки

  • 401 с упоминанием platform.openai.com — запрос ушёл в OpenAI: не задан WithBaseURL или он перекрыт другой опцией.
  • 401 от Heli — ключ неверный или отозван; создайте новый на вкладке «Ключи».
  • 402 insufficient_balance — закончился баланс; ретраи не помогут, нужно пополнение.
  • Модель не найдена — в Model нужен полный слаг с префиксом вендора.
  • context deadline exceeded — увеличьте таймаут контекста или используйте стриминг для длинных ответов.

Документация API

Оплата — пополнение баланса.

Streaming в Heli API

Попробуйте Heli

Ключ sk-heli- появляется после подтверждения почты. Через Google и Яндекс — сразу в кабинете.

Документация API · Модели и цены

Читайте также