hubris

LangChainGo

Подключение Hubris к LangChainGo — порту LangChain на Go. Клиент OpenAI с другим адресом, один ключ на все модели.

LangChainGo — порт LangChain на Go: модели, цепочки, агенты, память и векторные хранилища в одном модуле. Библиотека сама ходит в API по HTTP, без CGO и внешних процессов.

Hubris подключается через пакет llms/openai с другим адресом сервера — отдельного пакета не нужно.

Требования

  • Go 1.23+ и go get github.com/tmc/langchaingo
  • Аккаунт на hubris.pw и API-ключ в переменной окружения HUBRIS_API_KEY

Подключение

package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/tmc/langchaingo/llms"
	"github.com/tmc/langchaingo/llms/openai"
)

func main() {
	llm, err := openai.New(
		openai.WithModel("anthropic/claude-sonnet-5"),
		openai.WithBaseURL("https://api.hubris.pw/v1"),
		openai.WithToken(os.Getenv("HUBRIS_API_KEY")),
	)
	if err != nil {
		log.Fatal(err)
	}

	answer, err := llms.GenerateFromSinglePrompt(context.Background(), llm,
		"Объясни, чем отличается кэш промпта от обычного ввода")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(answer)
}

Адрес — именно api.hubris.pw, с api. в начале и /v1 в конце. Домен hubris.pw — это сайт и личный кабинет: запросы к API он не обслуживает.

ID модели передаётся в openai.WithModel полностью, вместе с вендором: anthropic/claude-sonnet-5, openai/gpt-5.6-luna. Клиент отправляет его как есть — никаких дополнительных префиксов, в отличие от обёрток поверх LiteLLM, здесь не нужно.

Стриминг

Ответ приходит по частям через llms.WithStreamingFunc — остальной код не меняется:

_, err = llms.GenerateFromSinglePrompt(ctx, llm, "Расскажи о Go в трёх предложениях",
	llms.WithStreamingFunc(func(ctx context.Context, chunk []byte) error {
		fmt.Print(string(chunk))
		return nil
	}),
)

Диалог с ролями

Для системной инструкции и истории сообщений — GenerateContent с llms.MessageContent:

resp, err := llm.GenerateContent(ctx, []llms.MessageContent{
	llms.TextParts(llms.ChatMessageTypeSystem, "Отвечай кратко и по-русски."),
	llms.TextParts(llms.ChatMessageTypeHuman, "Что такое горутина?"),
}, llms.WithMaxTokens(200))
if err != nil {
	log.Fatal(err)
}
fmt.Println(resp.Choices[0].Content)

llms.WithTemperature, llms.WithMaxTokens, llms.WithTools и остальные CallOption работают так же, как с OpenAI напрямую.

Выбор моделей

IDКогда подходит
google/gemini-3.7-flashдешёвые шаги, классификация, маршрутизация
anthropic/claude-sonnet-5рассуждение, длинный контекст, инструменты
openai/gpt-5.6-lunaуниверсальный выбор
deepseek/deepseek-v4-proнедорогое рассуждение и код

Каталог у нас открыт без ключа — список можно посмотреть прямо в браузере: api.hubris.pw/v1/models.

Готовый пример в LangChainGo

Мы отправили в LangChainGo пример examples/hubris-llm-examplepull request на ревью: консольная программа с флагами -model, -prompt, -temp, -stream, собранная ровно на том подключении, что описано выше. После приёма её можно будет запускать из репозитория командой go run . -model anthropic/claude-sonnet-5 -prompt "...". Пока PR не принят, скопируйте код с этой страницы — это тот же самый способ.

Решение проблем

Ошибка авторизации

Ключ неверный или отозван. Он начинается на sk-gw-, без пробелов по краям; целиком виден только при создании. Новый — в разделе «Ключи». Если HUBRIS_API_KEY не задан, os.Getenv вернёт пустую строку и openai.New завершится ошибкой missing the OpenAI API key, set it in the OPENAI_API_KEY environment variable ещё до запроса. Текст про OPENAI_API_KEY — от самой библиотеки: ей всё равно, как называется переменная, важно, что токен пустой. Проверьте, что HUBRIS_API_KEY видна процессу.

При неверном ключе ответ выглядит так: API returned unexpected status code: 401: Неверный API-ключ.

Ошибка про модель

API returned unexpected status code: 404: Модель не найдена: ... — ID должен совпадать с каталожным символ в символ, вместе с вендором перед косой чертой. Короткие имена без вендора и имена с датой на конце мы не принимаем.

Ошибка про недостаточный баланс

Пополните баланс в кабинете — от 300 ₽, через СБП, банковской картой или по счёту для юридических лиц.

Проверено на LangChainGo v0.1.14 (Go 1.27), 9 сентября 2026.

Что дальше

Обновлено: