hubris

LangChain4j

Подключение Hubris к LangChain4j — фреймворку LLM-приложений на Java. Модуль OpenAI с другим адресом, один ключ на все модели.

LangChain4j — фреймворк для LLM-приложений на Java: модели, AI-сервисы с типизированными интерфейсами, инструменты, память диалога, RAG и интеграция со Spring Boot и Quarkus.

Hubris подключается модулем langchain4j-open-ai с другим адресом сервера — отдельного модуля не нужно.

Требования

  • Java 17+ и зависимость dev.langchain4j:langchain4j-open-ai
  • Аккаунт на hubris.pw и API-ключ в переменной окружения HUBRIS_API_KEY

Maven:

<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-open-ai</artifactId>
    <version>1.20.0</version>
</dependency>

Gradle:

implementation("dev.langchain4j:langchain4j-open-ai:1.20.0")

Подключение

import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;

ChatModel model = OpenAiChatModel.builder()
        .baseUrl("https://api.hubris.pw/v1")
        .apiKey(System.getenv("HUBRIS_API_KEY"))
        .modelName("anthropic/claude-sonnet-5")
        .build();

String answer = model.chat("Объясни, чем отличается кэш промпта от обычного ввода");
System.out.println(answer);

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

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

Стриминг

Для ответа по частям — OpenAiStreamingChatModel с теми же параметрами и обработчик StreamingChatResponseHandler:

import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.model.chat.response.ChatResponse;
import dev.langchain4j.model.chat.response.StreamingChatResponseHandler;
import dev.langchain4j.model.openai.OpenAiStreamingChatModel;

StreamingChatModel model = OpenAiStreamingChatModel.builder()
        .baseUrl("https://api.hubris.pw/v1")
        .apiKey(System.getenv("HUBRIS_API_KEY"))
        .modelName("anthropic/claude-sonnet-5")
        .build();

model.chat("Расскажи о Java в трёх предложениях", new StreamingChatResponseHandler() {
    public void onPartialResponse(String token) { System.out.print(token); }
    public void onCompleteResponse(ChatResponse response) { System.out.println(); }
    public void onError(Throwable error) { error.printStackTrace(); }
});

Остальные возможности LangChain4j — AI-сервисы (AiServices.create(...)), инструменты через @Tool, память диалога — работают поверх этих же объектов модели без изменений.

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

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

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

Hubris в документации LangChain4j

Мы отправили в LangChain4j раздел о Hubris на странице OpenAI-совместимых сервисов — pull request на ревью. Способ подключения в нём тот же, что описан выше: OpenAiChatModel.builder().baseUrl("https://api.hubris.pw/v1"). Ждать приёма не нужно — всё уже работает в текущем релизе.

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

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

dev.langchain4j.exception.AuthenticationException с телом {"error":{"message":"Неверный API-ключ", ..., "code":"invalid_api_key"}} — ключ неверный или отозван. Он начинается на sk-gw-, без пробелов по краям; целиком виден только при создании. Новый — в разделе «Ключи».

Если HUBRIS_API_KEY не задан, System.getenv вернёт null, модель соберётся без ошибки, а запрос уйдёт без заголовка авторизации — то же исключение, но с сообщением API-ключ не передан. Проверьте, что переменная видна процессу JVM.

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

dev.langchain4j.exception.ModelNotFoundException с кодом model_not_found — ID должен совпадать с каталожным символ в символ, вместе с вендором перед косой чертой. Короткие имена без вендора и имена с датой на конце мы не принимаем.

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

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

Проверено на LangChain4j 1.20.0 (langchain4j-open-ai, Temurin JDK 21), 9 сентября 2026.

Что дальше

Обновлено: