Клиентская библиотека на Go для работы с GigaChat API от Сбербанка.
- Особенности
- Установка
- Быстрый старт
- Конфигурация
- Модули и функции
- Примеры использования
- Авторизация и токены
- Обработка ошибок
- Дополнительная информация
- ✅ Полная поддержка GigaChat API
- ✅ Автоматическое обновление OAuth токенов
- ✅ Поддержка двух методов аутентификации (Client Credentials и API Key)
- ✅ Потокобезопасность
- ✅ Контекстная поддержка для отмены запросов
- ✅ Управление файлами (загрузка, удаление, список)
- ✅ Проверка текста на AI-генерацию
- ✅ Генерация эмбеддингов
- ✅ Подсчет токенов
- ✅ Удобный API с примерами использования
go get github.com/helios-ag/go-gigachat-aipackage main
import (
"context"
"fmt"
"time"
"github.com/helios-ag/go-gigachat-ai"
"github.com/helios-ag/go-gigachat-ai/gpt"
)
func main() {
ctx := context.Background()
// Создание клиента с API ключом
client, err := gigachat.NewClientWithApiKey(ctx, "your-api-key")
if err != nil {
panic(err)
}
defer client.Close()
// Установка глобального API
gigachat.SetAPI(client)
// Отправка запроса
request := &gpt.ChatRequest{
Model: "GigaChat-2-Pro",
Messages: []gpt.Message{
{
Role: "user",
Content: "Привет, как дела?",
},
},
}
response, err := gpt.Chat(ctx, request)
if err != nil {
panic(err)
}
fmt.Println(response.Choices[0].Message.Content)
}client, err := gigachat.NewClient(ctx, "client-id", "client-secret")
if err != nil {
panic(err)
}
defer client.Close()Библиотека поддерживает следующие переменные окружения:
GIGACHAT_CLIENT_ID- идентификатор клиентаGIGACHAT_CLIENT_SECRET- секретный ключ клиентаGIGACHAT_API_KEY- API ключ (альтернатива Client ID/Secret)
Клиент поддерживает различные опции конфигурации:
client, err := gigachat.NewClientWithConfig(config,
gigachat.WithCustomURL("https://custom-api-url.com"),
gigachat.WithCustomURLOauth("https://custom-oauth-url.com"),
gigachat.WithCustomTimeout(60*time.Second),
gigachat.WithCustomScope(gigachat.ScopeApiIndividual),
gigachat.WithCustomClient(&http.Client{}),
)Библиотека поддерживает следующие области доступа:
ScopeApiIndividual- для индивидуальных пользователей (GIGACHAT_API_PERS)ScopeApiBusiness- для бизнеса (GIGACHAT_API_CORP)ScopeApiB2B- для B2B (GIGACHAT_API_B2B)
Доступные константы моделей:
GIGACHAT_2_LITE- "GigaChat-2"GIGACHAT_2_PRO- "GigaChat-2-Pro"GIGACHAT_2_MAX- "GigaChat-2-Max"
UserRole- "user"AssistantRole- "assistant"SystemRole- "system"
Создает новый клиент GigaChat с использованием Client ID и Client Secret.
Параметры:
ctx- контекст для управления жизненным циклом запросаclientId- идентификатор клиентаclientSecret- секретный ключ клиента
Возвращает:
*Client- экземпляр клиентаerror- ошибка, если не удалось создать клиент
Создает новый клиент GigaChat с использованием API ключа.
Параметры:
ctx- контекст для управления жизненным циклом запросаapiKey- API ключ (base64 encoded)
Возвращает:
*Client- экземпляр клиентаerror- ошибка, если не удалось создать клиент
Создает новый клиент с кастомной конфигурацией.
Параметры:
config- конфигурация клиентаoptions- опции для настройки клиента
Опции:
WithCustomURL(url string)- кастомный URL APIWithCustomURLOauth(url string)- кастомный URL OAuthWithCustomClient(client *http.Client)- кастомный HTTP клиентWithCustomTimeout(timeout time.Duration)- кастомный таймаутWithCustomScope(scope string)- кастомная область доступа
Устанавливает глобальный экземпляр API для использования в модулях.
Получает глобальный экземпляр API или создает новый, если он не установлен.
Закрывает клиент, останавливает фоновые процессы (обновление токенов) и освобождает ресурсы.
Возвращает конфигурацию клиента.
Модуль для работы с чатом GigaChat.
Отправляет запрос на генерацию ответа чат-модели.
Параметры:
ctx- контекст запросаrequest- запрос
Структура ChatRequest:
type ChatRequest struct {
Model string // Модель для использования (например, "GigaChat-2-Pro")
Messages []Message // Массив сообщений
Temperature *float64 // Температура (опционально)
TopP *float64 // Top-p sampling (опционально)
Stream *bool // Потоковая передача (опционально)
MaxTokens *int32 // Максимальное количество токенов (опционально)
RepetitionPenalty *float64 // Штраф за повторения (опционально)
UpdateInterval *int64 // Интервал обновления для streaming (опционально)
}Структура Message:
type Message struct {
Role string // Роль отправителя ("user", "assistant", "system")
Content string // Содержимое сообщения
FunctionsStateId string // ID состояния функций (опционально)
Attachments []string // Вложения (опционально)
}Возвращает:
*schema.ChatCompletion- результатerror- ошибка, если запрос не удался
Пример:
request := &gpt.ChatRequest{
Model: "GigaChat-2-Pro",
Messages: []gpt.Message{
{
Role: "system",
Content: "Ты полезный ассистент.",
},
{
Role: "user",
Content: "Расскажи о GigaChat",
},
},
Temperature: floatPtr(0.7),
MaxTokens: int32Ptr(1000),
}
response, err := gpt.Chat(ctx, request)Модуль для получения списка доступных моделей.
Получает список всех доступных моделей.
Параметры:
ctx- контекст запроса
Возвращает:
*schema.ModelsResponse- список моделейerror- ошибка, если запрос не удался
Структура ModelsResponse:
type ModelsResponse struct {
Data []Model // Массив моделей
Object string // Тип объекта
}
type Model struct {
ID string // Идентификатор модели
Object string // Тип объекта
OwnedBy string // Владелец модели
}Пример:
models, err := models.Models(ctx)
if err != nil {
panic(err)
}
for _, model := range models.Data {
fmt.Printf("Model: %s\n", model.ID)
}Модуль для генерации векторных представлений текста.
Генерирует эмбеддинги для указанного текста.
Параметры:
ctx- контекст запросаrequest- запрос на генерацию эмбеддингов
Структура EmbeddingRequest:
type EmbeddingRequest struct {
Model string // Модель для генерации эмбеддингов
Input string // Текст для обработки
}Возвращает:
*schema.EmbeddingResponse- эмбеддинги текстаerror- ошибка, если запрос не удался
Пример:
request := &embeddings.EmbeddingRequest{
Model: "Embeddings",
Input: "Текст для генерации эмбеддингов",
}
response, err := embeddings.Embeddings(ctx, request)Модуль для проверки текста на наличие AI-генерации.
Проверяет текст на наличие признаков AI-генерации.
Параметры:
ctx- контекст запросаrequest- запрос на проверку
Структура AiCheckRequest:
type AiCheckRequest struct {
Model string // Модель для проверки (например, "GigaCheckDetection")
Input string // Текст для проверки
}Методы:
Validate() error- валидирует запрос (проверяет, что Model и Input не пустые)
Возвращает:
*schema.DetectionResult- результат проверкиerror- ошибка, если запрос не удался
Структура DetectionResult:
type DetectionResult struct {
Category string // Категория результата
Characters int // Количество символов
Tokens int // Количество токенов
AIIntervals [][2]int // Интервалы текста, сгенерированные AI
}Ошибки:
ErrModelRequired- модель не указанаErrInputRequired- входной текст не указан
Пример:
request := &aicheck.AiCheckRequest{
Model: "GigaCheckDetection",
Input: "Текст для проверки на AI-генерацию",
}
result, err := aicheck.AiCheck(ctx, request)
if err != nil {
panic(err)
}
fmt.Printf("Category: %s\n", result.Category)
fmt.Printf("AI Intervals: %v\n", result.AIIntervals)Модуль для получения информации о балансе аккаунта.
Получает информацию о балансе аккаунта.
Параметры:
ctx- контекст запроса
Возвращает:
*schema.BalanceResponse- информация о балансеerror- ошибка, если запрос не удался
Пример:
balance, err := balance.Balance(ctx)
if err != nil {
panic(err)
}
for _, bal := range balance.Balance {
fmt.Printf("Usage: %s, Value: %d\n", bal.Usage, bal.Value)
}Модуль для управления файлами (загрузка, удаление, получение списка).
Загружает файл на сервер GigaChat.
Параметры:
ctx- контекст запросаfilePath- путь к файлу для загрузки
Поддерживаемые типы файлов:
- Изображения: .jpg, .jpeg, .png, .tiff, .bmp (максимум 15 МБ)
- Аудио: .mp3, .wav, .ogg, .flac, .m4a (максимум 35 МБ)
- Текст: .txt, .pdf, .doc, .docx (максимум 40 МБ)
Возвращает:
*schema.FileResponse- информация о загруженном файлеerror- ошибка, если загрузка не удалась
Ошибки:
ErrFileNotFound- файл не найденErrFileSize- размер файла превышает лимитErrUnsupportedType- неподдерживаемый тип файла
Пример:
fileResponse, err := filesClient.UploadFile(ctx, "path/to/file.jpg")
if err != nil {
panic(err)
}
fmt.Printf("File ID: %s\n", fileResponse.ID)Удаляет файл с сервера.
Параметры:
ctx- контекст запросаfileID- идентификатор файла для удаления
Возвращает:
*schema.FileDeleteResponse- результат удаленияerror- ошибка, если удаление не удалось
Пример:
result, err := filesClient.DeleteFile(ctx, "file-id")Получает список всех загруженных файлов.
Параметры:
ctx- контекст запроса
Возвращает:
*schema.FileListResponse- список файловerror- ошибка, если запрос не удался
Пример:
files, err := filesClient.GetFiles(ctx)Получает информацию о конкретном файле.
Параметры:
ctx- контекст запросаfileId- идентификатор файла
Возвращает:
*schema.FileInfo- информация о файлеerror- ошибка, если запрос не удался
Пример:
info, err := filesClient.GetFileInfo(ctx, "file-id")Модуль для подсчета количества токенов в тексте.
Подсчитывает количество токенов в указанном тексте.
Параметры:
ctx- контекст запросаrequest- запрос на подсчет токенов
Структура Request:
type Request struct {
Model string // Модель для подсчета
Input []string // Массив текстов для подсчета
}Возвращает:
*schema.TokenResponse- результат подсчета токеновerror- ошибка, если запрос не удался
Пример:
request := &tokens.Request{
Model: "GigaChat-2-Pro",
Input: []string{
"Первый текст для подсчета",
"Второй текст для подсчета",
},
}
response, err := tokens.Tokens(ctx, request)Модуль для работы с пакетной обработкой запросов (в разработке).
Получает список пакетных заданий.
Параметры:
ctx- контекст запроса
Возвращает:
*schema.BatchListResponse- список пакетных заданийerror- ошибка, если запрос не удался
Примечание: Модуль находится в разработке (WIP).
Получает статус пакетных заданий.
Параметры:
ctx- контекст запроса
Возвращает:
*schema.BatchListResponse- статус пакетных заданийerror- ошибка, если запрос не удался
Полные примеры использования можно найти в директории example/:
example/gpt/main.go- пример работы с чатомexample/balance/main.go- пример получения балансаexample/aicheck/main.go- пример проверки текста на AIexample/listmodels/main.go- пример получения списка моделей
Библиотека автоматически управляет OAuth токенами:
- Автоматическое получение токена при создании клиента
- Автоматическое обновление токена в фоновом режиме за 15 минут до истечения
- Потокобезопасное обновление - несколько запросов не приведут к множественным обновлениям токена
- Поддержка контекста - обновление токена может быть отменено через контекст
Клиент запускает фоновую горутину, которая:
- Проверяет срок действия токена каждую минуту
- Обновляет токен, если до истечения осталось менее 15 минут
- Ожидает завершения текущего обновления перед новым обновлением
Библиотека возвращает ошибки в формате, соответствующем стандартам Go:
response, err := gpt.Chat(ctx, request)
if err != nil {
// Обработка ошибки
fmt.Printf("Ошибка: %v\n", err)
return
}Ошибки API возвращаются в структуре schema.Response:
Status- код статуса ошибкиMessage- сообщение об ошибке
Библиотека использует следующие endpoints:
Models-/v1/modelsChatCompletions-/v1/chat/completionsFiles-/v1/filesBalance-/v1/balanceAiCheck-/v1/ai/checkTokensCount-/v1/tokens/countEmbeddings-/v1/embeddingsFunctionsValidate-/v1/functions/validateBatches-/v1/batches
По умолчанию используется таймаут 30 секунд. Его можно изменить через опцию WithCustomTimeout.
- Библиотека поддерживает TLS (с возможностью отключения проверки сертификата для тестирования)
- Токены хранятся в памяти и автоматически обновляются
- Поддерживается работа с контекстами для отмены запросов
- Клиент потокобезопасен и может использоваться из нескольких горутин
- Автоматическое управление соединениями HTTP
- Эффективное обновление токенов без блокировки запросов
Проект распространяется по лицензии MIT.