diff --git a/jabgui/src/main/java/org/jabref/gui/preferences/ai/AiTabViewModel.java b/jabgui/src/main/java/org/jabref/gui/preferences/ai/AiTabViewModel.java index c6308a77f29..225701b6f70 100644 --- a/jabgui/src/main/java/org/jabref/gui/preferences/ai/AiTabViewModel.java +++ b/jabgui/src/main/java/org/jabref/gui/preferences/ai/AiTabViewModel.java @@ -75,7 +75,7 @@ public class AiTabViewModel implements PreferenceTabViewModel { private final ObjectProperty selectedEmbeddingModel = new SimpleObjectProperty<>(); private final StringProperty currentApiBaseUrl = new SimpleStringProperty(); - private final BooleanProperty disableApiBaseUrl = new SimpleBooleanProperty(true); // {@link HuggingFaceChatModel} and {@link GoogleAiGeminiChatModel} doesn't support setting API base URL + private final BooleanProperty disableApiBaseUrl = new SimpleBooleanProperty(true); // {@link GoogleAiGeminiChatModel} doesn't support setting API base URL private final StringProperty openAiApiBaseUrl = new SimpleStringProperty(); private final StringProperty mistralAiApiBaseUrl = new SimpleStringProperty(); @@ -138,7 +138,7 @@ public AiTabViewModel(CliPreferences preferences) { this.selectedAiProvider.addListener((_, oldValue, newValue) -> { List models = AiDefaultPreferences.getAvailableModels(newValue); - disableApiBaseUrl.set(newValue == AiProvider.HUGGING_FACE || newValue == AiProvider.GEMINI); + disableApiBaseUrl.set(newValue == AiProvider.GEMINI); // When we setAll on Hugging Face, models are empty, and currentChatModel become null. // It becomes null because currentChatModel is bound to combobox, and this combobox becomes empty. diff --git a/jablib/src/main/java/org/jabref/logic/ai/chatting/model/JabRefChatLanguageModel.java b/jablib/src/main/java/org/jabref/logic/ai/chatting/model/JabRefChatLanguageModel.java index f809b8f7369..b32e68601eb 100644 --- a/jablib/src/main/java/org/jabref/logic/ai/chatting/model/JabRefChatLanguageModel.java +++ b/jablib/src/main/java/org/jabref/logic/ai/chatting/model/JabRefChatLanguageModel.java @@ -18,7 +18,7 @@ import dev.langchain4j.model.chat.ChatModel; import dev.langchain4j.model.chat.response.ChatResponse; import dev.langchain4j.model.googleai.GoogleAiGeminiChatModel; -import dev.langchain4j.model.huggingface.HuggingFaceChatModel; +import dev.langchain4j.model.openai.OpenAiChatModel; import dev.langchain4j.model.mistralai.MistralAiChatModel; /** @@ -88,13 +88,16 @@ private void rebuild() { .build() ); - case HUGGING_FACE -> // NOTE: {@link HuggingFaceChatModel} doesn't support API base url. - langchainChatModel = Optional.of(HuggingFaceChatModel + case HUGGING_FACE -> + langchainChatModel = Optional.of(OpenAiChatModel .builder() - .accessToken(apiKey) - .modelId(aiPreferences.getSelectedChatModel()) + .apiKey(apiKey) + .modelName(aiPreferences.getSelectedChatModel()) .temperature(aiPreferences.getTemperature()) + .baseUrl(aiPreferences.getSelectedApiBaseUrl()) .timeout(Duration.ofMinutes(2)) + .logRequests(true) + .logResponses(true) .build() ); } diff --git a/jablib/src/main/java/org/jabref/model/ai/AiProvider.java b/jablib/src/main/java/org/jabref/model/ai/AiProvider.java index cd37d85d396..64079d4f2b0 100644 --- a/jablib/src/main/java/org/jabref/model/ai/AiProvider.java +++ b/jablib/src/main/java/org/jabref/model/ai/AiProvider.java @@ -6,7 +6,7 @@ public enum AiProvider implements Serializable { OPEN_AI("OpenAI (or API compatible)", "https://api.openai.com/v1", "https://openai.com/policies/privacy-policy/"), MISTRAL_AI("Mistral AI", "https://api.mistral.ai/v1", "https://mistral.ai/terms/#privacy-policy"), GEMINI("Gemini", "https://generativelanguage.googleapis.com/v1beta/", "https://ai.google.dev/gemini-api/terms"), - HUGGING_FACE("Hugging Face", "https://huggingface.co/api", "https://huggingface.co/privacy"), + HUGGING_FACE("Hugging Face", "https://router.huggingface.co/v1", "https://huggingface.co/privacy"), GPT4ALL("GPT4All", "http://localhost:4891/v1", "https://www.nomic.ai/gpt4all/legal/privacy-policy"); private final String label;