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, и упрощает контроль расхода — каждый воркер работает со своим контекстом и таймаутом.
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 — увеличьте таймаут контекста или используйте стриминг для длинных ответов.
Оплата — пополнение баланса.
Попробуйте Heli
Ключ sk-heli- появляется после подтверждения почты. Через Google и Яндекс — сразу в кабинете.